Memorandumの小部屋
本ページは金銭授受を伴う行為を含むAuctionや商用Web
Pageからの無断リンク・無断参照を禁じます。
無断リンク・無断参照が判明した時点で然るべき処置をとらさせて頂きます。
まるごとNMEA Arduino編
このWebページはArduinoを用いてGNSSロガーを試作した経緯を記録として残した個人的なメモです。 なお、このWebページ作成以降、特定の測位システムを意味する「GPS」は必要時以外は使用せず、ローバル軌道衛星群を意味する「GNSS」を使用することにしました。
文中の一部の用語は下記を意味します。
GNSSモジュール
GM−318B・GR−A013U(GM−A013R)・GM−5157A・GSU−140型GNSS評価キットなどのGNSS受信機
(受信器)もしくはGNSSモジュール。
GNSSロガー
GNSSモジュールから送信されたNMEAセンテンスSDカードに記録する本Webページで紹介する試作品(プロトタイプ)。
− 目次 −
5.1 「ATMEL AVRISPシステム・プログラマー AVRISPmkU」の利用
「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ロガーの製作開始です。
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カードに書き込むプログラムの作成・動作確認をしました。
プロトタイプ1でGNSSロガーとしての基本的な機能確認がきましたので、次にGNSSロガーとしての操作を含めた機能全般を確認するプロトタイプ2の試作を行いました。 基本的な操作・機能は「電池ボックス電子工作(その21) 一体型いつどこGPSロガー9(電池内蔵タイプ)」をベースにしました。 実際にはプロトタイプ2を製作しながら機能仕様を決めていき、機能(概要)を下記のように決めました。 なお、具体的な仕様は次の節に記載します。
測位未確定時、3D測位時、みちびき補足時の3通りの測位状態をブザー音で識別できるようにしました。 ブザー音は可変抵抗器で音量調整できるようにしました。 音量調整は深夜のデバッグ作業でとても役立ちましたが、実際の運用で必要な機能なのかちょっと疑問です。
RGB−LEDの点滅状態でGNSSロガーの状態や測位状態を表示するようにしました。
RGB−LED点灯とブザー音をオンオフ切替えできるようにしました。
SDカードへの記録中に電源オフすることを防止できるように、SDカード記録終了スイッチを設けることにしました。 これはプロトタイプ2試作中に
FATが破損してSDカードが読めなくなる現象が何度か発生しました。 これを電子回路的に防止することはできますが部品点数が増えてしまいます。 今回はSDカード記録終了スイッチを押すことで、単純にSDカードへのアクセスをしない電源オフ可能な状態で待ち状態に移行するようにしました。
「ATMEL AVRISPシステム・プログラマー AVRISPmkU」を接続できるようにICPSコネクタを設けました。 なお、SDカードとICSPはマイコンチップの同じピンを利用しますので、排他利用できるようにジャンパーピンで切り替えるようにしました。
上記回路図をクリックすると原寸大の回路図をダウンロードできます。
【 プロトタイプ2 回路図 】
【 プロトタイプ2 動作確認状態(全体外観1) 】
【 プロトタイプ2 動作確認状態(全体外観2) 】
【 プロトタイプ2 動作確認状態 (操作部ユニバーサル基板外観) 】
オンボードでブートローダを書込む際に利用しました。 それ以外はArduino IDE環境下での利用となりましたので、ICPSコネクタはほとんど利用する機会はありませんでした。 |
【 プロトタイプ2 「ATMEL AVRISPシステム・プログラマー AVRISPmkU」接続時 】
プロトタイプ2をベースにしてGNSSロガー「まるごとNMEA」の製作に着手しました。
ブレッドボードからユニバーサル基板化をしました、 このため、実装変更、および、「あちゃんでいいの」を個別部品に置き換え
ました。
SDカードとICSPコネクタの排他利用機能は残しました。
Arduino IDE用のPC_SerialとGNSS用のGNSS_Serialを切替えるスイッチ は設けず、別途シリアルポートスイッチ基板を設けて、この基板に切替えスイッチを設けました。
【 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を利用しました。 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
タクトスイッチ |
スイッチを押すごとにLED表示、ブザー発音有無を順次切り替えます。 (Step1→2→3→4→1→2→…)
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
タクトスイッチ |
約3〜5秒連続押すことでロギング終了します。 (SDカードアクセス停止) |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
スライド |
SW3をオンする(PD4:LOWレベル)ことで、GNSSのTXデータをTB1のPC−Monitorから出力します。 PC−Monitorはスケッチデバッグ用に設けた機能です。 ソフトウエアシリアルを利用しているため、ロギング中はオンすることを避けることが望ましいです。 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
LED表示 ブザー発音 |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
公開版 スケッチ |
公開版サンプルスケッチです。 ブートローダ無し版とブートローダ有り版の2通りを公開します。 hexファイルの書込み方法は後述しています。
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
格納ファイル |
格納ファイル名は「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 】
今回もスケッチ(プログラム)のソースを公開していませが、コンパイルした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ファイルを格納したときの書込み例を示します。
【 関連ファイル格納例 】
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 】
前記の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信号作成、および、ファイル名固定でデータ追記するスケッチを作成して、ファイルサイズの影響を短時間で観測できるようにしました。 なお、実際の波形に対してサンプリング間隔が長いため、全ての状態を正確には表示できていない観測結果となっています。
観測条件 |
観測波形 |
(4800bps) ファイルサイズ 0MB |
NMEA_GGA信号のパルス幅はほぼ一定です。 【 全体 】
【 CS=Low部分拡大 】
|
(4800bps) ファイルサイズ 約65MB |
NMEA_GGA信号のパルス幅がばらついています。 【 全体 】
【 CS=Low部分拡大 】
|
(9600bps) ファイルサイズ 0MB |
NMEA_GGA信号のパルス幅はほぼ一定です。 【 全体 】
【 CS=Low部分拡大 】
|
(9600bps) ファイルサイズ 約65MB |
NMEA_GGA信号のパルス幅がばらついています。 【 全体 】
【 CS=Low部分拡大 】
|
上記観測結果より、ファイルサイズが大きくなるとSDカードへの書込み時間が長くなっていることを確認できました。 このような現象を無くすためにはGNSSモジュールの送信データを確実に受信する必要があります。 しかし、Arduino(Atmega328P)の受信バッファサイズ がとても小さいため、当方のスキルでは根本対策はできそうにありません。
今回の製作では当初予定していた性能を全て実現する(NMEAセンテンスを全て正しく記録する)ことができませんでした。 とはいえ、多少のデータ欠落があってもたいした影響はありませんので、半日程度のロギングでは使い物にはなると思います。 ただし、受信したNMEA センテンスデータのサムチェック確認は必須でしょう。
また、hexファイルの書込みに特化すれば「PICkit4」が手軽そうです。 しかし、Configuration Bitsの編集が容易にできる「ATMEL AVRISPシステム・プログラマー AVRISPmkU」 がベストと思っています。
目次に戻る Memorandumの小部屋 へ戻る ホームページへ戻る
End of This Page.