Funpack3-5 基于Flask控制BeagleBone Black的LED灯
该项目使用了BeagleBone Black,实现了电脑端控制LED灯的设计,它的主要功能为:基于Flask控制BeagleBone Black的LED灯。
标签
Funpack活动
Flask
BeagleBone Black
枫雪天
更新2025-01-15
129

任务介绍

    本项目实现了Funpack第3-5期活动的任务二,在BeagleBone Black开发板上,实现了基于网页控制的LED灯。

硬件平台

    首先介绍本次用到的开发板:BeagleBone Black,这是一块基于TI AM335x处理器的嵌入式Linux开发板,是一块很有名,也有些年头的板子。但即使如此,它的性能也是足以对抗目前的市面上的普通单片机,它具有丰富的接口,包括以太网、USB、GPIO等,非常可以非常方便地用来进行物联网和嵌入式Web应用开发。我很早就听过说这块嵌入式开发板,但没有实际接触过它,所以借着硬禾学堂的Funpack活动重温经典,上车体验一下

任务分析与实现

这次主办方出了三种任务,难度也比较侧重基础

  • 任务一是自命题任务;
  • 任务二是在电脑端的网页中控制LED的开关与闪烁;
  • 任务三是使用PRU实现LED呼吸灯以及按键控制。

    这次我选择了任务二。毕竟终于上了嵌入式Linux系统,还是更适合玩一些上层的东西。

本次项目涉及到了几个关键技术:

  • Flask框架: Flask是一个轻量级的Python Web框架,非常适合用于快速开发Web应用。它提供了路由、模板引擎等基本功能,使得Web开发变得简单高效。
  • Linux LED设备驱动: BeagleBone Black通过GPIO控制LED状态。在自带的Linux系统中,四颗板载LED已经被注册成了LED设备,我们可以方便地通过sys文件系统来控制LED的状态。
  • Web前端技术: 使用HTML、CSS和JavaScript构建用户界面,通过JavaScript发送HTTP请求与后台服务器进行通信,实现网页与LED的联动。

接下来我通过代码来讲解本次项目的实现:

本项目的核心是使用Flask框架搭建Web服务器,并编写相应的路由函数来处理来自网页的请求。

首先,我们需要将LED设置为GPIO控制模式。这是通过向/sys/class/leds/beaglebone:green:usr2/trigger写入“gpio”来实现的。然后,我们可以通过向/sys/class/leds/beaglebone:green:usr2/brightness写入1或0来控制LED的亮灭。

在Flask应用中,我们定义了路由函数:GET请求用于渲染网页;POST请求用于处理控制指令,根据网页上的按钮操作控制LED的状态。

Flask服务器代码(Python)

from flask import Flask, render_template, request
import os
import threading
import time

app = Flask(__name__)

LED_TRIGGER_PATH = "/sys/class/leds/beaglebone:green:usr2/trigger"
LED_BRIGHTNESS_PATH = "/sys/class/leds/beaglebone:green:usr2/brightness"

led_blinking = False # 全局变量控制闪烁状态
blink_thread = None # 全局变量存储线程

def set_led_mode_gpio():
"""将 LED 设置为 GPIO 控制模式."""
try:
with open(LED_TRIGGER_PATH, "w") as f:
f.write("gpio")
except Exception as e:
print(f"Error setting LED mode: {e}")
return False
return True

def set_led_state(state):
"""设置 LED 的状态 (1 为亮,0 为灭)."""
try:
with open(LED_BRIGHTNESS_PATH, "w") as f:
f.write(str(state))
except Exception as e:
print(f"Error setting LED state: {e}")
return False
return True

def blink_led():
"""LED 闪烁函数."""
global led_blinking
while led_blinking:
set_led_state(1)
time.sleep(0.5) # 闪烁频率:0.5秒亮,0.5秒灭
set_led_state(0)
time.sleep(0.5)

@app.route("/", methods=["GET", "POST"])
def index():
global led_blinking, blink_thread
message = ""
if request.method == "POST":
if "led_on" in request.form:
if set_led_mode_gpio():
set_led_state(1)
message = "LED ON"
elif "led_off" in request.form:
if set_led_mode_gpio():
set_led_state(0)
message = "LED OFF"
elif "led_blink" in request.form:
if set_led_mode_gpio():
if led_blinking:
led_blinking = False # 停止闪烁
if blink_thread and blink_thread.is_alive():
blink_thread.join() # 等待线程结束
message = "LED Blink OFF"
else:
led_blinking = True # 开始闪烁
blink_thread = threading.Thread(target=blink_led)
blink_thread.start()
message = "LED Blink ON"

return render_template("index.html", message=message)

if __name__ == "__main__":
app.run(debug=True, host='0.0.0.0')

网页前端使用简单的HTML和JavaScript实现,包含两个按钮,分别用于控制LED的亮灭。当用户点击按钮时,JavaScript会发送POST请求到服务器,服务器根据请求内容控制LED的状态。

下面是具体功能的实现:

  • LED开关: 通过点击网页上的“ON”和“OFF”按钮,可以控制LED的亮灭。
  • LED闪烁(扩展功能): 可以通过添加一个定时器功能,定时切换LED的状态,实现闪烁效果。这可以通过JavaScript在前端实现,也可以通过在Flask后台添加一个单独的路由函数来控制。

网页前端代码

<!DOCTYPE html>
<html>
<head>
<title>LED Control</title>
</head>
<body>
<h1>LED Control</h1>
{% if message %}
<p>{{ message }}</p>
{% endif %}
<form method="POST">
<button type="submit" name="led_on">ON</button>
<button type="submit" name="led_off">OFF</button>
<button type="submit" name="led_blink">Blink</button> </form>
</body>
</html>

效果展示

控制页面

开发板状态

活动感想

    因为基础价格和供货原因,嵌入式Linux开发板在Funpack活动中出现不多,之前错过了第一季第一期的STM32 MP157,这次很幸运地赶上了更经典的BeagleBone Black。在这次的开发过程中,我深刻体会到了嵌入式Linux完整的软件功能和BeagleBone成熟的生态带来的便利。官方提供的题目很巧妙,既考虑到了嵌入式Linux系统之上的应用开发,也能体验到与底层硬件PRU交互的乐趣,在玩的过程中完整地了解BeagleBone Black这一经典板卡,十分有趣。

    感谢硬禾学堂和得捷电子联合举办的Funpack活动,祝硬禾的活动越办越好!

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