Arduinoを使って簡単なロボット体験のツールを作れないかと考えました.とても簡単な移動ロボットです.
Arduinoの簡単な導入説明はArduino入門のページを見てください.
ところでロボットの構成は簡単に,ハード(身体),電子部品(神経),プログラム(頭脳)に分けられると思います.
手っ取り早く作ってしまうには3人で1チームになって制作の分担をすれば良いと思います.
これらの3つ作業ははじめのうちは同時に別々のプロセスで進めることができます.
ただし,最終的に移動ロボットに目的の動作をさせるためには3つの要素がうまく組み合わさらなくては良い動作をさせることができません.
ということで,最終的なアウトプットは3人のチームワーク次第ということになります.
この制作プロセスを利用して,短時間の研修プログラムを作れないかと考えました.
ただし,この考え方は又聞きで千葉工業大学の林原先生がそれぞれの学生に別々のタスクを割り振って専門性を持たせてから一つのロボットを作る授業をやっていると聞いて,同じことができないかと考えたプランであることを書いておきます.
ただし,林原先生の実際の授業内容ややり方などは全く聞いたことが無いので,ここに書いてあることの責任は私自身にあることも記載しておきます.
と,前置きが長くなりましたが,ここで書く内容はあくまで簡単な移動ロボットの制作例です.
誰でも安く移動ロボットが簡単に作れると思いますので試してもらえると幸いです.
製作する移動ロボットは下の写真のロボットです.
黒いラインを検出して追従するライントレースロボット.
センサを作るのが面倒な人はセンサなくてもいいと思います.
最初に見せちゃいますが,ライントレースの様子です.
あまり動作は洗練されていません.
1. ロボット構成用の部品
・ギアボックス
タミヤのモータセット楽しい工作シリーズ No.168 ダブルギヤボックス 左右独立4速タイプ (70168) 636円(2011年11月現在 Amazon)
・タイヤ スポーツタイヤセット 576円(2011年11月現在 Amazon)
・車体 ユニバーサルプレート 454 円(2011年11月現在 Amazon)
・ボールキャスタ 315円(2011年11月現在 Amazon)
2. 電子部品
・Arduino 2840円 スイッチサイエンスで通販で買えます.
・ブレッドボード 250円(スイッチサイエンス) 2枚使います.
・ジャンパワイヤー 10本入り 350円(スイッチサイエンス) 2セット(20本)くらい使います.
・モータドライバ TA7291P(2個入り) 300円(秋月) モータの回転方向制御と出力調整
・フォトインタラプタLBR-127HLD(10個入) 450円(秋月)
・可変抵抗100KΩ10個 200円(秋月) ライントレース用のフォトインタラプタの感度調整用
・単3x2本用電池ボックス 120円(秋月) 単3 2本で3Vを作りモータ動作用の電源
・セラミックコンデンサ 0.01μF 100円(秋月) モーターの動作安定化用(面倒ならいらない)
・単3 4本電池ボックスBEC 26013 473円(Amazon) 単3 4本で6Vを作りArduino動作用
・抵抗セット 今回は数本しか使わないけどのちのちあると便利.使う抵抗だけ買ってもいいですが...面倒です.
今回使う抵抗は,100Ω 3個, 50KΩ 3個 共立エレショップで 10個入りでそれぞれ 40円
カーボン抵抗 1/4W 5% E12系列各10本入 共立エレショップ 3240円
1/4W抵抗全部入り 秋月 5700円 こっちのほうがお得?
・単三電池 6本.アルカリ電池のほうがパワーがあっていいです.充電池でももちろんいけます.
3. 道具
・十字ドライバ
・ニッパー
・ハンダゴテ
・はんだ
材料は大体以上です.一個一個は安いですが合計で部品だけで大体6,600円位します.意外と高い?
教材として用意する場合は,ハンダ付けをモータの電極と電池ボックスだけ先につけてしまえば後はジャンパーピンの配置だけで配線は完了することができます.
1. ギアボックスの組み立て
まず,ギアボックスを作りましょう.購入したギアボックスは4種類のギア比が選べるのですが,電池を載せると意外と全重量が重くなりますのでギア比はちょっと高めの方がいいです.今回は38.2:1で組みましたが,重くてトルク不足な感じがしました.説明書があるので工程の写真は割愛します.小学生の夏休みの工作程度デス.組んでいて懐かしい感じです.
2. 本体の組み立て
本体はいろいろ安く済ませることができそうですが...手抜きのためユニバーサルプレートを活用.ギアボックスの説明書にもユニバーサルプレートへの取り付け方法が書いてあります.若干サイズがあっていないようで,ユニバーサルプレートの両端をニッパーでカットしてからネジ止めします.制作後に取り付けた写真は下記のようになります.
3. タイヤの取付
購入したスポーツタイヤとボールキャスタを取り付けます.組み立ては...当たり前なのでまた割愛.場所はお好きな所に簡単にドライバだけで設置可能です.また,ユニバーサルプレートの前方にはセンサを取り付けるためにL字のユニバーサルプレートセットのパーツを取り付けましょう.ピンで簡単に留められます.
4. ハンダ付け
モータと電池ボックスにはケーブルがついていないのではんだづけしましょう.購入物品で示した単三4本入りの電池ボックスはジャンパーピンで接続できるようになっているのではんだ付けはいりません.モータと単三2本入りの電池ボックスからジャンパーピン接続できるように,購入したジャンパー線を真ん中でカットしてから皮膜を剥いてモータの端子にはんだ付けしましょう.ノイズ防止のためにモータの間には0.01μFのノイズ防止用セラミックコンデンサを取り付けてあります.ここではんだ付けをしてしまえばもうハンダ付けの作業なしにロボットの制作が行えます.
5. 回路制作
ブレッドボードで回路を作成します.下記に回路図を示します.購入部品のパーツ名とあわせてチェックしてみてください.
クリックで拡大します.
モータドライバを接続するブレッドボードとセンサを取り付けるブレッドボードの2つに分けます.モータ,モータドライバ,センサのグランド(GND)は統一されるようにジャンパーで接続してください.接続例を下に示します.
上記の写真は5Vの外部電源の接続はせずにUSBからマイコン駆動用の電源をとっています.また,動作がわかりやすいようにセンサ1つだけでモータの回転が制御できている様子を下記の動画に示します.
指を近づけるとセンサの値が小さくなるのでタイヤの回転数が小さくなります.
上記動作確認用のArduinoのテストプログラムを下記に示します.
Motor Test Program
void setup(){
pinMode(1,OUTPUT); //信号用ピン
pinMode(2,OUTPUT); //信号用ピン
}
void loop(){
//アナログ入力:0番ピンの値を2で割る
int val=analogRead(1)/4; //右側のセンサの読取 最大を256にするため4で割る
//正転させるためにデジタル出力1,2にフラグ立て
digitalWrite(1,HIGH);
digitalWrite(2,LOW);
analogWrite(3,val); //PWMによる出力値:1~255
}
上記動作確認が出来ればほぼできているようなものなので,回路図通り全部つなげてロボット本体に取り付けます.ロボット本体に取り付けた状態の写真を下記に示します.電池ボックスやマイコンボードが本体に支えられていなくて危なっかしいですが,載せるとこのよな感じです.
電池ボックスやマイコンボードが本体に支えられていなくて危なっかしいですが,載せるとこのような感じです.
電池ボックスはガムテープ等で適当に落ちないようにつけてもいいと思います.
6. ライントレース用のプログラム
ライントレースのためのプログラムを作ります.前方に取り付けたセンサは黒線に近づくとセンサからの電圧の返り値が小さくなります.逆に白いところにセンサがあるとセンサからの値が大きくなります.とても単純ですが,右のセンサが黒を感知したらラインよりも左側に寄りすぎているのでロボットが右にステアリングを来るようにプログラムし,逆に左のセンサが黒を感知したら右側に寄りすぎているのでロボットを左にステアリングを来るようにプログラムします.中央のセンサが黒を感知していたらちょうど真ん中に位置しているので前進する指令を送ります.
今回のライントレースロボットは普通の車とは異なり左右のタイヤが独立して動くので左右のステアリングは下記のルールで設定します.
右ステアリング:右のタイヤを逆回転,左のタイヤを正転
左ステアリング:右のタイヤを正転,左のタイヤを逆回転
前進:両方のタイヤを正転させる.
以上の内容をプログラムしたものが下記のプログラミングコードになります.
ライントレースのプログラム
void setup(){
pinMode(1,OUTPUT); //信号用ピン
pinMode(2,OUTPUT); //信号用ピン
pinMode(4,OUTPUT); //信号用ピン
pinMode(5,OUTPUT); //信号用ピン
//Serial.begin(9600);
}
void loop(){
//アナログ入力:0番ピンの値を2で割る
int val1=analogRead(A1); //A1の電圧を読み取る
int val2=analogRead(A2); //A2の電圧を読み取る
int val3=analogRead(A3); //A3の電圧を読み取る
int th1=850; //val*>th* 黒
int th2=800;
int th3=850;
int id1=1,id2=2,id3=3;
//静止/正転/逆転の状態に分けてプログラムする
if(val1<th1 && val2>th2 && val3<th3){ //白・黒・白 前進
//Serial.println(id2, DEC);
//Serial.println(val2, DEC);
digitalWrite(1,HIGH);//左車輪 正転
digitalWrite(2,LOW);
digitalWrite(4,HIGH);//右車輪 正転
digitalWrite(5,LOW);
analogWrite(3,255); //出力値:1~255の間で決定(今回は最大値)
analogWrite(6,255); //出力値:1~255の間で決定
}else if(val1>th1 && val2<th2 && val3<th3){ //黒・白・白 右折
//Serial.println(id1, DEC);
//Serial.println(val1, DEC);
digitalWrite(1,HIGH);//左車輪 正転
digitalWrite(2,LOW);
digitalWrite(4,LOW);//右車輪 逆転
digitalWrite(5,HIGH);
analogWrite(3,255); //左出力値:1~255
analogWrite(6,255); //右出力値:1~255
}else if(val1<th1 && val2<th2 && val3>th3){ //白・白・黒 左折
//Serial.println(id3, DEC);
//Serial.println(val3, DEC);
digitalWrite(1,LOW);//左車輪 逆転
digitalWrite(2,HIGH);
digitalWrite(4,HIGH);//右車輪 正転
digitalWrite(5,LOW);
analogWrite(3,255); //左出力値:1~255
analogWrite(6,255); //右出力値:1~255
}else{ //白・白・白 前進
//Serial.println(id2, DEC);
//Serial.println(val2, DEC);
digitalWrite(1,HIGH);//左車輪 正転
digitalWrite(2,LOW);
digitalWrite(4,HIGH);//右車輪 正転
digitalWrite(5,LOW);
analogWrite(3,255); //出力値:1~255
analogWrite(6,255); //出力値:1~255
}
}
コンパイルとプログラムのアップロードはArduino入門のページを参考にしてください.
上記のプログラムを実行すると最初の方に見せたサンプル動画のように黒い線に追従して動きます.
コースアウトなどをしてしまう場合はセンサの感度を調整する必要がありますので,回路図にある可変抵抗ノ部分をドライバで調整して上手く反応するようにプログラムを修正してみてください.
以上で簡単なライントレースロボットの制作は終了です.
上記の説明では,一連の流れで作らないとロボットが作れないように感じてしまうかもしれませんが,最初に説明したとおり,ロボットのハード制作,電子回路制作,プログラムの3人に分けて同時に課題を進行させることが出来ると思います.ハードウェア制作は買ってきた工作キットを読みながら製作すれば40分程度で終わると思います.電子回路は,初心者であればブレッドボードの説明からはじめて,各部品の機能の説明のあとに,移動ロボットの回路図を渡し,回路図通りにブレッドボードに回路を作成する課題を与えるだけで...40分はかかると思います.プログラム担当はパソコンに既にArduinoの開発環境を入れている前提で,LEDのサンプルプログラム解説からはじめシリアル通信による情報の送信説明をしてセンサのデバッグが出来るようにしておき,最後に移動ロボットのライントレースのプログラムをコードを与えずにプログラムさせるだけで40分はかかると思います.全員初心者と考えて,1時間各専門のパートで制作を終えてから残りの1時間で組み合わせてライントレースまで行なうことを行えば2時間で移動ロボットの授業が完成...と,うまくいくかわかりませんがそんなことが出来るのではないかと思っています.実際に行う機会があれば後ほど詳細なレポートをしたいと思います.