Generic docs need reST
Conversion of all docs to reST so that the generic docs can link easily with the rest of the docs.
205
docs/Makefile
Normal file
@@ -0,0 +1,205 @@
|
||||
# Makefile for Sphinx documentation
|
||||
#
|
||||
|
||||
# You can set these variables from the command line.
|
||||
SPHINXOPTS =
|
||||
SPHINXBUILD = sphinx-build
|
||||
PAPER =
|
||||
BUILDDIR = _build
|
||||
DOT_DIAGRAMS := $(wildcard images/*.dot)
|
||||
MSC_DIAGRAMS := $(wildcard images/*.mscgen)
|
||||
GPI_DIAGRAMS := $(wildcard images/*.gpi)
|
||||
SVG_IMAGES := $(wildcard images/*.svg) $(DOT_DIAGRAMS:%.dot=%.svg) $(MSC_DIAGRAMS:%.mscgen=%.svg)
|
||||
PNG_IMAGES := $(wildcard images/*.png) $(GPI_DIAGRAMS:%.gpi=%.png) $(SVG_IMAGES:%.svg=%.png)
|
||||
PDF_IMAGES := $(SVG_IMAGES:%.svg=%.pdf) $(GPI_DIAGRAMS:%.gpi=%.pdf) $(DOT_DIAGRAMS:%.dot=%.pdf) $(MSC_DIAGRAMS:%.mscgen=%.pdf)
|
||||
|
||||
# User-friendly check for sphinx-build
|
||||
ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1)
|
||||
$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/)
|
||||
endif
|
||||
|
||||
# Internal variables.
|
||||
PAPEROPT_a4 = -D latex_paper_size=a4
|
||||
PAPEROPT_letter = -D latex_paper_size=letter
|
||||
ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
|
||||
# the i18n builder cannot share the environment and doctrees with the others
|
||||
I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
|
||||
|
||||
help:
|
||||
@echo "Please use \`make <target>' where <target> is one of"
|
||||
@echo " html to make standalone HTML files"
|
||||
@echo " dirhtml to make HTML files named index.html in directories"
|
||||
@echo " singlehtml to make a single large HTML file"
|
||||
@echo " pickle to make pickle files"
|
||||
@echo " json to make JSON files"
|
||||
@echo " htmlhelp to make HTML files and a HTML help project"
|
||||
@echo " qthelp to make HTML files and a qthelp project"
|
||||
@echo " devhelp to make HTML files and a Devhelp project"
|
||||
@echo " epub to make an epub"
|
||||
@echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
|
||||
@echo " latexpdf to make LaTeX files and run them through pdflatex"
|
||||
@echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx"
|
||||
@echo " text to make text files"
|
||||
@echo " man to make manual pages"
|
||||
@echo " texinfo to make Texinfo files"
|
||||
@echo " info to make Texinfo files and run them through makeinfo"
|
||||
@echo " gettext to make PO message catalogs"
|
||||
@echo " changes to make an overview of all changed/added/deprecated items"
|
||||
@echo " xml to make Docutils-native XML files"
|
||||
@echo " pseudoxml to make pseudoxml-XML files for display purposes"
|
||||
@echo " linkcheck to check all external links for integrity"
|
||||
@echo " doctest to run all doctests embedded in the documentation (if enabled)"
|
||||
|
||||
clean:
|
||||
rm -rf $(BUILDDIR)/*
|
||||
|
||||
html: $(SVG_IMAGES) $(PNG_IMAGES)
|
||||
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
|
||||
@echo
|
||||
@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
|
||||
|
||||
dirhtml: $(SVG_IMAGES) $(PNG_IMAGES)
|
||||
$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
|
||||
@echo
|
||||
@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
|
||||
|
||||
singlehtml: $(SVG_IMAGES) $(PNG_IMAGES)
|
||||
$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
|
||||
@echo
|
||||
@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
|
||||
|
||||
pickle:
|
||||
$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
|
||||
@echo
|
||||
@echo "Build finished; now you can process the pickle files."
|
||||
|
||||
json:
|
||||
$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
|
||||
@echo
|
||||
@echo "Build finished; now you can process the JSON files."
|
||||
|
||||
htmlhelp:
|
||||
$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
|
||||
@echo
|
||||
@echo "Build finished; now you can run HTML Help Workshop with the" \
|
||||
".hhp project file in $(BUILDDIR)/htmlhelp."
|
||||
|
||||
qthelp:
|
||||
$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
|
||||
@echo
|
||||
@echo "Build finished; now you can run "qcollectiongenerator" with the" \
|
||||
".qhcp project file in $(BUILDDIR)/qthelp, like this:"
|
||||
@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/picraft.qhcp"
|
||||
@echo "To view the help file:"
|
||||
@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/picraft.qhc"
|
||||
|
||||
devhelp:
|
||||
$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
|
||||
@echo
|
||||
@echo "Build finished."
|
||||
@echo "To view the help file:"
|
||||
@echo "# mkdir -p $$HOME/.local/share/devhelp/picraft"
|
||||
@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/picraft"
|
||||
@echo "# devhelp"
|
||||
|
||||
epub:
|
||||
$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
|
||||
@echo
|
||||
@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
|
||||
|
||||
latex: $(PDF_IMAGES)
|
||||
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
|
||||
@echo
|
||||
@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
|
||||
@echo "Run \`make' in that directory to run these through (pdf)latex" \
|
||||
"(use \`make latexpdf' here to do that automatically)."
|
||||
|
||||
latexpdf: $(PDF_IMAGES)
|
||||
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
|
||||
@echo "Running LaTeX files through pdflatex..."
|
||||
$(MAKE) -C $(BUILDDIR)/latex all-pdf
|
||||
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
|
||||
|
||||
latexpdfja: $(PDF_IMAGES)
|
||||
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
|
||||
@echo "Running LaTeX files through platex and dvipdfmx..."
|
||||
$(MAKE) -C $(BUILDDIR)/latex all-pdf-ja
|
||||
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
|
||||
|
||||
text:
|
||||
$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
|
||||
@echo
|
||||
@echo "Build finished. The text files are in $(BUILDDIR)/text."
|
||||
|
||||
man:
|
||||
$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
|
||||
@echo
|
||||
@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
|
||||
|
||||
texinfo:
|
||||
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
|
||||
@echo
|
||||
@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
|
||||
@echo "Run \`make' in that directory to run these through makeinfo" \
|
||||
"(use \`make info' here to do that automatically)."
|
||||
|
||||
info:
|
||||
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
|
||||
@echo "Running Texinfo files through makeinfo..."
|
||||
make -C $(BUILDDIR)/texinfo info
|
||||
@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
|
||||
|
||||
gettext:
|
||||
$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
|
||||
@echo
|
||||
@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
|
||||
|
||||
changes:
|
||||
$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
|
||||
@echo
|
||||
@echo "The overview file is in $(BUILDDIR)/changes."
|
||||
|
||||
linkcheck:
|
||||
$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
|
||||
@echo
|
||||
@echo "Link check complete; look for any errors in the above output " \
|
||||
"or in $(BUILDDIR)/linkcheck/output.txt."
|
||||
|
||||
doctest:
|
||||
$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
|
||||
@echo "Testing of doctests in the sources finished, look at the " \
|
||||
"results in $(BUILDDIR)/doctest/output.txt."
|
||||
|
||||
xml:
|
||||
$(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml
|
||||
@echo
|
||||
@echo "Build finished. The XML files are in $(BUILDDIR)/xml."
|
||||
|
||||
pseudoxml:
|
||||
$(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml
|
||||
@echo
|
||||
@echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml."
|
||||
|
||||
%.svg: %.mscgen
|
||||
mscgen -T svg -o $@ $<
|
||||
|
||||
%.svg: %.dot
|
||||
dot -T svg -o $@ $<
|
||||
|
||||
%.png: %.gpi common.gp
|
||||
gnuplot -e "set term pngcairo size 640,480" $< > $@
|
||||
|
||||
%.png: %.svg
|
||||
inkscape -e $@ $<
|
||||
|
||||
%.pdf: %.svg
|
||||
inkscape -A $@ $<
|
||||
|
||||
%.pdf: %.gpi common.gp
|
||||
gnuplot -e "set term pdfcairo size 10cm,7.5cm" $< > $@
|
||||
|
||||
%.pdf: %.mscgen
|
||||
mscgen -T eps -o - $< | ps2pdf -dEPSCrop - $@
|
||||
|
||||
.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext
|
||||
|
||||
80
docs/api_boards.rst
Normal file
@@ -0,0 +1,80 @@
|
||||
======================
|
||||
Boards and Accessories
|
||||
======================
|
||||
|
||||
.. currentmodule:: gpiozero
|
||||
|
||||
These additional interfaces are provided to group collections of components
|
||||
together for ease of use, and as examples. They are composites made up of
|
||||
components from the various :doc:`api_input` and :doc:`api_output` provided by
|
||||
GPIO Zero. See those pages for more information on using components
|
||||
individually.
|
||||
|
||||
.. note::
|
||||
|
||||
All GPIO pin numbers use Broadcom (BCM) numbering. See the :doc:`recipes`
|
||||
page for more information.
|
||||
|
||||
LED Board
|
||||
=========
|
||||
|
||||
.. autoclass:: LEDBoard(\*pins, pwm=False)
|
||||
:inherited-members:
|
||||
:members:
|
||||
|
||||
Traffic Lights
|
||||
==============
|
||||
|
||||
.. autoclass:: TrafficLights
|
||||
:inherited-members:
|
||||
:members:
|
||||
|
||||
PiLITEr
|
||||
=======
|
||||
|
||||
.. autoclass:: PiLiter
|
||||
:inherited-members:
|
||||
:members:
|
||||
|
||||
PI-TRAFFIC
|
||||
==========
|
||||
|
||||
.. autoclass:: PiTraffic
|
||||
:inherited-members:
|
||||
:members:
|
||||
|
||||
TrafficLightsBuzzer
|
||||
===================
|
||||
|
||||
.. autoclass:: TrafficLightsBuzzer
|
||||
:inherited-members:
|
||||
:members:
|
||||
|
||||
Fish Dish
|
||||
=========
|
||||
|
||||
.. autoclass:: FishDish
|
||||
:inherited-members:
|
||||
:members:
|
||||
|
||||
Traffic HAT
|
||||
===========
|
||||
|
||||
.. autoclass:: TrafficHat
|
||||
:inherited-members:
|
||||
:members:
|
||||
|
||||
Robot
|
||||
=====
|
||||
|
||||
.. autoclass:: Robot
|
||||
:inherited-members:
|
||||
:members:
|
||||
|
||||
Ryanteck MCB Robot
|
||||
==================
|
||||
|
||||
.. autoclass:: RyanteckRobot
|
||||
:inherited-members:
|
||||
:members:
|
||||
|
||||
87
docs/api_generic.rst
Normal file
@@ -0,0 +1,87 @@
|
||||
===============
|
||||
Generic Devices
|
||||
===============
|
||||
|
||||
.. currentmodule:: gpiozero
|
||||
|
||||
The GPIO Zero class hierarchy is quite extensive. It contains a couple of base
|
||||
classes:
|
||||
|
||||
* :class:`GPIODevice` for individual devices that attach to a single GPIO pin
|
||||
|
||||
* :class:`CompositeDevice` for devices composed of multiple other devices like
|
||||
HATs
|
||||
|
||||
There are also a couple of `mixin classes`_:
|
||||
|
||||
* :class:`ValuesMixin` which defines the ``values`` properties; there is rarely
|
||||
a need to use this as the base classes mentioned above both include it
|
||||
(so all classes in GPIO Zero include the ``values`` property)
|
||||
|
||||
* :class:`SourceMixin` which defines the ``source`` property; this is generally
|
||||
included in novel output device classes
|
||||
|
||||
.. _mixin classes: https://en.wikipedia.org/wiki/Mixin
|
||||
|
||||
The current class hierarchies are displayed below. For brevity, the mixin
|
||||
classes are omitted:
|
||||
|
||||
.. image:: images/gpio_device_hierarchy.*
|
||||
|
||||
.. image:: images/composite_device_hierarchy.*
|
||||
|
||||
Finally, for composite devices, the following chart shows which devices are
|
||||
composed of which other devices:
|
||||
|
||||
.. image:: images/composed_devices.*
|
||||
|
||||
Base Classes
|
||||
============
|
||||
|
||||
.. autoclass:: GPIODevice(pin)
|
||||
:inherited-members:
|
||||
:members:
|
||||
|
||||
.. autoclass:: CompositeDevice
|
||||
:inherited-members:
|
||||
:members:
|
||||
|
||||
Input Devices
|
||||
=============
|
||||
|
||||
.. autoclass:: InputDevice(pin, pull_up=False)
|
||||
:members:
|
||||
|
||||
.. autoclass:: WaitableInputDevice
|
||||
:members:
|
||||
|
||||
.. autoclass:: DigitalInputDevice(pin, pull_up=False, bounce_time=None)
|
||||
:members:
|
||||
|
||||
.. autoclass:: SmoothedInputDevice
|
||||
:members:
|
||||
|
||||
.. autoclass:: AnalogInputDevice
|
||||
:members:
|
||||
|
||||
Output Devices
|
||||
==============
|
||||
|
||||
.. autoclass:: OutputDevice(pin, active_high=True)
|
||||
:members:
|
||||
|
||||
.. autoclass:: PWMOutputDevice(pin, frequency=100)
|
||||
:members:
|
||||
|
||||
.. autoclass:: DigitalOutputDevice(pin, active_high=True)
|
||||
:members:
|
||||
|
||||
Mixin Classes
|
||||
=============
|
||||
|
||||
.. autoclass:: ValuesMixin(...)
|
||||
:members:
|
||||
|
||||
.. autoclass:: SourceMixin(...)
|
||||
:members:
|
||||
|
||||
59
docs/api_input.rst
Normal file
@@ -0,0 +1,59 @@
|
||||
=============
|
||||
Input Devices
|
||||
=============
|
||||
|
||||
.. currentmodule:: gpiozero
|
||||
|
||||
These input device component interfaces have been provided for simple use of
|
||||
everyday components. Components must be wired up correctly before use in code.
|
||||
|
||||
.. note::
|
||||
|
||||
All GPIO pin numbers use Broadcom (BCM) numbering. See the :doc:`recipes`
|
||||
page for more information.
|
||||
|
||||
|
||||
Button
|
||||
======
|
||||
|
||||
.. autoclass:: Button(pin, pull_up=True, bounce_time=None)
|
||||
:members: wait_for_press, wait_for_release, pin, is_pressed, pull_up, when_pressed, when_released
|
||||
|
||||
|
||||
Motion Sensor (PIR)
|
||||
===================
|
||||
|
||||
.. autoclass:: MotionSensor(pin, queue_len=1, sample_rate=10, threshold=0.5, partial=False)
|
||||
:members: wait_for_motion, wait_for_no_motion, pin, motion_detected, when_motion, when_no_motion
|
||||
|
||||
|
||||
Light Sensor (LDR)
|
||||
==================
|
||||
|
||||
.. autoclass:: LightSensor(pin, queue_len=5, charge_time_limit=0.01, threshold=0.1, partial=False)
|
||||
:members: wait_for_light, wait_for_dark, pin, light_detected, when_light, when_dark
|
||||
|
||||
Analog to Digital Converters (ADC)
|
||||
==================================
|
||||
|
||||
.. autoclass:: MCP3004
|
||||
:members: bus, device, channel, value, differential
|
||||
|
||||
.. autoclass:: MCP3008
|
||||
:members: bus, device, channel, value, differential
|
||||
|
||||
.. autoclass:: MCP3204
|
||||
:members: bus, device, channel, value, differential
|
||||
|
||||
.. autoclass:: MCP3208
|
||||
:members: bus, device, channel, value, differential
|
||||
|
||||
.. autoclass:: MCP3301
|
||||
:members: bus, device, value
|
||||
|
||||
.. autoclass:: MCP3302
|
||||
:members: bus, device, channel, value, differential
|
||||
|
||||
.. autoclass:: MCP3304
|
||||
:members: bus, device, channel, value, differential
|
||||
|
||||
44
docs/api_output.rst
Normal file
@@ -0,0 +1,44 @@
|
||||
==============
|
||||
Output Devices
|
||||
==============
|
||||
|
||||
.. currentmodule:: gpiozero
|
||||
|
||||
These output device component interfaces have been provided for simple use of
|
||||
everyday components. Components must be wired up correctly before use in code.
|
||||
|
||||
.. note::
|
||||
|
||||
All GPIO pin numbers use Broadcom (BCM) numbering. See the :doc:`recipes`
|
||||
page for more information.
|
||||
|
||||
|
||||
LED
|
||||
===
|
||||
|
||||
.. autoclass:: LED(pin, active_high=True)
|
||||
:members: on, off, toggle, blink, pin, is_lit
|
||||
|
||||
PWMLED
|
||||
======
|
||||
|
||||
.. autoclass:: PWMLED(pin, frequency=100)
|
||||
:members: on, off, toggle, blink, pin, is_lit, value
|
||||
|
||||
Buzzer
|
||||
======
|
||||
|
||||
.. autoclass:: Buzzer(pin, active_high=True)
|
||||
:members: on, off, toggle, beep, pin, is_active
|
||||
|
||||
RGBLED
|
||||
======
|
||||
|
||||
.. autoclass:: RGBLED(red, green, blue)
|
||||
:members: on, off, red, green, blue, value
|
||||
|
||||
Motor
|
||||
=====
|
||||
|
||||
.. autoclass:: Motor(forward, backward)
|
||||
:members: forward, backward, stop
|
||||
294
docs/boards.md
@@ -1,294 +0,0 @@
|
||||
# Add-on boards and accessories
|
||||
|
||||
These additional interfaces have been provided to group collections of
|
||||
components together for ease of use, and as examples. They are made up of
|
||||
components from the various [input devices](inputs.md) and
|
||||
[output devices](outputs.md) provided by `gpiozero`. See those pages for more
|
||||
information on using components individually.
|
||||
|
||||
*Note all GPIO pin numbers use BCM numbering. See the [notes](notes.md) page
|
||||
for more information.*
|
||||
|
||||
## LED Board
|
||||
|
||||
A Generic LED Board or collection of LEDs.
|
||||
|
||||
### Code
|
||||
|
||||
Ensure the `LEDBoard` class is imported at the top of the file:
|
||||
|
||||
```python
|
||||
from gpiozero import LEDBoard
|
||||
```
|
||||
|
||||
Create an `LEDBoard` object by passing in the LED pin numbers:
|
||||
|
||||
```python
|
||||
leds = LEDBoard(2, 3, 4, 5, 6)
|
||||
```
|
||||
|
||||
#### Methods
|
||||
|
||||
| Method | Description | Arguments |
|
||||
| ------ | ----------- | --------- |
|
||||
| `on()` | Turn all the LEDs on. | None |
|
||||
| `off()` | Turn all the LEDs off. | None |
|
||||
| `toggle()` | Toggle all the LEDs. For each LED, if it's on, turn it off; if it's off, turn it on. | None |
|
||||
| `blink()` | Make the LEDs turn on and off repeatedly. | `on_time` - The amount of time (in seconds) for the LED to be on each iteration. Default: `1` |
|
||||
| | | `off_time` - The amount of time (in seconds) for the LED to be off each iteration. Default: `1` |
|
||||
| | | `n` - The number of iterations. `None` means infinite. Default: `None` |
|
||||
| | | `background` - If True, start a background thread to continue blinking and return immediately. If False, only return when the blink is finished (warning: the default value of n will result in this method never returning). Default: `True` |
|
||||
|
||||
#### Properties
|
||||
|
||||
| Property | Description | Type |
|
||||
| -------- | ----------- | ---- |
|
||||
| `leds` | A collection of LEDs to access each one individually, or to iterate over them in sequence. | Tuple |
|
||||
|
||||
## Traffic Lights
|
||||
|
||||
Generic Traffic Lights set.
|
||||
|
||||
### Code
|
||||
|
||||
Ensure the `TrafficLights` class is imported at the top of the file:
|
||||
|
||||
```python
|
||||
from gpiozero import TrafficLights
|
||||
```
|
||||
|
||||
Create a `TrafficLights` object by passing in the LED pin numbers by name:
|
||||
|
||||
```python
|
||||
traffic = TrafficLights(red=2, amber=3, green=4)
|
||||
```
|
||||
|
||||
or just in order (red, amber, green):
|
||||
|
||||
```python
|
||||
traffic = TrafficLights(2, 3, 4)
|
||||
```
|
||||
|
||||
#### Initialisation options
|
||||
|
||||
```python
|
||||
TrafficLights(red=None, amber=None, green=None)
|
||||
```
|
||||
|
||||
| Argument | Description | Values | Default |
|
||||
| -------- | ----------- | ------ | ------- |
|
||||
| `red` | The GPIO pin number the red LED is connected to. | Integer: `0` to `25` | *Required* |
|
||||
| `amber` | The GPIO pin number the amber LED is connected to. | Integer: `0` to `25` | *Required* |
|
||||
| `green` | The GPIO pin number the green LED is connected to. | Integer: `0` to `25` | *Required* |
|
||||
|
||||
#### Methods
|
||||
|
||||
| Method | Description | Arguments |
|
||||
| ------ | ----------- | --------- |
|
||||
| `on()` | Turn all three LEDs on. | None |
|
||||
| `off()` | Turn all three LEDs off. | None |
|
||||
| `toggle()` | Toggle all three LEDs. For each LED, if it's on, turn it off; if it's off, turn it on. | None |
|
||||
| `blink()` | Make the LEDs turn on and off repeatedly. | `on_time` - The amount of time (in seconds) for the LED to be on each iteration. Default: `1` |
|
||||
| | | `off_time` - The amount of time (in seconds) for the LED to be off each iteration. Default: `1` |
|
||||
| | | `n` - The number of iterations. `None` means infinite. Default: `None` |
|
||||
| | | `background` - If True, start a background thread to continue blinking and return immediately. If False, only return when the blink is finished (warning: the default value of n will result in this method never returning). Default: `True` |
|
||||
|
||||
#### Properties
|
||||
|
||||
| Property | Description | Type |
|
||||
| -------- | ----------- | ---- |
|
||||
| `red` | Direct access to the red light as a single `LED` object. | LED |
|
||||
| `amber` | Direct access to the amber light as a single `LED` object. | LED |
|
||||
| `green` | Direct access to the green light as a single `LED` object. | LED |
|
||||
| `leds` | A collection of LEDs to access each one individually, or to iterate over them in sequence. | Tuple |
|
||||
|
||||
## PiLITEr
|
||||
|
||||
Ciseco Pi-LITEr: strip of 8 very bright LEDs.
|
||||
|
||||
### Code
|
||||
|
||||
Ensure the `PiLiter` class is imported at the top of the file:
|
||||
|
||||
```python
|
||||
from gpiozero import PiLiter
|
||||
```
|
||||
|
||||
Create a `PiLiter` object:
|
||||
|
||||
```python
|
||||
lite = PiLiter()
|
||||
```
|
||||
|
||||
#### Initialisation options
|
||||
|
||||
None
|
||||
|
||||
#### Methods
|
||||
|
||||
| Method | Description | Arguments |
|
||||
| ------ | ----------- | --------- |
|
||||
| `on()` | Turn all eight LEDs on. | None |
|
||||
| `off()` | Turn all eight LEDs off. | None |
|
||||
| `toggle()` | Toggle all eight LEDs. For each LED, if it's on, turn it off; if it's off, turn it on. | None |
|
||||
| `blink()` | Make all the LEDs turn on and off repeatedly. | `on_time` - The amount of time (in seconds) for the LED to be on each iteration. Default: `1` |
|
||||
| | | `off_time` - The amount of time (in seconds) for the LED to be off each iteration. Default: `1` |
|
||||
| | | `n` - The number of iterations. `None` means infinite. Default: `None` |
|
||||
| | | `background` - If True, start a background thread to continue blinking and return immediately. If False, only return when the blink is finished (warning: the default value of n will result in this method never returning). Default: `True` |
|
||||
|
||||
#### Properties
|
||||
|
||||
| Property | Description | Type |
|
||||
| -------- | ----------- | ---- |
|
||||
| `leds` | A collection of LEDs to access each one individually, or to iterate over them in sequence. | Tuple |
|
||||
|
||||
## PI-TRAFFIC
|
||||
|
||||
Low Voltage Labs PI-TRAFFIC: vertical traffic lights board on pins 9, 10 and 11.
|
||||
|
||||
Ensure the `PiTraffic` class is imported at the top of the file:
|
||||
|
||||
```python
|
||||
from gpiozero import PiTraffic
|
||||
```
|
||||
|
||||
Create a `PiTraffic` object:
|
||||
|
||||
```python
|
||||
traffic = PiTraffic()
|
||||
```
|
||||
|
||||
`PiTraffic` provides an identical interface to the generic `TrafficLights`
|
||||
interface, without the need to specify the pin numbers to be used.
|
||||
|
||||
The interface is identical to the generic `TrafficLights` interface.
|
||||
|
||||
To use the PI-TRAFFIC board on another set of pins, just use the generic
|
||||
`TrafficLights` interface.
|
||||
|
||||
## Fish Dish
|
||||
|
||||
Pi Supply Fish Dish: traffic light LEDs, a button and a buzzer.
|
||||
|
||||
### Code
|
||||
|
||||
Ensure the `FishDish` class is imported at the top of the file:
|
||||
|
||||
```python
|
||||
from gpiozero import FishDish
|
||||
```
|
||||
|
||||
Create a `FishDish` object:
|
||||
|
||||
```python
|
||||
fish = FishDish()
|
||||
```
|
||||
|
||||
#### Initialisation options
|
||||
|
||||
None
|
||||
|
||||
#### Methods
|
||||
|
||||
| Method | Description | Arguments |
|
||||
| ------ | ----------- | --------- |
|
||||
| `on()` | Turn all the board's output components on. | None |
|
||||
| `off()` | Turn all the board's output components off. | None |
|
||||
| `toggle()` | Toggle all the board's output components. For each component, if it's on, turn it off; if it's off, turn it on. | None || `toggle()` | Toggle all the LEDs. For each LED, if it's on, turn it off; if it's off, turn it on. | None |
|
||||
| `blink()` | Make the LEDs turn on and off repeatedly. | `on_time` - The amount of time (in seconds) for the LED to be on each iteration. Default: `1` |
|
||||
| | | `off_time` - The amount of time (in seconds) for the LED to be off each iteration. Default: `1` |
|
||||
| | | `n` - The number of iterations. `None` means infinite. Default: `None` |
|
||||
| | | `background` - If True, start a background thread to continue blinking and return immediately. If False, only return when the blink is finished (warning: the default value of n will result in this method never returning). Default: `True` |
|
||||
|
||||
#### Properties
|
||||
|
||||
| Property | Description | Type |
|
||||
| -------- | ----------- | ---- |
|
||||
| `lights` | Access to the three LEDs as a `TrafficLights` object. | TrafficLights |
|
||||
| `buzzer` | Direct access to the buzzer as a single `Buzzer` object. | LED |
|
||||
| `button` | Direct access to the button as a single `Button` object. | LED |
|
||||
| `all` | A collection of the board's output components to access each one individually, or to iterate over them in sequence. | Tuple |
|
||||
|
||||
## Traffic HAT
|
||||
|
||||
Ryanteck Traffic HAT: traffic light LEDs, a button and a buzzer.
|
||||
|
||||
### Code
|
||||
|
||||
Ensure the `TrafficHat` class is imported at the top of the file:
|
||||
|
||||
```python
|
||||
from gpiozero import TrafficHat
|
||||
```
|
||||
|
||||
Create a `TrafficHat` object by passing in the LED pin numbers by name:
|
||||
|
||||
```python
|
||||
traffic = TrafficHat()
|
||||
```
|
||||
|
||||
The interface is identical to the `FishDish`.
|
||||
|
||||
## Robot
|
||||
|
||||
Generic two-motor robot.
|
||||
|
||||
### Code
|
||||
|
||||
Ensure the `Robot` class is imported at the top of the file:
|
||||
|
||||
```python
|
||||
from gpiozero import Robot
|
||||
```
|
||||
|
||||
Create a `Robot` object by passing in the pin numbers of the forward and back
|
||||
pairs for each motor:
|
||||
|
||||
```python
|
||||
robot = Robot(left=(4, 14), right=(17, 18))
|
||||
```
|
||||
|
||||
#### Initialisation options
|
||||
|
||||
```python
|
||||
Robot(left=None, right=None))
|
||||
```
|
||||
|
||||
| Argument | Description | Values | Default |
|
||||
| -------- | ----------- | ------ | ------- |
|
||||
| `left` | The GPIO pins (forward and reverse) used by the left motor. | Tuple | *Required* |
|
||||
| `right` | The GPIO pins (forward and reverse) used by the right motor. | Tuple | *Required* |
|
||||
|
||||
#### Methods
|
||||
|
||||
| Method | Description | Arguments |
|
||||
| ------ | ----------- | --------- |
|
||||
| `forward()` | Drive the robot forwards. | `speed` - Speed at which to drive the motors, `0` to `1`. Default: `1` |
|
||||
| `backward()` | Drive the robot backwards. | `speed` - Speed at which to drive the motors, `0` to `1`. Default: `1` |
|
||||
| `left()` | Make the robot turn left. | `speed` - Speed at which to drive the motors, `0` to `1`. Default: `1` |
|
||||
| `right()` | Make the robot turn right. | `speed` - Speed at which to drive the motors, `0` to `1`. Default: `1` |
|
||||
| `stop()` | Stop the robot. | None |
|
||||
|
||||
## Ryanteck MCB Robot
|
||||
|
||||
Generic robot controller with pre-configured pin numbers.
|
||||
|
||||
Ensure the `RyanteckRobot` class is imported at the top of the file:
|
||||
|
||||
```python
|
||||
from gpiozero import RyanteckRobot
|
||||
```
|
||||
|
||||
Create a `RyanteckRobot` object:
|
||||
|
||||
```python
|
||||
robot = RyanteckRobot()
|
||||
```
|
||||
|
||||
The interface is identical to the generic `Robot` interface.
|
||||
|
||||
There's no need to configure the pins if you're using the default pins
|
||||
`(17, 18)` for the left motor and `(22, 23)` for the right motor.
|
||||
|
||||
To use the Ryanteck MCB on another set of pins, just use the generic `Robot`
|
||||
interface.
|
||||
69
docs/changelog.rst
Normal file
@@ -0,0 +1,69 @@
|
||||
=========
|
||||
Changelog
|
||||
=========
|
||||
|
||||
Release 1.0.0 (2015-11-16)
|
||||
==========================
|
||||
|
||||
* Debian packaging added (`#44`_)
|
||||
* :class:`~gpiozero.PWMLED` class added (`#58`_)
|
||||
* ``TemperatureSensor`` removed pending further work (`#93`_)
|
||||
* :meth:`~gpiozero.Buzzer.beep` alias method added (`#75`_)
|
||||
* :class:`~gpiozero.Motor` PWM devices exposed, and :class:`~gpiozero.Robot`
|
||||
motor devices exposed (`#107`_)
|
||||
|
||||
.. _#44: https://github.com/RPi-Distro/python-gpiozero/issues/44
|
||||
.. _#58: https://github.com/RPi-Distro/python-gpiozero/issues/58
|
||||
.. _#93: https://github.com/RPi-Distro/python-gpiozero/issues/93
|
||||
.. _#75: https://github.com/RPi-Distro/python-gpiozero/issues/75
|
||||
.. _#107: https://github.com/RPi-Distro/python-gpiozero/issues/107
|
||||
|
||||
Release 0.9.0 (2015-10-25)
|
||||
==========================
|
||||
|
||||
Fourth public beta
|
||||
|
||||
* Added source and values properties to all relevant classes (`#76`_)
|
||||
* Fix names of parameters in :class:`~gpiozero.Motor` constructor (`#79`_)
|
||||
* Added wrappers for LED groups on add-on boards (`#81`_)
|
||||
|
||||
.. _#76: https://github.com/RPi-Distro/python-gpiozero/issues/76
|
||||
.. _#79: https://github.com/RPi-Distro/python-gpiozero/issues/79
|
||||
.. _#81: https://github.com/RPi-Distro/python-gpiozero/issues/81
|
||||
|
||||
Release 0.8.0 (2015-10-16)
|
||||
==========================
|
||||
|
||||
Third public beta
|
||||
|
||||
* Added generic :class:`~gpiozero.AnalogInputDevice` class along with specific
|
||||
classes for the :class:`~gpiozero.MCP3008` and :class:`~gpiozero.MCP3004`
|
||||
(`#41`_)
|
||||
* Fixed :meth:`~gpiozero.DigitalOutputDevice.blink` (`#57`_)
|
||||
|
||||
.. _#41: https://github.com/RPi-Distro/python-gpiozero/issues/41
|
||||
.. _#57: https://github.com/RPi-Distro/python-gpiozero/issues/57
|
||||
|
||||
Release 0.7.0 (2015-10-09)
|
||||
==========================
|
||||
|
||||
Second public beta
|
||||
|
||||
Release 0.6.0 (2015-09-28)
|
||||
==========================
|
||||
|
||||
First public beta
|
||||
|
||||
Release 0.5.0 (2015-09-24)
|
||||
==========================
|
||||
|
||||
Release 0.4.0 (2015-09-23)
|
||||
==========================
|
||||
|
||||
Release 0.3.0 (2015-09-22)
|
||||
==========================
|
||||
|
||||
Release 0.2.0 (2015-09-21)
|
||||
==========================
|
||||
|
||||
Initial release
|
||||
148
docs/conf.py
Normal file
@@ -0,0 +1,148 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
import os
|
||||
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
|
||||
on_rtd = os.environ.get('READTHEDOCS', None) == 'True'
|
||||
import setup as _setup
|
||||
|
||||
# Mock out certain modules while building documentation
|
||||
class Mock(object):
|
||||
__all__ = []
|
||||
|
||||
def __init__(self, *args, **kw):
|
||||
pass
|
||||
|
||||
def __call__(self, *args, **kw):
|
||||
return Mock()
|
||||
|
||||
def __mul__(self, other):
|
||||
return Mock()
|
||||
|
||||
def __and__(self, other):
|
||||
return Mock()
|
||||
|
||||
def __bool__(self):
|
||||
return False
|
||||
|
||||
def __nonzero__(self):
|
||||
return False
|
||||
|
||||
@classmethod
|
||||
def __getattr__(cls, name):
|
||||
if name in ('__file__', '__path__'):
|
||||
return '/dev/null'
|
||||
else:
|
||||
return Mock()
|
||||
|
||||
sys.modules['RPi'] = Mock()
|
||||
sys.modules['RPi.GPIO'] = sys.modules['RPi'].GPIO
|
||||
sys.modules['w1thermsensor'] = Mock()
|
||||
sys.modules['spidev'] = Mock()
|
||||
|
||||
# -- General configuration ------------------------------------------------
|
||||
|
||||
extensions = ['sphinx.ext.autodoc', 'sphinx.ext.viewcode', 'sphinx.ext.intersphinx']
|
||||
templates_path = ['_templates']
|
||||
source_suffix = '.rst'
|
||||
#source_encoding = 'utf-8-sig'
|
||||
master_doc = 'index'
|
||||
project = _setup.__project__.title()
|
||||
copyright = '2015 %s' % _setup.__author__
|
||||
version = _setup.__version__
|
||||
release = _setup.__version__
|
||||
#language = None
|
||||
#today_fmt = '%B %d, %Y'
|
||||
exclude_patterns = ['_build']
|
||||
#default_role = None
|
||||
#add_function_parentheses = True
|
||||
#add_module_names = True
|
||||
#show_authors = False
|
||||
pygments_style = 'sphinx'
|
||||
#modindex_common_prefix = []
|
||||
#keep_warnings = False
|
||||
|
||||
# -- Autodoc configuration ------------------------------------------------
|
||||
|
||||
autodoc_member_order = 'groupwise'
|
||||
|
||||
# -- Intersphinx configuration --------------------------------------------
|
||||
|
||||
intersphinx_mapping = {
|
||||
'python': ('http://docs.python.org/3.4', None),
|
||||
}
|
||||
|
||||
# -- Options for HTML output ----------------------------------------------
|
||||
|
||||
if on_rtd:
|
||||
html_theme = 'sphinx_rtd_theme'
|
||||
#html_theme_options = {}
|
||||
#html_sidebars = {}
|
||||
else:
|
||||
html_theme = 'default'
|
||||
#html_theme_options = {}
|
||||
#html_sidebars = {}
|
||||
#html_theme_path = []
|
||||
#html_title = None
|
||||
#html_short_title = None
|
||||
#html_logo = None
|
||||
#html_favicon = None
|
||||
html_static_path = ['_static']
|
||||
#html_extra_path = []
|
||||
#html_last_updated_fmt = '%b %d, %Y'
|
||||
#html_use_smartypants = True
|
||||
#html_additional_pages = {}
|
||||
#html_domain_indices = True
|
||||
#html_use_index = True
|
||||
#html_split_index = False
|
||||
#html_show_sourcelink = True
|
||||
#html_show_sphinx = True
|
||||
#html_show_copyright = True
|
||||
#html_use_opensearch = ''
|
||||
#html_file_suffix = None
|
||||
htmlhelp_basename = '%sdoc' % _setup.__project__
|
||||
|
||||
# Hack to make wide tables work properly in RTD
|
||||
# See https://github.com/snide/sphinx_rtd_theme/issues/117 for details
|
||||
#def setup(app):
|
||||
# app.add_stylesheet('style_override.css')
|
||||
|
||||
# -- Options for LaTeX output ---------------------------------------------
|
||||
|
||||
latex_elements = {
|
||||
'papersize': 'a4paper',
|
||||
'pointsize': '10pt',
|
||||
#'preamble': '',
|
||||
}
|
||||
|
||||
latex_documents = [
|
||||
(
|
||||
'index', # source start file
|
||||
'%s.tex' % _setup.__project__, # target filename
|
||||
'%s Documentation' % project, # title
|
||||
_setup.__author__, # author
|
||||
'manual', # documentclass
|
||||
),
|
||||
]
|
||||
|
||||
#latex_logo = None
|
||||
#latex_use_parts = False
|
||||
#latex_show_pagerefs = False
|
||||
#latex_show_urls = False
|
||||
#latex_appendices = []
|
||||
#latex_domain_indices = True
|
||||
|
||||
# -- Options for manual page output ---------------------------------------
|
||||
|
||||
man_pages = []
|
||||
|
||||
#man_show_urls = False
|
||||
|
||||
# -- Options for Texinfo output -------------------------------------------
|
||||
|
||||
texinfo_documents = []
|
||||
|
||||
#texinfo_appendices = []
|
||||
#texinfo_domain_indices = True
|
||||
#texinfo_show_urls = 'footnote'
|
||||
#texinfo_no_detailmenu = False
|
||||
17
docs/images/composed_devices.dot
Normal file
@@ -0,0 +1,17 @@
|
||||
/* vim: set et sw=4 sts=4: */
|
||||
|
||||
digraph classes {
|
||||
graph [rankdir=TB];
|
||||
node [shape=rect, style=filled, color="#298029", fontname=Sans, fontcolor="#ffffff", fontsize=10];
|
||||
edge [arrowhead=onormal, style=dashed];
|
||||
|
||||
RGBLED->PWMLED;
|
||||
LEDBoard->LED;
|
||||
LEDBoard->PWMLED;
|
||||
|
||||
TrafficLightsBuzzer->TrafficLights;
|
||||
TrafficLightsBuzzer->Buzzer;
|
||||
TrafficLightsBuzzer->Button;
|
||||
|
||||
Robot->Motor;
|
||||
}
|
||||
BIN
docs/images/composed_devices.pdf
Normal file
BIN
docs/images/composed_devices.png
Normal file
|
After Width: | Height: | Size: 17 KiB |
98
docs/images/composed_devices.svg
Normal file
@@ -0,0 +1,98 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
|
||||
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<!-- Generated by graphviz version 2.36.0 (20140111.2315)
|
||||
-->
|
||||
<!-- Title: classes Pages: 1 -->
|
||||
<svg width="447pt" height="116pt"
|
||||
viewBox="0.00 0.00 447.00 116.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 112)">
|
||||
<title>classes</title>
|
||||
<polygon fill="white" stroke="none" points="-4,4 -4,-112 443,-112 443,4 -4,4"/>
|
||||
<!-- RGBLED -->
|
||||
<g id="node1" class="node"><title>RGBLED</title>
|
||||
<polygon fill="#298029" stroke="#298029" points="55.5,-108 0.5,-108 0.5,-72 55.5,-72 55.5,-108"/>
|
||||
<text text-anchor="middle" x="28" y="-87.5" font-family="Sans" font-size="10.00" fill="#ffffff">RGBLED</text>
|
||||
</g>
|
||||
<!-- PWMLED -->
|
||||
<g id="node2" class="node"><title>PWMLED</title>
|
||||
<polygon fill="#298029" stroke="#298029" points="58.5,-36 1.5,-36 1.5,-0 58.5,-0 58.5,-36"/>
|
||||
<text text-anchor="middle" x="30" y="-15.5" font-family="Sans" font-size="10.00" fill="#ffffff">PWMLED</text>
|
||||
</g>
|
||||
<!-- RGBLED->PWMLED -->
|
||||
<g id="edge1" class="edge"><title>RGBLED->PWMLED</title>
|
||||
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M28.4944,-71.6966C28.7148,-63.9827 28.9796,-54.7125 29.2254,-46.1124"/>
|
||||
<polygon fill="none" stroke="black" points="32.7242,-46.2002 29.5113,-36.1043 25.727,-46.0003 32.7242,-46.2002"/>
|
||||
</g>
|
||||
<!-- LEDBoard -->
|
||||
<g id="node3" class="node"><title>LEDBoard</title>
|
||||
<polygon fill="#298029" stroke="#298029" points="138,-108 74,-108 74,-72 138,-72 138,-108"/>
|
||||
<text text-anchor="middle" x="106" y="-87.5" font-family="Sans" font-size="10.00" fill="#ffffff">LEDBoard</text>
|
||||
</g>
|
||||
<!-- LEDBoard->PWMLED -->
|
||||
<g id="edge3" class="edge"><title>LEDBoard->PWMLED</title>
|
||||
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M87.2135,-71.6966C77.826,-63.0503 66.3156,-52.4486 56.0865,-43.027"/>
|
||||
<polygon fill="none" stroke="black" points="58.2971,-40.3047 48.5704,-36.1043 53.5547,-45.4535 58.2971,-40.3047"/>
|
||||
</g>
|
||||
<!-- LED -->
|
||||
<g id="node4" class="node"><title>LED</title>
|
||||
<polygon fill="#298029" stroke="#298029" points="133,-36 79,-36 79,-0 133,-0 133,-36"/>
|
||||
<text text-anchor="middle" x="106" y="-15.5" font-family="Sans" font-size="10.00" fill="#ffffff">LED</text>
|
||||
</g>
|
||||
<!-- LEDBoard->LED -->
|
||||
<g id="edge2" class="edge"><title>LEDBoard->LED</title>
|
||||
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M106,-71.6966C106,-63.9827 106,-54.7125 106,-46.1124"/>
|
||||
<polygon fill="none" stroke="black" points="109.5,-46.1043 106,-36.1043 102.5,-46.1044 109.5,-46.1043"/>
|
||||
</g>
|
||||
<!-- TrafficLightsBuzzer -->
|
||||
<g id="node5" class="node"><title>TrafficLightsBuzzer</title>
|
||||
<polygon fill="#298029" stroke="#298029" points="320.25,-108 215.75,-108 215.75,-72 320.25,-72 320.25,-108"/>
|
||||
<text text-anchor="middle" x="268" y="-87.5" font-family="Sans" font-size="10.00" fill="#ffffff">TrafficLightsBuzzer</text>
|
||||
</g>
|
||||
<!-- TrafficLights -->
|
||||
<g id="node6" class="node"><title>TrafficLights</title>
|
||||
<polygon fill="#298029" stroke="#298029" points="223,-36 151,-36 151,-0 223,-0 223,-36"/>
|
||||
<text text-anchor="middle" x="187" y="-15.5" font-family="Sans" font-size="10.00" fill="#ffffff">TrafficLights</text>
|
||||
</g>
|
||||
<!-- TrafficLightsBuzzer->TrafficLights -->
|
||||
<g id="edge4" class="edge"><title>TrafficLightsBuzzer->TrafficLights</title>
|
||||
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M247.978,-71.6966C237.874,-62.9655 225.464,-52.2405 214.482,-42.7503"/>
|
||||
<polygon fill="none" stroke="black" points="216.647,-39.9948 206.792,-36.1043 212.07,-45.2912 216.647,-39.9948"/>
|
||||
</g>
|
||||
<!-- Buzzer -->
|
||||
<g id="node7" class="node"><title>Buzzer</title>
|
||||
<polygon fill="#298029" stroke="#298029" points="295,-36 241,-36 241,-0 295,-0 295,-36"/>
|
||||
<text text-anchor="middle" x="268" y="-15.5" font-family="Sans" font-size="10.00" fill="#ffffff">Buzzer</text>
|
||||
</g>
|
||||
<!-- TrafficLightsBuzzer->Buzzer -->
|
||||
<g id="edge5" class="edge"><title>TrafficLightsBuzzer->Buzzer</title>
|
||||
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M268,-71.6966C268,-63.9827 268,-54.7125 268,-46.1124"/>
|
||||
<polygon fill="none" stroke="black" points="271.5,-46.1043 268,-36.1043 264.5,-46.1044 271.5,-46.1043"/>
|
||||
</g>
|
||||
<!-- Button -->
|
||||
<g id="node8" class="node"><title>Button</title>
|
||||
<polygon fill="#298029" stroke="#298029" points="367,-36 313,-36 313,-0 367,-0 367,-36"/>
|
||||
<text text-anchor="middle" x="340" y="-15.5" font-family="Sans" font-size="10.00" fill="#ffffff">Button</text>
|
||||
</g>
|
||||
<!-- TrafficLightsBuzzer->Button -->
|
||||
<g id="edge6" class="edge"><title>TrafficLightsBuzzer->Button</title>
|
||||
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M285.798,-71.6966C294.604,-63.135 305.382,-52.6562 315.001,-43.3045"/>
|
||||
<polygon fill="none" stroke="black" points="317.677,-45.5846 322.407,-36.1043 312.797,-40.5657 317.677,-45.5846"/>
|
||||
</g>
|
||||
<!-- Robot -->
|
||||
<g id="node9" class="node"><title>Robot</title>
|
||||
<polygon fill="#298029" stroke="#298029" points="439,-108 385,-108 385,-72 439,-72 439,-108"/>
|
||||
<text text-anchor="middle" x="412" y="-87.5" font-family="Sans" font-size="10.00" fill="#ffffff">Robot</text>
|
||||
</g>
|
||||
<!-- Motor -->
|
||||
<g id="node10" class="node"><title>Motor</title>
|
||||
<polygon fill="#298029" stroke="#298029" points="439,-36 385,-36 385,-0 439,-0 439,-36"/>
|
||||
<text text-anchor="middle" x="412" y="-15.5" font-family="Sans" font-size="10.00" fill="#ffffff">Motor</text>
|
||||
</g>
|
||||
<!-- Robot->Motor -->
|
||||
<g id="edge7" class="edge"><title>Robot->Motor</title>
|
||||
<path fill="none" stroke="black" stroke-dasharray="5,2" d="M412,-71.6966C412,-63.9827 412,-54.7125 412,-46.1124"/>
|
||||
<polygon fill="none" stroke="black" points="415.5,-46.1043 412,-36.1043 408.5,-46.1044 415.5,-46.1043"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 5.7 KiB |
32
docs/images/composite_device_hierarchy.dot
Normal file
@@ -0,0 +1,32 @@
|
||||
/* vim: set et sw=4 sts=4: */
|
||||
|
||||
digraph classes {
|
||||
graph [rankdir=BT];
|
||||
node [shape=rect, style=filled, color="#2980b9", fontname=Sans, fontcolor="#ffffff", fontsize=10];
|
||||
edge [];
|
||||
|
||||
AnalogInputDevice->CompositeDevice;
|
||||
MCP3xxx->AnalogInputDevice;
|
||||
MCP33xx->MCP3xxx;
|
||||
MCP3004->MCP3xxx;
|
||||
MCP3008->MCP3xxx;
|
||||
MCP3204->MCP3xxx;
|
||||
MCP3208->MCP3xxx;
|
||||
MCP3301->MCP33xx;
|
||||
MCP3302->MCP33xx;
|
||||
MCP3304->MCP33xx;
|
||||
|
||||
RGBLED->CompositeDevice;
|
||||
Motor->CompositeDevice;
|
||||
LEDBoard->CompositeDevice;
|
||||
PiLiter->LEDBoard;
|
||||
TrafficLights->LEDBoard;
|
||||
PiTraffic->TrafficLights;
|
||||
|
||||
TrafficLightsBuzzer->CompositeDevice;
|
||||
FishDish->TrafficLightsBuzzer;
|
||||
TrafficHat->TrafficLightsBuzzer;
|
||||
|
||||
Robot->CompositeDevice;
|
||||
RyanteckRobot->Robot;
|
||||
}
|
||||
BIN
docs/images/composite_device_hierarchy.pdf
Normal file
BIN
docs/images/composite_device_hierarchy.png
Normal file
|
After Width: | Height: | Size: 54 KiB |
228
docs/images/composite_device_hierarchy.svg
Normal file
@@ -0,0 +1,228 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
|
||||
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<!-- Generated by graphviz version 2.36.0 (20140111.2315)
|
||||
-->
|
||||
<!-- Title: classes Pages: 1 -->
|
||||
<svg width="713pt" height="332pt"
|
||||
viewBox="0.00 0.00 713.00 332.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 328)">
|
||||
<title>classes</title>
|
||||
<polygon fill="white" stroke="none" points="-4,4 -4,-328 709,-328 709,4 -4,4"/>
|
||||
<!-- AnalogInputDevice -->
|
||||
<g id="node1" class="node"><title>AnalogInputDevice</title>
|
||||
<polygon fill="#2980b9" stroke="#2980b9" points="562,-252 456,-252 456,-216 562,-216 562,-252"/>
|
||||
<text text-anchor="middle" x="509" y="-231.5" font-family="Sans" font-size="10.00" fill="#ffffff">AnalogInputDevice</text>
|
||||
</g>
|
||||
<!-- CompositeDevice -->
|
||||
<g id="node2" class="node"><title>CompositeDevice</title>
|
||||
<polygon fill="#2980b9" stroke="#2980b9" points="279.5,-324 178.5,-324 178.5,-288 279.5,-288 279.5,-324"/>
|
||||
<text text-anchor="middle" x="229" y="-303.5" font-family="Sans" font-size="10.00" fill="#ffffff">CompositeDevice</text>
|
||||
</g>
|
||||
<!-- AnalogInputDevice->CompositeDevice -->
|
||||
<g id="edge1" class="edge"><title>AnalogInputDevice->CompositeDevice</title>
|
||||
<path fill="none" stroke="black" d="M456.334,-248.166C408.908,-260.023 339.22,-277.445 289.518,-289.871"/>
|
||||
<polygon fill="black" stroke="black" points="288.396,-286.543 279.544,-292.364 290.094,-293.334 288.396,-286.543"/>
|
||||
</g>
|
||||
<!-- MCP3xxx -->
|
||||
<g id="node3" class="node"><title>MCP3xxx</title>
|
||||
<polygon fill="#2980b9" stroke="#2980b9" points="543.5,-180 484.5,-180 484.5,-144 543.5,-144 543.5,-180"/>
|
||||
<text text-anchor="middle" x="514" y="-159.5" font-family="Sans" font-size="10.00" fill="#ffffff">MCP3xxx</text>
|
||||
</g>
|
||||
<!-- MCP3xxx->AnalogInputDevice -->
|
||||
<g id="edge2" class="edge"><title>MCP3xxx->AnalogInputDevice</title>
|
||||
<path fill="none" stroke="black" d="M512.764,-180.303C512.213,-188.017 511.551,-197.288 510.937,-205.888"/>
|
||||
<polygon fill="black" stroke="black" points="507.443,-205.672 510.222,-215.896 514.425,-206.17 507.443,-205.672"/>
|
||||
</g>
|
||||
<!-- MCP33xx -->
|
||||
<g id="node4" class="node"><title>MCP33xx</title>
|
||||
<polygon fill="#2980b9" stroke="#2980b9" points="385,-108 325,-108 325,-72 385,-72 385,-108"/>
|
||||
<text text-anchor="middle" x="355" y="-87.5" font-family="Sans" font-size="10.00" fill="#ffffff">MCP33xx</text>
|
||||
</g>
|
||||
<!-- MCP33xx->MCP3xxx -->
|
||||
<g id="edge3" class="edge"><title>MCP33xx->MCP3xxx</title>
|
||||
<path fill="none" stroke="black" d="M384.534,-104.002C410.081,-115.249 447.204,-131.593 475.154,-143.898"/>
|
||||
<polygon fill="black" stroke="black" points="474.062,-147.241 484.624,-148.067 476.882,-140.835 474.062,-147.241"/>
|
||||
</g>
|
||||
<!-- MCP3004 -->
|
||||
<g id="node5" class="node"><title>MCP3004</title>
|
||||
<polygon fill="#2980b9" stroke="#2980b9" points="465,-108 403,-108 403,-72 465,-72 465,-108"/>
|
||||
<text text-anchor="middle" x="434" y="-87.5" font-family="Sans" font-size="10.00" fill="#ffffff">MCP3004</text>
|
||||
</g>
|
||||
<!-- MCP3004->MCP3xxx -->
|
||||
<g id="edge4" class="edge"><title>MCP3004->MCP3xxx</title>
|
||||
<path fill="none" stroke="black" d="M453.775,-108.303C463.754,-117.035 476.011,-127.76 486.857,-137.25"/>
|
||||
<polygon fill="black" stroke="black" points="484.622,-139.945 494.452,-143.896 489.231,-134.677 484.622,-139.945"/>
|
||||
</g>
|
||||
<!-- MCP3008 -->
|
||||
<g id="node6" class="node"><title>MCP3008</title>
|
||||
<polygon fill="#2980b9" stroke="#2980b9" points="545,-108 483,-108 483,-72 545,-72 545,-108"/>
|
||||
<text text-anchor="middle" x="514" y="-87.5" font-family="Sans" font-size="10.00" fill="#ffffff">MCP3008</text>
|
||||
</g>
|
||||
<!-- MCP3008->MCP3xxx -->
|
||||
<g id="edge5" class="edge"><title>MCP3008->MCP3xxx</title>
|
||||
<path fill="none" stroke="black" d="M514,-108.303C514,-116.017 514,-125.288 514,-133.888"/>
|
||||
<polygon fill="black" stroke="black" points="510.5,-133.896 514,-143.896 517.5,-133.896 510.5,-133.896"/>
|
||||
</g>
|
||||
<!-- MCP3204 -->
|
||||
<g id="node7" class="node"><title>MCP3204</title>
|
||||
<polygon fill="#2980b9" stroke="#2980b9" points="625,-108 563,-108 563,-72 625,-72 625,-108"/>
|
||||
<text text-anchor="middle" x="594" y="-87.5" font-family="Sans" font-size="10.00" fill="#ffffff">MCP3204</text>
|
||||
</g>
|
||||
<!-- MCP3204->MCP3xxx -->
|
||||
<g id="edge6" class="edge"><title>MCP3204->MCP3xxx</title>
|
||||
<path fill="none" stroke="black" d="M574.225,-108.303C564.246,-117.035 551.989,-127.76 541.143,-137.25"/>
|
||||
<polygon fill="black" stroke="black" points="538.769,-134.677 533.548,-143.896 543.378,-139.945 538.769,-134.677"/>
|
||||
</g>
|
||||
<!-- MCP3208 -->
|
||||
<g id="node8" class="node"><title>MCP3208</title>
|
||||
<polygon fill="#2980b9" stroke="#2980b9" points="705,-108 643,-108 643,-72 705,-72 705,-108"/>
|
||||
<text text-anchor="middle" x="674" y="-87.5" font-family="Sans" font-size="10.00" fill="#ffffff">MCP3208</text>
|
||||
</g>
|
||||
<!-- MCP3208->MCP3xxx -->
|
||||
<g id="edge7" class="edge"><title>MCP3208->MCP3xxx</title>
|
||||
<path fill="none" stroke="black" d="M643.15,-104.497C617.4,-115.762 580.557,-131.881 552.808,-144.022"/>
|
||||
<polygon fill="black" stroke="black" points="551.163,-140.921 543.405,-148.135 553.969,-147.334 551.163,-140.921"/>
|
||||
</g>
|
||||
<!-- MCP3301 -->
|
||||
<g id="node9" class="node"><title>MCP3301</title>
|
||||
<polygon fill="#2980b9" stroke="#2980b9" points="306,-36 244,-36 244,-0 306,-0 306,-36"/>
|
||||
<text text-anchor="middle" x="275" y="-15.5" font-family="Sans" font-size="10.00" fill="#ffffff">MCP3301</text>
|
||||
</g>
|
||||
<!-- MCP3301->MCP33xx -->
|
||||
<g id="edge8" class="edge"><title>MCP3301->MCP33xx</title>
|
||||
<path fill="none" stroke="black" d="M294.775,-36.3034C304.754,-45.0345 317.011,-55.7595 327.857,-65.2497"/>
|
||||
<polygon fill="black" stroke="black" points="325.622,-67.9446 335.452,-71.8957 330.231,-62.6766 325.622,-67.9446"/>
|
||||
</g>
|
||||
<!-- MCP3302 -->
|
||||
<g id="node10" class="node"><title>MCP3302</title>
|
||||
<polygon fill="#2980b9" stroke="#2980b9" points="386,-36 324,-36 324,-0 386,-0 386,-36"/>
|
||||
<text text-anchor="middle" x="355" y="-15.5" font-family="Sans" font-size="10.00" fill="#ffffff">MCP3302</text>
|
||||
</g>
|
||||
<!-- MCP3302->MCP33xx -->
|
||||
<g id="edge9" class="edge"><title>MCP3302->MCP33xx</title>
|
||||
<path fill="none" stroke="black" d="M355,-36.3034C355,-44.0173 355,-53.2875 355,-61.8876"/>
|
||||
<polygon fill="black" stroke="black" points="351.5,-61.8956 355,-71.8957 358.5,-61.8957 351.5,-61.8956"/>
|
||||
</g>
|
||||
<!-- MCP3304 -->
|
||||
<g id="node11" class="node"><title>MCP3304</title>
|
||||
<polygon fill="#2980b9" stroke="#2980b9" points="466,-36 404,-36 404,-0 466,-0 466,-36"/>
|
||||
<text text-anchor="middle" x="435" y="-15.5" font-family="Sans" font-size="10.00" fill="#ffffff">MCP3304</text>
|
||||
</g>
|
||||
<!-- MCP3304->MCP33xx -->
|
||||
<g id="edge10" class="edge"><title>MCP3304->MCP33xx</title>
|
||||
<path fill="none" stroke="black" d="M415.225,-36.3034C405.246,-45.0345 392.989,-55.7595 382.143,-65.2497"/>
|
||||
<polygon fill="black" stroke="black" points="379.769,-62.6766 374.548,-71.8957 384.378,-67.9446 379.769,-62.6766"/>
|
||||
</g>
|
||||
<!-- RGBLED -->
|
||||
<g id="node12" class="node"><title>RGBLED</title>
|
||||
<polygon fill="#2980b9" stroke="#2980b9" points="56,-252 0,-252 0,-216 56,-216 56,-252"/>
|
||||
<text text-anchor="middle" x="28" y="-231.5" font-family="Sans" font-size="10.00" fill="#ffffff">RGBLED</text>
|
||||
</g>
|
||||
<!-- RGBLED->CompositeDevice -->
|
||||
<g id="edge11" class="edge"><title>RGBLED->CompositeDevice</title>
|
||||
<path fill="none" stroke="black" d="M55.7289,-248.167C58.8345,-249.514 61.9702,-250.819 65,-252 98.836,-265.187 137.45,-277.783 168.706,-287.384"/>
|
||||
<polygon fill="black" stroke="black" points="167.994,-290.826 178.58,-290.393 170.035,-284.13 167.994,-290.826"/>
|
||||
</g>
|
||||
<!-- Motor -->
|
||||
<g id="node13" class="node"><title>Motor</title>
|
||||
<polygon fill="#2980b9" stroke="#2980b9" points="128,-252 74,-252 74,-216 128,-216 128,-252"/>
|
||||
<text text-anchor="middle" x="101" y="-231.5" font-family="Sans" font-size="10.00" fill="#ffffff">Motor</text>
|
||||
</g>
|
||||
<!-- Motor->CompositeDevice -->
|
||||
<g id="edge12" class="edge"><title>Motor->CompositeDevice</title>
|
||||
<path fill="none" stroke="black" d="M128.146,-249.845C145.837,-259.52 169.228,-272.312 189.029,-283.141"/>
|
||||
<polygon fill="black" stroke="black" points="187.388,-286.233 197.841,-287.96 190.747,-280.091 187.388,-286.233"/>
|
||||
</g>
|
||||
<!-- LEDBoard -->
|
||||
<g id="node14" class="node"><title>LEDBoard</title>
|
||||
<polygon fill="#2980b9" stroke="#2980b9" points="210,-252 146,-252 146,-216 210,-216 210,-252"/>
|
||||
<text text-anchor="middle" x="178" y="-231.5" font-family="Sans" font-size="10.00" fill="#ffffff">LEDBoard</text>
|
||||
</g>
|
||||
<!-- LEDBoard->CompositeDevice -->
|
||||
<g id="edge13" class="edge"><title>LEDBoard->CompositeDevice</title>
|
||||
<path fill="none" stroke="black" d="M190.607,-252.303C196.597,-260.526 203.876,-270.517 210.479,-279.579"/>
|
||||
<polygon fill="black" stroke="black" points="207.821,-281.874 216.538,-287.896 213.478,-277.752 207.821,-281.874"/>
|
||||
</g>
|
||||
<!-- PiLiter -->
|
||||
<g id="node15" class="node"><title>PiLiter</title>
|
||||
<polygon fill="#2980b9" stroke="#2980b9" points="118,-180 64,-180 64,-144 118,-144 118,-180"/>
|
||||
<text text-anchor="middle" x="91" y="-159.5" font-family="Sans" font-size="10.00" fill="#ffffff">PiLiter</text>
|
||||
</g>
|
||||
<!-- PiLiter->LEDBoard -->
|
||||
<g id="edge14" class="edge"><title>PiLiter->LEDBoard</title>
|
||||
<path fill="none" stroke="black" d="M112.506,-180.303C123.463,-189.119 136.946,-199.968 148.825,-209.526"/>
|
||||
<polygon fill="black" stroke="black" points="146.756,-212.354 156.742,-215.896 151.145,-206.9 146.756,-212.354"/>
|
||||
</g>
|
||||
<!-- TrafficLights -->
|
||||
<g id="node16" class="node"><title>TrafficLights</title>
|
||||
<polygon fill="#2980b9" stroke="#2980b9" points="208,-180 136,-180 136,-144 208,-144 208,-180"/>
|
||||
<text text-anchor="middle" x="172" y="-159.5" font-family="Sans" font-size="10.00" fill="#ffffff">TrafficLights</text>
|
||||
</g>
|
||||
<!-- TrafficLights->LEDBoard -->
|
||||
<g id="edge15" class="edge"><title>TrafficLights->LEDBoard</title>
|
||||
<path fill="none" stroke="black" d="M173.483,-180.303C174.144,-188.017 174.939,-197.288 175.676,-205.888"/>
|
||||
<polygon fill="black" stroke="black" points="172.193,-206.231 176.534,-215.896 179.167,-205.633 172.193,-206.231"/>
|
||||
</g>
|
||||
<!-- PiTraffic -->
|
||||
<g id="node17" class="node"><title>PiTraffic</title>
|
||||
<polygon fill="#2980b9" stroke="#2980b9" points="199,-108 145,-108 145,-72 199,-72 199,-108"/>
|
||||
<text text-anchor="middle" x="172" y="-87.5" font-family="Sans" font-size="10.00" fill="#ffffff">PiTraffic</text>
|
||||
</g>
|
||||
<!-- PiTraffic->TrafficLights -->
|
||||
<g id="edge16" class="edge"><title>PiTraffic->TrafficLights</title>
|
||||
<path fill="none" stroke="black" d="M172,-108.303C172,-116.017 172,-125.288 172,-133.888"/>
|
||||
<polygon fill="black" stroke="black" points="168.5,-133.896 172,-143.896 175.5,-133.896 168.5,-133.896"/>
|
||||
</g>
|
||||
<!-- TrafficLightsBuzzer -->
|
||||
<g id="node18" class="node"><title>TrafficLightsBuzzer</title>
|
||||
<polygon fill="#2980b9" stroke="#2980b9" points="333.5,-252 228.5,-252 228.5,-216 333.5,-216 333.5,-252"/>
|
||||
<text text-anchor="middle" x="281" y="-231.5" font-family="Sans" font-size="10.00" fill="#ffffff">TrafficLightsBuzzer</text>
|
||||
</g>
|
||||
<!-- TrafficLightsBuzzer->CompositeDevice -->
|
||||
<g id="edge17" class="edge"><title>TrafficLightsBuzzer->CompositeDevice</title>
|
||||
<path fill="none" stroke="black" d="M268.146,-252.303C261.975,-260.611 254.463,-270.723 247.676,-279.859"/>
|
||||
<polygon fill="black" stroke="black" points="244.86,-277.781 241.706,-287.896 250.479,-281.955 244.86,-277.781"/>
|
||||
</g>
|
||||
<!-- FishDish -->
|
||||
<g id="node19" class="node"><title>FishDish</title>
|
||||
<polygon fill="#2980b9" stroke="#2980b9" points="282,-180 226,-180 226,-144 282,-144 282,-180"/>
|
||||
<text text-anchor="middle" x="254" y="-159.5" font-family="Sans" font-size="10.00" fill="#ffffff">FishDish</text>
|
||||
</g>
|
||||
<!-- FishDish->TrafficLightsBuzzer -->
|
||||
<g id="edge18" class="edge"><title>FishDish->TrafficLightsBuzzer</title>
|
||||
<path fill="none" stroke="black" d="M260.674,-180.303C263.715,-188.187 267.383,-197.696 270.761,-206.454"/>
|
||||
<polygon fill="black" stroke="black" points="267.538,-207.825 274.403,-215.896 274.069,-205.306 267.538,-207.825"/>
|
||||
</g>
|
||||
<!-- TrafficHat -->
|
||||
<g id="node20" class="node"><title>TrafficHat</title>
|
||||
<polygon fill="#2980b9" stroke="#2980b9" points="361.5,-180 300.5,-180 300.5,-144 361.5,-144 361.5,-180"/>
|
||||
<text text-anchor="middle" x="331" y="-159.5" font-family="Sans" font-size="10.00" fill="#ffffff">TrafficHat</text>
|
||||
</g>
|
||||
<!-- TrafficHat->TrafficLightsBuzzer -->
|
||||
<g id="edge19" class="edge"><title>TrafficHat->TrafficLightsBuzzer</title>
|
||||
<path fill="none" stroke="black" d="M318.64,-180.303C312.767,-188.526 305.631,-198.517 299.158,-207.579"/>
|
||||
<polygon fill="black" stroke="black" points="296.182,-205.724 293.217,-215.896 301.878,-209.793 296.182,-205.724"/>
|
||||
</g>
|
||||
<!-- Robot -->
|
||||
<g id="node21" class="node"><title>Robot</title>
|
||||
<polygon fill="#2980b9" stroke="#2980b9" points="427,-252 373,-252 373,-216 427,-216 427,-252"/>
|
||||
<text text-anchor="middle" x="400" y="-231.5" font-family="Sans" font-size="10.00" fill="#ffffff">Robot</text>
|
||||
</g>
|
||||
<!-- Robot->CompositeDevice -->
|
||||
<g id="edge20" class="edge"><title>Robot->CompositeDevice</title>
|
||||
<path fill="none" stroke="black" d="M372.905,-246.092C348.091,-256.249 310.706,-271.553 280.26,-284.016"/>
|
||||
<polygon fill="black" stroke="black" points="278.572,-280.925 270.643,-287.953 281.224,-287.404 278.572,-280.925"/>
|
||||
</g>
|
||||
<!-- RyanteckRobot -->
|
||||
<g id="node22" class="node"><title>RyanteckRobot</title>
|
||||
<polygon fill="#2980b9" stroke="#2980b9" points="466,-180 380,-180 380,-144 466,-144 466,-180"/>
|
||||
<text text-anchor="middle" x="423" y="-159.5" font-family="Sans" font-size="10.00" fill="#ffffff">RyanteckRobot</text>
|
||||
</g>
|
||||
<!-- RyanteckRobot->Robot -->
|
||||
<g id="edge21" class="edge"><title>RyanteckRobot->Robot</title>
|
||||
<path fill="none" stroke="black" d="M417.315,-180.303C414.752,-188.102 411.667,-197.491 408.815,-206.171"/>
|
||||
<polygon fill="black" stroke="black" points="405.416,-205.303 405.62,-215.896 412.067,-207.488 405.416,-205.303"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 14 KiB |
23
docs/images/gpio_device_hierarchy.dot
Normal file
@@ -0,0 +1,23 @@
|
||||
/* vim: set et sw=4 sts=4: */
|
||||
|
||||
digraph classes {
|
||||
graph [rankdir=BT];
|
||||
node [shape=rect, style=filled, color="#2980b9", fontname=Sans, fontcolor="#ffffff", fontsize=10];
|
||||
edge [];
|
||||
|
||||
InputDevice->GPIODevice;
|
||||
WaitableInputDevice->InputDevice;
|
||||
DigitalInputDevice->WaitableInputDevice;
|
||||
SmoothedInputDevice->WaitableInputDevice;
|
||||
Button->DigitalInputDevice;
|
||||
MotionSensor->SmoothedInputDevice;
|
||||
LightSensor->SmoothedInputDevice;
|
||||
|
||||
OutputDevice->GPIODevice;
|
||||
DigitalOutputDevice->OutputDevice;
|
||||
LED->DigitalOutputDevice;
|
||||
Buzzer->DigitalOutputDevice;
|
||||
PWMOutputDevice->DigitalOutputDevice;
|
||||
PWMLED->PWMOutputDevice;
|
||||
}
|
||||
|
||||
BIN
docs/images/gpio_device_hierarchy.pdf
Normal file
BIN
docs/images/gpio_device_hierarchy.png
Normal file
|
After Width: | Height: | Size: 38 KiB |
148
docs/images/gpio_device_hierarchy.svg
Normal file
@@ -0,0 +1,148 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
|
||||
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<!-- Generated by graphviz version 2.36.0 (20140111.2315)
|
||||
-->
|
||||
<!-- Title: classes Pages: 1 -->
|
||||
<svg width="569pt" height="332pt"
|
||||
viewBox="0.00 0.00 569.00 332.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 328)">
|
||||
<title>classes</title>
|
||||
<polygon fill="white" stroke="none" points="-4,4 -4,-328 565,-328 565,4 -4,4"/>
|
||||
<!-- InputDevice -->
|
||||
<g id="node1" class="node"><title>InputDevice</title>
|
||||
<polygon fill="#2980b9" stroke="#2980b9" points="338.5,-252 265.5,-252 265.5,-216 338.5,-216 338.5,-252"/>
|
||||
<text text-anchor="middle" x="302" y="-231.5" font-family="Sans" font-size="10.00" fill="#ffffff">InputDevice</text>
|
||||
</g>
|
||||
<!-- GPIODevice -->
|
||||
<g id="node2" class="node"><title>GPIODevice</title>
|
||||
<polygon fill="#2980b9" stroke="#2980b9" points="274,-324 202,-324 202,-288 274,-288 274,-324"/>
|
||||
<text text-anchor="middle" x="238" y="-303.5" font-family="Sans" font-size="10.00" fill="#ffffff">GPIODevice</text>
|
||||
</g>
|
||||
<!-- InputDevice->GPIODevice -->
|
||||
<g id="edge1" class="edge"><title>InputDevice->GPIODevice</title>
|
||||
<path fill="none" stroke="black" d="M286.18,-252.303C278.43,-260.78 268.961,-271.136 260.476,-280.417"/>
|
||||
<polygon fill="black" stroke="black" points="257.803,-278.154 253.638,-287.896 262.969,-282.877 257.803,-278.154"/>
|
||||
</g>
|
||||
<!-- WaitableInputDevice -->
|
||||
<g id="node3" class="node"><title>WaitableInputDevice</title>
|
||||
<polygon fill="#2980b9" stroke="#2980b9" points="374.5,-180 261.5,-180 261.5,-144 374.5,-144 374.5,-180"/>
|
||||
<text text-anchor="middle" x="318" y="-159.5" font-family="Sans" font-size="10.00" fill="#ffffff">WaitableInputDevice</text>
|
||||
</g>
|
||||
<!-- WaitableInputDevice->InputDevice -->
|
||||
<g id="edge2" class="edge"><title>WaitableInputDevice->InputDevice</title>
|
||||
<path fill="none" stroke="black" d="M314.045,-180.303C312.282,-188.017 310.163,-197.288 308.197,-205.888"/>
|
||||
<polygon fill="black" stroke="black" points="304.726,-205.367 305.91,-215.896 311.55,-206.927 304.726,-205.367"/>
|
||||
</g>
|
||||
<!-- DigitalInputDevice -->
|
||||
<g id="node4" class="node"><title>DigitalInputDevice</title>
|
||||
<polygon fill="#2980b9" stroke="#2980b9" points="369.5,-108 266.5,-108 266.5,-72 369.5,-72 369.5,-108"/>
|
||||
<text text-anchor="middle" x="318" y="-87.5" font-family="Sans" font-size="10.00" fill="#ffffff">DigitalInputDevice</text>
|
||||
</g>
|
||||
<!-- DigitalInputDevice->WaitableInputDevice -->
|
||||
<g id="edge3" class="edge"><title>DigitalInputDevice->WaitableInputDevice</title>
|
||||
<path fill="none" stroke="black" d="M318,-108.303C318,-116.017 318,-125.288 318,-133.888"/>
|
||||
<polygon fill="black" stroke="black" points="314.5,-133.896 318,-143.896 321.5,-133.896 314.5,-133.896"/>
|
||||
</g>
|
||||
<!-- SmoothedInputDevice -->
|
||||
<g id="node5" class="node"><title>SmoothedInputDevice</title>
|
||||
<polygon fill="#2980b9" stroke="#2980b9" points="510.5,-108 387.5,-108 387.5,-72 510.5,-72 510.5,-108"/>
|
||||
<text text-anchor="middle" x="449" y="-87.5" font-family="Sans" font-size="10.00" fill="#ffffff">SmoothedInputDevice</text>
|
||||
</g>
|
||||
<!-- SmoothedInputDevice->WaitableInputDevice -->
|
||||
<g id="edge4" class="edge"><title>SmoothedInputDevice->WaitableInputDevice</title>
|
||||
<path fill="none" stroke="black" d="M416.954,-108.124C399.508,-117.446 377.735,-129.081 359.057,-139.061"/>
|
||||
<polygon fill="black" stroke="black" points="357.34,-136.01 350.169,-143.81 360.639,-142.184 357.34,-136.01"/>
|
||||
</g>
|
||||
<!-- Button -->
|
||||
<g id="node6" class="node"><title>Button</title>
|
||||
<polygon fill="#2980b9" stroke="#2980b9" points="345,-36 291,-36 291,-0 345,-0 345,-36"/>
|
||||
<text text-anchor="middle" x="318" y="-15.5" font-family="Sans" font-size="10.00" fill="#ffffff">Button</text>
|
||||
</g>
|
||||
<!-- Button->DigitalInputDevice -->
|
||||
<g id="edge5" class="edge"><title>Button->DigitalInputDevice</title>
|
||||
<path fill="none" stroke="black" d="M318,-36.3034C318,-44.0173 318,-53.2875 318,-61.8876"/>
|
||||
<polygon fill="black" stroke="black" points="314.5,-61.8956 318,-71.8957 321.5,-61.8957 314.5,-61.8956"/>
|
||||
</g>
|
||||
<!-- MotionSensor -->
|
||||
<g id="node7" class="node"><title>MotionSensor</title>
|
||||
<polygon fill="#2980b9" stroke="#2980b9" points="468.5,-36 385.5,-36 385.5,-0 468.5,-0 468.5,-36"/>
|
||||
<text text-anchor="middle" x="427" y="-15.5" font-family="Sans" font-size="10.00" fill="#ffffff">MotionSensor</text>
|
||||
</g>
|
||||
<!-- MotionSensor->SmoothedInputDevice -->
|
||||
<g id="edge6" class="edge"><title>MotionSensor->SmoothedInputDevice</title>
|
||||
<path fill="none" stroke="black" d="M432.438,-36.3034C434.889,-44.1021 437.84,-53.4915 440.568,-62.1708"/>
|
||||
<polygon fill="black" stroke="black" points="437.287,-63.4051 443.624,-71.8957 443.965,-61.3063 437.287,-63.4051"/>
|
||||
</g>
|
||||
<!-- LightSensor -->
|
||||
<g id="node8" class="node"><title>LightSensor</title>
|
||||
<polygon fill="#2980b9" stroke="#2980b9" points="561,-36 487,-36 487,-0 561,-0 561,-36"/>
|
||||
<text text-anchor="middle" x="524" y="-15.5" font-family="Sans" font-size="10.00" fill="#ffffff">LightSensor</text>
|
||||
</g>
|
||||
<!-- LightSensor->SmoothedInputDevice -->
|
||||
<g id="edge7" class="edge"><title>LightSensor->SmoothedInputDevice</title>
|
||||
<path fill="none" stroke="black" d="M505.461,-36.3034C496.197,-44.9497 484.838,-55.5514 474.743,-64.973"/>
|
||||
<polygon fill="black" stroke="black" points="472.249,-62.5137 467.326,-71.8957 477.025,-67.6312 472.249,-62.5137"/>
|
||||
</g>
|
||||
<!-- OutputDevice -->
|
||||
<g id="node9" class="node"><title>OutputDevice</title>
|
||||
<polygon fill="#2980b9" stroke="#2980b9" points="216,-252 134,-252 134,-216 216,-216 216,-252"/>
|
||||
<text text-anchor="middle" x="175" y="-231.5" font-family="Sans" font-size="10.00" fill="#ffffff">OutputDevice</text>
|
||||
</g>
|
||||
<!-- OutputDevice->GPIODevice -->
|
||||
<g id="edge8" class="edge"><title>OutputDevice->GPIODevice</title>
|
||||
<path fill="none" stroke="black" d="M190.573,-252.303C198.202,-260.78 207.523,-271.136 215.876,-280.417"/>
|
||||
<polygon fill="black" stroke="black" points="213.315,-282.804 222.606,-287.896 218.518,-278.121 213.315,-282.804"/>
|
||||
</g>
|
||||
<!-- DigitalOutputDevice -->
|
||||
<g id="node10" class="node"><title>DigitalOutputDevice</title>
|
||||
<polygon fill="#2980b9" stroke="#2980b9" points="170,-180 58,-180 58,-144 170,-144 170,-180"/>
|
||||
<text text-anchor="middle" x="114" y="-159.5" font-family="Sans" font-size="10.00" fill="#ffffff">DigitalOutputDevice</text>
|
||||
</g>
|
||||
<!-- DigitalOutputDevice->OutputDevice -->
|
||||
<g id="edge9" class="edge"><title>DigitalOutputDevice->OutputDevice</title>
|
||||
<path fill="none" stroke="black" d="M129.079,-180.303C136.392,-188.695 145.31,-198.93 153.335,-208.139"/>
|
||||
<polygon fill="black" stroke="black" points="150.886,-210.656 160.095,-215.896 156.164,-206.057 150.886,-210.656"/>
|
||||
</g>
|
||||
<!-- LED -->
|
||||
<g id="node11" class="node"><title>LED</title>
|
||||
<polygon fill="#2980b9" stroke="#2980b9" points="54,-108 0,-108 0,-72 54,-72 54,-108"/>
|
||||
<text text-anchor="middle" x="27" y="-87.5" font-family="Sans" font-size="10.00" fill="#ffffff">LED</text>
|
||||
</g>
|
||||
<!-- LED->DigitalOutputDevice -->
|
||||
<g id="edge10" class="edge"><title>LED->DigitalOutputDevice</title>
|
||||
<path fill="none" stroke="black" d="M48.5056,-108.303C59.4625,-117.119 72.9459,-127.968 84.8249,-137.526"/>
|
||||
<polygon fill="black" stroke="black" points="82.7565,-140.354 92.7418,-143.896 87.1446,-134.9 82.7565,-140.354"/>
|
||||
</g>
|
||||
<!-- Buzzer -->
|
||||
<g id="node12" class="node"><title>Buzzer</title>
|
||||
<polygon fill="#2980b9" stroke="#2980b9" points="126,-108 72,-108 72,-72 126,-72 126,-108"/>
|
||||
<text text-anchor="middle" x="99" y="-87.5" font-family="Sans" font-size="10.00" fill="#ffffff">Buzzer</text>
|
||||
</g>
|
||||
<!-- Buzzer->DigitalOutputDevice -->
|
||||
<g id="edge11" class="edge"><title>Buzzer->DigitalOutputDevice</title>
|
||||
<path fill="none" stroke="black" d="M102.708,-108.303C104.361,-116.017 106.347,-125.288 108.19,-133.888"/>
|
||||
<polygon fill="black" stroke="black" points="104.817,-134.851 110.335,-143.896 111.662,-133.384 104.817,-134.851"/>
|
||||
</g>
|
||||
<!-- PWMOutputDevice -->
|
||||
<g id="node13" class="node"><title>PWMOutputDevice</title>
|
||||
<polygon fill="#2980b9" stroke="#2980b9" points="248,-108 144,-108 144,-72 248,-72 248,-108"/>
|
||||
<text text-anchor="middle" x="196" y="-87.5" font-family="Sans" font-size="10.00" fill="#ffffff">PWMOutputDevice</text>
|
||||
</g>
|
||||
<!-- PWMOutputDevice->DigitalOutputDevice -->
|
||||
<g id="edge12" class="edge"><title>PWMOutputDevice->DigitalOutputDevice</title>
|
||||
<path fill="none" stroke="black" d="M175.73,-108.303C165.502,-117.035 152.939,-127.76 141.822,-137.25"/>
|
||||
<polygon fill="black" stroke="black" points="139.37,-134.741 134.037,-143.896 143.915,-140.065 139.37,-134.741"/>
|
||||
</g>
|
||||
<!-- PWMLED -->
|
||||
<g id="node14" class="node"><title>PWMLED</title>
|
||||
<polygon fill="#2980b9" stroke="#2980b9" points="225,-36 167,-36 167,-0 225,-0 225,-36"/>
|
||||
<text text-anchor="middle" x="196" y="-15.5" font-family="Sans" font-size="10.00" fill="#ffffff">PWMLED</text>
|
||||
</g>
|
||||
<!-- PWMLED->PWMOutputDevice -->
|
||||
<g id="edge13" class="edge"><title>PWMLED->PWMOutputDevice</title>
|
||||
<path fill="none" stroke="black" d="M196,-36.3034C196,-44.0173 196,-53.2875 196,-61.8876"/>
|
||||
<polygon fill="black" stroke="black" points="192.5,-61.8956 196,-71.8957 199.5,-61.8957 192.5,-61.8956"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 9.1 KiB |
BIN
docs/images/pin_layout.pdf
Normal file
BIN
docs/images/pin_layout.png
Normal file
|
After Width: | Height: | Size: 90 KiB |
2815
docs/images/pin_layout.svg
Normal file
|
After Width: | Height: | Size: 138 KiB |
113
docs/index.md
@@ -1,113 +0,0 @@
|
||||
# GPIO Zero
|
||||
|
||||
A simple interface to everyday GPIO components used with Raspberry Pi.
|
||||
|
||||
Created by [Ben Nuttall](https://github.com/bennuttall) of the [Raspberry Pi
|
||||
Foundation](https://www.raspberrypi.org/), [Dave
|
||||
Jones](https://github.com/waveform80), and other contributors.
|
||||
|
||||
## Latest release
|
||||
|
||||
The latest release is 1.0 released on 16th November 2015.
|
||||
|
||||
## About
|
||||
|
||||
Component interfaces are provided to allow a frictionless way to get started
|
||||
with physical computing:
|
||||
|
||||
```python
|
||||
from gpiozero import LED
|
||||
from time import sleep
|
||||
|
||||
led = LED(2)
|
||||
|
||||
while True:
|
||||
led.on()
|
||||
sleep(1)
|
||||
led.off()
|
||||
sleep(1)
|
||||
```
|
||||
|
||||
With very little code, you can quickly get going connecting your components
|
||||
together:
|
||||
|
||||
```python
|
||||
from gpiozero import LED, Button
|
||||
from signal import pause
|
||||
|
||||
led = LED(2)
|
||||
button = Button(3)
|
||||
|
||||
button.when_pressed = led.on
|
||||
button.when_released = led.off
|
||||
|
||||
pause()
|
||||
```
|
||||
|
||||
The library includes interfaces to many simple everyday components, as well as
|
||||
some more complex things like sensors, analogue-to-digital converters, full
|
||||
colour LEDs, robotics kits and more.
|
||||
|
||||
## Install
|
||||
|
||||
First, update your repositories list:
|
||||
|
||||
```python
|
||||
sudo apt-get update
|
||||
```
|
||||
|
||||
Then install the package of your choice. Both Python 3 and Python 2 are
|
||||
supported. Python 3 is recommended!
|
||||
|
||||
```python
|
||||
sudo apt-get install python3-gpiozero
|
||||
```
|
||||
|
||||
or:
|
||||
|
||||
```python
|
||||
sudo apt-get install python-gpiozero
|
||||
```
|
||||
|
||||
### Upgrade
|
||||
|
||||
Upgrade to the latest version with:
|
||||
|
||||
```bash
|
||||
sudo apt-get install python3-gpiozero
|
||||
```
|
||||
|
||||
or:
|
||||
|
||||
```bash
|
||||
sudo apt-get install python-gpiozero
|
||||
```
|
||||
|
||||
## Getting started
|
||||
|
||||
See the [input devices](inputs.md) and [output devices](outputs.md) to get
|
||||
started. Also see the [boards & accessories](boards.md) page for examples of
|
||||
using the included accessories.
|
||||
|
||||
For common programs using multiple components together, see the
|
||||
[recipes](recipes.md) page.
|
||||
|
||||
## Development
|
||||
|
||||
This project is being developed on
|
||||
[GitHub](https://github.com/RPi-Distro/python-gpiozero). Join in:
|
||||
|
||||
* Provide suggestions, report bugs and ask questions as
|
||||
[Issues](https://github.com/RPi-Distro/python-gpiozero/issues)
|
||||
* Provide examples we can use as
|
||||
[recipes](http://pythonhosted.org/gpiozero/recipes/)
|
||||
* Contribute to the code
|
||||
|
||||
Alternatively, email suggestions and feedback to ben@raspberrypi.org or add to
|
||||
the [Google Doc](https://goo.gl/8zJLif).
|
||||
|
||||
## Contributors
|
||||
|
||||
- [Ben Nuttall](https://github.com/bennuttall) (project maintainer)
|
||||
- [Dave Jones](https://github.com/waveform80)
|
||||
- [Martin O'Hanlon](https://github.com/martinohanlon)
|
||||
16
docs/index.rst
Normal file
@@ -0,0 +1,16 @@
|
||||
.. include:: ../README.rst
|
||||
|
||||
Table of Contents
|
||||
=================
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
recipes
|
||||
notes
|
||||
api_input
|
||||
api_output
|
||||
api_boards
|
||||
api_generic
|
||||
changelog
|
||||
license
|
||||
244
docs/inputs.md
@@ -1,244 +0,0 @@
|
||||
# Input Devices
|
||||
|
||||
These input device component interfaces have been provided for simple use of
|
||||
everyday components.
|
||||
|
||||
Components must be wired up correctly before used in code.
|
||||
|
||||
*Note all GPIO pin numbers use BCM numbering. See the [notes](notes.md) page
|
||||
for more information.*
|
||||
|
||||
## Button
|
||||
|
||||
A physical push button or switch.
|
||||
|
||||
### Wiring
|
||||
|
||||
Connect one side of the button to a ground pin, and the other to any GPIO pin:
|
||||
|
||||

|
||||
|
||||
*Alternatively, connect to 3V3 and to a GPIO, and set `pull_up` to `False` when
|
||||
you create your `Button` object.*
|
||||
|
||||
### Code
|
||||
|
||||
Ensure the `Button` class is imported at the top of the file:
|
||||
|
||||
```python
|
||||
from gpiozero import Button
|
||||
```
|
||||
|
||||
Create a `Button` object by passing in the pin number the button is connected
|
||||
to:
|
||||
|
||||
```python
|
||||
button = Button(2)
|
||||
```
|
||||
|
||||
#### Initialisation options
|
||||
|
||||
```python
|
||||
Button(pin=None, pull_up=True, bounce_time=None)
|
||||
```
|
||||
|
||||
| Argument | Description | Values | Default |
|
||||
| -------- | ----------- | ------ | ------- |
|
||||
| `pin` | The GPIO pin number the button is connected to. | Integer | *Required* |
|
||||
| `pull_up` | The pull state of the pin. `True` means pull up, `False` means pull down. | Boolean | `True` |
|
||||
| `bounce_time` | Specifies the length of time (in seconds) that the component will ignore changes in state after an initial change. | Integer or Float | `None` |
|
||||
|
||||
#### Methods
|
||||
|
||||
| Method | Description | Arguments |
|
||||
| ------ | ----------- | --------- |
|
||||
| `wait_for_press()` | Halt the program until the button is pressed. | `timeout` - The number of seconds to wait before proceeding if no event is detected. **Default: `None`** |
|
||||
| `wait_for_release()` | Halt the program until the button is released. | `timeout` - The number of seconds to wait before proceeding if no event is detected. **Default: `None`** |
|
||||
|
||||
#### Properties
|
||||
|
||||
| Property | Description | Type |
|
||||
| -------- | ----------- | ---- |
|
||||
| `pin` | The GPIO pin number the button is connected to. | Integer |
|
||||
| `is_pressed` | The current state of the pin (`True` if pressed; otherwise `False`). | Boolean |
|
||||
| `pull_up` | The pull state of the pin (`True` if pulled up; `False` if pulled down). | Boolean |
|
||||
| `when_pressed` | A reference to the function to be called when the button is pressed. | `None` or Function |
|
||||
| `when_released` | A reference to the function to be called when the button is released. | `None` or Function |
|
||||
| `value` | The current value of the button. 0 if off; 1 if on. | Float |
|
||||
| `values` | A generator continuously yielding the button's current value. | Generator |
|
||||
|
||||
## Motion Sensor
|
||||
|
||||
A PIR (Passive Infra-Red) motion sensor.
|
||||
|
||||
### Wiring
|
||||
|
||||
Connect the pin labelled `VCC` to a 5V pin; connect the one labelled `GND` to
|
||||
a ground pin; and connect the one labelled `OUT` to any GPIO pin:
|
||||
|
||||

|
||||
|
||||
### Code
|
||||
|
||||
Ensure the `MotionSensor` class is imported at the top of the file:
|
||||
|
||||
```python
|
||||
from gpiozero import MotionSensor
|
||||
```
|
||||
|
||||
Create a `MotionSensor` object by passing in the pin number the sensor is
|
||||
connected to:
|
||||
|
||||
```python
|
||||
pir = MotionSensor(4)
|
||||
```
|
||||
|
||||
#### Initialisation options
|
||||
|
||||
```python
|
||||
MotionSensor(pin=None, queue_len=1, sample_rate=10, threshold=0.5, partial=False)
|
||||
```
|
||||
|
||||
| Argument | Description | Values | Default |
|
||||
| -------- | ----------- | ------ | ------- |
|
||||
| `pin` | The GPIO pin number the sensor is connected to. | Integer | *Required* |
|
||||
| `queue_len` | ??? | Integer | `1` |
|
||||
| `sample_rate` | ??? | Integer | `10` |
|
||||
| `threshold` | Proportion of sensor values required to determine motion state. | Float: `0` to `1` | `0.5` |
|
||||
| `partial` | ??? | Boolean | `False` |
|
||||
|
||||
#### Methods
|
||||
|
||||
| Method | Description | Arguments |
|
||||
| ------ | ----------- | --------- |
|
||||
| `wait_for_motion()` | Halt the program until motion is detected. | `timeout` - The number of seconds to wait before proceeding if no motion is detected. **Default: `None`** |
|
||||
| `wait_for_no_motion()` | Halt the program until no motion is detected. | `timeout` - The number of seconds to wait before proceeding if motion is still detected. **Default: `None`** |
|
||||
|
||||
#### Properties
|
||||
|
||||
| Property | Description | Type |
|
||||
| -------- | ----------- | ---- |
|
||||
| `pin` | The GPIO pin number the sensor is connected to. | Integer |
|
||||
| `motion_detected` | The current state of the sensor (`True` if motion is detected; otherwise `False`). | Boolean |
|
||||
| `when_motion` | A reference to the function to be called when motion is detected. | `None` or Function |
|
||||
| `when_no_motion` | A reference to the function to be called when no motion is detected. | `None` or Function |
|
||||
| `value` | The current value of the sensor. 0 if still; 1 if motion. | Float |
|
||||
| `values` | A generator continuously yielding the sensor's current value. | Generator |
|
||||
|
||||
## Light Sensor
|
||||
|
||||
An LDR (Light Dependent Resistor) Light Sensor.
|
||||
|
||||
### Wiring
|
||||
|
||||
...
|
||||
|
||||
### Code
|
||||
|
||||
Ensure the `LightSensor` class is imported at the top of the file:
|
||||
|
||||
```python
|
||||
from gpiozero import LightSensor
|
||||
```
|
||||
|
||||
Create a `LightSensor` object by passing in the pin number the sensor is
|
||||
connected to:
|
||||
|
||||
```python
|
||||
light = LightSensor(4)
|
||||
```
|
||||
|
||||
#### Initialisation options
|
||||
|
||||
```python
|
||||
LightSensor(pin=None, queue_len=5, charge_time_limit=10,
|
||||
threshold=0.1, partial=False)
|
||||
```
|
||||
|
||||
| Argument | Description | Values | Default |
|
||||
| -------- | ----------- | ------ | ------- |
|
||||
| `pin` | The GPIO pin number the sensor is connected to. | Integer | *Required* |
|
||||
| `queue_len` | ??? | Integer | `5` |
|
||||
| `charge_time_limit` | Maximum amount of time allowed to determine darkness. | Integer | `10` |
|
||||
| `threshold` | Proportion of sensor values required to determine light level. | Float: `0` to `1` | `0.1` |
|
||||
| `partial` | ??? | Boolean | `False` |
|
||||
|
||||
#### Methods
|
||||
|
||||
| Method | Description | Arguments |
|
||||
| ------ | ----------- | --------- |
|
||||
| `wait_for_light()` | Halt the program until light is detected. | `timeout` - The number of seconds to wait before proceeding if light is not detected. **Default: `None`** |
|
||||
| `wait_for_dark()` | Halt the program until darkness is detected. | `timeout` - The number of seconds to wait before proceeding if darkness is not detected. **Default: `None`** |
|
||||
|
||||
#### Properties
|
||||
|
||||
| Property | Description | Type |
|
||||
| -------- | ----------- | ---- |
|
||||
| `pin` | The GPIO pin number the sensor is connected to. | Integer |
|
||||
| `light_detected` | The current state of the sensor (`True` if light; otherwise `False`). | Boolean |
|
||||
| `when_light` | A reference to the function to be called when light is detected. | `None` or Function |
|
||||
| `when_dark` | A reference to the function to be called when darkness is detected. | `None` or Function |
|
||||
| `value` | The current value of the sensor. 0 if dark; 1 if light. | Float |
|
||||
| `values` | A generator continuously yielding the sensor's current value. | Generator |
|
||||
|
||||
## MCP3008 Analogue-to-Digital Converter
|
||||
|
||||
MCP3008 ADC (Analogue-to-Digital converter).
|
||||
|
||||
The MCP3008 chip provides access to up to 8 analogue inputs, such as
|
||||
potentiometers, and reads their values in digital form.
|
||||
|
||||
### Wiring
|
||||
|
||||
...
|
||||
|
||||
### Code
|
||||
|
||||
Ensure the `MCP3008` class is imported at the top of the file:
|
||||
|
||||
```python
|
||||
from gpiozero import MCP3008
|
||||
```
|
||||
|
||||
Create an `MCP3008` object:
|
||||
|
||||
```python
|
||||
pot = MCP3008()
|
||||
```
|
||||
|
||||
Alternatively, access an input value with the `MCP3008`'s context manager:
|
||||
|
||||
```python
|
||||
with MCP3008() as pot:
|
||||
# do something with pot
|
||||
```
|
||||
|
||||
#### Initialisation options
|
||||
|
||||
```python
|
||||
MCP3008(channel=0, device=0)
|
||||
```
|
||||
|
||||
| Argument | Description | Values | Default |
|
||||
| -------- | ----------- | ------ | ------- |
|
||||
| `channel` | Which of the 8 ADC channels to access. | Integer: `0` to `7` | `0` |
|
||||
| `device` | Which of the two Chip Select SPI pins to access. | Integer: `0` or `1` | `0` |
|
||||
|
||||
#### Properties
|
||||
|
||||
| Property | Description | Type |
|
||||
| -------- | ----------- | ---- |
|
||||
| `channel` | The ADC channel the device is connected to. | Integer |
|
||||
| `device` | The chip select pin the device is connected to. | Integer |
|
||||
| `value` | The current value of the device. | Float |
|
||||
| `values` | A generator continuously yielding the device's current value. | Generator |
|
||||
|
||||
## MCP3004 Analogue-to-Digital Converter
|
||||
|
||||
MCP3004 ADC (Analogue-to-Digital converter).
|
||||
|
||||
The MCP3004 chip provides access to up to 4 analogue inputs, such as
|
||||
potentiometers, and reads their values in digital form.
|
||||
|
||||
The interface is identical to `MCP3008`, except that only channels `0` to `3`
|
||||
are accessible.
|
||||
34
docs/license.rst
Normal file
@@ -0,0 +1,34 @@
|
||||
.. _license:
|
||||
|
||||
=======
|
||||
License
|
||||
=======
|
||||
|
||||
Copyright 2015 `Raspberry Pi Foundation`_.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
* Neither the name of the copyright holder nor the names of its contributors
|
||||
may be used to endorse or promote products derived from this software without
|
||||
specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
.. _Raspberry Pi Foundation: http://raspberrypi.org/
|
||||
282
docs/notes.md
@@ -1,282 +0,0 @@
|
||||
# Notes
|
||||
|
||||
## BCM pin numbering
|
||||
|
||||
This library uses Broadcom (BCM) pin numbering for the GPIO pins, as
|
||||
opposed to BOARD. Unlike the `RPi.GPIO` library, this is not configurable.
|
||||
|
||||
Any pin marked `GPIO` can be used for generic components.
|
||||
|
||||
The BCM pin layout is as follows:
|
||||
|
||||
| | |
|
||||
|-----------:|:-----------|
|
||||
| 3V3 | 5V |
|
||||
| **GPIO2** | 5V |
|
||||
| **GPIO3** | GND |
|
||||
| **GPIO4** | **GPIO14** |
|
||||
| GND | **GPIO15** |
|
||||
| **GPIO17** | **GPIO18** |
|
||||
| **GPIO27** | GND |
|
||||
| **GPIO22** | **GPIO23** |
|
||||
| 3V3 | **GPIO24** |
|
||||
| **GPIO10** | GND |
|
||||
| **GPIO9** | **GPIO25** |
|
||||
| **GPIO11** | **GPIO8** |
|
||||
| GND | **GPIO7** |
|
||||
| DNC | DNC |
|
||||
| **GPIO5** | GND |
|
||||
| **GPIO6** | **GPIO12** |
|
||||
| **GPIO13** | GND |
|
||||
| **GPIO19** | **GPIO16** |
|
||||
| **GPIO26** | **GPIO20** |
|
||||
| GND | **GPIO21** |
|
||||
|
||||
- *GND = Ground*
|
||||
- *3V3 = 3.3 Volts*
|
||||
- *5V = 5 Volts*
|
||||
- *DNC = Do not connect (special use pins)*
|
||||
|
||||
## Wiring
|
||||
|
||||
All components must be wired up correctly before using with this library.
|
||||
|
||||
## Keep your program alive with `signal.pause`
|
||||
|
||||
The following program looks like it should turn an LED on:
|
||||
|
||||
```python
|
||||
from gpiozero import LED
|
||||
|
||||
led = LED(2)
|
||||
led.on()
|
||||
```
|
||||
|
||||
And it does, if you're using the Python shell, IPython shell or IDLE shell,
|
||||
but if you saved this program as a Python file and ran it, it would flash
|
||||
on for a moment then the program would end and it would turn off.
|
||||
|
||||
The following file includes an intentional `pause` to keep the program
|
||||
alive:
|
||||
|
||||
```python
|
||||
from gpiozero import LED
|
||||
from signal import pause
|
||||
|
||||
led = LED(2)
|
||||
led.on()
|
||||
pause()
|
||||
```
|
||||
|
||||
Now running the program will stay running, leaving the LED on, until it is
|
||||
forced to quit.
|
||||
|
||||
Similarly, when setting up callbacks on button presses or other input
|
||||
devices, the program needs to be running for the events to be detected:
|
||||
|
||||
```python
|
||||
from gpiozero import Button
|
||||
from signal import pause
|
||||
|
||||
def hello():
|
||||
print("Hello")
|
||||
|
||||
button = Button(2)
|
||||
button.when_pressed = hello
|
||||
pause()
|
||||
```
|
||||
|
||||
## Importing from GPIO Zero
|
||||
|
||||
In Python, libraries and functions used in a script must be imported by name at
|
||||
the top of the file, with the exception of the functions built in to Python by
|
||||
default.
|
||||
|
||||
For example, to use the `Button` interface from the GPIO Zero library, it
|
||||
should be explicitly imported:
|
||||
|
||||
```python
|
||||
from gpiozero import Button
|
||||
```
|
||||
|
||||
Now `Button` is available directly in the script:
|
||||
|
||||
```python
|
||||
button = Button(2)
|
||||
```
|
||||
|
||||
Alternatively, the whole GPIO Zero library can be imported:
|
||||
|
||||
```python
|
||||
import gpiozero
|
||||
```
|
||||
|
||||
In this case, all references to interfaces within GPIO Zero must be prefixed:
|
||||
|
||||
```python
|
||||
button = gpiozero.Button(2)
|
||||
```
|
||||
|
||||
## Programming terms
|
||||
|
||||
The following terms are used in the documentation.
|
||||
|
||||
### Class
|
||||
|
||||
A class is the blueprint for a data type. A class defines the way an instance
|
||||
of its own can behave, and has specific functionality relating to the kinds of
|
||||
things a user would expect to be able to do with it.
|
||||
|
||||
An example of a class in GPIO Zero is `Button`. Note class names are given with
|
||||
each word capitalised.
|
||||
|
||||
### Object
|
||||
|
||||
An object is an instance of a class. Any variable in Python is an object of a
|
||||
given type (e.g. Integer, String, Float), and comprises the functionality
|
||||
defined by its class.
|
||||
|
||||
To create an object, you must assign a variable name to an instance of a class:
|
||||
|
||||
```python
|
||||
my_button = Button(2)
|
||||
```
|
||||
|
||||
Now the variable `my_button` is an instance of the class `Button`. Check its
|
||||
type with Python's `type()` function:
|
||||
|
||||
```python
|
||||
print(type(my_button))
|
||||
```
|
||||
|
||||
which shows:
|
||||
|
||||
```
|
||||
gpiozero.Button
|
||||
```
|
||||
|
||||
### Initialisation options
|
||||
|
||||
Most classes in GPIO Zero require some arguments to create an object, for
|
||||
example the `LED` and `Button` examples require the pin number the device is
|
||||
attached to:
|
||||
|
||||
```python
|
||||
my_button = Button(2)
|
||||
```
|
||||
|
||||
Some classes have multiple arguments, usually with some being optional. When
|
||||
arguments are optional, common default values are used. The following example:
|
||||
|
||||
```python
|
||||
my_button = Button(2)
|
||||
```
|
||||
|
||||
is equivalent to:
|
||||
|
||||
```python
|
||||
my_button = Button(2, True)
|
||||
```
|
||||
|
||||
because the second argument defaults to `True`.
|
||||
|
||||
Arguments can be given unnamed, as long as they are in order:
|
||||
|
||||
```python
|
||||
my_button = Button(2, False)
|
||||
```
|
||||
|
||||
though this may be confusing, so named is better in this case:
|
||||
|
||||
```python
|
||||
my_button = Button(pin=2, pull_up=False)
|
||||
```
|
||||
|
||||
Alternatively, they can be given in any order, as long as they are named:
|
||||
|
||||
```python
|
||||
my_button = Button(pin=2, bounce_time=0.5, pull_up=False)
|
||||
```
|
||||
|
||||
### Method
|
||||
|
||||
A method is a function defined within a class. With an object of a given type,
|
||||
you can call a method on that object. For example if `my_led` is a `LED`
|
||||
object:
|
||||
|
||||
```python
|
||||
my_led.on()
|
||||
```
|
||||
|
||||
will call the `LED` class's `on()` function, relating to that instance of
|
||||
`LED`. If other `LED` objects have been created, they will not be affected by
|
||||
this action.
|
||||
|
||||
In many cases, no arguments are required to call the method (like
|
||||
`my_led.on()`). In other cases, optional arguments are available. For example:
|
||||
|
||||
```python
|
||||
my_led.blink(2, 3)
|
||||
```
|
||||
|
||||
Here, the arguments `2` and `3` have been passed in as arguments. The `blink`
|
||||
method allows configuration of `on_time` and `off_time`. This example means the
|
||||
LED will flash on for 2 seconds and stay off for 3. This example may benefit
|
||||
from use of named arguments:
|
||||
|
||||
```python
|
||||
my_led.blink(on_time=2, off_time=3)
|
||||
```
|
||||
|
||||
arguments can also be passed in by name, which means order is irrelevant. For
|
||||
example:
|
||||
|
||||
```python
|
||||
my_led.blink(off_time=3)
|
||||
```
|
||||
|
||||
Here, only the `off_time` argument has been provided, and all other arguments
|
||||
will use their default values. Methods in GPIO Zero use sensible common default
|
||||
values, but are configurable when necessary.
|
||||
|
||||
### Property
|
||||
|
||||
A property is an attribute relating to the state of an object. For example:
|
||||
|
||||
```python
|
||||
my_led.is_lit
|
||||
```
|
||||
|
||||
This will return `True` or `False` depending on whether or not the LED is
|
||||
currently lit.
|
||||
|
||||
Some properties allow you to change their value. For example an `RGBLED` object:
|
||||
|
||||
```python
|
||||
rgb_led.green = 0.5
|
||||
```
|
||||
|
||||
or:
|
||||
|
||||
```python
|
||||
rgb_led.color = (0.2, 0.3, 0.7)
|
||||
```
|
||||
|
||||
### Context manager
|
||||
|
||||
A context manager is an alternative interface provided by classes which require
|
||||
"closing" the object when it's finished with. The following example (using a
|
||||
context manager):
|
||||
|
||||
```python
|
||||
with MCP3008() as pot:
|
||||
print(pot.value)
|
||||
```
|
||||
|
||||
is identical to:
|
||||
|
||||
```python
|
||||
pot = MCP3008()
|
||||
print(pot.value)
|
||||
pot.close()
|
||||
```
|
||||
72
docs/notes.rst
Normal file
@@ -0,0 +1,72 @@
|
||||
=====
|
||||
Notes
|
||||
=====
|
||||
|
||||
.. currentmodule:: gpiozero
|
||||
|
||||
.. _keep-your-script-running:
|
||||
|
||||
Keep your script running
|
||||
========================
|
||||
|
||||
The following script looks like it should turn an LED on::
|
||||
|
||||
from gpiozero import led
|
||||
|
||||
led = LED(2)
|
||||
led.on()
|
||||
|
||||
And it does, if you're using the Python (or IPython or IDLE) shell. However,
|
||||
if you saved this script as a Python file and ran it, it would flash on
|
||||
briefly, then the script would end and it would turn off.
|
||||
|
||||
The following file includes an intentional :func:`~signal.pause` to keep the
|
||||
script alive::
|
||||
|
||||
from gpiozero import led
|
||||
from signal import pause
|
||||
|
||||
led = LED(2)
|
||||
led.on()
|
||||
pause()
|
||||
|
||||
Now the script will stay running, leaving the LED on, until it is terminated
|
||||
manually (e.g. by pressing Ctrl+C). Similarly, when setting up callbacks on
|
||||
button presses or other input devices, the script needs to be running for the
|
||||
events to be detected::
|
||||
|
||||
|
||||
from gpiozero import Button
|
||||
from signal import pause
|
||||
|
||||
def hello():
|
||||
print("Hello")
|
||||
|
||||
button = Button(2)
|
||||
button.when_pressed = hello
|
||||
pause()
|
||||
|
||||
Importing from GPIO Zero
|
||||
========================
|
||||
|
||||
In Python, libraries and functions used in a script must be imported by name
|
||||
at the top of the file, with the exception of the functions built into Python
|
||||
by default.
|
||||
|
||||
For example, to use the :class:`Button` interface from GPIO Zero, it
|
||||
should be explicitly imported::
|
||||
|
||||
from gpiozero import Button
|
||||
|
||||
Now :class:`~gpiozero.Button` is available directly in your script::
|
||||
|
||||
button = Button(2)
|
||||
|
||||
Alternatively, the whole GPIO Zero library can be imported::
|
||||
|
||||
import gpiozero
|
||||
|
||||
In this case, all references to items within GPIO Zero must be prefixed::
|
||||
|
||||
button = gpiozero.Button(2)
|
||||
|
||||
309
docs/outputs.md
@@ -1,309 +0,0 @@
|
||||
# Output Devices
|
||||
|
||||
These output device component interfaces have been provided for simple use of
|
||||
everyday components.
|
||||
|
||||
Components must be wired up correctly before used in code.
|
||||
|
||||
*Note all GPIO pin numbers use BCM numbering. See the [notes](notes.md) page
|
||||
for more information.*
|
||||
|
||||
## LED
|
||||
|
||||
An LED (Light emitting diode) component.
|
||||
|
||||
### Wiring
|
||||
|
||||
Connect the cathode (the short leg) of the LED to a ground pin, and connect the
|
||||
anode (the longer leg) to any GPIO pin, with a current limiting resistor in
|
||||
between:
|
||||
|
||||

|
||||
|
||||
*Altenatively, use a breadboard to wire up the LED in the same way*
|
||||
|
||||
### Code
|
||||
|
||||
Ensure the `LED` class is imported at the top of the file:
|
||||
|
||||
```python
|
||||
from gpiozero import LED
|
||||
```
|
||||
|
||||
Create an `LED` object by passing in the pin number the LED is connected to:
|
||||
|
||||
```python
|
||||
led = LED(17)
|
||||
```
|
||||
|
||||
#### Initialisation options
|
||||
|
||||
```python
|
||||
LED(pin=None, active_high=True)
|
||||
```
|
||||
|
||||
| Argument | Description | Values | Default |
|
||||
| -------- | ----------- | ------ | ------- |
|
||||
| `pin` | The GPIO pin number the LED is connected to. | Integer | *Required* |
|
||||
| `active_high` | Whether high or low voltage turns the LED on. | Boolean | `True` |
|
||||
|
||||
#### Methods
|
||||
|
||||
| Method | Description | Arguments |
|
||||
| ------ | ----------- | --------- |
|
||||
| `on()` | Turn the LED on. | None |
|
||||
| `off()` | Turn the LED off. | None |
|
||||
| `toggle()` | Toggle the LED. If it's on, turn it off; if it's off, turn it on. | None |
|
||||
| `blink()` | Make the LED turn on and off repeatedly. | `on_time` - The amount of time (in seconds) for the LED to be on each iteration. **Default: `1`** |
|
||||
| | | `off_time` - The amount of time (in seconds) for the LED to be off each iteration. **Default: `1`** |
|
||||
| | | `n` - The number of iterations. `None` means infinite. **Default: `None`** |
|
||||
| | | `background` - If `True`, start a background thread to continue blinking and return immediately. If `False`, only return when the blink is finished (warning: the default value of n will result in this method never returning). **Default: `True`** |
|
||||
|
||||
#### Properties
|
||||
|
||||
| Property | Description | Type |
|
||||
| -------- | ----------- | ---- |
|
||||
| `pin` | The GPIO pin number the LED is connected to. | Integer |
|
||||
| `is_lit` | The current state of the LED (`True` if on; `False` if off). | Boolean |
|
||||
| `value` | The current state of the LED (`True` if on; `False` if off). | Boolean |
|
||||
| `values` | A generator continuously yielding the LED's current value. | Generator |
|
||||
| `source` | A generator which can be used to continuously set the LED's value. | `None` or Generator |
|
||||
|
||||
## PWMLED
|
||||
|
||||
An LED (Light emitting diode) component with the ability to set brightness.
|
||||
|
||||
*Note this interface does not require a special LED component. Any regular LED
|
||||
can be used in this way.*
|
||||
|
||||
### Wiring
|
||||
|
||||
A PWMLED is wired the same as a regular LED.
|
||||
|
||||
### Code
|
||||
|
||||
Ensure the `PWMLED` class is imported at the top of the file:
|
||||
|
||||
```python
|
||||
from gpiozero import PWMLED
|
||||
```
|
||||
|
||||
Create an `LED` object by passing in the pin number the LED is connected to:
|
||||
|
||||
```python
|
||||
led = PWMLED(17)
|
||||
```
|
||||
|
||||
#### Initialisation options
|
||||
|
||||
```python
|
||||
PWMLED(pin=None, active_high=True)
|
||||
```
|
||||
|
||||
| Argument | Description | Values | Default |
|
||||
| -------- | ----------- | ------ | ------- |
|
||||
| `pin` | The GPIO pin number the LED is connected to. | Integer | *Required* |
|
||||
| `active_high` | Whether high or low voltage turns the LED on. | Boolean | `True` |
|
||||
|
||||
#### Methods
|
||||
|
||||
| Method | Description | Arguments |
|
||||
| ------ | ----------- | --------- |
|
||||
| `on()` | Turn the LED on. | None |
|
||||
| `off()` | Turn the LED off. | None |
|
||||
| `toggle()` | Toggle the LED. If it's on, turn it off; if it's off, turn it on. | None |
|
||||
| `blink()` | Make the LED turn on and off repeatedly. | `on_time` - The amount of time (in seconds) for the LED to be on each iteration. **Default: `1`** |
|
||||
| | | `off_time` - The amount of time (in seconds) for the LED to be off each iteration. **Default: `1`** |
|
||||
| | | `n` - The number of iterations. `None` means infinite. **Default: `None`** |
|
||||
| | | `background` - If `True`, start a background thread to continue blinking and return immediately. If `False`, only return when the blink is finished (warning: the default value of n will result in this method never returning). **Default: `True`** |
|
||||
|
||||
#### Properties
|
||||
|
||||
| Property | Description | Type |
|
||||
| -------- | ----------- | ---- |
|
||||
| `pin` | The GPIO pin number the LED is connected to. | Integer |
|
||||
| `is_lit` | The current state of the LED (`True` if on; `False` if off). | Boolean |
|
||||
| `value` | The current brightness of the LED `0` to `1`. | Float |
|
||||
| `values` | A generator continuously yielding the LED's current value. | Generator |
|
||||
| `source` | A generator which can be used to continuously set the LED's value. | `None` or Generator |
|
||||
|
||||
## Buzzer
|
||||
|
||||
A digital Buzzer component.
|
||||
|
||||
### Wiring
|
||||
|
||||
Connect the negative pin of the buzzer to a ground pin, and connect the
|
||||
positive side to any GPIO pin:
|
||||
|
||||
...
|
||||
|
||||
### Code
|
||||
|
||||
Ensure the `Buzzer` class is imported at the top of the file:
|
||||
|
||||
```python
|
||||
from gpiozero import Buzzer
|
||||
```
|
||||
|
||||
Create a `Buzzer` object by passing in the pin number the buzzer is connected
|
||||
to:
|
||||
|
||||
```python
|
||||
buzzer = Buzzer(3)
|
||||
```
|
||||
|
||||
#### Initialisation options
|
||||
|
||||
```python
|
||||
Buzzer(pin=None, active_high=True)
|
||||
```
|
||||
|
||||
| Argument | Description | Values | Default |
|
||||
| -------- | ----------- | ------ | ------- |
|
||||
| `pin` | The GPIO pin number the buzzer is connected to. | Integer | *Required* |
|
||||
| `active_high` | Whether high or low voltage turns the buzzer on. | Boolean | `True` |
|
||||
|
||||
#### Methods
|
||||
|
||||
| Method | Description | Arguments |
|
||||
| ------ | ----------- | --------- |
|
||||
| `on()` | Turn the buzzer on. | None |
|
||||
| `off()` | Turn the buzzer off. | None |
|
||||
| `toggle()` | Toggle the buzzer. If it's on, turn it off; if it's off, turn it on. | None |
|
||||
| `beep()` | Make the buzzer turn on and off repeatedly. | `on_time` - The amount of time (in seconds) for the buzzer to be on each iteration. **Default: `1`** |
|
||||
| | | `off_time` - The amount of time (in seconds) for the buzzer to be off each iteration. **Default: `1`** |
|
||||
| | | `n` - The number of iterations. `None` means infinite. **Default: `None`** |
|
||||
| | | `background` - If `True`, start a background thread to continue beeping and return immediately. If `False`, only return when the blink is finished (warning: the default value of n will result in this method never returning). **Default: `True`** |
|
||||
|
||||
#### Properties
|
||||
|
||||
| Property | Description | Type |
|
||||
| -------- | ----------- | ---- |
|
||||
| `pin` | The GPIO pin number the buzzer is connected to. | Integer |
|
||||
| `is_active` | The current state of the buzzer (`True` if on; `False` if off). | Boolean |
|
||||
| `value` | The current state of the buzzer (`True` if on; `False` if off). | Boolean |
|
||||
| `values` | A generator continuously yielding the buzzer's current value. | Generator |
|
||||
| `source` | A generator which can be used to continuously set the buzzer's value. | `None` or Generator |
|
||||
|
||||
## RGB LED
|
||||
|
||||
A full colour LED component (made up of Red, Green and Blue LEDs).
|
||||
|
||||
### Wiring
|
||||
|
||||
Connect the common cathode (the longest leg) to a ground pin; connect each of
|
||||
the other legs (representing the red, green and blue components of the LED) to
|
||||
any GPIO pins, each with a current limiting resistor in between:
|
||||
|
||||
...
|
||||
|
||||
### Code
|
||||
|
||||
Ensure the `RGBLED` class is imported at the top of the file:
|
||||
|
||||
```python
|
||||
from gpiozero import RGBLED
|
||||
```
|
||||
|
||||
Create a `RGBLED` object by passing in the LED pin numbers by name:
|
||||
|
||||
```python
|
||||
led = RGBLED(red=2, green=3, blue=4)
|
||||
```
|
||||
|
||||
or just in order (red, green, blue):
|
||||
|
||||
```python
|
||||
led = RGBLED(2, 3, 4)
|
||||
```
|
||||
|
||||
#### Initialisation options
|
||||
|
||||
```python
|
||||
RGBLED(red=None, green=None, blue=None)
|
||||
```
|
||||
|
||||
| Argument | Description | Values | Default |
|
||||
| -------- | ----------- | ------ | ------- |
|
||||
| `red` | The GPIO pin number the red LED is connected to. | Integer | *Required* |
|
||||
| `green` | The GPIO pin number the green LED is connected to. | Integer | *Required* |
|
||||
| `blue` | The GPIO pin number the blue LED is connected to. | Integer | *Required* |
|
||||
|
||||
#### Methods
|
||||
|
||||
| Method | Description | Arguments |
|
||||
| ------ | ----------- | --------- |
|
||||
| `on()` | Turn all the LEDs on (makes white light). | None |
|
||||
| `off()` | Turn all the LEDs off. | None |
|
||||
| `toggle()` | Toggle the LED. If it's on (at all), turn it off; if it's off, turn it on. | None |
|
||||
| `blink()` | Make the LED turn on and off repeatedly. | `on_time` - The amount of time (in seconds) for the LED to be on each iteration. **Default: `1`** |
|
||||
| | | `off_time` - The amount of time (in seconds) for the LED to be off each iteration. **Default: `1`** |
|
||||
| | | `n` - The number of iterations. `None` means infinite. **Default: `None`** |
|
||||
| | | `background` - If `True`, start a background thread to continue blinking and return immediately. If `False`, only return when the blink is finished (warning: the default value of n will result in this method never returning). **Default: `True`** |
|
||||
|
||||
#### Properties
|
||||
|
||||
| Property | Description | Type |
|
||||
| -------- | ----------- | ---- |
|
||||
| `red` | The brightness value of the red LED (`0` to `1`). | Float |
|
||||
| `green` | The brightness value of the green LED (`0` to `1`). | Float |
|
||||
| `blue` | The brightness value of the blue LED (`0` to `1`). | Float |
|
||||
| `color` | The brightness values of the three LEDs `(0, 0, 0)` to `(1, 1, 1)`. | Tuple |
|
||||
| `value` | The brightness values of the three LEDs `(0, 0, 0)` to `(1, 1, 1)`. | Tuple |
|
||||
| `values` | A generator continuously yielding the LED's current values. | Generator |
|
||||
| `source` | A generator which can be used to continuously set the LED's values. | `None` or Generator |
|
||||
|
||||
## Motor
|
||||
|
||||
Generic bi-directional motor.
|
||||
|
||||
### Wiring
|
||||
|
||||
Attach a Motor Controller Board to your Pi, connect a battery pack to the Motor
|
||||
Controller Board, and connect each side of the motor to any GPIO pin:
|
||||
|
||||
...
|
||||
|
||||
### Code
|
||||
|
||||
Ensure the `Motor` class is imported at the top of the file:
|
||||
|
||||
```python
|
||||
from gpiozero import Motor
|
||||
```
|
||||
|
||||
Create a `Motor` object by passing in the pin numbers the motor is connected to:
|
||||
|
||||
```python
|
||||
motor = Motor(forward=17, backward=18)
|
||||
```
|
||||
|
||||
#### Initialisation options
|
||||
|
||||
```python
|
||||
Motor(forward=None, backward=None)
|
||||
```
|
||||
|
||||
| Argument | Description | Values | Default |
|
||||
| -------- | ----------- | ------ | ------- |
|
||||
| `forward` | The GPIO pin number the forward gear of the motor is connected to. | Integer | *Required* |
|
||||
| `backward` | The GPIO pin number the reverse gear of the motor is connected to. | Integer | *Required* |
|
||||
|
||||
#### Methods
|
||||
|
||||
| Method | Description | Arguments |
|
||||
| ------ | ----------- | --------- |
|
||||
| `forward()` | Drive the motor forwards. | `speed` - Speed at which to drive the motor, `0` to `1`. **Default: `1`** |
|
||||
| `backward()` | Drive the motor backwards. | `speed` - Speed at which to drive the motor, `0` to `1`. **Default: `1`** |
|
||||
| `stop()` | Stop the motor. | None |
|
||||
| `reverse()` | Reverse direction of the motor. | None |
|
||||
|
||||
#### Properties
|
||||
|
||||
| Property | Description | Type |
|
||||
| -------- | ----------- | ---- |
|
||||
| `is_active` | The current state of the motor. `True` if moving, otherwise `False`. | Boolean |
|
||||
| `value` | The current speed and direction of the motor. `-1.0` if full speed backward, `0.0` if still, `1.0` if full speed forward. | Float |
|
||||
| `values` | A generator continuously yielding the motor's current value. | Generator |
|
||||
| `source` | A generator which can be used to continuously set the motor's value. | `None` or Generator |
|
||||
533
docs/recipes.md
@@ -1,533 +0,0 @@
|
||||
# Recipes
|
||||
|
||||
*Note that reaching the end of a Python file will terminate the process and
|
||||
GPIOs may be reset. Keep your program alive with `signal.pause` - see the
|
||||
[notes](notes.md) page for more information.*
|
||||
|
||||
## LED
|
||||
|
||||
Turn an LED on and off repeatedly:
|
||||
|
||||
```python
|
||||
from gpiozero import LED
|
||||
from time import sleep
|
||||
|
||||
red = LED(2)
|
||||
|
||||
while True:
|
||||
red.on()
|
||||
sleep(1)
|
||||
red.off()
|
||||
sleep(1)
|
||||
```
|
||||
|
||||
Alternatively:
|
||||
|
||||
```python
|
||||
from gpiozero import LED
|
||||
from signal import pause
|
||||
|
||||
red = LED(2)
|
||||
|
||||
red.blink()
|
||||
|
||||
pause()
|
||||
```
|
||||
|
||||
## Button
|
||||
|
||||
Check if a button is pressed:
|
||||
|
||||
```python
|
||||
from gpiozero import Button
|
||||
|
||||
button = Button(4)
|
||||
|
||||
while True:
|
||||
if button.is_pressed:
|
||||
print("Button is pressed")
|
||||
else:
|
||||
print("Button is not pressed")
|
||||
```
|
||||
|
||||
Wait for a button to be pressed before continuing:
|
||||
|
||||
```python
|
||||
from gpiozero import Button
|
||||
|
||||
button = Button(4)
|
||||
|
||||
button.wait_for_press()
|
||||
print("Button was pressed")
|
||||
```
|
||||
|
||||
Run a function every time the button is pressed:
|
||||
|
||||
```python
|
||||
from gpiozero import Button
|
||||
from signal import pause
|
||||
|
||||
def say_hello():
|
||||
print("Hello!")
|
||||
|
||||
button = Button(4)
|
||||
|
||||
button.when_pressed = say_hello
|
||||
|
||||
pause()
|
||||
```
|
||||
|
||||
## Button controlled LED
|
||||
|
||||
Turn on an LED when a button is pressed:
|
||||
|
||||
```python
|
||||
from gpiozero import LED, Button
|
||||
from signal import pause
|
||||
|
||||
led = LED(2)
|
||||
button = Button(3)
|
||||
|
||||
button.when_pressed = led.on
|
||||
button.when_released = led.off
|
||||
|
||||
pause()
|
||||
```
|
||||
|
||||
## Traffic Lights
|
||||
|
||||
A full traffic lights system.
|
||||
|
||||
Using a Traffic Lights kit like Pi-Stop:
|
||||
|
||||
```python
|
||||
from gpiozero import TrafficLights
|
||||
from time import sleep
|
||||
|
||||
lights = TrafficLights(2, 3, 4)
|
||||
|
||||
lights.green.on()
|
||||
|
||||
while True:
|
||||
sleep(10)
|
||||
lights.green.off()
|
||||
lights.amber.on()
|
||||
sleep(1)
|
||||
lights.amber.off()
|
||||
lights.red.on()
|
||||
sleep(10)
|
||||
lights.amber.on()
|
||||
sleep(1)
|
||||
lights.green.on()
|
||||
lights.amber.off()
|
||||
lights.red.off()
|
||||
```
|
||||
|
||||
Using components:
|
||||
|
||||
```python
|
||||
from gpiozero import LED
|
||||
from time import sleep
|
||||
|
||||
red = LED(2)
|
||||
amber = LED(3)
|
||||
green = LED(4)
|
||||
|
||||
green.on()
|
||||
amber.off()
|
||||
red.off()
|
||||
|
||||
while True:
|
||||
sleep(10)
|
||||
green.off()
|
||||
amber.on()
|
||||
sleep(1)
|
||||
amber.off()
|
||||
red.on()
|
||||
sleep(10)
|
||||
amber.on()
|
||||
sleep(1)
|
||||
green.on()
|
||||
amber.off()
|
||||
red.off()
|
||||
```
|
||||
|
||||
## Push button stop motion
|
||||
|
||||
Capture a picture with the camera module every time a button is pressed:
|
||||
|
||||
```python
|
||||
from gpiozero import Button
|
||||
from picamera import PiCamera
|
||||
|
||||
button = Button(17)
|
||||
|
||||
with PiCamera() as camera:
|
||||
camera.start_preview()
|
||||
frame = 1
|
||||
while True:
|
||||
button.wait_for_press()
|
||||
camera.capture('/home/pi/frame%03d.jpg' % frame)
|
||||
frame += 1
|
||||
```
|
||||
|
||||
See
|
||||
[Push Button Stop
|
||||
Motion](https://www.raspberrypi.org/learning/quick-reaction-game/) for a full
|
||||
resource.
|
||||
|
||||
## Reaction Game
|
||||
|
||||
When you see the light come on, the first person to press their button wins!
|
||||
|
||||
```python
|
||||
from gpiozero import Button, LED
|
||||
from time import sleep
|
||||
import random
|
||||
|
||||
led = LED(4)
|
||||
|
||||
player_1 = Button(2)
|
||||
player_2 = Button(3)
|
||||
|
||||
time = random.uniform(5, 10)
|
||||
sleep(time)
|
||||
led.on()
|
||||
|
||||
while True:
|
||||
if player_1.is_pressed:
|
||||
print("Player 1 wins!")
|
||||
break
|
||||
if player_2.is_pressed:
|
||||
print("Player 2 wins!")
|
||||
break
|
||||
|
||||
led.off()
|
||||
```
|
||||
|
||||
See
|
||||
[Quick Reaction Game](https://www.raspberrypi.org/learning/quick-reaction-game/)
|
||||
for a full resource.
|
||||
|
||||
## GPIO Music Box
|
||||
|
||||
Each button plays a different sound!
|
||||
|
||||
```python
|
||||
from gpiozero import Button
|
||||
import pygame.mixer
|
||||
from pygame.mixer import Sound
|
||||
from signal import pause
|
||||
|
||||
pygame.mixer.init()
|
||||
|
||||
sound_pins = {
|
||||
2: Sound("samples/drum_tom_mid_hard.wav"),
|
||||
3: Sound("samples/drum_cymbal_open.wav"),
|
||||
}
|
||||
|
||||
buttons = [Button(pin) for pin in sound_pins]
|
||||
for button in buttons:
|
||||
sound = sound_pins[button.pin]
|
||||
button.when_pressed = sound.play
|
||||
|
||||
pause()
|
||||
```
|
||||
|
||||
See [GPIO Music Box](https://www.raspberrypi.org/learning/gpio-music-box/)
|
||||
for a full resource.
|
||||
|
||||
## All on when pressed
|
||||
|
||||
While the button is pressed down, the buzzer and all the lights come on.
|
||||
|
||||
FishDish:
|
||||
|
||||
```python
|
||||
from gpiozero import FishDish
|
||||
from signal import pause
|
||||
|
||||
fish = FishDish()
|
||||
|
||||
fish.button.when_pressed = fish.on
|
||||
fish.button.when_released = fish.off
|
||||
|
||||
pause()
|
||||
```
|
||||
|
||||
Ryanteck Traffic HAT:
|
||||
|
||||
```python
|
||||
from gpiozero import TrafficHat
|
||||
from signal import pause
|
||||
|
||||
th = TrafficHat()
|
||||
|
||||
th.button.when_pressed = th.on
|
||||
th.button.when_released = th.off
|
||||
|
||||
pause()
|
||||
```
|
||||
|
||||
Using components:
|
||||
|
||||
```python
|
||||
from gpiozero import LED, Buzzer, Button
|
||||
from signal import pause
|
||||
|
||||
button = Button(2)
|
||||
buzzer = Buzzer(3)
|
||||
red = LED(4)
|
||||
amber = LED(5)
|
||||
green = LED(6)
|
||||
|
||||
things = [red, amber, green, buzzer]
|
||||
|
||||
def things_on():
|
||||
for thing in things:
|
||||
thing.on()
|
||||
|
||||
def things_off():
|
||||
for thing in things:
|
||||
thing.off()
|
||||
|
||||
button.when_pressed = things_on
|
||||
button.when_released = things_off
|
||||
|
||||
pause()
|
||||
```
|
||||
|
||||
## RGB LED
|
||||
|
||||
Making colours with an RGB LED:
|
||||
|
||||
```python
|
||||
from gpiozero import RGBLED
|
||||
from time import sleep
|
||||
|
||||
led = RGBLED(red=9, green=10, blue=11)
|
||||
|
||||
led.red = 1 # full red
|
||||
led.red = 0.5 # half red
|
||||
|
||||
led.color = (0, 1, 0) # full green
|
||||
|
||||
led.color = (1, 0, 1) # magenta
|
||||
led.color = (1, 1, 0) # yellow
|
||||
led.color = (0, 1, 1) # cyan
|
||||
led.color = (1, 1, 1) # white
|
||||
|
||||
led.color = (0, 0, 0) # off
|
||||
|
||||
# slowly increase intensity of blue
|
||||
for n in range(100):
|
||||
led.blue = n/100
|
||||
sleep(0.1)
|
||||
```
|
||||
|
||||
## Motion Sensor
|
||||
|
||||
Light an LED when motion is detected:
|
||||
|
||||
```python
|
||||
from gpiozero import MotionSensor, LED
|
||||
from signal import pause
|
||||
|
||||
pir = MotionSensor(5)
|
||||
led = LED(16)
|
||||
|
||||
pir.when_motion = led.on
|
||||
pir.when_no_motion = led.off
|
||||
|
||||
pause()
|
||||
```
|
||||
|
||||
## Light Sensor
|
||||
|
||||
Wait for light and dark:
|
||||
|
||||
```python
|
||||
from gpiozero import LightSensor
|
||||
|
||||
sensor = LightSensor(18)
|
||||
|
||||
while True:
|
||||
sensor.wait_for_light()
|
||||
print("It's light! :)")
|
||||
sensor.wait_for_dark()
|
||||
print("It's dark :(")
|
||||
```
|
||||
|
||||
Run a function when the light changes:
|
||||
|
||||
```python
|
||||
from gpiozero import LightSensor, LED
|
||||
from signal import pause
|
||||
|
||||
sensor = LightSensor(18)
|
||||
led = LED(16)
|
||||
|
||||
sensor.when_dark = led.on
|
||||
sensor.when_light = led.off
|
||||
|
||||
pause()
|
||||
```
|
||||
|
||||
## Motors
|
||||
|
||||
Spin a motor around forwards and backwards:
|
||||
|
||||
```python
|
||||
from gpiozero import Motor
|
||||
from time import sleep
|
||||
|
||||
motor = Motor(forward=4, back=14)
|
||||
|
||||
while True:
|
||||
motor.forward()
|
||||
sleep(5)
|
||||
motor.backward()
|
||||
sleep(5)
|
||||
```
|
||||
|
||||
## Robot
|
||||
|
||||
Make a robot drive around in (roughly) a square:
|
||||
|
||||
```python
|
||||
from gpiozero import Robot
|
||||
from time import sleep
|
||||
|
||||
robot = Robot(left=(4, 14), right=(17, 18))
|
||||
|
||||
for i in range(4):
|
||||
robot.forward()
|
||||
sleep(10)
|
||||
robot.right()
|
||||
sleep(1)
|
||||
```
|
||||
|
||||
## Button controlled Robot
|
||||
|
||||
Use four GPIO buttons as forward/back/left/right controls for a robot:
|
||||
|
||||
```python
|
||||
from gpiozero import RyanteckRobot, Button
|
||||
from signal import pause
|
||||
|
||||
robot = RyanteckRobot()
|
||||
|
||||
left = Button(26)
|
||||
right = Button(16)
|
||||
fw = Button(21)
|
||||
bw = Button(20)
|
||||
|
||||
fw.when_pressed = robot.forward
|
||||
fw.when_released = robot.stop
|
||||
|
||||
left.when_pressed = robot.left
|
||||
left.when_released = robot.stop
|
||||
|
||||
right.when_pressed = robot.right
|
||||
right.when_released = robot.stop
|
||||
|
||||
bw.when_pressed = robot.backward
|
||||
bw.when_released = robot.stop
|
||||
|
||||
pause()
|
||||
```
|
||||
|
||||
## Keyboard controlled Robot
|
||||
|
||||
Use up/down/left/right keys to control a robot:
|
||||
|
||||
```python
|
||||
from gpiozero import RyanteckRobot
|
||||
from evdev import InputDevice, list_devices, ecodes
|
||||
|
||||
robot = RyanteckRobot()
|
||||
|
||||
devices = [InputDevice(device) for device in list_devices()]
|
||||
keyboard = devices[0] # this may vary
|
||||
|
||||
keypress_actions = {
|
||||
ecodes.KEY_UP: robot.forward,
|
||||
ecodes.KEY_DOWN: robot.backward,
|
||||
ecodes.KEY_LEFT: robot.left,
|
||||
ecodes.KEY_RIGHT: robot.right,
|
||||
}
|
||||
|
||||
for event in keyboard.read_loop():
|
||||
if event.type == ecodes.EV_KEY:
|
||||
if event.value == 1: # key down
|
||||
keypress_actions[event.code]()
|
||||
if event.value == 0: # key up
|
||||
robot.stop()
|
||||
```
|
||||
|
||||
## Motion Sensor Robot
|
||||
|
||||
Make a robot drive forward when it detects motion:
|
||||
|
||||
```python
|
||||
from gpiozero import Robot, MotionSensor
|
||||
from signal import pause
|
||||
|
||||
robot = Robot(left=(4, 14), right=(17, 18))
|
||||
pir = MotionSensor(5)
|
||||
|
||||
pir.when_motion = robot.forward
|
||||
pir.when_no_motion = robot.stop
|
||||
|
||||
pause()
|
||||
```
|
||||
|
||||
## Potentiometer
|
||||
|
||||
Continually print the value of a potentiometer (values between 0 and 1):
|
||||
|
||||
```python
|
||||
from gpiozero import MCP3008
|
||||
|
||||
while True:
|
||||
with MCP3008(channel=0) as pot:
|
||||
print(pot.value)
|
||||
```
|
||||
|
||||
## Full Colour LED controlled by 3 Potentiometers
|
||||
|
||||
Wire up three potentiometers (for red, green and blue) and use each of their
|
||||
values to make up the colour of the LED:
|
||||
|
||||
```python
|
||||
from gpiozero import RGBLED, MCP3008
|
||||
|
||||
led = RGBLED(red=2, green=3, blue=4)
|
||||
red_pot = MCP3008(channel=0)
|
||||
green_pot = MCP3008(channel=1)
|
||||
blue_pot = MCP3008(channel=2)
|
||||
|
||||
while True:
|
||||
led.red = red_pot.value
|
||||
led.green = green_pot.value
|
||||
led.blue = blue_pot.value
|
||||
```
|
||||
|
||||
Alternatively, the following example is identical and uses the `source` property
|
||||
rather than a `while` loop:
|
||||
|
||||
```python
|
||||
from gpiozero import RGBLED, MCP3008
|
||||
from signal import pause
|
||||
|
||||
led = RGBLED(red=2, green=3, blue=4)
|
||||
red_pot = MCP3008(channel=0)
|
||||
green_pot = MCP3008(channel=1)
|
||||
blue_pot = MCP3008(channel=2)
|
||||
|
||||
led.red.source = red_pot.values
|
||||
led.green.source = green_pot.values
|
||||
led.blue.source = blue_pot.values
|
||||
|
||||
pause()
|
||||
```
|
||||
503
docs/recipes.rst
Normal file
@@ -0,0 +1,503 @@
|
||||
=======
|
||||
Recipes
|
||||
=======
|
||||
|
||||
.. currentmodule:: gpiozero
|
||||
|
||||
Pin Numbering
|
||||
=============
|
||||
|
||||
This library uses Broadcom (BCM) pin numbering for the GPIO pins, as opposed
|
||||
to physical (BOARD) numbering. Unlike in the `RPi.GPIO`_ library, this is not
|
||||
configurable.
|
||||
|
||||
.. _RPi.GPIO: https://pypi.python.org/pypi/RPi.GPIO
|
||||
|
||||
Any pin marked ``GPIO`` in the diagram below can be used for generic
|
||||
components:
|
||||
|
||||
.. image:: images/pin_layout.*
|
||||
|
||||
LED
|
||||
===
|
||||
|
||||
.. image:: images/led.*
|
||||
|
||||
Turn an :class:`LED` on and off repeatedly::
|
||||
|
||||
from gpiozero import LED
|
||||
from time import sleep
|
||||
|
||||
red = LED(17)
|
||||
|
||||
while True:
|
||||
red.on()
|
||||
sleep(1)
|
||||
red.off()
|
||||
sleep(1)
|
||||
|
||||
Alternatively::
|
||||
|
||||
from gpiozero import LED
|
||||
from signal import pause
|
||||
|
||||
red = LED(17)
|
||||
|
||||
red.blink()
|
||||
pause()
|
||||
|
||||
.. note::
|
||||
|
||||
Reaching the end of a Python script will terminate the process and GPIOs
|
||||
may be reset. Keep your script alive with :func:`signal.pause`. See
|
||||
:ref:`keep-your-script-running` for more information.
|
||||
|
||||
Button
|
||||
======
|
||||
|
||||
.. image:: images/button.*
|
||||
|
||||
Check if a :class:`Button` is pressed::
|
||||
|
||||
from gpiozero import Button
|
||||
|
||||
button = Button(2)
|
||||
|
||||
while True:
|
||||
if button.is_pressed:
|
||||
print("Button is pressed")
|
||||
else:
|
||||
print("Button is not pressed")
|
||||
|
||||
Wait for a button to be pressed before continuing::
|
||||
|
||||
from gpiozero import Button
|
||||
|
||||
button = Button(2)
|
||||
|
||||
button.wait_for_press()
|
||||
print("Button was pressed")
|
||||
|
||||
Run a function every time the button is pressed::
|
||||
|
||||
from gpiozero import Button
|
||||
from signal import pause
|
||||
|
||||
def say_hello():
|
||||
print("Hello!")
|
||||
|
||||
button = Button(2)
|
||||
|
||||
button.when_pressed = say_hello
|
||||
pause()
|
||||
|
||||
Button controlled LED
|
||||
=====================
|
||||
|
||||
Turn on an :class:`LED` when a :class:`Button` is pressed::
|
||||
|
||||
from gpiozero import LED, Button
|
||||
from signal import pause
|
||||
|
||||
led = LED(17)
|
||||
button = Button(2)
|
||||
|
||||
button.when_pressed = led.on
|
||||
button.when_released = led.off
|
||||
|
||||
pause()
|
||||
|
||||
Traffic Lights
|
||||
==============
|
||||
|
||||
A full traffic lights system.
|
||||
|
||||
Using a :class:`TrafficLights` kit like Pi-Stop::
|
||||
|
||||
from gpiozero import TrafficLights
|
||||
from time import sleep
|
||||
|
||||
lights = TrafficLights(2, 3, 4)
|
||||
|
||||
lights.green.on()
|
||||
|
||||
while True:
|
||||
sleep(10)
|
||||
lights.green.off()
|
||||
lights.amber.on()
|
||||
sleep(1)
|
||||
lights.amber.off()
|
||||
lights.red.on()
|
||||
sleep(10)
|
||||
lights.amber.on()
|
||||
sleep(1)
|
||||
lights.green.on()
|
||||
lights.amber.off()
|
||||
lights.red.off()
|
||||
|
||||
Using :class:`LED` components::
|
||||
|
||||
from gpiozero import LED
|
||||
from time import sleep
|
||||
|
||||
red = LED(2)
|
||||
amber = LED(3)
|
||||
green = LED(4)
|
||||
|
||||
green.on()
|
||||
amber.off()
|
||||
red.off()
|
||||
|
||||
while True:
|
||||
sleep(10)
|
||||
green.off()
|
||||
amber.on()
|
||||
sleep(1)
|
||||
amber.off()
|
||||
red.on()
|
||||
sleep(10)
|
||||
amber.on()
|
||||
sleep(1)
|
||||
green.on()
|
||||
amber.off()
|
||||
red.off()
|
||||
|
||||
Push button stop motion
|
||||
=======================
|
||||
|
||||
Capture a picture with the camera module every time a button is pressed::
|
||||
|
||||
from gpiozero import Button
|
||||
from picamera import PiCamera
|
||||
|
||||
button = Button(2)
|
||||
|
||||
with PiCamera() as camera:
|
||||
camera.start_preview()
|
||||
frame = 1
|
||||
while True:
|
||||
button.wait_for_press()
|
||||
camera.capture('/home/pi/frame%03d.jpg' % frame)
|
||||
frame += 1
|
||||
|
||||
See `Push Button Stop Motion`_ for a full resource.
|
||||
|
||||
Reaction Game
|
||||
=============
|
||||
|
||||
When you see the light come on, the first person to press their button wins!
|
||||
|
||||
::
|
||||
|
||||
from gpiozero import Button, LED
|
||||
from time import sleep
|
||||
import random
|
||||
|
||||
led = LED(17)
|
||||
|
||||
player_1 = Button(2)
|
||||
player_2 = Button(3)
|
||||
|
||||
time = random.uniform(5, 10)
|
||||
sleep(time)
|
||||
led.on()
|
||||
|
||||
while True:
|
||||
if player_1.is_pressed:
|
||||
print("Player 1 wins!")
|
||||
break
|
||||
if player_2.is_pressed:
|
||||
print("Player 2 wins!")
|
||||
break
|
||||
|
||||
led.off()
|
||||
|
||||
See `Quick Reaction Game`_ for a full resource.
|
||||
|
||||
GPIO Music Box
|
||||
==============
|
||||
|
||||
Each button plays a different sound!
|
||||
|
||||
::
|
||||
|
||||
from gpiozero import Button
|
||||
import pygame.mixer
|
||||
from pygame.mixer import Sound
|
||||
|
||||
pygame.mixer.init()
|
||||
|
||||
def play(pin):
|
||||
sound = sound_pins[pin]
|
||||
print("playing note from pin %s" % pin)
|
||||
sound.play()
|
||||
|
||||
sound_pins = {
|
||||
2: Sound("samples/drum_tom_mid_hard.wav"),
|
||||
3: Sound("samples/drum_cymbal_open.wav"),
|
||||
}
|
||||
|
||||
buttons = [Button(pin) for pin in sound_pins]
|
||||
for button in buttons:
|
||||
sound = sound_pins[button.pin]
|
||||
button.when_pressed = sound.play
|
||||
|
||||
See `GPIO Music Box`_ for a full resource.
|
||||
|
||||
All on when pressed
|
||||
===================
|
||||
|
||||
While the button is pressed down, the buzzer and all the lights come on.
|
||||
|
||||
:class:`FishDish`::
|
||||
|
||||
from gpiozero import FishDish
|
||||
|
||||
fish = FishDish()
|
||||
|
||||
fish.button.when_pressed = fish.on
|
||||
fish.button.when_released = fish.off
|
||||
|
||||
Ryanteck :class:`TrafficHat`::
|
||||
|
||||
from gpiozero import TrafficHat
|
||||
|
||||
th = TrafficHat()
|
||||
|
||||
th.button.when_pressed = th.on
|
||||
th.button.when_released = th.off
|
||||
|
||||
Using :class:`LED`, :class:`Buzzer`, and :class:`Button` components::
|
||||
|
||||
from gpiozero import LED, Buzzer, Button
|
||||
|
||||
button = Button(2)
|
||||
buzzer = Buzzer(3)
|
||||
red = LED(4)
|
||||
amber = LED(5)
|
||||
green = LED(6)
|
||||
|
||||
things = [red, amber, green, buzzer]
|
||||
|
||||
def things_on():
|
||||
for thing in things:
|
||||
thing.on()
|
||||
|
||||
def things_off():
|
||||
for thing in things:
|
||||
thing.off()
|
||||
|
||||
button.when_pressed = things_on
|
||||
button.when_released = things_off
|
||||
|
||||
RGB LED
|
||||
=======
|
||||
|
||||
Making colours with an :class:`RGBLED`::
|
||||
|
||||
from gpiozero import RGBLED
|
||||
from time import sleep
|
||||
|
||||
led = RGBLED(red=9, green=10, blue=11)
|
||||
|
||||
led.red = 1 # full red
|
||||
led.red = 0.5 # half red
|
||||
|
||||
led.color = (0, 1, 0) # full green
|
||||
|
||||
led.color = (1, 0, 1) # magenta
|
||||
led.color = (1, 1, 0) # yellow
|
||||
led.color = (0, 1, 1) # cyan
|
||||
led.color = (1, 1, 1) # white
|
||||
|
||||
led.color = (0, 0, 0) # off
|
||||
|
||||
# slowly increase intensity of blue
|
||||
for n in range(100):
|
||||
led.blue = n/100
|
||||
sleep(0.1)
|
||||
|
||||
Motion sensor
|
||||
=============
|
||||
|
||||
.. image:: images/motion-sensor.*
|
||||
|
||||
Light an :class:`LED` when a :class:`MotionSensor` detects motion::
|
||||
|
||||
from gpiozero import MotionSensor, LED
|
||||
|
||||
pir = MotionSensor(4)
|
||||
led = LED(16)
|
||||
|
||||
pir.when_motion = led.on
|
||||
pir.when_no_motion = led.off
|
||||
|
||||
Light sensor
|
||||
============
|
||||
|
||||
.. IMAGE TBD
|
||||
|
||||
Have a :class:`LightSensor` detect light and dark::
|
||||
|
||||
from gpiozero import LightSensor
|
||||
|
||||
sensor = LightSensor(18)
|
||||
|
||||
while True:
|
||||
sensor.wait_for_light()
|
||||
print("It's light! :)")
|
||||
sensor.wait_for_dark()
|
||||
print("It's dark :(")
|
||||
|
||||
Run a function when the light changes::
|
||||
|
||||
from gpiozero import LightSensor, LED
|
||||
|
||||
sensor = LightSensor(18)
|
||||
led = LED(16)
|
||||
|
||||
sensor.when_dark = led.on
|
||||
sensor.when_light = led.off
|
||||
|
||||
Motors
|
||||
======
|
||||
|
||||
.. IMAGE TBD
|
||||
|
||||
Spin a :class:`Motor` around forwards and backwards::
|
||||
|
||||
from gpiozero import Motor
|
||||
from time import sleep
|
||||
|
||||
motor = Motor(forward=4, back=14)
|
||||
|
||||
while True:
|
||||
motor.forward()
|
||||
sleep(5)
|
||||
motor.backward()
|
||||
sleep(5)
|
||||
|
||||
Robot
|
||||
=====
|
||||
|
||||
.. IMAGE TBD
|
||||
|
||||
Make a :class:`Robot` drive around in (roughly) a square::
|
||||
|
||||
from gpiozero import Robot
|
||||
from time import sleep
|
||||
|
||||
robot = Robot(left=(4, 14), right=(17, 18))
|
||||
|
||||
for i in range(4):
|
||||
robot.forward()
|
||||
sleep(10)
|
||||
robot.right()
|
||||
sleep(1)
|
||||
|
||||
Button controlled robot
|
||||
=======================
|
||||
|
||||
Use four GPIO buttons as forward/back/left/right controls for a robot::
|
||||
|
||||
from gpiozero import RyanteckRobot, Button
|
||||
from signal import pause
|
||||
|
||||
robot = RyanteckRobot()
|
||||
|
||||
left = Button(26)
|
||||
right = Button(16)
|
||||
fw = Button(21)
|
||||
bw = Button(20)
|
||||
|
||||
fw.when_pressed = robot.forward
|
||||
fw.when_released = robot.stop
|
||||
|
||||
left.when_pressed = robot.left
|
||||
left.when_released = robot.stop
|
||||
|
||||
right.when_pressed = robot.right
|
||||
right.when_released = robot.stop
|
||||
|
||||
bw.when_pressed = robot.backward
|
||||
bw.when_released = robot.stop
|
||||
|
||||
pause()
|
||||
|
||||
Keyboard controlled robot
|
||||
=========================
|
||||
|
||||
Use up/down/left/right keys to control a robot::
|
||||
|
||||
from gpiozero import RyanteckRobot
|
||||
from evdev import InputDevice, list_devices, ecodes
|
||||
|
||||
robot = RyanteckRobot()
|
||||
|
||||
devices = [InputDevice(device) for device in list_devices()]
|
||||
keyboard = devices[0] # this may vary
|
||||
|
||||
keypress_actions = {
|
||||
ecodes.KEY_UP: robot.forward,
|
||||
ecodes.KEY_DOWN: robot.backward,
|
||||
ecodes.KEY_LEFT: robot.left,
|
||||
ecodes.KEY_RIGHT: robot.right,
|
||||
}
|
||||
|
||||
for event in keyboard.read_loop():
|
||||
if event.type == ecodes.EV_KEY:
|
||||
if event.value == 1: # key down
|
||||
keypress_actions[event.code]()
|
||||
if event.value == 0: # key up
|
||||
robot.stop()
|
||||
|
||||
Motion sensor robot
|
||||
===================
|
||||
|
||||
Make a robot drive forward when it detects motion::
|
||||
|
||||
from gpiozero import Robot, MotionSensor
|
||||
|
||||
robot = Robot(left=(4, 14), right=(17, 18))
|
||||
pir = MotionSensor(5)
|
||||
|
||||
pir.when_motion = robot.forward
|
||||
pir.when_no_motion = robot.stop
|
||||
|
||||
Potentiometer
|
||||
=============
|
||||
|
||||
.. IMAGE TBD
|
||||
|
||||
Continually print the value of a potentiometer (values between 0 and 1)
|
||||
connected to a :class:`MCP3008` analog to digital converter::
|
||||
|
||||
from gpiozero import MCP3008
|
||||
|
||||
while True:
|
||||
with MCP3008(channel=0) as pot:
|
||||
print(pot.read())
|
||||
|
||||
Full color LED controlled by 3 potentiometers
|
||||
=============================================
|
||||
|
||||
Wire up three potentiometers (for red, green and blue) and use each of their
|
||||
values to make up the colour of the LED::
|
||||
|
||||
from gpiozero import RGBLED, MCP3008
|
||||
|
||||
led = RGBLED(red=2, green=3, blue=4)
|
||||
red_pot = MCP3008(channel=0)
|
||||
green_pot = MCP3008(channel=1)
|
||||
blue_pot = MCP3008(channel=2)
|
||||
|
||||
while True:
|
||||
led.red = red_pot.value
|
||||
led.green = green_pot.value
|
||||
led.blue = blue_pot.value
|
||||
|
||||
|
||||
.. _Push Button Stop Motion: https://www.raspberrypi.org/learning/quick-reaction-game/
|
||||
.. _Quick Reaction Game: https://www.raspberrypi.org/learning/quick-reaction-game/
|
||||
.. _GPIO Music Box: https://www.raspberrypi.org/learning/gpio-music-box/
|
||||
|
||||