Intel Edison —— 控制GPIO接口,網頁顯示傳感器數值


前言

原創文章,轉載引用務必注明鏈接。

因為是使用Typora(markdown)寫好然后復制到論壇的,推薦直接訪問我的網站以獲得更好地閱讀體驗。

Intel XDK IoT 開發環境很久之前就上手了,比較驚艷,現在終於輪到介紹它了。本文初步介紹node.js,根據示例一步步寫。當然你也可以去看官方示例。

說到XDK開發環境,就不得不提node.js,從名字就可以看出來和JavaScript密切相關,其主要擅長輕量級網頁應用開發,即使存在不足,但是瑕不掩瑜,現在相當熱門。群里好幾個人安利它了,推薦學習ES6標准。關於它的具體評價可以去知乎看看,本身中文免費學習資料也很多,相信不難上手。

本文你將學到:

  • Intel XDK 安裝配置使用
  • Node.JS入門
  • 用戶空間訪問GPIO
  • mraa庫訪問GPIO
  • 寫一個網頁顯示傳感器數值的示例

安裝使用Intel XDK

elecfans論壇這個的介紹很多啦,我就不再重復,注意:Intel好像把它放在Amazon雲(AWS)上的,最好掛代理下載注冊后才能使用html5開發。另外Edison使用的Yocto系統自帶node.js

【1、XDK界面簡介】設備選擇界面一般都可以自動識別,也可以手動添加,支持有線(MicroUSB)、無線、藍牙連接;主窗口、SSH、串口集成到一起了,方便開發,功能區最右邊有齒輪的按鈕可以對開發板進行設置,升級庫等操作。另外這個代碼編輯器支持非常多的編程語言,默認使用JS。

由淺入深node.js示例之Hello World

Hello World!

首先新建一個空白項目:

點擊左下角START A NEW PROJECT,選擇空白項目輸入保存位置和項目名稱,在代碼編輯區輸入以下代碼:

console.log("Hello World");	

我們執行看看:

當然你也可以ssh登錄到edison,創建helloworld.js,手動執行

node helloworld.js

這種方式感覺是不是和Python很像,它們屬於解釋型語言,和C那種編譯型語言不同。

在網頁上顯示Hello World

如何實現這一功能?是不是要大費周章,安裝Web服務器如Apache、Ngnix,經過復雜的配置,然后再寫個網頁呢?前面講過,node.js非常適合輕量級網頁應用,讓我們來看看:

新建一個文件helloworld_on_web.js,代碼如下

var http = require('http');
http.createServer(function (request, response){
    response.writeHead({'Content-Type' : 'text/plain'});
    response.write("Hello World");
    response.end();
}).listen(2000);

此時在瀏覽器地址欄中輸入[edison_IP地址]:2000,回車后即可看到效果:

代碼應該都讀得懂,當訪問這個頁面時,產生的request (請求)會返回相應文本。

與傳感器互動

前面有了Hello World入門,我們下面來請出今天的主角,一般來說,傳感器數值有兩種,模擬變量和數字變量,相當於統計學中的二分類變量和連續變量,前者如性別(男或女),葯物反應(陽性或陰性),0或1等;后者如心跳頻率,體溫,環境亮度等。我們這里以紅色發光LED二極管和溫度傳感器為例。Grove接口防呆設計很不錯,得益於Seeed Studio強大的影響力,國際上兼容此種接口的設備比較多,模塊質量也挺好。缺點就是價格貴,和普通三針模塊、拓展板不兼容。。。故意的吧你們。A0 - A3 代表模擬(Analog),D2 - D8 代表數字(Digital)。

用戶空間方式控制發光二極管點亮熄滅

Kit里提供了紅、綠、藍三種顏色的LED,選用紅色因為它波長短,大半夜不刺眼。另外關於發光LED正負極怎么看,有三種方法:a. 長正短負;b. 負極一側邊緣是平的或者有凹槽; c. 燈芯里三角形的是負極。另外LED發光二極管有個特性,耐壓不耐流,也就是一般來說,只要超過啟動電壓就可以亮,幾十伏上百伏一般也沒問題,但是電流不宜過大,很容易燒壞,可以看到LED插座模塊上有很多限流電阻。

