Arduino によるBoe-Bot制御 - SIRAI's...

32
2013 年度 Arduino による Boe-Bot 制御 指導教員 白井英俊 教授 中京大学 情報理工学部 情報知能学科 学籍番号 H209951 蟹井 翔貴 (2014 年 1 月)

Transcript of Arduino によるBoe-Bot制御 - SIRAI's...

Page 1: Arduino によるBoe-Bot制御 - SIRAI's Weblang.sist.chukyo-u.ac.jp/Classes/seminar/Papers/2013/...2013 年度 卒 業 論 文 Arduino によるBoe-Bot制御 指導教員 白井英俊

2013 年度

卒 業 論 文

Arduino による Boe-Bot 制御

指導教員 白井英俊 教授

中京大学 情報理工学部 情報知能学科

学籍番号 H209951 蟹井 翔貴

(2014 年 1 月)

Page 2: Arduino によるBoe-Bot制御 - SIRAI's Weblang.sist.chukyo-u.ac.jp/Classes/seminar/Papers/2013/...2013 年度 卒 業 論 文 Arduino によるBoe-Bot制御 指導教員 白井英俊

卒業論文要旨 題目 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 を自律走行させたい。そして対象となる人や物を自

動的に検出し、その画像を転送するロボットを作りたい、と考えている。

Page 3: Arduino によるBoe-Bot制御 - SIRAI's Weblang.sist.chukyo-u.ac.jp/Classes/seminar/Papers/2013/...2013 年度 卒 業 論 文 Arduino による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

Page 4: Arduino によるBoe-Bot制御 - SIRAI's Weblang.sist.chukyo-u.ac.jp/Classes/seminar/Papers/2013/...2013 年度 卒 業 論 文 Arduino によるBoe-Bot制御 指導教員 白井英俊

第一章 はじめに 近年様々なロボットが研究・開発されているが、なかでも地震や洪水等の災害

に被災した人間を助けるレスキューロボットは急速に増えている。こうした背

景には 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

Page 5: Arduino によるBoe-Bot制御 - SIRAI's Weblang.sist.chukyo-u.ac.jp/Classes/seminar/Papers/2013/...2013 年度 卒 業 論 文 Arduino によるBoe-Bot制御 指導教員 白井英俊

ラを乗せて実際に写真を撮って PC上に転送する。

第四章では本研究を行った結果、またそれに対する考察を行う。

第五章では第四章での結果・考察を踏まえ、今後の課題を考え最終的な目標

について述べる。 第六章では Boe-Botのさらなる拡張、また実際の現場で起きうる問題を想定

しそれを改善するための案を考えてまとめていく。

2

Page 6: Arduino によるBoe-Bot制御 - SIRAI's Weblang.sist.chukyo-u.ac.jp/Classes/seminar/Papers/2013/...2013 年度 卒 業 論 文 Arduino によるBoe-Bot制御 指導教員 白井英俊

第二章 研究の構成

本研究では 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の移動制御をするための

3

Page 7: Arduino によるBoe-Bot制御 - SIRAI's Weblang.sist.chukyo-u.ac.jp/Classes/seminar/Papers/2013/...2013 年度 卒 業 論 文 Arduino による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

4

Page 8: Arduino によるBoe-Bot制御 - SIRAI's Weblang.sist.chukyo-u.ac.jp/Classes/seminar/Papers/2013/...2013 年度 卒 業 論 文 Arduino によるBoe-Bot制御 指導教員 白井英俊

2.4 研究の構成

本研究では初めに Bluetooth通信を用い PC上から Boe-Botを制御する。その

後、Bluetooth通信機能を搭載している市販のスマートフォンでも同じように

Boe-Botを制御する。

次に Boe-Botに後述する JPEGカメラを取り付け、PCからの遠隔操作により写

真を撮影し、その画像を PC上に表示させる。

5

Page 9: Arduino によるBoe-Bot制御 - SIRAI's Weblang.sist.chukyo-u.ac.jp/Classes/seminar/Papers/2013/...2013 年度 卒 業 論 文 Arduino によるBoe-Bot制御 指導教員 白井英俊

第三章 開発 本章では研究を行うにあたり、どのように 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はコネクトのしやすさやデータを送信するためのシリアルモニタと

