『Zumo32U4 で PixyPet を動かす』でも自動追尾など一定の教育効果はあると思いますが, 受動的な動作なので低学年ではすぐに飽きてしまいます. そのため先頭車両用に3種類のラジコン(XBee, VS-C1, BLEserial3)を作り能動的な操作もできるように工夫しているわけですが, もう少し発展的に楽しめないかということで マリオカートライブホームサーキット を参考に試作してみました.
本番では20台以上の大量生産が必要なのでコストも大切です. また,教材として使うわけですから技適の取れた製品を選択します. それらを考慮し ESP32-DevKitC ESP32-WROOM-32開発ボードと OV2640使用200万画素カメラ B0011を購入. 回路はmgo-tec電子工作さんのページを参考にさせてもらいました. 下の画像は本家からのパクリです.あざますあざます.
OLED(有機EL)は使いませんのでOV2640のところだけ配線します.
ただしZumoへの通信が必要なので,Reset信号はESP32のENピンに接続しました.ESP32のGPIO#17はSerial2のTXで使用します.
それを XBee や BLEserial3 と同じように,ZumoのRXピンに接続します.
ESP32の電源は Zumo の 5V から取りました.Zumo からは 3.3V も出ていますが,ESP32の駆動にはESP32自体のレギュレータを使う方がいいでしょう.
実際の配線ですが,カメラを垂直に固定するためのL型ピンヘッダが手持ちに6ピンしかなかったので,それは垂直保持だけに使い,カメラとESP32はフラットケーブルで接続しました.
あとから気づきましたが,この配線図よりもサンプルスケッチのピン配置を参考にした方がいいかもしれないですね.
とにかくスケッチ内でピンを指定するので,使えるピンならどこでもOKです.
ESP32用のボードライブラリのインストールは他のサイトを参照してください.
ただし(2021年11月現在で)バージョン2.01では動作しませんでした.カメラの初期化関数 esp_camera_init() でエラーが返ります.
1.06なら動いたので,インストールの際はバージョン指定にご注意ください.
PSRAM(画像用のメモリ)非搭載のモジュールは最新版では切られたのかもしれません.
余談ですが,スケッチのビルドに結構なCPUパワーを使います.
いつもマイコンの開発にはサブノートを使っていましたが,あまりに遅いのでメインのデスクトップPCにArduino IDEをインストールしました.
まずはWiFiカメラの挙動をテストします.この時点でのテストは本当はブレッドボードに組んでテストする方が良いですが,Zumoとの通信も重要課題なのでこの状態でテストします.
スケッチ例から ESP32→Camera→CameraWebServer を開き,一旦別名で保存します.
このサンプルスケッチはアクセスポイントを別に用意する必要があります.
20台ほどが一斉に通信する本番を想定し,ESP32自体がアクセスポイントになるよう変更します.
22行目と23行目を消して以下のコードを追加します.SSIDやパスワード,IPアドレスなどは,それぞれの環境で適当に設定してください.
// ESP32 SoftAP Configration
const char ssid[] = "ESP32-NET99";
const char pass[] = "mncts-12345";
const IPAddress ip(192,168,199,1);
const IPAddress subnet(255,255,255,0);
つぎに 102行目 startCameraServer() の前後を以下のように変更します.
//SoftAP
WiFi.softAP(ssid, pass);
delay(100);
WiFi.softAPConfig(ip, ip, subnet);
IPAddress myIP = WiFi.softAPIP();
Serial.println("ESP32 SoftAP Mode start.");
Serial.print("SSID:");
Serial.println(ssid);
Serial.print("Password:");
Serial.println(pass);
startCameraServer();
Serial.print("Camera Ready! Use 'http://");
Serial.print(myIP);
Serial.println("' to connect");
上で述べたピン配置は,このサンプルスケッチの camera_pins.h を参考にしてもOKです.
ただし CameraWebServer 本体の #if defined に変に引っかからない定義をオススメします.
結論から言うとよろしくなかったです.WiFiはつながるのですが映像が出ません. config.xclk_freq_hz = 10000000; にしてようやくVGAで出る感じですが,クロックを下げるということはFPSも当然下がります. なによりクロックを下げても通信そのものが安定しませんでした. 原因はこの配線かも.
一旦カメラテストは保留にし,BLEserial3 と同じような無線コントロールを確認します.
浅草ギ研さんの BLEserial3 はBluetoothの機能だけで4000円,
ESP32-DevKitC ESP32-WROOM-32開発ボード は色々ついて1500円ほど.
中華恐るべしww
ArduinoライブラリはNimBLE-Arduinoを使います.
インストール後,スケッチ例から NimBLE-Arduino→Refactored_original_examples→BLE_uart を開き,別名で保存してください.
まずsetup()関数にZumoとの通信設定を追加します.BLEデバイス名もわかりやすいように変更しておきます.
void setup() {
Serial.begin(115200);
Serial2.begin(9600); // GPIO#17
// Create the BLE Device
BLEDevice::init("ESP32-NimBLE"); // 識別できる名前に変更
そのすぐ上にコールバック関数が定義されているので,受信したデータをZumoにも送ります.
class MyCallbacks: public BLECharacteristicCallbacks {
void onWrite(BLECharacteristic *pCharacteristic) {
std::string rxValue = pCharacteristic->getValue();
if (rxValue.length() > 0) {
Serial.println("*********");
Serial.print("Received Value: ");
for (int i = 0; i < rxValue.length(); i++) {
Serial.print(rxValue[i]);
Serial2.write(rxValue[i]); // Zumoへの送信
}
Serial.println();
Serial.println("*********");
}
}
};
あとは BLEserial3 のときに作ったPython コード BLEjoy.py の
address と UUID を ESP32 に合わせれば,BLEserial3 と同じように無線コントロールができました.
address(MAC)の調べ方はいろいろありますが,
BLE通信試験ツール
が便利ですよ.
UUID は ESP32 から見た受信ID