Hello @Brett,
Hello again…yes and yes. The ServoCape handles servos and servos have motors in them w/ basically a pot that moves them in sync to what is described in the source.
So, would I need a PWM library to use for this Cape. Oh and here is the source:
from time import sleep
# relevant registers
MODE1 = 0x00
MODE2 = 0x01
LED = 0x06
ALL_LED = 0xFA
PRE_SCALE = 0xFE
class Pca9685:
def __init__( self, bus, addr ):
self.addr = 0b10000000 | addr
self.bus = bus
self.write_reg( MODE1, 1 << 5 ) # initialize MODE1 register
sleep( 500e-6 ) # wait 500us to allow oscillator to power up
def read_reg( self, reg )
return self.read_regs( reg, 1 )[0]
def write_reg( self, reg, value ):
return self.write_regs( reg, [ value ] )
def read_regs( self, reg, count ):
assert reg in range( 0, 256 )
assert count in range( 1, 257-reg )
return self.bus.read_i2c_block_data( self.addr, reg, count )
def write_regs( self, reg, values ):
assert reg in range( 0, 256 )
return self.bus.write_i2c_block_data( self.addr, reg, values )
def get_pwm( self, output ):
assert output in range( 0, 16 )
reg = LED + 4 * output
[ on_l, on_h, off_l, off_h ] = self.read_regs( reg, 4 )
on = on_l | on_h << 8
off = off_l | off_h << 8
phase = on
duty = ( off - on ) & 0xfff
if off & 0x1000:
duty = 0
elif on & 0x1000:
duty = 4096
return ( duty, phase )
def set_pwm( self, output, duty, phase=0 ):
assert duty in range( 0, 4097 )
assert phase in range( 0, 4096 )
if output == 'all':
reg = ALL_LED
else:
assert output in range( 0, 16 )
reg = LED + 4 * output
on = phase
off = ( duty + phase ) & 0xfff
if duty == 0:
off |= 0x1000
elif duty == 4096:
on |= 0x1000
on_l = on & 0xff
on_h = on >> 8
off_l = off & 0xff
off_h = off >> 8
self.write_regs( reg, [ on_l, on_h, off_l, off_h ] )
And…
Then, since that source was given to me, I tried to set up the source to use w/ the wrapper just described as this:
from smbus2 import SMBus
from ServoFile import Pca9685
from time import sleep
i2c2 = SMBus("/dev/i2c-2")
x = Pca9685(i2c2, 0b111111)
x.read_reg = 0
x.write_reg = 0
x.read_regs = (0, 5)
x.write_regs = (0, 0, 5)
x.pwm_get = 0
x.pwm_set = (0, 2000, 0)
angle = int(input("Please tell me your angle: "))
for a in range(0, 180):
a = angle
print("You angle is: ", a)
sleep(2)
…
So far, this is what I have to work on. If I need to use a PWM library like you described b/c of the Servo needing a reading to account for, please let me know. I can probably use Adafruit_BBIO.PWM as PWM again.
Seth