Beaglebone Black - 控制 BBB 板上的 LED 灯
BBB 的板上有五个 LED 灯,一个电源,四个其他指示灯,usr0 至 usr3 。这次学习是控制 usr0 至 3 让它们亮着,熄灭,闪。算是个 Hello World 实验。非常简单。

需要的材料:
- BBB 一台
- 购买BBB 自带的数据线一条
- 手提电脑或台式电脑,有 USB 插头的
首先用数据线把 BBB 和电脑连接,自动开机了之后,可以开始了。
这次三个做法都试试:
- Bonescript
- Python
- C++
Bonescript
操作 Bonescript 做法是用 Cloud9,假设你没改过 BBB 的 usb0 网卡地址的话,从电脑浏览器打开 http://192.168.7.2:3000/ 即可。
右击文件夹目录添加个文件夹吧,然后右击添加文件(New File),命名注意扩展名,bonescript 是 JS,扩展名是 .js。

var b = require('bonescript');
var leds = ["USR0", "USR1", "USR2", "USR3"];
for(var i in leds) {
b.pinMode(leds[i], b.OUTPUT);
}
var state = b.HIGH;
for(var i in leds) {
b.digitalWrite(leds[i], state);
}
(话说安装了新的 OpenWriter 没有 code snippet 插件…)
首先 pinMode 设 output,LED给它 HIGH 用 digitalWrite 写进去即可。循环四个灯让它们全部点亮。给它 LOW,LED 就熄灭。试试。代码写好直接按上面的 Run 按钮运行。
然后是闪动,JS 就是个 setInterval 而已:
var b = require('bonescript');
var leds = ["USR0", "USR1", "USR2", "USR3"];
for(var i in leds) {
b.pinMode(leds[i], b.OUTPUT);
}
var state = b.HIGH;
function toggle(){
if(state===b.LOW){
state = b.HIGH;
} else {
state = b.LOW;
}
for(var j in leds){
b.digitalWrite(leds[j],state);
}
}
setInterval(toggle,1000);
再可以加点代码让四个灯循环点亮熄灭,自己试试把。Bonescript 的 API 请查看这里。
Python
到了 Python 有点纠结,因为 Adafruit_BBIO 这个 module 有点问题,本来想直接用,但 usr0 没反应,实测过确实不行。详细我不研究了,遇上这些事比较恼火不看它了。
直接看看这些东西的工作原理,直接写吧。为求快捷,先看看 Stackoverflow 别人贴的一段代码,python3 的,请无视,只看代码:
import os
class SimpleGPIO:
def __init__(self,gpio_pin):
self.gpio_pin = gpio_pin
os.system("echo %d > /sys/class/gpio/export" % self.gpio_pin)
self.gpio_path = "/sys/class/gpio/gpio%d/"%gpio_pin
with open(self.gpio_path+"direction") as f:
self.direction = f.read()
def write(self,value):
if self.direction != "out":
os.system("echo out > %sdirection"%self.gpio_path)
self.direction = "out"
os.system("echo %s > %svalue"%(value,self.gpio_path))
def read(self):
if self.direction != "in":
os.system("echo in > %sdirection"%self.gpio_path)
self.direction = "in"
with open(self.gpio_path+value) as f:
return f.read()
在 linux 操作硬件,用的是 sysfs ,以上代码是 GPIO 通用的 class,给 pin 号码创建即可,然后就可以调用 write 和 read,比较简单。如果是 python 控请自行按需改良以上,留着日后用。
然后看看 usr0 至 usr3 的灯在哪里,还有它们可以怎么玩:

在 /sys/class/leds 内,你会看到四个, beaglebone:green:usr0 至 3,再进去其中一个看看

简单英文能看懂的话,里面东西都写的很明白,咱们要它亮,和灭而已,只需要动 trigger,和 brightness,脚本试试效果呗,拿 usr0 开刀,下图显示了原来的值,和我写入了什么进去: 
echo none > trigger
echo 1 > brightness
这时候,usr0 灯就是常亮的了,因为 trigger 设成 none,亮度为 1。那灭了它呢,就这样:
echo 0 > brightness
就是说,要它闪的话,首先清掉 trigger(改为值 none),然后把 brightness 循环写入 0 和 1 即可。python 写也只不过是这样而已:
import os
import time
class SimpleLED:
def __init__(self,led_no):
self.led_no = led_no
self.led_path = "/sys/class/leds/beaglebone:green:usr%d/" % self.led_no
os.system("echo none > %strigger" % self.led_path)
self.state = "off"
def On(self):
if self.state != "on":
os.system("echo 1 > %sbrightness" % self.led_path)
self.state = "on"
def Off(self):
if self.state != "off":
os.system("echo 0 > %sbrightness" % self.led_path)
self.state = "off"
LEDs = [SimpleLED(i) for i in range(4)]
while True:
for j in range(4):
LEDs[j].On()
time.sleep(1)
for j in range(4):
LEDs[j].Off()
time.sleep(1)
你喜欢用 Cloud9 就开个档案贴以上代码上去,然后 run 即可,或者命令行执行,效果一样。闪呀闪…

