title0a.gif

Memorandumの小部屋

 

本ページは金銭授受を伴う行為を含むAuctionや商用Web Pageからの無断リンク・無断参照を禁じます。
無断リンク・無断参照が判明した時点で然るべき処置をとらさせて頂きます。


まるごとNMEA Arduino編

 

 このWebページはArduinoを用いてGNSSロガーを試作した経緯を記録として残した個人的なメモです。  なお、このWebページ作成以降、特定の測位システムを意味する「GPS」は必要時以外は使用せず、ローバル軌道衛星群を意味する「GNSS」を使用することにしました。

 文中の一部の用語は下記を意味します。


− 目次 −

1.はじめに

2.プロトタイプ1の製作

3.プロトタイプ2の製作

4.GNSSロガー「まるごとNMEA」の製作

5.サンプルスケッチHEXファイル書き込み方法

 5.1 「ATMEL AVRISPシステム・プログラマー AVRISPmkU」の利用

 5.2 Arduino UNO R3(互換機)の利用

 5.3 Pickit4の利用

6.SDカード書込みの影響

7.結論


1.はじめに

 「GSU−140型GNSS評価キット」の動作確認ではノートパソコンを利用していましたが、パソコンを用いるため可搬性は決してよくありませんでした。 また、起動時にロギング開始に関わるコマンド指示も必要でした。  、一般的に入手できるGNSSロガーのように通電即ロギング開始というわけではなく、多少扱い辛い製品でした。 このため、そのうち「GSU−140型GNSS評価キット」専用のGNSSロガーを製作しようと思っていました が、約3年経過してやっと着手しました。

 「GSU−140型GNSS評価キット」の動作確認ではNMEAセンテンスを全て保存して、ロギング終了後に細かい受信状態分析をしました。 NMEAセンテンスデータをロギング後に扱うことで、今までの位置情報だけでは無く受信状態も含めて分析でき結構使い物になるとの印象を持ちました。 また、従来のGNSSロガーでは測位データを抽出するプログラムに汎用性が無く、新たなGNSSモジュールを扱う度に測位データ抽出用プログラムを改造して、とても見通しの悪いアルゴリズムになりつつありました。 これらの背景から、次回GNSSロガーを製作する際には測位データ抽出用にプログラム改造の可能性が少ないと思われるNMEAセンテンスを全て記録するプログラムにすることにしました。

 NMEAセンテンスを全て記録するとなるとデータ量がすぐにMBytesオーダとなります。 この対応として記録媒体はSDカードにすることにしました。 SDカードを用いるとロギング後のデータ分析に用いるパソコンとの親和性もよいとの思いもあります。

 GNSSロガーのプラットフォームとしては、PICマイコンでも対応できそうでしたが処理能力が高く入手性の良い小型マイコンボードを利用することにしました。 小型マイコンボードのなかでも、初心者にとって開発ツールが使いやすく、開発ツールの情報量の多い( 年配者にとって最も壁の低そうな)Arduino IDEを用いることにしました。 ということで、取りかかりの小型マイコンボードとしてAruduino UNO R3を使うことにしました。 具体的にはArduino UNO R3互換機として「びんぼうでいいの (U3R)」もしくは必要最小限ハードウエア「あちゃんでいいの」を利用することにしました。

 さあ、GNSSロガーの製作開始です。

 

2.プロトタイプ1の製作

 GNSSロガーの機能として必要となる「SDカードへの書き込み」、「シリアルポートを用いたデータ送受信」や「開発環境Arduino IDEとの接続」 の練習・習得を目的にGNSSロガープロトタイプ1を試作しました。

 試作目標として、「GSU−140型GNSS評価キット」との「シリアルポートを用いたデータ送受信」を行いNMEAセンテンスを受信して、「SDカードへの書き込み」ができることを確認できることとしました。

 ハードウエアは、Arduino UNO R3互換機として必要最小限のハードウエアである「あちゃんでいいの」、SDカードは広く出回っている「Micro SD TFカードメモリシールドモジュール (MicroSD Card Adapter)」」用いました。 シリアルポートはArduino IDE用のPC_SerialとGNSS用のGNSS_SerialをスイッチSW2で切り替えています。 ソフトウエアシリアルポート(PD1:PIN3・PD2:PIN4)は、デバッグ用にプログラム 実行状態を表示するモニタ用シリアルポートとして利用しています。(回路図には未記載です。) また、「GSU−140型GNSS評価キット」用の3.3Vdc電源回路も設けました。

 プロトタイプ1の回路図、外観を下記に掲載します。

 

