前回は、HummingBoardにWiringXを載せて、WiringXのAPIコマンドでGPIOの制御の検証をしました。”LEDチカ”まではこれでできるようになりました。併せてPythonでの制御もまもなくできそうです。今回は、GPIOと同じコネクタ上にあるSPIを使って、LCDモジュールを接続して表示をさせてみる検証を行ってみます。HummingBoardを装置に組み込んで、その装置の設定や状態の表示に使うというような用途が一番もっともらしいでしょう。小ぶりなもののほうが実際の用途に合っていそうです。
[温度センサーモジュール]
今回使用した温度センサーは「ADT7410使用 高精度・高分解能 I2C・16Bit 温度センサモジュール」です。株式会社秋月電子通商から購入することができます。
◆主な仕様
・温度精度:±0.5℃@-40℃~+105℃(2.7V~3.6V)
±0.4℃@-40℃~+105℃(3.0V)
・温度分解能:0.0078℃(16ビット設定時)/0.0625℃(13ビット設定時)
・温度校正および温度補正、直線性補正等は不要
・動作/測定温度範囲: -55℃~+150℃
・電圧範囲:DC+2.7V~+5.5V
・I2C互換インターフェース
・消費電流(@VDD=3.3V、TA=+25℃)
ノーマル・モード:210μA(typ)
パワーセービング・モード(1サンプル/1秒):46μA(typ)
シャットダウン・モード:2μA(typ)
・基板サイズ:15×11ミリ
・基板上の入出力端子:4個(VDD,GND,SCL,SDA)
[配線]
HumminBoardとの接続表です。今回の実験では、前回までと同じGPIO 拡張ボードとブレッドボードを用いています。
GPIO Signal Comparison | ||||||||||
GPIO | Signal | pin# | HB Signal | Sensor-PIN | GPIO | Signal | pin# | HB Signal | Sensor-PIN | |
7 | CE1 | 26 | ECSPI2_SS1 | 17 | P0 | 11 | GPIO 73 | |||
8 | CE0 | 24 | ECSPI2_SS0 | 18 | P1 | 12 | GPIO 72 | |||
11 | SCLK | 23 | SPI_SCLK | 27(21) | P2 | 13 | GPIO 71 | |||
9 | MISO | 21 | SPI_MISO | 22 | P3 | 15 | GPIO 10 | |||
10 | MOSI | 19 | SPI_MOSI | 23 | P4 | 16 | GPIO 194* | |||
15 | RXD | 10 | UART RX | 24 | P5 | 18 | GPIO 195* | |||
14 | TXD | 8 | UART TX | 25 | P6 | 22 | GPIO 67 | |||
3(1) | SCL | 5 | I2C_SCL | CLOCK | 4 | P7 | 7 | GPIO 1 | ||
2(0) | SDA | 3 | I2C_SDA | DATA | GND | |||||
GND | 1 | GND | ||||||||
3.3V | 25 | VCC |
[OS]
HummingBoardのGPIOの検証に使っているDebianを用います。v2.6(2015年2月時点で最新)以降のものを使ってください。(SPIのバグフィックスが入っているので重要)
http://www.igorpecovnik.com/2014/08/19/cubox-i-hummingboard-debian-sd-image/
http://mirror.igorpecovnik.com/Cubox-i_Debian_2.6_wheezy_3.14.14.zip
Debian v2.6 / 5.2.2015
Kernel 3.14.14
Fixed bug in SPI. Display works now
XBMC upgrade ready / tested.
温度センサーが認識できるかチェックします
|
下のように、ADT7410のアドレスが 0x48 し表示されればOKです。
0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- 48 -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- -- |
温度を計測するために、下のようなPythonのファイルを作成します
/root/adt7410ディレクトリを生成して、ファイル名はadt7410.pyでセーブしてください。
(母艦のPCでadt7410.pyファイルを作成して、SDをマウントしてコピーする方が簡単でよいでしょう。以下、様々なテキスト・ファイルの作成・設置については同様に考えてください。)
#!/usr/bin/python # -*- coding: utf-8 -*- import smbus import time i2c = smbus.SMBus(2) address = 0x48 while True: block = i2c.read_i2c_block_data(address, 0x00, 12) temp = (block[0] << 8 | block[1]) >> 3 if(temp >= 4096): temp -= 8192 print("Temperature:%6.2f" % (temp / 16.0)) time.sleep(10)
|
温度測定をしてみます
次のようにPythonスクリプトを実行してください。
# python /root/adt7410/adt7410.py |
10秒ごとに温度が表示されます。
[Webサーバのインストール]
測定した温度をPC、タブレット端末、スマートフォン等のブラウザからグラフとしてみられるように
Apache WebサーバとPHPをインストールしましょう。
(1) Apache2のインストール
|
(2) PHPのインストール
|
これで、HummingBoardがWebサーバになりました。
[ グラフ表示の準備]
次に、Webサーバ上で動くグラフ表示コンテンツを作成します。
その前に、温度を計測して、その結果をCSVファイルに追記していくPythonスクリプトadt7410-2.pyを作成します。
グラフ表示コンテンツは、そのCSV1ファイルを取り込んで折れ線グラフを生成します。
(1) 測定した温度をCSVファイルに追記していくPythonスクリプトadt7410-2.pyを/root/adt7410の下に作成します
adt7410-2.pyの中身は下のように記述します。この例では10分ごとに”時刻”,”温度”を/var/www/adt7410/temp.csvファイルに追記していきます。
#!/usr/bin/python # -*- coding: utf-8 -*- import smbus import time import datetime i2c = smbus.SMBus(2) address = 0x48 filepath = '/var/www/adt7410/temp.csv'
while True: block = i2c.read_i2c_block_data(address, 0x00, 12) temp = (block[0] << 8 | block[1]) >> 3 if(temp >= 4096): temp -= 8192
tnow = datetime.datetime.now() tstr = tnow.strftime("%Y/%m/%d %H:%M")
f = open(filepath, 'a') f.write(tstr) f.write(',') f.write(str(temp / 16.0)) f.write('\n') f.close()
time.sleep(600) |
(2) Ajax機能を簡単に使えるjQueryをダウンロードします
母艦のPCでダウンロードしてSDにコピーしましょう。
https://jquery.com/download/ からjquery-2.1.3.min.jsファイルをダウンロードします。
このファイルをSD上に /var/www/adt7410ディレクトリを作成して、そこにコピーしておきます。
(3) Javascriptでグラフ表示ができる機能をもつパッケージをダウンロードします。
同様に http://www.chartjs.org/ からChart.min.jsファイルをダウンロードして、SD上の/var/www/adt7410ディレクトリにコピーしておきます。
(4) グラフ表示を行うHTMLファイルline.htmlをSD上の/var/www/adt7410に作成します。ファイルの中身は下のように記述します。
<!doctype html> <html> <head> <title>Temperature Chart</title> <script src="Chart.min.js"></script> <script src="jquery-2.1.3.min.js"></script> </head> <body> <div style="width:90%"> <div> <canvas id="canvas" height="400" width="640"></canvas> </div> </div>
<script> var lineChartData = { labels : [], datasets : [ { label: "Temperature", fillColor : "rgba(151,187,205,0.2)", strokeColor : "rgba(151,187,205,1)", pointColor : "rgba(151,187,205,1)", pointStrokeColor : "#fff", pointHighlightFill : "#fff", pointHighlightStroke : "rgba(151,187,205,1)", data : [] } ] }
window.onload = function(){
$.ajax({ type: "POST", url: 'templist.php', data: '', dataType: "text", contentType: 'application/x-www-form-urlencoded;charset=UTF-8', success: getTemplistCB, error: errorCB });
} function getTemplistCB(data, dataType) { var tlines = data.split("\n"); var i; var labels = []; var tdata = []; for(i = 0; i < tlines.length; i++) { var tline = tlines[i].split(","); if(tline && tline[0] && tline[1]) { labels[i] = tline[0]; tdata[i] = tline[1]; } else { break; } }
lineChartData["labels"] = labels; lineChartData["datasets"][0]["data"] = tdata;
var ctx = document.getElementById("canvas").getContext("2d"); window.myLine = new Chart(ctx).Line(lineChartData, { responsive: true });
}
function errorCB(XMLHttpRequest, textStatus, errorThrown) { alert("ERROR="+textStatus); }
</script> </body>
</html> |
(5) 測定温度リストを読み出すPHPファイルtemplist.phpをSD上の/var/www/adt7410に作成します。ファイルの中身は下のように記述します。
<?php function fc_getTempList() { $filename = "/var/www/adt7410/temp.csv"; $astring = ""; if(!file_exists($filename)) { fc_response_text(""); return; } $file = fopen($filename, "r") or die("OPEN error $filename"); flock($file, LOCK_EX); while($data = fread($file, 2048)) { $astring .= $data; } flock($file, LOCK_UN); fclose($file);
fc_response_text($astring); }
function fc_response_text($message) { // response apache_setenv('no-gzip', '1'); header("Content-type: text/html; charset=utf-8"); header("Content-Length: ".strlen($message)); echo $message; }
fc_getTempList();
?> |
以上で、全てのファイルの準備ができました。ファイル構成は次のようになります。
/root/adt7410/adt7410-2.py
/var/www/adt7410/Chart.min.js jquery-2.1.3.min.js line.html
templist.php |
[ 温度測定実行&グラフ表示]
それでは、いよいよ温度測定を始めましょう。
rootでログインして、次のようにコマンドを実行します。
# python /root/adt7410/adt7410-2.py |
これで10分おきに温度を計測して結果をCSVファイルに出力します。
1時間くらい経ったら、PC等のブラウザからHummingBoardにアクセスします。
http://192.168.10.41/adt7410/line.html
192.168.10.41の部分は、実際にHummingBoardに割り当てられたIPアドレスに置き換えてください。
下のような時刻の経過と温度の変化を表す折れ線グラフが表示されます。