micro:bit Makecodeで温度センサ(ADT7410)の動作テスト

2021.8.12 Coskx Lab  

1 はじめに

micro:bitに温度センサ(ADT7410)を接続して温度を測定します。
ここでは秋月電子で販売されているAE-ADT7410を使用します。
またI2C通信機能の練習も兼ねて,プログラムはADT7410用の拡張機能は使わずに,自分で作成します。
ADT7410用の拡張機能を使った例は こちらを参照してください。 を参照してください。

2 使用環境

3 接続

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 端子を使えるようにしました。はんだ付けが,難しいので,自信のある方以外にはお勧めしません。



4 テストプログラム

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ソースとして貼り付ければ完了です。

rawdata = 0
temperature = 0

def on_forever():
    global rawdata, temperature
    rawdata = pins.i2c_read_number(72, NumberFormat.UINT16_BE, False)
    rawdata = rawdata / 8
    rawdata = int(rawdata)
    if 4095 < rawdata:
        rawdata = rawdata - 8192
    temperature = rawdata / 16
    serial.write_line(convert_to_text(temperature))
basic.forever(on_forever)

5 まとめ

温度センサ(ADT7410)を使用して,温度測定ができました。


参考1 2の補数表現

正の数だけを使って負の数の意味も持たせる方法です。
13bit数の場合は次のように使います。
(13bitで表せる値は0から8191(213-1)までです。)
見かけの値値(意味する値)二進数表現
8191-11 1111 1111 1111
8190-21 1111 1111 1110
8189-31 1111 1111 1101
:負の値:
4098-40941 0000 0000 0010
4097-40951 0000 0000 0001
4096-40961 0000 0000 0000
409540950 1111 1111 1111
409440940 1111 1111 1110
409340930 1111 1111 1101
:正の値:
330 0000 0000 0011
220 0000 0000 0010
110 0000 0000 0001
000 0000 0000 0000

見かけの値から,意味する値に変換するには次のようにします。
  4095<「見かけの値」の時は
   「意味する値」=「見かけの値」-8192
  そうでないときは
   「意味する値」=「見かけの値」


補足2 I2C通信

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に合わせてデータを送ったり,送られたりします。データの最後には受け取った側が「了解」が送ります。


参考3 I2Cの信号観察

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度です。