create every day - 福野泰介の一日一創

体育とプログラミング教育、GPS x IchigoJamで校庭に絵を描いたり新スポーツ創ったり

2017/10/05 23:55:00
#KidsIT #IchigoJam #maker 

自分たちで外で遊ぶコンピューターゲームを創って遊ぼう!

IchigoJamで色を変えるボタンとsakura.ioをつなげば、サーバーに送ってみんなでお絵かきしたり、オープンデータを使って近所の宝探しをしたり、いろいろと遊べそうです! データを外部記憶装置(EEPROM)にどんどん書き込んでいく形にすれば、自分だけの地図を作ることもできちゃいます。

鯖江市のバスIoTの「つつじバス x sakura.io」GPSデータも合わせて送信する版の準備も兼ねて、 日本の衛星、みちびき対応のGPSモジュール「GPS受信機キット AE-GYSFDMAXB 2,200円(秋月)」をIchigoJamにつないで使ってみました。


緯度経度のデータをGPSモジュールからシリアル信号で受け取って、緯度経度の部分を切り出して分で表示するプログラムを、液晶モジュールと単3電池のモバイルバッテリーで動かしている様子。

まずはモジュールをはんだづけ。GPSモジュールから5ピン、ピンヘッダーやピンソケットなどを使って配線。

電源は5V、GNDをIcigoJam TのCN5につないで、IchigoJamの方をシリアル通信速度を9600bpsに合わせて準備。

BPS9600

GPSモジュールのTXDをIchigoJamのRXDに接続すると、画面にデータがつぎつぎと表示されます。
* IchigoJam 1.2では、「OK0」というコマンドでエラーメッセージが出ないようにできるので、データの確認に便利です。「OK」または「OK1」で元に戻ります。

データは、NMEAセンテンスといってGPSモジュールの標準の形式です。多すぎるので緯度経度だけを取得するシンプルなメッセージ$GPRMCだけを、3秒に1度だけ送ってもらうよう設定します。 GPSモジュールのTXDの線を一旦抜き、RXDからIchigoJamのTXDに接続して、次のコマンドを実行。

UART3:?:?"$PMTK314,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*2B":UART0

UART3は、GPSモジュール向けの改行コードCR+LFを送信するモード。PMTK314で受け取るメッセージを設定します。 GPSモジュールのTXDをIchigoJamのRXDにつないでみて確認しましょう。

9600bpsではちょっと遅いので、RXDを抜き、IchigoJam標準の115200bpsに設定して高速化!

UART3:?"$PMTK251,115200*2F":UART0:BPS0


GPSモジュールとIchigoJamは4本の線で接続。設定はGPSモジュールに記憶されるので、設定が終わったらGPSモジュールからのTXDは不要です。
初回だけ位置測位に時間がかかりますが、次からの起動では数秒で位置データが来るので、必要なときだけ電源をいれる用途にも使いやすい!

次に受け取ったデータを変数にいれます。
シリアルからの信号は、INKEY()で取得できるので、開始記号「$(=36)」を目印に、画面先頭に表示します。

10 UART0,1 20 K=INKEY():IF K!=36 CONT ELSE CLS 30 ?CHR$(K);:K=INKEY():IF K!=13 CONT ELSE ? 40 GOTO 20

UART0,1で、シリアル送信は止めて、シリアル受信だけを有効にしています。
開始記号でCLS、改行コード13が来るまで表示します。

$GPRMCメッセージのフォーマットは、時間、A(正常) or V(警告)、緯度、経度・・・となっているので、Aを受信していれば、緯度経度の読み取りをします。 数値の読み取りは画面上の文字コードから"0(=48)"を引けばOKです。

300 @ATOI:M=0:FORI=1TOL:M=M*10+PEEK(A)-48:A=A+1:NEXT:RTN

画面の左上に123と書いておき、呼び出すと値123となります。(Lは長さ、2にすると12になる)

LC 0,0:?"123" A=#900:L=3:GSB@ATOI:?M A=#900:L=2:GSB@ATOI:?M

応用して、dddmm.mmmmと度と分で表されている緯度経度を、整数と小数部分それぞれに分けて読み取るプログラムを作ります。

100 @PRS:A=#900+18:IF PEEK(A)!=65 RTN 110 GSB@GETM:LET[0],N,M:GSB@GETM:LET[2],N,M:RTN 200 @GETM:A=A+2:L=3-(PEEK(A+4)=46):GSB@ATOI:N=M 210 L=2:GSB@ATOI:N=N*60+M 220 A=A+1:L=4:GSB@ATOI 230 A=A+1:IF PEEK(A)=83 OR PEEK(A)=87 N=-N 240 ?N,M:RTN

画面先頭に$GPRMCのメッセージを表示し、@PRSを呼び出すと配列の0〜3に緯度経度が分数の小数表記で入ります。

液晶モジュールを接続したモバイルバージョンのプログラム全文がこちら。

10 UART0,1:SWITCH1:LED1 20 K=INKEY():IF K!=36 CONT ELSE CLS 30 ?CHR$(K);:K=INKEY():IF K!=13 CONT ELSE ? 40 GSB@PRS:GOTO 20 100 @PRS:A=#900+18:IF PEEK(A)!=65 RTN 110 GSB@GETM:LET[0],N,M:GSB@GETM:LET[2],N,M:RTN 200 @GETM:A=A+2:L=3-(PEEK(A+4)=46):GSB@ATOI:N=M 210 L=2:GSB@ATOI:N=N*60+M 220 A=A+1:L=4:GSB@ATOI 230 A=A+1:IF PEEK(A)=83 OR PEEK(A)=87 N=-N 240 ?N,M:RTN 300 @ATOI:M=0:FORI=1TOL:M=M*10+PEEK(A)-48:A=A+1:NEXT:RTN

*シリアル受信がおかしくなる現象対策版をIchigoJam-FANにて、β版1.2b51として公開中

GPSを持って外に出よう!

Tweet
クリエイティブ・コモンズ・ライセンス
この作品は「Creative Commons — CC BY 4.0」の下に提供されています。
CC BY 福野泰介 - Taisuke Fukuno / @taisukef / high-res profile image