MochiuWiki : SUSE, EC, PCB
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
検索
個人用ツール
ログイン
Toggle dark mode
名前空間
ページ
議論
表示
閲覧
ソースを閲覧
履歴を表示
Arduinoの基礎 - GPSのソースを表示
提供: MochiuWiki : SUSE, EC, PCB
←
Arduinoの基礎 - GPS
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループのいずれかに属する利用者のみが実行できます:
管理者
、new-group。
このページのソースの閲覧やコピーができます。
== 概要 == ここでは手軽に利用可能なGPSモジュール(NEO-6M)のGPSデータを、Arduinoで読み込み液晶ディスプレイに表示する方法を記載する。<br> <br> なお、GPSモジュールは、U-blox NEO-6Mを使用している。<br> このGPSモジュールは、 TTLシリアルインターフェイスを使用してArduinoと簡単に接続できる。<br> <br<br> == GPSモジュールからGPSデータを取得する == GPSデータは、NMEAプロトコルというデータフォーマットが広く使用されている。<br> ここで使用するNEO-6Mにおいても、NMEAプロトコルがサポートされている。(NMEAプロトコルについては、後述のセクションを参照する)<br> <br> GPSモジュールで受信したGPSデータは、UART(TTLシリアル)インターフェイスから直ちに文字列形式で取得できる。<br> (GPSモジュールとPCを接続してGPSデータを確認する方法は、後述のセクションを参照する)<br> <br> GPSモジュールのUART(TTLシリアル)から取得できるGPSデータをArduinoで受信して、それをパースすればよい。<br> <br><br> == NMEAプロトコル == ==== NMEAプロトコルとは ==== NEO-6M等の多くのGPSモジュールからは、NMEAプロトコルと呼ばれるデータ形式でGPSデータが取得できる。<br> <br> Arduino等でGPSモジュールを使用する場合は、一般的に、TinyGPS等のライブラリを使用して、NMEAプロトコルを直接解析せずに必要なGPSデータを取得することができる。<br> しかし、GPSデータを理解することは問題が発生した時の調査等で役に立つことが多いので、ここでは、NMEAプロトコルのGPSデータを確認する。<br> <br> ==== NMEAプロトコルのGPSデータを取得する ==== NEO-6Mを使用して、PC(シリアルポート)へ送信されたGPSデータをシリアルモニタ等で見ると、下図のような文字列が取得できる。<br> 下図において、$GPRMCや$GPVTG等の文字に続いて、カンマ区切りでGPSデータが記載されていることが確認できる。<br> <br> ここでは、例として、$GPRMCの内容を解析する。<br> <br> $GPRMCは、推奨最小GPSデータである。<br> $GPRMC,071323.00,A,3348.65406,N,11819.22616,W,0.047,,270716,,,A*6C <br> 1番目のセクションは、<code>071323</code>とあり、UTC時刻の<code>07:13:23 UTC</code>であることを示している。<br> 2番目のセクションは、<code>A</code>とあり、ナビゲーション受信機の警告を表す。<code>A</code>は"OK"、<code>V</code>は"警告"である。<br> 3〜4番目のセクションは、<code>3348.65406,N</code>とあり、緯度を表す。このデータでは、北緯(N) 33度48.65406分である。<br> 5〜6番目のセクションは、<code>11819.22616,W</code>とあり、経度を表す。このデータでは、西経(W) 118度19.22616分である。<br> 7番目のセクションは、<code>0.047</code>とあり、地表面に対する速度(ノット)を表す。1ノットは約1.9[km/h]なので、0.047ノットは時速0.09[km/h]程度である。<br> 8番目のセクションは、空である。<br> 9番目のセクションは、<code>270716</code>とあり、UTC時刻を表す。このデータでは、2016年7月27日(DDMMYY形式)である。<br> 10番目のセクションは、進んでいる向きを表す。このデータでは空である。<br> 11番目のセクションは、NMEAプロトコル 2.3から追加されたモードインジケータを表す。このデータでは空である。<br> 最後の12番目のセクションは、チェックサムである。<br> <br> 以上、$GPRMCの内容から緯度経度とUTC時刻がわかる。<br> <br><br> == GPSモジュールとPC(シリアルポート)を接続して、GPSデータを確認する == GPSモジュールのGPSデータを、PCのシリアルポートを使用して直接確認する方法を記載する。<br> ここで使用するのは、NEO-6M GPSモジュールとFTDI FT232RL USB-TTLシリアルアダプタである。<br> <br> まず、NEO-6Mの入力電圧は、2.7[V]〜3.6[V]の範囲とする必要があるので、FT232RLのジャンパーを設定して3.3[V]にする。<br> 下図左のように、FT232RLとNEO-6Mを、以下のようにそれぞれ接続する。<br> * FT232RLのGRDとNEO-6MのGRD * FT232RLのVCCとNEO-6MのVSS * FT232RLのRXとNEO-6MのTX * FT232RLのTXとNEO-6MのRX <br> 次に、FT232RLとPCを接続する。<br> ここでは、シリアルポートターミナルは、gtktermを使用している。ポートは、/dev/ttyUSB0としている。<br> 下図右において、gtktermのウィンドウタイトルにある9600-8-N-1とは、ボーレート(9600[bps])、データビット長(8)、パリティ無し(N)、ストップビット(1)を意味する。<br> [[ファイル:Arduino GPS 2.png|フレームなし|中央]] <br> Linuxで使用できるシリアルポートを探すには、FT232RLアダプタとPCを接続した後、以下のコマンドを実行する。<br> setserial -g /dev/ttyUSB[01234] <br> もし、シリアルポートにアクセスできない場合は、ユーザをdialoutグループに追加する。<br> ls -l /dev/ttyUSB0 sudo adduser $USER dialout <br><br> == サンプルコード == Arduinoでは、GPSデータを解析するためのライブラリは多く存在する。<br> ここでは、TinyGPS++ライブラリを使用している。<br> <br> Arduino IDE上でライブラリをzip形式でダウンロードして開発環境に追加するには、<br> [Sketch] - [Include Library] - [Add .ZIP Library...]からzipファイルを指定する。<br> または、手動でライブラリをArduino IDEのインストールディレクトリ下のlibrariesディレクトリ内に展開する。<br> <br> NEO-6MからGPSデータをUARTで受信するには、FT232RLの8番ピン(RX)と9番ピン(TX)をそれぞれ、NEO-6MのTXとRXに接続している。<br> そして、SoftwareSerialライブラリを使用して、FT232RL(TTLシリアル)からGPSデータを取得する。<br> <br> サンプルコードは以下の通りである。<br> SoftwareSerialライブラリのボーレート等が合致しないとデータが正常に受信できないので、動作しない場合は設定を変更すること。<br> <source lang="c++"> #include <TinyGPS++.h> #include <SoftwareSerial.h> #include <LiquidCrystal.h> LiquidCrystal lcd( 4, 6, 10, 11, 12, 13 ); const int PIN_RX = 8, PIN_TX = 9; TinyGPSPlus gps; SoftwareSerial ss(PIN_RX, PIN_TX); void setup() { lcd.begin(16,2); lcd.clear(); ss.begin(9600); } void loop() { while (ss.available() > 0) { if (gps.encode(ss.read())) { display_coordinate(); } } } void display_coordinate() { if (gps.location.isValid()) { String s; s = "lat="; s += String(gps.location.lat(), 6); lcd.setCursor(0,0); lcd.print(s); s = "lng="; s += String(gps.location.lng(), 6); lcd.setCursor(0,1); lcd.print(s); } } </source> <br><br> __FORCETOC__ [[カテゴリ:Arduino]]
Arduinoの基礎 - GPS
に戻る。
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
Collapse