SCP1000とGPSモジュールについて

mbed についてのご質問はこちら。情報交換などにもご利用ください。

SCP1000とGPSモジュールについて

投稿記事by 吉田幸司 » 2014年4月04日(金) 13:48

こんにちは、唐津東高校の吉田です。
先日はありがとうございました。

SCP1000とGPSモジュール(GT-720F)を使用してGPS、温度、気圧のデータを同時に取得しようと以下のようなプロブラムを実行しました。
コード: 全て選択
#include "mbed.h"
#include "SCP1000.h"

DigitalIn mysw(p29);
LocalFileSystem local("local");

int main() {
   
    SCP1000 scp1000(p5,p6,p7,p8);
    scp1000.setOperationMode(SCP1000::HIGH_SPEED_MODE);
   
    Serial gps(p9,p10);
    gps.baud(9600);
   
    FILE*fp=fopen("/local/local.txt","a");
   
    while(!mysw) {
       
        float temperature  = scp1000.readTemperature();
        float pressure     = scp1000.readPressure();
        char GPS           = gps.getc();
       
        printf("%c",GPS);
        fprintf(fp,"%4.2f %3.1f \r\n",temperature,pressure);
    }
    fclose(fp);
}

その結果、GPSモジュールのみが(下のような)適切でないデータを取得しました。(SCP1000は期待した値をとりました。)
コード: 全て選択
$GPRM,0,$GPRM0,,$GPRM00
$GPRM.0,0$GPRM06
$GPRM4G,$GPRM4,,$GPRM0
P$GPRM001K$GPRM020$GPRM.V,$GPRM,02$GPRM0,4$GPRM0.
$GPRMC,7.$GPRM05$$GPRMA0,$GPRM0,,$GPRM,M60$GPR0E9,$GPRM00P$GPRM3G0$GPRM.,,$GPRM0G2$GPRM0,20$GPRM.60$GPRM01,$GPRM709$GPRM0,,$GPRM00V$GPRM0.,,$GPRM0,0$GPRM01P$GPRM7P,$GPRM0,5$GPRM


同じ回路にGPSデータのみを取得するプログラムを試したところ、正常な値が取れたので、SCP1000がGPSモジュールに影響していると思うのですが、
GND、VOUT以外は同じピンを使用していないのでどこを直せばいいのかわかりません。
GPSの電源を乾電池にしても結果が同じだったのですが、回路が問題ではないのでしょうか。

また、取得したGPSデータを見ると、正常なデータの一部が飛び飛びで表示されているようで、
mbedとGPSモジュールの通信速度が変わっているのかもしれないとも思いましたが、何が原因なのでしょうか。
SCP1000のオペレーションモードのような気もするのですが、なぜピンの違うGSPモジュールに影響しているのでしょうか。
改善策を頂けるとありがたいです。

よろしくお願いします。
添付ファイル
GPS-SCP1000.png
回路図
GPS-SCP1000.png (6.18 KiB) 表示数: 18189 回
吉田幸司
 
記事: 23
登録日時: 2013年12月29日(日) 15:01
お住まい: 佐賀県

Re: SCP1000とGPSモジュールについて

投稿記事by yamaguch » 2014年4月04日(金) 14:33

吉田さん、こんにちは、

結果が予想したものではないようですがプログラムは正しく動いているようですよ。
取得したGPSデータを見ると、正常なデータの一部が飛び飛びで表示されている
GPSだけではなく温度と湿度も printf で出力してみるとおそらくその理由が分かると思います。

山口
yamaguch
 
記事: 482
登録日時: 2010年7月06日(火) 17:37

Re: SCP1000とGPSモジュールについて

投稿記事by 吉田幸司 » 2014年4月10日(木) 17:35

山口様、こんにちは、返信遅くなり申し訳ありません。

まず、温度、気圧とともに出力してみたところ、このように表示されました。
コード: 全て選択
$ 22.25 1010.0
G 22.25 1009.9
P 22.30 1010.0
G 22.25 1010.0
S 22.25 1010.0
V 22.30 1010.0
, 22.25 1009.9
3 22.30 1009.9
, 22.35 1009.9
3 22.25 1010.0
$ 22.30 1010.0
G 22.25 1010.0
P 22.35 1010.0
R 22.25 1010.0
M 22.30 1010.1
0 22.25 1010.0
, 22.40 1009.9
, 22.25 1010.0
2 22.30 1010.0
$ 22.30 1010.0
G 22.25 1010.0
P 22.35 1010.1
R 22.30 1010.0
. 22.25 1010.0
G 22.25 1010.0
P 22.35 1010.1
. 22.30 1010.0
$ 22.35 1010.1
G 22.25 1010.0

