2021.8.12 Coskx Lab
micro:bitに温度センサ(ADT7410)を接続して温度を測定します。
ここでは秋月電子で販売されているAE-ADT7410を使用します。
またI2C通信機能の練習も兼ねて,プログラムはADT7410用の拡張機能は使わずに,自分で作成します。
ADT7410用の拡張機能を使った例は
こちらを参照してください。
を参照してください。
AE-ADT7410は測定結果をI2C通信で送ってくるのでI2CのSCL信号線とSDA信号線をmicro:bitにつなげます。
micro:bitのSCLとSDAはそれぞれ端子P19とP20です。
その他には電源3.3V,GNDは当然必要です。micro:bitの3Vの端子にはUSB電源供給時に3.25Vが出力されていました。
そのため,次のようにつなげることを目指せばよいことになります。
参考 micro:bit端子一覧
端子に直接はんだ付けしてしまってもよいのですが,そのようなことはしたくないため,micro:bitの端子を引き出して扱いやすくなっているブレイクアウトボードなどを使います。細工が必要な場合もあります。
(1) ブレイクアウトボード KITRONIK-5601Bの場合
P19とP20のところには,ピンヘッダがついていなかったので,ピンヘッダをはんだ付けする必要がありました。3VとGNDは他の場所にも引き出されているので,そちらを使用することもできます。
(メス-メスのジャンパ線を用いるか,ブレッドボードに挿して,オス-メスのジャンパ線を用いて接続します。)
(2) モータドライバボード KITRONIK-5698の場合
P19とP20のところには,ピンヘッダがついていなかったので,ピンヘッダをはんだ付けする必要がありました。3VとGNDは他の場所にも引き出されているので,そちらを使用することもできます。
(メス-メスのジャンパ線を用いるか,ブレッドボードに挿して,オス-メスのジャンパ線を用いて接続します。)
(3) モータドライバボード KITRONIK-5698の場合
micro:bit差し込み口の裏側に,19,20 端子が出ているように番号が書いてありますが,これは使えません。micro:bitを逆向きに挿すと使えます。(とシルク印刷に書いてありました。)しかしそれではモータドライバの機能が使えません。
micro:bit差し込み口のモータドライバ側に,19,20 端子がつながっている端子がありました。これを捜して無理やりはんだ付けして,19,20 端子を使えるようにしました。はんだ付けが,難しいので,自信のある方以外にはお勧めしません。
MakeCodeを使います。
I2Cの操作を学ぶために,データシートを参照しながら全て手作りしてみます。
I2Cに関する命令ブロックは「入出力端子」の下に出てくる「その他」の中にあります。
ADT7410のI2Cアドレスは,十六進表現で48なので十進表現では72です。
Uint16BEは符号無し整数(unsigned integer)の16bitで通信時には上位8bit,下位8bitの順(Big Endian)で受け取るという意味です。
受け取った値は16bitですが,有効桁数13bitで,残りの下位3bitは制御データなので,8で割って小数点以下を切り捨てます。
この値は有効桁数13bitで正の整数ですが,2の補数表現になっているので,負の温度も受け取れます。 →補足1
この値を16で割ると単位が度(摂氏)の値になります。
AE-ADT7410の動作テスト用プログラム
コピペする場合は,次のソースコードをPythonソースとして貼り付ければ完了です。
温度センサ(ADT7410)を使用して,温度測定ができました。
正の数だけを使って負の数の意味も持たせる方法です。
13bit数の場合は次のように使います。
(13bitで表せる値は0から8191(213-1)までです。)
見かけの値 | 値(意味する値) | 二進数表現 |
8191 | -1 | 1 1111 1111 1111 |
8190 | -2 | 1 1111 1111 1110 |
8189 | -3 | 1 1111 1111 1101 |
: | 負の値 | : |
4098 | -4094 | 1 0000 0000 0010 |
4097 | -4095 | 1 0000 0000 0001 |
4096 | -4096 | 1 0000 0000 0000 |
4095 | 4095 | 0 1111 1111 1111 |
4094 | 4094 | 0 1111 1111 1110 |
4093 | 4093 | 0 1111 1111 1101 |
: | 正の値 | : |
3 | 3 | 0 0000 0000 0011 |
2 | 2 | 0 0000 0000 0010 |
1 | 1 | 0 0000 0000 0001 |
0 | 0 | 0 0000 0000 0000 |
I2Cは本当はI2Cと表記され,Inter-Integrated Circuitを表しています。SCLとSDAの2本の信号線で双方向通信を行っています。
ここではmicro:bitとVL53L0Xに1対1での通信ですが,I2C信号線を複数のセンサなどが共用して,Masterとなるmicro:bitと通信するような使い方ができます。一本の糸電話を複数人で共用している状態です。
複数のセンサなど(Slave)が勝手に取得データを送信し始めると,通信データが混信してしまうため,必ずMasterが指定したSlaveだけが通信を許されます。
一本の糸電話を複数人で共用している状態でも1人が仕切り役になって,話す人を指示するのと同じです。
特定のSlaveだけに通信を許す仕組みとして,各Slaveは自分だけの背番号を持っています。
Masterはこの背番号を全Slaveに聞こえるように指示します。指示されたSlaveだけが反応します。この背番号はアドレスと呼ばれます。
1つのI2C通信路につながっているSlaveでは同じアドレスのものは存在してはいけません。
I2C通信では,SCL(クロック)とSDA(データ)の2本の通信線を用いています。SCLはMasterが,通信したいときに発する,0101...の信号で,SCLの0101...に合わせて,SDAで意味のあるデータを送信します。送信の先頭はアドレスです。その後SCLに合わせてデータを送ったり,送られたりします。データの最後には受け取った側が「了解」が送ります。
I2Cの信号をオシロスコープで観察しました。
緑線がSCL(クロック),黄線がSDA(データ)です。
約24msecごとに通信をしています。プログラムのループが24msecで動作していることになります
時間軸を100倍に拡大すると,1回の通信が約300μsecかけて行われているのがわかります。
SCL(クロック)の立ち上がりに合わせて,縦線(青)を引くと,それに合わせてSDA(データ)を読むことができます。
SCLはMaster(micro:bit)が送信していますが,SDAは双方がタイミングを合わせてデータを送りあっています。
Master(micro:bit)が最初に送っている72は,ADT741のI2Cアドレスです。
ADT741は応答して温度データを2byteに分けて送り返してきています。
温度データは29.8125度で,シリアル通信で表示している値と同じになっています。
温度データの分解能は1/16度です。