Mercurial > micro-bot
annotate bot.py @ 3:1dc1a2e5e642 default tip
add some comments
| author | Radomir Dopieralski <bitbucket@sheep.art.pl> |
|---|---|
| date | Wed, 20 Mar 2019 23:15:39 +0000 |
| parents | 6dcf45d13f35 |
| children |
| rev | line source |
|---|---|
| 0 | 1 import microbit |
| 2 | |
| 3 | |
| 4 class Servo: | |
|
3
1dc1a2e5e642
add some comments
Radomir Dopieralski <bitbucket@sheep.art.pl>
parents:
2
diff
changeset
|
5 """A class for controlling continuous-rotation servos.""" |
|
1dc1a2e5e642
add some comments
Radomir Dopieralski <bitbucket@sheep.art.pl>
parents:
2
diff
changeset
|
6 |
| 0 | 7 def __init__(self, pin, trim=0): |
|
3
1dc1a2e5e642
add some comments
Radomir Dopieralski <bitbucket@sheep.art.pl>
parents:
2
diff
changeset
|
8 self.pin = pin # The pin to which the servo is connected. |
|
1dc1a2e5e642
add some comments
Radomir Dopieralski <bitbucket@sheep.art.pl>
parents:
2
diff
changeset
|
9 self.trim = trim # What value makes the servo stop. |
|
1dc1a2e5e642
add some comments
Radomir Dopieralski <bitbucket@sheep.art.pl>
parents:
2
diff
changeset
|
10 self.speed = 0 # Current speed. |
|
1dc1a2e5e642
add some comments
Radomir Dopieralski <bitbucket@sheep.art.pl>
parents:
2
diff
changeset
|
11 self.pin.set_analog_period(20) # Servo needs 20Hz signal. |
| 0 | 12 |
|
2
6dcf45d13f35
Rename servo methods to make more sense
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
1
diff
changeset
|
13 def set_speed(self, speed): |
|
3
1dc1a2e5e642
add some comments
Radomir Dopieralski <bitbucket@sheep.art.pl>
parents:
2
diff
changeset
|
14 """Sets the rotation speed of the servo, range is -90 to +90.""" |
|
1dc1a2e5e642
add some comments
Radomir Dopieralski <bitbucket@sheep.art.pl>
parents:
2
diff
changeset
|
15 # Value of 25 gives us around 1000us, which is the minimum duty cycle |
|
1dc1a2e5e642
add some comments
Radomir Dopieralski <bitbucket@sheep.art.pl>
parents:
2
diff
changeset
|
16 # for the servo. 125 is the maximum. |
|
2
6dcf45d13f35
Rename servo methods to make more sense
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
1
diff
changeset
|
17 self.pin.write_analog(int(25 + 100 * (90 + speed) / 180 + self.trim)) |
|
6dcf45d13f35
Rename servo methods to make more sense
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
1
diff
changeset
|
18 self.speed = speed |
| 0 | 19 |
| 20 | |
| 21 class Robot: | |
| 22 def __init__(self): | |
|
3
1dc1a2e5e642
add some comments
Radomir Dopieralski <bitbucket@sheep.art.pl>
parents:
2
diff
changeset
|
23 # Initialize the servos. Adjust the trim as needed. |
| 0 | 24 self.left_servo = Servo(microbit.pin0, 2) |
| 25 self.right_servo = Servo(microbit.pin1, 1) | |
| 26 | |
| 27 def go(self, distance): | |
|
3
1dc1a2e5e642
add some comments
Radomir Dopieralski <bitbucket@sheep.art.pl>
parents:
2
diff
changeset
|
28 """Make the robot go straight for a given distance.""" |
| 0 | 29 microbit.display.show(microbit.Image.ARROW_S) |
|
2
6dcf45d13f35
Rename servo methods to make more sense
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
1
diff
changeset
|
30 self.left_servo.set_speed(-90) |
|
6dcf45d13f35
Rename servo methods to make more sense
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
1
diff
changeset
|
31 self.right_servo.set_speed(90) |
| 0 | 32 microbit.sleep(int(distance * 2000 / 17)) |
| 33 self.stop() | |
| 34 | |
| 35 def turn(self, angle): | |
|
3
1dc1a2e5e642
add some comments
Radomir Dopieralski <bitbucket@sheep.art.pl>
parents:
2
diff
changeset
|
36 """Make the robot turn in place by given angle in degrees.""" |
| 0 | 37 if angle > 0: |
| 38 microbit.display.show(microbit.Image.ARROW_E) | |
|
2
6dcf45d13f35
Rename servo methods to make more sense
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
1
diff
changeset
|
39 self.left_servo.set_speed(-90) |
|
6dcf45d13f35
Rename servo methods to make more sense
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
1
diff
changeset
|
40 self.right_servo.set_speed(-90) |
| 0 | 41 microbit.sleep(int(angle * 64 / 9)) |
| 42 else: | |
| 43 microbit.display.show(microbit.Image.ARROW_W) | |
|
2
6dcf45d13f35
Rename servo methods to make more sense
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
1
diff
changeset
|
44 self.left_servo.set_speed(90) |
|
6dcf45d13f35
Rename servo methods to make more sense
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
1
diff
changeset
|
45 self.right_servo.set_speed(90) |
| 0 | 46 microbit.sleep(int(-angle * 64 / 9)) |
| 47 self.stop() | |
| 48 | |
| 49 def stop(self): | |
|
3
1dc1a2e5e642
add some comments
Radomir Dopieralski <bitbucket@sheep.art.pl>
parents:
2
diff
changeset
|
50 """Make the robot stop.""" |
| 0 | 51 microbit.display.show(microbit.Image.DIAMOND) |
|
2
6dcf45d13f35
Rename servo methods to make more sense
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
1
diff
changeset
|
52 self.left_servo.set_speed(0) |
|
6dcf45d13f35
Rename servo methods to make more sense
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
1
diff
changeset
|
53 self.right_servo.set_speed(0) |
| 0 | 54 |
| 55 def get_distance(self): | |
|
3
1dc1a2e5e642
add some comments
Radomir Dopieralski <bitbucket@sheep.art.pl>
parents:
2
diff
changeset
|
56 """Use the distance sensor on pin2.""" |
| 0 | 57 return microbit.pin2.read_analog() |
| 58 | |
| 59 | |
|
3
1dc1a2e5e642
add some comments
Radomir Dopieralski <bitbucket@sheep.art.pl>
parents:
2
diff
changeset
|
60 robot = Robot() # Create the robot object. |
| 0 | 61 while True: |
|
3
1dc1a2e5e642
add some comments
Radomir Dopieralski <bitbucket@sheep.art.pl>
parents:
2
diff
changeset
|
62 robot.go(5) # Go forward 5 units. |
|
1dc1a2e5e642
add some comments
Radomir Dopieralski <bitbucket@sheep.art.pl>
parents:
2
diff
changeset
|
63 if robot.get_distance() > 700: # If the distance sensor returns something... |
|
1dc1a2e5e642
add some comments
Radomir Dopieralski <bitbucket@sheep.art.pl>
parents:
2
diff
changeset
|
64 robot.turn(20) # Turn 20 degrees one way. |
|
1dc1a2e5e642
add some comments
Radomir Dopieralski <bitbucket@sheep.art.pl>
parents:
2
diff
changeset
|
65 left_distance = robot.get_distance() # Take a measurement. |
|
1dc1a2e5e642
add some comments
Radomir Dopieralski <bitbucket@sheep.art.pl>
parents:
2
diff
changeset
|
66 robot.turn(-40) # Turn 20 degrees the other way (40 in total) |
|
1dc1a2e5e642
add some comments
Radomir Dopieralski <bitbucket@sheep.art.pl>
parents:
2
diff
changeset
|
67 right_distance = robot.get_distance() # Take a measurement. |
|
1dc1a2e5e642
add some comments
Radomir Dopieralski <bitbucket@sheep.art.pl>
parents:
2
diff
changeset
|
68 robot.turn(20) # Turn back straight. |
|
1dc1a2e5e642
add some comments
Radomir Dopieralski <bitbucket@sheep.art.pl>
parents:
2
diff
changeset
|
69 if left_distance < right_distance: # Pick whatever side was further away. |
| 0 | 70 robot.turn(60) |
| 71 else: | |
| 72 robot.turn(-60) |
