SenseCAP Indicatorで、ESP32S3とRP2040間でUART通信する方法
SenseCAP IndicatorはESP32S3とRP2040の2つのマイコンを内蔵し、480×480pxのタッチパネル液晶を持った汎用マイコンボード?です。Groveポートも2つあって、一つがI2C、一つがADCの機能があります。電池は内蔵していないのでUSBタイプCでの電源供給が必要です。
内部ブロック図を見るとわかりますが、2つのGroveポートはRP2040側に接続されています。
例えば、Groveポートに接続したセンサデータを取得し、ESP32のWiFiでクラウドにアップロードしたい場合、RP2040からESP32へ、UART通信でデータを転送する必要があります。
公式のGithubで、ESP32とRP2040、それぞれのUART通信サンプルコードは公開されています。
ただ、ESP32は開発環境としてESP-IDFが前提になっており、初心者には難易度が高いです。というか私はArduinoIDEしか使ったことがないです。
なので、今回はとりあえずArduinoIDE環境で、ESP32とRP2040に書き込み、UARTで相互に通信可能なところまで確認しましたので、その内容をメモします。
PC環境
・Linux Mint 20.3
・ArduinoIDE 1.8.19
ArduinoIDE環境
ボードマネージャ
・ESP32 2.0.11
・Rapsberry Pi Pico/RP2040 3.3.2
ESP32S3プログラム
String c;
void setup() {
Serial.begin(115200);
Serial1.begin(115200,SERIAL_8N1,20,19);
}
void loop() {
Serial1.println("ESP32_test");
if(Serial1.available()){
c = Serial1.readStringUntil('\n');
Serial.println(c);
}
delay(1);
}
ボード設定
・ESP32S3 Devmodule を選択
・Upload Speedは460800を選択
・PSRAMはOPI PSRAMを選択
・シリアルポートはdev/ttyusb0を選択(PC依存かも)
RP2040プログラム
String c;
void setup() {
Serial.begin(115200);
Serial1.setRX(17);
Serial1.setTX(16);
Serial1.begin(115200);
}
void loop() {
Serial1.println("RP2040_test");
if(Serial1.available()){
c = Serial1.readStringUntil('\n');
Serial.println(c);
}
delay(1);
}
ボード設定
以下のマニュアル参照
動作確認
一本のUSBで接続しながら、二つのポートの状態が確認できなかったので、以下サイトを参考に一つはLinuxのターミナルでモニタしました。
確認結果が以下の動画
左側のArduinoIDEのターミナルでESP32で受信したデータを、右側のLinuxのターミナルでRP2040で受信したデータを表示しています。
Discussion