必要最低限の機能を搭載しているだけであるが、ここで行うことはデータの送信のみであ

るため適切と判断し採用した。

6

Page 10: Arduino によるBoe-Bot制御 - SIRAI's Weblang.sist.chukyo-u.ac.jp/Classes/seminar/Papers/2013/...2013 年度 卒 業 論 文 Arduino によるBoe-Bot制御 指導教員 白井英俊

3.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

Page 11: Arduino によるBoe-Bot制御 - SIRAI's Weblang.sist.chukyo-u.ac.jp/Classes/seminar/Papers/2013/...2013 年度 卒 業 論 文 Arduino によるBoe-Bot制御 指導教員 白井英俊

図 3-2 Processingで書いた複雑な模様

Processingを用い実際に LS-Y201で撮った写真が以下の図である。ピントを

合わせるためにはドライバーでネジを調節する必要があるため、時間と手間が

かかる。また図の撮影時にはピントは無限遠に調整してあるが多少ぼやけてし

まった。

図 3-3 LS-Y201で撮ったぬいぐるみ(左)と研究室の風景(右)

3.3.2 JPEG カメラの考察

画像内に特定のマーカーがあるときだけ、画像を取得し表示させる。これに

OpenCVや AR等の画像処理を組み合わせることにより、物体や人の検出を行うこ

とが出来る。LS-Y201は小型でカラーの静止画を撮ることが出来るため、場所を

8

Page 12: Arduino によるBoe-Bot制御 - SIRAI's Weblang.sist.chukyo-u.ac.jp/Classes/seminar/Papers/2013/...2013 年度 卒 業 論 文 Arduino によるBoe-Bot制御 指導教員 白井英俊

選ばない監視カメラが作れる等、まだまだ研究の余地がある。

3.4 Boe-Bot にカメラを乗せる

Boe-Botにカメラを乗せるにあたり、本研究では servoモータを使った回転台

を作成した。ただし、ここで使う servoモータは車輪とは違い 180°回転仕様の

ものにした。これは Boe-Bot上のブレッドボードにある他の部品にぶつからな

いようにするためである。

回転台は電源を入れた直後は必ず正面を向くように調整し、回転域(0°~

180°)を超えてなお回転台を回転させようとした場合も正面を向くように調整

した。これは servoモータへの高負荷を防ぐためである。

図 3-4 JPEGカメラを取り付けた Boe-Bot

9

Page 13: Arduino によるBoe-Bot制御 - SIRAI's Weblang.sist.chukyo-u.ac.jp/Classes/seminar/Papers/2013/...2013 年度 卒 業 論 文 Arduino によるBoe-Bot制御 指導教員 白井英俊

第四章 結果と考察 本章では研究を行った結果、そしてその結果に対する考察を行い今後の課題を

見出していく。

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

Page 14: Arduino によるBoe-Bot制御 - SIRAI's Weblang.sist.chukyo-u.ac.jp/Classes/seminar/Papers/2013/...2013 年度 卒 業 論 文 Arduino によるBoe-Bot制御 指導教員 白井英俊

つしか送信出来ておらずタイムアウトしてしまった。また速度が速すぎること

によるオーバーフローも考えられる。 上記の失敗原因に対する対策案を次の節で考えていく。

4.2.1 通信速度改善の対策

通信速度を改善するためにまず電力不足を解消する方法を考えた。Arduinoは

単三電池 5個で動かしているがその電池を全て新品に取り換えた。しかし結果

は変わらなかったため、電力不足が原因ではないと考えた。

次に Bluetoothモジュールを別のものに変えるという方法を考えた。Arduino

には Bluetooth通信用の Bluetoothシールドがあり、それを使用したが結果は

相変わらずであった。

図 4-1 Arduino Bluetoothシールド

4.2.2 データ欠落防止の対策

データ欠落を防止するためにまずフロー制御を行った。その結果 8byteずつ

送信出来たが依然としてタイムアウトしてしまう。

次にオーバーフローの可能性を考慮し、通信速度をあえて落としてみた。JPEG

カメラの通信速度が 38.4kbpsなので Bluetoothモジュールの通信速度も

