1
+ import math
2
+
1
3
from uart import uart
2
4
import _thread
3
5
from time import sleep_ms
@@ -13,15 +15,15 @@ class ArduinoAlvik:
13
15
14
16
def __init__ (self ):
15
17
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' ))
18
20
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 ])
21
25
self ._update_thread_running = False
22
26
self ._update_thread_id = None
23
- self .l_speed = None
24
- self .r_speed = None
25
27
self .battery_perc = None
26
28
self .touch_bits = None
27
29
self .behaviour = None
@@ -50,6 +52,7 @@ def begin(self) -> int:
50
52
self ._begin_update_thread ()
51
53
sleep_ms (100 )
52
54
self ._reset_hw ()
55
+ sleep_ms (1000 )
53
56
return 0
54
57
55
58
def _begin_update_thread (self ):
@@ -73,7 +76,12 @@ def stop(self):
73
76
:return:
74
77
"""
75
78
# stop engines
79
+ self .set_wheels_speed (0 , 0 )
80
+
76
81
# turn off UI leds
82
+ self ._set_leds (0x00 )
83
+
84
+ # stop the update thrad
77
85
self ._stop_update_thread ()
78
86
79
87
@staticmethod
@@ -88,16 +96,24 @@ def _reset_hw():
88
96
RESET_STM32 .value (1 )
89
97
sleep_ms (100 )
90
98
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 ()
93
101
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' ):
95
103
"""
96
104
Sets left/right motor speed
97
105
:param left_speed:
98
106
:param right_speed:
107
+ :param unit: the speed unit of measurement (default: 'rpm')
99
108
:return:
100
109
"""
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
+
101
117
self .packeter .packetC2F (ord ('J' ), left_speed , right_speed )
102
118
uart .write (self .packeter .msg [0 :self .packeter .msg_size ])
103
119
@@ -243,9 +259,7 @@ def _parse_message(self) -> int:
243
259
code = self .packeter .payload [0 ]
244
260
if code == ord ('j' ):
245
261
# 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 ()
249
263
elif code == ord ('l' ):
250
264
# line sensor
251
265
_ , self .left_line , self .center_line , self .right_line = self .packeter .unpacketC3I ()
@@ -333,7 +347,7 @@ def print_status(self):
333
347
print (f'{ str (a ).upper ()} = { getattr (self , str (a ))} ' )
334
348
335
349
336
- class ArduinoAlvikWheel :
350
+ class _ArduinoAlvikWheel :
337
351
338
352
def __init__ (self , packeter : ucPack , label : int , wheel_diameter_mm : float = WHEEL_DIAMETER_MM ):
339
353
self ._packeter = packeter
@@ -371,6 +385,11 @@ def set_speed(self, velocity: float, unit: str = 'rpm'):
371
385
:return:
372
386
"""
373
387
388
+ if unit not in angular_velocity_units :
389
+ return
390
+ elif unit == '%' :
391
+ velocity = perc_to_rpm (velocity )
392
+
374
393
self ._packeter .packetC2B1F (ord ('W' ), self ._label & 0xFF , ord ('V' ), velocity )
375
394
uart .write (self ._packeter .msg [0 :self ._packeter .msg_size ])
376
395
@@ -388,12 +407,18 @@ def set_position(self, position: float, unit: str = 'deg'):
388
407
:param unit: the unit of measurement
389
408
:return:
390
409
"""
410
+
411
+ if unit not in angle_units :
412
+ return
413
+ elif unit == 'rad' :
414
+ position = rad_to_deg (position )
415
+
391
416
self ._packeter .packetC2B1F (ord ('W' ), self ._label & 0xFF , ord ('P' ), position )
392
417
uart .write (self ._packeter .msg [0 :self ._packeter .msg_size ])
393
418
394
419
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 ]):
397
422
self ._packeter = packeter
398
423
self .label = label
399
424
self ._rgb_mask = rgb_mask
@@ -416,3 +441,18 @@ def set_color(self, red: bool, green: bool, blue: bool):
416
441
self ._led_state [0 ] = led_status
417
442
self ._packeter .packetC1B (ord ('L' ), led_status & 0xFF )
418
443
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
0 commit comments