Funpack3-5:基于 Flask 和 Adafruit_BBIO 实现通过网页控制 Beaglebone Black 上的 LED
该项目使用了Flask 和 Adafruit_BBIO,实现了通过网页控制 Beaglebone Black 上的 LED的设计,它的主要功能为:本项目利用 Flask Web 框架实现通过 Web 界面控制 BeagleBone Black 开发板上的 LED 的开关状态。具体而言,使用 `Adafruit_BBIO.GPIO` 库来操作 GPIO 引脚,从而控制 LED 的亮灭和闪烁,然后使用 Flask 建立一个 Web 服务,可以处理浏览器发送过来的请求,从而实现 Web 页面交互来控制硬件的功能。。
标签
嵌入式系统
Funpack活动
开发板
topgear
更新2025-01-13
59

1. 项目描述

本项目利用 Flask Web 框架实现通过 Web 界面控制 BeagleBone Black 开发板上的 LED 的开关状态。具体而言,使用 Adafruit_BBIO.GPIO 库来操作 GPIO 引脚,从而控制 LED 的亮灭和闪烁,然后使用 Flask 建立一个 Web 服务,可以处理浏览器发送过来的请求,从而实现 Web 页面交互来控制硬件的功能。




2. 硬件资源

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

image.png

  • 处理器 TI Sitara 处理器:AM3358BZCZ100
    • 1GHz ARM® Cortex-A8 处理器
    • SGX 3D 图形引擎
    • NEON 浮点加速器
    • 2×32 位 200MHz 可编程实时单元 (PRU)
  • 内存
    • SDRAM:512MB DDR3L 800MHZ
    • 板载闪存:4GB,8 位嵌入式 MMC (eMMC)
  • 电源管理:使用 TPS65217C PMIC 和单独的 LDO 为系统供电
  • 调试支持: 可选板载 20 引脚 CTI JTAG、串行接头
  • 电源
    • miniUSB接口或直流插孔
    • 通过扩展头提供 5VDC 外部电源
  • 接口
    • 高速 USB 2.0 客户端端口: 通过 miniUSB 访问 USB0,客户端模式
    • 高速 USB 2.0 主机端口: 访问 USB1,A 型插座,500mA LS/FS/HS
    • 串行端口: UART0 通过 6 针 3.3V TTL 接头访问。接头已填充
    • 10/100M 以太网接口(RJ45)
  • 用户输入/输出
    • 复位按钮
    • 启动按钮
    • 电源按钮
    • LED 电源指示灯
    • 4 个用户可配置的 LED
  • 视频/音频接口
    • HDMI D 型接口
    • LCD 接口
    • HDMI 接口立体声音频
  • 2x 46 针针座扩展接口
    • LCD、UART、eMMC
    • ADC、I2C、SPI、PWM




3. 需求分析

开发板的功能很强大,但是只需要用来实现一个非常简单的需求,具体如下:

  • Beaglebone Black 提供一个简单的 Web 页面,包含四个按钮(开启 LED 、关闭 LED、开始闪烁 LED和停止闪烁 LED),用于控制 BeagleBone Black 上的 LED
  • PC 能够通过浏览器访问 Beaglebone Black 的 Web 页面
  • 当用户点击按钮时,Web 页面能够实时显示 LED 的当前状态(例如:打开或关闭)。

由于 Beaglebone Black 在出厂时已经内置了一个 Debian Buster IoT Image,同时得益于强大的社区支持,可以直接使用 python 开发 web 服务,然后通过第三方的 python 库进行硬件控制,所以选择了 Flask  Adafruit_BBIO 这两个 python package 来实现此项目的需求:

  • Flask:用于搭建 Web 服务,处理 HTTP 请求。
  • Adafruit_BBIO:控制 BeagleBone Black 上的 GPIO 引脚,进而控制 LED。

另外,Beaglebone Black 提供了 USB IP,连接上 PC 之后,会出现一个虚拟网口,可以直接通过这个虚拟网口与 Beaglebone Black 通信。




4. 系统框图

image.png




5. 开发环境

5.1 配置网络

5.1.1 通过串口连接 Beaglebone Black

