回路設計者がデータサイエンス部署に飛んでいったブログ

子育てしか楽しみがありません、たすけて

ガスセンサSGP30をSTM32F0DISCOVERYで動かしてみる

今回はSensirionのガスセンサ SGP30 を動作させてみます。

マルチピクセルガスセンサー 「SGP」 | Sensirion

使用するマイコンボード :  STM32F0DISCOVERY

搭載されているマイコン : STM32F051R8

STM32F0DISCOVERY - Discovery kit with STM32F051R8 MCU - STMicroelectronics

この製品は空気中の水素を測定することでCO2濃度に換算してくれるセンサである。これで簡易的に部屋のCO2濃度がわかります。

 

さて、まずSGP30を動かす条件を確認します。

        f:id:chi_or_muchi:20171208121316p:plain

動作電圧:1.8V

消費電流:48mA

通信方法:I2C

結構消費電流大きいですね、手持ちにレギュレータがないので今回は定電圧電源から1.8Vを印加します。そして私にとって一番の問題がI2C。組み込みソフトの経験がほとんどないハードウェアエンジニアには大きな壁です。でもソフトウェアエンジニアになるには越えなければならない壁です。今回使うマイコンボードはSTM32F0 Discoveryです。理由は手元にあったから。。。

 

ではまずマイコンポートにI2Cの設定を行います。マイコンのデータシートを見ると、PB6,PB7がI2CのSCLとSDAをして使えることがわかります。

f:id:chi_or_muchi:20171208133359p:plain

ポート設定手順は、

1. GPIO(一般的にポートという認識でOK)、I2Cを設定するための構造体を有効にする

2. GPIO、I2Cに使うクロックを有効にする

3. GPIO、I2Cの設定を行う

4. I2Cを有効にする

書いたソースがこれ。

f:id:chi_or_muchi:20171208133929p:plain

これで初期設定は完了です。

遂にSGP30とマイコンボードが初めて連絡を取り合うことになるドキドキの瞬間!!!と思ったのですが、このマイコン3V駆動なんですよね。ということはこのまま通信しちゃうと電圧レベルが合ってない(SGP30 : 1.8V, マイコン : 3.0V)のでSGP30が潰されてしまいます。

そういう時のために世の中は便利になっており、レベル変換ICがあります。簡単に言うと、3Vの信号を受け取ったら1.8Vに変換して相手に届けてくれるという仲介役です。今回は手元にあったPCA9517ADPを使います。そしてそれを用いた回路図がこちらになります。回路CADはkicad使ってます。これ使いやすすぎ。

f:id:chi_or_muchi:20171208134600p:plain

さて、これで今度こそ初めてやり取りができます。SGP30のデータシートを読んでいくと動作手順は以下のようになります。

f:id:chi_or_muchi:20171208135945p:plain

嵌った落とし穴がスレーブアドレス送信です。

I2C_TransferHandling(I2C1, 0x58, 2, I2C_AutoEnd_Mode, I2C_Generate_Start_Write);

と0x58を入れて送ってたんですがACKが返ってきません。送信レジスタがどうなっているかを確認してみたら0x58になってませんでした。おそらく0x58 ( 0101 1000 ) なんですが、スレーブアドレスは7bitなので右づめされてしまっているんですね。なので1つ左にずらした0xB0 ( 1011 0000 ) にすると動作しました。コマンドはこうなります。

I2C_TransferHandling(I2C1, 0xB0, 2, I2C_AutoEnd_Mode, I2C_Generate_Start_Write);

他のコマンドはデータシートに書かれている数字まんまでOKでしたのでこれで無事動作しました。

初めてのI2Cでしたので1週間ぐらいかかってしまいましたが、これからも少しづつ何か触っていきたいと思います。

最後にスレーブアドレスを送ってInit_air_quialityコマンドを送って20秒待つところのソースです。ソースファイルの貼り方がよくわかってないので出来るようになったら置きます。

 

f:id:chi_or_muchi:20171208141656p:plain