2015-06-30 22:45 | カテゴリ:PIC応用回路
PICライター完成したら、、、


DeLoreanの塗装を始めましたが、PICライターを製作したので、何かPICを焼きたい!

というわけで、部品箱をごそごそしていましたら、GPSセンサーが出てきました。
2-3年前に購入した部品で、電源を投入すると、GPS信号を受信して、位置情報や、こまかなGPS情報をRS232フォーマットで、しかもASCIIコードで垂れ流してくれます。
RS232を受信できるPCやPICがあれば簡単にデータを読み出せます。

DSC01021.jpg

ちょうど先日、XC8でC言語を勉強し始めた時に製作した、液晶表示器があります。
おまけに、RS232の送受信もC言語でプログラムしたばかりです。

あとは、GPSセンサーとRS232で接続して、受信したASCIIコードを整理して液晶に表示すれば、GPSデータ表示器になりそうです。

もっとも、家でしか動作しないので、GPS信号を受信しなくても、位置は分かりますが(笑)

とりあえず、動作確認のために、ブレッドボードにGPSセンサーを取り付け、電源を繋いで、信号をRS232でPCに取り込んでみることにしました。
このGPSセンサーには、専用のPC用アプリケーションがあり、GPSから出力されるデータをPC上で確認できます。
手持ちに、あったRSケーブルとジェンダーチェンジャーを駆使して、なんとかPCと接続しました。

GPS2.jpg

電源投入直後は衛星を捕捉していませんので、データはありませんが、数年ぶりに使用するので、受信完了まで10分以上かかりました。
GPS信号を正しく受信すると、LEDが点滅して、知らせてくれます。

PCに接続し、専用のアプリケーションソフトでGPSの信号をRS232で取り込み、画面にGPSで受信したさまざまなデータを表示してくれます。

GPS3.jpg


ちゃんとセンサーは、正しく動作していると思われます。
あとは、これをPICでちゃんと受信して、液晶表示できるようにプログラミングをしなければなりません。


RS232の送信受信のソフトは、先日、関数として製作してありますので、ボーレートなど通信の条件を合わせれば問題なくGPSと通信できるはずです。
早速、C言語でプログラミングを行い、GPSと接続してみます。
、、、、、
液晶画面には何も表示されません。

こうなると、何処から手をつけて問題解決に持っていくか、ストーリーを立てないといけません。
問題がありそうな所として、

1)GPSのRS232信号の規格とPICの設定(9600ボー)が合っているか?
2)通信規格の設定が合っているとして、正しく情報を受け取れているか?
3)正しくデータが受信できているとして、GPSのメッセージ文字列がLCDになぜ表示されないのか?
4)その他

まず、GPSセンサーの9600ボーのRS232出力ですが、PCのポートに接続して専用アプリで受信し、PCに表示できていますので、1)はOKのはずです。
次に、2)のちゃんとRS232のデータを1バイトずつ正しく受信できているかを見る為に、1バイトを受信したら、それを液晶画面の特定の場所に単に表示するプログラムを作成し、動作させました。
すると、RS232のデータを1バイト受信したところで、ERROR(オーバーフロー)して、受信ルーチンの途中で止まっていることが分かりました。
ボーレートは9600で合っているはずなのですが、信号のクオリティーが低いのか、ノイズなのか分かりません。
あるいは、C言語(使用しているのはMPLABXの無料のXC8で、最適化がなされていないバージョン)の最適化が低い為に、データの取りこぼしがあるのかも知れません。
PICのシリアル送受信(UART)の設定でクロックを設定するレジスターにセットする数字を上下して、受信が可能か調べました。
すると、時々、調子が良いと何かの文字を受信できるようになり、それが一文字ずつLCDに表示されるようになりました。

DSC01018.jpg

DSC01020.jpg


よしよし、それではこの文字データを一文字でななく、10文字くらい貯めて、一括して表示して、データがどのくらい正確に受信できているか調べることにしました。

ところが、CHAR変数に入れた一文字は表示できるのですが、str[]に入れた文字列が全く表示できません。

//変数

unsigned char msg[] = "Programed by Vivid";
unsigned char str[21];

この様に定義して、str[]に順次代入して( str[i]=rs232_data として)最後にstrを液晶表示関数に渡して表示するものですが、これが上手く行きません。
msg[]に msg[i]=rs232_data として記述すると上手く表示できます。
理由は良く分かりませんが、たぶん、文字配列とポインターなどの関係だと思いますが、まー、とりあえず動いたのでOKとしました。

次は、文字が時々文字化けする件ですが、転送レートが早いのかもしれないと思い、4800ボーに落としてみたら、文字化けしないで受信できました。

と言うわけで、GPS信号を受信して、LCD表示させることが出来ました。

DSC01022.jpg

ちなみに、このGPRMCコマンドは、GPS受信機から、基準年月日時刻、東経や西経、北緯、南緯、速度、進行方向などの各種データを出力するものです。
写真では、基準時間 12:00:23.000(たぶんグリニッジ標準時と思います)をあらわしています。

今後は、これをハンディータイプのケースに入れて、屋外で、位置や時刻、速度などを表示できる工作をしたいと思います。






管理者のみに表示する