diff --git a/robots/RAC3_TRUCK/README.md b/robots/RAC3_TRUCK/README.md new file mode 100644 index 0000000..06256a9 --- /dev/null +++ b/robots/RAC3_TRUCK/README.md @@ -0,0 +1,15 @@ +# RAC3 TRUCK + +> Designed by Laurens Valk. +> +> Want a remote controlled truck? Got it! This is one fun cool ride. You can modify the truck to make it go faster by adding gears, and you can add a custom-built trailer so the truck can be used as a transport vehicle. + +The build instructions may be found at the official LEGO MINDSTROMS site [here](https://www.lego.com/cdn/cs/set/assets/blt8d8677b8321b803e/RAC3_TRUCK.pdf) + +Drive RAC3 TRUCK around according to instructions from Channel 1 of the IR Remote Control: + - 2 Top/Up Buttons together: drive forward + - 2 Bottom/Down Buttons together: drive backward + - Top-Left/Red-Up: turn left forward + - Top-Right/Blue-Up: turn right forward + - Bottom-Left/Red-Down: turn left backward + - Bottom-Right/Blue-Down: turn right backward diff --git a/robots/RAC3_TRUCK/rac3_truck.py b/robots/RAC3_TRUCK/rac3_truck.py new file mode 100644 index 0000000..eccd672 --- /dev/null +++ b/robots/RAC3_TRUCK/rac3_truck.py @@ -0,0 +1,151 @@ +#!/usr/bin/env python3 + + +from ev3dev.ev3 import ( + Motor, MediumMotor, LargeMotor, OUTPUT_A, OUTPUT_B, OUTPUT_C, + InfraredSensor, RemoteControl, INPUT_4, + Sound +) + +from time import sleep + + +class Rac3Truck: + def __init__( + self, + left_motor_port: str = OUTPUT_B, right_motor_port: str = OUTPUT_C, + polarity: str = Motor.POLARITY_INVERSED, + steer_motor_port: str = OUTPUT_A, + ir_sensor_port: str = INPUT_4, ir_beacon_channel: int = 1, + fast=False): + self.left_motor = LargeMotor(address=left_motor_port) + self.right_motor = LargeMotor(address=right_motor_port) + + self.steer_motor = MediumMotor(address=steer_motor_port) + + self.left_motor.polarity = self.right_motor.polarity = polarity + + self.ir_sensor = InfraredSensor(address=ir_sensor_port) + self.remote_control = RemoteControl(sensor=self.ir_sensor, + channel=ir_beacon_channel) + + self.speaker = Sound() + + def reset(self): + self.steer_motor.run_timed( + speed_sp=300, + time_sp=1500, + stop_action=Motor.STOP_ACTION_COAST) + self.steer_motor.wait_while(Motor.STATE_RUNNING) + + self.steer_motor.run_to_rel_pos( + speed_sp=500, + position_sp=-120, + stop_action=Motor.STOP_ACTION_HOLD) + self.steer_motor.wait_while(Motor.STATE_RUNNING) + + self.steer_motor.reset() + + def steer_left(self): + if self.steer_motor.position > -65: + self.steer_motor.run_to_abs_pos( + speed_sp=-200, + position_sp=-65, + stop_action=Motor.STOP_ACTION_HOLD) + self.steer_motor.wait_while(Motor.STATE_RUNNING) + + else: + self.steer_motor.stop(stop_action=Motor.STOP_ACTION_HOLD) + + def steer_right(self): + if self.steer_motor.position < 65: + self.steer_motor.run_to_abs_pos( + speed_sp=200, + position_sp=65, + stop_action=Motor.STOP_ACTION_HOLD) + self.steer_motor.wait_while(Motor.STATE_RUNNING) + + else: + self.steer_motor.stop(stop_action=Motor.STOP_ACTION_HOLD) + + def steer_center(self): + if self.steer_motor.position < -7: + self.steer_motor.run_to_abs_pos( + speed_sp=200, + position_sp=4, + stop_action=Motor.STOP_ACTION_HOLD) + self.steer_motor.wait_while(Motor.STATE_RUNNING) + + elif self.steer_motor.position > 7: + self.steer_motor.run_to_abs_pos( + speed_sp=-200, + position_sp=-4, + stop_action=Motor.STOP_ACTION_HOLD) + self.steer_motor.wait_while(Motor.STATE_RUNNING) + + self.steer_motor.stop(stop_action=Motor.STOP_ACTION_HOLD) + + sleep(0.1) + + def drive_by_ir_beacon(self): + # forward + if self.remote_control.red_up and self.remote_control.blue_up: + self.left_motor.run_forever(speed_sp=800) + self.right_motor.run_forever(speed_sp=800) + + self.steer_center() + + # backward + elif self.remote_control.red_down and self.remote_control.blue_down: + self.left_motor.run_forever(speed_sp=-800) + self.right_motor.run_forever(speed_sp=-800) + + self.steer_center() + + # turn left forward + elif self.remote_control.red_up: + self.left_motor.run_forever(speed_sp=600) + self.right_motor.run_forever(speed_sp=1000) + + self.steer_left() + + # turn right forward + elif self.remote_control.blue_up: + self.left_motor.run_forever(speed_sp=1000) + self.right_motor.run_forever(speed_sp=600) + + self.steer_right() + + # turn left backward + elif self.remote_control.red_down: + self.left_motor.run_forever(speed_sp=-600) + self.right_motor.run_forever(speed_sp=-1000) + + self.steer_left() + + # turn right backward + elif self.remote_control.blue_down: + self.left_motor.run_forever(speed_sp=-1000) + self.right_motor.run_forever(speed_sp=-600) + + self.steer_right() + + # otherwise stop + else: + self.left_motor.stop(stop_action=Motor.STOP_ACTION_COAST) + self.right_motor.stop(stop_action=Motor.STOP_ACTION_COAST) + + self.steer_center() + + def main(self): + self.reset() + sleep(1) + + while True: + self.drive_by_ir_beacon() + sleep(0.01) + + +if __name__ == '__main__': + RAC3_TRUCK = Rac3Truck() + RAC3_TRUCK.main()