38.4kbpsに合わせてみたところ32byteの送信が出来たが画像の表示には至らな

かった。

11

Page 15: Arduino によるBoe-Bot制御 - SIRAI's Weblang.sist.chukyo-u.ac.jp/Classes/seminar/Papers/2013/...2013 年度 卒 業 論 文 Arduino によるBoe-Bot制御 指導教員 白井英俊

4.2.3 その他考えうる対策

上記以外の対策として考えられることの一つに別の無線通信モジュールを使

用する方法がある。例えば、XBeeを使ってみたり Arduinoの wi-fiシールドを

使う方法が考えられる。また他の対策としてカメラを JPEGカメラから無線機能

を搭載したネットワークカメラに変更したりすることが考えられる。

12

Page 16: Arduino によるBoe-Bot制御 - SIRAI's Weblang.sist.chukyo-u.ac.jp/Classes/seminar/Papers/2013/...2013 年度 卒 業 論 文 Arduino によるBoe-Bot制御 指導教員 白井英俊

第五章 今後の課題 本章では前章で述べた結果に対して今後どのような課題があり、そしてその果

てにどのような最終的な目標を考え達成していくかを述べていく。

5.1 今後の課題

今後の課題として、まず無線通信により画像データを転送できるようにする。

このことにより離れた Boe-Botからでも画像を転送することができる。またさ

らなる応用として PCではなくスマートフォンにも画像を転送できるようにすれ

ば、より小型のコントローラーとして活躍出来るだろう。実際、神戸(2012年)

の研究により、ロボット操作のインターフェースとしてスマートフォンやタブ

レット端末は適していることがわかっている。

次に各種センサーを取り付け、その情報を転送する。本研究で作った Boe-Bot

は無線での移動とカメラの取り付けに特化していたため、センサーを使用しな

かったが、以前私が研究室で作っていた Boe-Bot(CPUに BasicStamp)には色々な

センサーを取り付けていた。例えば、壁との衝突検知や崖からの落下防止のた

めの赤外線センサーや光に反応する光センサーである。これらを本研究で使用

した Boe-Botにつけることにより、さらに移動の制御がしやすくなる。

図 5-1 本研究とは別に作成したセンサーを取り付けた Boe-Bot

13

Page 17: Arduino によるBoe-Bot制御 - SIRAI's Weblang.sist.chukyo-u.ac.jp/Classes/seminar/Papers/2013/...2013 年度 卒 業 論 文 Arduino によるBoe-Bot制御 指導教員 白井英俊

5.2 最終目標

今後の最終的な目標として、目標地点や目標物を定め、その目標に向かって

Boe-Botを自律走行させて写真を撮りたい。これにより災害時や人間が入れない

環境において対象となる人や物を自動的に検出し、その画像を転送するロボッ

トを作ることが出来るであろう。

14

Page 18: Arduino によるBoe-Bot制御 - SIRAI's Weblang.sist.chukyo-u.ac.jp/Classes/seminar/Papers/2013/...2013 年度 卒 業 論 文 Arduino によるBoe-Bot制御 指導教員 白井英俊

第六章 まとめ 本研究の結果として、Bluetooth通信により PC・スマートフォンといった端

末と Arduinoのシリアル通信を行い Boe-Botを制御することに成功した。また、

JPEGカメラを使い、Arduinoから有線接続により PCに画像データを送り、その

画像を表示することが出来た。

本研究で作成した Boe-Botがあらゆる場面や環境で使用出来るか、というこ

とに対してはまだまだ難しいと考える。しかし、Boe-Botの小型性や Arduinoの

汎用性を考えればまだまだ出来ることはたくさんあるはずである。実際、

Boe-Botには悪路走行を可能とするキャタピラやArduinoにはより高速で無線通

信出来る wi-fiシールドが発売されている。またコントローラーを PCからスマ

ートフォンにすることにより操作者も楽になるであろう。

今後は Boe-Botのような小型なロボットもレスキューロボットとしてたくさ

ん研究されていくであろう。

15

Page 19: Arduino によるBoe-Bot制御 - SIRAI's Weblang.sist.chukyo-u.ac.jp/Classes/seminar/Papers/2013/...2013 年度 卒 業 論 文 Arduino によるBoe-Bot制御 指導教員 白井英俊

