You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
IoT-For-Beginners/translations/ja/3-transport/lessons/1-location-tracking/pi-gps-sensor.md

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センサー

  1. Groveケーブルの片方の端をGPSセンサーのソケットに差し込みます。ケーブルは一方向にしか差し込めません。

  2. Raspberry Piの電源を切った状態で、Groveケーブルのもう片方の端を、Piに取り付けられたGrove Base HatのUARTと記されたUARTソケットに接続します。このソケットはSDカードスロットに近い側の中央列にあり、USBポートやイーサネットソケットの反対側に位置しています。

    UARTソケットに接続されたGrove GPSセンサー

  3. GPSセンサーを配置し、接続されたアンテナが空を見渡せる位置に置きます。理想的には窓の近くや屋外に置くと良いです。アンテナに障害物がない方が信号を受信しやすくなります。

GPSセンサーをプログラムする

Raspberry Piをプログラムして、接続されたGPSセンサーを使用できるようにします。

タスク - GPSセンサーをプログラムする

デバイスをプログラムします。

  1. Piの電源を入れ、起動を待ちます。

  2. GPSセンサーには2つのLEDがあります。青いLEDはデータが送信されると点滅し、緑のLEDは衛星からデータを受信すると毎秒点滅します。Piの電源を入れた際に青いLEDが点滅していることを確認してください。数分後に緑のLEDが点滅します。点滅しない場合はアンテナの位置を調整する必要があるかもしれません。

  3. VS Codeを起動します。Pi上で直接起動するか、Remote SSH拡張機能を使用して接続します。

    ⚠️ 必要に応じて、レッスン1でのVS Codeのセットアップと起動手順を参照してください。

  4. Bluetoothをサポートする新しいバージョンのRaspberry Piでは、Bluetoothに使用されるシリアルポートとGrove UARTポートに使用されるシリアルポートが競合します。この問題を解決するには、以下の手順を実行してください

    1. VS Codeのターミナルから、以下のコマンドを使用してnanoという組み込みのターミナルテキストエディタで/boot/config.txtファイルを編集します:

      sudo nano /boot/config.txt
      

      このファイルはsudo権限管理者権限で編集する必要があるため、VS Codeでは編集できません。VS Codeはこの権限で実行されません。

    2. カーソルキーを使用してファイルの末尾に移動し、以下のコードをコピーして末尾に貼り付けます:

      dtoverlay=pi3-miniuart-bt
      dtoverlay=pi3-disable-bt
      enable_uart=1
      

      通常のキーボードショートカットを使用して貼り付けますWindows、Linux、Raspberry Pi OSではCtrl+v、macOSではCmd+v)。

    3. Ctrl+xを押してファイルを保存し、nanoを終了します。変更したバッファを保存するか尋ねられたらyを押し、enterを押して/boot/config.txtを上書きすることを確認します。

      間違えた場合は保存せずに終了し、これらの手順を繰り返してください。

    4. 以下のコマンドを使用して/boot/cmdline.txtファイルをnanoで編集します

      sudo nano /boot/cmdline.txt
      
    5. このファイルにはスペースで区切られたキー/値ペアがいくつか含まれています。キー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
      
    6. 上記の手順に従ってこのファイルを保存し、nanoを終了します。

    7. Piを再起動し、再起動後にVS Codeに再接続します。

  5. ターミナルから、piユーザーのホームディレクトリにgps-sensorという新しいフォルダを作成します。このフォルダ内にapp.pyというファイルを作成します。

  6. このフォルダをVS Codeで開きます。

  7. GPSモジュールはUARTデータをシリアルポート経由で送信します。Pythonコードからシリアルポートと通信するためにpyserial Pipパッケージをインストールします

    pip3 install pyserial
    
  8. 以下のコードを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秒間スリープし、再度試行します。

  9. このコードを実行します。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 を使用して翻訳されています。正確性を追求しておりますが、自動翻訳には誤りや不正確な部分が含まれる可能性があることをご承知おきください。元の言語で記載された文書が公式な情報源とみなされるべきです。重要な情報については、専門の人間による翻訳を推奨します。この翻訳の使用に起因する誤解や誤認について、当方は一切の責任を負いません。