使用 USB 连接 PC 和 Beaglebone Black 之后,系统会出现一个串口,使用 115200 波特率连接:

image.png

5.1.2 登录 Shell

  • 默认用户名: debian
  • 默认密码:temppwd
Debian GNU/Linux 10 beaglebone ttyGS0

BeagleBoard.org Debian Buster IoT Image 2020-04-06

Support: http://elinux.org/Beagleboard:BeagleBoneBlack_Debian

default username:password is [debian:temppwd]

beaglebone login: debian
Password:
Last login: Sun Dec 22 12:18:09 UTC 2024 on ttyGS0

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.

5.1.3 ifconfig 查看 network interface

在 Windows 系统上可以显示的虚拟网口是 usb0:

debian@beaglebone:~$ ifconfig
eth0: flags=-28669<UP,BROADCAST,MULTICAST,DYNAMIC> mtu 1500
ether 64:8c:bb:f7:88:f1 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
device interrupt 55

lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 2640 bytes 178000 (173.8 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 2640 bytes 178000 (173.8 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

usb0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.7.2 netmask 255.255.255.0 broadcast 192.168.7.255
inet6 fe80::668c:bbff:fef7:88f3 prefixlen 64 scopeid 0x20<link>
ether 64:8c:bb:f7:88:f3 txqueuelen 1000 (Ethernet)
RX packets 141 bytes 16196 (15.8 KiB)
RX errors 0 dropped 5 overruns 0 frame 0
TX packets 42 bytes 10012 (9.7 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

usb1: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 192.168.6.2 netmask 255.255.255.0 broadcast 192.168.6.255
ether 64:8c:bb:f7:88:f7 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

5.1.4 配置 PC 上的网络接口

  • 配置网口地址为 192.168.7.1,与 BBB 上的 usb0 处于同一网段
    image.png
  • 共享 PC 上可以连接外网的网络接口
    image.png

5.1.5 route 查看路由信息

debian@beaglebone:~$ route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.6.0 0.0.0.0 255.255.255.0 U 0 0 0 usb1
192.168.7.0 0.0.0.0 255.255.255.0 U 0 0 0 usb0

5.1.6 添加网关

将 BBB 的网关指向 PC 上的网络接口地址:

sudo route add default gw 192.168.7.1

5.1.7 配置 dns server

sudo vim /etc/resolv.conf

添加
nameserver 8.8.4.4

5.2 安装 Python 和相关 package

5.2.1 sudo apt update

debian@beaglebone:~$ sudo apt update
[sudo] password for debian:
Get:1 http://deb.debian.org/debian buster InRelease [122 kB]
Get:3 http://deb.debian.org/debian buster-updates InRelease [56.6 kB]
Get:4 http://deb.debian.org/debian-security buster/updates InRelease [34.8 kB]
Get:2 https://repos.rcn-ee.com/debian buster InRelease [3,078 B]
Get:5 http://deb.debian.org/debian buster/non-free armhf Packages [62.1 kB]
Get:6 http://deb.debian.org/debian buster/contrib armhf Packages [40.1 kB]
Get:7 http://deb.debian.org/debian buster/main armhf Packages [7,706 kB]
Get:8 http://deb.debian.org/debian buster-updates/main armhf Packages [8,784 B]
Get:9 http://deb.debian.org/debian-security buster/updates/contrib armhf Packages [3,452 B]
Get:10 http://deb.debian.org/debian-security buster/updates/main armhf Packages [602 kB]
Get:11 http://deb.debian.org/debian-security buster/updates/non-free armhf Packages [9,940 B]
Get:12 https://repos.rcn-ee.com/debian buster/main armhf Packages [2,405 kB]
Fetched 11.1 MB in 1min 16s (145 kB/s)
Reading package lists... Done
Building dependency tree
Reading state information... Done
238 packages can be upgraded. Run 'apt list --upgradable' to see them.

5.2.2 sudo apt install python3-pip

BBB 出厂自带的 debian 系统默认集成了 python 3.7.3:

debian@beaglebone:~$ sudo apt install python3-pip
Reading package lists... Done
Building dependency tree
Reading state information... Done
python3-pip is already the newest version (18.1-5).
0 upgraded, 0 newly installed, 0 to remove and 238 not upgraded.
debian@beaglebone:~$ python3 --version
Python 3.7.3

5.2.3 sudo pip3 install Adafruit_BBIO flask

BBB 出厂自带的 debian 系统默认集成了 Adafruit_BBIO 和 flask:

debian@beaglebone:~$ sudo pip3 install Adafruit_BBIO flask
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Requirement already satisfied: Adafruit_BBIO in /usr/local/lib/python3.7/dist-packages/Adafruit_BBIO-1.1.1-py3.7-linux-armv7l.egg (1.1.1)
Requirement already satisfied: flask in /usr/lib/python3/dist-packages (1.0.2)
debian@beaglebone:~$ pip3 list
Package Version
------------- -------
Adafruit-BBIO 1.1.1
Click 7.0
colorama 0.3.7
decorator 4.3.0
distro 1.3.0
Flask 1.0.2
itsdangerous 0.24
Jinja2 2.10
MarkupSafe 1.1.0
numpy 1.16.2
pip 18.1
pyctrl 0.4.3
rcpy 0.5.1
scipy 1.1.0
setuptools 40.8.0
Werkzeug 0.14.1




6. 开发过程

6.1 Flask 应用开发

创建一个名为 led_flask.py 的 Python 文件,实现 Web 服务端,处理用户请求:

import threading
import time
import Adafruit_BBIO.GPIO as GPIO
from flask import Flask, render_template

# 创建 Flask 应用
app = Flask(__name__)

# 设置 LED 引脚
usr0_led_pin = "USR0"
usr1_led_pin = "USR1"
usr2_led_pin = "USR2"
usr3_led_pin = "USR3"

# 初始化 LED 引脚为输出模式
GPIO.setup(usr0_led_pin, GPIO.OUT)
GPIO.setup(usr1_led_pin, GPIO.OUT)
GPIO.setup(usr2_led_pin, GPIO.OUT)
GPIO.setup(usr3_led_pin, GPIO.OUT)

# 全局变量控制闪烁状态
blink_thread = None
is_blinking = False

# LED 闪烁的控制函数
def blink_led():
global is_blinking
while is_blinking:
GPIO.output(usr0_led_pin, GPIO.HIGH) # 点亮 LED
time.sleep(0.2) # 延时 0.5
GPIO.output(usr0_led_pin, GPIO.LOW) # 熄灭 LED
time.sleep(0.2) # 延时 0.5
GPIO.output(usr1_led_pin, GPIO.HIGH) # 点亮 LED
time.sleep(0.2) # 延时 0.5
GPIO.output(usr1_led_pin, GPIO.LOW) # 熄灭 LED
time.sleep(0.2) # 延时 0.5
GPIO.output(usr2_led_pin, GPIO.HIGH) # 点亮 LED
time.sleep(0.2) # 延时 0.5
GPIO.output(usr2_led_pin, GPIO.LOW) # 熄灭 LED
time.sleep(0.2) # 延时 0.5
GPIO.output(usr3_led_pin, GPIO.HIGH) # 点亮 LED
time.sleep(0.2) # 延时 0.5
GPIO.output(usr3_led_pin, GPIO.LOW) # 熄灭 LED
time.sleep(0.2) # 延时 0.5

@app.route('/')
def index():
return render_template('index.html', led_status="OFF")

@app.route('/led_on')
def led_on():
global is_blinking
if is_blinking:
stop_blinking() # 如果闪烁中,停止闪烁
# 点亮 LED
GPIO.output(usr0_led_pin, GPIO.HIGH)
GPIO.output(usr1_led_pin, GPIO.HIGH)
GPIO.output(usr2_led_pin, GPIO.HIGH)
GPIO.output(usr3_led_pin, GPIO.HIGH)
return render_template('index.html', led_status="ON")

@app.route('/led_off')
def led_off():
global is_blinking
if is_blinking:
stop_blinking() # 如果闪烁中,停止闪烁
# 熄灭 LED
GPIO.output(usr0_led_pin, GPIO.LOW)
GPIO.output(usr1_led_pin, GPIO.LOW)
GPIO.output(usr2_led_pin, GPIO.LOW)
GPIO.output(usr3_led_pin, GPIO.LOW)
return render_template('index.html', led_status="OFF")

@app.route('/led_blink')
def led_blink():
global is_blinking, blink_thread
if not is_blinking:
is_blinking = True
blink_thread = threading.Thread(target=blink_led)
blink_thread.start() # 启动闪烁线程
return render_template('index.html', led_status="BLINKING")

@app.route('/led_stop_blink')
def led_stop_blink():
global is_blinking
if is_blinking:
stop_blinking() # 停止闪烁
return render_template('index.html', led_status="OFF")

def stop_blinking():
global is_blinking
is_blinking = False
if blink_thread:
blink_thread.join() # 等待闪烁线程停止
# 确保停止闪烁后 LED 关闭
GPIO.output(usr0_led_pin, GPIO.LOW)
GPIO.output(usr1_led_pin, GPIO.LOW)
GPIO.output(usr2_led_pin, GPIO.LOW)
GPIO.output(usr3_led_pin, GPIO.LOW)

if __name__ == '__main__':
try:
app.run(host='0.0.0.0', port=5000) # 启动 Flask 应用,监听所有 IP5000 端口
finally:
GPIO.cleanup() # 清理 GPIO 设置

6.2 HTML 前端代码

创建一个名为 index.html 的 HTML 文件,实现用户界面:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>LED Control</title>
<style>
body {
font-family: Arial, sans-serif;
text-align: center;
margin-top: 50px;
}
button {
padding: 10px 20px;
font-size: 18px;
margin: 10px;
cursor: pointer;
}
.status {
font-size: 24px;
margin-top: 20px;
}
</style>
</head>
<body>
<h1>BeagleBone Black LED Control</h1>

<button onclick="window.location.href='/led_on'">Turn LED On</button>
<button onclick="window.location.href='/led_off'">Turn LED Off</button>
<button onclick="window.location.href='/led_blink'">Start Blinking</button>
<button onclick="window.location.href='/led_stop_blink'">Stop Blinking</button>

<div class="status">
{% if led_status %}
<p>LED is: {{ led_status }}</p>
{% else %}
<p>LED status unknown</p>
{% endif %}
</div>
</body>
</html>




7. 功能展示

7.1 启动 Flask 应用

  • 在 Shell 中通过python3 led_flask.py
debian@beaglebone:~$ python3 led_flask.py
* Serving Flask app "led_flask" (lazy loading)
* Environment: production
WARNING: Do not use the development server in a production environment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
  • 启动 Flask 应用后,可以通过浏览器访问 BeagleBone Black 的 IP 地址和端口号,格式如下:
http://192.168.7.2:5000

7.2 操作 Web 页面

  • 用户可以通过页面上的两个按钮(Turn LED On  Turn LED Off)来控制 LED 的开关状态。
  • 页面上实时显示当前 LED 的状态(ON 或 OFF)。

image.png

debian@beaglebone:~$ python3 led_flask.py
* Serving Flask app "led_flask" (lazy loading)
* Environment: production
WARNING: Do not use the development server in a production environment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
192.168.7.1 - - [23/Dec/2024 20:42:45] "GET /led_off HTTP/1.1" 200 -
192.168.7.1 - - [23/Dec/2024 20:42:47] "GET /led_on HTTP/1.1" 200 -
192.168.7.1 - - [23/Dec/2024 20:42:47] "GET /led_off HTTP/1.1" 200 -
192.168.7.1 - - [23/Dec/2024 20:42:48] "GET /led_blink HTTP/1.1" 200 -
192.168.7.1 - - [23/Dec/2024 20:42:50] "GET /led_stop_blink HTTP/1.1" 200 -
192.168.7.1 - - [23/Dec/2024 20:42:52] "GET /led_blink HTTP/1.1" 200 -
192.168.7.1 - - [23/Dec/2024 20:42:53] "GET /led_off HTTP/1.1" 200 -
附件下载
Beaglebone-Black.zip
通过 Flask 控制 LED 的源代码
团队介绍
在职工程师
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号