9.8 KiB
GPSデータを読み取る - Raspberry Pi
このレッスンでは、Raspberry PiにGPSセンサーを追加し、その値を読み取ります。
ハードウェア
Raspberry PiにはGPSセンサーが必要です。
使用するセンサーはGrove GPS Air530センサーです。このセンサーは複数のGPSシステムに接続でき、迅速かつ正確な位置情報を取得できます。センサーは2つの部分で構成されており、センサーのコア電子部品と、薄いワイヤーで接続された外部アンテナがあります。このアンテナは衛星からの電波を受信します。
このセンサーはUARTセンサーであり、UARTを介してGPSデータを送信します。
GPSセンサーを接続する
Grove GPSセンサーはRaspberry Piに接続できます。
タスク - GPSセンサーを接続する
GPSセンサーを接続します。
-
Groveケーブルの片方の端をGPSセンサーのソケットに差し込みます。ケーブルは一方向にしか差し込めません。
-
Raspberry Piの電源を切った状態で、Groveケーブルのもう片方の端を、Piに取り付けられたGrove Base HatのUARTと記されたUARTソケットに接続します。このソケットはSDカードスロットに近い側の中央列にあり、USBポートやイーサネットソケットの反対側に位置しています。
-
GPSセンサーを配置し、接続されたアンテナが空を見渡せる位置に置きます。理想的には窓の近くや屋外に置くと良いです。アンテナに障害物がない方が信号を受信しやすくなります。
GPSセンサーをプログラムする
Raspberry Piをプログラムして、接続されたGPSセンサーを使用できるようにします。
タスク - GPSセンサーをプログラムする
デバイスをプログラムします。
-
Piの電源を入れ、起動を待ちます。
-
GPSセンサーには2つのLEDがあります。青いLEDはデータが送信されると点滅し、緑のLEDは衛星からデータを受信すると毎秒点滅します。Piの電源を入れた際に青いLEDが点滅していることを確認してください。数分後に緑のLEDが点滅します。点滅しない場合はアンテナの位置を調整する必要があるかもしれません。
-
VS Codeを起動します。Pi上で直接起動するか、Remote SSH拡張機能を使用して接続します。
⚠️ 必要に応じて、レッスン1でのVS Codeのセットアップと起動手順を参照してください。
-
Bluetoothをサポートする新しいバージョンのRaspberry Piでは、Bluetoothに使用されるシリアルポートとGrove UARTポートに使用されるシリアルポートが競合します。この問題を解決するには、以下の手順を実行してください:
-
VS Codeのターミナルから、以下のコマンドを使用して
nano
という組み込みのターミナルテキストエディタで/boot/config.txt
ファイルを編集します:sudo nano /boot/config.txt
このファイルは
sudo
権限(管理者権限)で編集する必要があるため、VS Codeでは編集できません。VS Codeはこの権限で実行されません。 -
カーソルキーを使用してファイルの末尾に移動し、以下のコードをコピーして末尾に貼り付けます:
dtoverlay=pi3-miniuart-bt dtoverlay=pi3-disable-bt enable_uart=1
通常のキーボードショートカットを使用して貼り付けます(Windows、Linux、Raspberry Pi OSでは
Ctrl+v
、macOSではCmd+v
)。 -
Ctrl+x
を押してファイルを保存し、nanoを終了します。変更したバッファを保存するか尋ねられたらy
を押し、enter
を押して/boot/config.txt
を上書きすることを確認します。間違えた場合は保存せずに終了し、これらの手順を繰り返してください。
-
以下のコマンドを使用して
/boot/cmdline.txt
ファイルをnanoで編集します:sudo nano /boot/cmdline.txt
-
このファイルにはスペースで区切られたキー/値ペアがいくつか含まれています。キー
console
に関連するキー/値ペアを削除してください。それらは以下のように見える可能性があります:console=serial0,115200 console=tty1
カーソルキーを使用してこれらのエントリに移動し、通常の
del
またはbackspace
キーを使用して削除します。例えば、元のファイルが以下のようになっている場合:
console=serial0,115200 console=tty1 root=PARTUUID=058e2867-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
新しいバージョンは以下のようになります:
root=PARTUUID=058e2867-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
-
上記の手順に従ってこのファイルを保存し、nanoを終了します。
-
Piを再起動し、再起動後にVS Codeに再接続します。
-
-
ターミナルから、
pi
ユーザーのホームディレクトリにgps-sensor
という新しいフォルダを作成します。このフォルダ内にapp.py
というファイルを作成します。 -
このフォルダをVS Codeで開きます。
-
GPSモジュールはUARTデータをシリアルポート経由で送信します。Pythonコードからシリアルポートと通信するために
pyserial
Pipパッケージをインストールします:pip3 install pyserial
-
以下のコードを
app.py
ファイルに追加します:import time import serial serial = serial.Serial('/dev/ttyAMA0', 9600, timeout=1) serial.reset_input_buffer() serial.flush() def print_gps_data(line): print(line.rstrip()) while True: line = serial.readline().decode('utf-8') while len(line) > 0: print_gps_data(line) line = serial.readline().decode('utf-8') time.sleep(1)
このコードは
pyserial
Pipパッケージからserial
モジュールをインポートします。その後、Grove Pi Base HatがUARTポートに使用するシリアルポートのアドレスである/dev/ttyAMA0
に接続します。そして、このシリアル接続から既存のデータをクリアします。次に、
print_gps_data
という関数が定義され、渡された行をコンソールに出力します。その後、コードは永遠にループし、各ループでシリアルポートから可能な限り多くのテキスト行を読み取ります。そして、各行に対して
print_gps_data
関数を呼び出します。すべてのデータが読み取られた後、ループは1秒間スリープし、再度試行します。
-
このコードを実行します。GPSセンサーからの生の出力が以下のように表示されます:
$GNGGA,020604.001,4738.538654,N,12208.341758,W,1,3,,164.7,M,-17.1,M,,*67 $GPGSA,A,1,,,,,,,,,,,,,,,*1E $BDGSA,A,1,,,,,,,,,,,,,,,*0F $GPGSV,1,1,00*79 $BDGSV,1,1,00*68
コードを停止して再起動する際に以下のエラーが発生した場合、
try - except
ブロックをwhileループに追加してください。UnicodeDecodeError: 'utf-8' codec can't decode byte 0x93 in position 0: invalid start byte UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf1 in position 0: invalid continuation byte
while True: try: line = serial.readline().decode('utf-8') while len(line) > 0: print_gps_data() line = serial.readline().decode('utf-8') # There's a random chance the first byte being read is part way through a character. # Read another full line and continue. except UnicodeDecodeError: line = serial.readline().decode('utf-8') time.sleep(1)
💁 このコードはcode-gps/piフォルダにあります。
😀 GPSセンサーのプログラムが成功しました!
免責事項:
この文書は、AI翻訳サービス Co-op Translator を使用して翻訳されています。正確性を追求しておりますが、自動翻訳には誤りや不正確な部分が含まれる可能性があることをご承知おきください。元の言語で記載された文書が公式な情報源とみなされるべきです。重要な情報については、専門の人間による翻訳を推奨します。この翻訳の使用に起因する誤解や誤認について、当方は一切の責任を負いません。