diff --git a/arduino_alvik/__init__.py b/arduino_alvik/__init__.py index a5353de..dbdfc6a 100644 --- a/arduino_alvik/__init__.py +++ b/arduino_alvik/__init__.py @@ -4,7 +4,7 @@ __author__ = "Lucio Rossi , Giovanni Bruno " __license__ = "MPL 2.0" -__version__ = "1.1.1" +__version__ = "1.1.2" __maintainer__ = "Lucio Rossi , Giovanni Bruno " __required_firmware_version__ = "1.1.0" diff --git a/arduino_alvik/arduino_alvik.py b/arduino_alvik/arduino_alvik.py index d83305a..e80674f 100644 --- a/arduino_alvik/arduino_alvik.py +++ b/arduino_alvik/arduino_alvik.py @@ -1,5 +1,4 @@ import sys -import gc import struct from machine import I2C import _thread @@ -84,6 +83,14 @@ def __init__(self): self._move_events = _ArduinoAlvikMoveEvents() self._timer_events = _ArduinoAlvikTimerEvents(-1) + def __del__(self): + """ + This method is a stub. __del__ is not implemented in MicroPython (https://docs.micropython.org/en/latest/genrst/core_language.html#special-method-del-not-implemented-for-user-defined-classes) + :return: + """ + ... + # self.__class__._instance = None + @staticmethod def is_on() -> bool: """ @@ -254,13 +261,19 @@ def _wait_for_ack(self) -> None: sleep_ms(20) self._waiting_ack = None - def _wait_for_fw_check(self) -> bool: + def _wait_for_fw_check(self, timeout=5) -> bool: """ Waits until receives version from robot, check required version and return true if everything is ok + :param timeout: wait for fw timeout in seconds :return: """ + start = ticks_ms() while self._fw_version == [None, None, None]: sleep_ms(20) + if ticks_diff(ticks_ms(), start) > timeout * 1000: + print("Could not get FW version") + return False + if self.check_firmware_compatibility(): return True else: @@ -272,8 +285,7 @@ def _flush_uart(): Empties the UART buffer :return: """ - while uart.any(): - uart.read(1) + uart.read(uart.any()) def _begin_update_thread(self): """ @@ -377,10 +389,6 @@ def stop(self): # stop touch events thread self._stop_events_thread() - # delete _instance - del self.__class__._instance - gc.collect() - @staticmethod def _reset_hw(): """ @@ -641,21 +649,22 @@ def _update(self, delay_=1): self.set_behaviour(2) if not ArduinoAlvik._update_thread_running: break - if self._read_message(): - self._parse_message() + self._read_message() sleep_ms(delay_) - def _read_message(self) -> bool: + def _read_message(self) -> None: """ Read a message from the uC :return: True if a message terminator was reached """ - while uart.any(): - b = uart.read(1)[0] - self._packeter.buffer.push(b) - if b == self._packeter.end_index and self._packeter.checkPayload(): - return True - return False + buf = bytearray(uart.any()) + uart.readinto(buf) + if len(buf): + uart.readinto(buf) + for b in buf: + self._packeter.buffer.push(b) + if b == self._packeter.end_index and self._packeter.checkPayload(): + self._parse_message() def _parse_message(self) -> int: """ @@ -2096,6 +2105,19 @@ def update_firmware(file_path: str): STM32_eraseMEM, STM32_writeMEM, ) + def flash_toggle(): + i = 0 + + while True: + if i == 0: + LEDR.value(1) + LEDG.value(0) + else: + LEDR.value(0) + LEDG.value(1) + i = (i + 1) % 2 + yield + if CHECK_STM32.value() is not 1: print("Turn on your Alvik to continue...") while CHECK_STM32.value() is not 1: @@ -2112,8 +2134,13 @@ def update_firmware(file_path: str): STM32_eraseMEM(0xFFFF) print("\nWRITING MEM") - STM32_writeMEM(file_path) + toggle = flash_toggle() + STM32_writeMEM(file_path, toggle) + print("\nDONE") print("\nLower Boot0 and reset STM32") + LEDR.value(1) + LEDG.value(1) + STM32_endCommunication() diff --git a/arduino_alvik/stm32_flash.py b/arduino_alvik/stm32_flash.py index 89522c6..5ec1724 100644 --- a/arduino_alvik/stm32_flash.py +++ b/arduino_alvik/stm32_flash.py @@ -296,7 +296,7 @@ def STM32_readMEM(pages: int): _incrementAddress(readAddress) -def STM32_writeMEM(file_path: str): +def STM32_writeMEM(file_path: str, toggle: "Generator" = None): with open(file_path, 'rb') as f: print(f"Flashing {file_path}\n") @@ -326,6 +326,8 @@ def STM32_writeMEM(file_path: str): sys.stdout.write(f"{int((i/file_pages)*100)}%") i = i + 1 _incrementAddress(writeAddress) + if toggle is not None: + next(toggle) def _STM32_standardEraseMEM(pages: int, page_list: bytearray = None): diff --git a/examples/actuators/leds_setting.py b/examples/actuators/leds_setting.py index cceb6c4..3ea1020 100644 --- a/examples/actuators/leds_setting.py +++ b/examples/actuators/leds_setting.py @@ -1,6 +1,6 @@ from arduino_alvik import ArduinoAlvik from time import sleep_ms -import sys + alvik = ArduinoAlvik() alvik.begin() @@ -34,4 +34,4 @@ except KeyboardInterrupt as e: print('over') alvik.stop() - sys.exit() + break diff --git a/examples/actuators/move_wheels.py b/examples/actuators/move_wheels.py index d6f6e7e..94537a3 100644 --- a/examples/actuators/move_wheels.py +++ b/examples/actuators/move_wheels.py @@ -1,6 +1,6 @@ from arduino_alvik import ArduinoAlvik from time import sleep_ms -import sys + alvik = ArduinoAlvik() alvik.begin() @@ -33,4 +33,4 @@ except KeyboardInterrupt as e: print('over') alvik.stop() - sys.exit() + break diff --git a/examples/actuators/pose_example.py b/examples/actuators/pose_example.py index 11b675a..465a635 100644 --- a/examples/actuators/pose_example.py +++ b/examples/actuators/pose_example.py @@ -1,82 +1,80 @@ from arduino_alvik import ArduinoAlvik from time import sleep_ms -import sys + alvik = ArduinoAlvik() alvik.begin() -while True: - try: +try: + + alvik.move(100.0, 'mm') + print("on target after move") + + alvik.move(50.0, 'mm') + print("on target after move") + + alvik.rotate(90.0, 'deg') + print("on target after rotation") - alvik.move(100.0, 'mm') - print("on target after move") + alvik.rotate(-45.00, 'deg') + print("on target after rotation") - alvik.move(50.0, 'mm') - print("on target after move") + x, y, theta = alvik.get_pose() + print(f'Current pose is x(cm)={x}, y(cm)={y}, theta(deg)={theta}') - alvik.rotate(90.0, 'deg') - print("on target after rotation") + alvik.reset_pose(0, 0, 0) - alvik.rotate(-45.00, 'deg') - print("on target after rotation") + x, y, theta = alvik.get_pose() + print(f'Updated pose is x(cm)={x}, y(cm)={y}, theta(deg)={theta}') + sleep_ms(500) - x, y, theta = alvik.get_pose() - print(f'Current pose is x(cm)={x}, y(cm)={y}, theta(deg)={theta}') + print("___________NON-BLOCKING__________________") - alvik.reset_pose(0, 0, 0) + alvik.move(50.0, 'mm', blocking=False) - x, y, theta = alvik.get_pose() - print(f'Updated pose is x(cm)={x}, y(cm)={y}, theta(deg)={theta}') + while not alvik.is_target_reached(): + alvik.left_led.set_color(1, 0, 0) + sleep_ms(500) + alvik.left_led.set_color(0, 0, 0) + sleep_ms(500) + print("on target after move") + + alvik.rotate(45.0, 'deg', blocking=False) + while not alvik.is_target_reached(): + alvik.left_led.set_color(1, 0, 0) + sleep_ms(500) + alvik.left_led.set_color(0, 0, 0) sleep_ms(500) + print("on target after rotation") - print("___________NON-BLOCKING__________________") - - alvik.move(50.0, 'mm', blocking=False) - - while not alvik.is_target_reached(): - alvik.left_led.set_color(1, 0, 0) - sleep_ms(500) - alvik.left_led.set_color(0, 0, 0) - sleep_ms(500) - print("on target after move") - - alvik.rotate(45.0, 'deg', blocking=False) - while not alvik.is_target_reached(): - alvik.left_led.set_color(1, 0, 0) - sleep_ms(500) - alvik.left_led.set_color(0, 0, 0) - sleep_ms(500) - print("on target after rotation") - - alvik.move(100.0, 'mm', blocking=False) - while not alvik.is_target_reached(): - alvik.left_led.set_color(1, 0, 0) - sleep_ms(500) - alvik.left_led.set_color(0, 0, 0) - sleep_ms(500) - print("on target after move") - - alvik.rotate(-90.00, 'deg', blocking=False) - while not alvik.is_target_reached(): - alvik.left_led.set_color(1, 0, 0) - sleep_ms(500) - alvik.left_led.set_color(0, 0, 0) - sleep_ms(500) - print("on target after rotation") - - x, y, theta = alvik.get_pose() - print(f'Current pose is x(cm)={x}, y(cm)={y}, theta(deg)={theta}') - - alvik.reset_pose(0, 0, 0) - - x, y, theta = alvik.get_pose() - print(f'Updated pose is x={x}, y={y}, theta(deg)={theta}') + alvik.move(100.0, 'mm', blocking=False) + while not alvik.is_target_reached(): + alvik.left_led.set_color(1, 0, 0) sleep_ms(500) + alvik.left_led.set_color(0, 0, 0) + sleep_ms(500) + print("on target after move") + + alvik.rotate(-90.00, 'deg', blocking=False) + while not alvik.is_target_reached(): + alvik.left_led.set_color(1, 0, 0) + sleep_ms(500) + alvik.left_led.set_color(0, 0, 0) + sleep_ms(500) + print("on target after rotation") + + x, y, theta = alvik.get_pose() + print(f'Current pose is x(cm)={x}, y(cm)={y}, theta(deg)={theta}') + + alvik.reset_pose(0, 0, 0) + + x, y, theta = alvik.get_pose() + print(f'Updated pose is x={x}, y={y}, theta(deg)={theta}') + sleep_ms(500) - alvik.stop() - sys.exit() +except KeyboardInterrupt as e: + print('Test interrupted') - except KeyboardInterrupt as e: - print('over') - alvik.stop() - sys.exit() +finally: + alvik.stop() + print("END of pose example") \ No newline at end of file diff --git a/examples/actuators/set_servo.py b/examples/actuators/set_servo.py index b4e9084..48720c1 100644 --- a/examples/actuators/set_servo.py +++ b/examples/actuators/set_servo.py @@ -1,6 +1,6 @@ from arduino_alvik import ArduinoAlvik from time import sleep_ms -import sys + alvik = ArduinoAlvik() alvik.begin() @@ -19,4 +19,4 @@ except KeyboardInterrupt as e: print('over') alvik.stop() - sys.exit() + break diff --git a/examples/actuators/wheels_position.py b/examples/actuators/wheels_position.py index 6f3a151..fc521c6 100644 --- a/examples/actuators/wheels_position.py +++ b/examples/actuators/wheels_position.py @@ -1,6 +1,6 @@ from arduino_alvik import ArduinoAlvik from time import sleep, sleep_ms -import sys + alvik = ArduinoAlvik() alvik.begin() @@ -62,4 +62,4 @@ except KeyboardInterrupt as e: print('over') alvik.stop() - sys.exit() + break diff --git a/examples/actuators/wheels_speed.py b/examples/actuators/wheels_speed.py index 1919f27..3a54340 100644 --- a/examples/actuators/wheels_speed.py +++ b/examples/actuators/wheels_speed.py @@ -1,6 +1,6 @@ from arduino_alvik import ArduinoAlvik from time import sleep_ms -import sys + alvik = ArduinoAlvik() alvik.begin() @@ -21,4 +21,4 @@ except KeyboardInterrupt as e: print('over') alvik.stop() - sys.exit() + break diff --git a/examples/arduino-runtime/blink.py b/examples/arduino-runtime/blink.py new file mode 100644 index 0000000..920838f --- /dev/null +++ b/examples/arduino-runtime/blink.py @@ -0,0 +1,28 @@ +from time import sleep_ms + +from arduino import start +from arduino_alvik import ArduinoAlvik + + +alvik = ArduinoAlvik() + + +def setup(): + alvik.begin() + + +def loop(): + print('blinking LEDs') + alvik.left_led.set_color(0, 0, 1) + alvik.right_led.set_color(0, 0, 1) + sleep_ms(500) + alvik.left_led.set_color(1, 0, 0) + alvik.right_led.set_color(1, 0, 0) + sleep_ms(500) + + +def cleanup(): + alvik.stop() + + +start(setup=setup, loop=loop, cleanup=cleanup) diff --git a/examples/arduino-runtime/line_follower.py b/examples/arduino-runtime/line_follower.py new file mode 100644 index 0000000..cf6c861 --- /dev/null +++ b/examples/arduino-runtime/line_follower.py @@ -0,0 +1,64 @@ +from time import sleep_ms + +from arduino import start +from arduino_alvik import ArduinoAlvik + + +alvik = ArduinoAlvik() + + +def calculate_center(left: int, center: int, right: int): + centroid = 0 + sum_weight = left + center + right + sum_values = left + 2 * center + 3 * right + if sum_weight != 0: + centroid = sum_values / sum_weight + centroid = 2 - centroid + return centroid + + +def run_line_follower(alvik): + + kp = 50.0 + line_sensors = alvik.get_line_sensors() + print(f' {line_sensors}') + + error = calculate_center(*line_sensors) + control = error * kp + + if control > 0.2: + alvik.left_led.set_color(1, 0, 0) + alvik.right_led.set_color(0, 0, 0) + elif control < -0.2: + alvik.left_led.set_color(1, 0, 0) + alvik.right_led.set_color(0, 0, 0) + else: + alvik.left_led.set_color(0, 1, 0) + alvik.right_led.set_color(0, 1, 0) + + alvik.set_wheels_speed(30 - control, 30 + control) + sleep_ms(100) + + +def setup(): + alvik.begin() + alvik.left_led.set_color(0, 0, 1) + alvik.right_led.set_color(0, 0, 1) + + +def loop(): + while not alvik.get_touch_ok(): + alvik.left_led.set_color(0, 0, 1) + alvik.right_led.set_color(0, 0, 1) + alvik.brake() + sleep_ms(100) + + while not alvik.get_touch_cancel(): + run_line_follower(alvik) + + +def cleanup(): + alvik.stop() + + +start(setup=setup, loop=loop, cleanup=cleanup) diff --git a/examples/arduino-runtime/read_tof.py b/examples/arduino-runtime/read_tof.py new file mode 100644 index 0000000..63fb76d --- /dev/null +++ b/examples/arduino-runtime/read_tof.py @@ -0,0 +1,26 @@ +from time import sleep_ms + +from arduino import start +from arduino_alvik import ArduinoAlvik + + +alvik = ArduinoAlvik() + + +def setup(): + alvik.begin() + + +def loop(): + L, CL, C, CR, R = alvik.get_distance() + T = alvik.get_distance_top() + B = alvik.get_distance_bottom() + print(f'T: {T} | B: {B} | L: {L} | CL: {CL} | C: {C} | CR: {CR} | R: {R}') + sleep_ms(100) + + +def cleanup(): + alvik.stop() + + +start(setup=setup, loop=loop, cleanup=cleanup) diff --git a/examples/communication/i2c_scan.py b/examples/communication/i2c_scan.py index a246787..6f1ed45 100644 --- a/examples/communication/i2c_scan.py +++ b/examples/communication/i2c_scan.py @@ -1,5 +1,5 @@ from time import sleep_ms -import sys + from arduino_alvik import ArduinoAlvik @@ -22,4 +22,4 @@ sleep_ms(100) except KeyboardInterrupt as e: alvik.stop() - sys.exit() \ No newline at end of file + break \ No newline at end of file diff --git a/examples/communication/modulino.py b/examples/communication/modulino.py index bf1e8e2..c8606f9 100644 --- a/examples/communication/modulino.py +++ b/examples/communication/modulino.py @@ -1,11 +1,12 @@ from arduino_alvik import ArduinoAlvik from time import sleep_ms -import sys + + try: from modulino import ModulinoPixels except ImportError as e: - print("ImportError: ModulinoPixels not installed") - sys.exit(-1) + print("\nImportError: ModulinoPixels not installed") + raise e alvik = ArduinoAlvik() alvik.begin() @@ -32,4 +33,4 @@ except KeyboardInterrupt as e: alvik.stop() - sys.exit() + break diff --git a/examples/demo/demo.py b/examples/demo/demo.py index 931aa47..f1b283d 100644 --- a/examples/demo/demo.py +++ b/examples/demo/demo.py @@ -1,6 +1,10 @@ from arduino_alvik import ArduinoAlvik from time import sleep_ms -import sys + +from line_follower import run_line_follower +from touch_move import run_touch_move +from hand_follower import run_hand_follower + alvik = ArduinoAlvik() alvik.begin() @@ -27,12 +31,21 @@ def update_led_status(val): try: if alvik.get_touch_ok(): - if menu_status == 0: - import line_follower - elif menu_status == 1: - import hand_follower - elif menu_status == -1: - import touch_move + alvik.left_led.set_color(0, 0, 0) + alvik.right_led.set_color(0, 0, 0) + sleep_ms(500) + while not alvik.get_touch_cancel(): + if menu_status == 0: + run_line_follower(alvik) + elif menu_status == 1: + run_hand_follower(alvik) + elif menu_status == -1: + if run_touch_move(alvik) < 0: + break + alvik.left_led.set_color(0, 0, 0) + alvik.right_led.set_color(0, 0, 0) + sleep_ms(500) + alvik.brake() if alvik.get_touch_up() and menu_status < 1: menu_status += 1 @@ -50,4 +63,4 @@ def update_led_status(val): except KeyboardInterrupt as e: print('over') alvik.stop() - sys.exit() + break diff --git a/examples/demo/hand_follower.py b/examples/demo/hand_follower.py index fcdc41e..1b784b5 100644 --- a/examples/demo/hand_follower.py +++ b/examples/demo/hand_follower.py @@ -1,38 +1,43 @@ from arduino_alvik import ArduinoAlvik from time import sleep_ms -import sys -alvik = ArduinoAlvik() -alvik.begin() -reference = 10.0 +def run_hand_follower(alvik): + reference = 10.0 + alvik.left_led.set_color(0, 0, 0) + alvik.right_led.set_color(0, 0, 0) + L, CL, C, CR, R = alvik.get_distance() + print(f'C: {C}') + error = C - reference + alvik.set_wheels_speed(error * 10, error * 10) + sleep_ms(100) -alvik.left_led.set_color(0, 1, 0) -alvik.right_led.set_color(0, 1, 0) -while alvik.get_touch_ok(): - sleep_ms(50) +if __name__ == "__main__": -while not alvik.get_touch_ok(): - sleep_ms(50) + alvik = ArduinoAlvik() + alvik.begin() + + alvik.left_led.set_color(0, 1, 0) + alvik.right_led.set_color(0, 1, 0) + + while alvik.get_touch_ok(): + sleep_ms(50) + + while not alvik.get_touch_ok(): + sleep_ms(50) -try: while True: - while not alvik.get_touch_cancel(): - alvik.left_led.set_color(0, 0, 0) - alvik.right_led.set_color(0, 0, 0) - L, CL, C, CR, R = alvik.get_distance() - print(f'C: {C}') - error = C - reference - alvik.set_wheels_speed(error*10, error*10) - sleep_ms(100) - - while not alvik.get_touch_ok(): - alvik.left_led.set_color(0, 1, 0) - alvik.right_led.set_color(0, 1, 0) - alvik.brake() - sleep_ms(100) -except KeyboardInterrupt as e: - print('over') - alvik.stop() - sys.exit() + try: + while not alvik.get_touch_cancel(): + run_hand_follower(alvik) + + while not alvik.get_touch_ok(): + alvik.left_led.set_color(0, 1, 0) + alvik.right_led.set_color(0, 1, 0) + alvik.brake() + sleep_ms(100) + except KeyboardInterrupt as e: + print('over') + alvik.stop() + break diff --git a/examples/demo/line_follower.py b/examples/demo/line_follower.py index 041faf6..c61f3c4 100644 --- a/examples/demo/line_follower.py +++ b/examples/demo/line_follower.py @@ -1,6 +1,5 @@ from arduino_alvik import ArduinoAlvik from time import sleep_ms -import sys def calculate_center(left: int, center: int, right: int): @@ -13,52 +12,54 @@ def calculate_center(left: int, center: int, right: int): return centroid -alvik = ArduinoAlvik() -alvik.begin() +def run_line_follower(alvik): + kp = 50.0 + line_sensors = alvik.get_line_sensors() + print(f' {line_sensors}') -error = 0 -control = 0 -kp = 50.0 + error = calculate_center(*line_sensors) + control = error * kp -alvik.left_led.set_color(0, 0, 1) -alvik.right_led.set_color(0, 0, 1) + if control > 0.2: + alvik.left_led.set_color(1, 0, 0) + alvik.right_led.set_color(0, 0, 0) + elif control < -0.2: + alvik.left_led.set_color(1, 0, 0) + alvik.right_led.set_color(0, 0, 0) + else: + alvik.left_led.set_color(0, 1, 0) + alvik.right_led.set_color(0, 1, 0) -while alvik.get_touch_ok(): - sleep_ms(50) + alvik.set_wheels_speed(30 - control, 30 + control) + sleep_ms(100) -while not alvik.get_touch_ok(): - sleep_ms(50) -try: +if __name__ == "__main__": + + alvik = ArduinoAlvik() + alvik.begin() + + alvik.left_led.set_color(0, 0, 1) + alvik.right_led.set_color(0, 0, 1) + + while alvik.get_touch_ok(): + sleep_ms(50) + + while not alvik.get_touch_ok(): + sleep_ms(50) + while True: - while not alvik.get_touch_cancel(): - - line_sensors = alvik.get_line_sensors() - print(f' {line_sensors}') - - error = calculate_center(*line_sensors) - control = error * kp - - if control > 0.2: - alvik.left_led.set_color(1, 0, 0) - alvik.right_led.set_color(0, 0, 0) - elif control < -0.2: - alvik.left_led.set_color(1, 0, 0) - alvik.right_led.set_color(0, 0, 0) - else: - alvik.left_led.set_color(0, 1, 0) - alvik.right_led.set_color(0, 1, 0) - - alvik.set_wheels_speed(30 - control, 30 + control) - sleep_ms(100) - - while not alvik.get_touch_ok(): - alvik.left_led.set_color(0, 0, 1) - alvik.right_led.set_color(0, 0, 1) - alvik.brake() - sleep_ms(100) - -except KeyboardInterrupt as e: - print('over') - alvik.stop() - sys.exit() + try: + while not alvik.get_touch_cancel(): + run_line_follower(alvik) + + while not alvik.get_touch_ok(): + alvik.left_led.set_color(0, 0, 1) + alvik.right_led.set_color(0, 0, 1) + alvik.brake() + sleep_ms(100) + + except KeyboardInterrupt as e: + print('over') + alvik.stop() + break diff --git a/examples/demo/touch_move.py b/examples/demo/touch_move.py index b51e4ca..728cc03 100644 --- a/examples/demo/touch_move.py +++ b/examples/demo/touch_move.py @@ -1,17 +1,8 @@ from arduino_alvik import ArduinoAlvik from time import sleep_ms -import sys -alvik = ArduinoAlvik() -alvik.begin() -alvik.left_led.set_color(1, 0, 0) -alvik.right_led.set_color(1, 0, 0) - -movements = [] - - -def blink(): +def blink(alvik): alvik.left_led.set_color(1, 0, 1) alvik.right_led.set_color(1, 0, 1) sleep_ms(200) @@ -19,27 +10,25 @@ def blink(): alvik.right_led.set_color(1, 0, 0) -def add_movement(): - global movements - +def add_movement(alvik, movements): if alvik.get_touch_up(): movements.append('forward') - blink() + blink(alvik) while alvik.get_touch_up(): sleep_ms(100) if alvik.get_touch_down(): movements.append('backward') - blink() + blink(alvik) while alvik.get_touch_down(): sleep_ms(100) if alvik.get_touch_left(): movements.append('left') - blink() + blink(alvik) while alvik.get_touch_left(): sleep_ms(100) if alvik.get_touch_right(): movements.append('right') - blink() + blink(alvik) while alvik.get_touch_right(): sleep_ms(100) if alvik.get_touch_cancel(): @@ -53,7 +42,7 @@ def add_movement(): sleep_ms(100) -def run_movement(movement): +def run_movement(alvik, movement): if movement == 'forward': alvik.move(10, blocking=False) if movement == 'backward': @@ -70,33 +59,45 @@ def run_movement(movement): alvik.right_led.set_color(0, 0, 0) sleep_ms(100) -while alvik.get_touch_ok(): - sleep_ms(50) -while not (alvik.get_touch_ok() and len(movements) != 0): - add_movement() - sleep_ms(50) +def run_touch_move(alvik) -> int: + movements = [] + while not (alvik.get_touch_ok() and len(movements) != 0): + if alvik.get_touch_cancel(): + if len(movements) == 0: + return -1 + movements.clear() + blink(alvik) + alvik.left_led.set_color(1, 0, 0) + alvik.right_led.set_color(1, 0, 0) + alvik.brake() + add_movement(alvik, movements) + sleep_ms(100) -try: - while True: - alvik.left_led.set_color(0, 0, 0) - alvik.right_led.set_color(0, 0, 0) - for move in movements: - run_movement(move) - if alvik.get_touch_cancel(): - break + alvik.left_led.set_color(0, 0, 0) + alvik.right_led.set_color(0, 0, 0) + for move in movements: + run_movement(alvik, move) + if alvik.get_touch_cancel(): + movements.clear() + blink(alvik) + sleep_ms(100) + return 1 - movements = [] - while not (alvik.get_touch_ok() and len(movements) != 0): - alvik.left_led.set_color(1, 0, 0) - alvik.right_led.set_color(1, 0, 0) - alvik.brake() - add_movement() - sleep_ms(100) -except KeyboardInterrupt as e: - print('over') - alvik.stop() - sys.exit() +if __name__ == "__main__": + alvik = ArduinoAlvik() + alvik.begin() + + alvik.left_led.set_color(1, 0, 0) + alvik.right_led.set_color(1, 0, 0) + + while True: + try: + run_touch_move(alvik) + except KeyboardInterrupt as e: + print('over') + alvik.stop() + break diff --git a/examples/events/motion_events.py b/examples/events/motion_events.py index f7edf01..b0f8146 100644 --- a/examples/events/motion_events.py +++ b/examples/events/motion_events.py @@ -1,6 +1,5 @@ from arduino_alvik import ArduinoAlvik from time import sleep -import sys def toggle_value(): @@ -49,4 +48,4 @@ def simple_print(custom_text: str = '') -> None: except KeyboardInterrupt as e: print('over') alvik.stop() - sys.exit() + break diff --git a/examples/events/timer_one_shot_events.py b/examples/events/timer_one_shot_events.py index 8ab8a99..487c4fb 100644 --- a/examples/events/timer_one_shot_events.py +++ b/examples/events/timer_one_shot_events.py @@ -1,17 +1,5 @@ from arduino_alvik import ArduinoAlvik from time import sleep -import sys - - -def toggle_value(): - """ - This function yields a generator object that toggles values between 0 and 1. - :return: - """ - value = 0 - while True: - yield value % 2 - value += 1 def toggle_left_led(custom_text: str, val) -> None: @@ -21,13 +9,12 @@ def toggle_left_led(custom_text: str, val) -> None: :param val: a toggle signal generator :return: """ - led_val = next(val) - alvik.left_led.set_color(led_val, 0, 0) - print(f"RED {'ON' if led_val else 'OFF'}! {custom_text}") + alvik.left_led.set_color(val, 0, 0) + print(f"LEFT LED -> RED {'ON' if val else 'OFF'}! {custom_text}") alvik = ArduinoAlvik() -alvik.set_timer('one_shot', 10000, toggle_left_led, ("10 seconds have passed... I won't do this again", toggle_value(), )) +alvik.set_timer('one_shot', 10000, toggle_left_led, ("10 seconds have passed... I won't do this again", 1, )) alvik.begin() @@ -68,4 +55,4 @@ def toggle_left_led(custom_text: str, val) -> None: except KeyboardInterrupt as e: print('over') alvik.stop() - sys.exit() + break \ No newline at end of file diff --git a/examples/events/timer_periodic_events.py b/examples/events/timer_periodic_events.py index fd5aa28..d56e90c 100644 --- a/examples/events/timer_periodic_events.py +++ b/examples/events/timer_periodic_events.py @@ -1,6 +1,5 @@ from arduino_alvik import ArduinoAlvik from time import sleep -import sys def toggle_value(): @@ -67,4 +66,4 @@ def toggle_left_led(custom_text: str, val) -> None: except KeyboardInterrupt as e: print('over') alvik.stop() - sys.exit() + break diff --git a/examples/events/touch_events.py b/examples/events/touch_events.py index 9ef35e3..db0d6c1 100644 --- a/examples/events/touch_events.py +++ b/examples/events/touch_events.py @@ -1,6 +1,5 @@ from arduino_alvik import ArduinoAlvik from time import sleep -import sys def toggle_value(): @@ -67,4 +66,4 @@ def simple_print(custom_text: str = '') -> None: except KeyboardInterrupt as e: print('over') alvik.stop() - sys.exit() + break diff --git a/examples/flash_firmware.py b/examples/flash_firmware.py index a3327da..b98fba8 100644 --- a/examples/flash_firmware.py +++ b/examples/flash_firmware.py @@ -1,4 +1,18 @@ -# from machine import reset +import sys + + +def reload_modules(): + to_be_reloaded = [] + + for m in sys.modules: + to_be_reloaded.append(m) + del sys.modules[m] + + for m in to_be_reloaded: + exec(f'import {m}') + + +reload_modules() from arduino_alvik import update_firmware # this is a patch to fix possible running threads on Alvik @@ -6,5 +20,4 @@ alvik = ArduinoAlvik() alvik.stop() -update_firmware('./firmware.bin') -# reset() \ No newline at end of file +update_firmware('/firmware.bin') diff --git a/examples/sensors/read_color_sensor.py b/examples/sensors/read_color_sensor.py index 462826c..0c92871 100644 --- a/examples/sensors/read_color_sensor.py +++ b/examples/sensors/read_color_sensor.py @@ -1,6 +1,6 @@ from arduino_alvik import ArduinoAlvik from time import sleep_ms -import sys + alvik = ArduinoAlvik() alvik.begin() @@ -15,4 +15,4 @@ except KeyboardInterrupt as e: print('over') alvik.stop() - sys.exit() + break diff --git a/examples/sensors/read_imu.py b/examples/sensors/read_imu.py index 3c6589b..7c0d984 100644 --- a/examples/sensors/read_imu.py +++ b/examples/sensors/read_imu.py @@ -1,6 +1,6 @@ from arduino_alvik import ArduinoAlvik from time import sleep_ms -import sys + alvik = ArduinoAlvik() alvik.begin() @@ -14,4 +14,4 @@ except KeyboardInterrupt as e: print('over') alvik.stop() - sys.exit() + break diff --git a/examples/sensors/read_orientation.py b/examples/sensors/read_orientation.py index 23cf006..33b0113 100644 --- a/examples/sensors/read_orientation.py +++ b/examples/sensors/read_orientation.py @@ -1,6 +1,6 @@ from arduino_alvik import ArduinoAlvik from time import sleep_ms -import sys + alvik = ArduinoAlvik() alvik.begin() @@ -13,4 +13,4 @@ except KeyboardInterrupt as e: print('over') alvik.stop() - sys.exit() + break diff --git a/examples/sensors/read_tof.py b/examples/sensors/read_tof.py index 990bf63..20d37f0 100644 --- a/examples/sensors/read_tof.py +++ b/examples/sensors/read_tof.py @@ -1,6 +1,6 @@ from arduino_alvik import ArduinoAlvik from time import sleep_ms -import sys + alvik = ArduinoAlvik() alvik.begin() @@ -15,4 +15,4 @@ except KeyboardInterrupt as e: print('over') alvik.stop() - sys.exit() + break diff --git a/examples/sensors/read_touch.py b/examples/sensors/read_touch.py index 21c5ebb..6a627df 100644 --- a/examples/sensors/read_touch.py +++ b/examples/sensors/read_touch.py @@ -1,6 +1,6 @@ from arduino_alvik import ArduinoAlvik from time import sleep_ms -import sys + alvik = ArduinoAlvik() alvik.begin() @@ -27,4 +27,4 @@ except KeyboardInterrupt as e: print('over') alvik.stop() - sys.exit() + break diff --git a/examples/tests/message_reader.py b/examples/tests/message_reader.py index 7ae24e1..d2eb283 100644 --- a/examples/tests/message_reader.py +++ b/examples/tests/message_reader.py @@ -1,6 +1,6 @@ from arduino_alvik import ArduinoAlvik from time import sleep_ms -import sys + alvik = ArduinoAlvik() alvik.begin() @@ -25,5 +25,5 @@ except KeyboardInterrupt as e: print('over') alvik.stop() - sys.exit() + break diff --git a/examples/tests/test_idle.py b/examples/tests/test_idle.py index f65625a..1c26a97 100644 --- a/examples/tests/test_idle.py +++ b/examples/tests/test_idle.py @@ -1,6 +1,6 @@ from arduino_alvik import ArduinoAlvik from time import sleep_ms -import sys + alvik = ArduinoAlvik() alvik.begin() @@ -19,5 +19,5 @@ except KeyboardInterrupt as e: print('over') alvik.stop() - sys.exit() + break diff --git a/examples/tests/test_meas_units.py b/examples/tests/test_meas_units.py index 468073d..3938a56 100644 --- a/examples/tests/test_meas_units.py +++ b/examples/tests/test_meas_units.py @@ -1,124 +1,122 @@ from arduino_alvik import ArduinoAlvik from time import sleep_ms -import sys + alvik = ArduinoAlvik() alvik.begin() -while True: - try: - - # -- LINEAR MOVEMENTS -- - - print("Move fw 0.05 m") - alvik.move(0.05, unit='m') - sleep_ms(2000) - - print("Move fw 10 cm") - alvik.move(5, unit='cm') - sleep_ms(2000) - - print("Move bw 100 mm") - alvik.move(-100, unit='mm') - sleep_ms(2000) - - print("Move fw 1 inch") - alvik.move(1, unit='in') - sleep_ms(2000) - - print(f"Current position: {alvik.get_pose()}") - alvik.reset_pose(0, 0, theta=3.1415, angle_unit='rad') - sleep_ms(2000) - - print(f"Current position: {alvik.get_pose()}") - - # -- WHEEL ROTATIONS -- - alvik.right_wheel.reset() - sleep_ms(2000) - curr_pos = alvik.right_wheel.get_position() - print(f'R wheel pos: {curr_pos}') - sleep_ms(2000) - - print("Rotate right wheel 25% fw") - alvik.right_wheel.set_position(25, unit='%') - sleep_ms(2000) - curr_pos = alvik.right_wheel.get_position() - print(f'R wheel pos: {curr_pos}') - - print("Rotate right wheel 90 deg bw") - alvik.right_wheel.set_position(-90, unit='deg') - sleep_ms(2000) - curr_pos = alvik.right_wheel.get_position() - print(f'R wheel pos: {curr_pos}') - - print("Rotate right wheel pi rad fw") - alvik.right_wheel.set_position(3.14, unit='rad') - sleep_ms(2000) - curr_pos = alvik.right_wheel.get_position() - print(f'R wheel pos: {curr_pos}') - - print("Rotate right wheel a quarter revolution bw") - alvik.right_wheel.set_position(-0.25, unit='rev') - sleep_ms(2000) - curr_pos = alvik.right_wheel.get_position() - print(f'R wheel pos: {curr_pos}') - - # -- WHEELS SPEED -- - print("Set speed 50% max_rpm (35.0 rpm)") - alvik.set_wheels_speed(50, 50, '%') - sleep_ms(1000) - print(f"Current speed is {alvik.get_wheels_speed()} rpm") - - print("Set speed 12 rpm (1 rev in 5 sec)") - alvik.set_wheels_speed(12, 12, 'rpm') - sleep_ms(1000) - print(f"Current speed is {alvik.get_wheels_speed()} rpm") - - print("Set speed -pi rad/s (1 back rev in 2 sec)") - alvik.set_wheels_speed(-3.1415, -3.1415, 'rad/s') - sleep_ms(1000) - print(f"Current speed is {alvik.get_wheels_speed()} rpm") - - print("Set speed 180 deg/s (1 back rev in 2 sec)") - alvik.set_wheels_speed(180, 180, 'deg/s') - sleep_ms(1000) - print(f"Current speed is {alvik.get_wheels_speed()} rpm") - - # -- DRIVE -- - print("Driving at 10 mm/s (expecting approx 5.6 rpm 64 deg/s)") - alvik.drive(10, 20, linear_unit='mm/s', angular_unit='%') - sleep_ms(2000) - print(f"Current speed is {alvik.get_drive_speed()} (mm/s, deg/s))") - - print("Driving at 10 mm/s (expecting approx 5.6 rpm)") - alvik.drive(10, 0, linear_unit='mm/s') - sleep_ms(2000) - print(f"Current speed is {alvik.get_wheels_speed()} rpm") - - print("Driving at 2 cm/s (expecting approx 11.2 rpm)") - alvik.drive(2, 0, linear_unit='cm/s') - sleep_ms(2000) - print(f"Current speed is {alvik.get_wheels_speed()} rpm") - - print("Driving at 1 in/s (expecting approx 14 rpm)") - alvik.drive(1, 0, linear_unit='in/s') - sleep_ms(2000) - print(f"Current speed is {alvik.get_wheels_speed()} rpm") - - print("Driving at 5 mm/s (expecting approx 5.6 rpm) pi/8 rad/s (22.5 deg/s)") - alvik.drive(5, 3.1415/8, linear_unit='mm/s', angular_unit='rad/s') - sleep_ms(2000) - print(f"Current speed is {alvik.get_drive_speed()} (mm/s) (rpm)") - - print("Driving at 5 mm/s (expecting approx 5.6 rpm) 1/8 rev/s (45 deg/s)") - alvik.drive(5, 1/8, linear_unit='mm/s', angular_unit='rev/s') - sleep_ms(2000) - print(f"Current speed is {alvik.get_drive_speed()} (mm/s) (rpm)") - - alvik.stop() - sys.exit() - - except KeyboardInterrupt as e: - print('over') - alvik.stop() - sys.exit() +try: + + # -- LINEAR MOVEMENTS -- + + print("Move fw 0.05 m") + alvik.move(0.05, unit='m') + sleep_ms(2000) + + print("Move fw 10 cm") + alvik.move(5, unit='cm') + sleep_ms(2000) + + print("Move bw 100 mm") + alvik.move(-100, unit='mm') + sleep_ms(2000) + + print("Move fw 1 inch") + alvik.move(1, unit='in') + sleep_ms(2000) + + print(f"Current position: {alvik.get_pose()}") + alvik.reset_pose(0, 0, theta=3.1415, angle_unit='rad') + sleep_ms(2000) + + print(f"Current position: {alvik.get_pose()}") + + # -- WHEEL ROTATIONS -- + alvik.right_wheel.reset() + sleep_ms(2000) + curr_pos = alvik.right_wheel.get_position() + print(f'R wheel pos: {curr_pos}') + sleep_ms(2000) + + print("Rotate right wheel 25% fw") + alvik.right_wheel.set_position(25, unit='%') + sleep_ms(2000) + curr_pos = alvik.right_wheel.get_position() + print(f'R wheel pos: {curr_pos}') + + print("Rotate right wheel 90 deg bw") + alvik.right_wheel.set_position(-90, unit='deg') + sleep_ms(2000) + curr_pos = alvik.right_wheel.get_position() + print(f'R wheel pos: {curr_pos}') + + print("Rotate right wheel pi rad fw") + alvik.right_wheel.set_position(3.14, unit='rad') + sleep_ms(2000) + curr_pos = alvik.right_wheel.get_position() + print(f'R wheel pos: {curr_pos}') + + print("Rotate right wheel a quarter revolution bw") + alvik.right_wheel.set_position(-0.25, unit='rev') + sleep_ms(2000) + curr_pos = alvik.right_wheel.get_position() + print(f'R wheel pos: {curr_pos}') + + # -- WHEELS SPEED -- + print("Set speed 50% max_rpm (35.0 rpm)") + alvik.set_wheels_speed(50, 50, '%') + sleep_ms(1000) + print(f"Current speed is {alvik.get_wheels_speed()} rpm") + + print("Set speed 12 rpm (1 rev in 5 sec)") + alvik.set_wheels_speed(12, 12, 'rpm') + sleep_ms(1000) + print(f"Current speed is {alvik.get_wheels_speed()} rpm") + + print("Set speed -pi rad/s (1 back rev in 2 sec)") + alvik.set_wheels_speed(-3.1415, -3.1415, 'rad/s') + sleep_ms(1000) + print(f"Current speed is {alvik.get_wheels_speed()} rpm") + + print("Set speed 180 deg/s (1 back rev in 2 sec)") + alvik.set_wheels_speed(180, 180, 'deg/s') + sleep_ms(1000) + print(f"Current speed is {alvik.get_wheels_speed()} rpm") + + # -- DRIVE -- + print("Driving at 10 mm/s (expecting approx 5.6 rpm 64 deg/s)") + alvik.drive(10, 20, linear_unit='mm/s', angular_unit='%') + sleep_ms(2000) + print(f"Current speed is {alvik.get_drive_speed()} (mm/s, deg/s))") + + print("Driving at 10 mm/s (expecting approx 5.6 rpm)") + alvik.drive(10, 0, linear_unit='mm/s') + sleep_ms(2000) + print(f"Current speed is {alvik.get_wheels_speed()} rpm") + + print("Driving at 2 cm/s (expecting approx 11.2 rpm)") + alvik.drive(2, 0, linear_unit='cm/s') + sleep_ms(2000) + print(f"Current speed is {alvik.get_wheels_speed()} rpm") + + print("Driving at 1 in/s (expecting approx 14 rpm)") + alvik.drive(1, 0, linear_unit='in/s') + sleep_ms(2000) + print(f"Current speed is {alvik.get_wheels_speed()} rpm") + + print("Driving at 5 mm/s (expecting approx 5.6 rpm) pi/8 rad/s (22.5 deg/s)") + alvik.drive(5, 3.1415/8, linear_unit='mm/s', angular_unit='rad/s') + sleep_ms(2000) + print(f"Current speed is {alvik.get_drive_speed()} (mm/s) (rpm)") + + print("Driving at 5 mm/s (expecting approx 5.6 rpm) 1/8 rev/s (45 deg/s)") + alvik.drive(5, 1/8, linear_unit='mm/s', angular_unit='rev/s') + sleep_ms(2000) + print(f"Current speed is {alvik.get_drive_speed()} (mm/s) (rpm)") + +except KeyboardInterrupt as e: + print('Test interrupted') + +finally: + alvik.stop() + print('END of measurement units test') diff --git a/examples/tests/test_version.py b/examples/tests/test_version.py index 1682316..52c0660 100644 --- a/examples/tests/test_version.py +++ b/examples/tests/test_version.py @@ -1,6 +1,6 @@ from arduino_alvik import ArduinoAlvik from time import sleep_ms -import sys + alvik = ArduinoAlvik() @@ -16,4 +16,4 @@ except KeyboardInterrupt as e: print('over') alvik.stop() - sys.exit() \ No newline at end of file + break \ No newline at end of file diff --git a/package.json b/package.json index 2bc1cd9..134ac1b 100644 --- a/package.json +++ b/package.json @@ -10,8 +10,8 @@ ["arduino_alvik/stm32_flash.py", "github:arduino/arduino-alvik-mpy/arduino_alvik/stm32_flash.py"] ], "deps": [ - ["github:arduino/ucPack-mpy", "0.1.6"], + ["github:arduino/ucPack-mpy", "0.1.7"], ["github:arduino/arduino-runtime-mpy", "0.4.0"] ], - "version": "1.1.1" + "version": "1.1.2" }