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

表題jpgファイル
M5StackでWIFI接続で取得したCQ出版のNTRIP casterからのRTCMデータをGNSSチップF9Pにシリアル送信するプログラム作りましたがSerial1が動かなくて手間取りました。M5Stackは、Serial2しかデフォルトでもってませんでした。それを知るのに、
半日かかってしまいました。ESp32系は、シリアル通信にあまり重きを置いた仕様になってない感じがします。
※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>

コメントは下

4 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ページなので、これからも、気楽にコメント宜しくお願いいたします。

       

コメントを残す

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