この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
車輪開発大好きおたいがです。こんにちは。( 挨拶 )
今回は Genuino 101 ( 以下 Genuino ) と Johnny-Five を使用した温度センサ (LM35DZ) の制御についてまとめてみました。
LM35 でググると情報がたくさん出てきます。かなりお約束的な IC のようですが、Genuino で使用するときには注意すべき点があるようです。
動作環境・道具など
- Genuino 101
- USB ケーブル
- ブレッドボード
- ジャンパーワイヤ
- 高精度 IC 温度センサ LM35DZ
- Windows 7 Pro (64bit)
- Arduino IDE 1.6.9 ( セットアップ記事を参考にしてください )
- Node.js v4.4.7
回路図
電源 と GND を挿し間違えると、センサが熱くなり、触ると悲惨なことになるので注意しましょう。出力ピンは Genuino のアナログピンに接続します。
サンプルスケッチ ( プログラム ) をボードに書き込む
Genuino に StandardFirmata スケッチを書き込みます。
( 参照 : https://dev.classmethod.jp/hardware/johnny-five-genuino-101-debut/#toc--- )
Johnny-Five 実行用のサンプルプロジェクト作成および実行
Johnny-Five の導入および実行するためのプロジェクトを用意します。任意のプロジェクトディレクトリを作成して移動したあとに、下記コマンドを入力します。
package.json の初期化
$npm init
Johnny-Five のダウンロード
$npm install johnny-five
Barcli のダウンロード
センサの結果を可視化するシンプルなモジュールを今回利用します。
$npm install barcli
サンプルコードの作成
index.js
var five = require('johnny-five');
// Genuino が接続されているポート番号 ( `/dev/tty*` (Mac/Linux) or `COM*` (Windows) )
var board = new five.Board({ 'port': 'COM8' });
var Barcli = require('barcli');
//華氏温度
var fahrenheitGraph = new Barcli({
'label': 'Fahrenheit',
'range': [32, 122]
});
//摂氏温度
var celsiusGraph = new Barcli({
'label': 'Celsius',
'range': [0, 50]
});
//絶対温度
var kelvinGraph = new Barcli({
'label': 'Kelvin',
'range': [273, 325]
});
board.on('ready', function() {
var temp = new five.Thermometer({
'controller' : 'LM35',
'pin' : 'A0'
});
temp.on('change', function(data, err) {
fahrenheitGraph.update(data.F); //fahrenheit
celsiusGraph.update(data.C); //celsius
kelvinGraph.update(data.K); //kelvin
});
});
実行
$node index
結果?
あからさまに数字がおかしいですね…
いろいろ調べてみたところ、Arduino の公式サイトに以下のようなドキュメントがありました。
Arduino Playground - LM35HigherResolution
どうやら、アナログピンで取得した値の式に問題があるようです。ここで、Johnny-Five の Thermometer クラスのソースを読んでみます。
ドキュメントに書かれていた式がありました。(L:311)
thermometer.js
// http://www.ti.com/lit/ds/symlink/lm35.pdf
LM35: {
initialize: {
value: analogHandler
},
toCelsius: {
value: function(raw) {
// VOUT = 1500 mV at 150°C
// VOUT = 250 mV at 25°C
// VOUT = 550 mV at 55°C
var mV = this.aref * 1000 * raw / 1024;
// 10mV = 1°C
//
// Page 1
return Math.round(mV / 10);
}
}
},
上記ハイライト行の式を以下のように修正してみます。
// var mV = this.aref * 1000 * raw / 1024;
var mV = raw * 10 / 9.31;
これで再度実行すると…
それっぽい数字が出力されましたが、本当にこれで良いのかは正直自信がありません。。。