行き当たりばったり電子工作

昔の論理IC電子工作少年が、四苦八苦しながら現在の電子工作に挑戦する話。

ESP32でシリアル通信

はじめに

ロボット戦車を作るにあたって、モーター制御やらセンサーからの入力やら画面表示やらを、ひとつのマイコンボードで賄うのは無理がありそうに思いました。となると、複数のマイコンボードを使って、互いに通信させながら制御する必要があります。たとえば全体制御するマイコンボードからモーター制御を行うマイコンボードに指令を出して、モーターの回転の向きや速度を変更するといった具合に。

ということで、マイコンボード同士のシリアル通信(UART)を実験してみました。

使ったもの

  • D1 mini ESP32 ESP-WROOM-32 ×2
  • LED
  • 抵抗 330Ω

配線図

ESP32でシリアル通信 配線図

片方の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が点灯/消灯を繰り返します。

まとめ

ごく簡単な実験で一発で動きましたが、これでロボット戦車の制御を複数のマイコンボードで分担することができそうです。よしよし。