From b4a774b2b9487bbf43e8e4d181959638b1b5d4d4 Mon Sep 17 00:00:00 2001 From: Marcus Nordstrom Date: Sun, 13 Apr 2025 20:15:23 +0200 Subject: [PATCH] WIP: add stub for PWM driver using pyserial --- main.py | 14 +++++++++++--- pwm_driver.py | 43 +++++++++++++++++++++++++++++++++++++++++++ requirements.txt | 3 ++- 3 files changed, 56 insertions(+), 4 deletions(-) create mode 100644 pwm_driver.py diff --git a/main.py b/main.py index a2c107c..d172a49 100755 --- a/main.py +++ b/main.py @@ -1,6 +1,7 @@ #! /usr/bin/env python from argparse import ArgumentParser from gcode_parser import GCodeParser +from pwm_driver import PWMDriver from visualizer import Visualizer # A4 @@ -12,12 +13,19 @@ if __name__ == "__main__": argparser.add_argument("-f", "--file", type=str) argparser.add_argument("-W", "--width", type=float, default=WIDTH_MM, required=False) argparser.add_argument("-H", "--height", type=float, default=HEIGHT_MM, required=False) + argparser.add_argument("-V", "--visualize", action="store_true", default=False, required=False) + argparser.add_argument("-P", "--port", type=str, default=None) args = argparser.parse_args() parser = GCodeParser(args.file) positions = parser.get_positions() - screen_dimensions = (1024*1.5, 1024*1.5 * HEIGHT_MM/WIDTH_MM) - visualizer = Visualizer(positions, screen_dimensions, (args.width, args.height)) - visualizer.visualize() \ No newline at end of file + if args.visualize: + screen_dimensions = (1024*1.5, 1024*1.5 * HEIGHT_MM/WIDTH_MM) + visualizer = Visualizer(positions, screen_dimensions, (args.width, args.height)) + visualizer.visualize() + + if args.port: + pwm = PWMDriver(positions, (args.width, args.height), args.port) + pwm.run() \ No newline at end of file diff --git a/pwm_driver.py b/pwm_driver.py new file mode 100644 index 0000000..7965acb --- /dev/null +++ b/pwm_driver.py @@ -0,0 +1,43 @@ + +class PWMDriver(): + def __init__(self, positions : list[tuple[float, float, float]], gcode_size : tuple[float, float], port : str, baudrate : int = 115200) -> None: + self.positions = positions + self.gcode_size = gcode_size + self.port = port + self.baudrate = baudrate + self._init_pwm() + + def _init_pwm(self) -> None: + from serial import Serial + pass + #self.serial = Serial(self.port, self.baudrate) + + def _send_position(self, pos : tuple[float, float, float]) -> None: + x, y, z = pos + # Convert coordinates to PWM values + precision = ((2 ** 16) - 1) + pwm_x : int = int(x / self.gcode_size[0] * precision) + pwm_y : int = int(y / self.gcode_size[1] * precision) + pen : int = 1 if z < 0 else 0 + + # Send PWM values to the serial port + print(f"Sending PWM values: X={pwm_x:<5}, Y={pwm_y:<5}, Pen={pen}") + #self.serial.write(f"{pwm_x},{pwm_y},{pen}\n".encode()) + + def _position_reached(self) -> bool: + # Check if the position has been reached + from time import sleep + sleep(0.5) + return True + # return self.serial.readline().decode().strip() == "OK" + + def _wait_for_position(self) -> None: + # Wait until the position is reached + while not self._position_reached(): + pass + + def run(self) -> None: + for pos in self.positions: + self._send_position(pos) + self._wait_for_position() + print("All positions sent successfully.") \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 7a7c6a7..d06d8c8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,4 @@ pygame==2.6.1 pygcode==0.2.1 -colorama==0.4.6 \ No newline at end of file +colorama==0.4.6 +pyserial \ No newline at end of file