うごくものをつくる

個人的な学習ノート

基礎技術メモ 研究ノート

ESP32-PICO-V3-ZEROの使い方を探る・2

PICO-V3-ZEROの使い方を探る企画、第2回です。

サンプルコードで動作確認

Amazon Connect Kitで開発するPICO-V3-ZEROは、Amazonがサンプルプログラムを公開している。

Alexa Connect Kitを使ってAlexa対応フルカラーLEDを作ってみた を参考にしてSDKをインストールすると、お使いのPCにサンプルプログラムがインストールされる。

僕はWindowsを使っているので、インストールフォルダは、

C:\Users\(ユーザー名)\Documents\Arduino\libraries\

に、AlexaConnectKit_SmartLightとかなんとか、AlexaConnectKit関連のフォルダがいくつかできる。この中にサンプルプログラムのファイルがある。とりあえず今回はこのスマートライト用のサンプルを見てみよう。

フォルダを開くと中に「examples」フォルダがあるのでこれを開き、さらに中にあるSmartLightフォルダを開くと、ArduinoのスケッチであるSmartLight.inoがある。

これを開いて見てみる。もしお使いのマイコンがこれをそのまま書き込んでOKなスペックを持っているのなら、このサンプルを書き込んでやれば良い。今回はよくあるESP32搭載の開発ボードに書き込んだ。

書き込む前に準備

ESP32に書き込む場合、サンプルコードそのままではダメで、ちょっとした準備が必要である。

まずはピン設定。以下はたくさんあるソースファイルのうち、srcフォルダ内にあるack_arduino_platform.cppの冒頭の部分である。(私がメモのため書いたコメントも追加されている。)

// Arduino pins when the Alexa Connect Kit shield is attached to an Arduino Zero.
// Pins 0/1 are used implicitly by Arduino Serial1.
// We use pins 2 and 3 for host interrupt and reset, respectively.
//原型は2だが、2はESP32でビルトインLEDなので、5にした。
#define ARDUINO_PIN_HOST_INTERRUPT 5

//接続した外部モジュールに向けてリセット信号を出す出力GPIO?
//ACK sample原型では3が設定されていたが、ESP32でGPIO3は使えないので、27に設定する。
#define ARDUINO_PIN_RESET 27

// Pins for sample applications.
#ifdef ACK_SAMPLE_APPLICATIONS_LED_PIN
//#define ARDUINO_PIN_SAMPLE_APPLICATIONS_LED 8 //ACK sampleの原型
#define ARDUINO_PIN_SAMPLE_APPLICATIONS_LED 2 //ESP32でGPIO8は使えないので、上行の8をビルトインの2に変更
#endif

//以下3つの定義は、ACK sample原型ではそれぞれ9, 10, 11ピンが設定されている。
//しかし、ESP32でそれらは使えないため、32, 33, 34ピンに設定する。
#ifdef ACK_SAMPLE_APPLICATIONS_GPIO_PIN_1
#define ARDUINO_PIN_SAMPLE_APPLICATIONS_GPIO_1 32
#endif
#ifdef ACK_SAMPLE_APPLICATIONS_GPIO_PIN_2
#define ARDUINO_PIN_SAMPLE_APPLICATIONS_GPIO_2 33
#endif    
#ifdef ACK_SAMPLE_APPLICATIONS_GPIO_PIN_3
#define ARDUINO_PIN_SAMPLE_APPLICATIONS_GPIO_3 34
#endif

Amazonが公開しているサンプルコードはESP32に書き込むことを想定していないのか、ESP32では使用できないピン番号が設定されていたりするので、まずはこれを書き換える。

まず、PICO-V3からホストマイコンへ向けて出される割り込み信号を受けるためのデジタル入力ピンを、デジタル5番ピンにする。初期設定では2番であり、別にこのままでも悪くはないのだが、今回使った開発ボードはESP32の2番ピンにはLEDが接続されている。このLEDは動作確認用に使いたいので、別の適当なピンに指定する。(5番を選んだ理由は特にない。)

というわけで、割り込み信号を受けるピン番号定義のARDUINO_PIN_HOST_INTERRUPTは、5にした。

次にARDUINO_PIN_RESETというピン番号を設定する。これは、ホストマイコンにさらに何かデバイスが接続されていて、このデバイスにリセット信号を送りたいとき用の出力ピンである。今回は特に用事はないので、GPIOとして使える適当なピン番号である27に設定した。

