United Statesからアクセスのようです。言語設定をEnglishに切り替えますか?
Switch to English site
Skip to main content

グッドエアーカナリアのコントローラを作成

この記事ではカナリアプロジェクトのエレクトロニクス及びそのソフトウェアについて説明していきます。また、本記事はジュード氏のグッドエアーカナリアプロジェクトに対応しています。ここを読み終えたらジュードの記事に戻りカナリアプロジェクトを完成させてください。

ステップ1:Arduino MCU

カナリアのハードウェアの中心にはArduino Nano 33 IoTボードを搭載しています。これには、SAMD21 Cortex®-M0+ 32ビットARM MCUと256KBフラッシュメモリー及びユーブロックス社のNINA-W102 WiFiモジュールが搭載されています。

このボードはWiFiに接続することが可能で、DesignSpark環境センサー開発キット(ESDK)からセンサーデータを受信するMQTTクライアントを実行し、JSONメッセージを処理してサーボを制御し、巧妙な機械的メカニズムでカナリアを作動できます。サーボはPWMサーボ制御ボードで駆動し、アンプ内蔵の専用オーディオボードとシングルスピーカーを装着して高音質な音声を提供します。

ステップ2:プロトタイプ回路

このステップでは回路を組み立て、各コンポーネントが動作していること段階的にテストし確認しながら構築していきます。このステップの中では特に電圧レベルに注意が必要です。主な部品とその説明を次に示していきます:

警告:Arduino NanoのGPIOは3.3Vで動作し回路の一部の部品には5Vを使用します。ArduinoのGPIOに5Vを接続しないように注意してください。

Adafruit 16チャンネル12ビットPWMサーボドライバ

このボードはArduinoの3.3Vピンから供給される3.3V(VCC)で動作します。サーボはリニアレギュレータから別の5V電源(V+)を持っています。通信はI2Cインターフェースで、メーカーから提供されたドライバライブラリを使用しています。当初はカナリア用に複数のサーボが必要と考えており、ハードウェアとプログラミングを簡単にするためにこのボードを採用していました。結果的には必要ありませんでしたが応用も考えて特に変更をしませんでした。

タワープロ SG90 アナログサーボモーター

カナリアの翼機構を操作するものです。

Adafruit Audio 2MB FXサウンドボード(アンプ付き)

44.1kHz 16bitのOGGフォーマットサウンドクリップをUSBマスストレージモードで再生するものです。メーカー提供のドライバライブラリを使用してArduinoで制御する9600Baudで動作するシリアルインターフェースを使用します。

4Ω/3W ステレオ密閉型スピーカー

サウンドボードの音を発生させるためのスピーカーです。サウンドボードがステレオに対応しているため2台セットを購入しましたが、コンパクトな設計にするためにスピーカーは1台で済ませることにしました。

注意:組み立てる際には4~8Ωのインピーダンスのスピーカーを使用しケーブルの長さは10cm以下にしてください。

L7805パワーリニアレギュレーターとキャパシタ

Arduinoの電源(VIN経由)、オーディオボードとサーボ用の独立した5V電源を供給するものです。サーボの電源要件によってはArduinoのUSBコネクタを使用して電源を供給することも可能ですが、安全性の観点で問題が発生する場合があったのでこの方式を採用しました。

Waveshare社製2.9インチE-inkディスプレイ

私たちはESDKから受け取ったすべてのセンサー読み取り値を表示するために、現代的なディスプレイを選びました。このディスプレイはプログラミングが難しく、同じ品番であってもハードウェアのバージョンが異なるという問題がありました。コードライブラリも開発中に次々に変更されるようなので、プロジェクトのGitHubにワーキングバージョンを入れておきました。

注意:E-inkディスプレイのコードとライブラリのバージョンはV2マークの付いたWaveshare 2.9in Black & Whiteディスプレイにのみ対応しています。

下の写真はESDKを使ってプロトタイプ回路をテストしている画像です。画面とキーボードの間にESDKがあり、右側にカナリア回路があるのがわかります。画面にはESDKから受信したJSONメッセージがTerminalに表示されています。

ステップ3:Arduinoスケッチ

プログラミングとフラッシュはArduino IDEを使いました。ソースコードの全容は下記リンクのDesignSparkのGitHubで公開されています:

GitHubレポジトリ

ZIPファイルをダウンロードするか、レポジトリをWindows/Mac/LinuxまたはRaspberry Piにクローンしてください。

コードを書き写してカナリアにアップロードする前にライブラリマネージャーを使用していくつかのライブラリをインストールします:

  • Arduino WiFiNINA library
  • Adafruit Soundboard library
  • Adafruit PWM Servo Driver Library
  • ArduinoJson(大きなJSONペイロードをうまく扱えなかったのでArduino_JSONではありません)
  • PubSubClient

ArduinoをWiFiに接続するにはIDEのスケッチ上のタブの一つにあるarduino_secrets.hファイル中の下記行を編集する必要があります。

このdefine文はあなた自身のWiFi SSIDとそのパスワードに合うように変更してください:

#define SECRET_SSID "YOURSSID"

#define SECRET_PASS "YOURPASSWORD"

ネットワークによってはESDKのデフォルトのホスト名を変更する必要があります。これはCanaryController.inoにあります。“airquality”の文字列をあなたのネットワーク上のESDKのIPアドレスに変更します。ESDKのIPアドレスはルーターに管理者としてログインし、接続されているデバイスを見ることでわかります。

// ESDK server name or IP address

//const char broker[] = "192.168.0.75";

const char broker[] = "airquality";

