「ロボット・電子工作・マイコン」カテゴリーアーカイブ

カメラロボ (その2)

Trevaで取り込んだイメージデータをPCに送信していますが、5秒以上かかっていたので、高速化に取り組んでみました。

【やったこと】

・XBeeのボーレートを38400bpsから115200bpsに変更

・ハードウェアフロー制御でCTS信号をチェックするようにした。

・CTSが立っていないのにデータをロストすることがよくあったので、送信時に少しWAITを入れてあげると改善しました。(この辺は良く分かりません。)

フロー制御は以下のように行いました。

  • XBeeのCTS端子をマイコンの適当な入力端子に接続
  • XBeeのCTSは反転しているので、LOWの時に送信し、HIGHになったら送信を待つ。
  • なお、XBeeはデフォルトでCTSフロー制御がONになっています。確認方法はX-CTUでDIO7が1-CTS FLOW CONTROLになっていればOKです。
  • しかし、CTSの効果は微妙で、上記にも書いたWAITの方が効きました。

上記で、80Kbpsぐらい出るようになりました。

Trevaのイメージデータは96*72*2 (約14KB)ですので、1.5秒ぐらいでデータの送信が完了します。1.5秒は短いようですが、実際に見てみるとかなり遅いです。

また、間に壁等の遮蔽物があると、かなりのデータロストが発生します。

やはり、XBeeでリアルタイムにイメージデータを送ろうというのは少し無理があるようです。

定期観測ぐらいであれば問題ないでしょうが。。。

無線LANが本命でしょうか?

とりあえず、高速化はこれぐらいであきらめて、解像度を減らすなどデータを減らすことを試してみます。(既にかなりの低解像度なのですが。)

あと、上位階層でデータロスト対策を考えます。(今の仕組みだとデータロストすると待ちに入って止まってしまうので)

