diff --git a/Adafruit_PWM_Servo_Driver/Adafruit_I2C.py b/Adafruit_PWM_Servo_Driver/Adafruit_I2C.py deleted file mode 100755 index dd2dfa76..00000000 --- a/Adafruit_PWM_Servo_Driver/Adafruit_I2C.py +++ /dev/null @@ -1,95 +0,0 @@ -#!/usr/bin/python - -import smbus - -# =========================================================================== -# Adafruit_I2C Base Class -# =========================================================================== - -class Adafruit_I2C : - - def __init__(self, address, bus=smbus.SMBus(0), debug=False): - self.address = address - self.bus = bus - self.debug = debug - - def reverseByteOrder(self, data): - "Reverses the byte order of an int (16-bit) or long (32-bit) value" - # Courtesy Vishal Sapre - dstr = hex(data)[2:].replace('L','') - byteCount = len(dstr[::2]) - val = 0 - for i, n in enumerate(range(byteCount)): - d = data & 0xFF - val |= (d << (8 * (byteCount - i - 1))) - data >>= 8 - return val - - def write8(self, reg, value): - "Writes an 8-bit value to the specified register/address" - try: - self.bus.write_byte_data(self.address, reg, value) - if (self.debug): - print("I2C: Wrote 0x%02X to register 0x%02X" % (value, reg)) - except IOError, err: - print "Error accessing 0x%02X: Check your I2C address" % self.address - return -1 - - def writeList(self, reg, list): - "Writes an array of bytes using I2C format" - try: - self.bus.write_i2c_block_data(self.address, reg, list) - except IOError, err: - print "Error accessing 0x%02X: Check your I2C address" % self.address - return -1 - - def readU8(self, reg): - "Read an unsigned byte from the I2C device" - try: - result = self.bus.read_byte_data(self.address, reg) - if (self.debug): - print "I2C: Device 0x%02X returned 0x%02X from reg 0x%02X" % (self.address, result & 0xFF, reg) - return result - except IOError, err: - print "Error accessing 0x%02X: Check your I2C address" % self.address - return -1 - - def readS8(self, reg): - "Reads a signed byte from the I2C device" - try: - result = self.bus.read_byte_data(self.address, reg) - if (self.debug): - print "I2C: Device 0x%02X returned 0x%02X from reg 0x%02X" % (self.address, result & 0xFF, reg) - if (result > 127): - return result - 256 - else: - return result - except IOError, err: - print "Error accessing 0x%02X: Check your I2C address" % self.address - return -1 - - def readU16(self, reg): - "Reads an unsigned 16-bit value from the I2C device" - try: - hibyte = self.bus.read_byte_data(self.address, reg) - result = (hibyte << 8) + self.bus.read_byte_data(self.address, reg+1) - if (self.debug): - print "I2C: Device 0x%02X returned 0x%04X from reg 0x%02X" % (self.address, result & 0xFFFF, reg) - return result - except IOError, err: - print "Error accessing 0x%02X: Check your I2C address" % self.address - return -1 - - def readS16(self, reg): - "Reads a signed 16-bit value from the I2C device" - try: - hibyte = self.bus.read_byte_data(self.address, reg) - if (hibyte > 127): - hibyte -= 256 - result = (hibyte << 8) + self.bus.read_byte_data(self.address, reg+1) - if (self.debug): - print "I2C: Device 0x%02X returned 0x%04X from reg 0x%02X" % (self.address, result & 0xFFFF, reg) - return result - except IOError, err: - print "Error accessing 0x%02X: Check your I2C address" % self.address - return -1 diff --git a/Adafruit_PWM_Servo_Driver/Adafruit_PWM_Servo_Driver.py b/Adafruit_PWM_Servo_Driver/Adafruit_PWM_Servo_Driver.py deleted file mode 100644 index 76ab5137..00000000 --- a/Adafruit_PWM_Servo_Driver/Adafruit_PWM_Servo_Driver.py +++ /dev/null @@ -1,67 +0,0 @@ -#!/usr/bin/python - -import time -import math -from Adafruit_I2C import Adafruit_I2C - -# ============================================================================ -# Adafruit PCA9685 16-Channel PWM Servo Driver -# ============================================================================ - -class PWM : - i2c = None - - # Registers/etc. - __SUBADR1 = 0x02 - __SUBADR2 = 0x03 - __SUBADR3 = 0x04 - __MODE1 = 0x00 - __PRESCALE = 0xFE - __LED0_ON_L = 0x06 - __LED0_ON_H = 0x07 - __LED0_OFF_L = 0x08 - __LED0_OFF_H = 0x09 - __ALLLED_ON_L = 0xFA - __ALLLED_ON_H = 0xFB - __ALLLED_OFF_L = 0xFC - __ALLLED_OFF_H = 0xFD - - def __init__(self, address=0x40, debug=False): - self.i2c = Adafruit_I2C(address) - self.address = address - self.debug = debug - if (self.debug): - print "Reseting PCA9685" - self.i2c.write8(self.__MODE1, 0x00) - - def setPWMFreq(self, freq): - "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 + 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 setPWM(self, channel, on, off): - "Sets a single PWM channel" - self.i2c.write8(self.__LED0_ON_L+4*channel, on & 0xFF) - self.i2c.write8(self.__LED0_ON_H+4*channel, on >> 8) - self.i2c.write8(self.__LED0_OFF_L+4*channel, off & 0xFF) - self.i2c.write8(self.__LED0_OFF_H+4*channel, off >> 8) - - - - diff --git a/Adafruit_PWM_Servo_Driver/Adafruit_PWM_Servo_Driver.py b/Adafruit_PWM_Servo_Driver/Adafruit_PWM_Servo_Driver.py new file mode 120000 index 00000000..6d73b5c7 --- /dev/null +++ b/Adafruit_PWM_Servo_Driver/Adafruit_PWM_Servo_Driver.py @@ -0,0 +1 @@ +ada.pca9685/src/ada/pca9685/9685.py \ No newline at end of file diff --git a/Adafruit_PWM_Servo_Driver/ada.pca9685/CHANGES.txt b/Adafruit_PWM_Servo_Driver/ada.pca9685/CHANGES.txt new file mode 100644 index 00000000..d487f9fd --- /dev/null +++ b/Adafruit_PWM_Servo_Driver/ada.pca9685/CHANGES.txt @@ -0,0 +1,9 @@ +Changelog +========= + +0.1-dev (unreleased) +-------------------- + +- Initialize egg. + +- Move existing Python code into egg, add symlinks. diff --git a/Adafruit_PWM_Servo_Driver/ada.pca9685/CONTRIBUTORS.txt b/Adafruit_PWM_Servo_Driver/ada.pca9685/CONTRIBUTORS.txt new file mode 100644 index 00000000..8f3b4261 --- /dev/null +++ b/Adafruit_PWM_Servo_Driver/ada.pca9685/CONTRIBUTORS.txt @@ -0,0 +1,2 @@ +Daniel Havlik, Egg-packaging +Adafruit Industries, Code/Cool hardware diff --git a/Adafruit_PWM_Servo_Driver/ada.pca9685/README.txt b/Adafruit_PWM_Servo_Driver/ada.pca9685/README.txt new file mode 100644 index 00000000..4290c29b --- /dev/null +++ b/Adafruit_PWM_Servo_Driver/ada.pca9685/README.txt @@ -0,0 +1,14 @@ +.. contents:: + +Introduction +============ + +This is a Library supporting the Adafruit PWM Servo Driver. (PCA9685 +Breakout). + +The code requires python-smbus to be installed on the system. + +For further documentation see +. + diff --git a/Adafruit_PWM_Servo_Driver/ada.pca9685/setup.py b/Adafruit_PWM_Servo_Driver/ada.pca9685/setup.py new file mode 100644 index 00000000..373fa68a --- /dev/null +++ b/Adafruit_PWM_Servo_Driver/ada.pca9685/setup.py @@ -0,0 +1,43 @@ +from setuptools import setup, find_packages +import os + +version = '0.1' + +long_description = ( + open('README.txt').read() + + '\n' + + 'Contributors\n' + '============\n' + + '\n' + + open('CONTRIBUTORS.txt').read() + + '\n' + + open('CHANGES.txt').read() + + '\n') + +setup(name='ada.pca9685', + version=version, + description="Python library for interfacing the "Adafruit" PCA9685 16-Channel 12-bit PWM/Servo Driver.", + long_description=long_description, + # Get more strings from + # http://pypi.python.org/pypi?%3Aaction=list_classifiers + classifiers=[ + "Programming Language :: Python", + ], + keywords='', + author='Daniel Havlik', + author_email='nielow@gmail.com', + url='https://github.com/dhavlik/Adafruit-Raspberry-Pi-Python-Code', + license='bsd', + packages=find_packages('src'), + package_dir = {'': 'src'}, + namespace_packages=['ada'], + include_package_data=True, + zip_safe=False, + install_requires=[ + 'setuptools', + # -*- Extra requirements: -*- + ], + entry_points=""" + # -*- Entry points: -*- + """, + ) diff --git a/Adafruit_PWM_Servo_Driver/ada.pca9685/src/ada/__init__.py b/Adafruit_PWM_Servo_Driver/ada.pca9685/src/ada/__init__.py new file mode 100644 index 00000000..de40ea7c --- /dev/null +++ b/Adafruit_PWM_Servo_Driver/ada.pca9685/src/ada/__init__.py @@ -0,0 +1 @@ +__import__('pkg_resources').declare_namespace(__name__) diff --git a/Adafruit_PWM_Servo_Driver/ada.pca9685/src/ada/pca9685/9685.py b/Adafruit_PWM_Servo_Driver/ada.pca9685/src/ada/pca9685/9685.py new file mode 100644 index 00000000..325ebce5 --- /dev/null +++ b/Adafruit_PWM_Servo_Driver/ada.pca9685/src/ada/pca9685/9685.py @@ -0,0 +1,68 @@ +#coding:utf8 + +import i2c +import math +import time + +DEFAULT = [] + +SUBADR1 = 0x02 +SUBADR2 = 0x03 +SUBADR3 = 0x04 +MODE1 = 0x00 +PRESCALE = 0xFE +LED0_ON_L = 0x06 +LED0_ON_H = 0x07 +LED0_OFF_L = 0x08 +LED0_OFF_H = 0x09 +ALLLED_ON_L = 0xFA +ALLLED_ON_H = 0xFB +ALLLED_OFF_L = 0xFC +ALLLED_OFF_H = 0xFD + + +class PWM(object): + """API for interfacing an PCA9685.""" + + i2c = None + + def __init__(self, address=0x40, bus=DEFAULT, debug=False): + params = dict(address=address, bus=bus) + if bus == DEFAULT: + # Urks: Use default bus specified in Adafruit_I2C.__init__ + # signature. + # Better refactor the I2C class to take only port number. + del params['bus'] + self.i2c = i2c.Adafruit_I2C(**params) + self.address = address + self.debug = debug + if (self.debug): + print "Reseting PCA9685" + self.i2c.write8(MODE1, 0x00) + + def setPWMFreq(self, freq): + """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 + 0.5) + if (self.debug): + print "Final pre-scale: %d" % prescale + oldmode = self.i2c.readU8(MODE1) + newmode = (oldmode & 0x7F) | 0x10 # sleep + self.i2c.write8(MODE1, newmode) # go to sleep + self.i2c.write8(PRESCALE, int(math.floor(prescale))) + self.i2c.write8(MODE1, oldmode) + time.sleep(0.005) + self.i2c.write8(MODE1, oldmode | 0x80) + + def setPWM(self, channel, on, off): + """Sets a single PWM channel.""" + self.i2c.write8(LED0_ON_L + 4 * channel, on & 0xFF) + self.i2c.write8(LED0_ON_H + 4 * channel, on >> 8) + self.i2c.write8(LED0_OFF_L + 4 * channel, off & 0xFF) + self.i2c.write8(LED0_OFF_H + 4 * channel, off >> 8) diff --git a/Adafruit_PWM_Servo_Driver/ada.pca9685/src/ada/pca9685/__init__.py b/Adafruit_PWM_Servo_Driver/ada.pca9685/src/ada/pca9685/__init__.py new file mode 100644 index 00000000..e2cbd538 --- /dev/null +++ b/Adafruit_PWM_Servo_Driver/ada.pca9685/src/ada/pca9685/__init__.py @@ -0,0 +1 @@ +#init diff --git a/Adafruit_PWM_Servo_Driver/ada.pca9685/src/ada/pca9685/i2c.py b/Adafruit_PWM_Servo_Driver/ada.pca9685/src/ada/pca9685/i2c.py new file mode 100755 index 00000000..89b27c32 --- /dev/null +++ b/Adafruit_PWM_Servo_Driver/ada.pca9685/src/ada/pca9685/i2c.py @@ -0,0 +1,105 @@ +#coding:utf8 + + +import smbus + + +class Adafruit_I2C(object): + """I2C Communication.""" + def __init__(self, address, bus=smbus.SMBus(0), debug=False): + self.address = address + self.bus = bus + self.debug = debug + + def reverseByteOrder(self, data): + "Reverses the byte order of an int (16-bit) or long (32-bit) value" + # Courtesy Vishal Sapre + dstr = hex(data)[2:].replace('L', '') + byteCount = len(dstr[::2]) + val = 0 + for i, n in enumerate(range(byteCount)): + d = data & 0xFF + val |= (d << (8 * (byteCount - i - 1))) + data >>= 8 + return val + + def write8(self, reg, value): + "Writes an 8-bit value to the specified register/address" + try: + self.bus.write_byte_data(self.address, reg, value) + if self.debug: + print("I2C: Wrote 0x%02X to register 0x%02X" % (value, reg)) + except IOError, err: + print "Error accessing 0x%02X: Check your I2C address" % ( + self.address) + return -1 + + def writeList(self, reg, list): + "Writes an array of bytes using I2C format" + try: + self.bus.write_i2c_block_data(self.address, reg, list) + except IOError, err: + print "Error accessing 0x%02X: Check your I2C address" % ( + self.address) + return -1 + + def readU8(self, reg): + "Read an unsigned byte from the I2C device" + try: + result = self.bus.read_byte_data(self.address, reg) + if self.debug: + print "I2C: Device 0x%02X returned 0x%02X from reg 0x%02X" % ( + self.address, result & 0xFF, reg) + return result + except IOError, err: + print "Error accessing 0x%02X: Check your I2C address" % ( + self.address) + return -1 + + def readS8(self, reg): + "Reads a signed byte from the I2C device" + try: + result = self.bus.read_byte_data(self.address, reg) + if self.debug: + print "I2C: Device 0x%02X returned 0x%02X from reg 0x%02X" % ( + self.address, result & 0xFF, reg) + if (result > 127): + return result - 256 + else: + return result + except IOError, err: + print "Error accessing 0x%02X: Check your I2C address" % ( + self.address) + return -1 + + def readU16(self, reg): + "Reads an unsigned 16-bit value from the I2C device" + try: + hibyte = self.bus.read_byte_data(self.address, reg) + result = (hibyte << 8) + \ + self.bus.read_byte_data(self.address, reg + 1) + if self.debug: + print "I2C: Device 0x%02X returned 0x%04X from reg 0x%02X" % ( + self.address, result & 0xFFFF, reg) + return result + except IOError, err: + print "Error accessing 0x%02X: Check your I2C address" % ( + self.address) + return -1 + + def readS16(self, reg): + "Reads a signed 16-bit value from the I2C device" + try: + hibyte = self.bus.read_byte_data(self.address, reg) + if (hibyte > 127): + hibyte -= 256 + result = (hibyte << 8) + \ + self.bus.read_byte_data(self.address, reg + 1) + if self.debug: + print "I2C: Device 0x%02X returned 0x%04X from reg 0x%02X" % ( + self.address, result & 0xFFFF, reg) + return result + except IOError, err: + print "Error accessing 0x%02X: Check your I2C address" % ( + self.address) + return -1 diff --git a/Adafruit_PWM_Servo_Driver/i2c.py b/Adafruit_PWM_Servo_Driver/i2c.py new file mode 120000 index 00000000..8462843f --- /dev/null +++ b/Adafruit_PWM_Servo_Driver/i2c.py @@ -0,0 +1 @@ +ada.pca9685/src/ada/pca9685/i2c.py \ No newline at end of file