親子IoTワークショップ

マイコンとクラウドを使ってIoTとプログラミングを学ぼう

[ トップ | 開催予定・概要 | 2024-12開催 | お知らせ | Facebook ]

位置(緯度・経度)を測定する

ここでは、GPSの受信機を使って、現在位置の緯度(latitude)と経度(longitude)を測定する方法を説明します。

GPS受信機から位置情報を読みとる

まず最初に、ラズパイOSを最新の状態にアップデートしてください。Terminalで以下のコマンドを実行します。

sudo apt update -y

次に、以下のコマンドを実行:

sudo apt full-upgrade -y

これで、ラズパイOSが最新の状態にアップデートされました。

続いて、gps-loc.pygpsserial.pyをラズパイ上のThonnyへコピーして保存してください。この2つのファイルは同じフォルダの中に保存してください。gps-loc.pyは、GPS受信機から送られてくる位置情報(緯度・経度)をラズパイ側で読みとるプログラムです。

GPS受信機から位置情報を読みとるには、以下の行をプログラムの先頭部分に書きます。詳細は避けますが、位置情報を読みとるための「おまじない」だと思っておいてください。

import gpsserial as gps

そして、以下のようにして(3-4行目)、GPS受信機から送られてくる位置情報を読む準備をします。

serialPort = "/dev/serial0"
gpsSerialPort = gps.init(serialPort)

準備作業はinit()という関数(function)を使います。この関数が返すのは、GPS受信機から送られてくる位置情報を受けとる場所(受け取り口)だと思ってください。これが変数gpsSerialPortに格納されています。

準備が終わったら、以下のようにして位置情報を読みとります。

gpsData = gps.getData(gpsSerialPort)
print(gpsData)

このように、位置情報を得るには、getData()という関数(function)を使います。この関数は、GPS受信機が送ってきた位置情報をそのまま返します。例えば、次のような位置情報がThonnyのShellに表示されます。

$GPRMC,041023.00,A,4229.93608,N,07116.56893,W,0.010,,290921,,,A*6F\r\n'

この位置情報は、GPS受信機が送ってきたデータそのものです。こういうデータは、まだ何も処理・加工(process)していないので「生データ」(raw data)と呼ばれます。生データは、GPS受信機のような機械が作ったデータそのものなので、上の例のように人間の目には読みにくく理解しにくいです。そこで、以下の表にある関数を使って、生データの中から自分の知りたい情報を抜き出します。それぞれの関数を使うときには、生データを渡します。例えば、getLatitude()を使うときには、次のようにします。

lat = gps.getLatitude(gpsData)
関数の名前 関数がやること
getLatitude() GPS受信機が送ってきた生データから緯度の部分を抜き出して、文字列として返す。上記の生データを使う場合には、”4229.93608”が返る。
getLongitude() GPS受信機が送ってきた生データから経度の部分を抜き出して、文字列として返す。上記の生データを使う場合には、”07116.56893”が返る。
getNSIndicator() GPS受信機が送ってきた緯度が、北緯と南緯のどちらなのかを調べる。文字の”N”が返れば北緯、文字の”S”が返れば南緯。上記の生データを使う場合には、”N”が返る。
getEWIndicator() GPS受信機が送ってきた経度が、東経と西経のどちらなのかを調べる。文字の”E”が返れば東経、文字の”W”が返れば西経。上記の生データを使う場合には、”W”が返る。
getLatitudeDegree() GPS受信機が送ってきた緯度が何度かを調べる。度数を数値で返す。上記の生データを使う場合には、42が返る。
getLatitudeMinute() GPS受信機が送ってきた緯度が何分かを調べる。分数を数値で返す。上記の生データを使う場合には、29.93608が返る。
getLongitudeDegree() GPS受信機が送ってきた経度が何度かを調べる。度数を数値で返す。上記の生データを使う場合には、71が返る。
getLongitudeMinute() GPS受信機が送ってきた経度が何分かを調べる。分数を数値で返す。上記の生データを使う場合には、16.56893が返る。
getDecimalLatitude() GPS受信機が送ってきた緯度を10進数(小数)表記に変換して、小数値として返す。
getDecimalLongitude() GPS受信機が送ってきた経度を10進数(小数)表記に変換して、小数値として返す。

使える関数はたくさんありますが、たいていの場合は、最後の2つの関数(getDecimalLatitude()とgetDecimalLatitude())を使うだけで十分だと思います。

gps-loc.pyの最後の部分では、10進数(小数)表記の緯度と経度を使って、Google Mapsで使えるリンクを作っています。

gMapsLink = "https://www.google.com/maps?q=" + str(decimalLat) + ","
                           + str(decimalLon)
print("Google Maps link: " + gMapsLink)

作られたリンクはThonnyのShellに表示されます。これをコピーしてWebブラウザで開くと、GPS受信機が送ってきた位置が地図上に表示されます。

なおgps-loc.pyは、次のような全体構造になっています。

while True:
    try:
        GPS受信機から生データを読みとる
        さまざまな関数を使って自分の知りたい情報を抜き出す
    except KeyboardInterrupt:
        break

つまり、GPS受信機から生データを読みとり、自分の知りたい情報を抜き出す作業を延々と(無限に)くりかえします。この作業を止めるには、ThonnyのShellの部分をマウスでクリックして、キーボードでCtrl-Cしてください。

自習プロジェクトの目次に戻る