見出し画像

ObnizにCo2センサを接続 その2

その1ではwio terminalにCo2センサもSCD30を接続して動作させるところまで行いました。今回はその動作中のI2Cの信号の確認を行います。

|wio terminalのI2C信号確認

まずはwio terminal側のGroveコネクタの信号ラインが何にアサインされているかを確認します。wio terminalのGetting-Startedの中から読み取ります。

画像1

前回SCD30を接続するコネクタの左右を間違えましたが、この情報をきちんと見ると一目瞭然でした。プロセッサから割当られているI2Cの端子は左側にしかなく、右側はA0,A1とアナログピンが出ていそうです。
wio terminalの回路図が公開されているので、確認してみると、

画像2

プロセッサのPB08,PB09のアナログ入力にもつながっていそうです。機会があったらアナログセンサーも試してみようと思います。

|SCD30へのI2C信号確認

wio termnalからGrove経由でコントロールしているI2Cの信号を確認してみます。Groveコネクタからはコンタクトしづらかったため、SCD30の裏面のピンから信号をコンタクトします。

画像3

Sensiron社の公開しているDatasheetから読み取ると、Groveの配列とは微妙に違うことに注意です。ここからコンタクトして手元にあったロジアナで観測してみます。アナログとデジタルの両方取れるロジアナを使用しました。

画像4

VCCはwio terminalのマニュアル通り3.3V出力されてましたが、I2Cの出力が3.0Vです。wio terminal側のプロセッサでpull-upされているとしたら、3.3Vですが、少し変なのでSCD30側のデータシートを確認してみます。

画像5

VDDの入力は3.3V-5.5Vですが、IOの電圧が3.0Vまでとなっています。少し面倒なデバイスかもしれません。もう少し読み込んでいくと、

画像6

SDAとSCLは内部で3.0Vの45kΩでPull-upされているようです。なので、SCD30の中には3VのLDOがあり、デジタルブロックはそれで動いていて、VDDの3.3V-5.0Vは閉空間内に発光する赤外LEDの為の電圧であると想像できます。この事からwio terminalではPull-upされておらず、制御方法は正しいと言えます。

立ち上がり時間をもう少し詳しく観察してみます。

画像7

Groveへの電源投入から25ms後にSDA/SCLの3Vが入っているので、SCD30の内部Pull-upが入るのがそのくらいの時間となります。VCCの立上りが2msくらいかかっていて、wio terminalでは3Vの出力に対して2AのDC/DCを使用しているのでSCD30の突入電流は結構引きそうなので注意が必要です。
下図はwio terminalの3.3Vを作るDC/DCの回路図です。

画像8

ひとまず、ここまででわかったことをまとめると以下の通り。

1. VCCは3.3V-5.5Vの範囲の投入が必要
2. SCD30の突入電流は大きそうなので引込電流に注意
3. SDA/SCLはSDC30側で3.0VでPull-upされている
4. なのでMCU側でのPull-upは必要ない
5. 電源投入から3秒くらい待ってからI2Cのコマンドを打つ

これだけでも結構な収穫なので信号を見てよかったと思います。
次にI2Cの信号の中身を見ていきます。

|SCD30へのI2Cのコマンド解析

波形の全体を俯瞰してみると、頭の方にて少しセットアップを行ったあとに一定時間ごとにコマンド発行をしているように見えます。

画像9

まずは最初のコマンド部分を拡大して解析をしていきます。

画像10

最初の部分は、コマンドが2つ打たれていて、後半のコマンドはクロックストレッチされて少し間延びしています。前半のコマンドをSCD30のレジスタ仕様書と照らし合わせて確認していきます。(Sensirion社のWebにInterface Description として掲載されています。)

Setup Write to [0x61] : I2C address 0x61 write command
0x46 0x00  : Set measurement interval
0x00 0x02  : interval value
0xE3           : CRC

I2Cアドレスは基板の裏に書いてあったとおり0x61となり、それに続くコマンドが測定周期設定とその値になるようです。コマンドの最後にはCRCをつけるお約束のようです。レジスタ仕様書には以下のようにあります。

画像11

注意点はCRCはコマンドを含まずにValue値のCRCとなります。

次に後半のコマンドの確認をします。

