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)

  • 相关阅读:
    钱多多软件制作04
    团队项目01应用场景
    HDU 4411 arrest
    HDU 4406 GPA
    HDU 3315 My Brute
    HDU 3667 Transportation
    HDU 2676 Matrix
    欧拉回路三水题 POJ 1041 POJ 2230 POJ 1386
    SPOJ 371 BOXES
    POJ 3422 Kaka's Matrix Travels
  • 原文地址:https://www.cnblogs.com/leptonation/p/5148443.html
Copyright © 2011-2022 走看看