176 lines
5.3 KiB
Plaintext
176 lines
5.3 KiB
Plaintext
from hub import port, motion_sensor as ms
|
|
import motor_pair as mp
|
|
import distance_sensor as ds
|
|
import color_sensor as cs
|
|
import sys
|
|
import runloop
|
|
import time
|
|
|
|
BLACK = 0
|
|
GREEN = 6
|
|
WHITE = 10
|
|
RED = 9
|
|
|
|
async def turn_right(angle=85):
|
|
mp.move_tank(mp.PAIR_1, 200, -200)
|
|
await runloop.sleep_ms(int(angle * 7))# 6 ms per degree → tune this!
|
|
mp.stop(mp.PAIR_1)
|
|
|
|
async def turn_left(angle=85):
|
|
mp.move_tank(mp.PAIR_1, -200, 200)
|
|
await runloop.sleep_ms(int(angle * 7))
|
|
mp.stop(mp.PAIR_1)
|
|
|
|
# drive forward X centimeters
|
|
async def drive_cm(cm, speed=200):
|
|
# convert cm → ms (you must tune this constant!)
|
|
mp.move_tank(mp.PAIR_1, -speed, -speed)
|
|
await runloop.sleep_ms(cm * 70)
|
|
mp.stop(mp.PAIR_1)
|
|
|
|
async def avoid_obstacle(speed=100):
|
|
mp.stop(mp.PAIR_1)
|
|
await runloop.sleep_ms(500)
|
|
mp.move_tank(mp.PAIR_1, -speed, -speed)
|
|
|
|
await turn_right(85)
|
|
await drive_cm(15)
|
|
await turn_left(85)
|
|
await drive_cm(38)
|
|
await turn_left(85)
|
|
while cs.reflection(port.C) > 25:
|
|
mp.move_tank(mp.PAIR_1, -speed, -speed)
|
|
while cs.color(port.B) != BLACK:
|
|
mp.move_tank(mp.PAIR_1, 10, -110)
|
|
|
|
async def move_on_color():
|
|
won = False
|
|
speed = 100
|
|
saw_green_left = False
|
|
saw_green_right = False
|
|
last_seen_black = ""
|
|
|
|
old = time.ticks_ms()
|
|
while not won:
|
|
|
|
|
|
# Farbcodes lesen
|
|
left_color = cs.color(port.B)
|
|
right_color = cs.color(port.F)
|
|
front_sens = cs.reflection(port.C)
|
|
|
|
gradient = ms.tilt_angles()[2]
|
|
# Farbcodes
|
|
BLACK = 0
|
|
GREEN = 6
|
|
WHITE = 10
|
|
RED = 9
|
|
|
|
# Distanzsensor
|
|
ds_front = ds.distance(port.D)
|
|
|
|
if gradient < -120:
|
|
speed = -120
|
|
elif gradient > 50:
|
|
speed = -50
|
|
else:
|
|
speed = -100
|
|
|
|
# --- LOGIK NUR MIT FARBEN ---
|
|
if left_color == RED or right_color == RED:
|
|
won = True
|
|
|
|
|
|
elif ds_front < 75 and ds_front > -1:
|
|
await avoid_obstacle()
|
|
|
|
# Linker Sensor sieht Grün → Linksabbiegen
|
|
elif left_color == GREEN and right_color != GREEN:
|
|
saw_green_left = True
|
|
old = time.ticks_ms()
|
|
|
|
|
|
elif right_color == GREEN and left_color != GREEN:
|
|
saw_green_right = True
|
|
old = time.ticks_ms()
|
|
|
|
# Beide Sensoren sehen Grün (z.B. Kreuzung / Markierung)
|
|
elif left_color == GREEN and right_color == GREEN:
|
|
saw_green_right = False
|
|
saw_green_left = False
|
|
mp.move_tank(mp.PAIR_1, -speed, speed)
|
|
time.sleep_ms(2300)
|
|
|
|
elif saw_green_left and left_color == BLACK:
|
|
saw_green_left = False
|
|
mp.move_tank(mp.PAIR_1, speed, speed)
|
|
time.sleep_ms(1200)
|
|
mp.move_tank(mp.PAIR_1, speed, -speed)
|
|
time.sleep_ms(1000)
|
|
mp.move_tank(mp.PAIR_1, speed, speed)
|
|
time.sleep_ms(300)
|
|
|
|
# Rechter Sensor sieht Grün → Rechtsabbiegen
|
|
elif saw_green_right and right_color == BLACK:
|
|
saw_green_right = False
|
|
mp.move_tank(mp.PAIR_1, speed, speed)
|
|
time.sleep_ms(1200)
|
|
mp.move_tank(mp.PAIR_1, -speed, speed)
|
|
time.sleep_ms(1000)
|
|
mp.move_tank(mp.PAIR_1, speed, speed)
|
|
time.sleep_ms(300)
|
|
|
|
# Schwarz-Logik
|
|
elif front_sens > 25 and last_seen_black == "left":
|
|
while cs.reflection(port.C) > 25: # front_sensor
|
|
if cs.color(port.B) == BLACK and cs.color(port.F) == WHITE: # left_color
|
|
last_seen_black = "left"
|
|
|
|
if cs.color(port.F) == BLACK and cs.color(port.B) == WHITE: # right_color
|
|
last_seen_black = "right"
|
|
break
|
|
old = time.ticks_ms()
|
|
mp.move_tank(mp.PAIR_1, -125, -20)
|
|
|
|
|
|
elif front_sens > 25 and last_seen_black == "right":
|
|
while cs.reflection(port.C) > 25:
|
|
if cs.color(port.F) == BLACK and cs.color(port.B) == WHITE:
|
|
last_seen_black = "right"
|
|
|
|
if cs.color(port.B) == BLACK and cs.color(port.F) == WHITE:
|
|
last_seen_black = "left"
|
|
break
|
|
old = time.ticks_ms()
|
|
mp.move_tank(mp.PAIR_1, -20, -125)
|
|
|
|
elif right_color == BLACK or left_color == BLACK:
|
|
old = time.ticks_ms()
|
|
if right_color == BLACK and left_color == BLACK:
|
|
mp.move_tank(mp.PAIR_1, speed, speed)
|
|
time.sleep_ms(20)
|
|
|
|
|
|
# Linker Sensor ist Schwarz, rechter Weiß → sanft nach links
|
|
elif left_color == BLACK and right_color == WHITE:
|
|
last_seen_black = "left"
|
|
|
|
# Rechter Schwarz, linker Weiß → sanft nach rechts
|
|
elif right_color == BLACK and left_color == WHITE:
|
|
last_seen_black = "right"
|
|
|
|
# Beide Weiß, Front Schwarz → geradeaus
|
|
elif cs.color(port.B) == WHITE and cs.color(port.F) == WHITE and front_sens < 25:
|
|
if time.ticks_diff(time.ticks_ms(), old) > 1000:
|
|
last_seen_black = ""
|
|
old = time.ticks_ms()
|
|
mp.move_tank(mp.PAIR_1, speed, speed)
|
|
runloop.sleep_ms(50)
|
|
|
|
async def main():
|
|
mp.pair(mp.PAIR_1, port.A, port.E)
|
|
await move_on_color()
|
|
|
|
sys.exit()
|
|
|
|
runloop.run(main()) |