他の機器との通信をシリアルポートで行いつつ、他の機器とも通信をしたいということで、通常使用しているシリアルポート以外を使えるようにしたい。
ESP32にはハードウェアシリアルポートが3組用意されており、何も宣言しなくても使える通常使用しているSerialはUART0ということらしい。
他にUART1とUART2があるわけで、どのピンがそうかというとUART1はRXD1:IO9, TXD:IO10でUART2がRXD:IO16, TXD:IO17ということらしい。
IO16,IO17は通常アナログポートじゃないピンなのでいいとしてIO9,IO10はそもそも秋月の基板ではピンが引き出されていない。というのもこれらのピン(IO6~11)は内部的にすでに使われちゃっているからという説明である。
ただし、UART1を別のピンにアサインするという技が使えるらしい。
現在テスト基板ではIO34,IO35,IO32にアナログセンサー接続用のコネクタを付けているので、このポートをシリアル通信に流用しようと試してみたところ、IO34とIO35は
collect2: error: ld returned 1 exit status
というエラーが出て使えないことがわかった。当然ながらIO6~11も使えない。16,17をUART1として使うこともできるがあまり意味はないかな。
のこるIO32は無事使えることがわかった。これだとTxかRxのどちらかしか使えないのだが、やむをえまい。
後はWIFIと共存できないADC2チャンネルのIO25〜27のあたりもシリアル通信ならできるんじゃないかな。
HardwareSerial mySerial1(1); const int Rx1Pin = 25; const int Tx1Pin =32; void setup() { Serial.begin(115200); //通常のシリアルポートUART0 mySerial1.begin(115200, SERIAL_8N1,Rx1Pin,Tx1Pin); //UART1をRXD:25,TXD32に割り付ける } void loop() { mySerial1.print("Hello worls!");