Who is さくふわめろんぱん

さくふわめろんぱん(@skfwMelonpan)はロボットとか人工知能に興味があるパンです。
自分のために調べたことがみんなの役に立ったらいいなぁ。

2014年3月25日火曜日

【近況】ロボットグランプリ終了

ご無沙汰していました。さくふわです。
先日、ロボットグランプリが終わりました。
春休みです。春休みがきたのです。

思い返せばこの数ヶ月、なんだかんだずっと作業してましたね。
試験とかいろいろありましたが、考えるのをやめたときはなかったです。
そしてとてもいい経験になりました。

今まで触ったことのなかったステッピングモーターに触り、
カラーセンサーを使い、Bluetoothを使い、フォトリフレクタも使い
デバッグにProcessingとArduinoつないでみたり、
今持てる力を全て注いだ感じだったかも。

この3年の集大成といえば集大成なのかも。

当初かかげた目標には遠く及ばず。
ちょっと残念でした。

細々した技術的なことじゃなく、もっとざっくりした
「作品づくり」という点でもっと成長するべきなのかもしれません。
それは目標設定や、コミュニケーションとかかな。

次に何かを作るときには、「製品」を目標にしたいです。
確実に動いて、メンテナンス性がよくて、売れるような。
あたりまえだけれど、身近な製品ってすごいのね。

ということでロボメカ生活は終了。
次なる目標はGPSロボットカーコンテストですかね。
今回は早めに取り組んで行きたいです。

2014年2月6日木曜日

Arduinoでのデータ処理

GT-720FとArduinoでGPSを使ってみる(その2)

・GT-720Fからのデータについて

ここに公開されている技術資料の後ろの方に説明があるので参考にしてください。
主に使っていたのはGGAというフォーマットです。
GPSロボットカーでは方位も知りたかったのでRMCというのを使いました。

ここではGGAをつかって説明をしていきます。

例えばこれが資料の一部です。
表にあるようなデータを得られることがわかります。
分かりやすいのを上げると
1:協定世界時(UTC)(日本標準時はUTC+9なので9時間足した時間)
2:緯度(日本は35度くらい)
3:北緯か南緯か(日本は北緯)
4:経度(日本は135度くらい)
5:東経か西経か(日本は東経)
他にも
7:捕捉衛星数(観測につかっている衛星の数)
9:海抜高
などが含まれています。

表の上に書いてある例のように受信されているはずです。
$GPGGA,104549.04,2447.2038,N,12100.4990,E,1,06,01.7,00078.8,M,0016.3,M,,*5C<CR><LF>
末尾の<CR><LF>は改行コードなのでArduinoのシリアルモニタでは改行されて表示されるはずです。
実際は他のフォーマットも同時に送信されてきます。
[実際にシリアルモニタに表示されるデータ例(一部)]


・Arduinoでの処理の概要

受信ができてもセンサのように数値になるわけではありません。
ここまで受信しているのはただの文字列です。
そして複数の情報が混ざっているので切り離してから、数値にする必要があります。
[処理の概要]

・Arduino GPSロガー

まずはGPSロガー用につくったスケッチの一部を載せて説明します。
[Arduino GPSロガースケッチ(一部)]


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <SoftwareSerial.h>
SoftwareSerial mySerial(5, 4);

char moji;
// 文字列を宣言
String str,type,time,ido,keido,Number;
int i;

void setup () {
  Serial.begin(9600);
  mySerial.begin(9600);
  Serial.println("Start");
}

void loop () {
  str = ""; //strには1行の文字列を入れる
  
  //信号がきてない間は飛ばして、改行(\r)が来たら中断する。
  //その間受信した文字をstrに足し続けている。
  while(1){
    moji = mySerial.read();
    if(moji == -1) continue;
    str = (str + moji);
    if(moji == '\r') break;
  }

  //typeにはstrの$GPGGAにあたる部分を入れる
  type = str.substring(1,7);

  //typeが$GPGGAのときはその行を分割する
  if(type.equals("$GPGGA")){
    Serial.print(type);

    time = str.substring(8,18);
    Serial.print("\t"+time);
    
    ido = str.substring(19,28);
    Serial.print("\t"+ido);
    
    keido = str.substring(31,41);
    Serial.print("\t"+keido);
    
    Number = str.substring(46,48);
    Serial.print("\t"+Number+"\n");
  }
  
}
syntax2html

・Arduinoでの文字処理

通常のArduinoの使い方では文字列を扱うことが少ないと思うのでこまかめに書きたいです。

28
type = str.substring(1,7);
syntax2html
typeというString型の変数に、strという変数の1番目から6番目までの範囲をいれています。
こうすることによって各数値を必要な部分に分割することができるので、
それぞれ個別に処理することができるようになります。

