Beaglebone Black - 控制 BBB 板上的 LED 燈

来源:http://www.cnblogs.com/leptonation/archive/2016/01/21/5148443.html
-Advertisement-
Play Games

BBB 的板上有五個 LED 燈,一個電源,四個其他指示燈,usr0 至 usr3 。這次學習是控制 usr0 至 3 讓它們亮著,熄滅,閃。算是個 Hello World 實驗。非常簡單。 需要的材料: BBB 一臺 購買BBB 自帶的數據線一條 手提電腦或台式電腦,有 USB 插頭的 首先用數據...


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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • TryVistalizator- this tool allows you to change display language in Windows editions other than (officially supported) Ultimate, like Starter, Home Ba...
  • 版權聲明:本內容為原創內容,轉載請聲明出處。原文地址:http://www.excelib.com/article/287/showfirewalld簡介Centos7中預設將原來的防火牆iptables升級為了firewalld,firewalld跟iptables比起來至少有兩大好處:1、fir...
  • nginx中可以將lua嵌,讓nginx執行lua腳本,可以處理高併發,非阻塞的處理各種請求,openresty項目中可以使用nignx可以直接構建 srcache_nginx+redis緩存,而不用通過動態語言來處理(QPS可以輕鬆的提高了)看一下openresty中srcache-nginx-m...
  • Opps, my computer system was broken again... Let's repire it.IntroductionThe system of my PC is broken. I could enter the UEFI setting. So that means ...
  • A few days ago, I have tried to write bare medal program but failed. Now I find that the main mistake is that I have mistake the address of GPIO of BC...
  • 所謂的處理器就是電腦的核心運算硬體,現在使用windows操作系統的用戶使用的機器之中的處理器多數都是X86內核,而實際之上很多時候我們用戶都是會在心目之中把一個處理器和其運行的特定操作系統掛鉤,之前說的X86和windows操作系統,而在Cortex-A系列硬體之上我們運行的多數都是Androi...
  • 1,使用工具概述 FT232Rl晶元+sscom32+示波器 2,接收數據分析 sscom32發送數據:0xaa[1010 1010] 波特率為:4800bps @5V系統 示波器測試FT232RL 發送引腳 Txd,得到數據如上圖所示。 從上圖中可以得到如下幾點結論: 1.Txd空閑為高電平。 2...
  • 1.修改主機名及hosts文件10.205.22.185 nn1 (主)作用namenode,resourcemanager,datanode,zk,hive,sqoop10.205.22.186 nn2 (備)作用namenode,resourcemanager,datanode,zk10.205...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...