from contextlib import contextmanager from components import AStirrer import time import serial class StirrerPololu1376(AStirrer): def name(self): return "Pololu1376" def __init__(self, params): AStirrer.__init__(self, params['dt']) self.isMasterOn = 0 self.ser_speed = params['speed'] self.ser_port = params['port'] self.ser = serial.Serial(self.ser_port, self.ser_speed) self.ser.set_output_flow_control(False) try: self.ser.open() except serial.SerialException: self.ser.close() self.ser.open() self.ser_send('V') self.ser_recv() self.activate(False) @contextmanager def remote_open(self): try: self.activate(True) yield None finally: self.activate(False) def ser_send(self, cmd): self.ser.write((cmd + '\r\n').encode()) def ser_recv(self): data = self.ser.readline().decode("utf-8").replace("\n", '').replace("\r", '') return data def get_speed(self): if self.isOn and self.is_activated(): return self.speed return 0 def activate(self, enable): print("activate {}".format(enable)) if enable: self.ser_send("go") else: self.ser_send("X") def on_set_speed(self, speed): self.ser_send("F" + str(int(speed)) + "%") print("Set speed to {} %".format(speed)) if __name__ == '__main__': s = StirrerPololu1376({'dt': 1.0, 'port': "/dev/ttyACM0", 'speed': 115200}) with s.remote_open(): print("Set some speeds") s.set_speed(50) time.sleep(2) s.set_speed(20) time.sleep(2) s.set_speed(50) time.sleep(2) print("Pulsed operation, duty cycle = 50%") s.set_duty_cycle(0.5) s.set_cycle_time(10) for i in range(1, 30): s.process() time.sleep(1) print("Pulsed operation, duty cycle = 20%") s.set_duty_cycle(0.2) s.set_cycle_time(10) for i in range(1, 30): s.process() time.sleep(1) print("Continious operation") s.set_duty_cycle(1.0) s.set_speed(50) time.sleep(3.0) print("Leaving context")