【L-RTK】M5Stack_Serial2接続で手間取った<DefaultではSerial2しか使えない>

表題jpgファイル
M5StackでWIFI接続で取得したCQ出版のNTRIP casterからのRTCMデータをGNSSチップF9Pにシリアル送信するプログラム作りましたがSerial1が動かなくて手間取りました。M5Stackは、Serial2しかデフォルトでもってませんでした。それを知るのに、
半日かかってしまいました。ESp32系は、シリアル通信にあまり重きを置いた仕様になってない感じがします。
※2023年4月11日 chatGPTに質問してみました。「M5Stack serial1は使えない」と聞いたら、
下記のように、ソフトウェアシリアルを使うという回答が返ってきました。ピンを入れ替えれば使えることは、知らないみたいです。しかし、これからは、Google検索する前にchatGPTに聞いてみてから、記事を書くようにしないと、ゴミ記事を書くことになるのでブロガーは注意です。

※2023年2月感想 スキー滑走計測システムの開発してますが、ESP32系からARM系Cortex-M7(Teensy4)に変更して
多センサのFusionシステムを組んで、有益な結果が得られるようになりました。IOポート数と使い勝手に制限があるESP32系では、決して得られない結果だと思います。時代は、AI,BigDataの時代ですので、マイコンも多ポート高速処理になっていかないと、良い開発ができないと実感してます。

 

※2022年6月14日追記 読者の”とおりすがり”様からのコメントをいただきました。
同時にSerial1,Seiral2も使える点をご指摘いただきました。
本記事では、同時で使えると記述がありませんでしたので、ご指摘感謝いたします。
詳細は、最下部のコメント欄をご覧ください

●どうしてもSerial1とSerial2を使いたい場合
【Serial1は、他のGPIOに切り替えれば使えるようになります】
デフォルト以外で使うのでどこかの機能をつぶしてしまう弊害があります。(M5Stackは多機能なため)
ご自分で使う機能かどうか確認して使ってみてください。Core2で使えそうなピンは8ピン存在します。
①Core2の場合はGPIO19とGPIO27なら弊害なさそうです
Serial1.begin(115200, SERIAL_8N1,19, 27);//RX19,TX27 で動きます。
サンプルPgm core2用です。Basicでは27が空いてないので別のピンをさがしてください。
https://gist.github.com/dj1711572002/5ca7d7a53062fa6e000336eb96340b40

②Basicの場合は、GPIO2とGPIO5なら弊害なさそうです。
Serial1.begin(115200, SERIAL_8N1,2, 5);//RX2,TX5 で動きます。
サンプルPgm Basic用です。
https://gist.github.com/dj1711572002/c21b81b7fe416df9bafb9b3d405604d5
●M5Stack Serial接続表 (Basic,Core2,ESP32DevkitC)
下記Excelファイルは、Core2,Basic,EPS32で接続確認してみたシリアルピン表です。
ご自分のメモ用にお使いください
Excelファイル:M5Stacks-ESP32_Mbus_Serial1_PINS
Basic jpgファイル                                         Core2jpgファイル
   

EPS32DEvkitC jpg  迷ったら元祖ESP32のGPIOを確認します


※ESP32DEvKitCの詳細記事はこちら
参考にさせていただいているサイトLangShip様M5Stack Core2のGPIO調査 | Lang-ship

IOたっぷり使いたい人でAllInOneが要らない用途ならシリアル7個のTeensy4シリーズがお勧めです。ArduinoIDEで普通に使えます
※2022年6月18日 「シリアルで数百Byte~数KByteのデータの高速受信処理は、Teensy4.1が最適です」
ハードウェアシリアルが8本もあって、バッファサイズが自由に設定できるので、1周期のデータ丸ごとバッファに収納できます。
データ量がたまるまでの間は、マイコン側は別の仕事ができます。バッファからのreadは、1msec以内で済んでしまうので、シリアル通信の待ち時間とバックグラウンドの弊害を意識しないで、プログラム作れます、多センサ、無線通信、複数FILEのSdログなど多くの処理を詰め込むことができます。
Teeensyの紹介記事

