あきらぼ

テック系ブログ

STM32 Nucleo でCO2センサーCCS811を動かす

こんにちは

今回はSTM32マイコンの評価ボードであるNucleo F401REで環境センサ(CO2センサ)であるCCS811を動かしてみました。

背景

最近在宅勤務が増えて、ワンルームマンションで一人暮らししているのですが、長時間家に籠りっぱなしになるので気分がすぐれない気がするときが時々ありました。
築浅のマンションで気密性が無駄に高いので換気ができていないのが原因かと考えました。

そこで部屋のCO2濃度を計測し、在宅勤務中の換気の目安にしようと考えたのが始まりです。

システム構成

今回使用したのは以下になります。

  • CCS811 CO2センサー
  • Nucleo F401RE

実際のボードはこちら SparkFun gator:environment - micro:bit Accessory Board - スイッチサイエンス

今回はただの動作確認なのでこんな感じのシステム構成です。
f:id:AKIRA_san:20220309224715p:plain

前準備

今回購入したCCS811とBME240のボードなのですが、スルーホールのサイズが特大で普通のピンヘッダをそのまま半田付けするだけではブレッドボード等でも使えません。
そこで、ユニバーサル基板を使ってちょっと無理矢理にピンヘッダをはんだ付けしています。

f:id:AKIRA_san:20220309231518j:plainf:id:AKIRA_san:20220309231511j:plain

あとは要らないユニバーサル基板の部分をカットします。
ニッパーで切ったのですが、安物じゃなくてちゃんとしたニッパーが欲しくなりましたね(笑)
ちょっと高いけれど掴みもの定番工具メーカー、Knipexとか。

 

あとはNucleoの3.3V, GND, SDA, SCKにセンサーをつなぎます。
f:id:AKIRA_san:20220309232032j:plain

ここで後になって気づいたのですが、I2Cの信号線のプルアップ抵抗を設置していませんでした。
データシート上は4.7kΩを使うそうですが無いので10kΩの抵抗で代用。(一応問題なく動きました。)

f:id:AKIRA_san:20220309232327j:plain

これで前準備は終了です。

STM32CubeIDEでソフト作成

次に今回のCO2センサーの値を取得してPCに出力するためのソフトを作っていきます。
数年分にSTM32を触ったのですが、友人からCubeという便利なSTM32用のIDEがあるというので今回はそれを使ってみます。

www.st.com

イントールして新規STM32プロジェクトを作成します。

f:id:AKIRA_san:20220309233043p:plain

次に今回使用するNucleo F401REを選択します。

f:id:AKIRA_san:20220309233240p:plain

次にGUIでGPIOのピンアサインの設定をしていきます。
(ここでの設定が勝手にコードとして出力されます。)
この機能がこのIDEで非常に便利でよかったです。

まずはI2Cの設定。
I2C1を使用するので有効にするためにI2Cを選択します。
選択すると右側のピンアサインの図も更新されてI2C1のピンができました。

f:id:AKIRA_san:20220309233638p:plain

次にPCとのシリアル通信のためにUSARTを有効化します。 同様にUSART2を選択してModeをAsynchronousに変更します。
パラメータSettingでボーレート等も設定できます。

f:id:AKIRA_san:20220309233829p:plain

あとは設定を保存すれば今設定した内容は勝手にコードとして既にmain.c, main.hに定義されています。

次に実際にコードを書いていきます。 全体は以下のGitHubに保存しています。

github.com

今回参照したDocumentは以下です。

CCS811データシート https://cdn.sparkfun.com/assets/2/4/2/9/6/CCS811_Datasheet.pdf

STM32 F4 HAL ドライバーリファレンス https://www.st.com/resource/en/user_manual/dm00105879-description-of-stm32f4-hal-and-ll-drivers-stmicroelectronics.pdf

基本的にはHALのいくつかのI2C、UART用の関数を使えば簡単に使えるようになります。

まず必要なレジスタアドレス等をmain.hで定義します。 User Codeの部分に追記します。

次にmain.cのUser Codeの部分にレジスタへの処理を色々と書いていきます。

CCS811の使い方としては電源を入れたら、まずブートモードに入っていて計測できないので、計測モードを開始させる必要があります。 ブートモードから計測モードにするためには「APP_START:0xF4」を呼び出す必要があります。(こちらのコードでは69行目で行っています。)

次に計測モードにしたら計測モードを設定する必要があります。 4つのモード(アイドルを含めたら5つ)があり、計測周期や消費電力が異なります。

今回はモード1を選択しています。

あとは周期的にデータを受け取ってはPCに出力するようになっています。 ほんとはデータ取得時にデータが更新されたかどうかのレジスタを確認した方がいいですが、今回はパス。

動作確認&実際に使ってみて

実際に動かしてみるとPuttyで問題なくデータを確認できました。 f:id:AKIRA_san:20220310000535j:plain

このセンサーは計測モード設定後20分は正しく計測ができないので、注意が必要です。
また、初めての使用開始から48時間はエイジングが必要とのことで最初は動かし続ける必要があります。

実際に在宅勤務中や部屋で作業中に二日ほど使用してみました。 結論から言うと、換気の目安には使えそうにありません。

このセンサーはCO2を直接計測しているわけではなく、揮発性有機化合物から換算したCO2濃度を出力しています。 そして、この揮発性有機化合物は部屋を換気しないと確かに増えるのですが、臭いに対して非常に敏感です。 なので食べ物やにおいのある飲み物を近くに置いたらあっという間に値が跳ね上がります。(ex. eCO2 2000ppm) 臭いセンサーとしては使えそうだし、部屋が臭うという点においては換気の基準になるかもしれません。

次にやりたいこと

まぁ、換気の目安には使えそうもないのですが、せっかく買ったので次はRaspberyPiでデータをとって借りてるサーバーのデータベースに記録。 自分のホームページから前回作った温度モニターのような形で表示させられるようにはしようと思います。

↓温度湿度モニター作ったときの記事。 aki-lab.hatenadiary.com

とりあえず、問題なく動作確認はできました。