[[2017a/Member]] 目次 #contents *課題について [#v8d0fe90] フィールドは課題2で使用した紙を使用する~ 図のピンク色の場所に350mlの空き缶を置く~ 図のライトブルーの円のいずれか一箇所に中身の入った350mlの缶を置く~ 中身の入った缶には紙をはったり図などを描いてもよい~ #ref(./2017a-mission3.png,50%,コース) *ロボットについて [#af22b6b0] **缶を持ち上げる部分 [#xa64165e] もともとはモーターを固定していたが、アームが重すぎてすぐに下がってしまい、しかも重心が前に来すぎてロボットが前に傾いてしまってちゃんと動かすことができなかったので、先生のアドバイスを利用して、ギアを中心に固定し、シーソーのようにモーターとつかむ部分を取り付けて動かした。~ 改良前 #ref(./robot3.jpg,7%,コース) #ref(./robot4.jpg,7%,コース) 改良後 #ref(./robot5.jpg,20%,コース) #ref(./robot6.jpg,20%,コース) **缶をつかむ部分 [#l19977f9] 三角形の部分は、缶がずれたときに直すためで、缶を持った時に滑って落ちてしまったので、ゴムをつけて滑りにくくした。 #ref(./robot7.jpg,20%,コース) *プログラムについて [#ie00afdc] Aをスタートしてライントレースをし、Eの缶をつかんで再びライントレースをしてFの手前にある缶の上に積んで、ゴールに運ぶプログラム。アームの上げ下げは角度を使うことで電池残量に関係なく動かせるようにした。 **マスター側 [#hd642910] 足回りと各種センサーを動かしている / マスター側(タイヤ、センサー) /* B -> 右のモーター C -> 左のモーター S1 -> 光センサー S2 -> 超音波センサー */ ***定義 [#l6a45204] #define CONN 1 // スレーブの接続番号~ #define SPEED 50~ #define OROSE 11 // アームを降ろさせる~ #define TOJIRO 12 // 缶を掴ませる~ #define AGERO 13 // アームを上げさせる~ #define HIRAKE 14 // 缶を離させる~ #define TUM 15 // 缶の上まで下ろす~ #define RYO 16 // 完了~ #define SIRO 54 // 白のしきい値~ #define KURO 42 // 黒のしきい値~ #define INBOX MAILBOX1 // 送信用のメールボックス~ #define OUTBOX MAILBOX2 // 受信用のメールボックス~ ***ライントレース [#g55c3e2b] 線の左側でライントレース 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); } } ***アーム [#ye26c544] 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); } ***一連の動き [#sba44010] 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); } ***メインタスク [#h65e3b60] task main(); { iti(); } **スレーブ側 [#h11b3ea1] アームを動かしている // スレーブ側(アーム) /* A -> アームの開閉のモーター OnFwdで開く B -> アームの上下のモーター OnFwdで下ろす */ ***定義 [#rc9ab37e] #define CONN 0 // マスターの接続番号 #define SPEED 40 #define OROSE 11 // アームを降ろさせる角度 #define TOJIRO 12 // 缶を掴ませる角度 #define AGERO 13 // アームを上げさせる角度 #define HIRAKE 14 // 缶を離させる角度 #define TUM 15 // 缶の上まで下ろす角度 #define RYO 16 // 完了の時の角度 ***一連の動き [#kcd4c9b1] 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); } } } ***メインタスク [#b626697a] task main() { arm(); } **本番では使えなかったプログラム [#ta092571] 調整が間に合わなかったりして本番では使えなかったプログラム。 sub ni() // FとTの缶 { SetSensorLight(S1); SetSensorLowspeed(S2); OnRev(OUT_BC,SPEED); Wait(1000); OnFwd(OUT_B,-SPEED); OnFwd(OUT_C,SPEED); Wait(500); until (SensorUS(S2) < 40) Off(OUT_BC); orose(1000); hirake(1000); OnFwdSync(OUT_BC,SPEED,0); until (SensorUS(S2) < 20); tojiro(900); agero(1300); while(SENSOR_1 > SIRO0){ OnFwd(OUT_BC,SPEED); } while(SensorUS(S2) > 20){ line_l(); } Off(OUT_BC); tum(1000); tojiro(1000); OnFwd(OUT_B,SPEED); Off(OUT_C); Wait(100); hirake(1000); agero(1300); } *まとめ [#m47456cf]