No.171 長谷川正の「言ったモン勝ち」
M5Stackでやりたいことをイメージ
前回ブログにて「温度データの取得にM5Stackを使おう」と決めたので、先ずはどんなことがやりたいのかの理想のイメージを挙げてみた。
1.金型に温度センサーを取り付けてM5Stackで温度データを取得する。
2.得られた温度データをWiFiで飛ばしてモニター表示し、リアルタイムでチェックする。
3.同時に温度データをスプレッドシートへ書き込んで、データを自動的に蓄積していく。
これらが実現できれば問題なさそうだ。そのためにM5Stackの他に何が必要なのかを考えてると、
・M5Stack
・温度センサー
・Grove – 4ピンケーブル
・USB ACアダプター
必要最低限これだけあれば十分でしょう。目標は10,000円以内、これなら手軽に始められそうだ。
温度センサーを選択する時の問題点
上記であれば、予定通りの低予算でできそうだ。なお、金型には最低4つ(コア側2つ、キャビティ側2つ)の温度データを計測したいので、温度センサーは4つ必要になりますね。しかしながら、参考になるスケッチをネット検索してみたら、どうやらセンサーとのデータのやり取りがI2Cと呼ばれる通信方法の場合、何種類ものセンサーを同時に接続できるが、同じ種類のセンサーとなると1つだけしか接続できないらしい。なぜなら、各々のセンサーにはI2Cアドレスというものが振り分けられていて、違う種類のセンサーであれば違うI2Cアドレスになりますが、同じセンサーだと同じI2Cアドレスが振り分けられ重複エラーになるらしい。さて、どうしよう・・・。1つのM5Stackに温度センサーを1つずつ接続すれば出来ないこともないが、そうするとM5Stackが4つ必要となるので大幅な予算オーバーになってしまうし、何よりもスマートじゃないよね。そんな時に探し当てたのがADT7410でした。この温度センサーの優れたところは、基板上のJ3とJ4のジャンパ・パターンを半田でジャンパ(接続)することによってI2Cアドレスを4つ(0x48、0x49、0x4A、0x4B)に増やすことができるので、同時に4つのセンサーを使えることですね。
温度センサーADT7410とI2C通信
ADT7410は接触型なので金型に両面テープなどで直接貼付けができ、値段(600円/個 R5/4現在)も安いのですが、I2C通信が前提になっているために下記に注意しなければいけません。
1.基板にポスト(コネクタのメス側)の取付が必要
2.ピンのピッチ(間隔)が2.54mmなのでGrove規格(2.0mm)に合わない
3.ピンの配列(V、SCL、SDA、GND)がGrove規格と違う
解決案として、ピンピッチ2.5mmの代表的なXHコネクタのポストを温度センサーに取り付けることにしました。ユニバーサル基板のADT7410はピッチ2.54mm(ブレッドボードと同じ)なので、XHコネクタのピンピッチ2.5mmと微妙に合っていませんが、4ピンぐらいだと強引に押し込めます。当然ながら指は痛くなります…。また、ピンピッチ2.54mmから2.0mmへの変換コネクタを使って同じGrove規格に統一する方法もありますが、センサー側のピン配列が違っているため、4ピンケーブルを差し替える必要があります。この方法、やってできないこともないが、M5Stack側とセンサー側を固定する必要があります。結局、接続間違い防止のためにGrove規格に統一することは見送りました。
左:ADT7410、右:ADT7410+XHポスト+[J4]半田ジャンパ(0x4A)
結果として、片側がGroveハウジング(コネクタのメス側)、反対側がXHハウジングの4ピンケーブルを自作しなければいけません。ケーブル自作をレポートするにはそれなりのボリュームが必要になりますので、次々回以降のブログに詳しく説明いたします。
2つのADT7410が計測できるスケッチ
取り急ぎ、ネットで公開しているスケッチ(プログラム)を参考にして、ADT7410センサー2個が同時にM5StackのLCDへ表示できるように書き加えてみました。とは言っても、サンプルスケッチの「address」「data」「temp」の箇所にそれぞれ1と2を追加して、同じ関数を繰り返しただけの簡単スケッチです。もし、4個のセンサーを表示するのであれば、3と4も追加してください。
ADT7410から温度データを受信
上のスケッチにて、ADT7410センサから温度データをどうやって受信しているかを簡単に説明します。使う関数はWire.requestForm()とWire.read()です。
先ずは、ADT7410から受信するためのデータをWire.requestFrom()にて要求します。第1引数のI2Cアドレスに、第2引数で指定したバイト数分のデータが要求されます。
ここからは、下記のイラストを参照ください。今回、ADT7410からは13ビットの受信データを使用していますので、ビット15~3までに温度データが格納されています。当然ながら、Wire.requestFrom()では2バイト(16ビット)のデータを要求し、データの型を合わせています。
次にWire.read()にて受信データの上位1バイト分を読み出しますが、M5StackのCPUにはリトルエンディアン(little endian)が用いられているため、通常はdata1の下位バイトに受信した上位バイトが格納されてしまいます。そのため、data1を1バイト(8ビット)左にシフトさせています。
そして、もう一度Wire.read()にて受信データの下位1バイト分を読み出します。これはそのままdata1の下位バイトに格納します。
温度データはdata1のビット15~3となるため、最後に右へ3ビットシフトさせれば、温度データdata1が完成します。その際、符号はビット13、小数点はビット4と3の間となります。実際の温度の算出方法は下記を参考としてください。
以上の解説は「Raspberry PiによるIoTシステム開発実習(森北出版)」と「CRAFT GO GO」を参考に作成しました。
無事に温度データの表示が確認できました。初歩の初歩ですが、ここまでは順調に進んでいます。正直に言って、このスケッチに記された変数や関数がどんな意味をもっているのかは半分も理解できませんが、こうして動かしながら少しずつ学んでいくことが大切と考えています。何事も積み重ねですね。次回のブログでは、実際に金型へ温度センサーを貼り付けた場合の問題点と対処法を書き記します。
参考)【M5Stack】中小企業の自作IoT導入事例とは?
参考)【M5Stack】I2C接続ケーブル長さの限界とは?
参考)【M5Stack】WiFi経由でスプレッドシートへのデータ書込方法とは?
参考)長谷川製作所の得意技術(防水照明器具製造)
*工事不要、誰でも手軽に提灯を飾ろう!
*提灯コード動画始めました。
*国内唯一のプラスチックを膨らませる技術
「アクリルグローブ」