31
type.equals("$GPGGA")
syntax2html
ここではGPSモジュールから出力されているデータの中で、
GGAのフォーマットである行を選択するため、
引数が同一であれば真を返すメソッドを使います。
 (文字処理は他にも便利な機能がすでにあるので調べて活用しましょう。)


・文字列の数値変換

次に文字列から数値に変換する部分を説明します。
先ほどのスケッチではまだ文字列のまま出力されているだけです。
文字列から数値に変換することはできず、
一度char型配列にしてから数値にする必要があります。
//(宣言部)
int x;
char KEIDO[16];
- - - - - - - - -
//(実際の変換)
keido.toCharArray(KEIDO,16); 
x = atof(KEIDO);

これはプログラムの断片ですが、目的に合わせて適当な場所に挿入してください。宣言する部分はグローバルな場所、変換する部分はループ内の一カ所にまとめておいた方がいいとおもいます。
keido.toCharArray(KEIDO,16);
char型配列KEIDOに、String型の変数keidoの文字列を入れる。
(第2引数の”16”は16文字変換することを意味している。)
x = atof(KEIDO);
float型の変数xに文字列KEIDOが意味する数値を代入する。
ここでKEIDOは配列ですが、[]を付けないことを注意してください。
また、わかりやすいようにxにfloat型を使用していますが、1000倍したりすることでint型やlong型で代用することもできます。
さらに、実際に利用するのは小数点以下に表される値になるのでそこだけを抽出してしまうのも1つの手段です。

・Arduinoでの文字処理まとめ

これで受信データを数値にすることができたので、後の計算処理が可能になります。
ここで数値変換するまでのプログラムの全体を載せます。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <SoftwareSerial.h>
SoftwareSerial mySerial(5, 4);

char moji;
// 文字列を宣言
String str,type,time,ido,keido,Number;
char TIME[16],IDO[16],KEIDO[16],NUMBER[16];
int clock,x,y,satN;
int i;

void setup () {
  Serial.begin(9600);
  mySerial.begin(9600);
  Serial.println("Start");
}

void loop () {
  str = ""; //strには1行の文字列を入れる
  
  //信号がきてない間は飛ばして、改行(\r)が来たら中断する。
  //その間受信した文字をstrに足し続けている。
  while(1){
    moji = mySerial.read();
    if(moji == -1) continue;
    str = (str + moji);
    if(moji == '\r') break;
  }

  //typeにはstrの$GPGGAにあたる部分を入れる
  type = str.substring(1,7);

//(続く...)
//(...続き)
  //typeが$GPGGAのときはその行を分割する
  if(type.equals("$GPGGA")){
    Serial.print(type);

    time = str.substring(8,18);
    Serial.print("\t"+time);
    
    ido = str.substring(19,28);
    Serial.print("\t"+ido);
    
    keido = str.substring(31,41);
    Serial.print("\t"+keido);
    
    Number = str.substring(46,48);
    Serial.print("\t"+Number+"\n");

    //char型文字列に
    time.toCharArray(TIME,16);
    ido.toCharArray(IDO,16);
    keido.toCharArray(KEIDO,16);
    Number.toCharArray(NUMBER,16);
    
    //数字に変換
    clock = atof(TIME);
    x = atof(KEIDO);
    y = atof(IDO);
    satN = atof(NUMBER);
    
    //数値に変換することでこのような処理ができる
    if(clock>150000) clock -= 150000;
    else clock += 90000;
  }
}
syntax2html

2014年1月29日水曜日

GT-720FとArduinoの準備

GT-720FとArduinoでGPSを使ってみる(その1)
「ArduinoとGPSモジュールの通信」

GT720Fの信号線について
GT720Fからはシリアル通信でマイコン等にデータを送信します。
特にArduinoではTTLレベルの信号が必要なのですが、
GT720Fの説明ではRS232Cレベルであるとしか書いてありません。
しかし!使っていない2つの信号線からTTLレベルの信号が出力されている!
ことが知られています。
というわけで、Arduinoとの通信にはこのTTLレベルの信号線を使いましょう。

Arduinoの通信用ピンについて
Arduino側はシリアル通信の設定をします。
ソフトウェアシリアルという機能を使うので、デジタルピンならどれでも通信できます。
普段の書き込みに使用するデジタルピン0,1以外を使えばいいでしょう。(ここでは4と5をつかう。)
また、Arduinoの5VとGNDを接続しましょう。

配線は簡単(つなげるだけ!)

下の図を参考にして接続してください。
・Arduinoから5Vを供給
・GNDを共有
・GT720FのTX,RXをArduinoのデジタルピン5,4に接続
これで準備OKです。
GT720Fに信号を送ることはないのでGT720FのRXは接続する必要は特にないのですが、一応つないでおきます。 
配線するときは、TXをRXに、RXをTXにつなげることを間違えないようにしましょう。