Edison板子上引腳兼容Arduino,如果用Arduino IDE編程會很方便,但是使用用戶空間訪問GPIO接口,會很麻煩,這里做演示就是為了告訴你們有封裝好的庫多么方便啊。非常推薦Intel的小冊子《Internet of Things with Intel Edison GPIO on Edison》(鏈接:http://pan.baidu.com/s/1kV6Qhmv 密碼:ml07),感謝emutex labs 的工作,emutex 網站找不到相關網頁了,這里有個殘本。以下內容將參考Intel的小冊子。

點亮熄滅LED

我這里僅演示sysfs用戶空間控制D7,其他模擬端口的讀寫自己看冊子吧,大多數估計看完這個示例就趕緊跑了,尼瑪太麻煩了吧。以數字接口D7為例,Arduino IDE里的Blink例程是這樣的:

有點簡單呢對吧,我們來看看low-level是什么樣子的,首先看一下查看 sys用戶空間 文件系統節點信息:

想要使用一個引腳,一般首先需要export出來,然后設置方向(direction,輸入還是輸出),里面的value就是引腳的值(可以讀取。設置)。我們來看看數字引腳7(D7):

gpio255負責設置D7是用來輸入還是輸出;gpio223是一個上拉電阻;gpio48相當於D7的值。

下面我們來演示如何點亮、熄滅LED:

准備工作:將Edison底板上的J9跳線接頭接到2、3位上,調整Grove拓展板為3.3V電平。關於Edison Arduino 底板上跳線接頭的定義作用可以看官方說明

# 引出核心引腳48和附屬引腳223、255、214,214是啥我也不清楚
echo –n "48" > /sys/class/gpio/export
echo –n "223" > /sys/class/gpio/export
echo –n "255" > /sys/class/gpio/export
echo –n "214" > /sys/class/gpio/export
# 設置引腳方向(輸入、輸出)
echo –n "out" > /sys/class/gpio/gpio48/direction
echo –n "in" > /sys/class/gpio/gpio223/direction # (禁用上拉電阻)
echo –n "out" > /sys/class/gpio/gpio255/direction
echo –n "out" > /sys/class/gpio/gpio214/direction
# 設置GPIO引腳的值
echo –n "1" > /sys/class/gpio/gpio214/value
echo –n "1" > /sys/class/gpio/gpio255/value
# 點亮或熄滅 LED
echo –n "1" > /sys/class/gpio/gpio48/value # (點亮LED)
echo –n "0" > /sys/class/gpio/gpio48/value # (熄滅LED)

教練,我要封裝方便下次調用!

如果你懂得linux下shell編程,我們可以寫一個腳本例如led.sh,將gpio引腳號與Arduino引腳對應,自動完成初始化(引腳引出,設置方向,設置初始值等),然后想實現點亮熄滅的功能只需輸入選項0或1給led.sh即可。

想法挺好啊,很方便嘛,仔細一想,這不就是封裝成Arduino里面那句嗎。。。哭死。。。

void setup(){
  pinMode(7,OUTPUT);
}

使用Intel XDK + Node.JS訪問傳感器模塊

mraa和ump庫

Intel為我們提供了GPIO使用例程和常用元器件的使用例程,前者叫mraa,者叫ump庫,這樣就不用那么麻煩去自己控制用戶空間進行初始化了。Yocto系統自帶,並且可以方便地使用Intel XDK IDE 那個齒輪按鈕進行升級。

使用過樹莓派 (Raspberry Pi) 的玩家相信很熟悉,因為用過RPi.GPIO和wringPi庫。

讀取並在網頁顯示光敏電阻和周圍溫度

光敏電阻其實分為好多種,有那種開關型的也有這種測量亮度型的。在seeed的wiki頁面查找這兩個傳感器的示例用法(Arduino Language),分別如下:Light SensorTemperature Sensor,兩者都是模擬傳感器,接在Analog Input接口。

// 導入mraa庫
var mraa = require("mraa");
// 綁定引腳
var light_sensor_pin = new mraa.Aio(0);
var temp_sensor_pin = new mraa.Aio(1);
// 創建web應用服務
var http = require('http');
var app = http.createServer(function (req, res) {
    'use strict';
    
    // 亮度值
    var a = light_sensor_pin.read();
    console.log("Analog Pin (A0) Output: " + a);
    //node.js不區分浮點型和整型變量,所有數值均以浮點型表示
    var light_level = (1023-a)*10/a;
    
    // 溫度值
    var b = temp_sensor_pin.read();
    console.log("Analog Pin (A1) Output: " + b);
    var temperature = 1.0/(Math.log(1023.0/b-1.0)/4275+1/298.15)-273.15;
    
    res.writeHead(200, {'Content-Type': 'text/html'});
    res.end('<h1>測量值</h1><p>亮度: ' + light_level + ' K</p><p>溫度: ' + temperature + ' C</p>');
}).listen(3000);

結果如圖所示:

推薦直接顯示英文的了。另外seeed官方示例使用Arduino(C-Like),改為node.js時需要注意,比如浮點變量,比如log函數(Math.log in JavaScript)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM