2月前半までSOFTBANK ALES様のテスト用アカウントをお借りして、プログラムの変更と現地測定準備してます。
ALES接続用システムM5StickCで組んでます。善意の基準局などとの違いは、ハンドオーバーという手続きがあります。自分の位置であるGGAセンテンスをALES NTRIPサーバーへ1秒に一回送信して、現在位置でのマウントポイントを特定してそこからのRTCM3を受信できるようにする操作があります。
※注意:本記事NTRIPレシーバーを自作したことがある方が、ALES接続する場合を前提にしてます。NTRIP受信初めての方は、いきなりALES接続は無理ですので、まずは、ArduinoでF9Pのバイナリー出力を受信して解読するプログラムから初めて、F9Pのマイコン接続に慣れてからやらないと、無理だと存じます。Alesでは、スマホからBlueTooth経由でRTCM3を流すアプリ用意してますので、BlueToothをマイコンで受信するか、F9PにBlueTooth受信モジュールを搭載させれば可能です、ALESにお問い合わせください。
※2022年春でALES解約しました。
長野県に2か所善意の基準局ができたので、それで、精度がでるのでALES不要となりました。50km圏内に基準局が無いかたは、自分で基準局を作ったほうがALESより安上がりです。SimpleRTK2Bセットが3万円以下ですので、ALES一年分で基準局ができてしまうので、何年も使えば数十万円のコストダウンになります。
※2021年5月1日追記
4月1日からALES契約して、がんがん使ってます。上越市新井のLOTTE ARAIスキーリゾートに通ってスキーターンアナライザ(STA)の実験をしてますが、ふもとでALES GGAA接続したら山頂でもAcc2d=14mmと最高精度がでてます。松本市で使っている善意の基準局だと50,mm前後まで落ちるので、やはり10km圏内に基準局が用意されているSOFTBANK ALES NTRIPサービスは最高精度を与えてくれます。スキーの場合、静止状態で14mmでていても、滑走中30mm前後まで精度が低下しますので、静止状態で50mm前後だと滑走精度は100mm近くまで低下して、測定精度が落ちるので、ALESサービスが必須となります。
■GGAの扱い方を決めた
●ALESサービスの場合のハンドオーバー有無の選択
ハンドオーバー無し・固定というモードがあります。これは、通常ハンドオーバーは1秒に一回GGAを送信するのですが、ある狭い範囲で移動するだけならログイン時に1回GGAを送信すればいいマウントポイントが用意されてます。
これだと、今まで使わせていただいていた、阿久津様作のNTRIP-client-for-Arduino-masterライブラリーにGGA送信文を数行追加するだけでALESハンドオーバー無し・固定接続対応用ライブラリーとなります。
※1秒に一回GGAを送るプログラム難易度が高いので、2021年夏以降に検討します。
●ALES用にライブラリーパッチ変更
私は、プログラムは自己流素人なので、人様に正式配布してもご迷惑をかけるかもしれませんので、半完成状態でしか公表してません。動作保証、信頼性評価などはしてませんので、ご参考程度にしていただければ幸いです。昨年、試用でALESサーバーへ接続したときの記事内で公開した
ライブラリのパッチ部を今回仕様変更いたしました。
①変更点
変更理由:GGAを変数として、各所(GPS,WEB入力、手入力)から受け取る場合GGAの末尾処理が
①CR+LF付の場合
②CR+LF無しの場合
②0x00付の場合
●ライブラリーの変更点 |
変更前:print(gga+ String(“\r\n”));//gga文字列配列+CRLFをいれてあるのですが、
変更後:print(gga);//gga文字列配列名内にCRLFをつけて定義することに変更 |
●ArduinoIDEのsetup()内のgga変更点 |
Arduinoプログラム serup()内のggaの定義 変更前:末尾は何もつけてない char ggac[]={“$GNGGA,124733.13,3612.xxxxx,N,13756.yyyyy,E,4,12,0.80,608.5,M,36.7,M,0.1,0000*6C”}変更後:末尾に\r\n(CRLF)をつけた char ggac[]={“$GNGGA,124733.13,3612.xxxxx,N,13756.yyyyy,E,4,12,0.80,608.5,M,36.7,M,0.1,0000*6C\r\n”} |
●GGAのフォーマット
GGA正規フォーマットのマニュアルは下記PDFの10ページにあります。
https://www.sparkfun.com/datasheets/GPS/NMEA%20Reference%20Manual-Rev2.1-Dec07.pdf
最後尾がCRLFで終わっているところまでが正規のフォーマットですので、その形にして
ライブラリーに渡す仕様のほうが将来的に整合性がいいと考えて変更しました。
注意1)文字列総数が場合によって変わります、79文字の場合81文字の場合など
数文字違ってきますので、文字数で末尾は抽出できません。私の場合は
チェックサムの‘*’文字を目印にセンテンスの末尾を抽出してます。
■GGAをプログラム内で保持するためにSPIFFSを利用
M5StickCのFLASH内のGGA.txtという名前のGGAセンテンスを書き込んだファイルを用意します。(SPIFFS用の命令をteratermで手書きするやり方APPENDIXへ)
●ArduinoIDEプログラムの変更
変更点1:GGAをSPIFFSファイルから読み込む
数種類の末尾処理でGGAが渡される可能性があるため、どんな末尾処理でも対応できるような処理プログラムにしました。
ArduinoIDE メインプログラムのsetup()内で、GGA正規フォーマットへ編集しなおす処理を追加しました。
setup内の追加部分
「SPIFFSを使ってFLASHにあるfile_name= “/GGA.txt”;を読んで、GGAc[]文字列配列へ格納する」
char file_name[10] = “/GGA.txt”; File file = SPIFFS.open(file_name);//ファイルOPEN if(!file || file.isDirectory()){ //OPENできたかチェック Serial.println(“- failed to o pen file for reading”);//OPENエラー return; } Serial.println(“- read from file:”); while(file.available() && endFlag==0 ){//endFlagで強制的にファイル読み込みを離脱する char c=file.read();//ファイルから1文字読み込みif(c==’*’) //CheckSumの*マークから末尾処理 { GGAc[i]=c;//Add ‘*’ i番目に’*’を入力 GGAc[i+1]= file.read();//i+1番目を読み取りチェックサムの上位1文字入力 GGAc[i+2]=file.read();//i+2番目を読み取りチェックサムの下位1文字 GGAc[i+3]=’\r’;//CR制御文字を入力 GGAc[i+4]=’\n’;//LF制御文字を入力 endFlag=1;//GGAc文字列配列が完成したのでwhileループ終了フラグ上げる } else//チェックサム印がでてくる前まではGGAc[]へセンテンス文字入力 { GGAc[i]=c;//i番目に文字cを入力 } i++;//カウンタインクリメント }//確認のためプリント Serial.print(“GGAc size=”); Serial.println(sizeof(GGAc));//GGA文字数表示 Serial.print(“**********Check GGAc Array************”); for (i=0;i<83;i++) { Serial.print(i); Serial.print(“:”); Serial.println(GGAc[i]); } Serial.println(“———GGAc read Finished from SPIFFS GGA.txt——————“); file.close();//GGA.txt close |
●プログラムソース
ALES NTRIP接続してRTCMデータをSerial1とSerial2へ2分配してます。
2セットのF9PへRTCMを流せます。
注意:F9PへのRTCM送信は、ちょっとしたタイミングでNORTKになります。送信LOOP内に
print行を1行加えるだけでNGになる場合がありますので、できるだけシンプルにします。
RTCMの送信に関するトラブル解析記事はこちらです。
概仕様1:接続に必要なデータ
ご自分のWiFi IDとパスワード、ALES契約後教えてもらえる
URL、マウントポイント名、userID,パスワード
概仕様2:定数値としてGGA供給
ggac[]文字列変数では、プログラム内で定義してあるGGAセンテンス
SPIFFSを使わない場合はライブラリーへはggacを送ればよいです。
概仕様3:SPIFFSからGGA供給
GGAc[]文字列変数は、SPIFFS内で保存されているGGA.txtファイル内に書き込んである
GGAセンテンス
概仕様4:SPIFFSでFLASH内にGGA.txtファイルを作成する方法
本ププログラム末尾にSPIFFSエディタ機能が組み込んであります。
「ALES_M5Stick_ALES_DEMO_Acount_GGA_GPS-SPIFFS__rev002.ino」
下記APPENDIXで使い方解説
https://gist.github.com/dj1711572002/053830ae9eb535caf1424cabe7be28f1
————————————————————————————————–
■APPENDIX SPIFFSをTeraTermで編集する
ESPRESSIFのSPIFFSのサンプルPgmを1文字キーイン入力でRead,Write,List,できるようにしました。
GISTに置いてあるALES用プログラムをM5StickCに書き込んでから、USB接続するとTeraTermに接続してLキーインすると、SPIFFSのリストでてEDITOR機能が動作します。
注意)プログラム開始順は、WiFi接続してNTRIP接続開始しますので、接続に必要なデータを入力済みでないとRTCM受信機能は動作しませんが、SPIFFS編集機能は、動作しますので、SPIFFSの練習用に使えます。
機能 | 操作 |
List | LキーインしてリターンでSPIFFS内のファイルリストがでる |
Read | RキーインしてリターンするとLキーと同じリストが表示される、ファイルNoの数値をキーインしてリターンするとファイルの中身を表示する |
Write | Wキーインしてリターンするとファイル名を聞いてくるので、短いファイル名をキーインして、最後にピリオド.をいれるとファイル名が確定します。次に、ファイルの中身のデータ入力を聞いてくるので、GGAセンテンスをPCからコピーして貼り付けます。TeraTermでコピペのタイミングがわかりずらいですが、マウス右クリックでペースト指定でもキーボードでCTRLVでもペーストできます。 本プログラムでは、GGA.txtという名前のファイル名を付けますが、txtは自動でつくのでGGAと3文字を入力して最後にピリオドをキーインすればOKです。GGAセンテンスの末尾にCRLFがついてなくても、0x00がついていても、何もついてなくても、本プログラムで正規センテンスに整備するので大丈夫です。 |
Delete | DキーインしてリターンするとLキーと同じリストが表示される、ファイルNoの数値をキーインしてリターンするとファイルが消去されます。 |
おまけ機能 U |
コメントアウトしてありますが、WEBサーバーへファイルをアップロードする機能もおまけでついてます。これは未だ完全動作してないので、コメントアウトしてますが、使いたい方はこちらの記事を参考にして使ってみてください。 |
下記画像でTeraTermでGGA.txtをReadして中身が表示されてます。