12-11-2016 08:55 AM - 編集済み 12-11-2016 08:16 PM
***** LabVIEWアドベントカレンダー2016年12月12日の記事です。 *****
人口急減中の中山間地域の路面診断ツールを作ろうと思った (・・・なんちゃって)
ESP8266とGPSと加速度・ジャイロセンサーとSDカードがあれば高機能な路面のデコボコ記録計ができそうだと思いました。
まだデバッグに苦戦しております。
使用する主なモジュール
GPS:「GPS受信機キット 1PPS出力付き 「みちびき」対応」 --- 2200円
加速度・ジャイロセンサー:「GY521」 --- 210円
SDカード:「マイクロSDカードスロットDIP化キット」 --- 300円
ESP8266:とりあえず「ESPr Developer(ESP-WROOM-02開発ボード)」 --- 2160円
ピン接続
SDカード(SPI)---------------ESPrDeveloper
CD/DAT3(2pin)---------------IO16
CMD(3pin)---------------IO13
VDD(4pin)---------------+3.3
CLK(5pin)---------------IO14
VSS(6pin)---------------GND
DAT0(7pin)---------------IO12
GY521---------------ESPrDeveloper
3.3V(1pin)---------------VCC
GND(2pin)---------------GND
SCL(3pin)---------------IO5
SDA(4pin)---------------IO4
GPS---------------ESPrDeveloper
5V---------------ESPrDeveloperには無いので別のUSB端子から給電
GND---------------ESPrDeveloperには無いので別のUSB端子から給電
RXD---------------使用しない
TXD---------------RXD
ESPrDeveloperではモード切替にIO0, IO2, IO15を使うのでふつうのIOとしては避けておきます。GPSのTXDをESPrDeveloperのRXDにつないでいるとプログラムの書き込みの時に誤動作しますので、ピンを抜いてから書き込む一手間が発生します。
とりあえず目標とする動作とデバッグ状況
ESPrDeveloperの特徴ではありますが、Wi-Fiは今回も使いません。
(1) GPSデータを読み込んで必要なデータを拾って整形します。
(2) 1秒ごとに加速度・ジャイロデータを10回測定して、平均値と最大値と最小値を求めます。
(3) SDカードに記録します。
(1)と(2)が連続したCSVの文字列になっています。SDへの記録部分が難航していて適当なテスト文字列などは単独テストではOKなのですが、(1)から(3)までを統合すると何も記録されない残念な状況です。
ここまで持ってくるのにも苦労しているのでメモを残しておきます。
GPSで時刻、緯度、経度、高度、補足衛星数をとりこみます。
GPSモジュールからは、デフォルトでは1秒ごとにNMEA0183準拠の文字列が出力されます。GPSからの文字列については「GPSロガーのPC版 」を参考にしてください。
文字列全体は500文字ぐらいで、欲しい部分(一部*に置換)は以下の70文字ぐらいです。「$GPGGA,093808.000,39**.*439,N,141**.*081,E,1,8,1.16,**2.8,M,36.3,M,,*53」
1PPSの信号と同期すれば文字列の先頭から受け取ることができますが、自由になるIOを使い切っているので欲しい文字列($GPGGA,)が現れるまでに最大1秒かかります。600文字受け取ればどこかに完全なGPGGAの一行が含まれているので論理的には探すのは簡単なのですが、この方法はLabVIEWコンパイラには負担が大きくて実行中に何処かに行ってしまいます。
そこで、地道にプログラムを書かなくてはいけません。(LabVIEWコンパイラが便利なのかどうか疑う場面です。普通と言えば普通なのですが、、。)
64文字づつ受け取ってシフトレジスタの文字列に連結します。
"$GPGGA,"が含まれていて、かつその後ろに70文字(プログラムでは100)あれば解析できます。文字数が足りなければ"$GPGGA,"の前は削除してもう64文字受け取ります。
"$GPGGA,"が検出されなければ"$"を探して、"$"がなければシフトレジスタの文字列は空に、"$"があれば"$"の前を削除します。
CSV用に","を挿入する関数
解析する関数
"$GPGGA,"を受け取る関数
ちょっと面倒くさいですね。
SDはサンプルのまま書き込むだけなのですが、合体するとうまく動かない。
手持ちのArduino Due互換機に移行してみようか、オシロを出してSDの信号を見てみようか、もうArduinoでやってしまおうか
暫し思案のしどころです。
そうそう、加速度、ジャイロのデータも苦労しました。ドライブで使うことを考えると3時間ぐらいはSDに記録したいのでたぶん生データすべてを保存することはできません。でも、ぼこデータは細かいに越したことはないので10msec間隔で読み取って10秒毎に平均値、最大値、最小値を記録しようかと思いましたが、コンパイルはできても動かない。
配列とシフトレジスタの多用がダメなのだろうと考えて、地道にばらしてみました。データも1秒間隔で10秒ごとの保存に変更。
こういうのはすごく嫌いなのですが、配列操作が得意なLabVIEWが台無しです。
まあね、こんな小さなWiFiのコントローラの隙間にLabVIEWのプログラムを入れ込めるだけでもすごいのですが、
デバッグがもっと楽になれば、
コンパイルしてダウンロードできてもどうして動かないのか、理由がすぐにわかるようになれば良いですね。
クリスマスまでに動作テストができるようになったらいいな。