This shows you the differences between two versions of the page.
— |
arduino-py [2015/04/28 13:30] (current) zoza created |
||
---|---|---|---|
Line 1: | Line 1: | ||
+ | ====== arduino.py library, for serial communication ====== | ||
+ | <code python> | ||
+ | #!/usr/bin/env python | ||
+ | |||
+ | import serial, time | ||
+ | DEBUG=True | ||
+ | READ=0 #read | ||
+ | WRITE=1 #write | ||
+ | class Servo: | ||
+ | def __init__(self, pin, board, number=0): | ||
+ | self.pin = pin | ||
+ | self.board=board | ||
+ | self.number=number | ||
+ | def attach(self): | ||
+ | if self.board.sendCmd('S', 5, self.number, self.pin, 0)=='0': | ||
+ | return True | ||
+ | print "Servo: Error attach %s" % self.pin | ||
+ | return False | ||
+ | def detach(self): | ||
+ | if self.board.sendCmd('S', 9, self.number, self.pin, 0)=='0': | ||
+ | return True | ||
+ | print "Servo: Error detach %s" % self.pin | ||
+ | return False | ||
+ | def attached(self): | ||
+ | if self.board.sendCmd('S', 8, self.number, self.pin, 0)=='1': | ||
+ | return True | ||
+ | return False | ||
+ | def write(self,value): | ||
+ | if self.board.sendCmd('S', 6, self.number, self.pin, value)=='0': | ||
+ | return True | ||
+ | print "Servo: Error write %s = %s" % (self.pin,value) | ||
+ | return False | ||
+ | def read(self): | ||
+ | return self.board.sendCmd('S', 7, self.number, self.pin, 0) | ||
+ | |||
+ | class Arduino(object): | ||
+ | |||
+ | __OUTPUT_PINS = -1 | ||
+ | |||
+ | def __init__(self, port, baudrate=9600): | ||
+ | self.serial = serial.Serial(port, baudrate) | ||
+ | self.servo_index=0 | ||
+ | | ||
+ | def init(self): | ||
+ | self.sendCmd('I',) | ||
+ | |||
+ | def __str__(self): | ||
+ | return "Arduino is on port %s at %d baudrate" %(self.serial.port, self.serial.baudrate) | ||
+ | |||
+ | def attachServo(self,pin): | ||
+ | s = Servo(pin,self,self.servo_index) | ||
+ | s.attach() | ||
+ | self.servo_index+=1 | ||
+ | return s | ||
+ | | ||
+ | def getServo(self,pin,number): | ||
+ | ''' number - index of serv[] array ''' | ||
+ | return Servo(pin,self,number) | ||
+ | |||
+ | def output(self, pinArray): | ||
+ | if(isinstance(pinArray, list) or isinstance(pinArray, tuple)): | ||
+ | self.__OUTPUT_PINS = pinArray | ||
+ | for each_pin in pinArray: | ||
+ | self.sendCmd('C',each_pin,1) | ||
+ | return True | ||
+ | |||
+ | def setLow(self, pin): | ||
+ | self.sendCmd('D',WRITE,pin,0) | ||
+ | return True | ||
+ | |||
+ | def setHigh(self, pin): | ||
+ | self.sendCmd('D',WRITE,pin,1) | ||
+ | return True | ||
+ | |||
+ | def getState(self, pin): | ||
+ | return self.__formatPinState(self.sendCmd('D',READ,pin)) | ||
+ | |||
+ | def analogWrite(self, pin, value): | ||
+ | self.sendCmd('A',WRITE,pin,value) | ||
+ | return True | ||
+ | |||
+ | def analogRead(self, pin): | ||
+ | return int(self.sendCmd('A',READ,pin)) | ||
+ | |||
+ | def turnOff(self): | ||
+ | for each_pin in self.__OUTPUT_PINS: | ||
+ | self.setLow(each_pin) | ||
+ | return True | ||
+ | |||
+ | def sendCmd(self, *args): | ||
+ | line="" | ||
+ | for arg in args: | ||
+ | line = line + "%s " % arg | ||
+ | #print "dbg:sendCmd('%s!')" % line | ||
+ | self.serial.write("%s!" % line) | ||
+ | self.serial.flush() | ||
+ | res = self.serial.readline().replace("\r\n","") | ||
+ | if DEBUG: | ||
+ | print "dbg:sendCmd('%s!')=%s" % (line, res) | ||
+ | return res | ||
+ | |||
+ | def __formatPinState(self, pinValue): | ||
+ | if pinValue=='1': | ||
+ | return True | ||
+ | else: | ||
+ | return False | ||
+ | |||
+ | def close(self): | ||
+ | self.serial.close() | ||
+ | return True | ||
+ | |||
+ | def __del__(self): | ||
+ | #close serial connection once program ends | ||
+ | #this fixes the problem of port getting locked or unrecoverable in some linux systems | ||
+ | self.serial.close() | ||
+ | </code> |