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

需要的材料:

  • BBB 一台
  • 购买BBB 自带的数据线一条
  • 手提电脑或台式电脑,有 USB 插头的

首先用数据线把 BBB 和电脑连接,自动开机了之后,可以开始了。

这次三个做法都试试:

  1. Bonescript
  2. Python
  3. 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 灯的更多相关文章

  1. 在ZYNQ-7000平台上利用PS点亮PL上的LED灯

    在ZYNQ-7000平台上利用PS点亮PL上的LED灯 1.实验方案 图1    实验方案系统框图 2.具体步骤 2.1.vivado工程建立 ①打开vivado集成开发环境,点击“Create Pr ...

  2. 韦东山嵌入式Linux学习笔记04--点亮开发板的一个LED灯

    搜索开发板原理图LED的走线           LED8是网线接口的指示灯. 在这里我们尝试用汇编代码控制D10, 也就是LED1,它连接到EINT4/GPF4,读取芯片手册 有原理图可知,如果需要 ...

  3. Arduino 翻译系列 - LED 灯闪烁

    原文地址 - https://www.arduino.cc/en/Tutorial/Blink 闪烁 这个例子展示了你能拿 Arduino / Genuino 板子来干的最简单的事:使开发板上的 LE ...

  4. BeagleBone Black 板第三课:Debian7.5系统安装和远程控制BBB板

    BBB板第三课:Debian7.5系统安装和远程控制BBB板 由于BBB板系统是Debian 7.4.据说使用Debian系统能够实现非常多BBB板的无缝连接.能够更好的学习和控制BBB板,所以就决定 ...

  5. BeagleBone Black教训四局:简单LED对照实验

    BBB教训四局:简单LED对照实验 学习BBB董事会最终目的是做同样的想象单片机控制.但控制是不一样的想法,在所有(Linux在本质上,硬件设备的控制,以虚拟文件有关的设备下的读写),研究了几天头都大 ...

  6. 基于arduino UNO R3+ESP8266控制LED灯的开关(无USB转TTL工具实现)

    最近由于项目要求,需要开发物联网云平台,而本人对硬件和通信技术一窍不通,故而选择arduino这一简单单片机来实现学习掌握基础的硬件和通信技术. 下面就是本人通过查阅大佬资料做的一个整合版本的通过手机 ...

  7. NodeMCU手把手入门:配置NodeMCU ESP8266开发板环境及点亮LED灯

    之前一直在玩树莓派,最近实验室买了些NodeMCU就想着玩一玩,没想到挺有意思的.其实树莓派能实现的功能,它大部分也可以,价格比派也便宜不少,舍不得买派的同学可以先买这个开发板玩一玩. 本文主要介绍了 ...

  8. Tiny4412之蜂鸣器驱动与led灯驱动

    一:LED驱动编写 要编写LED驱动,首先的知道开发板的构造:开发板分为核心板与底板:编写驱动的第一步就是要看开发板,找到LED灯在开发板上的位置及所对应的名字:第一步就要查看核心板电路图,以及底板电 ...

  9. 第7章 使用寄存器点亮LED灯

    第7章     使用寄存器点亮LED灯 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fir ...

随机推荐

  1. 一、Java基础--01

    Java基础测试题分析 第一题是关于基本的算法知识,这个很有必要去掌握以下,在学校也经常听老师们说找工作比试面试会出一些这方面的知识,我拿到的第一题是关于排序的,虽然很简单,但是我还是要提醒一下基础不 ...

  2. HttpHandler和ashx要实现IRequiresSessionState接口才能访问Session信息(转载)

    通常我们经常,通过session判定用户是否登录.还有一些临时的.重要的数据也尝尝存放在Session中. 在页面我们很容易的得到Session的值,但在类中就会遇到一些问题.也知道通过下面的方法得到 ...

  3. Openstack的HA解决方案【替换原有的dashboard】

    0. 进入到/etc/haproxy/conf.d/目录下 mv 015-horizon.cfg 150-timaiaas.cfg 将原有的dashboard的ha配置文件做为自己的配置文件. 1. ...

  4. B2C电子商务网站技术框架

    一 设计原则 电子商务平台总体结构的设计应从体系.功能.信息.过程等各个方面保证整个电子商务平台总体目标的实现,以提高市场竞争能力.总体结构的设计应考虑以下设计原则: 快速响应原则:商机稍纵即逝,网站 ...

  5. RAII惯用法详解

    [1]什么是RAII惯用法? RAII是Resource Acquisition Is Initialization的缩写,意为“资源获取即初始化”. 它是C++之父Bjarne Stroustrup ...

  6. 去除冗余 – 精简您的CSS样式代码

    讲讲常见的一些没有必要使用CSS代码情况,而这些不起作用可以去掉的CSS代码可能是我们经常忽视的.越是对CSS理解不够,越容易出现这些问题. 二.一些常见不必要CSS样式 1.与默认CSS样式一致 我 ...

  7. 使用BusyBox制作根文件系统【转】

    本文转载自:http://www.cnblogs.com/lidabo/p/5300180.html 1.BusyBox简介 BusyBox 是很多标准 Linux 工具的一个单个可执行实现.Busy ...

  8. 161115、MyBatis 通过包含的jdbcType类型

    MyBatis常用jdbcType类型 BIT         FLOAT      CHAR           TIMESTAMP       OTHER       UNDEFINEDTINYI ...

  9. 使用Perl5获取有道词典释义

    Get Word Definition from dict.youda.com via Perl Script 获取基本释义 Get Basic Definition http://dict.youd ...

  10. 理解逐次逼近寄存器型ADC:与其它类型ADC的架构对比【转】

    转自:http://bbs.dzsc.com/space/viewspacepost.aspx?postid=86760 摘要:逐次逼近寄存器型(SAR)模数转换器(ADC)占据着大部分的中等至高分辨 ...