結局 自由度を求めていくとM5Stackでは不足するのでESP32DevkitCがあれば便利です
自由度は元祖ESP32が最も良くて、M5Stackは、ESP32に各種デバイスを付加してケーシングしたシステムですので、自由に使うと付加したデバイスを減らすか場合によっては、使えないことがあるという理屈です。M5のコンセプトはRapid Prototypingなので想定された用途内で迅速に試作できることが売りのシステムです。
=>ESP32(M5Stack)では、Serial1が存在しているのですがFlashMemoryのGPIOにDefaultで割り付けられています。そのため、私を含めて多くのユーザーはSerial1はどう使えるのか不明でした。
M5社も詳しい説明してないし。元祖Espressif社の仕様書もIO_MUXの表記がややこしくて難解です。
※その後ESP32を使う機会があったのでシリアルをまとめて調査しました。
M5CPUのオリジナルESP32DevkitCのシリアルが使えるピンを調べました(12ピン使えます)詳細記事
それを基に、M5StackCore2のMbusでのシリアルが使えるピンも調べてみました。(8ピン使えます)

※2022年1月追記 IOたくさん使うなら欧米系マイコンTeensy4もお勧めです
<3年後のマイコンはCortex-M7が主流になると思います>
ESP32系はWiFiモジュールとして使うのが良いです、IOT用のマイコンとしては、IOが貧弱で電子工作をしていて壁にぶつかることが多いので、そのような場合は、Teensyをお勧めします。
2022年は、ARM Cortex-M7を使ったTeensy4.1を使うことにしました。ArduinoIDEで、普通に使えるので違和感はないのですが、シリアルが7ポートで更にESP32の6倍速いので、ESP32が鈍速に感じます。普通のSDカード書き込み時間は1msec以内なので、データログに悩みがありません、更に超小型でPro Microサイズなので、電子工作では相当使いこなせます。米国内ユーザーが多いですが、ユーザーフォーラムの皆さんのサポートが非常に良いです。必ずサンプルコードを付けて説明するルールになっているのが凄く助かります
Teensyのカテゴリーはこちらです。http://shinshu-makers.net/shinshu_makers/?cat=5

※2021/7/21 あれもこれもやりたい場合、元祖ESP32なら、自由にSerial1,2のピンアサイン選択できます。Serial1,2接続まとめ表を作りました。Excel保存版です。
ESP32DevkitCのシリアル1,2で使えるGPIO_PIN表作った<12ピン使える>

※どうしてもM5Stackでシリアルを複数使いたい場合
①Qiitaでソフトウェアシリアルを使うやり方を公開されてます。ソフトウェアシリアルのデータ落ちの信頼性を実使用するプログラムで実装評価してから使われたほうがいいです。ハードウェアシリアルだと4σ以下のデータ落ちの信頼性があります。
M5StackではSoftwareSerialを使おう

②不便を覚悟なら、USBシリアルをやめてSerial1として使う手段もありますが、デバッグ作業が非常に面倒な作業になります。(昔のマイコンプログラム作業を思い出す)

※2021年9月追加 シリアル通信初めて4年経過しても、トラブルに遭遇することが多いです。
===============シリアル通信を手のひらに乗せて管理する方法=============================
そこで、シリアル通信をロジアナで観察することで、直観的な理解を深める方法を使い始めました。事例としGNSSチップF9Pからの460800bpsの高速データ出力の解析で使ってみました。オシロが無くてもロジアナがあればシリアル通信は鬼に金棒となります。なんと千円台と格安でアマゾンで購入できます。デバイスからのシリアル通信をプログラムする場合は必携のツールであることが判明いたしました。簡単操作でデータ通信が管理できます。

【RTK21】RTKの無線化その2<Base出力をロジアナで見た>

=======================================================================

 

●M5Stack複数シリアルを使う場合の注意
Arduinoだとハードシリアルは1個しかないので悩まずのソフトシリアルになるのですが、ESP32ベースのM5Stackは、3個シリアルがついています。
しかし、自由に使えるのは、1個しかありませんでした。これを知るのに
2時間くらい浪費しました。ドキュメンテーションがきちんと整備されてないM5Stackの悪さがもろでてきました。これでは、メジャーにはなれません。知らないで終われば、M5Stackは使えないと捨ててしまうところでした。
参考にさせていただいた記事は複数あります。
QIITAの記事:
https://qiita.com/zasshyu6/items/ce6afd3efe71a60ac15c

