マイコン
BeagleBone BlackとBoneScriptとGroveモジュールで温度を表示しよう
BeagleBone BlackのWebIDEとBoneScriptを用いて、温度センサー(サーミスタ)の温度を読む方法をご紹介します。
【目次】
・ハードウェア接続
・接続
・ソフトウェアの作成
・Tips: すごいぞGroveベースケープ!
・プログラムの作成
・まとめ
・さいごに
・参考文献orサイト
・作者
ハードウェア接続
部品紹介
今回は最近Webショップの方で取り扱いを開始した、Groveモジュールを用いて工作を行います。
Grove Systemとは「Grove ベースボード」と「Grove モジュール」を、汎用的な4本線コネクタでつなげるだけでセンサーやディスプレイなどが追加できるすぐれものです。元々はArduino向けの製品ですが、BeagleBone Black向けのベースボードもでているので今回はこちらを利用します。
なお、BeagleBone Blackの両側にあるピンヘッダを使って、Arduinoシールドのようなボードを挿すことで様々なセンサー等を追加することができます。このArduinoシールドのようなボードの事を、BeagleBone Blackでは「Cape(ケープ)」と呼びます。
機能 | URL |
---|---|
Groveベースケープ | http://www.marutsu.co.jp/pc/i/829255/ |
温度センサー | http://www.marutsu.co.jp/pc/i/829147/ |
サーミスタとは
サーミスタとは、周りの温度によって抵抗値が非線形に(直線ではなくカーブを描いて)変化する部品です。このサーミスタの抵抗値と、基準温度、基準抵抗値、B定数を用いた計算式を計算することで、温度を求めることができます。
接続
ベースケープとGroveモジュールを購入しましたら、ベースケープを写真のようにBBBに差し込んでください。
次に温度センサーとベースケープのJ3コネクタ(一番右下)をケーブルで接続してください。
これで準備は完了です。
ソフトウェアの作成
ハードウェアの接続が終わったので、Cloud9 IDEとBoneScriptでプログラムを作っていきましょう。
前回の内容を参照しながら、ソースコードを作成してください。ソースの名前は grove_temp_sensor_test.js としました。
アナログ値から電圧を読み取るには
BoneScriptでは以下のようにanalogReadメソッドを使うことでADコンバーターの値を読むことができます。
js var AN0 = "P9_39"; var a_val = b.analogRead(AN0);
引数にはピンの名前を入れる必要があります。今回はベースケープのAN0(P_39)端子を使うので、これを引数に入れています。ベースケープの端子とBBBのピンの対応は、以下のURLを参照してください。
http://www.seeedstudio.com/wiki/Grove_Cape_for_BeagleBone_Series
http://elinux.org/Beagleboard:Cape_Expansion_Headers
BoneScriptのanalogReadメソッドは0.0 から 1.0までの値を返します。値と電圧の関係は、0の時は0V、1の時は1.8Vに対応しているので、analogReadメソッドの返した値に1.8をかけると実際の電圧を計算することができます。
js var V = a_val * 1.8;
これで電圧が求められました。
Tips: すごいぞGroveベースケープ!
BBBのADコンバーターのリファレンス電圧は1.8Vなので、マイナスの電圧や、1.8V以上の電圧を加えると壊れてしまいます。しかし今回使用したGroveモジュールは、ベースケープから5Vの電源を受け、0Vから5Vの電圧を返しています。これではBBBが壊れてしまうのではないかと疑問に思いませんか?
このからくりはベースケープにあります。以下のURLよりGrobeベースケープの仕様を確認してみてください。
http://www.seeedstudio.com/depot/Grove-Cape-for-BeagleBone-Series-p-1718.html
注目すべきは以下の部分です。
Analog input by partial pressure resistance , Ratio of 1.8/5 Analog port allows maximum input voltage 5V
これを和訳すると、以下のように書かれています。
アナログ入力は 1.8 / 5 に分圧されている
アナログポートは最大5Vまで入力可能
つまり、最大5Vのアナログ値を返すモジュールを分圧して、0から1.8Vに変換してくれるようになっているのです。この機能のお陰で、BBBを壊すことなくそのままADコンバーターへ入力できるようになっています。
電圧から抵抗値を計算するには
電圧がわかったので、今度はサーミスタの抵抗値を計算します。サーミスタとBBBの接続を簡単な回路図にすると、以下のようになっています。
回路図からもわかるように、以下の分圧の式を立てればサーミスタの抵抗値が計算できます。
V = ( R / (R + R0) ) * Vref
この式を変形すると、以下の様にRを求めることができます。
js var R = R0 * V / (Vref - V);
抵抗値から温度を計算するには
抵抗値から温度を計算するには、以下の式を使います。
温度(T(K)) = 1 / ( (1 / 基準温度(Ts)) - (log( 抵抗値(R) / 基準抵抗(Rs)) / B) )
この式で求められる温度の単位はケルビン(絶対温度)なので、私たちが普段使っている単位セルシウスに治すには、273.15を引く必要があります。
温度(T(C)) = 温度(T(K)) - 273.15
まとめると、以下の様なコードで温度を求めることができます。
js var T = 1 / ( 1 / Ts - Math.log(R / Rs) / B ) - 273.15;
プログラムの作成
以上のことをまとめてメソッドを作り、setIntervalで1秒毎に温度を表示するプログラムをつくりましたので、以下に示します。
```js // BeagleBone Black + Grove Base Cape + Grove Temperature Sensor // Base Cape: http://www.seeedstudio.com/wiki/Grove_Cape_for_BeagleBone_Series // Temperature Sensor: http://www.seeedstudio.com/wiki/Grove_-_Temperature_Sensor // // Written by Toshifumi Nishinaga // this code is public domain
var b = require('bonescript');
var getTemperature = function(){ var AN0 = "P9_39";
var B = 3975;
var R0 = 10000;
var Rs = 10000;
var Vref = 1.8;
var Ts = 25 + 273.15;
var a_val = b.analogRead(AN0);
var V = a_val * 1.8; // 0 to 1 : 0 to 1.8(V)
var R = R0 * V / (Vref - V);
var T = 1 / ( 1 / Ts - Math.log(R / Rs) / B ) - 273.15;
console.log("V = " + V);
console.log("R = " + R);
console.log("Temperature: " + T);
var R0 = 10000;
var Rs = 10000;
var Vref = 1.8;
var Ts = 25 + 273.15;
var a_val = b.analogRead(AN0);
var V = a_val * 1.8; // 0 to 1 : 0 to 1.8(V)
var R = R0 * V / (Vref - V);
var T = 1 / ( 1 / Ts - Math.log(R / Rs) / B ) - 273.15;
console.log("V = " + V);
console.log("R = " + R);
console.log("Temperature: " + T);
}
var timer = setInterval(getTemperature, 1000); ```
このプログラムを実行すると、以下のように現在の室温が表示されます。
まとめ
BBBのADCの基準電圧は1.8Vなので、それ以上の電圧はかけられない
サーミスタの抵抗値は分圧の式を使って計算する
温度は抵抗値、B値、基準温度と基準抵抗値を使って計算する
さいごに
今回はBoneScriptとサーミスタを使って温度を計測してみました。個人的には今回使用したGroveモジュールの便利さが非常に印象に残っていて、Arduinoシールドより場所も取らないので非常に使いやすいシステムだと思います。今後も私用で是非利用していきたいです。
折角JavaScriptで動く用になっているので、次回はこの温度をWebページに表示して、簡単に確認できるようにしてみたいと思います。次回もよろしくお願いします。
参考文献orサイト
http://www.seeedstudio.com/depot/Grove-Cape-for-BeagleBone-Series-p-1718.html
http://www.seeedstudio.com/wiki/Grove_Cape_for_BeagleBone_Series
http://www.seeedstudio.com/wiki/Grove_-_Temperature_Sensor
http://www.seeedstudio.com/wiki/Grove_Cape_for_BeagleBone_Series
http://elinux.org/Beagleboard:Cape_Expansion_Headers
http://www.eleki-jack.com/FC/2011/09/arduino1-2.html
http://www.thinking.com.tw/documents/en-TTC03.pdf
作者
作者: 西永俊文
Twitter: tnishinaga
協力: マルツエレック株式会社
この 作品 は クリエイティブ・コモンズ 表示 - 改変禁止 4.0 国際 ライセンスの下に提供されています。