下のコードではカナリアがCO2濃度をチェックする頻度を変更することができます。デフォルトでは20秒ごとに設定していますが、コードを更新してミリ秒単位で拡張することも可能です:

// Interval between audio / physical warings - change if it's

// nagging you too often

unsigned long DELAY_TIME = 20000; // 20 seconds

これらの変更を全て行ったらコンパイルしてコードをArduinoにアップロードし、シリアルモニターを開いてデバック情報を確認できます。

システムが起動すると、クレジット画面が表示されてサーボとサウンドボードが初期化されます。同時に「yawn」というサウンドクリップが再生されます。Arduinoはネットワークへの接続を試み、成功すればESDKのMQTTサーバにサインアップし、そこで最初のメッセージが表示されるのを待ちます。この時点で画面にはESDKからのセンサーの測定値が表示されるようになります。

カナリアは定期的に受信したCO2レベルのデータを評価し、レベルに応じていずれかのアクションを実行します。

CO2レベルが高い状態でカナリアを無視すると倒れるまでしつこいくらいに興奮します。これは自身の健康に悪いですし、意図的にArduinoをリセットしなければならなくなるので、そうならないようにしましょう!

ステップ4:MQTT

LinuxボックスやRaspberry Piをお持ちの場合ESDKのMQTTサーバを利用することで、ESDKから送られてくるMQTTメッセージを閲覧・記録することができます。

まずはLinuxボックス等にmosquitto-clientsパッケージがインストールされていること下のコマンドで確認します:

sudo apt install mosquitto-clients

インストールできたら以下のコマンドを使用してESDKサービスに登録します:

mosquitto_sub -F '%I:%t:%p' -h airquality -t airquality/#

すると、以下のような出力が得られて5秒ごとに更新されるJSONペイロードが確認できるはずです:

ステップ5:サーボチューニング

サーボによって動作に差が出るので、お使いのサーボに合わせてパラメータを調整する場合があります。その為、IDEのタブの中にあるESDKCanary.hファイルで定義されている文を次のように変更してください:

#define WINGS_DOWN 495
#define WINGS_UP 445
#define PASS_OUT_POS 225
#define DEAD_POS 150

設定を少しずつ変更してカナリアが正しく動くようになり、サーボがチャタリングしなくなくなったらコードを再コンパイルしてください。

ステップ6:サウンドエフェクト

効果音はWindows PCでM4Aフォーマットで録音しました。それらのファイルはLinuxボックスやRaspberry Piでffmpeg(他のコンバーターもあります)を使ってOgg Vorbisフォーマットに変換する必要があります。

まずは下記のコマンドでffmpegパッケージがインストールされていることを確認します:

sudo apt install ffmpeg

確認ができたらコマンドをTerminalで使用します。すると、M4A形式の“yawn”クリップをサウンドボードが要求する命名規則に従ってOgg Vorbisフォーマットに変換してくれます:

ffmpeg -i yawn.m4a T00.ogg

このボードでは最大9種類のファイルを再生することができますが、これらのファイルには特定の命名規則が必要です。また、ファイルの名前はT00.ogg、2番目はT01.oggなどになります。

サウンドボードを回路に組み込む前にUSBケーブルでPCに接続し、ファイルマネージャーやターミナルを使用してOggサウンドクリップファイルをサウンドボードのEPROMにコピーしてフラッシュしてください。

自分で効果音を録音するもよし、用意された効果音を使ってピュートネス風のナレーションをするもよし、あなたの想像力を存分に発揮して効果音を作成・フラッシュしてください。

下の写真では4Ω/3Wの小型スピーカーを短いケーブルでEPROMに接続しています。

ステップ7:トラブルシューティング

Arduino IDEのシリアルモニターはファームウェアで何が起こっているのかを知るためにとても役立ちます。私たちはデバッグに役立つようにシリアル出力をたくさん用意しました。もし問題があれば、実行中のコードから動作状況を見るために、セットアップセクションのシリアルインターフェースの開始後のwhileループのコメントを解除してください。エラーメッセージが表示され、問題の追跡に役立つはずです。

 Serial.begin(115200);
 while (!Serial) {
  ; // wait for serial port to connect
 }

エラーメッセージ例:

Arduinoがネットワークに接続できません

ホスト名「airquality」をESDKのIPアドレスに変更しコードをリフラッシュしてください

Canaryの画面がクレジット画面を表示し続けています

ESDKが複数ある場合は同じネットワーク上にあること、手順4の方法でそのMQTTメッセージを受信できることを確認してください

Canaryが正しく動作していません

サーボパラメータがお使いのサーボに合っているか、手順5と同様に確認してください

サウンドボードが短い音を出しますがサウンドクリップが再生されません

CanaryController.inoのsetupセクションでボーレートが9600に設定されているかどうか確認してください

E-Inkのディスプレイが真っ白になります、画面出力を確認してください

2.9インチWaveshareディスプレイのV2バージョンを使っているかどうか確認してください

MQTTメッセージが処理されません

MQTTコールバック関数にJSONドキュメントを保持するために十分なメモリが割り当てられていることを確認してください

// ESDK sends a large JSON payload

// - ensure you have enough memory allocated

StaticJsonDocument<384> doc;

 

以上でカナリアのエレクトロニクスと回路製作、それにのせるソフトウェアの開発が終了しました。また、前述したようにこの記事はジュード氏のグッドエアーカナリアに対応しています。ここを読み終えたらジュードの記事に戻り、カナリアプロジェクトを完成させてください。

I'm an engineer and Linux advocate with probably more SBCs than a Chandrayaan-3 moon lander