M5Stackのシリアル1はない:https://boiledorange73.hatenablog.com/entry/2018/11/08/181752

上記記事を理解して備忘録残しておきます。
①M5STACKのシリアル接続の備忘録

CPU
名称
Pgm
名称
GPIO名称  コメント ArduinoIDEでの定義
UART0 Serial0 RX:GPIO01
TX:GPIO03
USBシリアルで使われているので、
USBシリアルを使わない場合は使える
Serial.begin(baurate)
UART1 Serial1 内部SDフラッシュに接続されていて使えないので指定しないこと
UART2 Serial2 RX:GPIO16
TX:GPIO17
唯一自由に使えるシリアルポート Serial2.begin(baurate,SERIAL_8N1,16,17)
config条件とGPIO番号を付け加える

これで結線します。

※Xbeeコネクタの場合は、XbeeのTXはF9PのRXとなります。XbeeのRXがF9PのTXとなるので注意です。

※私の使い方  ーTPOに合わせてCPUを使いこなすー
M5StackではMBUSの制限があって拡張性が劣るので、シリアルポート用途では使いません。M5Stackは、無線通信で、データ収集して、データ表示,ログに使ってます。スマホより小型でプログラムが簡単で、綺麗な画面表示ができるメリットが気に入ってます。下記LINKをご覧いただければM5StickC,M5Atomのほうが拡張性が優れていることが明白です。M5Atom千円ですので、あれこれ迷う前に発注してしまったほうが時間に無駄ないです。
私は、M5Atom lite16個,M5StickC6個,M5StackBasci1個,M5StackCore2 1個体制で電子工作してます。しかし、高速SPIデバイス接続の場合はM5シリーズでは不具合が発生するので、ARMの信頼性あるCPU STM32のNucleoシリーズで対応してます。私は、ESP32は、シビアなデバイスの制御では使ってません。
M5StickCならSeria1,Serial2実験 
M5Atom liteの全ピンUART実験しました。

2021年1月25日追記
しばらくぶりでM5StackのSDカード使っていたら、WEBサーバーへデータをアップロードしてファイル保存する方法のプログラム見つけたので試してみたら結構速くて使えました。M5系からデータをPCへ渡すのにWEBサーバー保管はPCからでもスマホからでもアクセスの汎用性があるので将来性があると思います。まずは、M5StackでWEBサーバーのアップロードする基礎実験して速度を測定してみました。

【M5】M5StackからWebサーバーへ測定データを送信して保管した<115200bps付近の速度出る>

※2020年12月追記
M5StickCでは、Serial1とSrial2も自由に使える仕様になっていることを確認いたしました。M5Stackの出番が減ってきてます。今一番使っているのはM5Atom liteでESP-NOWとシリアル接続です。参考記事保存版作りました。
カテゴリーはM5_ESP32です。

【M5】M5Stick2個間でSerial1-Serial2通信実験<全シリアル網羅>

 

※2020年12月19日追記 この1年半で、M5シリーズStack1個+StickC5個+Atomlite5個で合計11個所有となりました。
シリアル接続とESP-NOWを組み合わる使い方です。最新の接続例をRTK2021カテゴリーに掲載しました。図が判り易いと思います。
F9P RTK始めて1年経過して2シーズン目となりました。SimpleRTK2B heading Kitをもう1セット購入して、F9P4個
体制となりました。スキーの両足でheading測定をするためです。アンテナ2個をスキーの前後のとりつけて、BOXを体にとりつけて、合計アンテナ4個、BOX2個のシステムとなるのでコンパクト化が大きな課題となります。1月からスキー場でフィールドテストを繰り返して両足MovingBase測定でよいデータと動画がとれるかトライしていく予定です。新システムにマイコンは、M5Atomを4個M5Stack1個を使いたいと構想してます。NTRIP接続Wifi用に1個、MovingBase無線出力用に1個で1BOXに2個、合計4個に2BOXから発信されるMovingBaseデータをまとめて受信ログするためのM5Stack1個でマイクロSDにログします。
無線規格はESP-NOWを使いますが、BlueTooth、Xbeeよりエラー率が一桁少なく安定した無線規格です。今回、フィールドで使うのは初めてですが、短距離なので、大丈夫だと思います。接続作業の備忘録です。