Adafruit 那个到底有什么问题我不研究了。自己动手,丰衣足食。很简单的。代码就是创建 SimpleLED 时把 trigger 写入 none,要开灯 On() 时候对 brightness 写入 1,关灯 Off() 写入 0。
把原来的值写回去 trigger 和 brightness,即可还原,或者傻一点,重启亦可。
C++
sysfs 说明见 python 部分,C++ 直接上代码:
#include<iostream>
#include<fstream>
#include<string>
#include<sstream>
using namespace std;
#define LED_PATH "/sys/class/leds/beaglebone:green:usr"
class LED{
private:
string path;
int number;
virtual void writeLED(string filename, string value);
virtual void removeTrigger();
public:
LED(int number);
virtual void turnOn();
virtual void turnOff();
virtual void flash(string delayms);
virtual void outputState();
virtual ~LED();
};
LED::LED(int number){
this->number = number;
ostringstream s;
s << LED_PATH << number;
path = string(s.str());
}
void LED::writeLED(string filename, string value){
ofstream fs;
fs.open((path+filename).c_str());
fs << value;
fs.close();
}
void LED::removeTrigger(){
writeLED("/trigger", "none");
}
void LED::turnOn(){
cout << "Turning LED" << number << " on." << endl;
removeTrigger();
writeLED("/brightness", "1");
}
void LED::turnOff(){
cout << "Turning LED" << number << " off." << endl;
writeLED("/brightness", "0");
}
void LED::flash(string delayms = "50"){
cout << "Making LED" << number << " flash." << endl;
writeLED("/trigger", "timer");
writeLED("/delay_on", delayms);
writeLED("/delay_off", delayms);
}
void LED::outputState(){
ifstream fs;
fs.open((path + "/trigger").c_str());
string line;
while(getline(fs, line)) cout << line << endl;
fs.close();
}
LED::~LED(){
cout <<"Destroying the LED object with path: " << path << endl;
}
int main(int argc, char* argv[]){
if(argc != 2){
cout << "Args error, on/off/flash/status supported only." << endl;
return 1;
}
string cmd(argv[1]);
LED led = LED(3);
if(cmd=="on") led.turnOn();
else if (cmd=="off") led.turnOff();
else if (cmd=="flash") led.flash("100");
else if (cmd=="status") led.outputState();
else {
cout << "Command invalid" << endl;
return 1;
}
return 0;
}
代码来自 Exploring Beaglebone 这本书。原理和 python 一模一样,不解释了。
感觉以上有点侮辱你智慧的话,下一篇来个面包板,点亮上面的 LED,就会用到 GPIO 了。
我在这群里,欢迎加入交流:
开发板玩家群 578649319
硬件创客 (10105555)
Beaglebone Black - 控制 BBB 板上的 LED 灯的更多相关文章
- 在ZYNQ-7000平台上利用PS点亮PL上的LED灯
在ZYNQ-7000平台上利用PS点亮PL上的LED灯 1.实验方案 图1 实验方案系统框图 2.具体步骤 2.1.vivado工程建立 ①打开vivado集成开发环境,点击“Create Pr ...
- 韦东山嵌入式Linux学习笔记04--点亮开发板的一个LED灯
搜索开发板原理图LED的走线 LED8是网线接口的指示灯. 在这里我们尝试用汇编代码控制D10, 也就是LED1,它连接到EINT4/GPF4,读取芯片手册 有原理图可知,如果需要 ...
- Arduino 翻译系列 - LED 灯闪烁
原文地址 - https://www.arduino.cc/en/Tutorial/Blink 闪烁 这个例子展示了你能拿 Arduino / Genuino 板子来干的最简单的事:使开发板上的 LE ...
- BeagleBone Black 板第三课:Debian7.5系统安装和远程控制BBB板
BBB板第三课:Debian7.5系统安装和远程控制BBB板 由于BBB板系统是Debian 7.4.据说使用Debian系统能够实现非常多BBB板的无缝连接.能够更好的学习和控制BBB板,所以就决定 ...
- BeagleBone Black教训四局:简单LED对照实验
BBB教训四局:简单LED对照实验 学习BBB董事会最终目的是做同样的想象单片机控制.但控制是不一样的想法,在所有(Linux在本质上,硬件设备的控制,以虚拟文件有关的设备下的读写),研究了几天头都大 ...
- 基于arduino UNO R3+ESP8266控制LED灯的开关(无USB转TTL工具实现)
最近由于项目要求,需要开发物联网云平台,而本人对硬件和通信技术一窍不通,故而选择arduino这一简单单片机来实现学习掌握基础的硬件和通信技术. 下面就是本人通过查阅大佬资料做的一个整合版本的通过手机 ...
- NodeMCU手把手入门:配置NodeMCU ESP8266开发板环境及点亮LED灯
之前一直在玩树莓派,最近实验室买了些NodeMCU就想着玩一玩,没想到挺有意思的.其实树莓派能实现的功能,它大部分也可以,价格比派也便宜不少,舍不得买派的同学可以先买这个开发板玩一玩. 本文主要介绍了 ...
- Tiny4412之蜂鸣器驱动与led灯驱动
一:LED驱动编写 要编写LED驱动,首先的知道开发板的构造:开发板分为核心板与底板:编写驱动的第一步就是要看开发板,找到LED灯在开发板上的位置及所对应的名字:第一步就要查看核心板电路图,以及底板电 ...
- 第7章 使用寄存器点亮LED灯
第7章 使用寄存器点亮LED灯 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fir ...
随机推荐
- 一、Java基础--01
Java基础测试题分析 第一题是关于基本的算法知识,这个很有必要去掌握以下,在学校也经常听老师们说找工作比试面试会出一些这方面的知识,我拿到的第一题是关于排序的,虽然很简单,但是我还是要提醒一下基础不 ...
- HttpHandler和ashx要实现IRequiresSessionState接口才能访问Session信息(转载)
通常我们经常,通过session判定用户是否登录.还有一些临时的.重要的数据也尝尝存放在Session中. 在页面我们很容易的得到Session的值,但在类中就会遇到一些问题.也知道通过下面的方法得到 ...
- Openstack的HA解决方案【替换原有的dashboard】
0. 进入到/etc/haproxy/conf.d/目录下 mv 015-horizon.cfg 150-timaiaas.cfg 将原有的dashboard的ha配置文件做为自己的配置文件. 1. ...
- B2C电子商务网站技术框架
一 设计原则 电子商务平台总体结构的设计应从体系.功能.信息.过程等各个方面保证整个电子商务平台总体目标的实现,以提高市场竞争能力.总体结构的设计应考虑以下设计原则: 快速响应原则:商机稍纵即逝,网站 ...
- RAII惯用法详解
[1]什么是RAII惯用法? RAII是Resource Acquisition Is Initialization的缩写,意为“资源获取即初始化”. 它是C++之父Bjarne Stroustrup ...
- 去除冗余 – 精简您的CSS样式代码
讲讲常见的一些没有必要使用CSS代码情况,而这些不起作用可以去掉的CSS代码可能是我们经常忽视的.越是对CSS理解不够,越容易出现这些问题. 二.一些常见不必要CSS样式 1.与默认CSS样式一致 我 ...
- 使用BusyBox制作根文件系统【转】
本文转载自:http://www.cnblogs.com/lidabo/p/5300180.html 1.BusyBox简介 BusyBox 是很多标准 Linux 工具的一个单个可执行实现.Busy ...
- 161115、MyBatis 通过包含的jdbcType类型
MyBatis常用jdbcType类型 BIT FLOAT CHAR TIMESTAMP OTHER UNDEFINEDTINYI ...
- 使用Perl5获取有道词典释义
Get Word Definition from dict.youda.com via Perl Script 获取基本释义 Get Basic Definition http://dict.youd ...
- 理解逐次逼近寄存器型ADC:与其它类型ADC的架构对比【转】
转自:http://bbs.dzsc.com/space/viewspacepost.aspx?postid=86760 摘要:逐次逼近寄存器型(SAR)模数转换器(ADC)占据着大部分的中等至高分辨 ...