上記回路図をクリックすると原寸大の回路図をダウンロードできます。

【 プロトタイプ1 回路図 】

 

【 プロトタイプ1 動作確認状態(全体外観) 】

 

【 プロトタイプ1 動作確認状態(ブレッドボード部外観1) 】

 

【 プロトタイプ1 動作確認状態(ブレッドボード部外観2) 】

 

 プロトタイプ1のハードウエアを用いてArduino IDEによるSDカードのアクセスプログラムと、「GSU−140型GNSS評価キット」電源投入時の初期設定用コマンド実行プログラムの作成と動作確認をしました。

 「GSU−140型GNSS評価キット」電源投入時のシリアルポートの通信速度は115200bpsとなります。 「GSU−140型GNSS評価キット」電源投入時の初期設定用コマンド実行プログラムでは、受信方法設定やロギング時のシリアルポート通信速度(今回は9600bps)への変更コマンドを実行するプログラムを作成しました。 このプログラムを用いて「GSU−140型GNSS評価キット」が出力するNMEAセンテンスをSDカードに書き込むプログラムの作成・動作確認をしました。

 

3.プロトタイプ2の製作

 プロトタイプ1でGNSSロガーとしての基本的な機能確認がきましたので、次にGNSSロガーとしての操作を含めた機能全般を確認するプロトタイプ2の試作を行いました。 基本的な操作・機能は「電池ボックス電子工作(その21) 一体型いつどこGPSロガー9(電池内蔵タイプ)」をベースにしました。  実際にはプロトタイプ2を製作しながら機能仕様を決めていき、機能(概要)を下記のように決めました。 なお、具体的な仕様は次の節に記載します。

 

上記回路図をクリックすると原寸大の回路図をダウンロードできます。

【 プロトタイプ2 回路図 】

 

【 プロトタイプ2 動作確認状態(全体外観1) 】

 

【 プロトタイプ2 動作確認状態(全体外観2) 】

 

【 プロトタイプ2 動作確認状態 (操作部ユニバーサル基板外観) 】

 

 オンボードでブートローダを書込む際に利用しました。 それ以外はArduino IDE環境下での利用となりましたので、ICPSコネクタはほとんど利用する機会はありませんでした。

【 プロトタイプ2 「ATMEL AVRISPシステム・プログラマー AVRISPmkU」接続時 】

 

4.GNSSロガー「まるごとNMEA」の製作

 プロトタイプ2をベースにしてGNSSロガー「まるごとNMEA」の製作に着手しました。

 

【 GNSSロガー「まるごとNMEA」回路図 】

 

項  目

仕  様

電源電圧

5Vdc (TB3からの給電)

消費電流

消費電流は利用するSDカード、GNSSモジュールにより異なります。

GM−5157A」・SDHC32GB接続時約50mAでした。

GNSS
供給電源

3.3Vdc及び5Vdc。

GNSS
シリアルポート
通信速度

4800bps、9600bps、19200bps、38400bps、57600bps、115200bps

(接続とロギングを確認したのは4800bps、9600bpsのみ、接続のみ確認したのは115200bpsのみです。)

GNSS
信号レベル

JP1設定 : 3.3Vレベル/5Vレベル

GNSS用
バックアップ電源

外部より供給可能です。 (端子のみ準備。 必要に応じて電池接続。)

SDカード

FAT16もしくはFAT32。

マイクロSDカードもしくはマイクロSDHCカード。 (最大32GB)

できる限り高速書き込みができるクラスの製品が望ましいです。 今回の動作確認にはCLASS10を利用しました。

タクトスイッチ
SW1

スイッチを押すごとにLED表示、ブザー発音有無を順次切り替えます。 (Step1→2→3→4→1→2→…)
 

 

Step

LED表示

ブザー発音

有り

有り

有り

無し

無し

有り

無し

無し

  

タクトスイッチ
SW2