【RTK2021】F9P出力にM5ATOM lite をシリアル接続して無線通信<ESP-NOW安定してる>

 

体に装着するには、未だいろいろ工夫しないとダメなので12月いっぱいかかりそうです

➁シリアル2の動作確認プログラム
 シリアル2動作確認のみのプログラムです。USBに接続したTeratermでキーボードから入力した文字をM5.stackとSerial2用のTeratermに表示します。

#include <M5Stack.h>

#define BUFFER_SIZE 256

#define LCDHIGH 240
#define LCDWIDTH 320

void setup() {

// initialize the M5Stack object
M5.begin();

//serial Setup
//serial = GPIO 1,3 USB to UART
//serial1 = GPIO 28,29 connect to SD card reader
//serial2 = GPIO 16,17 Extern I/O pin

//serial default setting,8 data bit,No parity,1 stop bit.
Serial.begin(115200);
Serial2.begin(115200,SERIAL_8N1,16,17);//*******(baudrate,config,RX,TX)*******

// Lcd display setup
M5.Lcd.fillScreen(BLACK);
M5.Lcd.setCursor(0,LCDWIDTH / 3);
M5.Lcd.setTextColor(WHITE);ll

M5.Lcd.setTextSize(3);
M5.Lcd.printf(“Start M5stack!!”);
delay(5000);
M5.Lcd.fillScreen(BLACK);
M5.Lcd.setCursor(0,0);
M5.Lcd.setTextColor(WHITE);
M5.Lcd.setTextSize(1);
}

void errorEnd(){
M5.Lcd.fillScreen(BLACK);
M5.Lcd.setCursor(0,0);
M5.Lcd.setTextColor(WHITE);
M5.Lcd.setTextSize(5);
M5.Lcd.printf(“Buffer over flow!”);
for(;;);
}

void loop() {
unsigned char readBuffer[BUFFER_SIZE];
int serialLength;
boolean ba,bb,bc;
boolean ba_1,bb_1,bc_1;
serialLength = Serial.available();
if(serialLength > BUFFER_SIZE -1)errorEnd();
if(serialLength > 0){
Serial.readBytes(readBuffer,serialLength);
readBuffer[serialLength] = ‘\0’;
M5.Lcd.printf(“%s\n\r”,readBuffer);
Serial2.printf(“%s\n\r”,readBuffer);//*******add*******
}

}

●移動局 NTRIPサーバー受信用プログラムにSERIAL2を追加して動作させました。
左がUSBから出力されているNMEA GPGGAとGPRMCの2個のセンテンスを出力します。
右がSerial2へは、M5StackからのRTCM3受信データが入てきます。

●以後
 これで移動機がcm精度で動作するかFIELDで確認しないとわかりませんのでやってみます。

●M5シリーズ(M5Stack,M5StickC,M5ATOM,SPISFFS,ESP-NOW)の記事全部はここにあります

 

●2020年お盆休み
M5シリーズでSPIFFSの使い方を学習しました。

【M5】M5StickCでSPIFFS動作実験<書き込み遅い16byte/msec>

コメントは下

