はじめに
ロボット戦車を作るにあたって、モーター制御やらセンサーからの入力やら画面表示やらを、ひとつのマイコンボードで賄うのは無理がありそうに思いました。となると、複数のマイコンボードを使って、互いに通信させながら制御する必要があります。たとえば全体制御するマイコンボードからモーター制御を行うマイコンボードに指令を出して、モーターの回転の向きや速度を変更するといった具合に。
ということで、マイコンボード同士のシリアル通信(UART)を実験してみました。
使ったもの
- D1 mini ESP32 ESP-WROOM-32 ×2
- LED
- 抵抗 330Ω
配線図
片方のESP32からもう片方のESP32に指示を出して、指示の内容でLEDの点灯/消灯するための配線図です。下のESP32がコマンドを送る側、上のESP32がコマンドを受け取ってLEDの制御をする側です。上下逆っぽくなってしまってすみません。
例によって内側のピンのみを使って、3.3vピンとGNDピンを接続(赤と黒の線)。
また、今回は通信にUART2を使いますが、デフォルトのピンが RX=16ピン、TX=17ピンとなっているので、それぞれ互い違いに接続します(青と橙の線)。ESP32のUARTのピンアサインは結構自由に変えられますが、今回はデフォルトのままで。この自由度の高さがESP32の魅力ですね。
LEDへの出力は21ピンを使います。
プログラム
まずコマンドを送る側です。適当な間隔でSerial2に文字列で「ON」/「OFF」を送っています。
void setup() { // シリアル初期化 Serial2.begin(9600); // TX=16,RX=17 がデフォルト while(!Serial2); } void loop() { Serial2.println("ON"); delay(1000); Serial2.println("OFF"); delay(2000); Serial2.println("ON"); delay(2000); Serial2.println("OFF"); delay(1000); }
次にコマンドを受け取る側です。
void setup() { // シリアル初期化 Serial.begin(9600); while(!Serial); Serial2.begin(9600); // TX=16,RX=17 がデフォルト while(!Serial2); // LED出力ピン pinMode(21, OUTPUT); // 初期はLED消灯 digitalWrite(21, LOW); } void loop() { String command; if (Serial2.available() > 0) { // 改行までをコマンドとして受付 command = Serial2.readStringUntil('\n'); // コマンド文字列をトリム command.trim(); Serial.println("command="+command); if (command.equals("ON")) { // コマンドがONなら点灯 digitalWrite(21, HIGH); } else if (command.equals("OFF")) { // コマンドがOFFなら消灯 digitalWrite(21, LOW); } } delay(100); }
18行目で受信可否を判断し、可能であれば20行目で改行までを受信します。受信したコマンドには改行が含まれているようなので、気を付ける必要があります。今回は23行目でトリムしてからコマンドを判定し、ONなら点灯、OFFなら消灯しています。
実行すると、コマンド送信側からON/OFFを送信したタイミングで、LEDが点灯/消灯を繰り返します。
まとめ
ごく簡単な実験で一発で動きましたが、これでロボット戦車の制御を複数のマイコンボードで分担することができそうです。よしよし。