約3〜5秒連続押すことでロギング終了します。 (SDカードアクセス停止)

スライド
スイッチ
SW3

SW3をオンする(PD4:LOWレベル)ことで、GNSSのTXデータをTB1のPC−Monitorから出力します。 PC−Monitorはスケッチデバッグ用に設けた機能です。 ソフトウエアシリアルを利用しているため、ロギング中はオンすることを避けることが望ましいです。

LED表示

ブザー発音

 

状態

LED/ブザー

電源
投入時

時間

0.3s

 

0.3s

 

0.3s

 

0.3s

 

0.3s

 

0.3s

 

0.3s

 

0.3s

LED

赤色

消灯

緑色

消灯

青色

消灯

全色(白)

消灯

ブザー

5kHz

 

消音

 

5kHz

 

消音

 

5kHz

 

消音

 

5kHz

 

消音

ロギング
終了時

下記の繰返し

時間

0.5s

 

0.5s

LED

全色(白)

消灯

ブザー

消音

 

消音

SDカード
未検出時

下記の繰返し

時間

0.5s

 

0.5s

LED

赤色

消灯

ブザー

消音

 

消音

測位表示

測位表示期間(次行参照)のLED表示とブザ−発音

時間

測位不可/
2次元測位

3次元測位

3次元測位/
QZSS衛星(みちびき)補足

LED

赤色

緑色

青色

ブザー

2kHz

4kHz

5kHz

 

測位表示
期間

測位表示期間はGNSSモジュールの初期設定ルーチンで設定しいます。 測位表示期間はセンテンスの種類で開始と終了を判断しています。 

GNSS種別

開始センテンス

終了センテンス

確認済みGNSS

4800bps

初期設定無し

GGA

GSA

GM−318B

9600bps

初期設定無し

GGA

GSA

GR−A013U(GM−A013R)

GM−5157A 

GSU−140型GNSS評価キット

専用初期設定有り

GLL

GSA

GSU−140型GNSS評価キット

備考

 当該のセンテンスを受信できない場合は、測位表示しない、もしくは、測位表示はするが表示終了しない現象が発生します。 この設定はスケッチの設定を変更することで変えることができますが、公開版スケッチでは上記設定のみとなっています。

 「GSU−140型GNSS評価キット」の初期設定では測位する衛星システムを「GPS」+「QZSS L1S」を選択しています。

 

公開版

スケッチ

公開版サンプルスケッチです。 ブートローダ無し版とブートローダ有り版の2通りを公開します。  hexファイルの書込み方法は後述しています。

GNSS種別

項目

サンプルスケッチ / ヘッダ文字列

4800bps

初期設定無し

ブートローダ無し

jsk90n3.hex

ブートローダ有り

jsk90n4.hex

1行目ヘッダー文字列

GNSS_Log_r07b GNSS 4800bps / SD Buffer 128bytes

【 GM−318B ロギングデータ例 】

 

9600bps

初期設定無し

ブートローダ無し

jsk90n1.hex

ブートローダ有り

jsk90n2.hex

1行目ヘッダー文字列

GNSS_Log_r07a GNSS 9600bps / SD Buffer 128bytes

 

【 GM−5157A ロギングデータ例 】

 

GSU−140型
GNSS評価キット

専用初期設定有り

ブートローダ無し

jsk90n5.hex

ブートローダ有り

jsk90n6.hex

1行目ヘッダー文字列

GNSS_Log_r07c GSU-140B-102 115200 -> 9600bps / SD Buffer 128bytes

【 GSU−140型GNSS評価キット ロギングデータ例 】

 

  

格納ファイル

格納ファイル名は「GNSS」+「000」を開始番号とした追番号+拡張子「.LOG」となります。

例 GNSS000.LOG → GNSS001.LOG → …

格納ファイルの1行目にヘッダー文字列を格納します。

 

 「GM−318B」を接続してロギングした際の全体外観です。 左側から2番目はArduino IDE接続用のUSBシリアル変換「DTRピン付きUSB−TTLコンバータ (U2TL340-6P)」です。 左側から3番目がシリアルポートスイッチ基板です。

【 GNSSロガー「まるごとNMEA」 全体外観1 】

 

