class Board(SerializableModel): pk = None port = None pins = None name = None written_pins = set() json_export = ("pk", "port", "pins", "url") def __init__(self, pk, port, layout=DEFAULT_LAYOUT, *args, **kwargs): self.pk = pk self.port = port self._board = FirmataBoard(self.port, layout) self.pins = { "analog": dict(((pin.pin_number, Pin(pk, pin.pin_number, type="analog")) for pin in self._board.analog)), "digital": dict(((pin.pin_number, Pin(pk, pin.pin_number, type="digital")) for pin in self._board.digital)), } [setattr(self, k, v) for k, v in kwargs.items()] super(Board, self).__init__(*args, **kwargs) def __del__(self): try: self.disconnect() except: print(traceback.format_exc()) @property def url(self): return "/%s/boards/%s/" % (API_VERSION, self.pk) def disconnect(self): for pin in self.written_pins: pin.write(0) return self._board.exit() def get_pin(self, identifier): a_d = identifier[0] == "a" and "analog" or "digital" pin_nr = int(identifier[1:]) return self.pins[a_d][pin_nr] def firmata_pin(self, firmata_identifier): return self._board.get_pin(firmata_identifier) def release_pin(self, firmata_identifier): bits = firmata_identifier.split(":") a_d = bits[0] == "a" and "analog" or "digital" pin_nr = int(bits[1]) self._board.taken[a_d][pin_nr] = False
class servoFirmataTest: def __init__(self, comPort, pinNumbers): assert len(pinNumbers) > 0, "Parameter pinNumbers has to contain at least one number" assert type(pinNumbers[0]) is int and type(pinNumbers[1]) is int, "pinNumbers must contain integers" self.arduino = Board(comPort, boards.BOARDS["arduino_due"]) if(len(pinNumbers)>1): self.pins = pinNumbers[:2] else: self.pins = pinNumbers self.servos = servoFirmata.servoFirmata(self.arduino, self.pins, [90,90]) time.sleep(2) def execute(self): print("Servo zero to pos 0") self.servos.setPosition(0, 0) time.sleep(3) print("Servo one to pos 0") self.servos.setPosition(1, 0) time.sleep(3) print("Servo zero and one to pos 90") self.servos.setPosition(0, 90) self.servos.setPosition(1, 90) time.sleep(3) print("Test complete") self.arduino.exit() return True
# draw the servo exes line for every servo cv.line(frame, servoPos1, (int(p1[0]), int(p1[1])), (255, 0, 0), 1) cv.line(frame, servoPos2, (int(p2[0]), int(p2[1])), (255, 0, 0), 1) cv.line(frame, servoPos3, (int(p3[0]), int(p3[1])), (255, 0, 0), 1) else: #-----------------------------run program withoud debug info and lines---------------------------------------------------- if position is not False: # update the servo positions servo1.update(position[2]) servo2.update(position[2]) servo3.update(position[2]) else: # tracking error, set servo's to initial positions, and print message servoFirmata1.setPosition(0, 90) servoFirmata2.setPosition(0, 90) servoFirmata3.setPosition(0, 90) print("tracking error") # update the GUI GUI.update(position, frame, targetPosition) # Exit if ESC pressed k = cv.waitKey(1) & 0xff if k == 27: # set the servo's to the down position servoFirmata1.setPosition(0, 90) servoFirmata2.setPosition(0, 90) servoFirmata3.setPosition(0, 90) arduino.exit() break