Skip to content

Commit 4cfec4b

Browse files
committed
Add support for Arduino Motor Shield V2
1 parent 33e530e commit 4cfec4b

File tree

7 files changed

+550
-0
lines changed

7 files changed

+550
-0
lines changed
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
#!/usr/bin/python
2+
3+
import time
4+
5+
class Adafruit_DCMotor :
6+
7+
FORWARD = 1
8+
BACKWARD = 2
9+
BRAKE = 3
10+
RELEASE = 4
11+
12+
LOW = 0
13+
HIGH = 1
14+
15+
def __init__(self, debug=False):
16+
self.debug = debug
17+
self.MC = None
18+
self.motornum = None
19+
self.PWMpin = 0
20+
self.IN1pin = 0
21+
self.IN2pin = 0
22+
23+
def setSpeed(self, speed):
24+
self.MC.setPWM(self.PWMpin, speed*16);
25+
26+
def run(self, cmd):
27+
if cmd == self.FORWARD:
28+
self.MC.setPin(self.IN2pin, self.LOW) # take low first to avoid 'break'
29+
self.MC.setPin(self.IN1pin, self.HIGH)
30+
elif cmd == self.BACKWARD:
31+
self.MC.setPin(self.IN1pin, self.LOW) # take low first to avoid 'break'
32+
self.MC.setPin(self.IN2pin, self.HIGH)
33+
elif cmd == self.RELEASE:
34+
self.MC.setPin(self.IN1pin, self.LOW)
35+
self.MC.setPin(self.IN2pin, self.LOW)