【 GNSSロガー「まるごとNMEA」 全体外観2 】

 

【 GNSSロガー「まるごとNMEA」 基板外観1 】

 

【 GNSSロガー「まるごとNMEA」 基板外観2 】

 

【 GNSSロガー「まるごとNMEA」 基板外観3 】

 

【 GNSSロガー「まるごとNMEA」 基板外観4 】

 

【 GNSSロガー「まるごとNMEA」 基板外観5 】

 

【 GNSSロガー「まるごとNMEA」 基板外観6 】

 

 「Micro SD TFカードメモリシールドモジュール 」を取り外した基板外観です。 「Micro SD TFカードメモリシールドモジュール 」を接続するコネクタ(右下側黒色1列ピンソケット)は秋月電子通商の「シングルピンソケット (低メス)」を利用しました。

【 GNSSロガー「まるごとNMEA」 基板外観7 】

 

 「Micro SD TFカードメモリシールドモジュール (MicroSD Card Adapter)」のピンヘッダは当初のL型ピンヘッダを取り外してストレートのロープロファイルピンヘッダ(低オス)を利用しました。 ピンヘッダ交換作業に際してVCCラインのパターンを傷付けたため、電線で補修しています。 パターンの断線に気付かず、 GNSSロガー「まるごとNMEA」立上げに際して丸1日悩んでしまいました。

【 GNSSロガー「まるごとNMEA」用 SDカード基板外観1 】

 

【 GNSSロガー「まるごとNMEA」用 SDカード基板外観2 】

 

5.サンプルスケッチHEXファイル書き込み方法

 今回もスケッチ(プログラム)のソースを公開していませが、コンパイルしたhexファイル を公開しています。 Arduino UNO R3(互換機)にhexファイルを書込む方法はWebで沢山公開されていますので、それらを参照していただければと思います。 本WebページではGNSSロガー「まるごとNMEA」のCN1コネクタを介したhexファイル書込み例を掲載します。 

 

5.1 「ATMEL AVRISPシステム・プログラマー AVRISPmkU」の利用

 hexファイルの書込みは専用のプログラマを利用するのが最も簡単な方法です。 ICSP接続できるプログラマは「ATMEL AVRISPシステム・プログラマー AVRISPmkU」の他に比較的安価な(1,000円以下)プログラマも多く販売 されているようです。(純正品・メーカ品以外のプログラマは使用できるかどうか不明です。)

  hexファイルはプログラマをICSP用コネクタ(SDカード接続コネクタと兼用:排他利用)に接続して書き込みます。 プログラマとしては「ATMEL AVRISPシステム・プログラマー AVRISPmkU (M-02582)」を利用するのが最も簡単です。 (参照 「にわとりたまご! Arduino用ブートローダの巻」)
 書込みツールとしてはMicrochip Studioを利用しました。 参考となる書込み手順はMemorandumの小部屋の「にわとりたまご! Arduino用ブートローダの巻」を参照願います。

 

上記回路図をクリックすると原寸大の回路図をダウンロードできます。

【 「ATMEL AVRISPシステム・プログラマー AVRISPmkU」〜まるごとNMEA 接続回路 】

 

 SDカード基板を取り外して「ATMEL AVRISPシステム・プログラマー AVRISPmkU」を接続してブートローダを書き込んでいます。

【 AVRISPmkU接続時外観 】

 

【 Microchip Studio Device Programming 設定画面 】

 

5.2 Arduino UNO R3(互換機)の利用

 AVRISPmkUの代わりとして、Arduino UNO R3(互換機「びんぼうでいいの (U3R)」)をプログラマとして利用できます。 「びんぼうでいいの (U3R)」をArduino IDEに接続して、メニューバー「ファイル」→「スケッチ例」→「11.ArduinoISP」を ロードして書き込みをします。 参考となる書込み手順はMemorandumの小部屋の「にわとりたまご! Arduino用ブートローダの巻」を参照願います。 

 

上記回路図をクリックすると原寸大の回路図をダウンロードできます。

【 Arduino UNO R3(互換機)〜まるごとNMEA 接続回路 】

 

【 「びんぼうでいいの (U3R)」接続時外観1 】

 

【 「びんぼうでいいの (U3R)」接続時外観2 】

 

