Skip to content

Commit 636687f

Browse files
committed
mod: ArduinoAlvikWheel and ArduinoAlvikRgbLed as private classes
mod: .begin() sleeps for 1s before returning mod: .stop() sets motors speed to 0 and turns off all LEDs mod: l_speed and r_speed removed feat: some unit of measurement conversion implemented upd: examples
1 parent 117206f commit 636687f

File tree

5 files changed

+100
-23
lines changed

5 files changed

+100
-23
lines changed

arduino_alvik.py

Lines changed: 55 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import math
2+
13
from uart import uart
24
import _thread
35
from time import sleep_ms
@@ -13,15 +15,15 @@ class ArduinoAlvik:
1315

1416
def __init__(self):
1517
self.packeter = ucPack(200)
16-
self.left_wheel = ArduinoAlvikWheel(self.packeter, ord('L'))
17-
self.right_wheel = ArduinoAlvikWheel(self.packeter, ord('R'))
18+
self.left_wheel = _ArduinoAlvikWheel(self.packeter, ord('L'))
19+
self.right_wheel = _ArduinoAlvikWheel(self.packeter, ord('R'))
1820
self.led_state = [None]
19-
self.left_led = ArduinoAlvikRgbLed(self.packeter, 'left', self.led_state, rgb_mask=[0b00000100, 0b00001000, 0b00010000])
20-
self.right_led = ArduinoAlvikRgbLed(self.packeter, 'right', self.led_state, rgb_mask=[0b00100000, 0b01000000, 0b10000000])
21+
self.left_led = _ArduinoAlvikRgbLed(self.packeter, 'left', self.led_state,
22+
rgb_mask=[0b00000100, 0b00001000, 0b00010000])
23+
self.right_led = _ArduinoAlvikRgbLed(self.packeter, 'right', self.led_state,
24+
rgb_mask=[0b00100000, 0b01000000, 0b10000000])
2125
self._update_thread_running = False
2226
self._update_thread_id = None
23-
self.l_speed = None
24-
self.r_speed = None
2527
self.battery_perc = None
2628
self.touch_bits = None
2729
self.behaviour = None
@@ -50,6 +52,7 @@ def begin(self) -> int:
5052
self._begin_update_thread()
5153
sleep_ms(100)
5254
self._reset_hw()
55+
sleep_ms(1000)
5356
return 0
5457

5558
def _begin_update_thread(self):
@@ -73,7 +76,12 @@ def stop(self):
7376
:return:
7477
"""
7578
# stop engines
79+
self.set_wheels_speed(0, 0)
80+
7681
# turn off UI leds
82+
self._set_leds(0x00)
83+
84+
# stop the update thrad
7785
self._stop_update_thread()
7886

7987
@staticmethod
@@ -88,16 +96,24 @@ def _reset_hw():
8896
RESET_STM32.value(1)
8997
sleep_ms(100)
9098

91-
def get_speeds(self) -> (float, float):
92-
return self.l_speed, self.r_speed
99+
def get_wheels_speed(self) -> (float, float):
100+
return self.left_wheel.get_speed(), self.right_wheel.get_speed()
93101

94-
def set_speeds(self, left_speed: float, right_speed: float):
102+
def set_wheels_speed(self, left_speed: float, right_speed: float, unit: str = 'rpm'):
95103
"""
96104
Sets left/right motor speed
97105
:param left_speed:
98106
:param right_speed:
107+
:param unit: the speed unit of measurement (default: 'rpm')
99108
:return:
100109
"""
110+
111+
if unit not in angular_velocity_units:
112+
return
113+
elif unit == '%':
114+
left_speed = perc_to_rpm(left_speed)
115+
right_speed = perc_to_rpm(right_speed)
116+
101117
self.packeter.packetC2F(ord('J'), left_speed, right_speed)
102118
uart.write(self.packeter.msg[0:self.packeter.msg_size])
103119

@@ -243,9 +259,7 @@ def _parse_message(self) -> int:
243259
code = self.packeter.payload[0]
244260
if code == ord('j'):
245261
# joint speed
246-
_, self.l_speed, self.r_speed = self.packeter.unpacketC2F()
247-
self.left_wheel._speed = self.l_speed
248-
self.right_wheel._speed = self.r_speed
262+
_, self.left_wheel._speed, self.right_wheel._speed = self.packeter.unpacketC2F()
249263
elif code == ord('l'):
250264
# line sensor
251265
_, self.left_line, self.center_line, self.right_line = self.packeter.unpacketC3I()
@@ -333,7 +347,7 @@ def print_status(self):
333347
print(f'{str(a).upper()} = {getattr(self, str(a))}')
334348

335349

336-
class ArduinoAlvikWheel:
350+
class _ArduinoAlvikWheel:
337351

338352
def __init__(self, packeter: ucPack, label: int, wheel_diameter_mm: float = WHEEL_DIAMETER_MM):
339353
self._packeter = packeter
@@ -371,6 +385,11 @@ def set_speed(self, velocity: float, unit: str = 'rpm'):
371385
:return:
372386
"""
373387

388+
if unit not in angular_velocity_units:
389+
return
390+
elif unit == '%':
391+
velocity = perc_to_rpm(velocity)
392+
374393
self._packeter.packetC2B1F(ord('W'), self._label & 0xFF, ord('V'), velocity)
375394
uart.write(self._packeter.msg[0:self._packeter.msg_size])
376395

