micro:bitにつないだI2C接続センサをブロックエディタから使う

この記事は micro:bit Advent Calendar 2018 の 12日目の記事です。

まえがき

以前、CQ出版インターフェース誌のオフ会で話した内容から抜粋して紹介します。

micro:bitに次の3種類のセンサをつないで、MakeCodeブロックエディタに 標準で用意されているブロックだけを使って、センサ値を読み取ります。 もちろん専用のブロックが用意されていればその方が便利なのですが、 標準ブロックでも何とかなる(場合もある)ことを示します。

  • アナログ出力温度センサ:LM61
  • SPI接続温度センサ:ADT7310
  • I2C接続温度センサ:ADT7410

f:id:yamamoto-works:20181216031747p:plain


対象

今回は、I2C接続温度センサADT7410を取り上げます。 このセンサは、前回のADT7310と温度測定部分は同一で、 マイコンとの接続インタフェースをSPIからI2Cに置き換えた もののようです。

ADT7410は、全機能を使うには、マイコン等のホスト側が repeated start conditionに対応している必要があります。 micro:bitはブロックエディタでも対応しているので、 問題ありません。

接続

ここでは、ADT7410の電源とGNDをそれぞれmicro:bitの3V端子、GND端子に接続し、 ADT7410のSCLをP19、SDAをP20にそれぞれ接続しています。 これらの端子は、micro:bitのI2C機能につながっています。

SCLとSDAのプルアップは、micro:bitボード内で行われて いるので外部で行う必要はありません。 I2Cでは、デバイスをアドレスで指定してアクセスします。 ここでは、センサのアドレスとして72(0x48)にしています。 秋月で売っているボードを使う場合、プルアップと アドレスをデフォルトの状態(すべてオープン)に すると、この設定になります。

akizukidenshi.com

プログラム

作成したプログラムは次のとおりです。 このプログラムは、初期化部と温度測定部からなります。

初期化部

f:id:yamamoto-works:20181216225448p:plain

温度測定部

f:id:yamamoto-works:20181216225531p:plain

プログラムの解説

初期化部

初期化ではセンサの精度を、せっかくなので、 16ビット精度に設定しています。

その手順は、まずアクセスするレジスタ番号を指定します。 ここでは3のコンフィグレジスタを指定しています。

続いてコンフィグレジスタに128(0x80)を設定します。 このレジスタの最上位ビットでは温度測定精度を指定します。 このビットを1にすると16ビット精度で測定が行われます。 このビットが0の場合や、設定しない(デフォルトの)場合は 13ビット精度で測定が行われます。

repeated start condition

最初のブロックで、「つづく」が「真」になっていのが、 repeated start conditionを指定しているところです。 このセンサでは、この指定を行わないと、 次のブロックでレジスタ番号3のコンフィグレジスタに アクセスできません。

温度測定部

ここの処理は大きく分けて、センサから値を読みだす部分と、 温度を計算する部分からなります。

センサから値を読み出すのは、 まずレジスタ番号0の温度測定データを格納した レジスタを指定します。 ここでも、repeated start conditionを指定しています。

次に測定した温度データをセンサから取得します。 このセンサでは、この値はビッグエンディアンの 符号付の16ビットデータなので、 形式にはInt16BEを指定しました。

これで16ビットの測定データを取得できます。 今回は16ビット精度を指定したので、測定データには フラグは含まれません。 整数部9ビット、小数部7ビットからなるデータになっています。 そこで、128(2の7乗)で割ることにより、温度を求めています。

なお、センサは13ビット精度に設定することもできます。 その場合、測定データには、SPIの時と同じく、フラグが 含まれるので、その処理が必要です。

動作確認

プログラムを実際に動かして、別に用意した温度計と比較してみると、 だいたい同じような値になり、うまくいっているようです。