GPSは全地球測位システムの短縮形です。これは、正確な高度、緯度、経度、UTC時間、および2、3、4、またはそれ以上の衛星から取得されたより多くの情報を提供するシステムです。GPSからデータを読み取るには、いくつかのマイクロコントローラーが必要であり、GPSをArduinoおよびRaspberryPiと既にインターフェースしています。
U-blox製のG7020GPSモジュールを選択しました。衛星から特定の位置の経度と緯度を受け取り、16x2文字のLCDに同じものを表示します。そこで、ここでは、GPSをマイクロチップによってPIC16F877Aマイクロコントローラーとインターフェースします。
必要なコンポーネント:
- Pic16F877A –PDIP40パッケージ
- ブレッドボード
- Pickit-3
- 5Vアダプター
- LCD JHD162A
- uBLOX-G7020GPSモジュール
- 周辺機器を接続するためのワイヤ。
- 4.7k抵抗
- 10kポット
- 20mHzクリスタル
- 2個の33pFセラミックコンデンサ
回路図と説明:-
16x2文字のLCDはPIC16F877Aマイクロプロセッサに接続されています。RB0、RB1、RB2はそれぞれRS、R / W、EのLCDピンに接続されています。RB4、RB5、RB6、RB7はLCDの4ピンD4、D5に接続されています。 、D6、D7。LCDは4ビットモードまたはニブルモードで接続されます。LCDとPICマイクロコントローラーのインターフェースの詳細をご覧ください。
OSC1ピンとOSC2ピンの間に33pFの2つのセラミックコンデンサが接続された20MHzの水晶発振器。マイクロコントローラに一定の20MHzクロック周波数を提供します。
uBlox-G7020 GPSモジュール、UARTを使用してデータを送受信します。PIC16F877Aはチップ内に1つのUSARTドライバーで構成され、USARTによってGPSモジュールからデータを受信するため、マイクロコントローラーのRxピンからGPSのTxピンおよびGPSの送信ピンに接続されたUSART受信ピンへの相互接続が行われます。
uBlox-G7020にはピンのカラーコードがあります。正または5Vピンは赤色、負またはGNDピンは黒色、送信ピンは青色です。
私はこれらすべてをブレッドボードで接続しました。
GPSから位置データを取得する:
USARTを使用してGPSをインターフェースする方法を見て、16x2文字のLCDで結果を見てみましょう。
モジュールは、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をPICマイクロコントローラーとインターフェースする手順:-
- 発振器構成を含むマイクロコントローラの構成を設定します。
- TRISレジスタを含むLCDの目的のポートを設定します。
- USARTを使用してGPSモジュールをマイクロコントローラーに接続します。
- システムUSARTを9600ボーレートの連続受信モードと4ビットモードのLCDで初期化します。
- 緯度と経度の長さに応じて、2つの文字配列を取ります。
- 一度に1文字ビットを受け取り、それが$から開始されているかどうかを確認します。
- $ Receiveの場合、それは文字列です。GPGGA、この5文字、およびコンマを確認する必要があります。
- GPGGAの場合は、時間をスキップして緯度と経度を探します。緯度と経度は、N(北)とE(東)が受信されなくなるまで2文字の配列で格納されます。
- アレイをLCDに印刷します。
- アレイをクリアします。
コードの説明:
コードを1行ずつ見ていきましょう。最初の数行は、前のチュートリアルで説明した構成ビットを設定するためのものなので、ここではスキップします。完全なコードは、このチュートリアルの最後にあります。
これらの5行は、ライブラリヘッダーファイルを インクルード するために使用されます 。lcd.h と eusart.h は、それぞれLCDとUSART用です。また、 xc.h はマイクロコントローラーヘッダーファイル用です。
#include
ボイドメイン() 関数、 system_init() 。関数はLCDとUSARTを初期化するために使用されます。
Void main(void){ TRISB = 0x00; //出力として設定 system_init();
lcd_init()。 および EUSART_Intialize(); 2つのライブラリ lcd.h と eusart.h から呼び出されます
void system_init (void){ lcd_init(); //これにより、lcdが初期化されますEUSART1_Initialize(); //これによりEusartが初期化されます }
しながら、 私たちは経度と緯度の座標を取得するGPGGA文字列を破るループ。一度に1ビットを受け取り、GPGGA文字列に存在する個々の文字と比較します。
取得するコードを破ります:-
Incomer_data = EUSART1_Read(); //文字列 '$ GPGGA'を確認します / * ------------------------------ GPGGA行を段階的に見つけます- --------------------------- * / if(incomer_data == '$'){// GPSデータの最初のステートメントは$記号 incomer_data = EUSART1_Read(); //最初のifがtrueになった場合、次のフェーズ if(incomer_data == 'G'){ incomenr_data = EUSART1_Read(); if(incomer_data == 'P'); { incomenr_data = EUSART1_Read(); if(incomer_data == 'G'); { incomenr_data = EUSART1_Read(); if(incomer_data == 'G'){ incomer_data = EUSART1_Read(); if(incomer_data == 'A'){ incomenr_data = EUSART1_Read(); if(incomer_data == '、'){//最初に、受信 Incomer_data = EUSART1_Read(); //この段階で最終チェックインが完了し、GPGGAが見つかりました。
このコードを使用することにより、UTC時間をスキップします。
while(incomer_data!= '、'){// GMT時間をスキップ incomer_data = EUSART1_Read(); }
このコードは、緯度と経度のデータを文字配列に格納するためのものです。
Incomer_data = EUSART1_Read(); 緯度= incomer_data; while(incomer_data!= '、'){ for(array_count = 1; incomer_data!= 'N'; array_count ++){ incomer_data = EUSART1_Read(); 緯度= incomer_data; //緯度データを保存します } incomer_data = EUSART1_Read(); if(incomer_data == '、'){ for(array_count = 0; incomer_data!= 'E'; array_count ++){ incomer_data = EUSART1_Read(); 経度= incomer_data; //経度データを保存します } }
そして最後に、経度と緯度をLCDに印刷しました。
array_count = 0; lcd_com(0x80); // LCDライン1選択 while(array_count <12){// Latitudeデータの配列は11桁です lcd_data(latitude); // Latitudeデータを出力します array_count ++; } array_count = 0; lcd_com(0xC0); // Lcd 行2の選択while(array_count <13){//経度データの配列は12桁ですlcd_data(longitude); //経度データを出力します array_count ++; }
これは、GPSモジュールをPICマイクロコントローラーと接続して、現在地の緯度と経度を取得する方法です。
完全なコードとヘッダーファイルを以下に示します。