zoukankan      html  css  js  c++  java
  • Beaglebone Black

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

    001_LED

    需要的材料:

    • 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。

    image

    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 的灯在哪里,还有它们可以怎么玩:

    image

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

    image

    简单英文能看懂的话,里面东西都写的很明白,咱们要它亮,和灭而已,只需要动 trigger,和 brightness,脚本试试效果呗,拿 usr0 开刀,下图显示了原来的值,和我写入了什么进去:
    image

    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 即可,或者命令行执行,效果一样。闪呀闪…

    image

    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开发板玩家群 578649319
    硬件创客 (10105555)硬件创客 (10105555)

  • 相关阅读:
    C++ 动态库导出函数名“乱码”及解决
    ASP.NET 4.5 Bundle组件(捆绑、缩小静态文件)
    MVC4 + WebAPI + EasyUI + Knockout-授权代码维护
    关于Grunt可视化的尝试
    Object-c学习之路三(@class与#import的区别)
    2.1 以指定的次序返回查询结果
    进程序名得到进程ID和句柄与进程的公司名(使用快照和GetPeFileCompany和VerQueryValueW等函数)
    在资源里面画出你的界面
    VS2008下WinRar源码生成dll和 lib总结
    进程占用百分百CPU不卡(从未试过,当别的程序运行的时候,当前程序还会运行吗?)
  • 原文地址:https://www.cnblogs.com/leptonation/p/5148443.html
Copyright © 2011-2022 走看看