monolithic kernel

M5Stack CoreS3 SE と USB Module with MAX3421E v1.2 で GR-M02U を扱う

もともと Android スマートフォンを GPS ロガーとして使っていたのだが、用途に対してオーバーキルすぎるとは感じていたので、他の選択肢を検討している。Raspberry Pi 系のデバイスは、試してみて動くものを作れそうな感じはしたものの、ディスプレイやボタンなどの操作系がないために、出先でのコントロールが難しそう。

そこで、そのあたりをカバーできる可能性を探っていたところ、M5Stack にたどり着いた。M5Stack は、ESP32 という無線モジュール付きのマイコンに、ディスプレイ、ボタンなど UI 周りを揃えたパッケージングがされているため、ハードウェアに明るくない自分でもどうにかなるのではないかと思った。

ところが、実際やってみると、インターネット上に情報が少なく、ChatGPT などもまったく役に立たないために相当に苦戦した。まだ完成どころかやっとこさ GPS の信号を受信できたという段階だが、少しでも参考になればということでメモを残しておく。

本体は M5Stack CoreS3 SE で、GPS レシーバーには GR-M02U を使った。GR-M02U を接続するために、USB Module with MAX3421E v1.2 を使った。

# USB の GPS レシーバーを使おうとしていることで難易度が跳ね上がっていると思うので、何もないところから始めるなら GNSS モジュールを使ったほうがよさそう。こちらは解説している情報もいくつかあるっぽい。

もともと、M5Stack CoreS3 SE に USB OTG、CDC 機能があるという記述を見て手に取ったのだが、調べてみても使い方がさっぱりわからなかったため、USB Module を使うことにした。開発やデバッグの際に本体側の USB を PC と繋ぎっぱなしにできるので、こちらの構成のほうが現実的だと思った。

純正の USB Module を使ったとしても、引き続き使い方がわからず途方にくれることになった。DIP スイッチで構成変更できるので、CoreS3 にも対応できるという記述はあるものの、DIP スイッチをどう設定すればいいかという説明はどこにも見当たらない。

困っているのは自分だけではなさそう。

公式の m5stack/M5-Max3421E-USBShield は使い方がわからず。いろいろ調べていく中で、felis/USB_Host_Shield_2.0 という M5Stack に限らない USB Host のライブラリを見ていたところ、つい最近 (2025年8月) CoreS3 対応のコードを入れてくださった方を発見。最新バージョンで試したら動作した。

DIP スイッチは Pull Request に書かれているように SS と INT どちらも CH2 を ON に設定した。

(CH2 のみ両方左側で、他は右側)

この状態で、README に沿ってライブラリをインストールした上で、examples/USB_descexamples/pl2303/pl2303_gps のコードを Arduino IDE 上で動作させることができた。いろいろハマりポイントもあった。

  • M5Stack 本体と USB Module のピンでの接続がギリギリのようだったので、しっかりはまるようにした
    • 固定方法がわかっていないのでマスキングテープで抜けないようにしているが、どうしたらいいんだろう
  • GR-M02U を直接 USB Module に繋いでもインジケータ LED が点灯しなかったので、USB 電源補助ケーブルで給電した (手元にあった UPAC-UT07M を使用)
  • pl2303_gps に関しては lc.dwDTERate を GR-M02U 側の Baud Rate に合わせて (自分の場合は 115200) 更新した
    • 間違っていても接続さえできていれば文字化けしまくったデータが Serial に流れてくるので、そもそも動いていないこととの区別はできる

これでやっとこさやりたいことを実現するアプリケーションに取り掛かれる。険しい道のりだった。

でも Android スマホの便利さを痛感したのでもうそれでもいいかも……。

Related articles