Who is さくふわめろんぱん

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

2014年11月10日月曜日

[GPSRCC]ToCoStickでRaspberryPiと通信

ロボットカーをRaspberryPiで動かすので大変だったのはwifi環境。
家ではwifi使えるのでそれで良いのだけれど、外ではwifiがないから動かない。
(大会ではwifiルーターを持参して通信してました。)
以前はこんな感じ

wifiに頼らない開発環境を!ということで、以前買っておいたToCoStickと、今回買ってもらったToCoStickを使って何とかしてやろうじゃん?っていう記事です。
これからはこうします


もちろん家ではwifiでsshが最強なのでwifiを使います。

【ToCoStickとは】
TWE-LITEっていう通信用のモジュールをUSBに挿せるようになってるやつ。
今まで有線だったシリアル通信を無線化できるでしょ?っていう感じ。
チャットとか色んな機能があるんだけど、正直いらない。
きれいなんだけど、もうちょっと小型化できないのかな。


【ToCoStickの準備】
ざっくり基礎知識(細かいとこは自分で調べて)
・ToCoStickやTWE-LITEはアプリ(ファームウェア?)を書き込んで動かす。
・最初に入ってるのはIOとか制御するアプリ。ToCoStickだとほぼ意味ない。
・シリアル通信専用アプリの「透過モード」が一番便利そう。
  (http://tocos-wireless.com/jp/products/TWE-ZERO/App_Uart/)
・書き込み用ソフトがWindowsにしか対応してない(おこ)

【ToCoStickを使う】
Macに1つ、RaspberryPiに1つ挿します。
Macでは「CoolTerm」を使ってシリアル通信します。
RaspberryPiでは、おなじみ?の「minicom」でシリアル通信します。

親機の設定(どっちでもいいからとりあえずMac側にしてる)
・i: Device IDを121に。
・m: uart modeをT(透過モード)に。
・そして S: save Configuration 設定を保存

子機の設定
・i: Device IDを1に。
・m: uart modeをT(透過モード)に。
・そして S: save Configuration 設定を保存

なんか文字とか打つと1文字ずつ転送される。これでオッケー。

【コンソールを使う】(こっからが本題)
このままで、デバッグ情報をシリアルで送ってくれたりするようにできます。
競技中はそれでいいんだけど、RaspberryPiの場合はまずプログラムを起動しなきゃいけないですね。
シリアル通信でコンソールをいじれる必要があるわけです。
RaspberryPiの場合はGPIOピンに有線でつなぐとコンソールをいじれます。
USBでもこの機能を使わない訳にはいきませんね。

ここのブログでは逆に、シリアルで繋ぐとコンソールになっちゃうのを回避しています。
(http://www.soramimi.jp/raspberrypi/rs232c/index.html)


/boot/cmdline.txtttyAMA0ttyUSB0に変えましょう。
dwc_otg.lpm_enable=0 console=ttyUSB0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait 

/etc/inittab の最後のttyAMA0ttyUSB0に変えましょう。
...
#Spawn a getty on Raspberry Pi serial line

T0:23:respawn:/sbin/getty -L ttyUSB0 115200 vt100

一応、再起動してToCoStickで通信はじめると、Mac側のシリアル通信ソフトにコンソールが飛んできます。

という訳で、wifi環境がなくても開発が可能になりました。
TWE-LITEの仕様のせいで使いにくい分はあるけど、特に問題はないです。

もちろん家ではwifiでsshが最強なのでwifiを使います。
アディオス!

2014年10月28日火曜日

[エレコン]Arduino IDEとLeonardoでAVRマイコンに書き込み


こんにちは。
この度、AVRマイコン(ATMEGA328P,ATtiny2313,ATtiny13A)を買ったり買ってもらったりして、どのように使っていこうか考えていました。

【ことのいきさつ】
Arduinoを使って書き込む方法があると知る
KosakaLab
  探すとここに行き当たる。丁寧な解説つきでとてもありがたい。
  でもどこの説明もArduino UNOでやってる。

僕のArduino UNOは現在故障中で使えない
 スイッチサイエンスの永久保障
  Arduino UNO R3の永久保障の内容が最強。みんなここで買うべきっしょ。
(はやく直してもらえばいいのに)

Arduino Leonardoは元気に使える
  Arduino LeonardoはUNOとほぼ同等なボード。
使ってる人はUNOより少ない。ちょっと安い。

Arduino Leonardoでやってるページを見つける
 G2SS Diary: LeonardoでAttiny85にスケッチを書き込んでみた http://g2ss.blogspot.jp/2013/01/leonardoattiny85.html
  できないことはないけど、一手間必要なんだなと知る。

Arduino Leonardoでやる詳細のページも見つける
 Arduino Leonardo as ISP
  英語だけど絵がいっぱいで一番くわしくわかりやすい

できた!

というわけで僕もG2SS Diaryさん同様、やり方の手順を公開します。

0. 準備 用意するもの

・Arduino Leonardo USBケーブル
・AVRマイコン(上記3つで動作を確認)
・ブレッドボードとジャンパ線
・確認用LEDと抵抗

・パソコン(OSはMacOSX、Windows7で確認)
・Arduino IDE1.0.6 (1.5.8 BETAではうまくいかない)

1. Leonardoを書き込み装置にしよう

[ファイル]->[スケッチの例]->[Arduino ISP] を開く。
  内容を書き換える。(SS->10 , 9->13)
  [Arduino ISP Leonardo]とか別名で保存しておくといい。

  
  hardware.zipをダウンロード&解凍&[Arduino]ディレクトリの中に置いておく。
   (http://make.kosakalab.com/arduino/use/source/hardware.zip)
  Arduino IDEを再起動して[ツール]->[マイコンボード]でなにやらたくさん出てきたらオッケー。


  [hardware]ディレクトリの中に[leofix]というディレクトリをつくります。
  [leofix]ディレクトリの中に[programmers.txt]というテキストファイルをつくります。
  テキストファイルには以下の4行を書いておく。
arduinoispleo.name=Arduino as ISP (Leonardo)
arduinoispleo.communication=serial
arduinoispleo.protocol=arduino
arduinoispleo.speed=19200

再起動すると[ツール]->[書き込み装置]に[Arduino as ISP (Leonardo)]がある。



2. マイコンと配線しよう

  Arduino Leonardo側 <ーーー> マイコン
        SCK      <-->    SCK
        MISO    <-->    MISO
        MOSI    <-->    MOSI
        10     <-->   RESET
        5V     <-->   VCC
        GND    <-->   GND
        0(RX1)   <-->   RX (必要ないかも)
        1(TX1)   <-->   TX (必要ないかも)
(参考画像)


3. Arduino IDEをつかって書き込もう

 まず、前述のArduinoISPLeonardoをLeonardoに書き込む
 設定は マイコンボード:Arduino Leonardo
     ポート:Leonardoを認識してるポート
     書き込み装置:AVRISP mkII
 
 次に、前述のLEDチカチカスケッチをマイコンに書き込む
 設定は マイコンボード:ATtiny2313 (internal 8MHz clock) <-- 自分の使うマイコン
     ポート:Leonardoを認識してるポート
     書き込み装置:Arduino as ISP (Leonardo)

 LEDチカチカスケッチ
 void setup( ) {
   pinMode(2, OUTPUT);
 }
 void loop( ) {
  digitalWrite(2, HIGH);
    delay(125);
    digitalWrite(2, LOW);
    delay(125);
  }
ピンで2番を指定しているので、RXD,TXD,の隣くらいのピンにLEDを刺しておくと光る


という感じで僕はできました。
Arduinoの関数とかがどの程度使えるのか分からないので、今後検証していきたいと思います。

以上、Arduino IDEとLeonardoでマイコンに書き込みしてみようのコーナーでした。












2014年10月19日日曜日

[GPSRCC]GPSロボットカーコンテスト2014が終わりました!

GPS・GNSSロボットカーコンテスト2014に出場してきました。
結果は
ダブルパイロンレース:棄権
QZスクランブル:災害通知の受信をできずリタイア
でした。

くやしい結果ですが機体としてはいいものができて満足です。
GarlicToastでいい結果を残せたら新しい機体を作る事を考えていましたが、この現状では今後もGarlicToastで調整を進めることにします。本来ならハードウェア的な問題点を作り直す必要があるのですが、今回は満足しているので基本の枠組みは変えずに続投です。

ちょっとリベンジしたい気持ちもあるので、来年も使えるレベルに手直ししてから封印するつもりです。
また来年もよろしくお願いします

以降反省です。
【ハードウェア】
・最終的には満足のいくものができてよかった。(もう少し早くできていれば・・。)
・インホイールモーターは期待通りに動いてよかった。
・分解組み立てが少々面倒なところが難点。
・電圧最大でストールすると配線が電流を許容できなさそう。
・キガタメール(木固め剤)については今後の経過を見て評価。
・ギア比をあげればもっと電流を抑えて同じ挙動ができるかもしれない。

【回路】
・今後の課題が一番多い部分
・安価なモータードライバICではパワーが足りずにMOS-FETを使ったが今後はそれでいい。(逆転はできない仕様はローバーの機構上問題はない)
・大電流を許容できる配線、基板を作成する。
  今後は基板発注,電源の完全な分離をおこなう
・基板間の配線をちゃんとまとめる。RasberryPi<-->モータドライバ基板間は一本にまとめる。
・モータードライブ用にマイコンがあっても良いかもしれない。
・確実な無線通信をできるようにする

【ソフトウェア】
・Pythonでの記述に慣れることができた。
・マルチプロセスは強い。今までにない制御周期を実現できた。
・プログラムをモジュール化しすぎてデバッグが大変になってしまった。
  一斉実行するためのプログラムが必要
・プログラム間通信を何か考えないといけない。
・簡単にパラメータを変更できる仕組みも必要
・欲を言えばグラフィカルに挙動を確認したい。

【しまう前にしておくべき手直し】
・電源回路の修復
・プログラムの簡略化・自動実行できるように
・QZスクランブルの通知信号の受信問題の解決
・通信をもっと楽に行う

【おまけ】
今回のタイヤのスポンジはこれ。これで100円は去年のウレタンフォームより安い。


前日の試走会にも行ってきました。このときはバッテリーやらの問題でうまく走らず。


2014年10月11日土曜日

[GPSRCC]ピンチと打開策

ご覧のように完成しました!
室内でゴロゴロ走るのを確かめたので今日は屋外テストをしてきました。


そしたらなんと、走らない!
比較的平坦なコンクリートの上ならゆっくり走るのですが砂利道やオフロードではうんともすんとも。
完全にパワー不足です。
無負荷での回転数が結構速いので減速不足というのが正しいかもしれません。

今日家の近所の公園で走行テストして、明日は芝生のある公園でのGPS誘導のテストを想定してたので、予定がだいぶ狂いました。

いやはや大会1週間前にしてこの現状。
しかも来週は台風が来ることなので早めに行動しなくては。

こんなときに考えられる対策はこんなもんでしょうね。
・モーターを出力の大きいものに変更(購入とタイヤ丸ごとの再設計が必要)
・モーターの連装数を増やす(購入とモーターマウントの設計が必要)
・減速比をあげる(ギアの歯数を増やす/減速の段数を増やす)
・機体を軽くする
・タイヤの径を小さくする

最後の2つでも対応できるのですが、そんなに変わらないでしょうね。
減速比については構造上難しいものがあります。
確実に状況を打開するためにはタイヤの変更が必要そうです。

という訳で、モーター変更/タイヤ再設計によるパワーアップ作戦を選びます。
(現在1.6kg程あるのが更に重くなる・・)

2014年9月29日月曜日

[GPSRCC]ロボットカーの制御について

先日、今回出場する大宮工業高校のはなしを少し聞いたりインタビューの記事を読んだところ、プログラムが難しいかもなぁって思いました。ので、今回はプログラムについて書きます。
こちらは機体がだいたいできあがりました!

【はじめに】
大前提として、使うのは「目的位置」と「現在位置」と「(現在)角度」の状態。今回は現在の状態をGPSと地磁気センサで取得しますが、GPSモジュールから出力されるデータの中に方位のデータがあるのでこれでもいいです。

そして作るのは「目的地にロボットを誘導するプログラム」で、特にルールにしばられるアルゴリズムではありません。巡回するルールでは目的地を順に変更していけばいいです。

【緯度経度の扱い方】
座標空間は緯度経度に定数を掛けて得る直交座標です。y軸正が北、x軸正が東となるようにとります。適当な定数を掛けた値なので単位はmでもmmでもなんでもよく、"単位距離"というのが妥当かもしれません。
ここで注意!世界地図や日本地図を見ると分かりますが方眼が北方向に伸びてますね。距離を正しく表そうとすると緯度には経度の1.2倍くらい掛ける必要があります。(1.2ってのは東京の緯度だとだいたいこれくらいという値です。)
図で見るとこんな感じ。


【目標方位の求め方】
 dx = (目標経度 - 現在経度)×定数
 dy = (目標緯度 - 現在緯度)×定数×1.2
まず目標位置と現在位置の差をこんな感じで定義します。
そしたら角度は逆三角関数arcTanをつかって
 θ = arcTan(dy/dx)
で求められます。(高校生だとここが難しいのかな)
プログラムを書く時はatan関数を使えばいいのですが、atan関数を使える状態であればatan2関数も使えるはずです。atan2はatanと違って値域を考えなくて良いので便利です。

図にして考えるといい。


【アルゴリズム】
上のような準備が済んだら
次の式で左右のモータに与えるゲイン(電圧)を決定します。

 左モータゲイン = 直進ゲイン - 回転ゲイン×(目標方位 - 現在方位)
 右モータゲイン = 直進ゲイン + 回転ゲイン×(目標方位 - 現在方位)

この式の直進ゲインと回転ゲインのパラメータを調整してください。簡単に説明するとこんな感じ。
直進ゲイン:目標にまっすぐ向かう時の速さ
回転ゲイン:目標の角度に向ける速さ

【これができたら】
次は競技に合わせて目標地点に着いたら、目標地点を変更するようにすればいいでしょう。
上で紹介したのは角度しか制御してませんが、距離や他のパラメータを制御して自分流にしてくのがいいと思います。が、GPSロボットカーコンテストについて言えるのはあまり凝った制御は必要ないということです。それよりはハードウェアの調整に力を注いだ方がいいとおもいます。

地磁気が指す北と緯度経度座標の北は違ったり、方位は北から右回り正の値なのに対して数学の角度は東から左回り正のあたいだったり、他にも注意しなきゃいけないことがあるはずです。

2014年9月13日土曜日

[GPSRCC] タイヤとモータドライバのテスト

前々回くらいに設計を載せたタイヤのテストです。
仮組なのでプラプラしてますが接着すれば大丈夫なはず。
ロータリエンコーダは組んでみないと分からんですが分からんですが自作ギアが使えているようでひとまず安堵。



組む時はちゃんとハンダ付けして中空パイプの中を通す予定。
構想段階では、タイヤの中にモータドライバ入れるとか、複数モーターを独立に制御するとか考えてたけど今回は見送り。そこはさくふわ先生の次回作に期待ということで・・。

モータドライバICの基板はこんな感じでまとめてます。
ICはTA8428K(S)という秋月電子で2個300円のものを片側で2つ使用。
本当はTB6643KQなるICを使いたかったのだけど、電源電圧が10V以上だったので断念。
制御する機器によらず使えるようにするために基板はモジュールごとに分割します。
ガンガン作って行かないともう時間がないですね。

2014年9月10日水曜日

[GPSRCC] RaspberryPiでBluetooth QZPOD編

QZPODというGPS/QZSS受信器が届きました。
うれしくてとりあえず動作確認したかったのでRaspberryPiと通信させました。

というわけでそれまでの記録をば。

【Bluetoothドングルの設定から接続】
・使うもの
  aitendoで安かったBuletoothドングル
  OSはRaspbianでやりました(wifiの設定が楽!)

・下準備
bluetoothを使うためのプログラムをインストール
pi@raspberrypi ~ $ sudo apt-get install bluetooth bluez-utils blueman
bluemanはGUI用らしいからコマンドラインで使うならなくてもいいって。
だーっとインストールされる2,3分かかったかも。
途中Y/nを2回くらい聞かれた気がする。

・接続はおもったより簡単!
1.ドングル認識されてるか確認
pi@raspberrypi ~ $ lsusb
Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. 
Bus 001 Device 004: ID 2019:ab2a PLANEX GW-USNano2 802.11n Wireless Adapter [Realtek RTL8188CUS]
Bus 001 Device 005: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode)
4番目はwifiアダプタで、5番目にbluetoothなんちゃらってのが出てきた。これだ。

2.bluetooth受信してるか確認
pi@raspberrypi ~ $ hcitool scan
Scanning ...
00:1B:DC:0F:45:2B QZPOD0040
まぁこんな感じで出てくると。周りにキーボードとか検出される機器があるとここにでてくる。
ちなみに下準備のインストールができてないと、hcitool?そんなコマンドnot foundっておこられる。

3.接続する
さっきのアドレスをつかって接続
pi@raspberrypi ~ $ sudo bluez-simple-agent hci0 00:1B:DC:0F:45:2B
RequestPinCode (/org/bluez/2153/hci0/dev_00_1B_DC_0F_45_2B)
Enter PIN Code: 0000
正しいPINコードを入れる。そんなの聞いてなかったけど初期値でした。
正しいのを入れると
Release
New device (/org/bluez/2153/hci0/dev_00_1B_DC_0F_45_2B)
って出てくる。

ちなみに間違ってると
Creating device failed: org.bluez.Error.AuthenticationFailed: Authentication Failed
っておこられる。

4.確認
pi@raspberrypi ~ $ sudo bluez-test-device list
BC:8D:A6:71:32:21 Bluetooth Keyboard
00:1B:DC:0F:45:2B QZPOD0045
つながっておる。
これで接続は完了。次回以降は勝手に接続されるみたい。

5.補足
接続解除するには・・
pi@raspberrypi ~ $ sudo bluez-test-device remove 00:1B:DC:0F:45:2B
繋ごうとして、もう繋がっていると・・
pi@raspberrypi ~ $ sudo bluez-simple-agent hci0 00:1B:DC:0F:45:2B
Creating device failed: org.bluez.Error.AuthenticationTimeout: Authentication Timeout


【Bluetoothでシリアル通信】
なにしてるかちゃんと理解してないけど、bluetoothの接続先の1つを1つのデバイスとして認識させてるっぽい。
pi@raspberrypi ~ $ rfcomm connect hci0 00:1B:DC:0F:45:2B &
Connected /dev/rfcomm0 to 00:1B:DC:0F:45:2B on channel 1
Press CTRL-C for hangup
とする。




pi@raspberrypi ~ $ ls -la /dev/rfcomm0
crw-rw---T 1 root dialout 216, 0 Sep  8 03:14 /dev/rfcomm0
で/dev/rfcomm0というデバイスとして使えるようになったっぽい。

teraTermみたいなシリアル通信用のプログラムをインストール。
ここではminicomっての使ったけど、何がいいのかは知らない。とりあえず入れてみた。
pi@raspberrypi ~ $ sudo aptitude install minicom

さっき用意したデバイス/dev/rfcomm0に接続するには
pi@raspberrypi ~ $ minicom -D /dev/rfcomm0
を実行。
Welcome to minicom 2.6.1

OPTIONS: I18n 
Compiled on Apr 28 2012, 19:24:31.
Port /dev/rfcomm0

Press CTRL-A Z for help on special keys

と表示され...

$GPGGA,031529.00,,,,,0,00,,,,,,,*44
$GNGSA,A,1,,,,,,,,,,,,,,,*00
$GPGSV,1,1,01,01,,,18,,,,,,,,,,,,*70
$GNRMC,031529.00,V,,,,,,,080914,,,N*6B
$GNZDA,031529.00,08,09,2014,,*72
$GPGGA,031530.00,,,,,0,00,,,,,,,*4C
......
とバンバンきた。

Ctrl-A Zでヘルプって書いてあるので
終了するには、Ctrl-A Z からの Q を打鍵。おわった。

とまぁ、シリアル通信とQZPODの動作の確認はできました。
めでたしめでたし。
次はシリアル通信の結果を用いたプログラムをつくりましょう。

2014年8月27日水曜日

[GPSRCC] タイヤの設計第一弾

GPSロボットカーコンテストの機体製作をすすめています。
今回はタイヤの中にモーターを入れるというのに挑戦してみます。
設計段階ではこんな感じになっています。




このタイプがうまくいけば、胴体に入れるのがバッテリーと回路だけになりスッキリします。また、モーターを2発入れて1つのタイヤにしているので、モーター選定や制御の幅も広がるのではないかと思っています。あとはタイヤが独立しているので4輪化も比較的簡単に行えるかなと。

もちろん、タイヤ内に部品があるので走行時の耐衝撃性が不安だったりとデメリットもあります。



早めに加工してテストしたいですが、まずはエンコーダ部分のテストから地道にやっていくつもりです。フォトインタラプタは秋月で10個300円の"通過型フォトインタラプタCNZ1023(ON1023)"です。エンコーダのスリットは64個で、タイヤの径に対してだと10mm/パルスくらいで測定できます。フォトインタラプタの精度的にはスリットをもっと細かくもできますが、オフロードではそんな正確に測定できない気がするので、今回のコンテストではこの精度で十分と考えます。本当は2つけて回転方向とか検出できてもいいんでしょうけど、明らかに冗長なので省きます。(そもそもGPSの大会なんで、あんまデッドレコニングしたくない感はある。)
エンコーダのテスト用の何か

2014年8月18日月曜日

【近況】院試終わりました

院試が一段落しました。
発表は9月11日です。

・GPSロボットカーの競技が追加されてたので、それも含めて機体の設計,試作を進めます。
・フライト部隊が能代宇宙イベントのフライバック部門で優勝したそうです。おめでとうございます。とてもうれしいです。

そんなところです。
夏休みなので色々挑戦したいことがたくさんあります。

2014年4月15日火曜日

新ローバー"Garlic Toast"の構想

かのGPSロボットカー1号機"Cream Cheese Bagel"の製作から
なんと半年が経とうとしています。
そこで!次期GPSロボットカープロジェクトを進めようじゃないかと。

名付けて!\"Garlic Toast"プロジェクト/

まず何をするべきかを考えるために
ハード・回路センサ・ソフトの3方面から
改善,挑戦したいことの優先順位をつけてみました。

この中から手をつけていけそうな部分から作っていきます。

(数字は優先順位)
・ハード
1:安定して動く程度に頑丈なつくり
2:回路などを積む胴体部は直方体にする
3:タイヤの径をΦ150以上にする
4:タイヤをインホイールモーター化
5:胴体部の前後方向の姿勢安定(スタビライザー)の改善
6:胴体部の横方向の姿勢安定ができればいい

・回路,センサ
1:マイコンはArduino UNOを使う。少なくともセンシング用には使う。
2:タイヤの回転数検知をする
3:無線通信モジュールの搭載する
4:パワー系とコントロール系の電源を明確に分離する
5:データ出力の周期が短いGPSモジュールを使う
6:ジャイロセンサによる方位補完
7:基本的な回路はプリント基板を外注する

・ソフト
1:無線通信によるデバッグ環境をつくる
2:精度を向上させるキャリブレーション手段を考える
3:ArduinoによるGPSデータの効率よい取得方法を模索する
4:ポイントを巡回するプログラムの作成

これより、これから作る機体の仕様要求は以下です。
・直方体の胴体 + モーター2発 + 既存のタイヤ + しっぽスタビライザー
・無線通信によって取得データを閲覧、簡単な制御ができる
・タイヤの回転数/回転速度を検知でき、精度は保障しないがデッドレコニングできる
・駆動系とデジタル回路系の回路,電源が分離されている

(基本スペック)
 ・平均秒速1m、最大秒速2mの速度くらい
 ・重量は2kg程 (まで許容)
5/20にハードが完成しているとうれしいです。

今後、部品の選定をしてきたいとおもいます。

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つかってみる助けになればいとおもいます。