Distance sensor bug fix; speed variable implementation
parent
b75bcda25a
commit
6560ce3cac
113
src/main.llsp3
113
src/main.llsp3
|
|
@ -2,7 +2,6 @@ from hub import port, motion_sensor as ms
|
||||||
import motor_pair as mp
|
import motor_pair as mp
|
||||||
import distance_sensor as ds
|
import distance_sensor as ds
|
||||||
import color_sensor as cs
|
import color_sensor as cs
|
||||||
import color
|
|
||||||
import sys
|
import sys
|
||||||
import runloop
|
import runloop
|
||||||
import time
|
import time
|
||||||
|
|
@ -21,12 +20,12 @@ import time
|
||||||
|
|
||||||
# Productive Code ###########################################################################
|
# Productive Code ###########################################################################
|
||||||
|
|
||||||
async def turn_right(angle=90):
|
async def turn_right(angle=85):
|
||||||
mp.move_tank(mp.PAIR_1, 200, -200)
|
mp.move_tank(mp.PAIR_1, 200, -200)
|
||||||
await runloop.sleep_ms(int(angle * 7))# 6 ms per degree → tune this!
|
await runloop.sleep_ms(int(angle * 7))# 6 ms per degree → tune this!
|
||||||
mp.stop(mp.PAIR_1)
|
mp.stop(mp.PAIR_1)
|
||||||
|
|
||||||
async def turn_left(angle=90):
|
async def turn_left(angle=85):
|
||||||
mp.move_tank(mp.PAIR_1, -200, 200)
|
mp.move_tank(mp.PAIR_1, -200, 200)
|
||||||
await runloop.sleep_ms(int(angle * 7))
|
await runloop.sleep_ms(int(angle * 7))
|
||||||
mp.stop(mp.PAIR_1)
|
mp.stop(mp.PAIR_1)
|
||||||
|
|
@ -38,106 +37,116 @@ async def drive_cm(cm, speed=200):
|
||||||
await runloop.sleep_ms(cm * 70)
|
await runloop.sleep_ms(cm * 70)
|
||||||
mp.stop(mp.PAIR_1)
|
mp.stop(mp.PAIR_1)
|
||||||
|
|
||||||
async def avoid_obstacle():
|
async def avoid_obstacle(speed=100):
|
||||||
mp.stop(mp.PAIR_1)
|
mp.stop(mp.PAIR_1)
|
||||||
await runloop.sleep_ms(500)
|
await runloop.sleep_ms(500)
|
||||||
mp.move_tank(mp.PAIR_1, -100, -100)
|
mp.move_tank(mp.PAIR_1, -speed, -speed)
|
||||||
|
|
||||||
await turn_right(90)
|
|
||||||
await drive_cm(20)
|
|
||||||
await turn_left(90)
|
|
||||||
await drive_cm(40)
|
|
||||||
await turn_left(90)
|
|
||||||
await drive_cm(20)
|
|
||||||
await turn_right(90)
|
|
||||||
|
|
||||||
|
await turn_right(85)
|
||||||
|
await drive_cm(15)
|
||||||
|
await turn_left(85)
|
||||||
|
await drive_cm(30)
|
||||||
|
await turn_left(85)
|
||||||
|
await drive_cm(15)
|
||||||
|
await turn_right(85)
|
||||||
|
old = 0
|
||||||
async def move_on_color():
|
async def move_on_color():
|
||||||
won = False
|
won = False
|
||||||
old = time.ticks_ms
|
old = time.ticks_ms()
|
||||||
|
speed = 100
|
||||||
|
|
||||||
while not won:
|
while not won:
|
||||||
|
|
||||||
# Farbcodes lesen
|
# Farbcodes lesen
|
||||||
left_color = cs.color(port.C)
|
left_color = cs.color(port.B)
|
||||||
right_color = cs.color(port.E)
|
right_color = cs.color(port.F)
|
||||||
gradient = ms.tilt_angles()[2]
|
|
||||||
|
gradient = ms.tilt_angles()[2]
|
||||||
# Farbcodes
|
# Farbcodes
|
||||||
BLACK = 0
|
BLACK = 0
|
||||||
GREEN = 6
|
GREEN = 6
|
||||||
WHITE = 10
|
WHITE = 10
|
||||||
RED = 9
|
RED = 9
|
||||||
strait = False
|
straight = False
|
||||||
|
turn_way_if_lost_right = True
|
||||||
# Distanzsensor
|
# Distanzsensor
|
||||||
ds_front = ds.distance(port.F)
|
ds_front = ds.distance(port.D)
|
||||||
|
|
||||||
|
if gradient < -150:
|
||||||
|
speed = 400
|
||||||
|
|
||||||
|
elif gradient > 50:
|
||||||
|
speed = 50
|
||||||
|
else:
|
||||||
|
speed = 100
|
||||||
|
|
||||||
# --- LOGIK NUR MIT FARBEN ---
|
# --- LOGIK NUR MIT FARBEN ---
|
||||||
# Finish line logik
|
# Finish line logik
|
||||||
if left_color == RED or right_color == RED:
|
if left_color == RED or right_color == RED:
|
||||||
won = True
|
won = True
|
||||||
break
|
break
|
||||||
|
|
||||||
elif ds_front < 75:
|
elif ds_front < 75 and ds_front > -1:
|
||||||
await avoid_obstacle()
|
await avoid_obstacle()
|
||||||
|
|
||||||
# Beide Sensoren sehen Grün (z.B. Kreuzung / Markierung)
|
# Beide Sensoren sehen Grün (z.B. Kreuzung / Markierung)
|
||||||
elif left_color == GREEN and right_color == GREEN:
|
elif left_color == GREEN and right_color == GREEN:
|
||||||
mp.move_tank(mp.PAIR_1, -100, 100)
|
mp.move_tank(mp.PAIR_1, -speed, speed)
|
||||||
time.sleep_ms(2300)
|
time.sleep_ms(2300)
|
||||||
|
|
||||||
# Linker Sensor sieht Grün → Linksabbiegen
|
# Linker Sensor sieht Grün → Linksabbiegen
|
||||||
elif left_color == GREEN and right_color != GREEN:
|
elif left_color == GREEN and right_color != GREEN:
|
||||||
mp.move_tank(mp.PAIR_1, 100, 100)
|
mp.move_tank(mp.PAIR_1, speed, speed)
|
||||||
time.sleep_ms(700)
|
time.sleep_ms(700)
|
||||||
mp.move_tank(mp.PAIR_1, -100, 100)
|
mp.move_tank(mp.PAIR_1, -speed, speed)
|
||||||
time.sleep_ms(1050)
|
time.sleep_ms(1050)
|
||||||
mp.move_tank(mp.PAIR_1, 100, 100)
|
mp.move_tank(mp.PAIR_1, speed, speed)
|
||||||
time.sleep_ms(300)
|
time.sleep_ms(300)
|
||||||
|
|
||||||
# Rechter Sensor sieht Grün → Rechtsabbiegen
|
# Rechter Sensor sieht Grün → Rechtsabbiegen
|
||||||
elif right_color == GREEN and left_color != GREEN:
|
elif right_color == GREEN and left_color != GREEN:
|
||||||
mp.move_tank(mp.PAIR_1, 100, 100)
|
mp.move_tank(mp.PAIR_1, speed, speed)
|
||||||
time.sleep_ms(700)
|
time.sleep_ms(700)
|
||||||
mp.move_tank(mp.PAIR_1, 100, -100)
|
mp.move_tank(mp.PAIR_1, speed, -speed)
|
||||||
time.sleep_ms(1050)
|
time.sleep_ms(1050)
|
||||||
mp.move_tank(mp.PAIR_1, 100, 100)
|
mp.move_tank(mp.PAIR_1, speed, speed)
|
||||||
time.sleep_ms(300)
|
time.sleep_ms(300)
|
||||||
|
|
||||||
elif right_color == BLACK and left_color == BLACK:
|
elif right_color == BLACK or left_color == BLACK:
|
||||||
mp.move_tank(mp.PAIR_1, 100, 100)
|
if right_color == BLACK and left_color == BLACK:
|
||||||
|
mp.move_tank(mp.PAIR_1, speed, speed)
|
||||||
# Linker Sensor ist Schwarz, rechter Weiß → sanft nach links
|
# Linker Sensor ist Schwarz, rechter Weiß → sanft nach links
|
||||||
elif left_color == BLACK and right_color == WHITE:
|
elif left_color == BLACK and right_color == WHITE:
|
||||||
mp.move_tank(mp.PAIR_1, -50, 50)
|
mp.move_tank(mp.PAIR_1, speed-100, speed)
|
||||||
|
|
||||||
# Rechter Schwarz, linker Weiß → sanft nach rechts
|
# Rechter Schwarz, linker Weiß → sanft nach rechts
|
||||||
elif right_color == BLACK and left_color == WHITE:
|
elif right_color == BLACK and left_color == WHITE:
|
||||||
mp.move_tank(mp.PAIR_1, 50, -50)
|
mp.move_tank(mp.PAIR_1, speed, speed-100)
|
||||||
|
|
||||||
# Beide Weiß → geradeaus (vermutlich neben der Linie)
|
# Beide Weiß → geradeaus (vermutlich neben der Linie)
|
||||||
elif left_color == WHITE and right_color == WHITE:
|
elif left_color == WHITE and right_color == WHITE:
|
||||||
strait = True
|
straight = True
|
||||||
mp.move(mp.PAIR_1, 0, velocity=150)
|
mp.move_tank(mp.PAIR_1, speed, speed)
|
||||||
|
runloop.sleep_ms(50)
|
||||||
|
|
||||||
# TODO: ---- Weiß auf beiden Seiten = Linie verloren ----
|
if straight:
|
||||||
# wenn links == weiß UND rechts == weiß:
|
if time.ticks_diff(time.ticks_ms(), old) > 2750:
|
||||||
# langsam drehen bis schwarz gefunden
|
old = time.ticks_ms()
|
||||||
|
if turn_way_if_lost_right:
|
||||||
|
mp.move_tank(mp.PAIR_1, speed, 0)
|
||||||
|
await runloop.sleep_ms(200)
|
||||||
|
turn_way_if_lost_right = not turn_way_if_lost_right
|
||||||
|
else:
|
||||||
|
mp.move_tank(mp.PAIR_1, 0, speed)
|
||||||
|
await runloop.sleep_ms(200)
|
||||||
|
turn_way_if_lost_right = not turn_way_if_lost_right
|
||||||
|
|
||||||
elif gradient < -150:
|
|
||||||
mp.move(mp.PAIR_1, 0, velocity=350)
|
|
||||||
|
|
||||||
elif gradient > 50:
|
|
||||||
mp.move(mp.PAIR_1, 0, velocity=100)
|
|
||||||
|
|
||||||
if strait:
|
|
||||||
if time.ticks_diff(time.ticks_ms(), old) > 2000:
|
|
||||||
old = time.ticks_ms
|
|
||||||
mp.move_tank(mp.PAIR_1, 100, 50)
|
|
||||||
else:
|
else:
|
||||||
old = time.ticks_ms
|
old = time.ticks_ms()
|
||||||
|
|
||||||
async def main():
|
async def main():
|
||||||
mp.pair(mp.PAIR_1, port.A, port.D)
|
mp.pair(mp.PAIR_1, port.A, port.E)
|
||||||
await move_on_color()
|
await move_on_color()
|
||||||
|
|
||||||
sys.exit()
|
sys.exit()
|
||||||
|
|
||||||
runloop.run(main())
|
runloop.run(main())
|
||||||
Loading…
Reference in New Issue