WIP: add stub for PWM driver using pyserial

This commit is contained in:
2025-04-13 20:15:23 +02:00
parent 3acbff18e7
commit b4a774b2b9
3 changed files with 56 additions and 4 deletions

View File

@@ -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()
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()

43
pwm_driver.py Normal file
View File

@@ -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.")

View File

@@ -1,3 +1,4 @@
pygame==2.6.1
pygcode==0.2.1
colorama==0.4.6
pyserial