目次 #contents *課題 [#tf9e242a] 今回の課題は[[課題3 >2017a/Mission3]]を参照。課題2で使ったライントレース用のコースを使い缶積み上げと缶を運ぶことを行った。 *ロボット [#i593e6bf] **缶をつかむ部分 [#se7af7a4] #ref(./ro3.jpg,50%,) 缶をつかむ部分は、モーターを使って開閉させた。缶が落ちないようにするために、タイヤに輪ゴムをつけた。最初、輪ゴムをつけずに缶を持ち上げたところ缶は落ちてしまったが、輪ゴムをつけたところ持ち上げても缶が落ちなかった。些細な違いでも大きな違いが出て驚いた。また、缶が真ん中に来るようにブロックを使った。 **缶をあげる部分 [#e130524a] #ref(./ro2.jpg,50%,) 缶をあげるところは、モーターを使って動力を与え、ギアを使い動力を伝えることで上下させた。ギアをかませないと重さで動かないためギアをかませる重要性を感じた。小さいギアをモーターのところに使い大きいギアをかませることで上げすぎを防ぐ役割もしている。 **全体 [#a985328b] #ref(./ro1.jpg,50%,) 全体としては上の写真のようになった。全体的には良かったが重さによってタイヤが回りにくくなっていた。自分たちは、モーターの出力を上げたがその分電池の消費量も多くなってしまった。反省としては、出力を上げるのではなくギアをかませることで出力を上げずに動力をうまく伝えることができれば良かった。 *マスター側プログラム [#nb492bf3] **マスター側 [#xaacd2e0] // マスター側(タイヤ、センサー) /* B -> 右のモーター C -> 左のモーター S1 -> 光センサー S2 -> 超音波センサー */ **定義 [#j5c85497] #define CONN 1 // スレーブの接続番号 #define SPEED 40 #define OROSE 11 // アームを降ろさせる #define TOJIRO 12 // 缶を掴ませる #define AGERO 13 // アームを上げさせる #define HIRAKE 14 // 缶を離させる #define TUM 15 // 缶の上まで下ろす #define RYO 16 // 完了 #define SIRO0 47 // 白のしきい値 #define SIRO1 54 #define KURO0 42 // 黒のしきい値 #define KURO1 37 **ライントレース [#zec7eb5a] sub line_l() //左側のライントレース { SetSensorLight(S1); if (SENSOR_1 > SIRO1){ Off(OUT_B); OnFwd(OUT_C,SPEED); } else if (SENSOR_1 > SIRO0){ OnFwd(OUT_B,20); OnFwd(OUT_C,SPEED); } else if (SENSOR_1 > KURO0){ OnFwd(OUT_BC,SPEED); } else if (SENSOR_1 > KURO1){ OnFwd(OUT_B,SPEED); OnFwd(OUT_C,20); } else { OnFwd(OUT_B,SPEED); Off(OUT_C); } } sub line_r() // 右側のライントレース { SetSensorLight(S1); if (SENSOR_1 > SIRO1){ Off(OUT_C); OnFwd(OUT_B,SPEED); } else if (SENSOR_1 > SIRO0){ OnFwd(OUT_C,20); OnFwd(OUT_B,SPEED); } else if (SENSOR_1 > KURO0){ OnFwd(OUT_BC,SPEED); } else if (SENSOR_1 > KURO1){ OnFwd(OUT_C,SPEED); OnFwd(OUT_B,20); } else { OnFwd(OUT_C,SPEED); Off(OUT_B); } } **アームの動作 [#xfae4857] sub orose(int t) // アームを下ろす { int msg; SendRemoteNumber(CONN,MAILBOX1,OROSE); Wait(t); } sub hirake(int t) // アームを開く { int msg; SendRemoteNumber(CONN,MAILBOX1,HIRAKE); Wait(t); } sub tojiro(int t) // 缶をつかむ { int msg; SendRemoteNumber(CONN,MAILBOX1,TOJIRO); Wait(t); } sub agero(int t) // アームを上げる { int msg; SendRemoteNumber(CONN,MAILBOX1,AGERO); Wait(t); } sub tum(int t) // 二段目まで下ろす { int msg; SendRemoteNumber(CONN,MAILBOX1,TUM); Wait(t); } **一連の動作 [#l04525a2] sub iti() // Eの缶と一番上の缶 { SetSensorLight(S1); SetSensorLowspeed(S2); until (BluetoothStatus(CONN) == NO_ERR); hirake(1000); while(SensorUS(S2) > 10){ 缶とロボットの距離が10cmになるまで進む OnFwdSync(OUT_BC,SPEED,0); } Off(OUT_BC); tojiro(1000); long t0 = CurrentTick(); //時間を導入(導入下時を0とする) while(CurrentTick()-t0 < 7000){ //時間内(7秒)にだけライントレース line_l(); } OnFwd(OUT_B,-40); OnFwd(OUT_C,40); Wait(700); t0 = CurrentTick(); //このとき時間を0にする while(CurrentTick()-t0 < 2500){ //時間内(2,5秒)だけライントレース line_r(); } t0 = CurrentTick(); //このとき時間を0にする while(CurrentTick()-t0 < 1000){ //時間内(1秒)だけ前に進む OnFwdSync(OUT_BC,SPEED,0); } Off(OUT_BC); Wait(500); RotateMotor(OUT_BC,-SPEED,65); Wait(100); agero(3000); while(SensorUS(S2) > 15){ //缶とロボットの距離が15cmになるまで進む OnFwdSync(OUT_BC,SPEED,0); } Off(OUT_BC); tum(3000); Wait(500); while(SensorUS(S2) > 10){ //缶とロボットの距離が10cmになるまで進む OnFwdSync(OUT_BC,SPEED,0); } Off(OUT_BC); tojiro(1000); OnFwd(OUT_BC,60); Wait(500); Off(OUT_BC); RotateMotor(OUT_C,SPEED,250); Wait(1000); Off(OUT_BC); OnFwd(OUT_BC,40); Wait(1000); Off(OUT_BC); hirake(1000); } **task main [#a76eeaff] task main(); { iti(); } *スレーブ側プログラム [#l2192d2e] **スレーブ側 [#j1b9fd7b] // スレーブ側(アーム) /* A -> アームの開閉のモーター OnFwdで開く B -> アームの上下のモーター OnFwdで下ろす */ [#a675094a] **定義 [#a7e53552] #define CONN 0 // マスターの接続番号 #define SPEED 40 #define OROSE 11 // アームを降ろさせる角度 #define TOJIRO 12 // 缶を掴ませる角度 #define AGERO 13 // アームを上げさせる角度 #define HIRAKE 14 // 缶を離させる角度 #define TUM 15 // 缶の上まで下ろす角度 #define RYO 16 // 完了の時の角度 task main() **一連の動作 [#t51d830a] sub arm() { until (BluetoothStatus(CONN) == NO_ERR); while(true){ int msg; ReceiveRemoteNumber(MAILBOX1,true,msg); if (msg == OROSE){ // アームを下ろす Wait(100); RotateMotor(OUT_B,SPEED,360); } if (msg == TOJIRO){ // 缶をつかむ Wait(100); RotateMotor(OUT_A,-SPEED,50); } if (msg == AGERO){ // アームを上げる Wait(100); RotateMotor(OUT_B,-60,600); } if (msg == HIRAKE){ // 缶をはなす Wait(100); RotateMotor(OUT_A,SPEED,50); } if (msg == TUM){ // 二段目まで下ろす Wait(100); RotateMotor(OUT_B,SPEED,120); Wait(100); RotateMotor(OUT_A,SPEED,50); Wait(100); RotateMotor(OUT_B,SPEED,360); } } } **task main [#j45650ca] task main() { arm(); } *プログラム [#lee19fdf] 今回は、Bluetooth機能を使い、マスター側がロボット全体を動かし、スレーブ側でアームを動かした。缶の上げ下げは角度を使うことで電池の出力がおちても同じように動けるようにした。 **その他の缶のプログラム(未完成) [#z1417260] 本番に間に合わず未完成となってしまったプログラムである。 未完成のため数値は参考にならないがどのような流れで動かそうとしていたのかを見てほしい。 一番目と同様に2缶ごとゴールに運んでいく。一番目の後Fを取りTの缶の上に乗せゴールまで運ぶ。 次にGを取りHの缶の上に乗せゴールまで運ぶ。最後に中身の入っている缶を取りに行く。このとき、中身の入った缶が1,2,3のどこに置いてあってもいいように1,2,3の順番をまっすぐ動き、超音波センサーをつかって缶の場所を把握し取りに行く。その後最後に残った下の急カーブにある缶を上にのせゴールまで運ぶ。以上の流れでプログラムを作ったが調整途中で未完成のままになってしまった。 *結果・反省 [#d161449b] 練習では缶を積むことができたりできなかったりと安定せず、本番では失敗してしまった。ロボットを改良するか、プログラムを正確にしないと安定しないがそれができなかった。先生がいっていたように期限までに確かなモノを造ることの難しさと逆算して間に合わせることを学んだ。このゼミを通して、発想力だけでなく、課題などを期限までに完璧に仕上げるための力が養われたので良かった。