hnii@twitterです。以前紹介した、「ラズパイとRTK-GPSを使って1m移動する毎に一度ピッと鳴る装置」を改良しました。良い感じになってきたので「その2」をお送りします。元々の目標は「海の上で使えるスピードメータを作ってみたい」でした。前回の「その1」ではゆっくり動かした場合には正しく動くことまでは確認出来ました。速く動かすと音が一定周期にならず、ピピッピピッと偏ってしまうことが問題でした。そこで、「その2」では時間遅れが少なく音が途切れないようにすることを目標としました。GPSモジュールには通信ポートが複数あることが多く、今回のボードもTTLレベルのシリアルポートがあります。そこでそのポートにArduinoをつないで1mごとに音を出すことにしました。Arduinoのソフトなら、時間遅れは一定の範囲に抑えられるはずです。ライブラリのインストールライブラリのインストール画面つくりかたハードウェア半田付けしたのはArduinoのヘッダー取付とブザー(前回と同じタイプ)をArduinoのA6ポートとGNDの間につなぐところだけでした。あとはGPSモジュールとArduino互換ボードのシリアル1の間を以下の配線でつなぎました。Arduinoへ5Vの電源をつなぎました。これらをまとめるとこんなシステムになりました。ONucenter画面その結果、今回利用したGPSモジュールにおいては小数点以下の桁数が5桁から7桁になります。(前回は50mSにしたが、処理落ちしてしまうので)SERIALポート設定UBX-CFG-PRTでUART1を指定し、baudrateを38400に設定。GxGGAメッセージをUART1にも出力。浮動小数点から固定小数点へその1でつくったpythonスクリプトをArduino用のスケッチに変換します。)が使えないためfloatで演算してみたのですが、1mを正しく計測するには演算精度が足りないようでした。最初は簡単に変換するだけかと思いましたがうまくいきませんでした。そこでlongで座標がとれるようなライブラリを探してみました。私が見つけたのはadafruitのGPSライブラリで、固定小数点を用いており、10,000,000を緯度経度の1度に割り当てています。この分解能ですと、値が1変わった場合には大体1cm程度となるので今回の用途では十分と考えました。ライブラリ変更しかし、ライブラリから出てくる値を確認して見ると変化が連続的ではありません。16おきに変化しているようです。そこで、ライブラリのソースを見たところ、必要な桁数を取得していなかったので、ソースを2カ所変更します。Adafruit_GPS::parseLon()の部分のminutesへ代入しているところを変更します。変更することになりそうです。今回は試験的に直接変更しましたが、他のプロジェクトでもこのライブラリを使う場合にはコピーを取ってから作業を行ってください。この精度の良くなったライブラリを使ってGPSread2.inoというプログラムをArduinoに焼き込みました。面倒だったのは、longとfloatを使った式です。キャストをしっかり入れました。以下の行などが典型的です。longの差分にfloatを掛けたあと、再度longに戻すように指示しました。どのキャストを外しても値が全然違ってきます。起動方法は、前回と全く同一です。raspberry-piにloginして、起動スクリプトのstart.shを走らせるだけです。これでRTK-GPSの基地局情報をGPSモジュールに送り込むことができ、Arduinoは電源投入と同時に動き出すので、値が1mずれるごとにピっと音がでるようになります。今度こそ安定して動くか歩いて実験します。vimeo.com結果は前よりはとても良くなりました。両側がビルだったり環境が悪いと、RTK出力がfloat解になったり、DGPSになるのが音で分かるのが面白いです。ビル沿いを歩くとfloat解ですが、道の真ん中を歩くとまたFIX解にもどったりします。まとめ初心者がヨットの操船時に手助けできるような海上用スピードメータを再度試作してみました。音の間隔が前回より安定したので、これなら実際に使えそうです。次回体験する時には実際に持って乗り込んでみたいです。(9)月別アーカイブスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。