[Genuino 101][Johnny-Five] IC 温度センサ LM35 の制御および注意点

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

johnny-five

車輪開発大好きおたいがです。こんにちは。( 挨拶 )

今回は Genuino 101 ( 以下 Genuino ) と Johnny-Five を使用した温度センサ (LM35DZ) の制御についてまとめてみました。

LM35 でググると情報がたくさん出てきます。かなりお約束的な IC のようですが、Genuino で使用するときには注意すべき点があるようです。

動作環境・道具など

回路図

LM35-001

電源 と 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

サンプルコードの作成

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

結果?

LM35-002

あからさまに数字がおかしいですね…

いろいろ調べてみたところ、Arduino の公式サイトに以下のようなドキュメントがありました。

Arduino Playground - LM35HigherResolution

どうやら、アナログピンで取得した値の式に問題があるようです。ここで、Johnny-Five の Thermometer クラスのソースを読んでみます。

ドキュメントに書かれていた式がありました。(L:311)

  // 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;

これで再度実行すると…

LM35-003

それっぽい数字が出力されましたが、本当にこれで良いのかは正直自信がありません。。。