@@ -388,12 +407,18 @@ def set_position(self, position: float, unit: str = 'deg'):
388407
:param unit: the unit of measurement
389408
:return:
390409
"""
410+
411+
if unit not in angle_units:
412+
return
413+
elif unit == 'rad':
414+
position = rad_to_deg(position)
415+
391416
self._packeter.packetC2B1F(ord('W'), self._label & 0xFF, ord('P'), position)
392417
uart.write(self._packeter.msg[0:self._packeter.msg_size])
393418

394419

395-
class ArduinoAlvikRgbLed:
396-
def __init__(self, packeter: ucPack, label: str, led_state: list[int], rgb_mask: list[int]):
420+
class _ArduinoAlvikRgbLed:
421+
def __init__(self, packeter: ucPack, label: str, led_state: list[int | None], rgb_mask: list[int]):
397422
self._packeter = packeter
398423
self.label = label
399424
self._rgb_mask = rgb_mask
@@ -416,3 +441,18 @@ def set_color(self, red: bool, green: bool, blue: bool):
416441
self._led_state[0] = led_status
417442
self._packeter.packetC1B(ord('L'), led_status & 0xFF)
418443
uart.write(self._packeter.msg[0:self._packeter.msg_size])
444+
445+
446+
# Units and unit conversion methods
447+
448+
angular_velocity_units = ['rpm', '%']
449+
angle_units = ['deg', 'rad']
450+
distance_units = ['mm', 'cm']
451+
452+
453+
def perc_to_rpm(percent: float) -> float:
454+
return (percent / 100.0)*MOTOR_MAX_RPM
455+
456+
457+
def rad_to_deg(rad: float) -> float:
458+
return rad*180/math.pi

examples/message_reader.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,17 @@
1111
while True:
1212
try:
1313
print(f'VER: {alvik.version}')
14-
print(f'LSP: {alvik.l_speed}')
15-
print(f'RSP: {alvik.r_speed}')
14+
print(f'LSP: {alvik.left_wheel.get_speed()}')
15+
print(f'RSP: {alvik.left_wheel.get_speed()}')
1616
print(f'TOUCH: {alvik.touch_bits}')
1717
print(f'RGB: {alvik.red} {alvik.green} {alvik.blue}')
1818
print(f'LINE: {alvik.left_line} {alvik.center_line} {alvik.right_line}')
1919

20-
alvik.set_speeds(speed, speed)
20+
alvik.set_wheels_speed(speed, speed)
2121
speed = (speed + 1) % 60
2222
sleep_ms(1000)
2323
except KeyboardInterrupt as e:
2424
print('over')
25-
alvik.set_speeds(0, 0)
25+
alvik.stop()
2626
break
2727
sys.exit()

examples/move_example.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,15 @@
77

88
while True:
99
try:
10-
alvik.set_speeds(10, 10)
10+
alvik.set_wheels_speed(10, 10)
1111
sleep_ms(1000)
1212

13-
alvik.set_speeds(30, 60)
13+
alvik.set_wheels_speed(30, 60)
1414
sleep_ms(1000)
1515

16-
alvik.set_speeds(60, 30)
16+
alvik.set_wheels_speed(60, 30)
1717
sleep_ms(1000)
1818
except KeyboardInterrupt as e:
1919
print('over')
20-
alvik.set_speeds(0, 0)
20+
alvik.stop()
2121
sys.exit()

examples/move_wheels.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
from arduino_alvik import ArduinoAlvik
2+
from time import sleep_ms
3+
import sys
4+
5+
alvik = ArduinoAlvik()
6+
alvik.begin()
7+
8+
while True:
9+
try:
10+
alvik.left_wheel.set_speed(10)
11+
sleep_ms(1000)
12+
print(f'LSP: {alvik.left_wheel.get_speed()}')
13+
print(f'RSP: {alvik.right_wheel.get_speed()}')
14+
15+
alvik.right_wheel.set_speed(10)
16+
sleep_ms(1000)
17+
18+
print(f'LSP: {alvik.left_wheel.get_speed()}')
19+
print(f'RSP: {alvik.right_wheel.get_speed()}')
20+
21+
alvik.left_wheel.set_speed(20)
22+
sleep_ms(1000)
23+
24+
print(f'LSP: {alvik.left_wheel.get_speed()}')
25+
print(f'RSP: {alvik.right_wheel.get_speed()}')
26+
27+
alvik.right_wheel.set_speed(20)
28+
sleep_ms(1000)
29+
30+
print(f'LSP: {alvik.left_wheel.get_speed()}')
31+
print(f'RSP: {alvik.right_wheel.get_speed()}')
32+
33+
except KeyboardInterrupt as e:
34+
print('over')
35+
alvik.stop()
36+
sys.exit()

robot_definitions.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
MOTOR_KP_DEFAULT = 32.0
33
MOTOR_KI_DEFAULT = 450.0
44
MOTOR_KD_DEFAULT = 0.0
5+
MOTOR_MAX_RPM = 70
56

67
# Wheels parameters
78
WHEEL_DIAMETER_MM = 34

0 commit comments

Comments
 (0)