From 5cecf9acf033cc362a54cb464340f90e1039b2c3 Mon Sep 17 00:00:00 2001 From: Laurens Valk Date: Wed, 14 Apr 2021 12:53:43 +0200 Subject: [PATCH] 42099-off-roader: Add basic driving demo. --- .../42099-off-roader/42099-off-roader.jpg | Bin 0 -> 27141 bytes sets/technic/42099-off-roader/README.md | 9 +++ .../42099-off-roader/driving/README.md | 25 ++++++++ sets/technic/42099-off-roader/driving/main.py | 55 ++++++++++++++++++ 4 files changed, 89 insertions(+) create mode 100644 sets/technic/42099-off-roader/42099-off-roader.jpg create mode 100644 sets/technic/42099-off-roader/README.md create mode 100644 sets/technic/42099-off-roader/driving/README.md create mode 100644 sets/technic/42099-off-roader/driving/main.py diff --git a/sets/technic/42099-off-roader/42099-off-roader.jpg b/sets/technic/42099-off-roader/42099-off-roader.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a03cc60c3e58045c030891c168c7bc8c640492e5 GIT binary patch literal 27141 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 Z^a!3<$zqE`{Qs@q|I3R1k9Ypf{5OOt(Aoe1 literal 0 HcmV?d00001 diff --git a/sets/technic/42099-off-roader/README.md b/sets/technic/42099-off-roader/README.md new file mode 100644 index 0000000..74ddafb --- /dev/null +++ b/sets/technic/42099-off-roader/README.md @@ -0,0 +1,9 @@ +--- +permalink: /projects/sets/technic/42099-off-roader/ +title: "42099: 4X4 X-treme Off-Roader" +image: + local: "42099-off-roader.jpg" + credit: "LEGO" +layout: set +description: "Add set description" +--- diff --git a/sets/technic/42099-off-roader/driving/README.md b/sets/technic/42099-off-roader/driving/README.md new file mode 100644 index 0000000..1e7c16d --- /dev/null +++ b/sets/technic/42099-off-roader/driving/README.md @@ -0,0 +1,25 @@ +--- +permalink: /projects/sets/technic/42099-off-roader/driving/ +title: "42099: Technic Off-Roader: Driving" +maintainer: + user: "pybricks" + name: "The Pybricks Authors" +image: + local: "../42099-off-roader.jpg" + credit: "LEGO" +description: + "This project shows how to make the car drive and steer. You can also + remote control it with a keyboard." +building_instructions: + external: https://www.lego.com/cdn/product-assets/product.bi.core.pdf/6314518.pdf +--- + +# Basic driving and steering + +This program centers the steering motor, and defines a function called +``drive`` which can be used to control the vehicle. Further details +are given as comments in the program. + +```python +{% include_relative main.py %} +``` diff --git a/sets/technic/42099-off-roader/driving/main.py b/sets/technic/42099-off-roader/driving/main.py new file mode 100644 index 0000000..fdcc34f --- /dev/null +++ b/sets/technic/42099-off-roader/driving/main.py @@ -0,0 +1,55 @@ +from pybricks.pupdevices import Motor, ColorDistanceSensor +from pybricks.parameters import Port, Direction, Stop +from pybricks.tools import wait + +# Initialize the motors +steer = Motor(Port.C) +front = Motor(Port.A, Direction.COUNTERCLOCKWISE) +rear = Motor(Port.B, Direction.COUNTERCLOCKWISE) + +# Lower the acceleration so the car starts and stops realistically. +front.control.limits(acceleration=1000) +rear.control.limits(acceleration=1000) + +# Find the steering endpoint on the left and right. The difference between them +# is the total angle it takes to go from left to right. The middle is in between. +left_end = steer.run_until_stalled(-200, then=Stop.HOLD) +right_end = steer.run_until_stalled(200, then=Stop.HOLD) + +# We are now at the right limit. We reset the motor angle to the limit value, +# so that the angle is 0 when the steering mechanism is centered. +limit = (right_end - left_end)//2 +steer.reset_angle(limit) +steer.run_target(speed=200, target_angle=0, then=Stop.COAST) + +# Given a motor speed (deg/s) and a steering motor angle (deg), this function +# makes the car move at the desired speed and turn angle. The car keeps moving +# until you give another drive command. +def drive(drive_motor_speed, steer_angle): + # Start running the drive motors + front.run(drive_motor_speed) + rear.run(drive_motor_speed) + + # Limit the steering value for safety, and then start the steer motor. + limited_angle = max(-limit, min(steer_angle, limit)) + steer.run_target(200, limited_angle, wait=False) + +# Drive forward for 5 seconds. +drive(800, 0) +wait(5000) + +# Drive backward for 5 seconds. +drive(-800, 0) +wait(5000) + +# Drive forward to the right for 5 seconds. +drive(800, 90) +wait(5000) + +# Drive backward to the left for 5 seconds. +drive(-800, -90) +wait(5000) + +# Stop smoothly and center the steer. +drive(0, 0) +wait(2000)