カメラといえばモッパーさん(http://moparlab.sblo.jp/article/40142757.html)も試されているTCM8230MD/TCM8240MDにも興味があります。このスペックのカメラが約\1,100で売られているのですから、もうTrevaを使っている場合ではないですね。

コントロールにFPGAやCPLDを使われている方が多いようですが、マイコンでもSH-2Aぐらいの性能とメモリー容量があればなんとかなるのではないかと考えています。

ロボカップジュニア 北九州オープン

ロボカップジュニア 北九州オープンが21・22日に開催されました。

選手の皆様、スタッフの皆様お疲れ様でした。

私はスタッフとして参加しました。

この大会はバージョンAとバージョンB(ボールは定常光)の両方を体験できるなど、とても工夫されていると思います。

また、2日間かけてみっちり実施されるので、子供たちは調整や改造などじっくり取り組むことができます。

2日目には一晩でかなり改造してきた子もいました。(夜は何時までやったんだろう?)

しかし、ロボカップの夏合宿と福岡市のロボスクエアの大会に重なってしまったのが残念です。

斯く言う私の息子も夏合宿でした。こちらもかなり楽しく充実した3日間だったようです。

オフィシャル(?)なレポート:
http://sites.google.com/site/robocup9/A20houkoku/robokappujuniasakkacharenjikitakyuushuuopun2010

北九州市ロボカップ会のページ:http://sites.google.com/site/robocup9/home

SH-2Aマイコンボード

Interface誌2010年6月号の付録のSH-2Aボードを試してみました。

とりあえず、本に書いてある通りの手順でLEDピカピカまで動かしました。

初期状態では、デバッグ実行時に、止めてないのにAbortとなって止まってしまう現象がありましたが、モニタプログラム(SH-2Aマイコン基板実装SPIシリアル接続フラッシュROM)を2010年5月17日版にアップデートしたところ直ったようです。

f:id:studio_k:20100815173214j:image:w400

まだ、コネクタなど何もつけておらず、素のままです。

このSH-2Aはクロック:144MHzでRAM:1MBとのことで、過去の付録基盤でも最高レベルのスペックです。画像認識でも余裕でこなせそうです。OpenCVのようなライブラリがあると楽ですが。

SH-2AはフラッシュROMを内蔵しておらず、このボードではSPI接続の64KBのフラッシュROMを搭載しています。半分はモニタプログラムが入っているので、このモニタを使用する場合は使えるのは32KBまでとなります。足りなくなったら大容量のフラッシュROMに差し替えることもできるようです。

開発ツールは、とりあえずメーカー純正の開発ツールのHEWを使用する方向で考えています。使用期限は60日で、期限が切れるとコンパイル後のオブジェクトのサイズが256KBまでとなる制限があるようですが、当面はそこまでのサイズのプログラムは作らないと思うので問題はなさそうです。HEWの他にGCCが使用できるようですが、256KBの制限以外のメリット・デメリットが理解できていません。

モニタプログラムを使用すると少し面倒な設定がですが、JTAGなしでトレース実行できるのでかなり便利です。

次はROMに書き込んでPCなしで実行することを試してみたいと思います。

将来的には昨日のカメラロボのCPUをこのボードに換装することを考えています。ボードの作り替えは最小限ですませたいのですが、まだどうなるか分かりません。

あと、LEDピカピカはHelloWorldに相当するものだと思いますが、本文のサンプルは割り込みタイマーを使用した少し高度なものでしたので、割り込みを使わない簡単なバージョンを作ってみました。main()周辺に以下を記入します。

#include "iodefine.h"
#include "machine.h"
void main(void)
{
volatile int i;	// 最適化しない
// PCDR0設定 PC8のLEDを消灯
PORT.PCDR0.BYTE.H |= 0x01u;
// PCIOR0設定 PC8のLEDを出力に設定
PORT.PCIOR0.WORD |= 0x0100u;
// PCCR2設定 PC8の制御設定
PORT.PCCR2.WORD &= 0xFFF0;
while(1) {
// PCDR0設定 PC8のLEDを点灯
PORT.PCDR0.BYTE.H &= 0xFEu;
// 時間待ち
for (i=0; i<2000000; i++);
// PCDR0設定 PC8のLEDを消灯
PORT.PCDR0.BYTE.H |= 0x01u;
// 時間待ち
for (i=0; i<2000000; i++);
}
}

シリアル接続HEWモニタを使用する場合は本文のサンプルと同じく、↓の設定が必要です。詳しくは本文を参照してください。

  • resetprg.c のSR_Init を 0x000000F0から0x000000E0に変更
  • スタックポインタの設定
  • セクションの設定
  • デバッグの設定

カメラ付きロボット

1年半程前に作っていたロボットを掘り起こしてみました。

f:id:studio_k:20100814222605j:image:w480

PCと無線で通信してPCからロボットをコントロールできます。また、ロボットに搭載したカメラの画像をPC側で見ることができます。

ロボットのスペックは以下のとおりです。

CPU:Interface 2007年5月号の付録のV850

カメラ:定番のTREVA (昔のPHS用外付けカメラ)

PCとの通信:XBee (38,400bps)

センサー:PSD距離センサー×3

モータードライバ:MP4212

モーター:ダイセンモータ(60:1)

タイヤ:タミヤ スポーツタイヤ

PC側のコントロールソフトはC#で作成。

f:id:studio_k:20100814223508j:image:w480

写っているのはロボカップジュニアサッカーのボールです。カメラで画像認識して、ボールを追いかけ…..ません。そんな機能はなく、今のところ深い意味はありません。

ちなみにロボットのサイズは直径22cm弱ですが、これも深い意味はありません。(オヤジリーグ参加?)

カメラの画像を見ながら、ロボットをコントロールしたり、自動運転でカメラの画像を眺めるということを想定していましたが、Trevaの解像度(わずか96×72)でも38,400bpsのスピードでは5秒ぐらいかかって使い物になりません。※計算してみれば分かることでしたが、XBeeのスピードがどのぐらい行くかも分かっていなかったので。

また、距離が4~5メートル以上離れると、通信が不安定になってしまいます。

というわけで1.5年間、放置状態でした。

フロー制御を入れることで、通信スピードと距離の問題が改善されるのではないかと思い、引っ張り出してきました。

うまく行くかはまた後日。

自作Sanguino

ArduinoDuemilanove328 (ATmega328)ではピン数やメモリーが足りなくなった場合、ArduinoMega(ATmega1280)という選択肢があります。

ArduinoMegaは以下のようにDuemilanove328に比べて大幅に拡張されています。

Duemilanove328 Mega
デジタル入出力ピン 14本 53本
アナログ入力ピン 6本 16本
flash memory 32KB 128KB
RAM 2KB 8KB

しかし、値段が、Duemilanove328が約¥3,200なのに対し、Megaは約¥7,000と値段もメガです。

また、MegaのATmega1280は今のところ入手が簡単でないのと、表面実装パッケージ(TQFP64)なので、自作のハードルは高いです。

SanguinoはATmega644Pを使用したArduino互換機(拡張機)で、以下のスペックとなります。Duemilanove328とMegaの中間といったところでしょうか。

Duemilanove328 Sanguino Mega
デジタル入出力ピン 14本 24本 53本
アナログ入力ピン 6本 8本 16本
flash memory 32KB 64KB 128KB
RAM 2KB 4KB 8KB

また、ATmega644PはDIPパッケージなので、ブレッドボードで簡単に使えます。

日本ではSanguino互換のマイクロファン製REDUINO-GHOST644Uが入手しやすいと思います。ただし、完成品ではなくキットです。約¥3,780で販売されています。

Sanguinoについて、詳しくは↓を参照してください。

http://www.microfan.jp/sanguino

ということで、Sanguinoを作ってみました。

ATmega644Pは秋月で¥500で購入しました。

f:id:studio_k:20100807000948j:image:w320

■以下は導入メモ。

回路は↓を参考に。

http://sanguino.cc/hardware

自作arduinoの時は内蔵オシレータを使用して8MHzで動作させましたが、Sanguinoは8MHzのブートローダが用意されていないので(自分でコンパイルすれば可能なようですが)、クリスタルを使用して16MHzで動くようにしました。セラロックの方が回路は簡単になりますが、ATmega644Pではセラロックは安定しないというような情報がありましたので、とりあえず今回はクリスタルを使用しました。

arduino-0018がインストール済みとします。

http://code.google.com/p/sanguino/downloads/list からSanguino-0018r2_1_4.zipをダウンロードし、

Sanguino-0018r2_1_4.txtに従い、解凍後のSanguinoをarduino-0018\hardware\の下にコピーします。(arduino-0018\hardware\Sanguinoになる)

ブートローダは以下を使用します。

D:\Sanguino-0018r2_1_4\Sanguino\bootloaders\atmega644p\ATmegaBOOT_644P.hex

ブートローダーの書き込みとFuseBitの書き込みは↓を参考に。

http://www1.parkcity.ne.jp/kama/Arduino.htm

http://pc.watch.impress.co.jp/docs/column/musashino_proto/20090806_307235.html

Arduino IDEから”Tools”-“Board”で”Sanguino”を選択

後はArduinoと同じように使えます。

※8/13 文章全体を見直しました。