ARDUINO_PIN_SAMPLE_APPLICATIONS_LEDは、実際にアレクサのシステムからオンオフ操作されるGPIOピンである。今回はわかりやすく動作確認するために、開発ボード上のLEDが接続された2番に設定する。

最後に、ARDUINO_PIN_SAMPLE_APPLICATIONS_GPIO_1~3についてだが、これが現状何に使われるのかはよくわからない。これら3つのGPIOもアレクサ経由で操作することができるのかな?

使わないのであれば特に設定変更しなくて良いのではという気もするが、サンプルコードの初期設定ではここは9, 10, 11ピンが設定されている。

コード内コメントにも書いているが、これらのピンはESP32においてGPIOに使うことはできない。GPIOに使えないピンをGPIOに使うような設定をしてしまうと、マイコンが適切に動くことができず再起動を繰り返すようなトラブルが発生したりするので、念のためここはGPIOに使用可能なピン番号に変更しておく。

ピン番号の設定はここまでで、次は同じack_arduino_platform.cpp内の、ACKPlatform_Initialize()関数について変更を行う。

void ACKPlatform_Initialize()
{
    Serial.begin(115200);
    //Serial1.begin(115200); //ACK sampleの原型
    Serial1.begin(115200, SERIAL_8N1, 22, 23); //Serial1をESP32用に、Rx=22, Tx=23に設定
  
  //(中略)
}

実際のこの関数の中身は結構長いので、冒頭のシリアル通信の設定部分だけ抜粋した。

このプログラムはシリアル通信を2系統使用する。ひとつはPICO-V3とホストマイコンが通信するためのもので、もう片方はデバッグ用に様々な情報をパソコンに送るためのものである。

このコード内を読み進めていくと、Serialの方がパソコンとの通信用、Serial1がホストマイコンとPICO-V3の通信であるとわかる。

今回変更を加えるのは、Serial1の方である。これはサンプルコードの原型ではデジタル0番と1番で通信をする設定になっているようだが、これらのピンはESP32では自由に使うことができない。

そのため、ESP32においてSerial1を使うための設定に書き換えたのが上記のコードである。Rxピンを22に、Txピンを23に設定したが、ユーザーが自由に使える空いたGPIOならなんでもよい。

ここまで変更したら、そのままコンパイルしてESP32に書き込んでも正常に動くはず。

アレクサからGPIOの操作

ホストマイコンとPICO-V3を接続し、ホストマイコンにサンプルコードを書き込む。本当はサンプルそのまま使用ではなくオリジナルで制御できるようなプログラムを組みたかったが、後述の理由でそれは難しそうだったので今回はサンプルそのままで。

こんな感じで、アレクサのアプリから開発ボードの青色LEDのオンオフを制御できている。というわけで、GPIOの先に任意のデバイスを繋げておいて、アレクサ経由でそのデバイスをオン・オフできる。

上の動画ではスマホアプリ上から手動で操作しているが、もちろんAmazon echoみたいなアレクサ対応スマートスピーカーがあるなら声で操作しても良い。

アレクサを経由するので、外出先から自宅の家電を制御するように、自作デバイスを外出先からオンオフできる!これは便利!(具体的な用途はまだ思い浮かんでないけど……)

シリアル通信の中身について

さっきコードの一部を抜粋してみせたack_arduino_platform.cppを見ると、ホストマイコンとPICO-V3との間の通信に使われるピンは分かるし、ボーレート(通信速度)も分かるので、どんな内容の通信をしているのかをこっそり見ることが可能である。

じゃあさっそく見てみよう。

何だ……これ……?

ボーレートの選択をミスった時にこんな感じで文字化けしちゃうときはあるけど、今回はソースコードを読んで正しいボーレートは把握できているので、通信速度による文字化けではない。

ここの通信は人間に読ませるためのものではなく、あくまでもPICO-V3とホストマイコン間の通信であり、彼らが意思疎通できさえすれば良いので、通常の文字コードで表現されるようなものじゃない変な信号を送っているとかなのだろうか……?

上の画像はホストマイコン→PICO-V3への通信だが、これを受けたPICO-V3側の応答信号も、同じく文字化けしていて何が何やらさっぱり分からない状態だった。

というわけで、ここの通信部の正体を突き詰めるのは大変そうなので、今後は当初目標としていた「ゼロから自作プログラムでPICO-V3を制御する」は諦めて、Amazon謹製のサンプルコードをベースに作り変えていこうと思う。

おわり

電子工作のツイッターアカウントつくったので良ければフォローお願いします。

返信する

メールアドレスが公開されることはありません。 が付いている欄は必須項目です