diff --git a/docs/examples/robot_keyboard_2.py b/docs/examples/robot_keyboard_2.py index 2150f86..abd7e50 100644 --- a/docs/examples/robot_keyboard_2.py +++ b/docs/examples/robot_keyboard_2.py @@ -12,9 +12,9 @@ devices = [InputDevice(device) for device in list_devices()] must_have = {i for i in range(1, 32)} must_not_have = {0} devices = [ - device - for device in devices - for keys in (set(device.capabilities().get(ecodes.EV_KEY, [])),) + dev + for dev in devices + for keys in (set(dev.capabilities().get(ecodes.EV_KEY, [])),) if must_have.issubset(keys) and must_not_have.isdisjoint(keys) ] diff --git a/docs/recipes.rst b/docs/recipes.rst index ccc7e51..6ca48d7 100644 --- a/docs/recipes.rst +++ b/docs/recipes.rst @@ -9,6 +9,8 @@ library. Please note that all recipes are written assuming Python 3. Recipes *may* work under Python 2, but no guarantees! +.. _pin_numbering: + Pin Numbering ============= @@ -18,8 +20,9 @@ configurable. .. _RPi.GPIO: https://pypi.python.org/pypi/RPi.GPIO -Any pin marked ``GPIO`` in the diagram below can be used for generic -components: +Any pin marked "GPIO" in the diagram below can be used as a pin number. For +example, if an LED was attached to "GPIO17" you would specify the pin number as +17 rather than 11: .. image:: images/pin_layout.* diff --git a/gpiozero/input_devices.py b/gpiozero/input_devices.py index eebe4ba..0076f3d 100644 --- a/gpiozero/input_devices.py +++ b/gpiozero/input_devices.py @@ -240,8 +240,8 @@ class Button(HoldMixin, DigitalInputDevice): print("The button was pressed!") :param int pin: - The GPIO pin which the button is attached to. See :doc:`notes` for - valid pin numbers. + The GPIO pin which the button is attached to. See :ref:`pin_numbering` + for valid pin numbers. :param bool pull_up: If ``True`` (the default), the GPIO pin will be pulled high by default. @@ -302,8 +302,8 @@ class LineSensor(SmoothedInputDevice): pause() :param int pin: - The GPIO pin which the sensor is attached to. See :doc:`notes` for - valid pin numbers. + The GPIO pin which the sensor is attached to. See :ref:`pin_numbering` + for valid pin numbers. :param int queue_len: The length of the queue used to store values read from the sensor. This @@ -371,8 +371,8 @@ class MotionSensor(SmoothedInputDevice): print("Motion detected!") :param int pin: - The GPIO pin which the sensor is attached to. See :doc:`notes` for - valid pin numbers. + The GPIO pin which the sensor is attached to. See :ref:`pin_numbering` + for valid pin numbers. :param int queue_len: The length of the queue used to store values read from the sensor. This @@ -435,8 +435,8 @@ class LightSensor(SmoothedInputDevice): print("Light detected!") :param int pin: - The GPIO pin which the sensor is attached to. See :doc:`notes` for - valid pin numbers. + The GPIO pin which the sensor is attached to. See :ref:`pin_numbering` + for valid pin numbers. :param int queue_len: The length of the queue used to store values read from the circuit. @@ -542,12 +542,12 @@ class DistanceSensor(SmoothedInputDevice): sleep(1) :param int echo: - The GPIO pin which the ECHO pin is attached to. See :doc:`notes` for - valid pin numbers. + The GPIO pin which the ECHO pin is attached to. See + :ref:`pin_numbering` for valid pin numbers. :param int trigger: - The GPIO pin which the TRIG pin is attached to. See :doc:`notes` for - valid pin numbers. + The GPIO pin which the TRIG pin is attached to. See + :ref:`pin_numbering` for valid pin numbers. :param int queue_len: The length of the queue used to store values read from the sensor. diff --git a/gpiozero/output_devices.py b/gpiozero/output_devices.py index ae62347..62bc911 100644 --- a/gpiozero/output_devices.py +++ b/gpiozero/output_devices.py @@ -217,8 +217,8 @@ class LED(DigitalOutputDevice): led.on() :param int pin: - The GPIO pin which the LED is attached to. See :doc:`notes` for valid - pin numbers. + The GPIO pin which the LED is attached to. See :ref:`pin_numbering` for + valid pin numbers. :param bool active_high: If ``True`` (the default), the LED will operate normally with the @@ -252,8 +252,8 @@ class Buzzer(DigitalOutputDevice): bz.on() :param int pin: - The GPIO pin which the buzzer is attached to. See :doc:`notes` for - valid pin numbers. + The GPIO pin which the buzzer is attached to. See :ref:`pin_numbering` + for valid pin numbers. :param bool active_high: If ``True`` (the default), the buzzer will operate normally with the @@ -276,8 +276,8 @@ class PWMOutputDevice(OutputDevice): Generic output device configured for pulse-width modulation (PWM). :param int pin: - The GPIO pin which the device is attached to. See :doc:`notes` for - valid pin numbers. + The GPIO pin which the device is attached to. See :ref:`pin_numbering` + for valid pin numbers. :param bool active_high: If ``True`` (the default), the :meth:`on` method will set the GPIO to @@ -483,7 +483,7 @@ class PWMLED(PWMOutputDevice): an optional resistor to prevent the LED from burning out. :param int pin: - The GPIO pin which the LED is attached to. See :doc:`notes` for + The GPIO pin which the LED is attached to. See :ref:`pin_numbering` for valid pin numbers. :param bool active_high: @@ -897,3 +897,4 @@ class Motor(SourceMixin, CompositeDevice): """ self.forward_device.off() self.backward_device.off() + diff --git a/gpiozero/pins/data.py b/gpiozero/pins/data.py index 6490042..2d39fe1 100644 --- a/gpiozero/pins/data.py +++ b/gpiozero/pins/data.py @@ -573,10 +573,12 @@ def _parse_pi_revision(revision): '3B': True, }.get(model, False) csi = { - 'Zero': 0 if pcb_revision == '0.0' else 1, + 'Zero': 0 if pcb_revision == '1.0' else 1, 'CM': 2, }.get(model, 1) - dsi = csi + dsi = { + 'Zero': 0, + }.get(model, csi) headers = { 'A': {'P1': REV2_P1, 'P5': REV2_P5}, 'B': {'P1': REV2_P1, 'P5': REV2_P5} if pcb_revision == '2.0' else {'P1': REV1_P1}, diff --git a/gpiozero/pins/pigpiod.py b/gpiozero/pins/pigpiod.py index f3ad7d5..537eb48 100644 --- a/gpiozero/pins/pigpiod.py +++ b/gpiozero/pins/pigpiod.py @@ -106,7 +106,7 @@ class PiGPIOPin(Pin): return cls._PINS[(host, port, number)] except KeyError: self = super(PiGPIOPin, cls).__new__(cls) - cls.pi_revision(host, port) # implicitly creates connection + cls.pi_info(host, port) # implicitly creates connection self._connection, self._pi_info = cls._CONNECTIONS[(host, port)] try: self._pi_info.physical_pin('GPIO%d' % number) @@ -129,7 +129,6 @@ class PiGPIOPin(Pin): raise ValueError(e) self._connection.set_pull_up_down(self._number, self.GPIO_PULL_UPS[self._pull]) self._connection.set_glitch_filter(self._number, 0) - self._connection.set_PWM_range(self._number, 255) cls._PINS[(host, port, number)] = self return self @@ -175,14 +174,19 @@ class PiGPIOPin(Pin): def _get_state(self): if self._pwm: - return self._connection.get_PWM_dutycycle(self._number) / 255 + return ( + self._connection.get_PWM_dutycycle(self._number) / + self._connection.get_PWM_range(self._number) + ) else: return bool(self._connection.read(self._number)) def _set_state(self, value): if self._pwm: try: - self._connection.set_PWM_dutycycle(self._number, int(value * 255)) + value = int(value * self._connection.get_PWM_range(self._number)) + if value != self._connection.get_PWM_dutycycle(self._number): + self._connection.set_PWM_dutycycle(self._number, value) except pigpio.error: raise PinInvalidState('invalid state "%s" for pin %r' % (value, self)) elif self.function == 'input': @@ -213,12 +217,15 @@ class PiGPIOPin(Pin): def _set_frequency(self, value): if not self._pwm and value is not None: self._connection.set_PWM_frequency(self._number, value) + self._connection.set_PWM_range(self._number, 10000) self._connection.set_PWM_dutycycle(self._number, 0) self._pwm = True elif self._pwm and value is not None: - self._connection.set_PWM_frequency(self._number, value) + if value != self._connection.get_PWM_frequency(self._number): + self._connection.set_PWM_frequency(self._number, value) + self._connection.set_PWM_range(self._number, 10000) elif self._pwm and value is None: - self._connection.set_PWM_dutycycle(self._number, 0) + self._connection.write(self._number, 0) self._pwm = False def _get_bounce(self):