参考文献 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 日アクセス)

16

Page 20: Arduino によるBoe-Bot制御 - SIRAI's Weblang.sist.chukyo-u.ac.jp/Classes/seminar/Papers/2013/...2013 年度 卒 業 論 文 Arduino によるBoe-Bot制御 指導教員 白井英俊

謝辞 本研究を行うにあたり、白井英俊教授にご指導頂きました。また研究に際しては同期の

神戸、蒲にアドバイスを頂きました。そして、最後まで研究を支えてくれた研究室の吉田、

そして後輩の皆さん。この場を借りてお世話になった方々にお礼を申し上げます。ありが

とうございました。

17

Page 21: Arduino によるBoe-Bot制御 - SIRAI's Weblang.sist.chukyo-u.ac.jp/Classes/seminar/Papers/2013/...2013 年度 卒 業 論 文 Arduino によるBoe-Bot制御 指導教員 白井英俊

付録 【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':

18

Page 22: Arduino によるBoe-Bot制御 - SIRAI's Weblang.sist.chukyo-u.ac.jp/Classes/seminar/Papers/2013/...2013 年度 卒 業 論 文 Arduino によるBoe-Bot制御 指導教員 白井英俊

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;

19

Page 23: Arduino によるBoe-Bot制御 - SIRAI's Weblang.sist.chukyo-u.ac.jp/Classes/seminar/Papers/2013/...2013 年度 卒 業 論 文 Arduino によるBoe-Bot制御 指導教員 白井英俊

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

Page 24: Arduino によるBoe-Bot制御 - SIRAI's Weblang.sist.chukyo-u.ac.jp/Classes/seminar/Papers/2013/...2013 年度 卒 業 論 文 Arduino によるBoe-Bot制御 指導教員 白井英俊

} } 【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 ){

21

Page 25: Arduino によるBoe-Bot制御 - SIRAI's Weblang.sist.chukyo-u.ac.jp/Classes/seminar/Papers/2013/...2013 年度 卒 業 論 文 Arduino によるBoe-Bot制御 指導教員 白井英俊

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

Page 26: Arduino によるBoe-Bot制御 - SIRAI's Weblang.sist.chukyo-u.ac.jp/Classes/seminar/Papers/2013/...2013 年度 卒 業 論 文 Arduino によるBoe-Bot制御 指導教員 白井英俊

//撮影停止(一旦止めないと新しい画像は撮影されない) 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

Page 27: Arduino によるBoe-Bot制御 - SIRAI's Weblang.sist.chukyo-u.ac.jp/Classes/seminar/Papers/2013/...2013 年度 卒 業 論 文 Arduino によるBoe-Bot制御 指導教員 白井英俊

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

Page 28: Arduino によるBoe-Bot制御 - SIRAI's Weblang.sist.chukyo-u.ac.jp/Classes/seminar/Papers/2013/...2013 年度 卒 業 論 文 Arduino によるBoe-Bot制御 指導教員 白井英俊

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

Page 29: Arduino によるBoe-Bot制御 - SIRAI's Weblang.sist.chukyo-u.ac.jp/Classes/seminar/Papers/2013/...2013 年度 卒 業 論 文 Arduino によるBoe-Bot制御 指導教員 白井英俊

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

Page 30: Arduino によるBoe-Bot制御 - SIRAI's Weblang.sist.chukyo-u.ac.jp/Classes/seminar/Papers/2013/...2013 年度 卒 業 論 文 Arduino によるBoe-Bot制御 指導教員 白井英俊

//少し待つ 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 );

27

Page 31: Arduino によるBoe-Bot制御 - SIRAI's Weblang.sist.chukyo-u.ac.jp/Classes/seminar/Papers/2013/...2013 年度 卒 業 論 文 Arduino によるBoe-Bot制御 指導教員 白井英俊

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

Page 32: Arduino によるBoe-Bot制御 - SIRAI's Weblang.sist.chukyo-u.ac.jp/Classes/seminar/Papers/2013/...2013 年度 卒 業 論 文 Arduino によるBoe-Bot制御 指導教員 白井英俊

println( "Waiting for data ..." ); } }

29