4 Commits
Mk1 ... mk2

Author SHA1 Message Date
shrkey
3d5543e135 Brought inline with escape code 2016-04-03 14:04:44 +01:00
shrkey
f05b4403be Added updates for getPWM and correctionFactor 2016-04-03 13:02:12 +01:00
shrkey
3511873a7c Removed Mk1 2016-02-28 21:46:41 +00:00
shrkey
ffeabbe0d8 Updated for Mk2 2016-02-28 21:46:00 +00:00
3 changed files with 63 additions and 19 deletions

View File

@@ -1,4 +1,4 @@
640 Mk1 Python driver
640 Python driver
=======================
Based on the [Adafruit Python Library for DC + Stepper Motor HAT](https://github.com/adafruit/Adafruit-Motor-HAT-Python-Library)

View File

@@ -50,13 +50,13 @@ class PWM :
self.i2c.write8(self.__MODE2, self.__OUTDRV)
self.i2c.write8(self.__MODE1, self.__ALLCALL)
time.sleep(0.005) # wait for oscillator
mode1 = self.i2c.readU8(self.__MODE1)
mode1 = mode1 & ~self.__SLEEP # wake up (reset sleep)
self.i2c.write8(self.__MODE1, mode1)
time.sleep(0.005) # wait for oscillator
def setPWMFreq(self, freq):
def setPWMFreq(self, freq, correctionFactor=1.0):
"Sets the PWM frequency"
prescaleval = 25000000.0 # 25MHz
prescaleval /= 4096.0 # 12-bit
@@ -65,7 +65,7 @@ class PWM :
if (self.debug):
print "Setting PWM frequency to %d Hz" % freq
print "Estimated pre-scale: %d" % prescaleval
prescale = math.floor(prescaleval + 0.5)
prescale = round(prescaleval * correctionFactor + 0.5)
if (self.debug):
print "Final pre-scale: %d" % prescale
@@ -77,6 +77,57 @@ class PWM :
time.sleep(0.005)
self.i2c.write8(self.__MODE1, oldmode | 0x80)
def setPWMFreqMin(self, freq, correctionFactor=1.0):
"Sets the PWM frequency"
prescaleval = 25000000.0 # 25MHz
prescaleval /= 4096.0 # 12-bit
prescaleval /= float(freq)
prescaleval -= 1.0
if (self.debug):
print "Setting PWM frequency to %d Hz" % freq
print "Estimated pre-scale: %d" % prescaleval
prescale = math.floor(prescaleval * correctionFactor + 0.5)
if (self.debug):
print "Final pre-scale: %d" % prescale
oldmode = self.i2c.readU8(self.__MODE1);
newmode = (oldmode & 0x7F) | 0x10 # sleep
self.i2c.write8(self.__MODE1, newmode) # go to sleep
self.i2c.write8(self.__PRESCALE, int(math.floor(prescale)))
self.i2c.write8(self.__MODE1, oldmode)
time.sleep(0.005)
self.i2c.write8(self.__MODE1, oldmode | 0x80)
def setPWMFreqMax(self, freq, correctionFactor=1.0):
"Sets the PWM frequency"
prescaleval = 25000000.0 # 25MHz
prescaleval /= 4096.0 # 12-bit
prescaleval /= float(freq)
prescaleval -= 1.0
if (self.debug):
print "Setting PWM frequency to %d Hz" % freq
print "Estimated pre-scale: %d" % prescaleval
prescale = math.ceil(prescaleval * correctionFactor + 0.5)
if (self.debug):
print "Final pre-scale: %d" % prescale
oldmode = self.i2c.readU8(self.__MODE1);
newmode = (oldmode & 0x7F) | 0x10 # sleep
self.i2c.write8(self.__MODE1, newmode) # go to sleep
self.i2c.write8(self.__PRESCALE, int(math.floor(prescale)))
self.i2c.write8(self.__MODE1, oldmode)
time.sleep(0.005)
self.i2c.write8(self.__MODE1, oldmode | 0x80)
def getPWMFreq(self):
prescale = self.i2c.readU8(self.__PRESCALE)
calcfreq = 25000000.0 / 4096.0 / ( float(prescale) + 1 )
if (self.debug):
print "Got pre-scale: %d" % prescale
print "Calculated Frequency: %d" % calcfreq
return calcfreq
def setPWM(self, channel, on, off):
"Sets a single PWM channel"
self.i2c.write8(self.__LED0_ON_L+4*channel, on & 0xFF)

View File

@@ -174,11 +174,11 @@ class dw_DCMotor:
modepin = in1 = in2 = 0
if (num == 0):
in2 = 8 #phase
in1 = 9 #enable
in2 = 0 #phase
in1 = 1 #enable
elif (num == 1):
in2 = 10 #phase
in1 = 11 #enable
in2 = 2 #phase
in1 = 3 #enable
elif (num == 2):
in2 = 7 #phase
in1 = 6 #enable
@@ -186,11 +186,11 @@ class dw_DCMotor:
in2 = 5 #phase
in1 = 4 #enable
elif (num == 4):
in2 = 0 #phase
in1 = 1 #enable
in2 = 8 #phase
in1 = 9 #enable
elif (num == 5):
in2 = 2 #phase
in1 = 3 #enable
in2 = 10 #phase
in1 = 11 #enable
else:
raise NameError('MotorHAT Motor must be between 1 and 6 inclusive')
@@ -249,16 +249,9 @@ class dw_MotorCONTROL:
self._pwm.setPWMFreq(self._frequency)
# Just gonna default to high for now
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(17, GPIO.OUT)
GPIO.setup(27, GPIO.OUT)
GPIO.setup(22, GPIO.OUT)
GPIO.output(17, GPIO.HIGH)
GPIO.output(27, GPIO.HIGH)
GPIO.output(22, GPIO.HIGH)
self.motors = [ dw_DCMotor(self, m) for m in range(6) ]