検索コード

ArduinoでGPS信号から緯度と経度を抽出する

ArduinoでGPS信号から緯度と経度を抽出する

このチュートリアルでは、ArduinoとUblox NEO-6M GPSモジュールを使用して、GPS信号から緯度と経度のデータを抽出する方法を学びます。このプロジェクトは、ロボットや屋外ナビゲーションなど、位置追跡を必要とするアプリケーションに特に有用です。チュートリアルの最後には、GPSデータを読み取り、座標をシリアルモニタに表示するプログラムが完成します。

詳細に入る前に、配線やコードの実装についてさらに明確にするため、関連動画(動画の00:00の箇所)をご参照ください。

ハードウェア解説

このプロジェクトの主要な構成要素はUblox NEO-6M GPSモジュールです。このモジュールはGPS衛星からの信号を利用して正確な位置データを提供するよう設計されています。複数の衛星からの信号を同時に受信できるため、精密な位置追跡が可能です。モジュールはシリアル通信でArduinoとやり取りするため、さまざまなプロジェクトに簡単に組み込めます。

GPSモジュールに加えて、GPSデータを処理するためにArduinoボードが必要です。ArduinoはGPSモジュールから送られてくるデータを読み取り、緯度と経度の値を抽出してさらに利用します。GPSモジュールは通常5Vで動作し、シリアル出力を提供するため、ArduinoはそのRXピンを通して読み取ることができます。

データシートの詳細

製造元ユーブロックス
部品番号NEO-6M
ロジック/IO電圧3.3V
電源電圧3.0~5.5V
出力電流50 mA 以下
GPS感度-165 dBm
動作温度-40~85℃
更新頻度1 Hz (デフォルト)
パッケージ25×35×4 mm
備考 / バリエーション各種構成が利用可能です

  • GPSモジュールが安定した電源(3.0~5.5V)に接続されていることを確認してください。
  • GPSデータの解析には適切なライブラリを使用してください。
  • より良い衛星受信のため、アンテナ周辺の障害物を取り除いてください。
  • GPSモジュールのボーレートを確認してください。通常は9600ボーで動作します。
  • GPSモジュールが不安定な場合は、電源の平滑化のためにコンデンサの使用を検討してください。

配線手順

Arduino wiring for Neo-6M GPS module
Arduino wiring for Neo-6M GPS module

NEO-6M GPSモジュールをArduinoに配線するには、まずGPSモジュールのVCCピンをArduinoの5Vピンに接続します。次にGPSモジュールのGNDピンをArduinoのグラウンド(GND)ピンに接続します。GPSモジュールはTXおよびRXピンを使ってArduinoと通信します。GPSモジュールのTXピンをArduinoのRXピン(通常はピン0)に接続してください。

専用のI2Cピンを備えたArduinoを使用している場合は、SDAおよびSCLピンを適切に接続してください(標準的なArduinoボードでは通常、SDAがA4、SCLがA5です)。配線後は、すべての接続が確実で正しい向きになっていることを再確認してください。

コード例とウォークスルー

シリアル通信を初期化し、GPSデータ用の入力文字列を設定するためのコードの短い抜粋を以下に示します:

void setup() {
    Serial.begin(9600);
    inputString.reserve(200);
}

このコードはボーレート9600でシリアル通信を初期化し、受信するGPSデータ文字列のための領域を確保します。

次に、受信したGPSデータを処理して緯度と経度を抽出するコードの部分を見てみましょう:

if (BB == signal) {
    String LAT = inputString.substring(7, 17);
    String LON = inputString.substring(20, 31);
    Serial.println(LAT);
    Serial.println(LON);
}

このスニペットでは、プログラムが受信データが期待されるGPS信号と一致するかどうかを確認します。一致する場合は、入力文字列から緯度と経度の値を抽出してシリアルモニタに出力します。

最後に、コードにはシリアル接続で受信した新しいデータを処理するセクションが含まれています:

void serialEvent() {
    while (Serial.available()) {
        char inChar = (char) Serial.read();
        inputString += inChar;
        if (inChar == '\\n') {
            stringComplete = true;
        }
    }
}

この関数はシリアルポートからの受信文字を読み取り、それらを…に追加しますinputString. 改行文字が検出されると、それは設定を行いますstringCompleteフラグを true に設定し、完全なデータ文字列が受信されたことを示します。

デモンストレーション/当日の流れ

コードをアップロードしてArduinoを実行すると、シリアルモニタに緯度と経度の値が表示されるはずです。GPSモジュールが衛星信号を効果的に受信できるよう、空がよく見える場所に設置されていることを確認することが重要です。モジュールが信号を受信しない場合、有効な座標が表示されないことがあります(ビデオの02:30で)。

一般的な落とし穴には配線の誤り、電源供給不足、衛星受信の不良が含まれます。問題が発生した場合は、これらの点を必ず確認して対処してください。

動画のタイムスタンプ

  • 00:00- はじめに
  • 午前02:30- 配線手順
  • 05:00- コードの説明
  • 08:15- GPS機能のデモンストレーション

画像

GPS antenna
GPS antenna
GPS module with antenna
GPS module with antenna
GPS modules
GPS modules
Arduino wiring for Neo-6M GPS module
Arduino wiring for Neo-6M GPS module
3-Extract latitude and longitude from a GPS signal in an Arduino NEO-6M
言語: C++
/*
 * Ublox NEO-6M GPSモジュール用のArduinoコードです。このコードはGPSの緯度と経度を抽出し、他の目的に使用できるようにします。
 * 
 * Ahmad NejrabiによってRoboJax Videoのために書かれました
 * 日付:2017年1月24日、カナダ・オンタリオ州アジャックス
 * このコードを共有することを許可しますが、この
 * ノートがコードと一緒に保持されることが条件です。
 * 免責事項:このコードは「現状のまま」であり、教育目的のみのものです。
 * 
 * /
 * 
 * // RoboJax.comのために書かれました
 */
String inputString = ""; // 受信データを保持するための文字列
boolean stringComplete = false; // 文字列が完全であるかどうか
String signal = "\$GPGLL";
void setup() {
 // シリアルを初期化する:
    Serial.begin(9600);
 // 入力文字列用に200バイトを確保します。
    inputString.reserve(200);
}

void loop() {
 // 改行が来たときに文字列を印刷する:
    if (stringComplete) {
        String BB = inputString.substring(0, 6);
        if (BB == signal) {
            String LAT = inputString.substring(7, 17);
            int LATperiod = LAT.indexOf('.');
            int LATzero = LAT.indexOf('0');
            if (LATzero == 0) {
                LAT = LAT.substring(1);
            }

            String LON = inputString.substring(20, 31);
            int LONperiod = LON.indexOf('.');
            int LONTzero = LON.indexOf('0');
            if (LONTzero == 0) {
                LON = LON.substring(1);
            }

            Serial.println(LAT);
            Serial.println(LON);

        }

 // Serial.println(inputString);
 // 文字列をクリアする:
        inputString = "";
        stringComplete = false;
    }
}

/*
 * シリアルイベントは、ハードウェアシリアルRX経由で新しいデータが到着するたびに発生します。このルーチンは、loop()が実行されるたびに実行されるため、loop内でdelayを使用すると、応答が遅れる可能性があります。複数のバイトのデータが利用可能な場合があります。
 */
void serialEvent() {
    while (Serial.available()) {
 // 新しいバイトを取得する:
        char inChar = (char) Serial.read();
 // 入力文字列に追加してください。
        inputString += inChar;
 // もし受信した文字が改行であれば、フラグを設定する。
 // それで、メインループがそれについて何かをすることができます:
        if (inChar == '\\n') {
            stringComplete = true;
        }
    }
}

リソースと参考文献

まだリソースはありません。

ファイル📁

ファイルは利用できません。