2013 年度
卒 業 論 文
Arduino による Boe-Bot 制御
指導教員 白井英俊 教授
中京大学 情報理工学部 情報知能学科
学籍番号 H209951 蟹井 翔貴
(2014 年 1 月)
卒業論文要旨
題目 Arduino による Boe-Bot 制御
学籍番号 H209951 氏名 蟹井 翔貴 指導教員 白井 英俊 本論文は CPU として Arduino を用いた 2 つの車輪で動くロボットBoe-Bot の 制御方法についての研究である。このBoe-Bot を題材にしようと思った背景に は私が所属している白井研究室でのBoe-Bot 制御を学習したことにある。研究 室では、このBoe-Bot の簡単な移動の制御を始めとし、各種センサーを搭載し その情報に基づく制御などを行った。本研究では、このBoe-Bot 操作をさらに 進化させ、無線による通信を用いて、より拡張性の高い制御を行おうとした。 なお、研究室では、Boe-Bot の CPU に BasicStamp を用いていたが、BasicStamp には容量や扱えるハードウェアシリアルに限りがあり使い勝手がよくなかった。 そのため本研究においては容量もありハードウェアシリアルを最大で 4 つ使用 できるArduino Mega ADK を使用した。Arduino は全般的に汎用性も高く、web 上にも様々なライブラリがあることが特徴である。
本研究では、まず無線通信による移動の制御を行い、その後JPEG カメラに より画像を取得しPC に転送することを試みた。無線通信には Bluetooth モジュ ールを使用した。Bluetooth は主に数 m~数十 m という近距離で簡易な情報をや りとりするために用いられる。JPEG カメラについては、Arduino に JPEG カ メラを扱うライブラリがあり、シリアル通信で画像を転送できることから採用 した。 研究の結果、無線通信によるBoe-Bot の移動制御に成功した。さらに、PC だ けではなく、Bluetooth 機能を内蔵したスマートフォンでも同じように移動の制 御に成功した。JPEG カメラについては、有線通信による画像の取得・転送に は成功したが、無線通信による画像の取得・転送には失敗した。失敗した理由 としては通信速度の問題、データ欠落の問題、オーバーフローの問題等が考え られる。 今後の課題として、まず無線通信による画像の取得・転送を行う。その後スマ ートフォン等の端末からの操作を行う。その後、目標地点や目標物を定め、そ の目標に向かってBoe-Bot を自律走行させたい。そして対象となる人や物を自 動的に検出し、その画像を転送するロボットを作りたい、と考えている。
目次
第一章 はじめに……….1 第二章 研究の構成……….3 2.1 Boe-Bot について………3 2.2 Arduino について……….3 2.3 使用した Bluetooth 機器………4 2.4 研究の構成………...5 第三章 開発……….6 3.1 Boe-Bot の制御……….6 3.2 スマートフォンからの制御………...6 3.3 JPEG カメラの制御……….7 3.3.1 Processing について……….8 3.3.2 JPEG カメラの考察……….8 3.4 Boe-Bot に JPEG カメラを乗せる……….9 第四章 結果と考察………..10 4.1 結果……….10 4.2 失敗原因の検討……….10 4.2.1 通信速度改善の対策………..11 4.2.2. データ欠落防止の対策……….11 4.2.3 その他考えうる対策………..12 第五章 今後の課題………..13 5.1 今後の課題……….13 5.2 最終目標……….14 第六章 まとめ……….15 参考文献……….16 謝辞……….17 付録1. Arduino のプログラム……….18 付録2. Processingのプログラム……….27 ⅰ第一章 はじめに
近年様々なロボットが研究・開発されているが、なかでも地震や洪水等の災害 に被災した人間を助けるレスキューロボットは急速に増えている。こうした背 景には2011 年の東京電力・福島第一原子力発電所事故があり、原発事故時に内 部調査をしたり危険な場所での作業を行うロボットが求められていることがあ げられる。実際、福島第一原発事故では危険個所での作業者の被ばくリスクを 減らすために原子力災害ロボットを導入・運用することの重要性が再認識され、 既に国内外のロボットが福島に投入されている。レスキューロボットは形も目 的も様々であり、大きく分けると要救助者の探索のためのものとがれき撤去等 の直接の作業を行うようなものがある。他にも空中から地上の情報を収集する 無人航空機や水中を探索するロボット、そして放射線によって汚染された場所 で活動するロボット等がある。しかしながら、これらのようなレスキューロボ ットは開発に莫大な時間と費用がかかってしまうのもまた事実である。 私が在籍している白井研究室では Boe-Bot(Parallax,2004)と呼ばれる独立し た二つの車輪で動くロボットを研究している。この Boe-bot は 1 万数千円とい うそれなりに安価な値段で購入でき、かつ簡単なプログラミングで制御できる のでロボット入門にも適しているといえる。 研究室では Boe-Bot を決められた範囲内で正確に走行させたり、赤外線セン サーによる壁の検知や崖の検知、また光センサーによる物体認識等を行って来 た。 今回、これらのロボット制御をさらに発展させ、無線で通信出来るロボット を開発したいと思い本研究を行うことにした。Boe-Bot は安価で購入でき、様々 なセンサーを搭載でき、またその体の小ささゆえに無線通信できれば、災害地 等で活躍できるのではないかと考えたからである。 本研究では、Boe-Bot を用い無線により移動の制御をしさらに写真を撮りその 画像を PC 上に転送することを目的とした。Boe-Bot は災害時や人間の入れない 環境(狭い、汚染)での使用を想定した。 本論文の構成は以下のとおりである。 第二章では本研究を行うにあたって使用した Boe-Bot や Arduino についての 紹介を行う。また無線通信として使用した Bluetooth 通信の説明も加え、本研 究の流れを述べる。 第三章では実際に無線通信により Boe-Bot を制御し、また Bluetooth を内蔵 したスマートフォンからも同様に制御をする。その後、写真を撮るためのカメ 1ラを乗せて実際に写真を撮って PC 上に転送する。 第四章では本研究を行った結果、またそれに対する考察を行う。 第五章では第四章での結果・考察を踏まえ、今後の課題を考え最終的な目標 について述べる。 第六章では Boe-Bot のさらなる拡張、また実際の現場で起きうる問題を想定 しそれを改善するための案を考えてまとめていく。 2
第二章 研究の構成
本研究では Parallax 社が開発した Boe-Bot に CPU として Arduino を搭載して 制御することを主題としている。本章ではまず Boe-Bot について紹介を行い、 Arduino についての解説を行う。また本研究で使用した Bluetooth 通信と使用し た Bluetooth モジュールの解説も併せて行う。その後、前章で述べた目的を達 成するための研究の流れを述べていく。
2.1 Boe-Bot について
Boe-Bot とは、Parallax 社が開発、販売する独立した 2 つの車輪で動くロボ ットである。各種センサー(赤外線センサー、光センサー、超音波センサー)を 搭載することにより衝突検知、距離把握が可能となる。CPU として BasicStamp と Arduino が使えるが、本研究ではライブラリの数の 多さ、安価で買える等の理由から Arduino を使用した。
図2-1 Boe-Bot 本体
2.1 Arduino について
Arduino とは、AVR マイコン、I/O ポートを持った基板であり、C 言語風の Arduino 言語により構成されるシステムである。
Arduino ハードウェアは現在までに 17 種類発売されており、主要なモデルで ある Arduino Uno、4 つのハードウェアシリアルが使用でき本研究で使用した Arduino Mega ADK 等がある。本研究では、Boe-Bot の移動制御をするための
Bluetooth 通信、JPEG 画像を送るための Bluetooth 通信等、複数のハードウェ アシリアルを使用する必要があったため Arduino Mega ADK を採用した。
図 2-2 Arduino Uno 図 2-3 Arduino Mega ADK
2.3 使用した Bluetooth 機器
本研究では、無線通信の規格の一つである Bluetooth により、Boe-Bot と PC と データのやりとりに用いた。Bluetooth とは主に数 m~数十 m という近距離で簡 易な情報をやりとりするために用いられ、PC やスマートフォンの間のデータ通 信やマウスやキーボード入力などの接続にも使われている。本研究では PC と Boe-Bot のシリアル通信を行うために用いることにした。 本研究で使用したモジュールは図 2-4 に示す RBT-001 である。快適な通信速 度確保のために Arduino の 5.0V に直結したいが残念なことにこのモジュールは 3.0V 対応である。このため本研究では専用のシリアルコンバータを使っている。 また最大通信速度は 115.2kbps である。 図2-4 RBT-001 42.4 研究の構成
本研究では初めに Bluetooth 通信を用い PC 上から Boe-Bot を制御する。その 後、Bluetooth 通信機能を搭載している市販のスマートフォンでも同じように Boe-Bot を制御する。 次に Boe-Bot に後述する JPEG カメラを取り付け、PC からの遠隔操作により写 真を撮影し、その画像を PC 上に表示させる。 5第三章 開発
本章では研究を行うにあたり、どのように Boe-Bot を組み立て、どのような 制御を行ったのかを Boe-Bot、スマートフォン、JPEG カメラの 3 つにわけ述べ ていく。
3.1
Boe-Bot の制御
Boe-Bot の車輪には servo モータを使用した。これは、Arduino に servo モー タをコントロールする servo ライブラリがあり、送るパルスによって 2 つの車 輪を別々に動かすことが出来るためである。車輪として使用するため servo モ ータは連続回転仕様のものを採用した。 プログラムとして、シリアル通信により Arduino にデータが送られた場合、 そのデータによって Boe-Bot の動きを制御するようにした。送られてきたデー タと Boe-Bot の挙動を以下に示す。 F キー → 前進 B キー → 後進 R キー → 右旋回 L キー → 左旋回 スペースキー → その場回転 S キー → 停止 W キー → カメラ台座の右回転 Q キー → カメラ台座の左回転 上記以外 → 停止
3.2 スマートフォンからの制御
Bluetooth が内蔵されているスマートフォンからでも同じように Boe-Bot の制 御を行う。スマートフォンは近年その需要が高まっており、PC より小型であり バッテリー容量もそれなりに多いので採用した。 スマートフォンと Arduino のシリアル通信を行うためのターミナルソフトには BlueTerm を使用した。BlueTerm はコネクトのしやすさやデータを送信するためのシリアルモニタと 必要最低限の機能を搭載しているだけであるが、ここで行うことはデータの送信のみであ るため適切と判断し採用した。 63.3 JEPG カメラの制御
使用する JPEG カメラは LS-Y201 である。LS-Y201 はカラーの静止画を撮ること ができ出力をシリアル通信で行えるため採用した。また電圧は 3.0V と 5.0V で 選べるが、通信速度確保のために 5.0V に繋いだ。またこのときの通信速度は 38.4kbps である。 図 3-1 LS-Y201 Arduino には JPEG カメラを扱うライブラリがあるためそれを使用する。シリ アル通信によって何かデータが送られて来たら撮影を開始し JPEG 画像を送るよ うにする。ここで送られて来たデータを可視化するために本研究では PC 上の Processing で表示させる。
3.3.1 Processing について
Processing とはデザイナー向けの言語で以下の図に示すような様々なアート 表現が可能である。また Arduino との連携も容易であるため本研究で使用した。 7図 3-2 Processing で書いた複雑な模様 Processing を用い実際に LS-Y201 で撮った写真が以下の図である。ピントを 合わせるためにはドライバーでネジを調節する必要があるため、時間と手間が かかる。また図の撮影時にはピントは無限遠に調整してあるが多少ぼやけてし まった。 図 3-3 LS-Y201 で撮ったぬいぐるみ(左)と研究室の風景(右)
3.3.2 JPEG カメラの考察
画像内に特定のマーカーがあるときだけ、画像を取得し表示させる。これに OpenCV や AR 等の画像処理を組み合わせることにより、物体や人の検出を行うこ とが出来る。LS-Y201 は小型でカラーの静止画を撮ることが出来るため、場所を 8選ばない監視カメラが作れる等、まだまだ研究の余地がある。
3.4 Boe-Bot にカメラを乗せる
Boe-Bot にカメラを乗せるにあたり、本研究では servo モータを使った回転台 を作成した。ただし、ここで使う servo モータは車輪とは違い 180°回転仕様の ものにした。これは Boe-Bot 上のブレッドボードにある他の部品にぶつからな いようにするためである。 回転台は電源を入れた直後は必ず正面を向くように調整し、回転域(0°~ 180°)を超えてなお回転台を回転させようとした場合も正面を向くように調整 した。これは servo モータへの高負荷を防ぐためである。 図 3-4 JPEG カメラを取り付けた Boe-Bot 9第四章 結果と考察
本章では研究を行った結果、そしてその結果に対する考察を行い今後の課題を 見出していく。4.1 結果
研究の結果、PC 上から Bluetooth 通信によって Boe-Bot を自在にコントロー ルすることが出来た。また、スマートフォンからでも同じように Boe-Bot をコ ントロールすることが出来た。スマートフォンは小型でバッテリー容量もそれ なりに多いので災害時や人間が入れないような場所での Boe-Bot 制御で活躍で きるであろう。 また、JPEG カメラを使用して写真を撮り USB による有線通信で PC に送信し、 画像を表示させることが出来た。しかし、Bluetooth 通信による無線通信で PC に送信することには失敗してしまった。もし無線通信による画像転送に成功す れば、離れた場所の写真を見ることが出来るであろう。4.2 失敗原因の検討
ここからは何故無線通信での画像送信に失敗したのかを考え、そして改善する ための案を述べていく。 本研究の結果、失敗原因と考えられたのは以下の3 つである。 1.単純な設計・プログラムのミス 2.Bluetooth モジュールの通信速度の限界 3.無線通信によるデータの欠落 まず、設計についてはシリアル通信において間違いやすい rx,tx の PIN を徹底 的に確認した。またプログラムについては、有線通信時と同じプログラムを使 っているため可能性としては低いと考えられる。 次にBluetooth 通信モジュールの通信速度の限界についてである。第二章で述 べたように本研究で使用したモジュールは115.2kbps であり、通信速度として は十分過ぎるほどである。しかし、電力不足が原因で通信速度が下がっている 可能性が考えられるため可能性としては中くらいであると考えられる。 最後に無線通信によるデータの欠落についてである。有線よりもノイズが入り やすく不安定であるため可能性としてはかなり大きなものであると考えられた。 実際、有線通信時には 64byte ずつ送信出来ていたが、無線通信時には 2byte ず 10つしか送信出来ておらずタイムアウトしてしまった。また速度が速すぎること によるオーバーフローも考えられる。 上記の失敗原因に対する対策案を次の節で考えていく。
4.2.1 通信速度改善の対策
通信速度を改善するためにまず電力不足を解消する方法を考えた。Arduino は 単三電池 5 個で動かしているがその電池を全て新品に取り換えた。しかし結果 は変わらなかったため、電力不足が原因ではないと考えた。 次に Bluetooth モジュールを別のものに変えるという方法を考えた。Arduino には Bluetooth 通信用の Bluetooth シールドがあり、それを使用したが結果は 相変わらずであった。 図 4-1 Arduino Bluetooth シールド4.2.2 データ欠落防止の対策
データ欠落を防止するためにまずフロー制御を行った。その結果 8byte ずつ 送信出来たが依然としてタイムアウトしてしまう。 次にオーバーフローの可能性を考慮し、通信速度をあえて落としてみた。JPEG カメラの通信速度が 38.4kbps なので Bluetooth モジュールの通信速度も 38.4kbps に合わせてみたところ 32byte の送信が出来たが画像の表示には至らな かった。 114.2.3 その他考えうる対策
上記以外の対策として考えられることの一つに別の無線通信モジュールを使 用する方法がある。例えば、XBee を使ってみたり Arduino の wi-fi シールドを 使う方法が考えられる。また他の対策としてカメラを JPEG カメラから無線機能 を搭載したネットワークカメラに変更したりすることが考えられる。
第五章 今後の課題
本章では前章で述べた結果に対して今後どのような課題があり、そしてその果 てにどのような最終的な目標を考え達成していくかを述べていく。5.1 今後の課題
今後の課題として、まず無線通信により画像データを転送できるようにする。 このことにより離れた Boe-Bot からでも画像を転送することができる。またさ らなる応用として PC ではなくスマートフォンにも画像を転送できるようにすれ ば、より小型のコントローラーとして活躍出来るだろう。実際、神戸(2012 年) の研究により、ロボット操作のインターフェースとしてスマートフォンやタブ レット端末は適していることがわかっている。 次に各種センサーを取り付け、その情報を転送する。本研究で作った Boe-Bot は無線での移動とカメラの取り付けに特化していたため、センサーを使用しな かったが、以前私が研究室で作っていた Boe-Bot(CPU に BasicStamp)には色々な センサーを取り付けていた。例えば、壁との衝突検知や崖からの落下防止のた めの赤外線センサーや光に反応する光センサーである。これらを本研究で使用 した Boe-Bot につけることにより、さらに移動の制御がしやすくなる。 図 5-1 本研究とは別に作成したセンサーを取り付けた Boe-Bot 135.2 最終目標
今後の最終的な目標として、目標地点や目標物を定め、その目標に向かって Boe-Bot を自律走行させて写真を撮りたい。これにより災害時や人間が入れない 環境において対象となる人や物を自動的に検出し、その画像を転送するロボッ トを作ることが出来るであろう。 14第六章 まとめ
本研究の結果として、Bluetooth 通信により PC・スマートフォンといった端 末と Arduino のシリアル通信を行い Boe-Bot を制御することに成功した。また、 JPEG カメラを使い、Arduino から有線接続により PC に画像データを送り、その 画像を表示することが出来た。 本研究で作成した Boe-Bot があらゆる場面や環境で使用出来るか、というこ とに対してはまだまだ難しいと考える。しかし、Boe-Bot の小型性や Arduino の 汎用性を考えればまだまだ出来ることはたくさんあるはずである。実際、 Boe-Bot には悪路走行を可能とするキャタピラや Arduino にはより高速で無線通 信出来る wi-fi シールドが発売されている。またコントローラーを PC からスマ ートフォンにすることにより操作者も楽になるであろう。 今後は Boe-Bot のような小型なロボットもレスキューロボットとしてたくさ ん研究されていくであろう。 15参考文献
Arduino (2013) - http://arduino.cc/ (2013 年 4 月 1 日アクセス)
Arduino 日本語リファレンス (2013) http://www.musashinodenpa.com/arduino/ref/ (2013 年 4 月 1 日アクセス)
Parallax (2004 ). Robotics with the Board of Education Shield for Arduino. http://learn.parallax.com/ShieldRobot (2013 年 4 月 1 日アクセス) Sparkfun (2013). LinkSprit JPEG color camera TTL interface
https://www.sparkfun.com/products/retired/10061 (2013 年 4 月 1 日アクセス) Blue Term(2013). https://play.google.com/store/apps/details?id=es.pymasde.blueterm
(2013 年 7 月アクセス) 蒲 恵太 (2012) 『Irobot Create の拡張』. 中京大学情報理工学部情報知能学科 2012 年度卒業論文. 神戸 雅史 (2012) 『Android 端末によるロボット制御とその評価』. 中京大学情 報理工学部情報知能学科 2012 年度卒業論文. なんでも作っちゃう、かも。 (2013) 『なんでも作っちゃう、かも。 Arduino で 遊ぼう LinkSprit JPEG カメラモジュール 「LS-Y201」』.
http://arms22.blog91.fc2.com/blog-entry-391.html (2013 年 4 月 1 日アクセス)
謝辞
本研究を行うにあたり、白井英俊教授にご指導頂きました。また研究に際しては同期の 神戸、蒲にアドバイスを頂きました。そして、最後まで研究を支えてくれた研究室の吉田、 そして後輩の皆さん。この場を借りてお世話になった方々にお礼を申し上げます。ありが とうございました。 17付録
【Boe-Bot の移動のプログラム】 #include <SoftwareSerial.h> #include <Servo.h> Servo servoLeft; Servo servoRight; Servo camera; int angle = 90; void setup() { Serial3.begin(9600); camera.attach(11); camera.write(90); } void loop() { if(Serial3.available()>0) { switch (Serial3.read()) { servoLeft.attach(13); servoRight.attach(12); case 'f': servoLeft.writeMicroseconds(1700); servoRight.writeMicroseconds(1300); break; case 'b': 18servoLeft.writeMicroseconds(1300); servoRight.writeMicroseconds(1700); break; case 'r': servoLeft.writeMicroseconds(1700); servoRight.writeMicroseconds(1480); break; case 'l': servoLeft.writeMicroseconds(1520); servoRight.writeMicroseconds(1300); break; case 's': servoLeft.attach(13); servoRight.attach(12); servoLeft.writeMicroseconds(1500); servoRight.writeMicroseconds(1500); break; case ' ': servoLeft.writeMicroseconds(1550); servoRight.writeMicroseconds(1550); break; 19
case 'q': if(angle == 180){ camera.attach(11); camera.write(90); angle = 90; }else{ angle = angle + 10; camera.attach(11); camera.write(angle); } break; case 'w': if(angle == 0){ camera.attach(11); camera.write(90); angle = 90; }else{ angle = angle - 10; camera.attach(11); camera.write(angle); } break; default: servoLeft.writeMicroseconds(1500); servoRight.writeMicroseconds(1500); } 20
} } 【JPEG カメラのプログラム】 #include <JPEGCamera.h> #include <SoftwareSerial.h> //NewSoftSerial インスタンスを作成 SoftwareSerial mySerial(2,3); //JPEGCamera インスタンスを作成 //コンストラクタに Stream クラスの派生クラスを指定する JPEGCamera camera(mySerial); //受信バッファ
unsigned char response[32]; //受信データサイズ
unsigned int count=0; //撮影した JPGE 画像サイズ unsigned int size=0;
//次に読み込む JPEG 画像のアドレス unsigned int address=0;
void setup() { //シリアルポートセットアップ //JPEG カメラ-Arduino 38400 bps //Arduino-PC 115 kbps mySerial.begin(38400); Serial.begin(115200); //撮影サイズ設定(640x480,320x240,160x120) //指定した撮影サイズは EEPROM に書き込まれるので 1 度実行したらコメントア ウトする
//if( camera.imageSize(JPEGCamera::IMG_SZ_640x480) == false ){ // Serial.println("imageSize failed");
//}
//JPEG カメラをリセット if( camera.reset() == false ){
Serial.println("reset failed"); } //4 秒程まってから撮影を開始する delay(4000); } void loop() { //PC からの撮影トリガを待つ if( Serial.available() ){ //受信データ破棄 Serial.flush(); //撮影する
if( camera.takePicture() == false ){
Serial.println("takePicture failed"); }
//撮影した画像データのサイズを取得する if( camera.getSize(&size) == false ){
Serial.println("getSize failed"); } //開始アドレスを 0 に、size 分読み込むまで繰り返す address = 0; while(address < size) { //32byte 読み込む
count = camera.readData(response, 32, address); if( count ){ //PC に送信する Serial.write(response, count); //受信したデータサイズ分、アドレスを更新する address += count; } else{ Serial.println("readData failed"); } } 22
//撮影停止(一旦止めないと新しい画像は撮影されない) camera.stopPictures(); //少し待つ delay(100); } } 【上記を合わせた、移動及び写真撮影のプログラム】 #include <JPEGCamera.h> #include <SoftwareSerial.h> #include <Servo.h> Servo servoLeft; Servo servoRight; //NewSoftSerial インスタンスを作成 SoftwareSerial mySerial(10,3); //JPEGCamera インスタンスを作成 //コンストラクタに Stream クラスの派生クラスを指定する JPEGCamera camera(mySerial); //受信バッファ
unsigned char response[32]; //受信データサイズ
unsigned int count=0; //撮影した JPGE 画像サイズ unsigned int size=0;
//次に読み込む JPEG 画像のアドレス unsigned int address=0;
void setup() { Serial3.begin(9600); //シリアルポートセットアップ //JPEG カメラ-Arduino 38400 bps //Arduino-PC 115 kbps 23
mySerial.begin(38400); Serial.begin(115200);
//撮影サイズ設定(640x480,320x240,160x120)
//指定した撮影サイズは EEPROM に書き込まれるので 1 度実行したらコメントア ウトする
if( camera.imageSize(JPEGCamera::IMG_SZ_320x240) == false ){ Serial.println("imageSize failed");
}
//JPEG カメラをリセット if( camera.reset() == false ){
Serial.println("reset failed"); } //4 秒程まってから撮影を開始する delay(4000); } void loop() { if(Serial3.available()>0) { switch (Serial3.read()) { servoLeft.attach(13); servoRight.attach(12); case 'f': servoLeft.writeMicroseconds(1700); servoRight.writeMicroseconds(1300); break; case 'b': 24
servoLeft.writeMicroseconds(1300); servoRight.writeMicroseconds(1700); break; case 'r': servoLeft.writeMicroseconds(1700); servoRight.writeMicroseconds(1480); break; case 'l': servoLeft.writeMicroseconds(1520); servoRight.writeMicroseconds(1300); break; case 's': servoLeft.attach(13); servoRight.attach(12); servoLeft.writeMicroseconds(1500); servoRight.writeMicroseconds(1500); break; case ' ': servoLeft.writeMicroseconds(1550); servoRight.writeMicroseconds(1550); break; 25
default: servoLeft.writeMicroseconds(1500); servoRight.writeMicroseconds(1500); if( Serial.available() ){ servoLeft.writeMicroseconds(1500); servoRight.writeMicroseconds(1500); //受信データ破棄 Serial.flush(); //撮影する
if( camera.takePicture() == false ){
Serial.println("takePicture failed"); }
//撮影した画像データのサイズを取得する if( camera.getSize(&size) == false ){
Serial.println("getSize failed"); } //開始アドレスを 0 に、size 分読み込むまで繰り返す address = 0; while(address < size) { //32byte 読み込む
count = camera.readData(response, 32, address); if( count ){ //PC に送信する Serial.write(response, count); //受信したデータサイズ分、アドレスを更新する address += count; } else{ Serial.println("readData failed"); } } //撮影停止(一旦止めないと新しい画像は撮影されない) camera.stopPictures(); 26
//少し待つ delay(100); } } } } 【Processing のプログラム】 import processing.serial.*; Serial myPort;
String filename = "photo.jpg"; byte count = 0;
byte[] photo = { };
Boolean readData = false; PImage captureImage; void setup() { size(640,480); println( Serial.list() ); //Serial.list()[3]は環境に合わせて変更すること。 myPort = new Serial( this, Serial.list()[1], 115200 ); }
void draw() {
byte[] buffer = new byte[64]; if( readData )
{
while( myPort.available() > 0 ) {
int readBytes = myPort.readBytes( buffer );
print( "Read " ); print( readBytes ); println( " bytes ..." );
for( int i = 0; i < readBytes; i++ ) {
photo = append( photo, buffer[i] ); } } } else { while( myPort.available() > 0 ) {
print( "COM Data: " );
println( myPort.readString() ); } } } void keyPressed() { if( photo.length > 0 ) { readData = false;
print( "Writing to disk " ); print( photo.length ); println( " bytes ..." );
filename = "photo" + count + ".jpg"; saveBytes( filename, photo ); println( "DONE!" );
photo = new byte[0];
captureImage = loadImage(filename); image(captureImage, 0, 0); count++; } else { readData = true; 28
println( "Waiting for data ..." ); }
}