From 4bcc4ff4042a2d9135692dcf11d36c10d8920463 Mon Sep 17 00:00:00 2001 From: shrkey Date: Sat, 13 Aug 2016 19:23:17 +0100 Subject: [PATCH] Got rid of non-python files --- C++/README.md | 6 - Python/README.md | 6 - README.md | 11 +- .../Adafruit_I2C.py | 0 .../Adafruit_PWM_Servo_Driver.py | 0 darkwater_640/GPIO.py | 426 ++ darkwater_640/I2C.py | 200 + darkwater_640/PCA9685.py | 167 + darkwater_640/Platform.py | 106 + darkwater_640/SPI.py | 336 ++ .../dw640HAT => darkwater_640}/__init__.py | 0 .../darkwater_640.py | 0 {Python/examples => examples}/640test.py | 0 hardware/Mk4/640mk4.brd | 2843 ---------- hardware/Mk4/640mk4.sch | 4840 ----------------- hardware/Mk4/640mk4.zip | Bin 92661 -> 0 bytes hardware/readme.md | 1 - license.txt | 425 -- 18 files changed, 1238 insertions(+), 8129 deletions(-) delete mode 100644 C++/README.md delete mode 100644 Python/README.md rename {Python/dw640HAT => darkwater_640}/Adafruit_I2C.py (100%) rename {Python/dw640HAT => darkwater_640}/Adafruit_PWM_Servo_Driver.py (100%) create mode 100644 darkwater_640/GPIO.py create mode 100644 darkwater_640/I2C.py create mode 100644 darkwater_640/PCA9685.py create mode 100644 darkwater_640/Platform.py create mode 100644 darkwater_640/SPI.py rename {Python/dw640HAT => darkwater_640}/__init__.py (100%) rename Python/dw640HAT/dw640HAT.py => darkwater_640/darkwater_640.py (100%) rename {Python/examples => examples}/640test.py (100%) delete mode 100644 hardware/Mk4/640mk4.brd delete mode 100644 hardware/Mk4/640mk4.sch delete mode 100644 hardware/Mk4/640mk4.zip delete mode 100644 hardware/readme.md delete mode 100644 license.txt diff --git a/C++/README.md b/C++/README.md deleted file mode 100644 index d6e8e56..0000000 --- a/C++/README.md +++ /dev/null @@ -1,6 +0,0 @@ -640 Python driver -======================= - -Based on the [Adafruit Python Library for DC + Stepper Motor HAT](https://github.com/adafruit/Adafruit-Motor-HAT-Python-Library) - -Python library for interfacing with the 640 Mk1 board for Raspberry Pi to control DC motors with speed control and Stepper motors with single, double, interleave and microstepping. diff --git a/Python/README.md b/Python/README.md deleted file mode 100644 index d6e8e56..0000000 --- a/Python/README.md +++ /dev/null @@ -1,6 +0,0 @@ -640 Python driver -======================= - -Based on the [Adafruit Python Library for DC + Stepper Motor HAT](https://github.com/adafruit/Adafruit-Motor-HAT-Python-Library) - -Python library for interfacing with the 640 Mk1 board for Raspberry Pi to control DC motors with speed control and Stepper motors with single, double, interleave and microstepping. diff --git a/README.md b/README.md index c69a210..d6e8e56 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,6 @@ -640 DC Motor driver +640 Python driver ======================= -Python library based on the [Adafruit Python Library for DC + Stepper Motor HAT](https://github.com/adafruit/Adafruit-Motor-HAT-Python-Library) +Based on the [Adafruit Python Library for DC + Stepper Motor HAT](https://github.com/adafruit/Adafruit-Motor-HAT-Python-Library) -#License - -Designed by Dark Water. Distributed under a Creative Commons Attribution, Share-Alike license. -Development kits based on this product should be distributed under a similar license. -Commercial products using the 640 boards as a reference design need not comply with this license; further questions can be sent to team@darkwater.io. -Check license.txt for more information. +Python library for interfacing with the 640 Mk1 board for Raspberry Pi to control DC motors with speed control and Stepper motors with single, double, interleave and microstepping. diff --git a/Python/dw640HAT/Adafruit_I2C.py b/darkwater_640/Adafruit_I2C.py similarity index 100% rename from Python/dw640HAT/Adafruit_I2C.py rename to darkwater_640/Adafruit_I2C.py diff --git a/Python/dw640HAT/Adafruit_PWM_Servo_Driver.py b/darkwater_640/Adafruit_PWM_Servo_Driver.py similarity index 100% rename from Python/dw640HAT/Adafruit_PWM_Servo_Driver.py rename to darkwater_640/Adafruit_PWM_Servo_Driver.py diff --git a/darkwater_640/GPIO.py b/darkwater_640/GPIO.py new file mode 100644 index 0000000..08e99c6 --- /dev/null +++ b/darkwater_640/GPIO.py @@ -0,0 +1,426 @@ +# Copyright (c) 2014 Adafruit Industries +# Author: Tony DiCola +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +import Adafruit_GPIO.Platform as Platform + + +OUT = 0 +IN = 1 +HIGH = True +LOW = False + +RISING = 1 +FALLING = 2 +BOTH = 3 + +PUD_OFF = 0 +PUD_DOWN = 1 +PUD_UP = 2 + +class BaseGPIO(object): + """Base class for implementing simple digital IO for a platform. + Implementors are expected to subclass from this and provide an implementation + of the setup, output, and input functions.""" + + def setup(self, pin, mode, pull_up_down=PUD_OFF): + """Set the input or output mode for a specified pin. Mode should be + either OUT or IN.""" + raise NotImplementedError + + def output(self, pin, value): + """Set the specified pin the provided high/low value. Value should be + either HIGH/LOW or a boolean (true = high).""" + raise NotImplementedError + + def input(self, pin): + """Read the specified pin and return HIGH/true if the pin is pulled high, + or LOW/false if pulled low.""" + raise NotImplementedError + + def set_high(self, pin): + """Set the specified pin HIGH.""" + self.output(pin, HIGH) + + def set_low(self, pin): + """Set the specified pin LOW.""" + self.output(pin, LOW) + + def is_high(self, pin): + """Return true if the specified pin is pulled high.""" + return self.input(pin) == HIGH + + def is_low(self, pin): + """Return true if the specified pin is pulled low.""" + return self.input(pin) == LOW + + +# Basic implementation of multiple pin methods just loops through pins and +# processes each one individually. This is not optimal, but derived classes can +# provide a more optimal implementation that deals with groups of pins +# simultaneously. +# See MCP230xx or PCF8574 classes for examples of optimized implementations. + + def output_pins(self, pins): + """Set multiple pins high or low at once. Pins should be a dict of pin + name to pin value (HIGH/True for 1, LOW/False for 0). All provided pins + will be set to the given values. + """ + # General implementation just loops through pins and writes them out + # manually. This is not optimized, but subclasses can choose to implement + # a more optimal batch output implementation. See the MCP230xx class for + # example of optimized implementation. + for pin, value in iter(pins.items()): + self.output(pin, value) + + def setup_pins(self, pins): + """Setup multiple pins as inputs or outputs at once. Pins should be a + dict of pin name to pin type (IN or OUT). + """ + # General implementation that can be optimized by derived classes. + for pin, value in iter(pins.items()): + self.setup(pin, value) + + def input_pins(self, pins): + """Read multiple pins specified in the given list and return list of pin values + GPIO.HIGH/True if the pin is pulled high, or GPIO.LOW/False if pulled low. + """ + # General implementation that can be optimized by derived classes. + return [self.input(pin) for pin in pins] + + + def add_event_detect(self, pin, edge): + """Enable edge detection events for a particular GPIO channel. Pin + should be type IN. Edge must be RISING, FALLING or BOTH. + """ + raise NotImplementedError + + def remove_event_detect(self, pin): + """Remove edge detection for a particular GPIO channel. Pin should be + type IN. + """ + raise NotImplementedError + + def add_event_callback(self, pin, callback): + """Add a callback for an event already defined using add_event_detect(). + Pin should be type IN. + """ + raise NotImplementedError + + def event_detected(self, pin): + """Returns True if an edge has occured on a given GPIO. You need to + enable edge detection using add_event_detect() first. Pin should be + type IN. + """ + raise NotImplementedError + + def wait_for_edge(self, pin, edge): + """Wait for an edge. Pin should be type IN. Edge must be RISING, + FALLING or BOTH.""" + raise NotImplementedError + + def cleanup(self, pin=None): + """Clean up GPIO event detection for specific pin, or all pins if none + is specified. + """ + raise NotImplementedError + + +# helper functions useful to derived classes + + def _validate_pin(self, pin): + # Raise an exception if pin is outside the range of allowed values. + if pin < 0 or pin >= self.NUM_GPIO: + raise ValueError('Invalid GPIO value, must be between 0 and {0}.'.format(self.NUM_GPIO)) + + def _bit2(self, src, bit, val): + bit = 1 << bit + return (src | bit) if val else (src & ~bit) + + +class RPiGPIOAdapter(BaseGPIO): + """GPIO implementation for the Raspberry Pi using the RPi.GPIO library.""" + + def __init__(self, rpi_gpio, mode=None): + self.rpi_gpio = rpi_gpio + # Suppress warnings about GPIO in use. + rpi_gpio.setwarnings(False) + # Setup board pin mode. + if mode == rpi_gpio.BOARD or mode == rpi_gpio.BCM: + rpi_gpio.setmode(mode) + elif mode is not None: + raise ValueError('Unexpected value for mode. Must be BOARD or BCM.') + else: + # Default to BCM numbering if not told otherwise. + rpi_gpio.setmode(rpi_gpio.BCM) + # Define mapping of Adafruit GPIO library constants to RPi.GPIO constants. + self._dir_mapping = { OUT: rpi_gpio.OUT, + IN: rpi_gpio.IN } + self._pud_mapping = { PUD_OFF: rpi_gpio.PUD_OFF, + PUD_DOWN: rpi_gpio.PUD_DOWN, + PUD_UP: rpi_gpio.PUD_UP } + self._edge_mapping = { RISING: rpi_gpio.RISING, + FALLING: rpi_gpio.FALLING, + BOTH: rpi_gpio.BOTH } + + def setup(self, pin, mode, pull_up_down=PUD_OFF): + """Set the input or output mode for a specified pin. Mode should be + either OUTPUT or INPUT. + """ + self.rpi_gpio.setup(pin, self._dir_mapping[mode], + pull_up_down=self._pud_mapping[pull_up_down]) + + def output(self, pin, value): + """Set the specified pin the provided high/low value. Value should be + either HIGH/LOW or a boolean (true = high). + """ + self.rpi_gpio.output(pin, value) + + def input(self, pin): + """Read the specified pin and return HIGH/true if the pin is pulled high, + or LOW/false if pulled low. + """ + return self.rpi_gpio.input(pin) + + def input_pins(self, pins): + """Read multiple pins specified in the given list and return list of pin values + GPIO.HIGH/True if the pin is pulled high, or GPIO.LOW/False if pulled low. + """ + # maybe rpi has a mass read... it would be more efficient to use it if it exists + return [self.rpi_gpio.input(pin) for pin in pins] + + def add_event_detect(self, pin, edge, callback=None, bouncetime=-1): + """Enable edge detection events for a particular GPIO channel. Pin + should be type IN. Edge must be RISING, FALLING or BOTH. Callback is a + function for the event. Bouncetime is switch bounce timeout in ms for + callback + """ + kwargs = {} + if callback: + kwargs['callback']=callback + if bouncetime > 0: + kwargs['bouncetime']=bouncetime + self.rpi_gpio.add_event_detect(pin, self._edge_mapping[edge], **kwargs) + + def remove_event_detect(self, pin): + """Remove edge detection for a particular GPIO channel. Pin should be + type IN. + """ + self.rpi_gpio.remove_event_detect(pin) + + def add_event_callback(self, pin, callback): + """Add a callback for an event already defined using add_event_detect(). + Pin should be type IN. + """ + self.rpi_gpio.add_event_callback(pin, callback) + + def event_detected(self, pin): + """Returns True if an edge has occured on a given GPIO. You need to + enable edge detection using add_event_detect() first. Pin should be + type IN. + """ + return self.rpi_gpio.event_detected(pin) + + def wait_for_edge(self, pin, edge): + """Wait for an edge. Pin should be type IN. Edge must be RISING, + FALLING or BOTH. + """ + self.rpi_gpio.wait_for_edge(pin, self._edge_mapping[edge]) + + def cleanup(self, pin=None): + """Clean up GPIO event detection for specific pin, or all pins if none + is specified. + """ + if pin is None: + self.rpi_gpio.cleanup() + else: + self.rpi_gpio.cleanup(pin) + +class AdafruitBBIOAdapter(BaseGPIO): + """GPIO implementation for the Beaglebone Black using the Adafruit_BBIO + library. + """ + + def __init__(self, bbio_gpio): + self.bbio_gpio = bbio_gpio + # Define mapping of Adafruit GPIO library constants to RPi.GPIO constants. + self._dir_mapping = { OUT: bbio_gpio.OUT, + IN: bbio_gpio.IN } + self._pud_mapping = { PUD_OFF: bbio_gpio.PUD_OFF, + PUD_DOWN: bbio_gpio.PUD_DOWN, + PUD_UP: bbio_gpio.PUD_UP } + self._edge_mapping = { RISING: bbio_gpio.RISING, + FALLING: bbio_gpio.FALLING, + BOTH: bbio_gpio.BOTH } + + def setup(self, pin, mode, pull_up_down=PUD_OFF): + """Set the input or output mode for a specified pin. Mode should be + either OUTPUT or INPUT. + """ + self.bbio_gpio.setup(pin, self._dir_mapping[mode], + pull_up_down=self._pud_mapping[pull_up_down]) + + def output(self, pin, value): + """Set the specified pin the provided high/low value. Value should be + either HIGH/LOW or a boolean (true = high). + """ + self.bbio_gpio.output(pin, value) + + def input(self, pin): + """Read the specified pin and return HIGH/true if the pin is pulled high, + or LOW/false if pulled low. + """ + return self.bbio_gpio.input(pin) + + def input_pins(self, pins): + """Read multiple pins specified in the given list and return list of pin values + GPIO.HIGH/True if the pin is pulled high, or GPIO.LOW/False if pulled low. + """ + # maybe bbb has a mass read... it would be more efficient to use it if it exists + return [self.bbio_gpio.input(pin) for pin in pins] + + def add_event_detect(self, pin, edge, callback=None, bouncetime=-1): + """Enable edge detection events for a particular GPIO channel. Pin + should be type IN. Edge must be RISING, FALLING or BOTH. Callback is a + function for the event. Bouncetime is switch bounce timeout in ms for + callback + """ + kwargs = {} + if callback: + kwargs['callback']=callback + if bouncetime > 0: + kwargs['bouncetime']=bouncetime + self.bbio_gpio.add_event_detect(pin, self._edge_mapping[edge], **kwargs) + + def remove_event_detect(self, pin): + """Remove edge detection for a particular GPIO channel. Pin should be + type IN. + """ + self.bbio_gpio.remove_event_detect(pin) + + def add_event_callback(self, pin, callback, bouncetime=-1): + """Add a callback for an event already defined using add_event_detect(). + Pin should be type IN. Bouncetime is switch bounce timeout in ms for + callback + """ + kwargs = {} + if bouncetime > 0: + kwargs['bouncetime']=bouncetime + self.bbio_gpio.add_event_callback(pin, callback, **kwargs) + + def event_detected(self, pin): + """Returns True if an edge has occured on a given GPIO. You need to + enable edge detection using add_event_detect() first. Pin should be + type IN. + """ + return self.bbio_gpio.event_detected(pin) + + def wait_for_edge(self, pin, edge): + """Wait for an edge. Pin should be type IN. Edge must be RISING, + FALLING or BOTH. + """ + self.bbio_gpio.wait_for_edge(pin, self._edge_mapping[edge]) + + def cleanup(self, pin=None): + """Clean up GPIO event detection for specific pin, or all pins if none + is specified. + """ + if pin is None: + self.bbio_gpio.cleanup() + else: + self.bbio_gpio.cleanup(pin) + +class AdafruitMinnowAdapter(BaseGPIO): + """GPIO implementation for the Minnowboard + MAX using the mraa library""" + + def __init__(self,mraa_gpio): + self.mraa_gpio = mraa_gpio + # Define mapping of Adafruit GPIO library constants to mraa constants + self._dir_mapping = { OUT: self.mraa_gpio.DIR_OUT, + IN: self.mraa_gpio.DIR_IN } + self._pud_mapping = { PUD_OFF: self.mraa_gpio.MODE_STRONG, + PUD_UP: self.mraa_gpio.MODE_HIZ, + PUD_DOWN: self.mraa_gpio.MODE_PULLDOWN } + self._edge_mapping = { RISING: self.mraa_gpio.EDGE_RISING, + FALLING: self.mraa_gpio.EDGE_FALLING, + BOTH: self.mraa_gpio.EDGE_BOTH } + + def setup(self,pin,mode): + """Set the input or output mode for a specified pin. Mode should be + either DIR_IN or DIR_OUT. + """ + self.mraa_gpio.Gpio.dir(self.mraa_gpio.Gpio(pin),self._dir_mapping[mode]) + + def output(self,pin,value): + """Set the specified pin the provided high/low value. Value should be + either 1 (ON or HIGH), or 0 (OFF or LOW) or a boolean. + """ + self.mraa_gpio.Gpio.write(self.mraa_gpio.Gpio(pin), value) + + def input(self,pin): + """Read the specified pin and return HIGH/true if the pin is pulled high, + or LOW/false if pulled low. + """ + return self.mraa_gpio.Gpio.read(self.mraa_gpio.Gpio(pin)) + + def add_event_detect(self, pin, edge, callback=None, bouncetime=-1): + """Enable edge detection events for a particular GPIO channel. Pin + should be type IN. Edge must be RISING, FALLING or BOTH. Callback is a + function for the event. Bouncetime is switch bounce timeout in ms for + callback + """ + kwargs = {} + if callback: + kwargs['callback']=callback + if bouncetime > 0: + kwargs['bouncetime']=bouncetime + self.mraa_gpio.Gpio.isr(self.mraa_gpio.Gpio(pin), self._edge_mapping[edge], **kwargs) + + def remove_event_detect(self, pin): + """Remove edge detection for a particular GPIO channel. Pin should be + type IN. + """ + self.mraa_gpio.Gpio.isrExit(self.mraa_gpio.Gpio(pin)) + + def wait_for_edge(self, pin, edge): + """Wait for an edge. Pin should be type IN. Edge must be RISING, + FALLING or BOTH. + """ + self.bbio_gpio.wait_for_edge(self.mraa_gpio.Gpio(pin), self._edge_mapping[edge]) + +def get_platform_gpio(**keywords): + """Attempt to return a GPIO instance for the platform which the code is being + executed on. Currently supports only the Raspberry Pi using the RPi.GPIO + library and Beaglebone Black using the Adafruit_BBIO library. Will throw an + exception if a GPIO instance can't be created for the current platform. The + returned GPIO object is an instance of BaseGPIO. + """ + plat = Platform.platform_detect() + if plat == Platform.RASPBERRY_PI: + import RPi.GPIO + return RPiGPIOAdapter(RPi.GPIO, **keywords) + elif plat == Platform.BEAGLEBONE_BLACK: + import Adafruit_BBIO.GPIO + return AdafruitBBIOAdapter(Adafruit_BBIO.GPIO, **keywords) + elif plat == Platform.MINNOWBOARD: + import mraa + return AdafruitMinnowAdapter(mraa, **keywords) + elif plat == Platform.UNKNOWN: + raise RuntimeError('Could not determine platform.') diff --git a/darkwater_640/I2C.py b/darkwater_640/I2C.py new file mode 100644 index 0000000..e63a2d1 --- /dev/null +++ b/darkwater_640/I2C.py @@ -0,0 +1,200 @@ +# Copyright (c) 2014 Adafruit Industries +# Author: Tony DiCola +# Based on Adafruit_I2C.py created by Kevin Townsend. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +import logging +import subprocess + +import Adafruit_GPIO.Platform as Platform + + +def reverseByteOrder(data): + """Reverses the byte order of an int (16-bit) or long (32-bit) value.""" + # Courtesy Vishal Sapre + byteCount = len(hex(data)[2:].replace('L','')[::2]) + val = 0 + for i in range(byteCount): + val = (val << 8) | (data & 0xff) + data >>= 8 + return val + +def get_default_bus(): + """Return the default bus number based on the device platform. For a + Raspberry Pi either bus 0 or 1 (based on the Pi revision) will be returned. + For a Beaglebone Black the first user accessible bus, 1, will be returned. + """ + plat = Platform.platform_detect() + if plat == Platform.RASPBERRY_PI: + if Platform.pi_revision() == 1: + # Revision 1 Pi uses I2C bus 0. + return 0 + else: + # Revision 2 Pi uses I2C bus 1. + return 1 + elif plat == Platform.BEAGLEBONE_BLACK: + # Beaglebone Black has multiple I2C buses, default to 1 (P9_19 and P9_20). + return 1 + else: + raise RuntimeError('Could not determine default I2C bus for platform.') + +def get_i2c_device(address, busnum=None, i2c_interface=None, **kwargs): + """Return an I2C device for the specified address and on the specified bus. + If busnum isn't specified, the default I2C bus for the platform will attempt + to be detected. + """ + if busnum is None: + busnum = get_default_bus() + return Device(address, busnum, i2c_interface, **kwargs) + +def require_repeated_start(): + """Enable repeated start conditions for I2C register reads. This is the + normal behavior for I2C, however on some platforms like the Raspberry Pi + there are bugs which disable repeated starts unless explicitly enabled with + this function. See this thread for more details: + http://www.raspberrypi.org/forums/viewtopic.php?f=44&t=15840 + """ + plat = Platform.platform_detect() + if plat == Platform.RASPBERRY_PI: + # On the Raspberry Pi there is a bug where register reads don't send a + # repeated start condition like the kernel smbus I2C driver functions + # define. As a workaround this bit in the BCM2708 driver sysfs tree can + # be changed to enable I2C repeated starts. + subprocess.check_call('chmod 666 /sys/module/i2c_bcm2708/parameters/combined', shell=True) + subprocess.check_call('echo -n 1 > /sys/module/i2c_bcm2708/parameters/combined', shell=True) + # Other platforms are a no-op because they (presumably) have the correct + # behavior and send repeated starts. + + +class Device(object): + """Class for communicating with an I2C device using the adafruit-pureio pure + python smbus library, or other smbus compatible I2C interface. Allows reading + and writing 8-bit, 16-bit, and byte array values to registers + on the device.""" + def __init__(self, address, busnum, i2c_interface=None): + """Create an instance of the I2C device at the specified address on the + specified I2C bus number.""" + self._address = address + if i2c_interface is None: + # Use pure python I2C interface if none is specified. + import Adafruit_PureIO.smbus + self._bus = Adafruit_PureIO.smbus.SMBus(busnum) + else: + # Otherwise use the provided class to create an smbus interface. + self._bus = i2c_interface(busnum) + self._logger = logging.getLogger('Adafruit_I2C.Device.Bus.{0}.Address.{1:#0X}' \ + .format(busnum, address)) + + def writeRaw8(self, value): + """Write an 8-bit value on the bus (without register).""" + value = value & 0xFF + self._bus.write_byte(self._address, value) + self._logger.debug("Wrote 0x%02X", + value) + + def write8(self, register, value): + """Write an 8-bit value to the specified register.""" + value = value & 0xFF + self._bus.write_byte_data(self._address, register, value) + self._logger.debug("Wrote 0x%02X to register 0x%02X", + value, register) + + def write16(self, register, value): + """Write a 16-bit value to the specified register.""" + value = value & 0xFFFF + self._bus.write_word_data(self._address, register, value) + self._logger.debug("Wrote 0x%04X to register pair 0x%02X, 0x%02X", + value, register, register+1) + + def writeList(self, register, data): + """Write bytes to the specified register.""" + self._bus.write_i2c_block_data(self._address, register, data) + self._logger.debug("Wrote to register 0x%02X: %s", + register, data) + + def readList(self, register, length): + """Read a length number of bytes from the specified register. Results + will be returned as a bytearray.""" + results = self._bus.read_i2c_block_data(self._address, register, length) + self._logger.debug("Read the following from register 0x%02X: %s", + register, results) + return results + + def readRaw8(self): + """Read an 8-bit value on the bus (without register).""" + result = self._bus.read_byte(self._address) & 0xFF + self._logger.debug("Read 0x%02X", + result) + return result + + def readU8(self, register): + """Read an unsigned byte from the specified register.""" + result = self._bus.read_byte_data(self._address, register) & 0xFF + self._logger.debug("Read 0x%02X from register 0x%02X", + result, register) + return result + + def readS8(self, register): + """Read a signed byte from the specified register.""" + result = self.readU8(register) + if result > 127: + result -= 256 + return result + + def readU16(self, register, little_endian=True): + """Read an unsigned 16-bit value from the specified register, with the + specified endianness (default little endian, or least significant byte + first).""" + result = self._bus.read_word_data(self._address,register) & 0xFFFF + self._logger.debug("Read 0x%04X from register pair 0x%02X, 0x%02X", + result, register, register+1) + # Swap bytes if using big endian because read_word_data assumes little + # endian on ARM (little endian) systems. + if not little_endian: + result = ((result << 8) & 0xFF00) + (result >> 8) + return result + + def readS16(self, register, little_endian=True): + """Read a signed 16-bit value from the specified register, with the + specified endianness (default little endian, or least significant byte + first).""" + result = self.readU16(register, little_endian) + if result > 32767: + result -= 65536 + return result + + def readU16LE(self, register): + """Read an unsigned 16-bit value from the specified register, in little + endian byte order.""" + return self.readU16(register, little_endian=True) + + def readU16BE(self, register): + """Read an unsigned 16-bit value from the specified register, in big + endian byte order.""" + return self.readU16(register, little_endian=False) + + def readS16LE(self, register): + """Read a signed 16-bit value from the specified register, in little + endian byte order.""" + return self.readS16(register, little_endian=True) + + def readS16BE(self, register): + """Read a signed 16-bit value from the specified register, in big + endian byte order.""" + return self.readS16(register, little_endian=False) diff --git a/darkwater_640/PCA9685.py b/darkwater_640/PCA9685.py new file mode 100644 index 0000000..b8c4f41 --- /dev/null +++ b/darkwater_640/PCA9685.py @@ -0,0 +1,167 @@ +# Copyright (c) 2016 Adafruit Industries +# Author: Tony DiCola +# +# Updated by: Dark Water +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +from __future__ import division +import logging +import time +import math + + +# Registers/etc: +PCA9685_ADDRESS = 0x60 +MODE1 = 0x00 +MODE2 = 0x01 +SUBADR1 = 0x02 +SUBADR2 = 0x03 +SUBADR3 = 0x04 +PRESCALE = 0xFE +LED0_ON_L = 0x06 +LED0_ON_H = 0x07 +LED0_OFF_L = 0x08 +LED0_OFF_H = 0x09 +ALL_LED_ON_L = 0xFA +ALL_LED_ON_H = 0xFB +ALL_LED_OFF_L = 0xFC +ALL_LED_OFF_H = 0xFD + +# Bits: +RESTART = 0x80 +SLEEP = 0x10 +ALLCALL = 0x01 +INVRT = 0x10 +OUTDRV = 0x04 + + +logger = logging.getLogger(__name__) + + +def software_reset(i2c=None, **kwargs): + """Sends a software reset (SWRST) command to all servo drivers on the bus.""" + # Setup I2C interface for device 0x00 to talk to all of them. + if i2c is None: + import Adafruit_GPIO.I2C as I2C + i2c = I2C + self._device = i2c.get_i2c_device(0x00, **kwargs) + self._device.writeRaw8(0x06) # SWRST + + +class PCA9685(object): + """PCA9685 PWM LED/servo controller.""" + + def __init__(self, address=PCA9685_ADDRESS, i2c=None, **kwargs): + """Initialize the PCA9685.""" + # Setup I2C interface for the device. + if i2c is None: + import Adafruit_GPIO.I2C as I2C + i2c = I2C + self._device = i2c.get_i2c_device(address, **kwargs) + self.set_all_pwm(0, 0) + self._device.write8(MODE2, OUTDRV) + self._device.write8(MODE1, ALLCALL) + time.sleep(0.005) # wait for oscillator + mode1 = self._device.readU8(MODE1) + mode1 = mode1 & ~SLEEP # wake up (reset sleep) + self._device.write8(MODE1, mode1) + time.sleep(0.005) # wait for oscillator + + def set_pwm_freq(self, freq_hz): + """Set the PWM frequency to the provided value in hertz.""" + prescaleval = 25000000.0 # 25MHz + prescaleval /= 4096.0 # 12-bit + prescaleval /= float(freq_hz) + prescaleval -= 1.0 + logger.debug('Setting PWM frequency to {0} Hz'.format(freq_hz)) + logger.debug('Estimated pre-scale: {0}'.format(prescaleval)) + prescale = int(math.floor(prescaleval + 0.5)) + logger.debug('Final pre-scale: {0}'.format(prescale)) + oldmode = self._device.readU8(MODE1); + newmode = (oldmode & 0x7F) | 0x10 # sleep + self._device.write8(MODE1, newmode) # go to sleep + self._device.write8(PRESCALE, prescale) + self._device.write8(MODE1, oldmode) + time.sleep(0.005) + self._device.write8(MODE1, oldmode | 0x80) + + def set_pwm_freq_min(self, freq_hz, correctionFactor=1.0): + "Sets the PWM frequency" + prescaleval = 25000000.0 # 25MHz + prescaleval /= 4096.0 # 12-bit + prescaleval /= float(freq_hz) + prescaleval -= 1.0 + if (self.debug): + print "Setting PWM frequency to %d Hz" % freq_hz + 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 set_pwm_freq_max(self, freq_hz, correctionFactor=1.0): + "Sets the PWM frequency" + prescaleval = 25000000.0 # 25MHz + prescaleval /= 4096.0 # 12-bit + prescaleval /= float(freq_hz) + prescaleval -= 1.0 + if (self.debug): + print "Setting PWM frequency to %d Hz" % freq_hz + 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 get_pwm_freq(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 set_pwm(self, channel, on, off): + """Sets a single PWM channel.""" + self._device.write8(LED0_ON_L+4*channel, on & 0xFF) + self._device.write8(LED0_ON_H+4*channel, on >> 8) + self._device.write8(LED0_OFF_L+4*channel, off & 0xFF) + self._device.write8(LED0_OFF_H+4*channel, off >> 8) + + def set_all_pwm(self, on, off): + """Sets all PWM channels.""" + self._device.write8(ALL_LED_ON_L, on & 0xFF) + self._device.write8(ALL_LED_ON_H, on >> 8) + self._device.write8(ALL_LED_OFF_L, off & 0xFF) + self._device.write8(ALL_LED_OFF_H, off >> 8) diff --git a/darkwater_640/Platform.py b/darkwater_640/Platform.py new file mode 100644 index 0000000..8ba4ca9 --- /dev/null +++ b/darkwater_640/Platform.py @@ -0,0 +1,106 @@ +# Copyright (c) 2014 Adafruit Industries +# Author: Tony DiCola + +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: + +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. + +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +import platform +import re + +# Platform identification constants. +UNKNOWN = 0 +RASPBERRY_PI = 1 +BEAGLEBONE_BLACK = 2 +MINNOWBOARD = 3 + +def platform_detect(): + """Detect if running on the Raspberry Pi or Beaglebone Black and return the + platform type. Will return RASPBERRY_PI, BEAGLEBONE_BLACK, or UNKNOWN.""" + # Handle Raspberry Pi + pi = pi_version() + if pi is not None: + return RASPBERRY_PI + + # Handle Beaglebone Black + # TODO: Check the Beaglebone Black /proc/cpuinfo value instead of reading + # the platform. + plat = platform.platform() + if plat.lower().find('armv7l-with-debian') > -1: + return BEAGLEBONE_BLACK + elif plat.lower().find('armv7l-with-ubuntu') > -1: + return BEAGLEBONE_BLACK + elif plat.lower().find('armv7l-with-glibc2.4') > -1: + return BEAGLEBONE_BLACK + + # Handle Minnowboard + # Assumption is that mraa is installed + try: + import mraa + if mraa.getPlatformName()=='MinnowBoard MAX': + return MINNOWBOARD + except ImportError: + pass + + # Couldn't figure out the platform, just return unknown. + return UNKNOWN + + +def pi_revision(): + """Detect the revision number of a Raspberry Pi, useful for changing + functionality like default I2C bus based on revision.""" + # Revision list available at: http://elinux.org/RPi_HardwareHistory#Board_Revision_History + with open('/proc/cpuinfo', 'r') as infile: + for line in infile: + # Match a line of the form "Revision : 0002" while ignoring extra + # info in front of the revsion (like 1000 when the Pi was over-volted). + match = re.match('Revision\s+:\s+.*(\w{4})$', line, flags=re.IGNORECASE) + if match and match.group(1) in ['0000', '0002', '0003']: + # Return revision 1 if revision ends with 0000, 0002 or 0003. + return 1 + elif match: + # Assume revision 2 if revision ends with any other 4 chars. + return 2 + # Couldn't find the revision, throw an exception. + raise RuntimeError('Could not determine Raspberry Pi revision.') + + +def pi_version(): + """Detect the version of the Raspberry Pi. Returns either 1, 2 or + None depending on if it's a Raspberry Pi 1 (model A, B, A+, B+), + Raspberry Pi 2 (model B+), or not a Raspberry Pi. + """ + # Check /proc/cpuinfo for the Hardware field value. + # 2708 is pi 1 + # 2709 is pi 2 + # Anything else is not a pi. + with open('/proc/cpuinfo', 'r') as infile: + cpuinfo = infile.read() + # Match a line like 'Hardware : BCM2709' + match = re.search('^Hardware\s+:\s+(\w+)$', cpuinfo, + flags=re.MULTILINE | re.IGNORECASE) + if not match: + # Couldn't find the hardware, assume it isn't a pi. + return None + if match.group(1) == 'BCM2708': + # Pi 1 + return 1 + elif match.group(1) == 'BCM2709': + # Pi 2 + return 2 + else: + # Something else, not a pi. + return None diff --git a/darkwater_640/SPI.py b/darkwater_640/SPI.py new file mode 100644 index 0000000..cfad79b --- /dev/null +++ b/darkwater_640/SPI.py @@ -0,0 +1,336 @@ +# Copyright (c) 2014 Adafruit Industries +# Author: Tony DiCola +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +import operator +import time + +import Adafruit_GPIO as GPIO + + +MSBFIRST = 0 +LSBFIRST = 1 + + +class SpiDev(object): + """Hardware-based SPI implementation using the spidev interface.""" + + def __init__(self, port, device, max_speed_hz=500000): + """Initialize an SPI device using the SPIdev interface. Port and device + identify the device, for example the device /dev/spidev1.0 would be port + 1 and device 0. + """ + import spidev + self._device = spidev.SpiDev() + self._device.open(port, device) + self._device.max_speed_hz=max_speed_hz + # Default to mode 0. + self._device.mode = 0 + + def set_clock_hz(self, hz): + """Set the speed of the SPI clock in hertz. Note that not all speeds + are supported and a lower speed might be chosen by the hardware. + """ + self._device.max_speed_hz=hz + + def set_mode(self, mode): + """Set SPI mode which controls clock polarity and phase. Should be a + numeric value 0, 1, 2, or 3. See wikipedia page for details on meaning: + http://en.wikipedia.org/wiki/Serial_Peripheral_Interface_Bus + """ + if mode < 0 or mode > 3: + raise ValueError('Mode must be a value 0, 1, 2, or 3.') + self._device.mode = mode + + def set_bit_order(self, order): + """Set order of bits to be read/written over serial lines. Should be + either MSBFIRST for most-significant first, or LSBFIRST for + least-signifcant first. + """ + if order == MSBFIRST: + self._device.lsbfirst = False + elif order == LSBFIRST: + self._device.lsbfirst = True + else: + raise ValueError('Order must be MSBFIRST or LSBFIRST.') + + def close(self): + """Close communication with the SPI device.""" + self._device.close() + + def write(self, data): + """Half-duplex SPI write. The specified array of bytes will be clocked + out the MOSI line. + """ + self._device.writebytes(data) + + def read(self, length): + """Half-duplex SPI read. The specified length of bytes will be clocked + in the MISO line and returned as a bytearray object. + """ + return bytearray(self._device.readbytes(length)) + + def transfer(self, data): + """Full-duplex SPI read and write. The specified array of bytes will be + clocked out the MOSI line, while simultaneously bytes will be read from + the MISO line. Read bytes will be returned as a bytearray object. + """ + return bytearray(self._device.xfer2(data)) + +class SpiDevMraa(object): + """Hardware SPI implementation with the mraa library on Minnowboard""" + def __init__(self, port, device, max_speed_hz=500000): + import mraa + self._device = mraa.Spi(0) + self._device.mode(0) + + def set_clock_hz(self, hz): + """Set the speed of the SPI clock in hertz. Note that not all speeds + are supported and a lower speed might be chosen by the hardware. + """ + self._device.frequency(hz) + + def set_mode(self,mode): + """Set SPI mode which controls clock polarity and phase. Should be a + numeric value 0, 1, 2, or 3. See wikipedia page for details on meaning: + http://en.wikipedia.org/wiki/Serial_Peripheral_Interface_Bus + """ + if mode < 0 or mode > 3: + raise ValueError('Mode must be a value 0, 1, 2, or 3.') + self._device.mode(mode) + + def set_mode(self,mode): + """Set SPI mode which controls clock polarity and phase. Should be a + numeric value 0, 1, 2, or 3. See wikipedia page for details on meaning: + http://en.wikipedia.org/wiki/Serial_Peripheral_Interface_Bus + """ + if mode < 0 or mode > 3: + raise ValueError('Mode must be a value 0, 1, 2, or 3.') + self._device.mode(mode) + + def set_bit_order(self, order): + """Set order of bits to be read/written over serial lines. Should be + either MSBFIRST for most-significant first, or LSBFIRST for + least-signifcant first. + """ + if order == MSBFIRST: + self._device.lsbmode(False) + elif order == LSBFIRST: + self._device.lsbmode(True) + else: + raise ValueError('Order must be MSBFIRST or LSBFIRST.') + + def close(self): + """Close communication with the SPI device.""" + self._device.Spi() + + def write(self, data): + """Half-duplex SPI write. The specified array of bytes will be clocked + out the MOSI line. + """ + self._device.write(bytearray(data)) + +class BitBang(object): + """Software-based implementation of the SPI protocol over GPIO pins.""" + + def __init__(self, gpio, sclk, mosi=None, miso=None, ss=None): + """Initialize bit bang (or software) based SPI. Must provide a BaseGPIO + class, the SPI clock, and optionally MOSI, MISO, and SS (slave select) + pin numbers. If MOSI is set to None then writes will be disabled and fail + with an error, likewise for MISO reads will be disabled. If SS is set to + None then SS will not be asserted high/low by the library when + transfering data. + """ + self._gpio = gpio + self._sclk = sclk + self._mosi = mosi + self._miso = miso + self._ss = ss + # Set pins as outputs/inputs. + gpio.setup(sclk, GPIO.OUT) + if mosi is not None: + gpio.setup(mosi, GPIO.OUT) + if miso is not None: + gpio.setup(miso, GPIO.IN) + if ss is not None: + gpio.setup(ss, GPIO.OUT) + # Assert SS high to start with device communication off. + gpio.set_high(ss) + # Assume mode 0. + self.set_mode(0) + # Assume most significant bit first order. + self.set_bit_order(MSBFIRST) + + def set_clock_hz(self, hz): + """Set the speed of the SPI clock. This is unsupported with the bit + bang SPI class and will be ignored. + """ + pass + + def set_mode(self, mode): + """Set SPI mode which controls clock polarity and phase. Should be a + numeric value 0, 1, 2, or 3. See wikipedia page for details on meaning: + http://en.wikipedia.org/wiki/Serial_Peripheral_Interface_Bus + """ + if mode < 0 or mode > 3: + raise ValueError('Mode must be a value 0, 1, 2, or 3.') + if mode & 0x02: + # Clock is normally high in mode 2 and 3. + self._clock_base = GPIO.HIGH + else: + # Clock is normally low in mode 0 and 1. + self._clock_base = GPIO.LOW + if mode & 0x01: + # Read on trailing edge in mode 1 and 3. + self._read_leading = False + else: + # Read on leading edge in mode 0 and 2. + self._read_leading = True + # Put clock into its base state. + self._gpio.output(self._sclk, self._clock_base) + + def set_bit_order(self, order): + """Set order of bits to be read/written over serial lines. Should be + either MSBFIRST for most-significant first, or LSBFIRST for + least-signifcant first. + """ + # Set self._mask to the bitmask which points at the appropriate bit to + # read or write, and appropriate left/right shift operator function for + # reading/writing. + if order == MSBFIRST: + self._mask = 0x80 + self._write_shift = operator.lshift + self._read_shift = operator.rshift + elif order == LSBFIRST: + self._mask = 0x01 + self._write_shift = operator.rshift + self._read_shift = operator.lshift + else: + raise ValueError('Order must be MSBFIRST or LSBFIRST.') + + def close(self): + """Close the SPI connection. Unused in the bit bang implementation.""" + pass + + def write(self, data, assert_ss=True, deassert_ss=True): + """Half-duplex SPI write. If assert_ss is True, the SS line will be + asserted low, the specified bytes will be clocked out the MOSI line, and + if deassert_ss is True the SS line be put back high. + """ + # Fail MOSI is not specified. + if self._mosi is None: + raise RuntimeError('Write attempted with no MOSI pin specified.') + if assert_ss and self._ss is not None: + self._gpio.set_low(self._ss) + for byte in data: + for i in range(8): + # Write bit to MOSI. + if self._write_shift(byte, i) & self._mask: + self._gpio.set_high(self._mosi) + else: + self._gpio.set_low(self._mosi) + # Flip clock off base. + self._gpio.output(self._sclk, not self._clock_base) + # Return clock to base. + self._gpio.output(self._sclk, self._clock_base) + if deassert_ss and self._ss is not None: + self._gpio.set_high(self._ss) + + def read(self, length, assert_ss=True, deassert_ss=True): + """Half-duplex SPI read. If assert_ss is true, the SS line will be + asserted low, the specified length of bytes will be clocked in the MISO + line, and if deassert_ss is true the SS line will be put back high. + Bytes which are read will be returned as a bytearray object. + """ + if self._miso is None: + raise RuntimeError('Read attempted with no MISO pin specified.') + if assert_ss and self._ss is not None: + self._gpio.set_low(self._ss) + result = bytearray(length) + for i in range(length): + for j in range(8): + # Flip clock off base. + self._gpio.output(self._sclk, not self._clock_base) + # Handle read on leading edge of clock. + if self._read_leading: + if self._gpio.is_high(self._miso): + # Set bit to 1 at appropriate location. + result[i] |= self._read_shift(self._mask, j) + else: + # Set bit to 0 at appropriate location. + result[i] &= ~self._read_shift(self._mask, j) + # Return clock to base. + self._gpio.output(self._sclk, self._clock_base) + # Handle read on trailing edge of clock. + if not self._read_leading: + if self._gpio.is_high(self._miso): + # Set bit to 1 at appropriate location. + result[i] |= self._read_shift(self._mask, j) + else: + # Set bit to 0 at appropriate location. + result[i] &= ~self._read_shift(self._mask, j) + if deassert_ss and self._ss is not None: + self._gpio.set_high(self._ss) + return result + + def transfer(self, data, assert_ss=True, deassert_ss=True): + """Full-duplex SPI read and write. If assert_ss is true, the SS line + will be asserted low, the specified bytes will be clocked out the MOSI + line while bytes will also be read from the MISO line, and if + deassert_ss is true the SS line will be put back high. Bytes which are + read will be returned as a bytearray object. + """ + if self._mosi is None: + raise RuntimeError('Write attempted with no MOSI pin specified.') + if self._mosi is None: + raise RuntimeError('Read attempted with no MISO pin specified.') + if assert_ss and self._ss is not None: + self._gpio.set_low(self._ss) + result = bytearray(len(data)) + for i in range(len(data)): + for j in range(8): + # Write bit to MOSI. + if self._write_shift(data[i], j) & self._mask: + self._gpio.set_high(self._mosi) + else: + self._gpio.set_low(self._mosi) + # Flip clock off base. + self._gpio.output(self._sclk, not self._clock_base) + # Handle read on leading edge of clock. + if self._read_leading: + if self._gpio.is_high(self._miso): + # Set bit to 1 at appropriate location. + result[i] |= self._read_shift(self._mask, j) + else: + # Set bit to 0 at appropriate location. + result[i] &= ~self._read_shift(self._mask, j) + # Return clock to base. + self._gpio.output(self._sclk, self._clock_base) + # Handle read on trailing edge of clock. + if not self._read_leading: + if self._gpio.is_high(self._miso): + # Set bit to 1 at appropriate location. + result[i] |= self._read_shift(self._mask, j) + else: + # Set bit to 0 at appropriate location. + result[i] &= ~self._read_shift(self._mask, j) + if deassert_ss and self._ss is not None: + self._gpio.set_high(self._ss) + return result diff --git a/Python/dw640HAT/__init__.py b/darkwater_640/__init__.py similarity index 100% rename from Python/dw640HAT/__init__.py rename to darkwater_640/__init__.py diff --git a/Python/dw640HAT/dw640HAT.py b/darkwater_640/darkwater_640.py similarity index 100% rename from Python/dw640HAT/dw640HAT.py rename to darkwater_640/darkwater_640.py diff --git a/Python/examples/640test.py b/examples/640test.py similarity index 100% rename from Python/examples/640test.py rename to examples/640test.py diff --git a/hardware/Mk4/640mk4.brd b/hardware/Mk4/640mk4.brd deleted file mode 100644 index fdf61c6..0000000 --- a/hardware/Mk4/640mk4.brd +++ /dev/null @@ -1,2843 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Born in Liverpool -FD -640 Mk4 -A0 -A1 -A2 -A3 -A4 -J1 -+1 -+2 -+3 -+4 -+5 -+6 -+ -Max 11V -CPPM -S1 -S2 -10uF -10uF -10uF -10uF -100nF -100nF -100nF -Amelia Earhart -http://darkwater.io - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -1 ->VALUE ->NAME - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ->NAME ->VALUE - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -<h3>SparkFun Electronics' preferred foot prints</h3> -In this library you'll find connectors and sockets- basically anything that can be plugged into or onto.<br><br> -We've spent an enormous amount of time creating and checking these footprints and parts, but it is the end user's responsibility to ensure correctness and suitablity for a given componet or application. If you enjoy using this library, please buy one of our products at www.sparkfun.com. -<br><br> -<b>Licensing:</b> Creative Commons ShareAlike 4.0 International - https://creativecommons.org/licenses/by-sa/4.0/ -<br><br> -You are welcome to use this library for commercial purposes. For attribution, we ask that when you begin to sell your device using our footprint, you email us with a link to the product being sold. We want bragging rights that we helped (in a very small part) to create your 8th world wonder. We would like the opportunity to feature your device on our homepage. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ->NAME ->VALUE - - - - - - - -<h3>SparkFun Electronics' preferred foot prints</h3> -In this library you'll find resistors, capacitors, inductors, test points, jumper pads, etc.<br><br> -We've spent an enormous amount of time creating and checking these footprints and parts, but it is the end user's responsibility to ensure correctness and suitablity for a given componet or application. If you enjoy using this library, please buy one of our products at www.sparkfun.com. -<br><br> -<b>Licensing:</b> Creative Commons ShareAlike 4.0 International - https://creativecommons.org/licenses/by-sa/4.0/ -<br><br> -You are welcome to use this library for commercial purposes. For attribution, we ask that when you begin to sell your device using our footprint, you email us with a link to the product being sold. We want bragging rights that we helped (in a very small part) to create your 8th world wonder. We would like the opportunity to feature your device on our homepage. - - - - - - ->NAME ->VALUE - - - - - - ->Value ->Name - - -<b>Chip Resistor Array</b> size 4 × 0603<p> -convex termination - Phycomp Components<br> -Source: RS Components - - - - - - - - - - - - ->NAME ->VALUE - - - - - - - - - - - - - - - - - - -Solder jumper, small, shorted with trace. No paste layer. Trace is cuttable. - - - - - - - - - ->NAME ->VALUE - - -Small solder jumper with no paste layer so it will open after reflow. - - - - - - - - ->NAME ->VALUE - - - - - - - -<h3>SparkFun Electronics' preferred foot prints</h3> -In this library you'll find discrete semiconductors- transistors, diodes, TRIACs, optoisolators, etc.<br><br> -We've spent an enormous amount of time creating and checking these footprints and parts, but it is the end user's responsibility to ensure correctness and suitablity for a given componet or application. If you enjoy using this library, please buy one of our products at www.sparkfun.com. -<br><br> -<b>Licensing:</b> Creative Commons ShareAlike 4.0 International - https://creativecommons.org/licenses/by-sa/4.0/ -<br><br> -You are welcome to use this library for commercial purposes. For attribution, we ask that when you begin to sell your device using our footprint, you email us with a link to the product being sold. We want bragging rights that we helped (in a very small part) to create your 8th world wonder. We would like the opportunity to feature your device on our homepage. - - - - - - - - - - - - - ->NAME ->VALUE - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ->NAME ->VALUE - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -<b>EAGLE Design Rules</b> -<p> -The default Design Rules have been set to cover -a wide range of applications. Your particular design -may have different requirements, so please make the -necessary adjustments and save your customized -design rules under a new name. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/hardware/Mk4/640mk4.sch b/hardware/Mk4/640mk4.sch deleted file mode 100644 index 6a6198f..0000000 --- a/hardware/Mk4/640mk4.sch +++ /dev/null @@ -1,4840 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -1 ->VALUE ->NAME - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ->VALUE ->NAME - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ->NAME ->VALUE - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -PCA9685 -16 Channel 12-Bit PWM -VDD: 2.3-5.5V -IO: 5V Safe -Output: 25mA Each/400mA Total -GND EXTCLK when not in use! ->NAME ->VALUE -I2C Address: 1[A5..A0][R/W] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -<b>PCA9685</b> - 16 Channel 12-Bit I2C PWM Controller -<p>5.0V tolerant 16 channel, 12-bit I2C PWM controller with 25mA per output (max. 400mA total)</p> -<p>Digikey: 568-5931-1-ND</p> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -For use by pick and place machines to calibrate the vision/machine, 1mm -<p>By microbuilder.eu</p> - - - - - - - - - - - - - - -<h3>SparkFun Electronics' preferred foot prints</h3> -In this library you'll find connectors and sockets- basically anything that can be plugged into or onto.<br><br> -We've spent an enormous amount of time creating and checking these footprints and parts, but it is the end user's responsibility to ensure correctness and suitablity for a given componet or application. If you enjoy using this library, please buy one of our products at www.sparkfun.com. -<br><br> -<b>Licensing:</b> Creative Commons ShareAlike 4.0 International - https://creativecommons.org/licenses/by-sa/4.0/ -<br><br> -You are welcome to use this library for commercial purposes. For attribution, we ask that when you begin to sell your device using our footprint, you email us with a link to the product being sold. We want bragging rights that we helped (in a very small part) to create your 8th world wonder. We would like the opportunity to feature your device on our homepage. - - - - - - - - - - - - - - - - - - ->NAME ->VALUE - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ->NAME ->VALUE - - -2mm SMD side-entry connector. tDocu layer indicates the actual physical plastic housing. +/- indicate SparkFun standard batteries and wiring. - - - - - - - - - - - - - ->Name ->Value - - - - - - - - - - - - - - - - - - - - - - - - - ->Name ->Value - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ->NAME ->VALUE - - - - - - - - - - - - - - - - - - ->NAME ->VALUE - - - - - - - - - - - - - - - - - - - -This footprint was designed to help hold the alignment of a through-hole component (i.e. 6-pin header) while soldering it into place. -You may notice that each hole has been shifted either up or down by 0.005 of an inch from it's more standard position (which is a perfectly straight line). -This slight alteration caused the pins (the squares in the middle) to touch the edges of the holes. Because they are alternating, it causes a "brace" -to hold the component in place. 0.005 has proven to be the perfect amount of "off-center" position when using our standard breakaway headers. -Although looks a little odd when you look at the bare footprint, once you have a header in there, the alteration is very hard to notice. Also, -if you push a header all the way into place, it is covered up entirely on the bottom side. This idea of altering the position of holes to aid alignment -will be further integrated into the Sparkfun Library for other footprints. It can help hold any component with 3 or more connection pins. - - - - - - - - - - - - - ->NAME ->VALUE - - - - - - - - - - - - - - - - - - - - - - ->NAME ->VALUE - - - - - - - - ->NAME ->VALUE - - - - - - ->Name ->Value -+ -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ->NAME ->VALUE - - - - - - - - - - - ->Name ->Value -+ -- - - -<H3>JST-2-PTH-KIT</h3> -2-Pin JST, through-hole connector<br> -<br> -<b>Warning:</b> This is the KIT version of this package. This package has a smaller diameter top stop mask, which doesn't cover the diameter of the pad. This means only the bottom side of the pads' copper will be exposed. You'll only be able to solder to the bottom side. - - - - - - - - - ->Name ->Value -+ -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ->Name ->Value -+ -- - - - - - - - - - - - - - - - - - - - - - - - - - ->NAME ->VALUE - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ->NAME ->VALUE - - - - - - - - - - - - - - - - - - - - - - - - - ->NAME ->VALUE - - - - - -This footprint was designed to help hold the alignment of a through-hole component (i.e. 6-pin header) while soldering it into place. -You may notice that each hole has been shifted either up or down by 0.005 of an inch from it's more standard position (which is a perfectly straight line). -This slight alteration caused the pins (the squares in the middle) to touch the edges of the holes. Because they are alternating, it causes a "brace" -to hold the component in place. 0.005 has proven to be the perfect amount of "off-center" position when using our standard breakaway headers. -Although looks a little odd when you look at the bare footprint, once you have a header in there, the alteration is very hard to notice. Also, -if you push a header all the way into place, it is covered up entirely on the bottom side. This idea of altering the position of holes to aid alignment -will be further integrated into the Sparkfun Library for other footprints. It can help hold any component with 3 or more connection pins. - - - - - - - - - - - - - - - ->NAME ->VALUE - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ->NAME ->VALUE - - - - - ->NAME ->VALUE - - - - - - - - - - ->NAME ->VALUE - - - - - - - - - - - - - - - ->Name ->Value -+ -- -S - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ->NAME ->VALUE - - - - - ->NAME ->VALUE - - - - - - - - - - - - - - - - - - - ->Name ->Value - - - - - - - - - - - - - ->NAME ->VALUE - - - - - - - - - - - - ->Value ->Name - - - - - - - - - - - - - - - - - - - - -<h3>SMD 3-Pin Male Right-Angle Header w/ Alignment posts</h3> - -Matches 4UCONN part # 11026<br> -<a href="http://www.4uconnector.com/online/object/4udrawing/11026.pdf">http://www.4uconnector.com/online/object/4udrawing/11026.pdf</a> - - - - - - - - - - - - - - - - - - - - -This 3-pin connector mates with the JST cable sold on SparkFun. - - - - - - - - - - - ->Name ->Value -+ -- -S - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ->VALUE ->NAME - - - - - - - - - - - ->VALUE ->NAME - - - - - - - -Standard 2-pin 0.1" header. Use with <br> -- straight break away headers ( PRT-00116)<br> -- right angle break away headers (PRT-00553)<br> -- swiss pins (PRT-00743)<br> -- machine pins (PRT-00117)<br> -- female headers (PRT-00115)<br><br> - - Molex polarized connector foot print use with: PRT-08233 with associated crimp pins and housings.<br><br> - -2.54_SCREWTERM for use with PRT-10571.<br><br> - -3.5mm Screw Terminal footprints for PRT-08084<br><br> - -5mm Screw Terminal footprints for use with PRT-08432 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -<b>Header 3</b> -Standard 3-pin 0.1" header. Use with straight break away headers (SKU : PRT-00116), right angle break away headers (PRT-00553), swiss pins (PRT-00743), machine pins (PRT-00117), and female headers (PRT-00115). Molex polarized connector foot print use with SKU : PRT-08232 with associated crimp pins and housings. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -<h3>SparkFun Electronics' preferred foot prints</h3> -In this library you'll find resistors, capacitors, inductors, test points, jumper pads, etc.<br><br> -We've spent an enormous amount of time creating and checking these footprints and parts, but it is the end user's responsibility to ensure correctness and suitablity for a given componet or application. If you enjoy using this library, please buy one of our products at www.sparkfun.com. -<br><br> -<b>Licensing:</b> Creative Commons ShareAlike 4.0 International - https://creativecommons.org/licenses/by-sa/4.0/ -<br><br> -You are welcome to use this library for commercial purposes. For attribution, we ask that when you begin to sell your device using our footprint, you email us with a link to the product being sold. We want bragging rights that we helped (in a very small part) to create your 8th world wonder. We would like the opportunity to feature your device on our homepage. - - - - - - - - - - ->NAME ->VALUE - - - - - - - - - ->NAME ->VALUE - - - - - ->Name ->Value - - - - - - - - - ->Name ->Value - - - - - - - - ->Name ->Value - - - - - - - - - - - - - - - - ->NAME ->VALUE - - - - - - - - - - - - - ->NAME ->VALUE - - - - - -<b>CAPACITOR</b><p> -chip - - - - - - - - - ->NAME ->VALUE - - - - - - - - ->Name ->Value - - - - - - - - - - - - ->Name ->Value - - - - - - - - - - ->NAME ->VALUE - - -CTZ3 Series land pattern for variable capacitor - CTZ3E-50C-W1-PF - - - - - - - - - - - - - - - - - ->NAME ->VALUE - - -<h3>CAP-PTH-SMALL-KIT</h3> -Commonly used for small ceramic capacitors. Like our 0.1uF (http://www.sparkfun.com/products/8375) or 22pF caps (http://www.sparkfun.com/products/8571).<br> -<br> -<b>Warning:</b> This is the KIT version of this package. This package has a smaller diameter top stop mask, which doesn't cover the diameter of the pad. This means only the bottom side of the pads' copper will be exposed. You'll only be able to solder to the bottom side. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -This is the "EZ" version of the .1" spaced ceramic thru-hole cap.<br> -It has reduced top mask to make it harder to put the component on the wrong side of the board. - - - - - - - ->Name ->Value - - - - - - - - - - - - - - - - - ->NAME ->VALUE - - - - - - - - - - - - - - ->NAME ->VALUE - - - - - - ->Value ->Name - - - - - - ->Name ->Value - - - - - - - - - - - - ->Name ->Value - - -<b>Panasonic Aluminium Electrolytic Capacitor VS-Serie Package G</b> - - - - - - - - - - - - - - - - - - - - ->NAME ->VALUE - - - - - - - - - - - - - - - -<b>Panasonic Aluminium Electrolytic Capacitor VS-Serie Package E</b> - - - - - - - - - - - - - - - - - - - - ->NAME ->VALUE - - - - - - - - - - - - - - - -<b>Panasonic Aluminium Electrolytic Capacitor VS-Serie Package E</b> - - - - - - - - - - - - - - - - - - - ->NAME ->VALUE - - - - - - - - - - - - - - - - - - - - - ->NAME ->VALUE - - - - - - - - - - - - - - - - - - - - - - ->NAME ->VALUE - - - - - - - - - - - - - - - - - - ->Value ->Name - - - - - - ->Value ->Name - - - - - - - - - ->NAME ->VALUE - - - - - - - - - - - - - - - - - - - - - - ->NAME ->VALUE - - - - - - - - - - - - - - - - - - - - - - - - -Type J2 package for SMD supercap PRT-10317 (p# EEC-EN0F204J2) - - - - - - - - - - - - - - - ->NAME ->VALUE - - -<h3>EIA3528-KIT</h3> -<b>Warning:</b> This is the KIT version of this package. This package has longer pads to make hand soldering easier.<br> - - - - - - - - - - - ->NAME ->VALUE - - -<h3>EIA3216-KIT</h3> -<b>Warning:</b> This is the KIT version of this package. This package has longer pads to make hand soldering easier.<br> - - - - - - - - - - - ->NAME ->VALUE - - -<b>Chip Resistor Array</b> size 4 × 0603<p> -convex termination - Phycomp Components<br> -Source: RS Components - - - - - - - - - - - - ->NAME ->VALUE - - - - - - - - - - - - - - - - - - -Solder jumper, small, shorted with trace. No paste layer. Trace is cuttable. - - - - - - - - - ->NAME ->VALUE - - -Small solder jumper with no paste layer so it will open after reflow. - - - - - - - - ->NAME ->VALUE - - - - ->NAME ->VALUE - - - - ->NAME ->VALUE - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ->Name ->Value - - -<b>RESISTOR</b><p> -chip - - - - - - - - - - ->NAME ->VALUE - - - - - - - - - - - - ->NAME ->VALUE - - - - - - -<b>CAPACITOR</b><p> -chip - - - - - - - - ->NAME ->VALUE - - - - - - -1/6W Thru-hole Resistor - *UNPROVEN* - - - - - - ->NAME ->VALUE - - - - - - ->NAME ->VALUE - - - - -1/4W Resistor, 0.4" wide<p> - -Yageo CFR series <a href="http://www.yageo.com/pdf/yageo/Leaded-R_CFR_2008.pdf">http://www.yageo.com/pdf/yageo/Leaded-R_CFR_2008.pdf</a> - - - - - - ->Name ->Value - - -1/2W Resistor, 0.5" wide<p> - -Yageo CFR series <a href="http://www.yageo.com/pdf/yageo/Leaded-R_CFR_2008.pdf">http://www.yageo.com/pdf/yageo/Leaded-R_CFR_2008.pdf</a> - - - - - - ->Name ->Value - - -1W Resistor, 0.6" wide<p> - -Yageo CFR series <a href="http://www.yageo.com/pdf/yageo/Leaded-R_CFR_2008.pdf">http://www.yageo.com/pdf/yageo/Leaded-R_CFR_2008.pdf</a> - - - - - - ->Name ->Value - - -2W Resistor, 0.8" wide<p> - -Yageo CFR series <a href="http://www.yageo.com/pdf/yageo/Leaded-R_CFR_2008.pdf">http://www.yageo.com/pdf/yageo/Leaded-R_CFR_2008.pdf</a> - - - - - - ->Name ->Value - - -<h3>AXIAL-0.3-KIT</h3> - -Commonly used for 1/4W through-hole resistors. 0.3" pitch between holes.<br> -<br> - -<b>Warning:</b> This is the KIT version of the AXIAL-0.3 package. This package has a smaller diameter top stop mask, which doesn't cover the diameter of the pad. This means only the bottom side of the pads' copper will be exposed. You'll only be able to solder to the bottom side. - - - - - - - - - - ->Name ->Value - - - - - - - - - - - - - - - - - - - - - - - - - - -This is the "EZ" version of the standard .3" spaced resistor package.<br> -It has a reduced top mask to make it harder to install upside-down. - - - - - - - - - - ->Name ->Value - - - - - - - - - - - - - - - - - - - - - - - - - ->NAME ->VALUE - - - - - - ->NAME ->VALUE - - - - - - - - - - ->NAME ->VALUE - - - - - - - - - - - - - - - ->NAME ->VALUE - - - - - - - - - ->NAME ->VALUE - - - - - - - - - ->NAME ->VALUE - - - - - - - - - - - - - ->NAME ->VALUE - - - - - - ->Name ->Value - - - - - -<b>Capacitor</b> -Standard 0603 ceramic capacitor, and 0.1" leaded capacitor. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -<b>Capacitor Polarized</b> -These are standard SMD and PTH capacitors. Normally 10uF, 47uF, and 100uF in electrolytic and tantalum varieties. Always verify the external diameter of the through hole cap, it varies with capacity, voltage, and manufacturer. The EIA devices should be standard. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -<b>Array Chip Resistor</b><p> -Source: RS Component / Phycomp - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -<b>Resistor</b> -Basic schematic elements and footprints for 0603, 1206, and PTH resistors. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Bare copper test points for troubleshooting or ICT - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -<h3>SparkFun Electronics' preferred foot prints</h3> -In this library you'll find discrete semiconductors- transistors, diodes, TRIACs, optoisolators, etc.<br><br> -We've spent an enormous amount of time creating and checking these footprints and parts, but it is the end user's responsibility to ensure correctness and suitablity for a given componet or application. If you enjoy using this library, please buy one of our products at www.sparkfun.com. -<br><br> -<b>Licensing:</b> Creative Commons ShareAlike 4.0 International - https://creativecommons.org/licenses/by-sa/4.0/ -<br><br> -You are welcome to use this library for commercial purposes. For attribution, we ask that when you begin to sell your device using our footprint, you email us with a link to the product being sold. We want bragging rights that we helped (in a very small part) to create your 8th world wonder. We would like the opportunity to feature your device on our homepage. - - - - - - - - - - - - - ->NAME ->VALUE - - -<b>TO 220 Vertical</b> Package works with various parts including N-Channel MOSFET SparkFun SKU: COM-10213 - - - - - - - - - - - - - - ->NAME ->VALUE - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ->NAME ->VALUE -D -S -G - - - - - - - - - - -Generic PMOSFET - -<ul> -<li> -IRLML2244 - TRANS-11153 -(SOT-23 -20V -4.3A) -(1.Gate 2.Source 3.Drain) -</li> -<li> -FQP27P06 - -<a href="http://www.sparkfun.com/products/10349">COM-10349</a> -(TO-220 -60V -27A) -(1.Gate 2.Source 3.Drain) -</li> -</ul> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -<b>Frames for Sheet and Layout</b> - - - - - - - - - - - - - - - - - - - - - - - ->DRAWING_NAME ->LAST_DATE_TIME ->SHEET -Sheet: - - - - - -<b>FRAME</b><p> -DIN A3, landscape with location and doc. field - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ->NAME ->VALUE - - - - - - - - - - - - - - - - - - - - - ->NAME ->VALUE - - - - -DUAL LOW VOLTAGE H-BRIDGE IC,SON-12 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -<h3>SparkFun Electronics' preferred foot prints</h3> -In this library you'll find non-functional items- supply symbols, logos, notations, frame blocks, etc.<br><br> -We've spent an enormous amount of time creating and checking these footprints and parts, but it is the end user's responsibility to ensure correctness and suitablity for a given componet or application. If you enjoy using this library, please buy one of our products at www.sparkfun.com. -<br><br> -<b>Licensing:</b> Creative Commons ShareAlike 4.0 International - https://creativecommons.org/licenses/by-sa/4.0/ -<br><br> -You are welcome to use this library for commercial purposes. For attribution, we ask that when you begin to sell your device using our footprint, you email us with a link to the product being sold. We want bragging rights that we helped (in a very small part) to create your 8th world wonder. We would like the opportunity to feature your device on our homepage. - - - - - ->VALUE - - - - - -<b>SUPPLY SYMBOL</b> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/hardware/Mk4/640mk4.zip b/hardware/Mk4/640mk4.zip deleted file mode 100644 index dcd4a6b3f8bbc9ebf35dbc65c3cd4b0c0e990f7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 92661 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 ^spI9 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 diff --git a/hardware/readme.md b/hardware/readme.md deleted file mode 100644 index cf55084..0000000 --- a/hardware/readme.md +++ /dev/null @@ -1 +0,0 @@ -Place holder for hardware file instructins diff --git a/license.txt b/license.txt deleted file mode 100644 index 34ec65f..0000000 --- a/license.txt +++ /dev/null @@ -1,425 +0,0 @@ -Attribution-ShareAlike 4.0 International - -======================================================================= - -Creative Commons Corporation ("Creative Commons") is not a law firm and -does not provide legal services or legal advice. Distribution of -Creative Commons public licenses does not create a lawyer-client or -other relationship. Creative Commons makes its licenses and related -information available on an "as-is" basis. Creative Commons gives no -warranties regarding its licenses, any material licensed under their -terms and conditions, or any related information. Creative Commons -disclaims all liability for damages resulting from their use to the -fullest extent possible. - -Using Creative Commons Public Licenses - -Creative Commons public licenses provide a standard set of terms and -conditions that creators and other rights holders may use to share -original works of authorship and other material subject to copyright -and certain other rights specified in the public license below. The -following considerations are for informational purposes only, are not -exhaustive, and do not form part of our licenses. - - Considerations for licensors: Our public licenses are - intended for use by those authorized to give the public - permission to use material in ways otherwise restricted by - copyright and certain other rights. Our licenses are - irrevocable. Licensors should read and understand the terms - and conditions of the license they choose before applying it. - Licensors should also secure all rights necessary before - applying our licenses so that the public can reuse the - material as expected. Licensors should clearly mark any - material not subject to the license. This includes other CC- - licensed material, or material used under an exception or - limitation to copyright. More considerations for licensors: - wiki.creativecommons.org/Considerations_for_licensors - - Considerations for the public: By using one of our public - licenses, a licensor grants the public permission to use the - licensed material under specified terms and conditions. If - the licensor's permission is not necessary for any reason--for - example, because of any applicable exception or limitation to - copyright--then that use is not regulated by the license. Our - licenses grant only permissions under copyright and certain - other rights that a licensor has authority to grant. Use of - the licensed material may still be restricted for other - reasons, including because others have copyright or other - rights in the material. A licensor may make special requests, - such as asking that all changes be marked or described. - Although not required by our licenses, you are encouraged to - respect those requests where reasonable. More_considerations - for the public: - wiki.creativecommons.org/Considerations_for_licensees - -======================================================================= - -Creative Commons Attribution-ShareAlike 4.0 International Public -License - -By exercising the Licensed Rights (defined below), You accept and agree -to be bound by the terms and conditions of this Creative Commons -Attribution-ShareAlike 4.0 International Public License ("Public -License"). To the extent this Public License may be interpreted as a -contract, You are granted the Licensed Rights in consideration of Your -acceptance of these terms and conditions, and the Licensor grants You -such rights in consideration of benefits the Licensor receives from -making the Licensed Material available under these terms and -conditions. - - -Section 1 -- Definitions. - - a. Adapted Material means material subject to Copyright and Similar - Rights that is derived from or based upon the Licensed Material - and in which the Licensed Material is translated, altered, - arranged, transformed, or otherwise modified in a manner requiring - permission under the Copyright and Similar Rights held by the - Licensor. For purposes of this Public License, where the Licensed - Material is a musical work, performance, or sound recording, - Adapted Material is always produced where the Licensed Material is - synched in timed relation with a moving image. - - b. Adapter's License means the license You apply to Your Copyright - and Similar Rights in Your contributions to Adapted Material in - accordance with the terms and conditions of this Public License. - - c. BY-SA Compatible License means a license listed at - creativecommons.org/compatiblelicenses, approved by Creative - Commons as essentially the equivalent of this Public License. - - d. Copyright and Similar Rights means copyright and/or similar rights - closely related to copyright including, without limitation, - performance, broadcast, sound recording, and Sui Generis Database - Rights, without regard to how the rights are labeled or - categorized. For purposes of this Public License, the rights - specified in Section 2(b)(1)-(2) are not Copyright and Similar - Rights. - - e. Effective Technological Measures means those measures that, in the - absence of proper authority, may not be circumvented under laws - fulfilling obligations under Article 11 of the WIPO Copyright - Treaty adopted on December 20, 1996, and/or similar international - agreements. - - f. Exceptions and Limitations means fair use, fair dealing, and/or - any other exception or limitation to Copyright and Similar Rights - that applies to Your use of the Licensed Material. - - g. License Elements means the license attributes listed in the name - of a Creative Commons Public License. The License Elements of this - Public License are Attribution and ShareAlike. - - h. Licensed Material means the artistic or literary work, database, - or other material to which the Licensor applied this Public - License. - - i. Licensed Rights means the rights granted to You subject to the - terms and conditions of this Public License, which are limited to - all Copyright and Similar Rights that apply to Your use of the - Licensed Material and that the Licensor has authority to license. - - j. Licensor means the individual(s) or entity(ies) granting rights - under this Public License. - - k. Share means to provide material to the public by any means or - process that requires permission under the Licensed Rights, such - as reproduction, public display, public performance, distribution, - dissemination, communication, or importation, and to make material - available to the public including in ways that members of the - public may access the material from a place and at a time - individually chosen by them. - - l. Sui Generis Database Rights means rights other than copyright - resulting from Directive 96/9/EC of the European Parliament and of - the Council of 11 March 1996 on the legal protection of databases, - as amended and/or succeeded, as well as other essentially - equivalent rights anywhere in the world. - - m. You means the individual or entity exercising the Licensed Rights - under this Public License. Your has a corresponding meaning. - - -Section 2 -- Scope. - - a. License grant. - - 1. Subject to the terms and conditions of this Public License, - the Licensor hereby grants You a worldwide, royalty-free, - non-sublicensable, non-exclusive, irrevocable license to - exercise the Licensed Rights in the Licensed Material to: - - a. reproduce and Share the Licensed Material, in whole or - in part; and - - b. produce, reproduce, and Share Adapted Material. - - 2. Exceptions and Limitations. For the avoidance of doubt, where - Exceptions and Limitations apply to Your use, this Public - License does not apply, and You do not need to comply with - its terms and conditions. - - 3. Term. The term of this Public License is specified in Section - 6(a). - - 4. Media and formats; technical modifications allowed. The - Licensor authorizes You to exercise the Licensed Rights in - all media and formats whether now known or hereafter created, - and to make technical modifications necessary to do so. The - Licensor waives and/or agrees not to assert any right or - authority to forbid You from making technical modifications - necessary to exercise the Licensed Rights, including - technical modifications necessary to circumvent Effective - Technological Measures. For purposes of this Public License, - simply making modifications authorized by this Section 2(a) - (4) never produces Adapted Material. - - 5. Downstream recipients. - - a. Offer from the Licensor -- Licensed Material. Every - recipient of the Licensed Material automatically - receives an offer from the Licensor to exercise the - Licensed Rights under the terms and conditions of this - Public License. - - b. Additional offer from the Licensor -- Adapted Material. - Every recipient of Adapted Material from You - automatically receives an offer from the Licensor to - exercise the Licensed Rights in the Adapted Material - under the conditions of the Adapter's License You apply. - - c. No downstream restrictions. You may not offer or impose - any additional or different terms or conditions on, or - apply any Effective Technological Measures to, the - Licensed Material if doing so restricts exercise of the - Licensed Rights by any recipient of the Licensed - Material. - - 6. No endorsement. Nothing in this Public License constitutes or - may be construed as permission to assert or imply that You - are, or that Your use of the Licensed Material is, connected - with, or sponsored, endorsed, or granted official status by, - the Licensor or others designated to receive attribution as - provided in Section 3(a)(1)(A)(i). - - b. Other rights. - - 1. Moral rights, such as the right of integrity, are not - licensed under this Public License, nor are publicity, - privacy, and/or other similar personality rights; however, to - the extent possible, the Licensor waives and/or agrees not to - assert any such rights held by the Licensor to the limited - extent necessary to allow You to exercise the Licensed - Rights, but not otherwise. - - 2. Patent and trademark rights are not licensed under this - Public License. - - 3. To the extent possible, the Licensor waives any right to - collect royalties from You for the exercise of the Licensed - Rights, whether directly or through a collecting society - under any voluntary or waivable statutory or compulsory - licensing scheme. In all other cases the Licensor expressly - reserves any right to collect such royalties. - - -Section 3 -- License Conditions. - -Your exercise of the Licensed Rights is expressly made subject to the -following conditions. - - a. Attribution. - - 1. If You Share the Licensed Material (including in modified - form), You must: - - a. retain the following if it is supplied by the Licensor - with the Licensed Material: - - i. identification of the creator(s) of the Licensed - Material and any others designated to receive - attribution, in any reasonable manner requested by - the Licensor (including by pseudonym if - designated); - - ii. a copyright notice; - - iii. a notice that refers to this Public License; - - iv. a notice that refers to the disclaimer of - warranties; - - v. a URI or hyperlink to the Licensed Material to the - extent reasonably practicable; - - b. indicate if You modified the Licensed Material and - retain an indication of any previous modifications; and - - c. indicate the Licensed Material is licensed under this - Public License, and include the text of, or the URI or - hyperlink to, this Public License. - - 2. You may satisfy the conditions in Section 3(a)(1) in any - reasonable manner based on the medium, means, and context in - which You Share the Licensed Material. For example, it may be - reasonable to satisfy the conditions by providing a URI or - hyperlink to a resource that includes the required - information. - - 3. If requested by the Licensor, You must remove any of the - information required by Section 3(a)(1)(A) to the extent - reasonably practicable. - - b. ShareAlike. - - In addition to the conditions in Section 3(a), if You Share - Adapted Material You produce, the following conditions also apply. - - 1. The Adapter's License You apply must be a Creative Commons - license with the same License Elements, this version or - later, or a BY-SA Compatible License. - - 2. You must include the text of, or the URI or hyperlink to, the - Adapter's License You apply. You may satisfy this condition - in any reasonable manner based on the medium, means, and - context in which You Share Adapted Material. - - 3. You may not offer or impose any additional or different terms - or conditions on, or apply any Effective Technological - Measures to, Adapted Material that restrict exercise of the - rights granted under the Adapter's License You apply. - - -Section 4 -- Sui Generis Database Rights. - -Where the Licensed Rights include Sui Generis Database Rights that -apply to Your use of the Licensed Material: - - a. for the avoidance of doubt, Section 2(a)(1) grants You the right - to extract, reuse, reproduce, and Share all or a substantial - portion of the contents of the database; - - b. if You include all or a substantial portion of the database - contents in a database in which You have Sui Generis Database - Rights, then the database in which You have Sui Generis Database - Rights (but not its individual contents) is Adapted Material, - - including for purposes of Section 3(b); and - c. You must comply with the conditions in Section 3(a) if You Share - all or a substantial portion of the contents of the database. - -For the avoidance of doubt, this Section 4 supplements and does not -replace Your obligations under this Public License where the Licensed -Rights include other Copyright and Similar Rights. - - -Section 5 -- Disclaimer of Warranties and Limitation of Liability. - - a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE - EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS - AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF - ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, - IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, - WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR - PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, - ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT - KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT - ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. - - b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE - TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, - NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, - INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, - COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR - USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN - ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR - DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR - IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. - - c. The disclaimer of warranties and limitation of liability provided - above shall be interpreted in a manner that, to the extent - possible, most closely approximates an absolute disclaimer and - waiver of all liability. - - -Section 6 -- Term and Termination. - - a. This Public License applies for the term of the Copyright and - Similar Rights licensed here. However, if You fail to comply with - this Public License, then Your rights under this Public License - terminate automatically. - - b. Where Your right to use the Licensed Material has terminated under - Section 6(a), it reinstates: - - 1. automatically as of the date the violation is cured, provided - it is cured within 30 days of Your discovery of the - violation; or - - 2. upon express reinstatement by the Licensor. - - For the avoidance of doubt, this Section 6(b) does not affect any - right the Licensor may have to seek remedies for Your violations - of this Public License. - - c. For the avoidance of doubt, the Licensor may also offer the - Licensed Material under separate terms or conditions or stop - distributing the Licensed Material at any time; however, doing so - will not terminate this Public License. - - d. Sections 1, 5, 6, 7, and 8 survive termination of this Public - License. - - -Section 7 -- Other Terms and Conditions. - - a. The Licensor shall not be bound by any additional or different - terms or conditions communicated by You unless expressly agreed. - - b. Any arrangements, understandings, or agreements regarding the - Licensed Material not stated herein are separate from and - independent of the terms and conditions of this Public License. - - -Section 8 -- Interpretation. - - a. For the avoidance of doubt, this Public License does not, and - shall not be interpreted to, reduce, limit, restrict, or impose - conditions on any use of the Licensed Material that could lawfully - be made without permission under this Public License. - - b. To the extent possible, if any provision of this Public License is - deemed unenforceable, it shall be automatically reformed to the - minimum extent necessary to make it enforceable. If the provision - cannot be reformed, it shall be severed from this Public License - without affecting the enforceability of the remaining terms and - conditions. - - c. No term or condition of this Public License will be waived and no - failure to comply consented to unless expressly agreed to by the - Licensor. - - d. Nothing in this Public License constitutes or may be interpreted - as a limitation upon, or waiver of, any privileges and immunities - that apply to the Licensor or You, including from the legal - processes of any jurisdiction or authority. - - -======================================================================= - -Creative Commons is not a party to its public licenses. -Notwithstanding, Creative Commons may elect to apply one of its public -licenses to material it publishes and in those instances will be -considered the "Licensor." Except for the limited purpose of indicating -that material is shared under a Creative Commons public license or as -otherwise permitted by the Creative Commons policies published at -creativecommons.org/policies, Creative Commons does not authorize the -use of the trademark "Creative Commons" or any other trademark or logo -of Creative Commons without its prior written consent including, -without limitation, in connection with any unauthorized modifications -to any of its public licenses or any other arrangements, -understandings, or agreements concerning use of licensed material. For -the avoidance of doubt, this paragraph does not form part of the public -licenses. - -Creative Commons may be contacted at creativecommons.org.