Setup Write to [0x61] : I2C address 0x61 write command
0x00 0x10  : Triggers continuous measurement
0x00 0x00  : pressure
0x81           : CRC

計測開始のコマンドです。興味深いのが気圧をパラメータに入れられるようです。気圧がCo2濃度にどの様に影響を与えるのはよくわかりませんが、0x00を入れておくとdefaultの1013.25mBarが使用されるようです。
このコマンドのあとから前半で設定した間隔での測定が開始されます。
注意が必要なのがこの設定は内部の不揮発領域に保存されて、一旦電源を落としたとしても再び勝手に計測が開始されるというところです。
レジスタ仕様書には以下のようにあります。

画像12

ここまでで2秒間隔の測定の設定と、測定開始のコマンドをたたいているので、このあとは定期的なリードが繰り返されます。

画像13

前半部分が測定データがReadyかどうかのステータスの読み込み、後半が実際のデータのリードになります。まずは前半部分。

Setup Write to [0x61] : I2C address 0x61 write command
0x02 0x02  : Get data ready status
Setup Read to [0x61] : I2c address 0x61 read command
0x00 0x01  : returning 1 (data ready)

データが準備されたかどうかのステータスを読み込むためのコマンドを打ったあとに、1word読み込み、結果が1であればdata readyとなります。
レジスタ仕様書にはdata readyの0x00 0x01の後にCRCの0xB0が入るとありますが、波形上は出ておらずNAKで終わっています。データリードのbyte数はmaster側が決めるので、コードを確認をしてないですがCRCはいらないので2byte分しか読んでいないのかもしれません。

画像14

次が後半部分のデータのリードとなります。

Setup Write to [0x61] : I2C address 0x61 write command
0x03 0x00  : Read measurement
Setup Read to [0x61] : I2c address 0x61 read command
0x44 0x29  : Co2 (MMSB,MLSB)
0x85           : CRC
0x9E 0x75  : Co2 (LMLSB,LLSB)
0xAC           : CRC
0x41 0xD5  : Temperature (
MMSB,MLSB)
0x00           : CRC
0x44 0x24  : Temperature (LMLSB,LLSB)
0xC9           : CRC
0x42 0x29  : Humidity (MMSB,MLSB)
0xDF           : CRC
0x6F 0x00  : Humidity (LMLSB,LLSB)
0x4D           : CRC

中盤の0x44, 0x29からCo2のデータとなります。データはfloat型のBig-Endianの順列となるので、表記としてはそのまま、
 0x44299E75 (16進)  =  678.4758911132812 (10進)
なので、およそ 678ppm となります。
同じ様に気温と湿度は、
 0x41D54424 (16進)  =  26.65827178955078 (10進)
 0x42296F00 (16進)  =  42.3583984375 (10進)

となるので、26.6℃42.3% となります。レジスタ仕様書は以下の通り。

画像15

ふと、byte列をメモリ上に組み立ててfloatとして取り出すのはC言語ではできますが、ObnizはJavaScriptなのでこのような変換が出来るかが一抹の不安を覚えますが、その時に考えようと思います。

この後は、ずっとリードの値を読み続ける形になりますが、次のコマンドの波形解析をしてみると、

Setup Write to [0x61] : I2C address 0x61 write command
0x02 0x02  : Get data ready status
Setup Read to [0x61] : I2c address 0x61 read command
0x00 0x00  : returning 0 (data not ready)

次のdata ready statusが0で返ってきています。そこで、波形のインターバルを確認してみると、おおよそ500ms毎に読み込みを行っている状態です。

画像16

測定インターバルを2秒に設定しているので、測定データが間に合って無いのだと思います。なので本来であれば、測定開始してから2秒以上開けて読みに行くのが正しい制御となります。

|その2の終わりに

ここまでで、簡易ながら移植する準備ができました。SDC30のレジスタ仕様書を読んでいると、本来であればキャリブレーションを行う機能等もあるのでこれをやらないと正確な値とならない可能性もありますが、最低でも7日間必要で、更にきれいな空気に毎日1時間はさらさなくてはならないようなので、今回はそこまで追わないことにします。
次回 その3 でようやくObnizに入ります。

この記事が気に入ったらサポートをしてみませんか?