【 「びんぼうでいいの (U3R)」接続時外観3 】

 

 書込みツールとして、コマンドプロンプトもしくはPowerShell上からavrdude.exeを利用します。 一例としてドライブE:¥avrdudeフォルダー下にavrdude.exe、avrdude.confおよびhexファイルを格納したときの書込み例を示します。

 

【 関連ファイル格納例 】

 

「avrdude.exe」によるjsk90n2.hex書込み例

PS E:\avrdude> .\avrdude -c avrisp -P COM11 -b 19200 -p m328p -U flash:w:jsk90n2.hex:i

avrdude.exe: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.03s

avrdude.exe: Device signature = 0x1e950f (probably m328p) avrdude.exe: NOTE: "flash" memory has been specified, an erase cycle will be performed To disable this feature, specify the -D option. avrdude.exe: erasing chip avrdude.exe: reading input file "jsk90n2.hex" avrdude.exe: writing flash (32768 bytes):

Writing | ################################################## | 100% 21.55s

avrdude.exe: 32768 bytes of flash written avrdude.exe: verifying flash memory against jsk90n2.hex: avrdude.exe: load data flash data from input file jsk90n2.hex: avrdude.exe: input file jsk90n2.hex contains 32768 bytes avrdude.exe: reading on-chip flash data:

Reading | ################################################## | 100% 12.04s

avrdude.exe: verifying ... avrdude.exe: 32768 bytes of flash verified

avrdude.exe: safemode: Fuses OK (E:FD, H:DE, L:FF)

avrdude.exe done. Thank you.

PS E:\avrdude>

 

 「-P COM11」はArduinoISP化されたArduino UNO R3(互換機)のシリアルポートを指定するオプションです。 利用する環境に合わせて変更 する必要があります。

 

 

5.3 Pickit4の利用

 Arduino関連の資料を調べている最中に、ATmega328Pを「PICkit4」で書込みできるとの記載を見つけました。 早速、hexファイル関連の操作時に利用しているMPLAB IPE V6.05を立ち上げると「devaice」選択中に「ATmega328P」を見つけました。  今までこれには気付きませんでした。 早速試したところ、書込みができることを確認できました。 なお、ツールとしてはhexファイルなどの操作を直感的に操作し易いMPLAB IPE v6.05を利用しました。

 

【 「PICkit4」 接続回路 】

 

【 「PICkit4」 接続時外観1 】

 

【 「PICkit4」 接続時外観1 】

 

【 MPLAB IPE V6.05 書込み完了時画面 】

 

 MPLAB IPE V6.05で「Program」を正常終了した後に「Verify」を実行すると「Verify failed, in [Cfg] at offset 0x820000: expected 0x00000062 was 0x000000ff」のエラーメッセージが表示されることがありました。 この原因はConfiguration BitsのFUSE LOW Byteのデフォルト値0x62とデバイスの値が異なるのが原因のようです。 MPLAB IPE V6.05ではConfiguration Bitsの編集はできませんので、このエラーメッセージは無視することとしました。 Configuration Bitsの編集は「ATMEL AVRISPシステム・プログラマー AVRISPmkU」もしくはaavrdude.exeを用いることで可能です。

 

【 デフォルト時 Configuration Bits 】

 

【 デバイスRead時 Configuration Bits 】

 

6.SDカード書込みの影響

 前記のhexファイルでは、SDカードへの書込みタイミングはGNSSロガー受信データが128バイトを超えた時点です。 この数値は適切な値とは限りません。 スケッチ作成当初の スケッチサイズが小さい頃は256バイトでもSDカードへの書込みができていましたが、スケッチサイズが増えるにしたがってこの数値を小さくしないとSDカードへの書込みができなくなり、 本Webページ公開時点では128バイトにせざるを得なくなりました。(RAM空きスペースの問題のようです。)

 また、1時間程度の短時間 のロギングではほぼ欠落無くGNSSモジュールからの受信データを書込めていましたが、連続動作確認で20時間程度を超えるほとんどまともに格納できない現象が生じました。 この原因を調べたところ、ファイルサイズに比例してSDカードへの書込み時間が長くなり、GNSSモジュールからの受信データがバッファオーバーフローしているようでした。 一例として、「GSU−140型GNSS評価キット」のNMEAセンテンスを約100万行 (約30時間)受信した付近の「まるごとNMEA」で記録できた受信データのログを下記に掲載します。

 

 左列の数値がNMEAデータ中の区切りコード(正常時は復帰改行)で改行したときの行数です。 100万行目の数値は000000となっています。

