项目总结报告
项目介绍
本项目旨在开发一个基于 BeagleBone Black 开发板的网页控制系统,通过网页界面实现对 LED 灯的开关与闪烁控制。该系统的基本思路是利用 BeagleBone 提供的 Node.js 开发环境,结合 Bonescript 库,实现硬件与网页的联动。用户可以通过连接到 BeagleBone 的局域网,访问网页并通过按钮控制 LED 的状态。
设计思路
本项目的设计思路主要包括以下几个方面:
- 硬件选择:选择 BeagleBone Black 作为开发平台,因其具备强大的处理能力和丰富的 GPIO 接口,适合进行硬件控制项目。
- 网络连接:通过 USB 连接 BeagleBone 到电脑,使用 RNDIS 驱动创建一个虚拟网络接口,使得电脑可以通过 IP 地址访问 BeagleBone。
- 网页开发:使用 HTML 和 JavaScript 创建一个简单的网页界面,提供用户友好的操作体验。通过按钮触发 AJAX 请求,控制 LED 的状态。
- 后端开发:使用 Node.js 搭建 HTTP 服务器,处理来自网页的请求,并通过 Bonescript 库控制 LED 的状态。
硬件介绍
本项目使用的主要硬件设备为 BeagleBone Black 开发板。BeagleBone Black 是一款基于 ARM Cortex-A8 处理器的开源硬件平台,具有以下特点:
- 处理器:1GHz ARM Cortex-A8
- 内存:512MB DDR3
- 存储:4GB eMMC,支持 microSD 扩展
- 接口:多个 GPIO 接口,支持 I2C、SPI、UART 等通信协议
- 网络:内置 Ethernet 端口,支持 USB 连接
软件流程图
主要代码片段及说明
服务器端代码 (server.js
)
javascriptconst b = require('bonescript');
const http = require('http');
const url = require('url');
const fs = require('fs');
var ledPin = "USR1"; // BeagleBone Black USER LED
var flashTimer = null;
var state = b.HIGH;
b.pinMode(ledPin, b.OUTPUT);
b.digitalWrite(ledPin, state);
function toggle() {
if(state == b.LOW)
state = b.HIGH;
else
state = b.LOW;
b.digitalWrite(ledPin, state);
}
var server = http.createServer(function (req, res) {
var pathname = url.parse(req.url).pathname;
if (pathname === '/') {
fs.readFile("page.html", function(err, data) {
if (err) {
console.log(err);
res.writeHead(404, { 'Content-Type': 'text/html;charset=utf-8' });
res.write("404 NOT FOUND");
res.end();
} else {
res.writeHead(200, { 'Content-Type': 'text/html;charset=utf-8' });
res.write(data.toString());
res.end();
}
});
} else if (pathname === '/api/led/on') {
console.log('led on');
if (flashTimer) {
clearInterval(flashTimer);
flashTimer = null;
}
b.digitalWrite(ledPin, b.HIGH);
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({ message: 'LED is ON' }));
} else if (pathname === '/api/led/off') {
console.log('led off');
if (flashTimer) {
clearInterval(flashTimer);
flashTimer = null;
}
b.digitalWrite(ledPin, b.LOW);
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({ message: 'LED is OFF' }));
} else if (pathname === '/api/led/flash') {
console.log('led flash');
if (flashTimer) {
clearInterval(flashTimer);
}
flashTimer = setInterval(toggle, 1000);
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({ message: 'LED is FLASH' }));
} else if (pathname === '/api/status') {
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({
ledStatus: b.digitalRead(ledPin) ? 'ON' : 'OFF'
}));
} else {
res.writeHead(404, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({ error: 'Not Found' }));
}
});
server.listen(8090, '0.0.0.0', function () {
console.log('Server running at http://0.0.0.0:8090/');
});
代码说明
- 引入模块:引入 Bonescript、http、url 和 fs 模块。
- LED 控制:定义 LED 引脚,初始化状态为高电平。
- HTTP 服务器:创建一个 HTTP 服务器,处理不同的 URL 请求,控制 LED 的开关和闪烁。
- 响应处理:根据请求的路径返回相应的 JSON 数据。
客户端代码 (page.html
)
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>BeagleBone Black</title>
<style>
body {
font-family: Arial, sans-serif;
display: flex;
flex-direction: column;
align-items: center;
margin-top: 50px;
}
button {
margin: 10px;
padding: 10px 20px;
font-size: 16px;
cursor: pointer;
}
</style>
</head>
<body>
<h1>BeagleBone Black LED Control</h1>
<button id="button1">打开LED</button>
<button id="button2">关闭LED</button>
<button id="button3">闪烁LED</button>
<script>
async function fetchData(url) {
try {
const response = await fetch(url);
if (!response.ok) {
throw new Error(`请求失败,状态码:${response.status}`);
}
const data = await response.json();
console.log(data);
} catch (error) {
console.error('发生错误:', error);
}
}
document.getElementById('button1').addEventListener('click', () => {
fetchData('http://192.168.6.2:8090/api/led/on');
});
document.getElementById('button2').addEventListener('click', () => {
fetchData('http://192.168.6.2:8090/api/led/off');
});
document.getElementById('button3').addEventListener('click', () => {
fetchData('http://192.168.6.2:8090/api/led/flash');
});
</script>
</body>
</html>
代码说明
- HTML 结构:包括三个按钮,分别用于打开 LED、关闭 LED 和使 LED 闪烁。按钮的 ID 便于在 JavaScript 中引用。
- 样式:通过 CSS 设置页面的基本样式,使页面美观且易于使用。
- JavaScript 功能:使用
fetch
函数对后端 API 发起请求,以控制 LED 的状态。当按钮被点击时,相关函数会被调用,发送对应的请求到服务器,并在控制台中输出返回的信息。
功能展示及说明
功能展示截图
1. 打开 LED
点击“打开LED”按钮后,LED 灯亮起,并在控制台显示相应的消息。
2. 关闭 LED
点击“关闭LED”按钮后,LED 灯熄灭,控制台显示相应的消息。
3. 闪烁 LED
点击“闪烁LED”按钮后,LED 开始以每秒一次的节奏闪烁,控制台显示 LED 正在闪烁。
调试记录
连接系统
在项目开始时,配置 BeagleBone Black 与电脑的连接,使用 USB 数据线,我通过 RNDIS 驱动创建了一个虚拟网口。用 ifconfig
命令确认电脑端与 BeagleBone 的 IP 地址,确保可以互通。
处理 eMMC 空间不足
发现 eMMC 存储空间用尽,通过指令查找大于 100MB 的文件后,删除了 /var/log
目录下的大型日志文件,解决了空间不足的问题。
SSH 测试
通过 SSH 远程访问 BeagleBone,确保可以顺利登录并获取到系统的基本信息,确认其硬件配置正常。
心得体会
通过此次项目开发,我不仅加深了对 BeagleBone Black 性能的理解,也提升了自己在软硬件互联互通方面的能力。项目中遇到的挑战,如 eMMC 空间不足问题、网络配置的调试等,都促使我学习了许多相关知识。
在开发过程中,我发现项目的可视化界面不仅让用户在操作时更加直观,也尽可能减少了用户的学习成本。关于此项目的建议,我认为可以进一步扩展功能,比如增加状态反馈,实时更新 LED 状态。
我希望未来可以继续探索更多 BeagleBone 的应用场景,比如环境监测、智能家居等,进一步提升该平台的实用性和拓展性。
总结
本次项目成功实现了一个通过网页控制 BeagleBone Black 板载 LED 的系统。用户能够通过简单易懂的网页界面控制 LED 的开关及闪烁状态,且所有功能均通过 AJAX 异步请求实现,保证了网页的响应速度。通过系统调试与功能测试,项目达成预期目标,为今后的开发奠定了良好的基础。在未来的工作中,将继续改进与完善这个系统,并探索更多功能的实现可能性。