2台のマイコンのシリアル通信で文字化けする (GNDループ)

M5Stamp S3Aを2台使ってシリアル通信を試したところ、通信内容が化けるという事象に遭遇しました。

基本的なことですが、これまで何となく上手くいっていたり、もしかしたらエラー起きていたけど気が付かなかったということで、今更ながらの学習になったのでメモです。

発生事象

Stamp S3AのTXピンとRXピンを繋ぎ、RXピン側のS3AからPCへ受信内容をUSB-UARTで出力しています。

TXピン側は常に"UART!\n"を送信しています。

ボーレートを遅くしてみたりしましたが、解消せずでした。

この時のPC側の受信ログとしては、

12:37:49.090 -> UP*Uj
12:37:49.156 -> UP*Uj
12:37:49.189 -> UP*Uj
12:37:49.254 -> UP*Uj
12:37:49.286 -> UP*Uj

といったものや、

12:45:46.549 -> IQ�
12:45:46.582 -> IQ�
12:45:46.646 -> IQ�
12:45:46.680 -> UIQ�
12:45:46.746 -> UIQ�
12:45:46.779 -> UIQ�
12:45:46.844 -> UP*Uj
12:45:46.878 -> UART!
12:45:46.944 -> UP*Uj
12:45:46.976 -> IQ�

といったものが出てきました。

ChatGPTに聞いてる

先日4oから5に進化したということで、試しに聞いてみました。

以下はChatGPT 5に、はてなブログ用にマークダウン記法で出力してもらった内容です。

ESP32-S3A同士をUART接続したらGND接続で通信が不安定になる原因と対策

原因:グラウンドループ

  • 2台のESP32-S3AをUSBでPCに接続すると、それぞれのGNDはPC側ですでに共有されています。

  • この状態でS3A同士のGNDもジャンパで直結すると、以下のような閉ループ(グラウンドループ)が発生します。

  • ループに スイッチング電源のリップルやPC間の電位差 が流れ、UART信号の基準電位が揺れて通信が不安定になります。

簡単な確認方法

  1. GND同士をつないだ状態と外した状態で通信の安定性を比較。

  2. 2台のPC(またはポート)間でGND電位差をテスターで測定

    数十 mV〜数百 mVの直流差やACノイズが見える場合あり。

対策(優先順)

1. アイソレーション

  • UART間にデジタルアイソレータ(例: ADuM1201 / Si86xx)やRS-485等の差動+アイソレータを挟む。
  • またはUSBアイソレータを片側に入れて電気的に分離する。

2. 単一基準にそろえる(ループを作らない)

  • 2台を同じPC・同じUSBハブに挿す。
  • 一方のUSBのVBUS(5V)をカット、またはデータ専用USBケーブルで電源の回り込みを防ぐ。
  • GND接続は一点接地にし、USB経由とジャンパ経由の二重経路を作らない。
  • 同じPCの場合、UARTのGNDジャンパは省略可能(TX/RXのみクロス接続)。

3. 配線と保護

  • GNDジャンパを使う場合は短く太く
  • TX/RXには33〜100Ω程度の直列抵抗を入れてリンギングやグランドバウンスを軽減。
  • 長いUSBケーブルやセルフパワー/バスパワー混在を避ける。

4. プロトコル側の耐性

  • UARTボーレートを下げる(例: 115200 → 57600 / 38400)。
  • 必要に応じて物理層差動(RS-485)に変更。

まとめ

既にUSBで共有されているGNDに、もう1本のGND線を足すとグラウンドループが発生し、ノイズ電流がUART通信に悪影響を与えます。
解決策は以下のいずれかです。

マイコン間のGNDを外す

それなりに良さそうな回答が出たようです。

上記の2にある対策として、GNDを外したところ正常に受信できました。

13:00:41.638 -> UART!
13:00:41.671 -> UART!
13:00:41.737 -> UART!
13:00:41.772 -> UART!
13:00:41.838 -> UART!

マイコンのGND間には40mV程度の電位差があり、確かにChatGPTが言う電位差の範囲そのものでした。

以上よりGNDループが原因と判断しました。

GNDループという言葉は知っていたものの、こういったところで発生するということを再認識しました。

追加トライ

ちなみにここまでは片方のマイコンはPCへ、もう片方はUSB HUB経由の接続でした。

ここで、マイコン間のGNDは外し、同じUSB HUBで接続すると同様に文字化けが発生しました。

この時にGNDを繋いでも文字化けは解消されず、当初の接続である片方はPC直結、片方はUSB HUB経由の接続に戻すと安定しました。

これも別ルートでGNDループが発生しているのでしょうか...?ただ、同じUSB HUBに2台マイコンを繋いで通信させるのがNGとなると何か通常の使い勝手としても難ありでは、と思ってしましましたが、一旦そういうものと割り切っておきます。

(環境: MacBook AirとUGREEN製多機能ハブ)