GPS モジュールは、経度と緯度の座標に基づいて位置を追跡するために、電子機器アプリケーションで広く使用されています。車両追跡システム、GPSクロック、事故検出アラートシステム、交通ナビゲーション、監視システムなどは、GPS機能が不可欠な例のいくつかです。GPSは、高度、緯度、経度、UTC時間、および特定の場所に関するその他の多くの情報を提供します。これらの情報は、複数の衛星から取得されます。GPSからデータを読み取るにはマイクロコントローラーが必要なので、ここではGPSモジュールをAVRマイクロコントローラーAtmega16と接続し、経度と緯度を16x2LCDディスプレイに印刷します。
必要なコンポーネント
- Atmega16 / 32
- GPSモジュール(uBlox Neo 6M GPS)
- ロングワイヤーアンテナ
- 16x2 LCD
- 2.2k抵抗
- 1000ufコンデンサ
- 10uFコンデンサ
- 接続線
- LM7805
- DCジャック
- 12vDCアダプター
- Burgstips
- PCBまたは汎用PCB
Ublox Neo 6M は、シリアル通信を通じて位置の詳細を提供するシリアルGPSモジュールです。4本のピンがあります。
ピン |
説明 |
Vcc |
2.7 –5V電源 |
Gnd |
接地 |
TXD |
データの送信 |
RXD |
データを受信する |
Ublox neo 6M GPSモジュールはTTL互換であり、その仕様は以下のとおりです。
キャプチャ時間 |
クールスタート:27秒、ホットスタート:1秒 |
通信プロトコル |
NMEA |
シリアル通信 |
9600bps、8データビット、1ストップビット、パリティなし、フロー制御なし |
動作電流 |
45mA |
GPSから位置データを取得する
GPSモジュールは、9600ボーレートで複数の文字列でデータを送信します。9600ボーレートのUART端末を使用すると、GPSで受信したデータを確認できます。
GPSモジュール は、リアルタイム追跡位置データをNMEA形式で送信します(上のスクリーンショットを参照)。NMEA形式はいくつかの文で構成されており、4つの重要な文を以下に示します。NMEAセンテンス とそのデータ形式の詳細については、 こちらをご覧ください。
- $ GPGGA:全地球測位システムの修正データ
- $ GPGSV:GPS衛星が見える
- $ GPGSA:GPSDOPとアクティブな衛星
- $ GPRMC:推奨される最小の特定のGPS /トランジットデータ
GPSデータとNMEA文字列の詳細については、こちらをご覧ください。
これは、9600ボーレートで接続されたときにGPSによって受信されるデータです。
$ GPRMC、141848.00、A、2237.63306、N、08820.86316、E、0.553、、100418,,, A * 73 $ GPVTG,, T,, M、0.553、N、1.024、K、A * 27 $ GPGGA、141848.00、 2237.63306、N、08820.86316、E、1,03,2.56,1.9、M、-54.2、M,, * 74 $ GPGSA、A、2,06,02,05,,,,,,,,,, 2.75、 2.56,1.00 * 02 $ GPGSV、1,1,04,02,59,316,30,05,43,188,25,06,44,022,23,25,03,324、* 76 $ GPGLL、2237.63306、N、08820.86316、E、141848.00 、A、A * 65
GPSモジュールを使用して 任意の場所を追跡する場合、必要なのは座標のみであり、これは$ GPGGA文字列で見つけることができます。$ GPGGA(全地球測位システム修正データ)文字列のみがプログラムで主に使用され、他の文字列は無視されます。
$ GPGGA、141848.00,2237.63306、N、08820.86316、E、1,03,2.56,1.9、M、-54.2、M,, * 74
その行の意味は何ですか?
その行の意味は次のとおりです。-
1.文字列は常に「$」記号で始まります
2. GPGGAは、Global Positioning System FixDataの略です。
3。「、」コンマは2つの値の分離を示します
4. 141848.00:GMT時間(14(hr):18(min):48(sec):00(ms))
5. 2237.63306、N:緯度22(度)37(分)63306(秒)北
6. 08820.86316、E:経度088(度)20(分)86316(秒)東
7. 1:修正数量0 =無効なデータ、1 =有効なデータ、2 = DGPS修正
8. 03:現在表示されている衛星の数。
9. 1.0:HDOP
10. 2.56、M:高度(海抜メートル単位の高さ)
11. 1.9、M:ジオイドの高さ
12. * 74:チェックサム
したがって、モジュールの場所またはモジュールが配置されている場所に関する情報を収集するには、5番と6番が必要です。このプロジェクトでは、緯度と経度を抽出するためのいくつかの機能を提供するGPSライブラリを使用したので、それについて心配する必要はありません。
以前、GPSを他のマイクロコントローラーとインターフェースしました。
- ArduinoでGPSを使用する方法
- Raspberry PiGPSモジュールインターフェースチュートリアル
- GPSモジュールとPICマイクロコントローラーのインターフェース
- Arduino、ESP8266、GPSを使用してGoogleマップで車両を追跡する
ここですべてのGPS関連プロジェクトを確認してください。
回路図
AVRAtemga16マイクロコントローラーとのGPSインターフェースの回路図を以下に示します。
システム全体は12vDCアダプターから電力を供給されますが、回路は5vで動作するため、電源はLM7805電圧レギュレーターによって5vに調整されます。16x2 LCDは4ビットモードで構成され、そのピン接続は回路図に示されています。GPSも5vで動作し、そのtxピンはAtmega16マイクロコントローラーのRxに直接接続されています。マイクロコントローラのクロックには、8MHzの水晶発振器が使用されます。
GPSをAVRマイクロコントローラーとインターフェースする手順
- 発振器構成を含むマイクロコントローラの構成を設定します。
- DDRレジスタを含むLCDの目的のポートを設定します。
- USARTを使用してGPSモジュールをマイクロコントローラーに接続します。
- システムUARTをISRモードで初期化し、9600ボーレートとLCDを4ビットモードで使用します。
- 緯度と経度の長さに応じて、2つの文字配列を取ります。
- 一度に1文字ビットを受け取り、それが$から開始されているかどうかを確認します。
- $を受け取った場合、それは文字列です。$ GPGGAをチェックする必要があります。この6文字は$を含みます。
- GPGGAの場合は、完全な文字列を受け取り、フラグを設定します。
- 次に、緯度と経度を2つの配列の方向で抽出します。
- 最後に、緯度と経度の配列をLCDに出力します。
コードの説明
最後に、デモンストレーションビデオ付きの完全なコードを示します。ここでは、コードのいくつかの重要な部分について説明します。
まず、コードに必要なヘッダーをいくつか含めてから、LCDおよびUART構成用のビットマスクのMACROSを記述します。
#define F_CPU 8000000ul #include #include
次に、GPS文字列、緯度経度、およびフラグを格納するためのいくつかの変数と配列を宣言して初期化します。
char buf; volatile char ind、flag、stringReceived; char gpgga = {'$'、 'G'、 'P'、 'G'、 'G'、 'A'}; チャー緯度; char logitude;
その後、LCDを駆動するためのLCDドライバ機能があります。
void lcdwrite(char ch、char r) { LCDPORT = ch&0xF0; RWLow; if(r == 1) RSHigh; それ以外の場合は RSLow; ENHigh; _delay_ms(1); ENLow; _delay_ms(1); LCDPORT = ch << 4&0xF0; RWLow; if(r == 1) RSHigh; それ以外の場合は RSLow; ENHigh; _delay_ms(1); ENLow; _delay_ms(1); } void lcdprint(char * str) { while(* str) { lcdwrite(* str ++、DATA); // __ delay_ms(20); } } void lcdbegin() { char lcdcmd = {0x02,0x28,0x0E、0x06,0x01}; for(int i = 0; i <5; i ++) lcdwrite(lcdcmd、CMD); }
その後、GPSでシリアル通信を初期化し、受信した文字列を「GPGGA」と比較しました。
void serialbegin() { UCSRC =(1 << URSEL)-(1 << UCSZ0)-(1 << UCSZ1); UBRRH =(BAUD_PRESCALE >> 8); UBRRL = BAUD_PRESCALE; UCSRB =(1 <
受信した文字列がGPGGAと正常に一致した場合、 メイン 関数で場所の緯度と経度の座標を抽出して表示します。
lcdwrite(0x80,0); lcdprint( "Lat:"); serialprint( "緯度:"); for(int i = 15; i <27; i ++) { 緯度= buf; lcdwrite(latitude、1); serialwrite(latitude); if(i == 24) { lcdwrite( ''、1); i ++; } } serialprintln( ""); lcdwrite(192,0); lcdprint( "ログ:"); serialprint( "Logitude:"); for(int i = 29; i <41; i ++) { logitude = buf; lcdwrite(logitude、1); serialwrite(logitude); if(i == 38) { lcdwrite( ''、1); i ++; } }
したがって、これは、GPSモジュールをATmega16とインターフェースして、位置座標を見つける方法です。
以下の完全なコードと作業ビデオを見つけてください。