この結果をみてGPSデータが%cにより1文字ずつの出力になっていることが原因で、配列として扱えばよいと思い以下のプログラムをコンパイルしようとしたところ
コード: 全て選択
#include "mbed.h"
#include "SCP1000.h"

DigitalIn mysw(p29);
LocalFileSystem local("local");

int main() {
   
    SCP1000 scp1000(p5,p6,p7,p8);
    scp1000.setOperationMode(SCP1000::HIGH_SPEED_MODE);
   
    Serial gps(p9,p10);
    gps.baud(9600);
   
    FILE*fp=fopen("/local/local.txt","a");
   
    while(!mysw) {
       
        float temperature  = scp1000.readTemperature();
        float pressure     = scp1000.readPressure();
        char GPS[]         = gps.getc();
       
        printf("%s %4.2f %3.1f\r\n",GPS,temperature,pressure);
     
    }
    fclose(fp);
}

コード: 全て選択
Error: Initialization with "{...}" expected for aggregate object in "main.cpp", Line: 21, Col: 30

というエラーメッセージが表示されました。
戻り値の文字をを配列として扱うには、どうすればよいのでしょうか。
よろしくお願いします。
吉田幸司
 
記事: 23
登録日時: 2013年12月29日(日) 15:01
お住まい: 佐賀県

Re: SCP1000とGPSモジュールについて

投稿記事by workshop » 2014年4月14日(月) 12:57

戻り値の文字をを配列として扱うには、どうすればよいのでしょうか。
戻り値は int です。int を配列として扱うことはできません。

コード: 全て選択
Error: Initialization with "{...}" expected for aggregate object in "main.cpp", Line: 21, Col: 30

aggregate object というのは、int や float, char 等の基本データ型ではなく、配列のような集合体を表すデータ型のことです。

配列についての理解ができていないようですね。
C++(または C 言語)の本を見て、勉強してください。

山口
workshop
 
記事: 2
登録日時: 2014年4月09日(水) 16:51

Re: SCP1000とGPSモジュールについて

投稿記事by 吉田幸司 » 2014年4月15日(火) 17:29

返信ありがとうございます。

本で配列のおおまかな部分については理解していてつもりでしたが、まだ理解が足りなかったようです。
より詳しい本でC++全般について勉強し直そうと思います。
よろしければ、おすすめの本があれば教えていただけるとありがたいです。

よろしくお願いします。
吉田幸司
 
記事: 23
登録日時: 2013年12月29日(日) 15:01
お住まい: 佐賀県

Re: SCP1000とGPSモジュールについて

投稿記事by workshop » 2014年4月15日(火) 18:47

吉田さん、こんにちは、

C++ 言語は C 言語から派生したプログラミング言語で、ある程度の上位互換性があります。また、mbed で使われている部分は C 言語の範囲でほぼ理解できるようなコードが多いようです。そこで、最初は C 言語の薄い本で勉強するのがいいと思います。

私が勉強した頃は C 言語の本と言えば1冊しかなかった(Kernighan & Ritchie: "The C Programming Language" の初版)ので迷うことはなかったのですが、現在では非常にたくさんの本が出ていて、おまけにほとんど読んだことがない :) ので、正直どれをお勧めしていいのか分かりません。ある程度売れている本(ある程度年が経っていて刷数の多いもの?)を何冊かピックアップして、気に入ったものを選べばいいと思います。

C++ 言語については、一見回り道ですが Java 言語を先に勉強してから取り組むのがいいかもしれません。

山口
最後に編集したユーザー workshop [ 2014年4月21日(月) 03:27 ], 累計 1 回
workshop
 
記事: 2
登録日時: 2014年4月09日(水) 16:51

Re: SCP1000とGPSモジュールについて

投稿記事by 吉田幸司 » 2014年4月16日(水) 16:36

山口様、こんにちは、返信ありがとうございます。

まずmbedをうまく扱えるようになろうと思うので、
刷数の多いC言語の本から選んで参考にしたいと思います。

お忙しい中、ありがとうございました。
また、よろしくお願いします。
吉田幸司
 
記事: 23
登録日時: 2013年12月29日(日) 15:01
お住まい: 佐賀県


Return to mbed 質問箱

cron