【 約65MB付近の格納データ 】

 

 受信データが欠落したため本来は複数行であるべきデータが1行として認識されたり、メッセージID(GGA等)が破損しているなど明らかに異常なデータもあります 。 それ以外にも(また、データ採取初期でも)極一部のデータ欠落が生じていることも確認できました。 そのため、NMEAセンテンスのサムチェック値を利用して正常に受信できたかをチェックしました。 その結果を 正常データ割合(=正常データ行数/受信行数(1000行)*100%)としてグラフ化しました。 このグラフは受信行数1000行毎に割合を算出しています。 また、スケッチ作成経過中に採取していた何種類かの「SDカードへの書込みタイミングの受信データバイト数」についてもグラフ化しました。 その結果を下記に掲載します。

 

【 正常データ割合(全体) 】

 

初期段階でも正常データ割合が100%とはなりません。

【 正常データ割合(拡大) 】

 

 上記のような受信行数増加(=ファイルサイズ増加)によりデータを正常に受信できない(=SDカードに正しく格納できない)現象をSDカードの書込みタイミング波形で確認してみました。 観測は、SDカードの各端子波形(CS/MOIS/MISO/SCK)とGNSSモジュールシリアル送信信号GNSS_TX、スケッチがIDメッセージGGSとして認識している期間Highレベル信号となるNMEA_GGA 信号の計6点を観測しました。 NMEA_GGA信号は、正常時は1秒間隔で観測されます。 観測の結果を下記に掲載します。 下記表中の「ファイルサイズ」はロギング開始時のファイルサイズ を意味します。 この観測に際しては、NMEA_GGA信号作成、および、ファイル名固定でデータ追記するスケッチを作成して、ファイルサイズの影響を短時間で観測できるようにしました。  なお、実際の波形に対してサンプリング間隔が長いため、全ての状態を正確には表示できていない観測結果となっています。

 

SDカード書込み関連信号の観測結果(SDカード書込みタイミング:GNSSロガー受信データ128バイト

観測条件

観測波形

GM−318B

(4800bps)

ファイルサイズ 0MB

 

NMEA_GGA信号のパルス幅はほぼ一定です。

【 全体 】

 

【 CS=Low部分拡大 】

 

GM−318B

(4800bps)

ファイルサイズ 約65MB

 

NMEA_GGA信号のパルス幅がばらついています。

【 全体 】

 

【 CS=Low部分拡大 】

 

GM−5157A

(9600bps)

ファイルサイズ 0MB

 

NMEA_GGA信号のパルス幅はほぼ一定です。

【 全体 】

 

【 CS=Low部分拡大 】

 

GM−5157A

(9600bps)

ファイルサイズ 約65MB

 

NMEA_GGA信号のパルス幅がばらついています。

【 全体 】

 

【 CS=Low部分拡大 】

 

 

7.結論

 上記観測結果より、ファイルサイズが大きくなるとSDカードへの書込み時間が長くなっていることを確認できました。 このような現象を無くすためにはGNSSモジュールの送信データを確実に受信する必要があります。 しかし、Arduino(Atmega328P)の受信バッファサイズ がとても小さいため、当方のスキルでは根本対策はできそうにありません。

 今回の製作では当初予定していた性能を全て実現する(NMEAセンテンスを全て正しく記録する)ことができませんでした。 とはいえ、多少のデータ欠落があってもたいした影響はありませんので、半日程度のロギングでは使い物にはなると思います。 ただし、受信したNMEA センテンスデータのサムチェック確認は必須でしょう。

 また、hexファイルの書込みに特化すれば「PICkit4」が手軽そうです。 しかし、Configuration Bitsの編集が容易にできる「ATMEL AVRISPシステム・プログラマー AVRISPmkU」 がベストと思っています。

 

 目次に戻る  Memorandumの小部屋 へ戻る   ホームページへ戻る


End of This Page.