[[2016a/Member]] #contents *内容 [#n9a47e72] 今回の課題はライントレースをすることである。~ 今回自分がたどるルートは地点B→地点R→右折→地点Q→直進→地点Q→直進→地点P→右折→地点S→右折→地点Cです。 #ref(line01.jpg) *ロボットについて [#eef3a4a8] #ref(robot2-1-1.jpg) ロボットの中心がラインの中心に重なるように光センサーの設置位置は中心から左に寄せて設置しました。 #ref(robot2-2-1.jpg) 光センターはラインを判別しやすいように、できる限り地面に近づくように設置しました。~ *プログラム [#o746260a] #!/usr/bin/python # -*- coding: utf-8 -*- import ev3dev.ev3 as ev3 **ロボットを動かすための設定をする。 [#t7a09902] MR = ev3.LargeMotor('outA') #右側のモーターを出力ポートAで制御 ML = ev3.LargeMotor('outB') #左側のモーターを出力ポートBで制御 cs = ev3.ColorSensor('in1') #光センサーのデータを入力ポート1で受信 S = ev3.Sound() **定義する [#pc425198] ロボットを停止させるプログラムを st() のみで表せるように設定する。 def st(): MR.stop() #右側のモーターを停止 ML.stop() #左側のモーターを停止 ライントレースのプログラムは複雑なため、複数回書くと間違える確率が高くなるため、~ line(a) で表すための設定をする。 def line(a): t0 = time.time() while time.time() - t0 < a: if cs.value() > 30: #センサーが感知した光の明るさが30以上の時 MR.run_forever(duty_cycle_sp=-30) ML.run_forever(duty_cycle_sp=20) #車体を右に回転させる t0 = time.time() elif cs.value() >= 10: #光センサーが感知した光の明るさが10以上30以下の時 MR.run_forever(duty_cycle_sp=35) ML.run_forever(duty_cycle_sp=35) #車体を直進させる t0 = time.time() else: MR.run_forever(duty_cycle_sp=20) ML.run_forever(duty_cycle_sp=-30) ロボットが前後左右に動くプログラムを run(r,l,t) で表すための設定する。 def run(r,l,t): MR.run_forever(duty_cycle_sp=r) #右側モーターの出力をrに設定 ML.run_forever(duty_cycle_sp=l) #左側モーターの出力をlに設定 time.sleep(t) #t秒間動き続ける MR.stop() #右側モーターを停止 ML.stop() #左側モーターを停止 ロボットが交差点を右折するためのプログラムを R(b) で表すための設定をする。 def R(b): MR.run_forever(duty_cycle_sp=-30) ML.run_forever(duty_cycle_sp=20) time.sleep(1) MR.stop() ML.stop() MR.run_forever(duty_cycle_sp=30) ML.run_forever(duty_cycle_sp=30) time.sleep(b) MR.stop() ML.stop() **実際に走行するためのプログラム [#fda4688e] line(0.22) S.beep() R(0.75) line(0.245) S.beep() run(-30,20,0.22) run(50,50,0.5) line(0.22) S.beep() run(-30,20,0.22) run(50,50,0.3) line(0.22) S.beep() R(0.75) line(0.22) S.beep() R(0.75) line(0.22) S.beep() run(-30,20,0.22) run(50,50,0.3) run(100,100,1) st() *結果・考察 [#vd19bc09]