14 thoughts on “【L-RTK】M5Stack_Serial2接続で手間取った<DefaultではSerial2しか使えない>”

  1. すでにご存知かもしれませんが、Serial1も、Serial1.begin( 0, SERIAL_8N1, 26, 13);の形式でピンを設定すれば、自由に使えます。

    1. 小林様コメントありがとうございます。USBを使わない場合は使えますが、多くの使い方がUSBシリアルでモニターデバッグなどしながらなので、1個しか使えないという表現をしてます。ご指導宜しくお願いいたします。

  2. m5stack BASIC + arduino1.8.9ですが、USBシリアル、シリアル1、シリアル2独立して同時に使えます。

    // Serial.begin(115200); //M5.begin()の中で既に呼ばれていて、2重に呼ぶとハングアップするので呼んではダメ.
    Serial1.begin(115200, SERIAL_8N1,2, 5);
    Serial2.begin(2400,SERIAL_8N1,16,17);

    1. とおりすがり様 コメント有難うございます。同時に使ったことはなかったので、、補足有難うございます。
      早速、記事に2個同時に使えるというコメントがあったと追記させていただきました。有難うございました。
      本記事、M5Stack買ったばかりのころの記事で、今となっては、当り前の話しなのですが、毎日十数人の方が閲覧に来訪されてます。私が初めてシリアル接続したときに苦労したので、自分流の備忘録なので、不備があると思いますので、皆様からのご指摘をいただければ有難いです。当初コバヤシ様からのご指摘があったのに、意味が分からないで、後日記事を作り直した経緯があります。皆様のおかげですので、これからもよろしくお願いいたします。
       余談ですが、現在私は、cm級GPSのシステム作りをしてます。シリアル3個とUSBHOSTシリアル1ポート、I2C2とSPIとてんこ盛りなのでArmCortex-M7搭載のTeensy4.1で処理してます。SD書き込みなど超高速で処理できるので、もうESP32系には戻れなくなってます。
      M5系、ESP32などに、飽きられた方には、面白いマイコンなのでTeensy4.1をお勧めしてます。
      時勢柄、台湾と中国で戦争が起きても、Teensyは、米国製なので入手可能です。
       趣味のDIYページなので、これからも、気楽にコメント宜しくお願いいたします。

       

  3. ZED-F9P とM5Stack Core をI2C用コネクタで接続した場合のArduino IDE のプログラミングのアドバイスをいただけないでしょうか。
    M5Stack に初めて触り,右も左もわからない状態です。
    善意の基準局を用いたRTK-GNSS 測位をしようと考えています。
    もしかしたら、記事内にヒントなどあるかもしれませんが、回答いただけると本当にありがたいです。

    1. EFGの英知 様 コメント有難うございます。信州MAKERS管理人です。
      F9Pのボードは、どこのボードをお使いでしょうか?
      本ブログで使っているSimpleRTK2BボードにはI2Cコネクタはついてません。
      ですので、私は、F9PをI2Cでしか接続したことがありませんので、どうなるかわかりません。
      F9Pの用途を明確にしていただければ、本ブログ内の関連情報をご紹介できると存じます。
       宜しくお願いいたします。
      もし、コメント欄で公開されたくない場合は、メールいただければメールで回答さしあげます。
      dj1711572002@gmail.comでお願いします。

    2. 追伸させていただきます。言葉使い間違っていて失礼いたしました。I2Cはついてないので、使ったことが無いということです。
      F9PはI2Cで使ったほうが、混乱は少ないかと想像してますが、I2Cならではのトラブルが発生するのではないかと思います。
      例えば、I2Cケーブルを長くすると干渉ノイズなど注意が必要です。
      M5Stack Core2を使ってRTK無線ロガーを作ったことがあります。ESP-NOWで無線受信するロガープログラムはサンプルはございます。
      I2Cではないので、シリアル受信部分を書き換えないといけません、更に、通常のRTKではなく、MovingBaseで使ってますので、F9P2個分のデータ処理してます。
      ですので、一般的なRTK用途と違うプログラムになってます。
      こちらが記事のリンクです。t.ly/-qSS
       RTKの開発は相当手間と時間がかかりますので、年単位を覚悟されてのぞまれるとよいと存じます。
      何かありましたら、お気軽にお声がけください。

      1. 信州メーカー 様

        返信誠にありがとうございます。
        F9Pのボードは、株式会社ジオセンスのF9PX1 を使用しております。
        代表取締役の小林様に確認したところ、I2CでM5stack と接続すればハード面での接続は問題ないとのことだったので、Arduino IDEにTiny GSM をインストールし、プログラミングやRTK-GNSS の理解を深めようとしておりました。
        ただ、恥ずかしながら、プログラミングもC言語を講義でやって以来触れていなかったので、このようにコメントを送らせていただきます。

        1. EFGの英知 様
          小林様のところの製品をお使いでしたか、本記事について、以前小林様からご指導をうけて、現在の形に修正した経緯があって、当サイトとしても、先生にあたる方です。やリたいコトを明確に決めて、小林様に投げてみれば、何等かのアドバイスを頂けると存じます。信州MAKERSに限らず、関係のありそうなところに、ご自分のやりたいコトを遠慮なく投げかけて、それぞれからの回答を参考にして、実現方法を検討すればよいと思います。まず、コト作りからスタートすれば、間違いはありませんが、モノ作りからスタートすると、途中で挫折したり失敗したりしますので、強くコト作りをお勧めします。信州MAKERSでは、コト作りから出発したモノ作りを提唱しております。コト作りをしっかりしておかないと、使うデバイスの選択を誤ることがよくありますので、RTKでなければできないコトなのか、他のテクノロジーで可能なのではないかというところをしっかりと検証してから進められると良いと思います。そういうアプローチを若い頃からやっておけば、社会人になっても、出来る技術者になれます。
           頑張ってください。
          ※当サイトは、プログラム初心者の読者がほとんどです。他の専門分野をお持ちで、自分でプログラムを作りたい方が来訪されてます。昨今のリスキリングブームで、プログラム学習系のアクセスが増えてますがchatGPTで結構使えてしまうので、まずは、chatGPTで、サンプルプログラムを作ってもらえばいいと思います。F9Pの専門的な部分は、chatGPTでは、無理なので、WEB検索で自作する以外にありません。

          1. 信州MAKERS 様
            技術をどうやって進歩させているかがよくわかる素晴らしいアドバイスを誠にありがとうございます。
            RaspberryPi でRTK-GNSS をすることはできたので、同じことをM5Stack でやろうとしたのですが、研究はRaspberryPiでも可能なので、そちらと平行して進めていこうと思います。
            M5Stack の参考書を購入したところ、GPSモジュールを使用したサンプルプログラムがあったので、それらを熟読して学ぼうと思います。
            連日にわたる連絡本当にありがとうございます。

  4. 信州MAKERS 様

    様々なアドバイス誠にありがとうございました。
    その後、I2C ではなく、ジャンパコードでF9PX1 の基盤とM5Stack のBUSを直接つないで、株式会社ジオセンスが公開されているM5F9P のオープンファームウェアを使用することで、M5stack でのRTK-GNSS ができるようになりました。
    管理人様のアドバイス無しではおそらくできなかっただろうと思います。
    いつも有益な情報が掲載されており、いつも参考にしております。

    1. EFGの英知 様
      ご連絡有難うございます。
      迅速に接続できて良かったですね。
      F9PX1という基板初めてしりました。ご紹介いただいて有難うございます。
      ジオセンス様もご商売が拡がっていてよかったです。
       スタンドアローンで使うには、M5Stackが一番コンパクトでまとまると思います。
      開発活動、頑張ってください。

  5. 信州MAKERS 様

    度重なる連絡誠に失礼します。
    以前の連絡後、M5stack 用とF9PX1 用のヘッダピンをそれぞれ購入し、接触不良が起きないようにしたのですが、接触不良が起こってしまい、オープンファームウェアでF9P が認識されていない状態になってしまいました。

    こちらのブログでもジャンパコードを用いてM5StackとF9P基板を接続されているので質問なのですが、
    接触不良対策はどうされているのでしょうか。

    お手数をおかけしますが、回答いただけると大変幸いです。

    1. EFGの英知様
      F9PX1について当方全く知らないので何ともいえませんが、オープンファームウェアとは
      何のソフトでしょうか?状況がよくわからないのですが、接触しているかは、テスターであたって
      導通をみればわかります。信号がきているかはオシロであたって確認することもあります。
      更に信号がでていてもおかしいときはロジアナで信号を解析します。
      プラスとGNDだけは接触させてはいけません、一瞬でF9P壊れて修理不能になります。
      ピン同士のショートは、何等かの故障が発生しますので、絶対避けてください。
      通常のF9Pでのやり方は、下記です。
      UcenterでF9PとUSB接続はできるのでしょうか?
      Ucenterと通信できるかできないかで、F9Pが故障しているか、どうか判ります。
       USBでもシリアルでも全く通信ができない状態なら、ファームが壊れているので
      回復作業が必要です。回復方法はこちらのページをご覧ください。
      t.ly/FLvC5
      t.ly/nqzE
       

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です