#contents *課題3:空き缶運搬ロボット [#q6adc595] :フィールドの説明 | --フィールドは課題2で使用した紙を使用する。 --2種類の空き缶(Aタイプ,Bタイプ)をそれぞれ3個づつ用意し、円XにABA、円YにBABとなるように3段づつ積み上げる。 :基本的なルール | --AまたはA'からスタートする。 --Aタイプの空き缶を円Y内に、Bタイプの空き缶を円X内に運ぶ。 --開始の合図から5秒以内にスタートボタンを押す作業を完了すること。 (詳しい説明はhttp://yakushi.shinshu-u.ac.jp/robotics/?2018a%2FMission3を参照下さい) *ロボット本体 [#r9b64158] **各部の説明 [#a24d6b77] &ref(2018a/Member/montbell/Mission3/IMG_20180809_205843-934x1663.jpg,20%,Mission3 ); &ref(2018a/Member/montbell/Mission3/IMG_20180809_210114-934x1663.jpg,20%,Mission3 ); &ref(2018a/Member/montbell/Mission3/IMG_20180809_210325-934x1663.jpg,20%,Mission3 ); :アーム(写真オレンジ色の箇所)| 缶をつかむ機構。両側の缶を一度に掴むことが出来る。 :エレベータ(写真緑色の箇所)| マジックアームを上下に動かす機構。 :移動ユニット(写真紫色の箇所)| 駆体そのものを移動させるためのモータ。その場での回転も出来る。 :カラーセンサー(2枚目の写真,EV3本体の右) 地面の色を識別する. **アーム [#p9b1f9bd] アームはマジックハンド状で,ミディアムモーターを使用し4つの歯車を回転させ,両端にある大きめの歯車にアーム中央部を固定することでアームを伸縮させる.それと同時にアームの両端にあるハンド部分が閉じることで缶を掴むことが出来る.またハンド部分にゴムが取り付けてあり缶が滑り落ちないようになっている. **エレベータ [#ac97290b] エレベータは缶をアームユニットごと昇降させるための機構である.2つの縦に設置されたキャタピラとそれを回転させるためのモーター,歯車から成り立っている. **移動ユニット [#md5f6037] ラージモーターのついたタイヤが2つ並んでおり,別々に動かせる. **カラーセンサー [#iced5f1e] 地面の色を判別するセンサー。これを使用し円XとYを結ぶ黒い線を認識させる。 *プログラム [#pcc09d09] #!/usr/bin/env python3 from ev3dev.ev3 import * from time import sleep mA = MediumMotor('outA') mH = LargeMotor('outB') mR = LargeMotor('outC') mL = LargeMotor('outD') cs = ColorSensor('in1') cs.mode = 'COL-REFLECT' mA.reset() mH.reset() mR.reset() mL.reset() def move_position(R,L,s): mR.run_to_rel_pos(position_sp=R, speed_sp=50, stop_action='brake') mL.run_to_rel_pos(position_sp=L, speed_sp=50, stop_action='brake') sleep(s) def move_arm(x,s): mA.run_to_rel_pos(position_sp=x, speed_sp=100, stop_action='brake') sleep(s) def move_high(x,s): mH.run_to_rel_pos(position_sp=x, speed_sp=130, stop_action='brake') sleep(s) def move_straight(): t0 = time.time() while time.time() - t0 < 0.3: mR.run_to_rel_pos(position_sp=20, speed_sp=50, stop_action='brake') mL.run_to_rel_pos(position_sp=20, speed_sp=50, stop_action='brake') if cs.value() >= 75: t0 = time.time() move_position(920,920,18) move_position(180,-180,8) move_position(360,360,10) move_straight() move_arm(700,6) move_position(380,-380,11) move_arm(-300,6) move_high(1500,15) move_arm(300,6) move_high(800,10) move_position(-200,200,8) move_high(-2300,16) move_position(-150,135,8) move_arm(-300,6) mA.reset() mH.reset() mR.reset() mL.reset() *工夫した点 [#leeb548c]