一、开发板介绍:
BeagleBone Black 是一款面向开发人员和业余爱好者的低成本、高扩展、社区支持的开发平台,板卡处理器选用的是 TI 公司 AM3358 芯片, 处理器集成了高达 1GHz 的 ARM Cortex™ A8 内核,具有强大的处理能力并提供了丰富的外设接口。BeagleBone® Black面向开源社区用户、开源硬件爱好者和任何对Arm Cortex-A8低成本处理器感兴趣的人而设计,配备精简,旨在为不需要搭建完整开发平台并想体验Arm处理器功能的用户提供入门的捷径。它配备了最低限度的外设,使用户能够体验处理器的强大功能,还提供了许多接口,用户还可以开发自己的电路板或添加自己的电路。
二、设计思路:在系统中建立了一个网页,实时显示板载LED状态与操作按键。板卡通过网线与PC通信与供电,可从网页中控制LED的开关与闪烁。
三、外部硬件介绍:
- 直流电源是接受 5V 电源的主要直流输入。
- Power Button 提醒处理器启动 Power Down 序列,并用于关闭电路板的电源。
- 10/100 以太网是到 LAN 的连接。
- Serial Debug 是串行调试端口。
- USB 客户端是与 PC 的 miniUSB 连接,也可以为板供电。
- 如果板上的电源循环,可以使用BOOT开关从microSD卡强制启动,断开电源并重新为板子供电。
- 用户可以使用四个蓝色 LED。
- Reset Button 允许用户重置处理器。
- microSD 插槽是可以安装 microSD 卡的地方。
- microHDMI 连接器是显示器连接的地方。
- USB Host 可以连接不同的 USB 接口,如 Wi-Fi、BT、键盘等
硬件设计的程序框图:
四、代码区域:
下面几行代是一个使用Python的Flask框架和gpiod库来控制GPIO(通用输入/输出)引脚的示例。代码的目的是通过GPIO引脚控制一个LED灯的开关状态。
from flask import Flask, render_template
import gpiod
import time
app = Flask(__name__)
LED_CHIP = "gpiochip1"
LED_LINE_OFFSET = [24] # USR0 run: gpioinfo | grep -i -e chip -e usr
chip = gpiod.Chip(LED_CHIP)
lines = chip.get_lines(LED_LINE_OFFSET)
lines.request(consumer="main.py", type=gpiod.LINE_REQ_DIR_OUT)
state = 0 # Start with LED off
lines.set_values([0])
下面是对上面代码的详细解释:
from flask import Flask, render_template
import gpiod
import time
这行代码从`flask`模块导入了`Flask`类和`render_template`函数。Flask是一个用于创建Web应用的微框架,`render_template`函数用于渲染HTML模板。并且导入了`gpiod`模块,它是一个用于访问Linux GPIO接口的Python库,同时导入了`time`模块,该模块提供了与时间相关的函数。
app = Flask(__name__)
接着创建了一个FLask的应用实例
LED_CHIP = "gpiochip1"
LED_LINE_OFFSET = [24] # USR0 run: gpioinfo | grep -i -e chip -e usr
这里定义了两个变量,`LED_CHIP`是一个字符串,表示要使用的GPIO芯片的名称。`LED_LINE_OFFSET`是一个列表,包含了一个整数24,这通常表示芯片上特定的引脚编号。注释中提到的命令gpioinfo | grep -i -e chip -e usr是用来在系统上查找GPIO芯片和特定的用户LED引脚的。
lines.request(consumer="main.py", type=gpiod.LINE_REQ_DIR_OUT)
这行代码对获取的引脚请求GPIO输出权限。`consumer`参数是一个字符串,用于标识使用这些引脚的应用或脚本(在这里是"main.py"),`type`参数设置为`gpiod.LINE_REQ_DIR_OUT`,表示请求将这些引脚作为使用。
lines.set_values([0])
最后,这行代码设置了引脚的值。set_values方法接受一个列表,列表中的每个值对应一个引脚的状态。在这里,我们只设置了一个引脚,其值为0,这意味着该引脚会被设置为低电平,LED灯会保持关闭状态。
def blink_led():
"""
这个函数将使LED灯闪烁5次。
"""
i = 5
"""
初始化一个变量i,其值设置为5。这个变量用作计数器,表示LED灯将闪烁的次数。
"""
while i:
"""
开始一个while循环,它将重复执行直到i的值变为0。
"""
state = lines.get_values()[0]
"""
调用lines对象的get_values()方法,获取当前所有引脚的状态。由于lines只包含一个引脚,
所以我们通过索引[0]获取第一个引脚的状态,并将其存储在变量state中。
"""
lines.set_values([1 - state])
"""
调用lines对象的set_values()方法,将当前引脚状态取反(如果之前是0,就设置为1;
如果之前是1,就设置为0)。这样LED灯的状态就会切换。
"""
time.sleep(0.5)
"""
调用time模块的sleep()函数,使程序暂停0.5秒。这是为了让LED灯保持当前状态一段时间,
从而能够看到LED灯的闪烁效果。
"""
i -= 1
"""
将计数器i减1。这行代码执行完毕后,while循环的条件将再次检查i的值,直到i减到0,
循环才会结束。
"""
函数blink_led()的工作流程如下:
初始化一个计数器i为5
开始一个循环,循环条件是i不等于0。
在循环内部,首先获取LED的当前状态并存储在变量state中。
将LED的状态取反,即如果之前是关闭的,现在就打开;如果之前是打开的,现在就关闭。
等待0.5秒,以便LED状态的改变可以被观察到。
计数器i减1。
重复步骤3到6,直到i变为0。
@app.route("/")
def index():
"""
定义一个视图函数index(),它将被映射到网站的根URL上。
"""
# Read Sensors Status
state = lines.get_values()[0]
"""
获取当前GPIO引脚的状态。这里假设`lines`是一个已经配置好的gpiod.Line对象,
调用`get_values()`方法返回一个包含所有引脚状态的列表,并取列表的第一个元素(索引为0),
这表示第一个引脚的状态,通常也就是连接LED的引脚状态。
"""
templateData = {
"title": "LED Status",
"led": state,
}
"""
创建一个字典templateData,它将用于存储传递给HTML模板的数据。
在这里,添加了两个键值对,"title"和"led"。"title"的值设置为"LED Status",而"led"的值设置为LED的当前状态。
"""
return render_template("index.html", **templateData)
"""
最后,使用Flask的`render_template`函数来渲染一个名为"index.html"的HTML模板,
并将templateData字典中的数据作为关键字参数传递给模板。
"""
这个index函数的作用如下:
当用户访问网站的根路由(即“/”)时,Flask会调用index函数。
函数首先读取LED的状态(这里假定LED连接到了GPIO引脚上)。
函数创建一个字典templateData,包含将要在网页上显示的数据。这些数据包括页面的标题(LED的状态)和LED当前的布尔状态。
函数使用render_template方法来渲染index.html模板,并传入templateData字典中的数据。在HTML模板中,可以使用这些变量来显示LED的状态。
@app.route("/<action>")
def action(action):
"""
定义一个视图函数action(),它接受一个动态部分<action>作为URL的一部分。
这个<action>部分可以由用户通过URL指定,比如 "/on", "/off", "/blink"。
"""
if action "on":
lines.set_values([1])
"""
如果action的值是'on',则将LED引脚的状态设置为高电平(1),打开LED。
"""
if action == "off":
lines.set_values([0])
"""
如果action的值是'off',则将LED引脚的状态设置为低电平(0),关闭LED。
"""
if action == "blink":
blink_led()
"""
如果action的值是'blink',则调用blink_led()函数,使LED闪烁。
需要注意的是,blink_led函数应该已经在代码中定义。
"""
if action == "breath": # 新增 breathe 路由
breath_led()
"""
如果action的值是'breath',则调用breath_led()函数,假设这个函数会使LED像呼吸一样渐亮渐暗。
breath_led函数也应该已经在代码中定义。
"""
state = lines.get_values()[0]
"""
获取当前LED的状态,无论之前的操作是什么。
"""
templateData = {
"led": state,
}
"""
创建一个字典templateData,包含LED的当前状态,这个数据将被传递给HTML模板。
"""
return render_template("index.html", **templateData)
"""
使用render_template()函数渲染"index.html"模板,并将templateData字典作为参数传递给模板。
"""
这个action函数流程如下:
用户通过访问形如/on、/off、/blink或/breath的URL来触发函数。
action函数接收URL中的action参数,并根据该参数的值来决定对LED执行哪种操作。
根据操作类型,函数通过调用lines.set_values()方法或者blink_led()和breath_led()函数来控制的状态。
执行完指定的操作后,函数读取LED的当前状态并存储在state变量中。
然后,函数准备了一个templateData字典,其中包含了要传递给模板的LED状态数据。
最后,函数通过调用render_template()方法来渲染index.html模板,并传入templateData字典。
五、设计思路:
我们可以参考下面这个博客的链接:BeagleBone Black使用(二):连接狗板与系统更新_狗板如何远程链接-CSDN博客(在这个过程中所遇到的问题:ssh时一直连接不上,解决办法就是重新安装环境)
然后当连接上以后就要先将系统控制LED的代码进行禁止了,我们好自己去调用LED,然后拉高LED,和拉低LED,然后使用FLASK和板卡进行互通,就能使用网页去控制LED了。
六、功能展示:
打开网路端口就会跳转到如下页面:
这四个按键分别可以控制LED的四种不同的状态
USR0 LED 位于靠近板卡边缘的那一个