Funpack3-5 BeagleBone Black点灯
该项目使用了BeagleBone Black,实现了通过网页控制灯的亮灭的设计,它的主要功能为:使用网线连接到设备上时,可以从网页中控制LED的开关与闪烁。
标签
嵌入式系统
Funpack活动
fly_lv
更新2025-01-13
12

项目介绍


本项目使用BeagleBone Black作为主控,选择的任务是网页点灯


项目详情

通过在系统中建立一个网页,并且与LED联动,使用网线连接到设备上时,可以从网页中控制LED的开关与闪烁

开发环境

芯片介绍


image.png

AM335x 微处理器以 ARM Cortex-A8 处理器为基础,通过图像、图形处理、外设以及 EtherCAT 和 PROFIBUS 等工业接口选件得到增强。 这些设备支持高级操作系统(HLOS)。 处理器 SDK Linux® 和 TI-RTOS 可从 TI 免费获得。 AM335x 微处理器包含功能框图所示的子系统: 微处理器单元 (MPU) 子系统基于 ARM Cortex-A8 处理器,PowerVR SGX™ 图形加速器子系统提供 3D 图形加速,支持显示和游戏效果。

PRU-ICSS 与 ARM 内核分离,允许独立运行和时钟,从而提高了效率和灵活性。PRU-ICSS 支持额外的外设接口和实时协议,如 EtherCAT、PROFINET、EtherNet/IP、PROFIBUS、Ethernet Powerlink、Sercos 等。此外,PRU-ICSS 的可编程特性及其对引脚、事件和所有片上系统 (SoC) 资源的访问,为实现快速、实时响应、专用数据处理操作、定制外设接口以及卸载 SoC 其他处理器内核的任务提供了灵活性。


开发板介绍

BeagleBone Black 是一款面向开发人员和业余爱好者的低成本、高扩展、社区支持的开发平台,板卡处理器选用的是 TI 公司 AM3358 芯片, 处理器集成了高达 1GHz 的 ARM Cortex™ A8 内核,具有强大的处理能力并提供了丰富的外设接口BeagleBone® Black面向开源社区用户、开源硬件爱好者和任何对Arm Cortex-A8低成本处理器感兴趣的人而设计,配备精简,旨在为不需要搭建完整开发平台并想体验Arm处理器功能的用户提供入门的捷径。它配备了最低限度的外设,使用户能够体验处理器的强大功能,还提供了许多接口,用户还可以开发自己的电路板或添加自己的电路。

板卡框图

image.png


设计思路

1、搭建一个本地Nginx服务器

Nginx是一款轻量级的Web服务器、反向代理服务器及电子邮件(IMAP/POP3)代理服务器

主要特点

  • 高性能:Nginx设计重点是高并发、高性能和低资源消耗,特别适用于静态内容的分发和反向代理服务。官方测试Nginx能够支撑5万并发连接,并且CPU、内存等资源消耗非常低。
  • 稳定性:Nginx运行非常稳定,启动特别容易,并且几乎可以做到7×24不间断运行,即使运行数个月也不需要重新启动。
  • 丰富的功能集:Nginx具有反向代理、负载均衡、缓存、虚拟主机等多种功能。
  • 简单的配置文件:Nginx的配置文件非常简洁,还能够支持perl语法,Bug非常少。
  • 广泛的兼容性:Nginx可以在大多数Unix、Linux OS上编译运行,并有Windows移植版。


2、了解如何操作gpio

操作gpio的流程是先确认gpio的引脚编号,然后就可以通过open函数打开对应的led文件,通过write函数就能控制gpio输出是高低电平,最后通过close函数关闭对应的文件

3、编写网页代码

想要编写网页就得了解HTML、CSS和JavaScript

HTML 是网页的基础结构,用于定义网页的内容和布局。它通过标签(tags)来标记内容,浏览器会根据这些标签渲染出网页的结构

CSS 用于控制网页的外观和样式,包括颜色、字体、布局、动画等。它使网页内容与样式分离,便于维护和复用

JavaScript 是一种脚本语言,用于为网页添加动态功能和交互行为。它可以直接操作 HTML 和 CSS,实现复杂的逻辑和动态效果

通过对HTML、CSS和JavaScript的编写就能完成网页的设计


程序流程

image.png

代码介绍

下面的代码是对板载的灯进行一个流水灯展示,操作gpio的流程是先通过open打开led文件,然后进行write操作,最后关闭文件

