2023.04.04本記事はプロモーションが含まれています。こんにちは、ENGかぴです。GPSモジュールは現在地の情報や時刻情報などを衛星からの電波を受信してユーザーに通知するモジュールです。GPSモジュールのデータはシリアル通信を使って得られますが、1ppsと組み合わせることで測位後のデータと判断してデータを得られます。秋月電子の「GPS受信機キット:AE-GYSFDMAXB」を使ってGPSモジュールから日付と時刻情報を取得してLCDに表示する方法を説明しています。LCDはQAPASS1602(スターターキットに付属)を使用しています。GPSモジュール用のライブラリを追加して時刻情報を取得して動作確認したことを下記記事にまとめています。UNO(以下Arduinoとします。Arduinoのライブラリーを使用して動作確認したことをまとめています。関連リンクGPSモジュールの使い方GPSモジュールはArduinoのシリアル通信とGPSモジュールを配線するだけでデータを取得することができます。デフォルト設定では不要なデータも含まれてしまうため必要なデータだけが受信できるようにGPSモジュールの設定を行います。GPSモジュールは秋月電子の「GPS受信機キット:AE-GYSFDMAXB」を使っているため下記リンクのデータシート(技術資料)を一部抜粋して説明します。秋月電子ーGPS受信機キット:AE-GYSFDMAXBGPSモジュールの電文(NMEAパケット)GPSモジュールはメーカー問わず基本的にNMEAパケットフォーマットに従ってデータを送信するようになっています。NEMAパケットフォーマットは以下の通りです。NMEAパケットフォーマット:GYSFDMAXB仕様書より抜粋NMEAパケットは最後のCR・LFを除いて文字コード(アスキーコード)となります。各パラメータをまとめます。Typeによってデータ長が異なる。設定項目が複数ある場合は”,”で区切る。Fieldの終わり判定に使用する。Preambleと*までの間のチェックサム(EOR)値を2バイト文字で表現する。2バイトのバイナリデータCR:0x0D、LF:0x0Aとなる。NMEAパケットの説明GYSFDMAXBの仕様書ではCHK1、CHK2の説明にPreambleと*までのチェックサム値と記載されているため各バイトを加算して1バイトデータを文字列としてチェックサムとして計算してしまいそうですが、EORで計算する必要があります。チェックサムが一致しない場合はGPSモジュール側で無効なパケットとして処理されてしまいます。出力制御のフォーマットGPSモジュールには各種データを出力する項目を選択する314パケットがあります。位置情報(緯度、経度)を出力する。位置情報と時刻(UTC時刻)、速度と方位を同時に出力する。方位と速度を出力する。DOP、動作モードを出力する。GPS衛星の生成情報を出力する。時刻(UTC時刻)と日付を出力する。interval以外を出力しないように設定します。314フォーマットにおいて対象の番号の周期設定を変更することでインターバルのタイミングを任意に設定できます。"PMTK314,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0";//正式なフォーマットは$,*checksum,CR,LFを追加する例のように設定番号の17番目以外のインターバルを0にすることでGPSモジュールからの情報を制限することができます。GPZDAにおいては1にしているため1秒周期でGPZDAが出力されます。他の項目についても出力したい場合は0~5までの任意のタイミングに設定します。Arduinoをリセット状態にしてから314パケットを送出しても応答しないケースがあったためArduinoのSetup()の最初にGPSモジュールをリセットする処理を入れています。(リセットはリセットパケットの整合性が取れていれば必ず受け付けるようです。)初期化処理で314パケットが受け付けられなかった場合は受信データにGPZDA以外のデータが来た場合に再度314パケットを送出するようにして受け付けるまで繰り返すようにしています。リスタートには大きくホットスタートとコールドスタートがありますが、今回使用しているGPSモジュールにおいては4つの項目に分類されています。利用可能なデータを保持したままのリスタートする。リスタート後エフェメリス(衛星の測位情報)が使用できない。エフェメリスのデータが使用できない。STARTよりもさらにシステム/ユーザーのコンフィグレーションデータをクリアする。電源ON以降(モジュールは電源ON後で最大1500ms準備時間が必要)にGPSモジュールが取得したデータを無駄にせずにリスタートができるホットスタートを使用することで初期化を行い、314フォーマットによる出力制御設定を行います。外部機器をマイコンから制御する場合、マイコン起動時に外部機器に対して初期化を行ってから動作させることが経験上多いです。スポンサーリンク時間データの受け取りタイミングGPSモジュールは衛星を測位する前からシリアル通信でデータを通知します。データが確定していない場合のデータで時刻や測位情報として採用してしまうと不確定な情報が表示されることになります。GPSモジュールは測位が完了し正確なデータとして確定できた時1ppsピンからパルスを出力して通知する機能を持っています。1ppsピンの状態を監視してパルスが生成されていれば正常な情報であると判断してGPSモジュールの情報として処理するようにします。}}広告GPSモジュールからの受信データの受け入れGPSモジュールから受信するデータもNMEAパケットに従っているためNMEAパケットの’$’から’*’までのデータを確認することでパケットタイプによるデータの管理ができます。}}データ長はGPSモジュールから出力される種別に応じて異なるため、データ長の確認を行ってから必要なデータ数のみ一時的に受け入れチェックサム(EOR)の計算を行い、異常がなければデータを受け入れる処理を行います。//LCD表示用のデータを生成するなど必要な処理を追加}受け入れたデータのパケットタイプから必要なパケットのデータであるかの確認を行い対象の処理を行います。上記の例では「$GPZDA」のパケットであることを判断してLCD用のデータを生成しています。位置情報を示すパケットに対してデータを作成する場合は「$GPGLL」のパケットであることを確認して処理を追加します。今回は公開していませんが、GPGLLフォーマットで位置情報を取得して座標をMAP上で入力すると少し誤差がありました(約100m)が位置情報が取れていました。//年を表示}GPSモジュールの時刻と日時は世界標準時が基準であるため日本での時間は世界標準時+9時間となります。世界標準時で15:00を超えたとき日本時間に換算すると24時を超えることになり日付も更新する必要がありますが、うるう年が絡んだ時など日本時間に換算しようとしたとき少し面倒なのが欠点です。日本時間に換算にする際にtime.hのmktime()やlocaltime()を使用すると煩雑な計算をしなくても時間の管理ができます。それぞれをtmの型の変数に格納した後はmktime()関数で時刻の補正を行います。mktime()はUNIX時間(1970年1月1日0時0分0秒)からの経過時間を時刻の桁上がりなどを考慮しての補正を行いtime_tの型で戻り値として格納できる関数です。分けてtmの型に変換する関数です。localtime()で変換した時刻データをLCDやシリアルモニタ表示用のデータとして加工すると日本時間に換算した結果が表示されます。動作確認GPSモジュール動作確認の回路図GPSモジュールからの受信データをLCDに表示するための回路図です。初期画面はGPS-TESTとVER1.00を表示しておき、GPSモジュールの時刻データが確定した後は時刻を表示するようにしています。確定している場合は最初で2秒の表示としています。PMTK_API_SET_DATUMを発行してTOKYO-Mに合わせると時刻調整できると考えていましたが、発行してもうまく時刻が補正されませんでした。他のAPIで補正することができるかもしれません。時刻補正がなかったためtime.hを使用して時刻の補正を行いました。時刻が表示されると日本時間に換算した時刻が表示されていることを確認しました。シリアルモニタでも同様の時刻が表示されていました。以下のソースコードはコンパイルして動作確認をしております。コメントなど細かな部分で間違っていたりやライブラリの更新などにより動作しなくなったりする可能性があります。参考としてお使いいただければと思います。}}本記事はGPSモジュールから受信したシリアル通信のデータを判断して時刻表示を行っていますが、GPSモジュール用のライブラリを追加して時刻情報を表示する方法もあります。ArduinoのライブラリでGPSモジュールで時刻を取得する関連リンクArduinoのライブラリを使って動作確認を行ったことを下記リンクにまとめています。XIAOで学べるソフト開発と標準ライブラリの使い方ESP32-WROOM-32Eで学べるソフト開発と標準ライブラリの使い方PR:技術系の通信教育講座ならJTEX最後まで、読んでいただきありがとうございました。抵抗をたくさん使います。抵抗の使い方を間違えてしまうと消費電力が大きくなってしまい故障の原因になってしまいます。抵抗を使う上で最低限押さえておきたい定格電力と定格電圧及び最高使用電圧について説明しています組み込みエンジニアPICマイコン(PIC12F675)のリセットとプロテクトマイコンのソフトを開発しているとマイコンをリセットやプログラムを保護するかを検討することがあります。PIC12F675のプログラムの保護やリセットに関する設定があり、何らかの要因でソフトウェアがリセットした場合に切り分けることができます。組み込みエンジニアPICマイコン(PIC12F675)で実現できる機能と解説リンクまとめマイコンのWDT・タイマー・AD変換などの考え方はマイコンの種類を問わず共通です。PIC12F675は小さくて頼りなさそうですが、レジスタの設定方法や各種機能について基礎を学ぶことができます。応用すると製品化にも使えるなど用途は様々です。XIAOのWire(SPI)を使用すると加速度センサー(ADXL345)の加速度やタップ情報などを取得することができます。ADXL345のライブラリを流用しながら加速度センサーの情報を取得する方法をまとめました。XIAO31ESP32-WROOM-32E37TWELITE(トワイライト)26PIC16F182731PIC12F67522ノウハウ(体験談)36趣味と生活29その他6タグオペアンププロフィールENGかぴ当ブログの運営者のENGカピです。組み込みエンジニアとして10年以上の経験を活かしてセンサーモジュール等の動作確認したことをまとめています。広告、アフィリエイト収益で当ブログを運営させていただいております。defined.")}))})()タイトルとURLをコピーしました。