はじめに
Wiki IoT / Bot Computing と名付けたIoTシステムを開発中です。このIoTシステムで使っている Raspberry Pi Pico とArduino Nano を使ったセンサボードを紹介します。
特徴
このボードは以下の特徴を持っています。
USB シリアル(UART)を使った統一的なインターフェース
USBシリアルを通じてテキストコマンドをこのボードに送信し、そのコマンドに応じたセンサデータをテキストで表された値として、このボードから受信することで、USBシリアルを通して、統一的にボードを制御し、様々なセンサデータを獲得することができます。
下の図は、VSCodeのterminalでこのセンサボードにコマンドを送り、結果を受け取っている様子を示しています。
GPIOの電気的特性が弱いRaspberry Piに、USBケーブルでArduinoを接続し、Arduinoにセンサを接続すると良い、という話は以下の本に書いてあります。Arduinoの代わりに、Picoを使っているわけです。
多様なインターフェースを持つ多様なセンサを使った多様な獲得データ
センサデバイスにはマイコンボードのGPIOを通じて直接デジタル値入力やアナログ値を入力できるものだけでなく、I2Cインターフェースを通じて獲得データを送るものや、UARTを使ってコマンドとデータを送受信するものなどがあります。これらの様々なセンサデバイスから得られる様々なデータを獲得できるようにしています。
獲得できるデータ
獲得できるデータには以下のものがあります。
温度
I2Cインターフェースに接続されたBoschのBME280を使って、温度(摂氏度)を獲得できます。
湿度
I2Cインターフェースに接続されたBoschのBME280を使って、湿度(%)を獲得できます。
気圧
I2Cインターフェースに接続されたBoschのBME280を使って、気圧(hPa)を獲得できます。
照度
フォトトランジスタを使って明るさを獲得できます。
人(動物)の動き
PIRを使って人や動物の動きを検知できます。
2酸化炭素濃度
UARTインターフェースに接続されたMH-Z14AまたはMH-Z19Cを使って、2酸化炭素濃度を獲得できます。
におい(その1)
においセンサ AE-TGS8100 を使ってにおい(一酸化炭素、イソブタン、水素、エタノールなど)を検出できます。
におい(その2)
においセンサ TGS2450 を使ってにおい(硫黄化合物系ガス)を検出できます。
TGS2450のヒーターのOn/OFFを制御するため、PNPトランジスタ TTA008B を使っています。上のリンク先の、参考資料に書かれている回路図をそのまま使っています。
ほこり(煙、花粉、黄砂、PM2.5、微粒子など)
ほこりセンサDSM501Aを使って、煙、花粉、硫黄、PM2.5などの空気中を漂う微粒子を検出できます。ほこりセンサはArduino(または別のRaspberry Pi Pico, Sub Pico )に接続しています。Raspberry Pi Pico (主Raspberry Pi Pico)からI2Cを経由してこのArduino(またはSub Pico)にコマンドを送り、そのコマンドに従ってデータを主Raspberry Pi Pico に送り返しています。
コマンド
センサボードから獲得データを得るには、USBシリアルを経由して以下のコマンドを送ります。
ex self.sensing.get_temperature()
獲得した温度を〇.〇Cの形の文字列で返します。
ex self.sensing.get_humidity()
獲得した湿度を〇.〇%の形の文字列で返します。
ex self.sensing.get_pressure()
獲得した気圧を〇.〇hPaの形の文字列で返します。
ex self.sensing.get_co2()
獲得した二酸化炭素濃度を整数値(を表す文字列)で返します。単位はppmです。
ex self.sensing.get_motion()
獲得した人の動きや動物の動きを返します。一分間に何度動きを検知したか?の値を整数値(を表す文字列)で返します。
ex self.sensing.get_lx()
明るさの度合を整数値(を表す文字列)で返します。
ex self.sensing.get_smell()
におい(一酸化炭素、イソブタン、水素、エタノールなど)の強さの度合を整数値(を表す文字列)で返します。
ex self.sensing.get_smell2()
におい(硫黄化合物系ガス)の強さの度合を整数値(を表す文字列)で返します。
ex self.sensing.get_particle()
煙、花粉、黄砂、PM2.5などの微粒子の多さの度合を整数値(を表す文字列)で返します。
ハードウェア
ハードウェア概要
Raspberry Pi Pico (主Pico)に様々なセンサを接続しています。センサが獲得したデータは定期的に主Picoの内部に蓄えられます。データを獲得する外部機器は、このボードの主PicoのUSBインターフェースを通じて、コマンドを主Pico に送ります。主Pico はそのコマンドに応じて蓄えられたデータを外部機器に返します。
主Pico とセンサとの接続
PIR
モーションセンサ(PIR)は、Raspberry Pi Pico (主Pico)のデジタル入力に設定したGPIOのPin(GP14)に接続しています。
AE-TGS8100
においセンサ AE-TGS8100もGPIOを使って接続しています。主PicoのGPIOのアナログ入力Pin(GP26)にAE-TG8100の出力(Out ピン)を接続しています。GPIOのPin(GP15)をデジタル出力に設定し、これをAE-TGS8100の測定パルスピン(Pulseピン)に接続しています。
TGS2450
においセンサTGS2450もGPIOを使って接続しています。主PicoのGPIOのアナログ入力Pin(GP28)にTGS2450の3番pinを接続しています。
TGS2450のヒーターをOn/Off するため、GPIOのPin(GP12)をデジタル出力に設定し、この出力を1KΩの抵抗を通じてPNPトランジスタ TTA008Bのベースと接続しています。GP12がHighのときは、このトランジスタはOffになり、GP12がLowのときは、このトランジスタがONになります。GPIOのPin(GP13)をデジタル出力に設定し、このPinを1kΩの抵抗を通じてTGS2450の3番pinに接続しています。
フォトトランジスタ
明るさの強弱は、フォトトランジスタを使って得ています。主PicoのGPIOのアナログ入力Pin(GP27)にフォトトランジスタのエミッタを接続し、同じくエミッタとGNDの間を1KΩの抵抗を介して接続しています。
AE-BME280
温度、湿度、気圧を計測するAE-BME280は、主PicoとI2Cを使って接続しています。PicoのGP0のPinをI2CのSDA、GP1のPinをI2CのSCLに設定し、PicoとAE-BME280間の通信をおこなっています。なお、AE-BME280のJ3を接続し、これをI2Cモードにしています。
MH-Z14A(またはMH-Z19C)
CO2センサMH-Z14A(またはZ19C)は、主PicoとはUARTで接続しています。シリアル通信でコマンドとデータの送受信を行っています。PicoのGP4をTX、GP5をRXに設定しています。
DSM501A
ほこりセンサDSM501Aは、Arduino(または別のPico...Sub Pico)と接続しており、このArduino(または Sub Pico)とはI2Cで主Picoと接続しています。
実態配線図(Fritzing)
以下に実態配線図を示します。上のブレッドボードの左側にあるPicoが主Picoです。
回路
以下に回路図を示します。
プログラム
Raspberry Pi Pico
PicoのプログラムはMicro Python で記述しています。
開発はVSCodeを使って行いました。VSCodeを使ってPicoにMicro Pythonのプログラムを書き込む方法などについては、以下で記述しています。
ほこりセンサを接続するためのArduino(またはPico)のスケッチ
ほこりセンサからデータを獲得するために使っているArduino(またはPico)のスケッチはArduino IDEを使って作成しています。
Arduino Nano 版
Sub Pico (Raspberry Pi Pico) 版
謝辞
本作品を制作するにあたり、その一部は、科研費 21K11858 の支援を受けています。感謝します。