import time
import os


LEDs=4
LEDPATH='/sys/class/leds/beaglebone:green:usr'


# Turn off triggers
for i in range(LEDs):
    # print(LEDPATH+str(i)+"/trigger")
    f = open(LEDPATH+str(i)+"/trigger", "w")
    f.write("none")
    f.close()


# Open a file for each LED
f = []
for i in range(LEDs):
    f.append(open(LEDPATH+str(i)+"/brightness", "w"))


# Sequence
while True:
    for i in range(LEDs):
        f[i].seek(0)
        f[i].write("1")
        time.sleep(0.25)
    for i in range(LEDs):
        f[i].seek(0)
        f[i].write("0")
        time.sleep(0.25)


要用网页控制灯,要先安装flask

Flask 被称为“microframework”,因为它使用简单的核心,并通过 extension 增加其他功能。Flask 没有默认使用的数据库、窗体验证工具,但支持功能扩展,可以根据需求扩展所需的模块。相较于 Django,Flask 更加轻量、灵活,可定制化高,更适用于小型项目开发。


下面的代码是导入对应的库和设置led的路径,并且设置了ledRedSts 接收led的状态

import os
import time
# import Adafruit_BBIO.GPIO as GPIO
from flask import Flask, render_template, request
app = Flask(__name__)
GPIOPATH=GPIOPATH="/sys/class/gpio"
LEDPATH='/sys/class/leds/beaglebone:green:usr'


#define actuators GPIOs
ledRed = "3"  # "P9_14"

ledRedSts = 0


下面的代码设置了网页的根路径,并且读取了led的状态赋值到ledRedSts ,然后传送给网页显示

@app.route("/")
def index():
    # Read GPIO Status
    f = open(LEDPATH+ledRed+"/brightness", "r")
    ledRedSts = f.read()[:-1]
    f.close()


    templateData = {
            'led'  : ledRedSts,
           
        }
    return render_template('index5.html', **templateData)

下面的代码是根据接收到网页传递的值进行判断。然后进行相应的控制,点击TURN OFF会关闭USER4

点击TURN ON会点亮USER4,点击TURN TOGGLE会让USER4以800ms闪烁3次


@app.route("/<deviceName>/<action>")
def action(deviceName, action):
    if deviceName == 'ledRed':
        actuator = ledRed

    f = open(LEDPATH+ledRed+"/brightness", "w")
    if action == "on":
        f.write("1")
    if action == "off":
        f.write("0")
    if action == "toggle":
        f.close()
        f = open(LEDPATH+ledRed+"/brightness", "w")
        f.seek(0)
        f.write("1")
        time.sleep(0.8)


        f.seek(0)
        f.write("0")
        time.sleep(0.8)
        f.seek(0)
        f.write("1")
        time.sleep(0.8)


        f.seek(0)
        f.write("0")
        time.sleep(0.8)


        f.seek(0)
        f.write("1")
        time.sleep(0.8)


        f.seek(0)
        f.write("0")
        time.sleep(0.8)


       
    f.close()
             
    f = open(LEDPATH+ledRed+"/brightness", "r")
    ledRedSts = f.read()[:-1]
    f.close()


    templateData = {
            'led'  : ledRedSts,
           
        }
    return render_template('index5.html', **templateData)


下面是html代码

<!DOCTYPE html> 
  <head>
     <title>GPIO Control</title>
     <link rel="stylesheet" href='../static/style.css'/>
  </head>
  <body>
        <h1>GPIO Control</h1>
        <h2> LED Status </h2>
        <h3> LED ==>  {{ led  }}</h3>
        <h2> Actuator Status & Control </h2>
        <h3> RED LED ==>  
             
           
                <a href="/ledRed/off"class="button">TURN OFF</a>
           
                <a href="/ledRed/on" class="button">TURN ON</a>  
                <a href="/ledRed/toggle" class="button">TURN TOGGLE</a>
        </h3>
        </h3>
  </body>
</html>

网页控制界面

image.png


实物图

8891592cac1669fadf40a7a1fff135b8_720.jpg


心得体会

通过这次活动我学习到了Linux开发板是怎么控制led的、怎么利用网页控制led,收获了许多知识,在这里非常感谢硬禾学堂和digikey联合赞助的Funpack活动让我收获了许多知识。


附件下载
code.zip
团队介绍
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号