[GT-720Fのピンアサイン]

[Arduino側の配線]

プログラムも簡単(書き込むだけ!)
Aruduino側に書き込むプログラムはいたって単純です。
ソフトウェアシリアルライブラリを使って受信開始すれば、
シリアルポートにて何が受信されたかを確認することができるはずです。
普段はシリアルモニタには何も表示されないはずなので、
何かが表示されたらそれでひとまずOKです。
[Arduinoのスケッチ]

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <SoftwareSerial.h>

// 5:RX,4:TXでシリアル通信する宣言
SoftwareSerial mySerial(5, 4);

char moji;

void setup (){
  // 9600 bpsで接続(パソコンとの通信
  Serial.begin(9600);         
  // 9600 bpsで接続(GT-720Fとの通信)
  mySerial.begin(9600);
  // 最初に1度だけ Start を表示(通信の確認)
  Serial.println("Start"); 

}


void loop (){
    //mojiという変数にGT-720Fから受信した文字を格納する
    moji = mySerial.read();
    //格納された文字が-1(意味のないデータ)ではなければ
    if(moji != -1){
      //その文字をパソコンに送信する
      Serial.print(moji);
    }
}
syntax2html

2014年1月28日火曜日

GT-720FとArduinoでGPSを使ってみる

GT-720F(秋月電子で購入できる)とArduino UNOでGPSをつかうためにすることメモ。

まず、
通常のセンサモジュール←理解しやすい物理量を出力してくれる
GPSモジュール←処理されたデータを出力してくれるけどわかりにくい

緯度経度の他にもモジュールの状態とか色々知れるからすごく便利。
でも得られたデータを正しく扱うのは意外と面倒。
そんな点が他のセンサと分けて考えるべきで、とっつきにくい点かと。

とにかく手っ取り早くGPSを使えるようになろうということで、
以後、こんな内容を書いていきたいとおもいます。

・ArduinoとGPSモジュールの通信
・Arduinoでのデータ処理

とにかく使ってみるのが早いのでまず上のをを実践してから、
おまけとしてこんな内容も説明できたらなと
・緯度経度の考え方
・便利につかうには

GPSつかってみる助けになればいとおもいます。

2013年11月10日日曜日

GPSロボットカーコンテスト参加報告と今後の予定

だいぶ報告が遅くなりましたが、GPSロボットカーコンテストに参加してきました。



結果は動きはしましたが、まだまだといったところです。
Youtube投稿にてまだ勝負は続くということだそうです。

調布祭の展示でも出したいので、もう一度設計を見直して作り直したいというのが今の考えです。できれば室内用に動くのがあればこれからの展示でも、制御の練習にも使えるものになるとおもいます。

それと、今週金曜、G空間EXPOというところに招待されました。地理情報に関する技術の展示会だそうです。GPSロボットカーコンテストに参加したということで、少しお話してきたいと思っています。

他の人は、GPSに関してもすごく知識があって僕は到底かなわないのですが、初心者として参加した者として来場の方々に少しでも興味を持ってもらえたらとのおもいで発表したいとおもいます。

というわけで今週金曜日は日本科学未来館でさくふわと握手!
来週の土曜は調布祭でさくふわと握手!

お待ちしております

2013年10月29日火曜日

Cream Cheese Bagel

こんにちは。GPSロボットカーコンテストに向けて活動中のさくふわです。

今回のローバーの愛称を勝手に"Cream Cheese Bagle"と名付け、
レーザー加工機で残りの部品を切りました。
愛称は長いんでCCBだとか略していくかもしれません。

現在は組み立てて接着中。
明日、行ってモーターとかLiPoとか載せてみたいとおもいます。

モータードライバ、電源回路も担当に投げました。
今できることは、GPSのデータを取得して計算させるプログラムを書くことです。
まぁ、デバッグ作業に相当な時間が必要になるでしょうねぇ。

2013年10月17日木曜日

GPSローバー、メモ用紙と過ごす5連休

GPSロボットカーコンテストに出場することが決まり、
ローバーの制御方法をじっくり考えていました。
電通大は祝日が授業日だったのですが、所用により欠席したら
体育祭→台風と重なり5連休となりました!!

じっくりまとまった時間考え抜くことで、制御のアイデアがまとまってきました。
問題点は、1秒周期に与えられる{緯度,経度,方位}の情報だとちと遅い...ということ。
→受信するまでの間はどのような挙動をさせればよいのか・・と考えていました。

そのへんまだ考え中でもあるので、まとまったらまた書きますね。