Adafruit_MotorShield/Adafruit_I2C.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
../Adafruit_I2C/Adafruit_I2C.py
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
#!/usr/bin/python
2+
3+
from Adafruit_StepperMotor import Adafruit_StepperMotor
4+
from Adafruit_DCMotor import Adafruit_DCMotor
5+
from Adafruit_PWM_Servo_Driver import PWM
6+
7+
class Adafruit_MotorShield :
8+
9+
LOW = 0
10+
HIGHT = 1
11+
12+
def __init__(self, address=0x60, debug=False):
13+
self.address = address
14+
self.pwm = PWM(address, debug)
15+
self.steppers = [Adafruit_StepperMotor(debug), Adafruit_StepperMotor(debug)]
16+
self.dcmotors = [Adafruit_DCMotor(debug), Adafruit_DCMotor(debug), Adafruit_DCMotor(debug), Adafruit_DCMotor(debug)]
17+
18+
def begin(self, freq=1600):
19+
self.pwm.begin()
20+
self.freq = freq
21+
self.pwm.setPWMFreq(freq); # This is the maximum PWM frequency
22+
for i in range(0, 16):
23+
self.pwm.setPWM(i, 0, 0);
24+
25+
def setPWM(self, pin, value):
26+
if value > 4095:
27+
self.pwm.setPWM(pin, 4096, 0)
28+
else:
29+
self.pwm.setPWM(pin, 0, value);
30+
31+
def setPin(self, pin, value):
32+
if value == self.LOW:
33+
self.pwm.setPWM(pin, 0, 0)
34+
else:
35+
self.pwm.setPWM(pin, 4096, 0)
36+
37+
def getMotor(self, num):
38+
if num > 4:
39+
return
40+
41+
num -= 1
42+
if (self.dcmotors[num].motornum is None):
43+
# not init'd yet!
44+
self.dcmotors[num].motornum = num;
45+
self.dcmotors[num].MC = self;
46+
if (num == 0):
47+
pwm = 8
48+
in2 = 9
49+
in1 = 10
50+
elif (num == 1):
51+
pwm = 13
52+
in2 = 12
53+
in1 = 11
54+
elif (num == 2):
55+
pwm = 2
56+
in2 = 3
57+
in1 = 4
58+
elif (num == 3):
59+
pwm = 7
60+
in2 = 6
61+
in1 = 5
62+
self.dcmotors[num].PWMpin = pwm;
63+
self.dcmotors[num].IN1pin = in1;
64+
self.dcmotors[num].IN2pin = in2;
65+
66+
return self.dcmotors[num];
67+
68+
def getStepper(self, steps, num):
69+
if num > 2:
70+
return
71+
72+
num -= 1
73+
if self.steppers[num].steppernum is None:
74+
# not init'd yet!
75+
self.steppers[num].steppernum = num;
76+
self.steppers[num].revsteps = steps;
77+
self.steppers[num].MC = self
78+
79+
if num == 0:
80+
pwma = 8
81+
ain2 = 9
82+
ain1 = 10
83+
pwmb = 13
84+
bin2 = 12
85+
bin1 = 11
86+
elif num == 1:
87+
pwma = 2
88+
ain2 = 3
89+
ain1 = 4
90+
pwmb = 7
91+
bin2 = 6
92+
bin1 = 5
93+
self.steppers[num].PWMApin = pwma
94+
self.steppers[num].PWMBpin = pwmb
95+
self.steppers[num].AIN1pin = ain1
96+
self.steppers[num].AIN2pin = ain2
97+
self.steppers[num].BIN1pin = bin1
98+
self.steppers[num].BIN2pin = bin2
99+
100+
return self.steppers[num]
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
#!/usr/bin/python
2+
3+
import time
4+
import math
5+
from Adafruit_I2C import Adafruit_I2C
6+
7+
# ============================================================================
8+
# Adafruit PCA9685 16-Channel PWM Servo Driver
9+
# ============================================================================
10+
11+
class PWM :
12+
# Registers/etc.
13+
__MODE1 = 0x00
14+
__SUBADR1 = 0x02
15+
__SUBADR2 = 0x03
16+
__SUBADR3 = 0x04
17+
__PRESCALE = 0xFE
18+
__LED0_ON_L = 0x06
19+
__LED0_ON_H = 0x07
20+
__LED0_OFF_L = 0x08
21+
__LED0_OFF_H = 0x09
22+
__ALL_LED_ON_L = 0xFA
23+
__ALL_LED_ON_H = 0xFB
24+
__ALL_LED_OFF_L = 0xFC
25+
__ALL_LED_OFF_H = 0xFD
26+
27+
# Bits
28+
__RESTART = 0x80
29+
__SLEEP = 0x10
30+
__ALLCALL = 0x01
31+
__INVRT = 0x10
32+
__OUTDRV = 0x04
33+
34+
#general_call_i2c = Adafruit_I2C(0x00)
35+
36+
def __init__(self, address=0x40, debug=False):
37+
self.i2c = Adafruit_I2C(address)
38+
self.i2c.debug = debug
39+
self.address = address
40+
self.debug = debug
41+
42+
def begin(self):
43+
self.reset()
44+
45+
def reset(self):
46+
self.i2c.write8(self.__MODE1, 0x0)
47+
48+
def setPWMFreq(self, freq):
49+
"Sets the PWM frequency"
50+
prescaleval = 25000000.0 # 25MHz
51+
prescaleval /= 4096.0 # 12-bit
52+
prescaleval /= float(freq)
53+
prescaleval -= 1.0
54+
if (self.debug):
55+
print "Setting PWM frequency to %d Hz" % freq
56+
print "Estimated pre-scale: %d" % prescaleval
57+
prescale = math.floor(prescaleval + 0.5)
58+
if (self.debug):
59+
print "Final pre-scale: %d" % prescale
60+
61+
oldmode = self.i2c.readU8(self.__MODE1);
62+
newmode = (oldmode & 0x7F) | 0x10 # sleep
63+
self.i2c.write8(self.__MODE1, newmode) # go to sleep
64+
self.i2c.write8(self.__PRESCALE, int(math.floor(prescale)))
65+
self.i2c.write8(self.__MODE1, oldmode)
66+
time.sleep(0.005)
67+
self.i2c.write8(self.__MODE1, oldmode | 0x80)
68+
69+
def setPWM(self, channel, on, off):
70+
"Sets a single PWM channel"
71+
self.i2c.write8(self.__LED0_ON_L+4*channel, on & 0xFF)
72+
self.i2c.write8(self.__LED0_ON_H+4*channel, on >> 8)
73+
self.i2c.write8(self.__LED0_OFF_L+4*channel, off & 0xFF)
74+
self.i2c.write8(self.__LED0_OFF_H+4*channel, off >> 8)
75+
76+
def setAllPWM(self, on, off):
77+
"Sets a all PWM channels"
78+
self.i2c.write8(self.__ALL_LED_ON_L, on & 0xFF)
79+
self.i2c.write8(self.__ALL_LED_ON_H, on >> 8)
80+
self.i2c.write8(self.__ALL_LED_OFF_L, off & 0xFF)
81+
self.i2c.write8(self.__ALL_LED_OFF_H, off >> 8)

0 commit comments

Comments
 (0)