Generic docs need reST
Conversion of all docs to reST so that the generic docs can link easily with the rest of the docs.
1
Makefile
@@ -50,6 +50,7 @@ DIST_TAR=dist/$(NAME)-$(VER).tar.gz
|
||||
DIST_ZIP=dist/$(NAME)-$(VER).zip
|
||||
DIST_DEB=dist/python-$(NAME)_$(VER)$(DEB_SUFFIX)_all.deb \
|
||||
dist/python3-$(NAME)_$(VER)$(DEB_SUFFIX)_all.deb \
|
||||
dist/python-$(NAME)-doc_$(VER)$(DEB_SUFFIX)_all.deb \
|
||||
dist/$(NAME)_$(VER)$(DEB_SUFFIX)_$(DEB_ARCH).changes
|
||||
DIST_DSC=dist/$(NAME)_$(VER)$(DEB_SUFFIX).tar.gz \
|
||||
dist/$(NAME)_$(VER)$(DEB_SUFFIX).dsc \
|
||||
|
||||
22
README.rst
@@ -2,16 +2,15 @@
|
||||
gpiozero
|
||||
========
|
||||
|
||||
.. image:: https://badge.fury.io/py/gpiozero.svg
|
||||
:target: https://badge.fury.io/py/gpiozero
|
||||
:alt: Latest Version
|
||||
|
||||
A simple interface to everyday GPIO components used with Raspberry Pi.
|
||||
|
||||
Created by `Ben Nuttall`_ of the `Raspberry Pi Foundation`_, `Dave Jones`_, and
|
||||
other contributors.
|
||||
|
||||
Latest release
|
||||
==============
|
||||
|
||||
The latest release is 1.0 released on 16th November 2015.
|
||||
|
||||
About
|
||||
=====
|
||||
|
||||
@@ -66,19 +65,19 @@ or::
|
||||
Documentation
|
||||
=============
|
||||
|
||||
Comprehensive documentation is available at `pythonhosted.org/gpiozero`_.
|
||||
Comprehensive documentation is available at https://gpiozero.readthedocs.org/.
|
||||
|
||||
Development
|
||||
===========
|
||||
|
||||
This project is being developed on `GitHub`_. Join in:
|
||||
|
||||
* Provide suggestions, report bugs and ask questions as `Issues`_
|
||||
* Provide suggestions, report bugs and ask questions as `issues`_
|
||||
* Provide examples we can use as `recipes`_
|
||||
* Contribute to the code
|
||||
|
||||
Alternatively, email suggestions and feedback to ben@raspberrypi.org or add to
|
||||
the `Google Doc`_.
|
||||
Alternatively, email suggestions and feedback to mailto:ben@raspberrypi.org or
|
||||
add to the `Google Doc`_.
|
||||
|
||||
Contributors
|
||||
============
|
||||
@@ -91,10 +90,9 @@ Contributors
|
||||
.. _Ben Nuttall: https://github.com/bennuttall
|
||||
.. _Raspberry Pi Foundation: https://www.raspberrypi.org/
|
||||
.. _Dave Jones: https://github.com/waveform80
|
||||
.. _pythonhosted.org/gpiozero: http://pythonhosted.org/gpiozero
|
||||
.. _GitHub: https://github.com/RPi-Distro/python-gpiozero
|
||||
.. _Issues: https://github.com/RPi-Distro/python-gpiozero/issues
|
||||
.. _recipes: http://pythonhosted.org/gpiozero/recipes/
|
||||
.. _issues: https://github.com/RPi-Distro/python-gpiozero/issues
|
||||
.. _recipes: http://gpiozero.readthedocs.org/en/latest/recipes.html
|
||||
.. _Google Doc: https://goo.gl/8zJLif
|
||||
.. _Ben Nuttall: https://github.com/bennuttall
|
||||
.. _Dave Jones: https://github.com/waveform80
|
||||
|
||||
13
debian/control
vendored
@@ -3,7 +3,7 @@ Maintainer: Ben Nuttall <ben@raspberrypi.org>
|
||||
Homepage: http://github.com/RPi-Distro/python-gpiozero
|
||||
Section: python
|
||||
Priority: extra
|
||||
Build-Depends: debhelper (>= 8), python-all (>= 2.7), python-setuptools, python3-all, python3-setuptools
|
||||
Build-Depends: debhelper (>= 8), python-all (>= 2.7), python-setuptools, python3-all, python3-setuptools, python-sphinx (>= 1.0.7+dfsg-1~)
|
||||
Standards-Version: 3.9.6
|
||||
X-Python-Version: >= 2.7
|
||||
X-Python3-Version: >= 3.2
|
||||
@@ -32,3 +32,14 @@ Description: Simple API for controlling devices attached to the GPIO pins.
|
||||
.
|
||||
This is the Python 3 version of the package.
|
||||
|
||||
Package: python-gpiozero-doc
|
||||
Architecture: all
|
||||
Section: doc
|
||||
Depends: ${sphinxdoc:Depends}, ${misc:Depends}
|
||||
Description: Documentation for the gpiozero API
|
||||
gpiozero builds on RPi.GPIO to provide a set of classes designed to simplify
|
||||
interaction with devices connected to the GPIO pins, from simple buttons and
|
||||
LEDs, up to various add-on boards. The API tries to adhere closely to Python's
|
||||
idioms and naming conventions.
|
||||
.
|
||||
This is the version independent documentation for the package.
|
||||
|
||||
10
debian/python-gpiozero-doc.doc-base
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
Document: python-gpiozero
|
||||
Title: GPIO Zero Reference
|
||||
Author: Ben Nuttall <ben@raspberrypi.org>
|
||||
Abstract: Documentation for the gpiozero API
|
||||
Section: Programming/Python
|
||||
|
||||
Format: HTML
|
||||
Index: /usr/share/doc/python-gpiozero-doc/html/index.html
|
||||
Files: /usr/share/doc/python-gpiozero-doc/html/*
|
||||
|
||||
1
debian/python-gpiozero-doc.docs
vendored
Normal file
@@ -0,0 +1 @@
|
||||
build/sphinx/html/
|
||||
8
debian/rules
vendored
@@ -5,7 +5,7 @@
|
||||
export DH_OPTIONS
|
||||
|
||||
%:
|
||||
dh $@ --with python2,python3 --buildsystem=python_distutils
|
||||
dh $@ --with python2,python3,sphinxdoc --buildsystem=python_distutils
|
||||
|
||||
override_dh_auto_install:
|
||||
python setup.py install --root debian/python-gpiozero --install-layout=deb
|
||||
@@ -14,7 +14,7 @@ override_dh_auto_install:
|
||||
#override_dh_auto_test:
|
||||
# # Don't run the tests!
|
||||
|
||||
#override_dh_installdocs:
|
||||
# python setup.py build_sphinx -b html
|
||||
# dh_installdocs
|
||||
override_dh_installdocs:
|
||||
python setup.py build_sphinx -b html
|
||||
dh_installdocs
|
||||
|
||||
|
||||
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/
|
||||
|
||||
@@ -13,9 +13,16 @@ from .exc import (
|
||||
)
|
||||
from .devices import (
|
||||
GPIODevice,
|
||||
CompositeDevice,
|
||||
SourceMixin,
|
||||
ValuesMixin,
|
||||
)
|
||||
from .input_devices import (
|
||||
InputDevice,
|
||||
WaitableInputDevice,
|
||||
DigitalInputDevice,
|
||||
SmoothedInputDevice,
|
||||
AnalogInputDevice,
|
||||
Button,
|
||||
LineSensor,
|
||||
MotionSensor,
|
||||
@@ -31,6 +38,7 @@ from .input_devices import (
|
||||
)
|
||||
from .output_devices import (
|
||||
OutputDevice,
|
||||
DigitalOutputDevice,
|
||||
PWMOutputDevice,
|
||||
PWMLED,
|
||||
LED,
|
||||
|
||||
@@ -20,7 +20,25 @@ from .devices import CompositeDevice, SourceMixin
|
||||
|
||||
class LEDBoard(SourceMixin, CompositeDevice):
|
||||
"""
|
||||
A Generic LED Board or collection of LEDs.
|
||||
Extends :class:`CompositeDevice` and represents a generic LED board or
|
||||
collection of LEDs.
|
||||
|
||||
The following example turns on all the LEDs on a board containing 5 LEDs
|
||||
attached to GPIO pins 2 through 6::
|
||||
|
||||
from gpiozero import LEDBoard
|
||||
|
||||
leds = LEDBoard(2, 3, 4, 5, 6)
|
||||
leds.on()
|
||||
|
||||
:param int \*pins:
|
||||
Specify the GPIO pins that the LEDs of the board are attached to. You
|
||||
can designate as many pins as necessary.
|
||||
|
||||
:param bool pwm:
|
||||
If ``True``, construct :class:`PWMLED` instances for each pin. If
|
||||
``False`` (the default), construct regular :class:`LED` instances. This
|
||||
parameter can only be specified as a keyword parameter.
|
||||
"""
|
||||
def __init__(self, *pins, **kwargs):
|
||||
super(LEDBoard, self).__init__()
|
||||
@@ -39,15 +57,16 @@ class LEDBoard(SourceMixin, CompositeDevice):
|
||||
@property
|
||||
def leds(self):
|
||||
"""
|
||||
A tuple of all the `LED` objects contained by the instance.
|
||||
A tuple of all the :class:`LED` or :class:`PWMLED` objects contained by
|
||||
the instance.
|
||||
"""
|
||||
return self._leds
|
||||
|
||||
@property
|
||||
def value(self):
|
||||
"""
|
||||
A tuple containing a boolean value for each LED on the board. This
|
||||
property can also be set to update the state of all LEDs on the board.
|
||||
A tuple containing a value for each LED on the board. This property can
|
||||
also be set to update the state of all LEDs on the board.
|
||||
"""
|
||||
return tuple(led.value for led in self._leds)
|
||||
|
||||
@@ -82,19 +101,19 @@ class LEDBoard(SourceMixin, CompositeDevice):
|
||||
"""
|
||||
Make all the LEDs turn on and off repeatedly.
|
||||
|
||||
on_time: `1`
|
||||
Number of seconds to be on
|
||||
:param float on_time:
|
||||
Number of seconds on
|
||||
|
||||
off_time: `1`
|
||||
Number of seconds to be off
|
||||
:param float off_time:
|
||||
Number of seconds off
|
||||
|
||||
n: `None`
|
||||
Number of times to blink; None means forever
|
||||
:param int n:
|
||||
Number of times to blink; ``None`` means forever
|
||||
|
||||
background: `True`
|
||||
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
|
||||
:param bool 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).
|
||||
"""
|
||||
# XXX This isn't going to work for background=False
|
||||
@@ -104,7 +123,22 @@ class LEDBoard(SourceMixin, CompositeDevice):
|
||||
|
||||
class PiLiter(LEDBoard):
|
||||
"""
|
||||
Ciseco Pi-LITEr: strip of 8 very bright LEDs.
|
||||
Extends :class:`LEDBoard` for the Ciseco Pi-LITEr: a strip of 8 very bright
|
||||
LEDs.
|
||||
|
||||
The Pi-LITEr pins are fixed and therefore there's no need to specify them
|
||||
when constructing this class. The following example turns on all the LEDs
|
||||
of the Pi-LITEr::
|
||||
|
||||
from gpiozero import PiLiter
|
||||
|
||||
lite = PiLiter()
|
||||
lite.on()
|
||||
|
||||
:param bool pwm:
|
||||
If ``True``, construct :class:`PWMLED` instances for each pin. If
|
||||
``False`` (the default), construct regular :class:`LED` instances. This
|
||||
parameter can only be specified as a keyword parameter.
|
||||
"""
|
||||
def __init__(self, pwm=False):
|
||||
super(PiLiter, self).__init__(4, 17, 27, 18, 22, 23, 24, 25, pwm=pwm)
|
||||
@@ -115,16 +149,30 @@ TrafficLightTuple = namedtuple('TrafficLightTuple', ('red', 'amber', 'green'))
|
||||
|
||||
class TrafficLights(LEDBoard):
|
||||
"""
|
||||
Generic Traffic Lights set.
|
||||
Extends :class:`LEDBoard` for devices containing red, amber, and green
|
||||
LEDs.
|
||||
|
||||
red: `None`
|
||||
Red LED pin
|
||||
The following example initializes a device connected to GPIO pins 2, 3,
|
||||
and 4, then lights the amber LED attached to GPIO 3::
|
||||
|
||||
amber: `None`
|
||||
Amber LED pin
|
||||
from gpiozero import TrafficLights
|
||||
|
||||
green: `None`
|
||||
Green LED pin
|
||||
traffic = TrafficLights(2, 3, 4)
|
||||
traffic.amber.on()
|
||||
|
||||
:param int red:
|
||||
The GPIO pin that the red LED is attached to.
|
||||
|
||||
:param int amber:
|
||||
The GPIO pin that the amber LED is attached to.
|
||||
|
||||
:param int green:
|
||||
The GPIO pin that the green LED is attached to.
|
||||
|
||||
:param bool pwm:
|
||||
If ``True``, construct :class:`PWMLED` instances to represent each
|
||||
LED. If ``False`` (the default), construct regular :class:`LED`
|
||||
instances.
|
||||
"""
|
||||
def __init__(self, red=None, amber=None, green=None, pwm=False):
|
||||
if not all([red, amber, green]):
|
||||
@@ -135,6 +183,10 @@ class TrafficLights(LEDBoard):
|
||||
|
||||
@property
|
||||
def value(self):
|
||||
"""
|
||||
A 3-tuple containing values for the red, amber, and green LEDs. This
|
||||
property can also be set to alter the state of the LEDs.
|
||||
"""
|
||||
return TrafficLightTuple(*super(TrafficLights, self).value)
|
||||
|
||||
@value.setter
|
||||
@@ -145,29 +197,41 @@ class TrafficLights(LEDBoard):
|
||||
@property
|
||||
def red(self):
|
||||
"""
|
||||
The `LED` object representing the red LED.
|
||||
The :class:`LED` or :class:`PWMLED` object representing the red LED.
|
||||
"""
|
||||
return self.leds[0]
|
||||
|
||||
@property
|
||||
def amber(self):
|
||||
"""
|
||||
The `LED` object representing the red LED.
|
||||
The :class:`LED` or :class:`PWMLED` object representing the red LED.
|
||||
"""
|
||||
return self.leds[1]
|
||||
|
||||
@property
|
||||
def green(self):
|
||||
"""
|
||||
The `LED` object representing the green LED.
|
||||
The :class:`LED` or :class:`PWMLED` object representing the green LED.
|
||||
"""
|
||||
return self.leds[2]
|
||||
|
||||
|
||||
class PiTraffic(TrafficLights):
|
||||
"""
|
||||
Low Voltage Labs PI-TRAFFIC: vertical traffic lights board on pins 9, 10
|
||||
and 11.
|
||||
Extends :class:`TrafficLights` for the Low Voltage Labs PI-TRAFFIC:
|
||||
vertical traffic lights board when attached to GPIO pins 9, 10, and 11.
|
||||
|
||||
There's no need to specify the pins if the PI-TRAFFIC is connected to the
|
||||
default pins (9, 10, 11). The following example turns on the amber LED on
|
||||
the PI-TRAFFIC::
|
||||
|
||||
from gpiozero import PiTraffic
|
||||
|
||||
traffic = PiTraffic()
|
||||
traffic.amber.on()
|
||||
|
||||
To use the PI-TRAFFIC board when attached to a non-standard set of pins,
|
||||
simply use the parent class, :class:`TrafficLights`.
|
||||
"""
|
||||
def __init__(self):
|
||||
super(PiTraffic, self).__init__(9, 10, 11)
|
||||
@@ -179,7 +243,18 @@ TrafficLightsBuzzerTuple = namedtuple('TrafficLightsBuzzerTuple', (
|
||||
|
||||
class TrafficLightsBuzzer(SourceMixin, CompositeDevice):
|
||||
"""
|
||||
A generic class for HATs with traffic lights, a button and a buzzer.
|
||||
Extends :class:`CompositeDevice` and is a generic class for HATs with
|
||||
traffic lights, a button and a buzzer.
|
||||
|
||||
:param TrafficLights lights:
|
||||
An instance of :class:`TrafficLights` representing the traffic lights
|
||||
of the HAT.
|
||||
|
||||
:param Buzzer buzzer:
|
||||
An instance of :class:`Buzzer` representing the buzzer on the HAT.
|
||||
|
||||
:param Button button:
|
||||
An instance of :class:`Button` representing the button on the HAT.
|
||||
"""
|
||||
def __init__(self, lights, buzzer, button):
|
||||
super(TrafficLightsBuzzer, self).__init__()
|
||||
@@ -201,7 +276,7 @@ class TrafficLightsBuzzer(SourceMixin, CompositeDevice):
|
||||
def all(self):
|
||||
"""
|
||||
A tuple containing objects for all the items on the board (several
|
||||
`LED` objects, a `Buzzer`, and a `Button`).
|
||||
:class:`LED` objects, a :class:`Buzzer`, and a :class:`Button`).
|
||||
"""
|
||||
return self._all
|
||||
|
||||
@@ -250,19 +325,19 @@ class TrafficLightsBuzzer(SourceMixin, CompositeDevice):
|
||||
"""
|
||||
Make all the board's components turn on and off repeatedly.
|
||||
|
||||
on_time: `1`
|
||||
Number of seconds to be on
|
||||
:param float on_time:
|
||||
Number of seconds on
|
||||
|
||||
off_time: `1`
|
||||
Number of seconds to be off
|
||||
:param float off_time:
|
||||
Number of seconds off
|
||||
|
||||
n: `None`
|
||||
Number of times to blink; None means forever
|
||||
:param int n:
|
||||
Number of times to blink; ``None`` means forever
|
||||
|
||||
background: `True`
|
||||
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
|
||||
:param bool 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).
|
||||
"""
|
||||
# XXX This isn't going to work for background=False
|
||||
@@ -272,7 +347,23 @@ class TrafficLightsBuzzer(SourceMixin, CompositeDevice):
|
||||
|
||||
class FishDish(TrafficLightsBuzzer):
|
||||
"""
|
||||
Pi Supply FishDish: traffic light LEDs, a button and a buzzer.
|
||||
Extends :class:`TrafficLightsBuzzer` for the Pi Supply FishDish: traffic
|
||||
light LEDs, a button and a buzzer.
|
||||
|
||||
The FishDish pins are fixed and therefore there's no need to specify them
|
||||
when constructing this class. The following example waits for the button
|
||||
to be pressed on the FishDish, then turns on all the LEDs::
|
||||
|
||||
from gpiozero import FishDish
|
||||
|
||||
fish = FishDish()
|
||||
fish.button.wait_for_press()
|
||||
fish.lights.on()
|
||||
|
||||
:param bool pwm:
|
||||
If ``True``, construct :class:`PWMLED` instances to represent each
|
||||
LED. If ``False`` (the default), construct regular :class:`LED`
|
||||
instances.
|
||||
"""
|
||||
def __init__(self, pwm=False):
|
||||
super(FishDish, self).__init__(
|
||||
@@ -284,7 +375,23 @@ class FishDish(TrafficLightsBuzzer):
|
||||
|
||||
class TrafficHat(TrafficLightsBuzzer):
|
||||
"""
|
||||
Ryanteck Traffic HAT: traffic light LEDs, a button and a buzzer.
|
||||
Extends :class:`TrafficLightsBuzzer` for the Ryanteck Traffic HAT: traffic
|
||||
light LEDs, a button and a buzzer.
|
||||
|
||||
The Traffic HAT pins are fixed and therefore there's no need to specify
|
||||
them when constructing this class. The following example waits for the
|
||||
button to be pressed on the Traffic HAT, then turns on all the LEDs::
|
||||
|
||||
from gpiozero import TrafficHat
|
||||
|
||||
hat = TrafficHat()
|
||||
hat.button.wait_for_press()
|
||||
hat.lights.on()
|
||||
|
||||
:param bool pwm:
|
||||
If ``True``, construct :class:`PWMLED` instances to represent each
|
||||
LED. If ``False`` (the default), construct regular :class:`LED`
|
||||
instances.
|
||||
"""
|
||||
def __init__(self, pwm=False):
|
||||
super(TrafficHat, self).__init__(
|
||||
@@ -299,7 +406,26 @@ RobotTuple = namedtuple('RobotTuple', ('left', 'right'))
|
||||
|
||||
class Robot(SourceMixin, CompositeDevice):
|
||||
"""
|
||||
Generic dual-motor Robot.
|
||||
Extends :class:`CompositeDevice` to represent a generic dual-motor robot.
|
||||
|
||||
This class is constructed with two tuples representing the forward and
|
||||
backward pins of the left and right controllers respectively. For example,
|
||||
if the left motor's controller is connected to GPIOs 4 and 14, while the
|
||||
right motor's controller is connected to GPIOs 17 and 18 then the following
|
||||
example will turn the robot left::
|
||||
|
||||
from gpiozero import Robot
|
||||
|
||||
robot = Robot(left=(4, 14), right=(17, 18))
|
||||
robot.left()
|
||||
|
||||
:param tuple left:
|
||||
A tuple of two GPIO pins representing the forward and backward inputs
|
||||
of the left motor's controller.
|
||||
|
||||
:param tuple right:
|
||||
A tuple of two GPIO pins representing the forward and backward inputs
|
||||
of the right motor's controller.
|
||||
"""
|
||||
def __init__(self, left=None, right=None):
|
||||
if not all([left, right]):
|
||||
@@ -349,8 +475,9 @@ class Robot(SourceMixin, CompositeDevice):
|
||||
"""
|
||||
Drive the robot forward by running both motors forward.
|
||||
|
||||
speed: `1`
|
||||
Speed at which to drive the motors, 0 to 1.
|
||||
:param float speed:
|
||||
Speed at which to drive the motors, as a value between 0 (stopped)
|
||||
and 1 (full speed). The default is 1.
|
||||
"""
|
||||
self._left.forward(speed)
|
||||
self._right.forward(speed)
|
||||
@@ -359,8 +486,9 @@ class Robot(SourceMixin, CompositeDevice):
|
||||
"""
|
||||
Drive the robot backward by running both motors backward.
|
||||
|
||||
speed: `1`
|
||||
Speed at which to drive the motors, 0 to 1.
|
||||
:param float speed:
|
||||
Speed at which to drive the motors, as a value between 0 (stopped)
|
||||
and 1 (full speed). The default is 1.
|
||||
"""
|
||||
self._left.backward(speed)
|
||||
self._right.backward(speed)
|
||||
@@ -370,8 +498,9 @@ class Robot(SourceMixin, CompositeDevice):
|
||||
Make the robot turn left by running the right motor forward and left
|
||||
motor backward.
|
||||
|
||||
speed: `1`
|
||||
Speed at which to drive the motors, 0 to 1.
|
||||
:param float speed:
|
||||
Speed at which to drive the motors, as a value between 0 (stopped)
|
||||
and 1 (full speed). The default is 1.
|
||||
"""
|
||||
self._right.forward(speed)
|
||||
self._left.backward(speed)
|
||||
@@ -381,8 +510,9 @@ class Robot(SourceMixin, CompositeDevice):
|
||||
Make the robot turn right by running the left motor forward and right
|
||||
motor backward.
|
||||
|
||||
speed: `1`
|
||||
Speed at which to drive the motors, 0 to 1.
|
||||
:param float speed:
|
||||
Speed at which to drive the motors, as a value between 0 (stopped)
|
||||
and 1 (full speed). The default is 1.
|
||||
"""
|
||||
self._left.forward(speed)
|
||||
self._right.backward(speed)
|
||||
@@ -407,7 +537,16 @@ class Robot(SourceMixin, CompositeDevice):
|
||||
|
||||
class RyanteckRobot(Robot):
|
||||
"""
|
||||
RTK MCB Robot. Generic robot controller with pre-configured pin numbers.
|
||||
Extends :class:`Robot` for the Ryanteck MCB robot.
|
||||
|
||||
The Ryanteck MCB pins are fixed and therefore there's no need to specify
|
||||
them when constructing this class. The following example turns the robot
|
||||
left::
|
||||
|
||||
from gpiozero import RyanteckRobot
|
||||
|
||||
robot = RyanteckRobot()
|
||||
robot.left()
|
||||
"""
|
||||
def __init__(self):
|
||||
super(RyanteckRobot, self).__init__(left=(17, 18), right=(22, 23))
|
||||
|
||||
@@ -100,9 +100,9 @@ class GPIOBase(GPIOMeta(nstr('GPIOBase'), (), {})):
|
||||
@property
|
||||
def closed(self):
|
||||
"""
|
||||
Returns `True` if the device is closed (see the `close` method). Once a
|
||||
device is closed you can no longer use any other methods or properties
|
||||
to control or query the device.
|
||||
Returns ``True`` if the device is closed (see the :meth:`close`
|
||||
method). Once a device is closed you can no longer use any other
|
||||
methods or properties to control or query the device.
|
||||
"""
|
||||
return False
|
||||
|
||||
@@ -182,12 +182,12 @@ class GPIODevice(ValuesMixin, GPIOBase):
|
||||
|
||||
This is the class at the root of the gpiozero class hierarchy. It handles
|
||||
ensuring that two GPIO devices do not share the same pin, and provides
|
||||
basic services applicable to all devices (specifically the `pin` property,
|
||||
`is_active` property, and the `close` method).
|
||||
basic services applicable to all devices (specifically the :attr:`pin`
|
||||
property, :attr:`is_active` property, and the :attr:`close` method).
|
||||
|
||||
pin: `None`
|
||||
:param int pin:
|
||||
The GPIO pin (in BCM numbering) that the device is connected to. If
|
||||
this is `None` a `GPIODeviceError` will be raised.
|
||||
this is ``None`` a :exc:`GPIODeviceError` will be raised.
|
||||
"""
|
||||
def __init__(self, pin=None):
|
||||
super(GPIODevice, self).__init__()
|
||||
@@ -248,8 +248,8 @@ class GPIODevice(ValuesMixin, GPIOBase):
|
||||
>>> led = LED(16)
|
||||
>>> led.blink()
|
||||
|
||||
GPIODevice descendents can also be used as context managers using the
|
||||
`with` statement. For example:
|
||||
:class:`GPIODevice` descendents can also be used as context managers
|
||||
using the :keyword:`with` statement. For example:
|
||||
|
||||
>>> from gpiozero import *
|
||||
>>> with Buzzer(16) as bz:
|
||||
@@ -276,14 +276,16 @@ class GPIODevice(ValuesMixin, GPIOBase):
|
||||
def pin(self):
|
||||
"""
|
||||
The pin (in BCM numbering) that the device is connected to. This will
|
||||
be `None` if the device has been closed (see the `close` method).
|
||||
be ``None`` if the device has been closed (see the :meth:`close`
|
||||
method).
|
||||
"""
|
||||
return self._pin
|
||||
|
||||
@property
|
||||
def value(self):
|
||||
"""
|
||||
Returns `True` if the device is currently active and `False` otherwise.
|
||||
Returns ``True`` if the device is currently active and ``False``
|
||||
otherwise.
|
||||
"""
|
||||
return self._read()
|
||||
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
# vim: set fileencoding=utf-8:
|
||||
|
||||
from __future__ import (
|
||||
unicode_literals,
|
||||
print_function,
|
||||
@@ -22,19 +24,19 @@ class InputDevice(GPIODevice):
|
||||
"""
|
||||
Represents a generic GPIO input device.
|
||||
|
||||
This class extends `GPIODevice` to add facilities common to GPIO input
|
||||
devices. The constructor adds the optional `pull_up` parameter to specify
|
||||
how the pin should be pulled by the internal resistors. The `is_active`
|
||||
property is adjusted accordingly so that `True` still means active
|
||||
regardless of the `pull_up` setting.
|
||||
This class extends :class:`GPIODevice` to add facilities common to GPIO
|
||||
input devices. The constructor adds the optional *pull_up* parameter to
|
||||
specify how the pin should be pulled by the internal resistors. The
|
||||
:attr:`~GPIODevice.is_active` property is adjusted accordingly so that
|
||||
``True`` still means active regardless of the :attr:`pull_up` setting.
|
||||
|
||||
pin: `None`
|
||||
The GPIO pin (in BCM numbering) that the device is connected to. If
|
||||
this is `None` a GPIODeviceError will be raised.
|
||||
:param int pin:
|
||||
The GPIO pin (in Broadcom numbering) that the device is connected to.
|
||||
If this is ``None`` a :exc:`GPIODeviceError` will be raised.
|
||||
|
||||
pull_up: `False`
|
||||
If `True`, the pin will be pulled high with an internal resistor. If
|
||||
`False` (the default), the pin will be pulled low.
|
||||
:param bool pull_up:
|
||||
If ``True``, the pin will be pulled high with an internal resistor. If
|
||||
``False`` (the default), the pin will be pulled low.
|
||||
"""
|
||||
def __init__(self, pin=None, pull_up=False):
|
||||
if pin in (2, 3) and not pull_up:
|
||||
@@ -74,8 +76,8 @@ class InputDevice(GPIODevice):
|
||||
@property
|
||||
def pull_up(self):
|
||||
"""
|
||||
If `True`, the device uses a pull-up resistor to set the GPIO pin
|
||||
"high" by default. Defaults to `False`.
|
||||
If ``True``, the device uses a pull-up resistor to set the GPIO pin
|
||||
"high" by default. Defaults to ``False``.
|
||||
"""
|
||||
return self._pull_up
|
||||
|
||||
@@ -91,11 +93,11 @@ class WaitableInputDevice(InputDevice):
|
||||
"""
|
||||
Represents a generic input device with distinct waitable states.
|
||||
|
||||
This class extends `InputDevice` with methods for waiting on the device's
|
||||
status (`wait_for_active` and `wait_for_inactive`), and properties that
|
||||
hold functions to be called when the device changes state (`when_activated`
|
||||
and `when_deactivated`). These are aliased appropriately in various
|
||||
subclasses.
|
||||
This class extends :class:`InputDevice` with methods for waiting on the
|
||||
device's status (:meth:`wait_for_active` and :meth:`wait_for_inactive`),
|
||||
and properties that hold functions to be called when the device changes
|
||||
state (:meth:`when_activated` and :meth:`when_deactivated`). These are
|
||||
aliased appropriately in various subclasses.
|
||||
|
||||
Note that this class provides no means of actually firing its events; it's
|
||||
effectively an abstract base class.
|
||||
@@ -113,9 +115,9 @@ class WaitableInputDevice(InputDevice):
|
||||
Pause the script until the device is activated, or the timeout is
|
||||
reached.
|
||||
|
||||
timeout: `None`
|
||||
Number of seconds to wait before proceeding. If this is `None` (the
|
||||
default), then wait indefinitely until the device is active.
|
||||
:param float timeout:
|
||||
Number of seconds to wait before proceeding. If this is ``None``
|
||||
(the default), then wait indefinitely until the device is active.
|
||||
"""
|
||||
return self._active_event.wait(timeout)
|
||||
|
||||
@@ -124,9 +126,9 @@ class WaitableInputDevice(InputDevice):
|
||||
Pause the script until the device is deactivated, or the timeout is
|
||||
reached.
|
||||
|
||||
timeout: `None`
|
||||
Number of seconds to wait before proceeding. If this is `None` (the
|
||||
default), then wait indefinitely until the device is inactive.
|
||||
:param float timeout:
|
||||
Number of seconds to wait before proceeding. If this is ``None``
|
||||
(the default), then wait indefinitely until the device is inactive.
|
||||
"""
|
||||
return self._inactive_event.wait(timeout)
|
||||
|
||||
@@ -142,9 +144,7 @@ class WaitableInputDevice(InputDevice):
|
||||
single mandatory parameter, the device that activated will be passed
|
||||
as that parameter.
|
||||
|
||||
Set this property to `None` (the default) to disable the event.
|
||||
|
||||
See also: when_deactivated.
|
||||
Set this property to ``None`` (the default) to disable the event.
|
||||
"""
|
||||
return self._when_activated
|
||||
|
||||
@@ -164,9 +164,7 @@ class WaitableInputDevice(InputDevice):
|
||||
single mandatory parameter, the device that deactivated will be
|
||||
passed as that parameter.
|
||||
|
||||
Set this property to `None` (the default) to disable the event.
|
||||
|
||||
See also: when_activated.
|
||||
Set this property to ``None`` (the default) to disable the event.
|
||||
"""
|
||||
return self._when_deactivated
|
||||
|
||||
@@ -234,15 +232,15 @@ class DigitalInputDevice(WaitableInputDevice):
|
||||
"""
|
||||
Represents a generic input device with typical on/off behaviour.
|
||||
|
||||
This class extends `WaitableInputDevice` with machinery to fire the active
|
||||
and inactive events for devices that operate in a typical digital manner:
|
||||
straight forward on / off states with (reasonably) clean transitions
|
||||
between the two.
|
||||
This class extends :class:`WaitableInputDevice` with machinery to fire the
|
||||
active and inactive events for devices that operate in a typical digital
|
||||
manner: straight forward on / off states with (reasonably) clean
|
||||
transitions between the two.
|
||||
|
||||
bounce_time: `None`
|
||||
:param float bouncetime:
|
||||
Specifies the length of time (in seconds) that the component will
|
||||
ignore changes in state after an initial change. This defaults to
|
||||
`None` which indicates that no bounce compensation will be performed.
|
||||
``None`` which indicates that no bounce compensation will be performed.
|
||||
"""
|
||||
def __init__(self, pin=None, pull_up=False, bounce_time=None):
|
||||
super(DigitalInputDevice, self).__init__(pin, pull_up)
|
||||
@@ -267,32 +265,33 @@ class SmoothedInputDevice(WaitableInputDevice):
|
||||
Represents a generic input device which takes its value from the mean of a
|
||||
queue of historical values.
|
||||
|
||||
This class extends `WaitableInputDevice` with a queue which is filled by a
|
||||
background thread which continually polls the state of the underlying
|
||||
device. The mean of the values in the queue is compared to a threshold
|
||||
which is used to determine the state of the `is_active` property.
|
||||
This class extends :class:`WaitableInputDevice` with a queue which is
|
||||
filled by a background thread which continually polls the state of the
|
||||
underlying device. The mean of the values in the queue is compared to a
|
||||
threshold which is used to determine the state of the :attr:`is_active`
|
||||
property.
|
||||
|
||||
This class is intended for use with devices which either exhibit analog
|
||||
behaviour (such as the charging time of a capacitor with an LDR), or those
|
||||
which exhibit "twitchy" behaviour (such as certain motion sensors).
|
||||
|
||||
threshold: `0.5`
|
||||
:param float threshold:
|
||||
The value above which the device will be considered "on".
|
||||
|
||||
queue_len: `5`
|
||||
:param int queue_len:
|
||||
The length of the internal queue which is filled by the background
|
||||
thread.
|
||||
|
||||
sample_wait: `0.0`
|
||||
:param float sample_wait:
|
||||
The length of time to wait between retrieving the state of the
|
||||
underlying device. Defaults to 0.0 indicating that values are retrieved
|
||||
as fast as possible.
|
||||
|
||||
partial: `False`
|
||||
If `False` (the default), attempts to read the state of the device
|
||||
(from the `is_active` property) will block until the queue has filled.
|
||||
If `True`, a value will be returned immediately, but be aware that this
|
||||
value is likely to fluctuate excessively.
|
||||
:param bool partial:
|
||||
If ``False`` (the default), attempts to read the state of the device
|
||||
(from the :attr:`is_active` property) will block until the queue has
|
||||
filled. If ``True``, a value will be returned immediately, but be
|
||||
aware that this value is likely to fluctuate excessively.
|
||||
"""
|
||||
def __init__(
|
||||
self, pin=None, pull_up=False, threshold=0.5,
|
||||
@@ -338,7 +337,7 @@ class SmoothedInputDevice(WaitableInputDevice):
|
||||
def queue_len(self):
|
||||
"""
|
||||
The length of the internal queue of values which is averaged to
|
||||
determine the overall state of the device. This defaults to `5`.
|
||||
determine the overall state of the device. This defaults to 5.
|
||||
"""
|
||||
self._check_open()
|
||||
return self._queue.queue.maxlen
|
||||
@@ -346,8 +345,8 @@ class SmoothedInputDevice(WaitableInputDevice):
|
||||
@property
|
||||
def partial(self):
|
||||
"""
|
||||
If `False` (the default), attempts to read the `value` or `is_active`
|
||||
properties will block until the queue has filled.
|
||||
If ``False`` (the default), attempts to read the :attr:`value` or
|
||||
:attr:`is_active` properties will block until the queue has filled.
|
||||
"""
|
||||
self._check_open()
|
||||
return self._queue.partial
|
||||
@@ -355,8 +354,9 @@ class SmoothedInputDevice(WaitableInputDevice):
|
||||
@property
|
||||
def value(self):
|
||||
"""
|
||||
Returns the mean of the values in the internal queue. This is
|
||||
compared to `threshold` to determine whether `is_active` is `True`.
|
||||
Returns the mean of the values in the internal queue. This is compared
|
||||
to :attr:`threshold` to determine whether :attr:`is_active` is
|
||||
``True``.
|
||||
"""
|
||||
self._check_open()
|
||||
return self._queue.value
|
||||
@@ -364,7 +364,8 @@ class SmoothedInputDevice(WaitableInputDevice):
|
||||
@property
|
||||
def threshold(self):
|
||||
"""
|
||||
If `value` exceeds this amount, then `is_active` will return `True`.
|
||||
If :attr:`value` exceeds this amount, then :attr:`is_active` will
|
||||
return ``True``.
|
||||
"""
|
||||
return self._threshold
|
||||
|
||||
@@ -379,18 +380,44 @@ class SmoothedInputDevice(WaitableInputDevice):
|
||||
@property
|
||||
def is_active(self):
|
||||
"""
|
||||
Returns `True` if the device is currently active and `False` otherwise.
|
||||
Returns ``True`` if the device is currently active and ``False``
|
||||
otherwise.
|
||||
"""
|
||||
return self.value > self.threshold
|
||||
|
||||
|
||||
class Button(DigitalInputDevice):
|
||||
"""
|
||||
A physical push button or switch.
|
||||
Extends :class:`DigitalInputDevice` and represents a simple push button
|
||||
or switch.
|
||||
|
||||
A typical configuration of such a device is to connect a GPIO pin to one
|
||||
side of the switch, and ground to the other (the default `pull_up` value
|
||||
is `True`).
|
||||
Connect one side of the button to a ground pin, and the other to any GPIO
|
||||
pin. Alternatively, connect one side of the button to the 3V3 pin, and the
|
||||
other to any GPIO pin, then set *pull_up* to ``False`` in the
|
||||
:class:`Button` constructor.
|
||||
|
||||
The following example will print a line of text when the button is pushed::
|
||||
|
||||
from gpiozero import Button
|
||||
|
||||
button = Button(4)
|
||||
button.wait_for_press()
|
||||
print("The button was pressed!")
|
||||
|
||||
:param int pin:
|
||||
The GPIO pin which the button is attached to. See :doc:`notes` for
|
||||
valid pin numbers.
|
||||
|
||||
:param bool pull_up:
|
||||
If ``True`` (the default), the GPIO pin will be pulled high by default.
|
||||
In this case, connect the other side of the button to ground. If
|
||||
``False``, the GPIO pin will be pulled low by default. In this case,
|
||||
connect the other side of the button to 3V3.
|
||||
|
||||
:param float bounce_time:
|
||||
If ``None`` (the default), no software bounce compensation will be
|
||||
performed. Otherwise, this is the length in time (in seconds) that the
|
||||
component will ignore changes in state after an initial change.
|
||||
"""
|
||||
def __init__(self, pin=None, pull_up=True, bounce_time=None):
|
||||
super(Button, self).__init__(pin, pull_up, bounce_time)
|
||||
@@ -418,17 +445,48 @@ LineSensor.wait_for_no_line = LineSensor.wait_for_inactive
|
||||
|
||||
class MotionSensor(SmoothedInputDevice):
|
||||
"""
|
||||
A PIR (Passive Infra-Red) motion sensor.
|
||||
Extends :class:`SmoothedInputDevice` and represents a passive infra-red
|
||||
(PIR) motion sensor like the sort found in the `CamJam #2 EduKit`_.
|
||||
|
||||
.. _CamJam #2 EduKit: http://camjam.me/?page_id=623
|
||||
|
||||
A typical PIR device has a small circuit board with three pins: VCC, OUT,
|
||||
and GND. VCC should be connected to the Pi's +5V pin, GND to one of the
|
||||
Pi's ground pins, and finally OUT to the GPIO specified as the value of the
|
||||
`pin` parameter in the constructor.
|
||||
and GND. VCC should be connected to a 5V pin, GND to one of the ground
|
||||
pins, and finally OUT to the GPIO specified as the value of the *pin*
|
||||
parameter in the constructor.
|
||||
|
||||
This class defaults `queue_len` to 1, effectively removing the averaging
|
||||
of the internal queue. If your PIR sensor has a short fall time and is
|
||||
particularly "jittery" you may wish to set this to a higher value (e.g. 5)
|
||||
to mitigate this.
|
||||
The following code will print a line of text when motion is detected::
|
||||
|
||||
from gpiozero import MotionSensor
|
||||
|
||||
pir = MotionSensor(4)
|
||||
pir.wait_for_motion()
|
||||
print("Motion detected!")
|
||||
|
||||
:param int pin:
|
||||
The GPIO pin which the button is attached to. See :doc:`notes` for
|
||||
valid pin numbers.
|
||||
|
||||
:param int queue_len:
|
||||
The length of the queue used to store values read from the sensor. This
|
||||
defaults to 1 which effectively disables the queue. If your motion
|
||||
sensor is particularly "twitchy" you may wish to increase this value.
|
||||
|
||||
:param float sample_rate:
|
||||
The number of values to read from the device (and append to the
|
||||
internal queue) per second. Defaults to 10.
|
||||
|
||||
:param float threshold:
|
||||
Defaults to 0.5. When the mean of all values in the internal queue
|
||||
rises above this value, the sensor will be considered "active" by the
|
||||
:attr:`~SmoothedInputDevice.is_active` property, and all appropriate
|
||||
events will be fired.
|
||||
|
||||
:param bool partial:
|
||||
When ``False`` (the default), the object will not return a value for
|
||||
:attr:`~SmoothedInputDevice.is_active` until the internal queue has
|
||||
filled with values. Only set this to ``True`` if you require values
|
||||
immediately after object construction.
|
||||
"""
|
||||
def __init__(
|
||||
self, pin=None, queue_len=1, sample_rate=10, threshold=0.5,
|
||||
@@ -452,12 +510,50 @@ MotionSensor.wait_for_no_motion = MotionSensor.wait_for_inactive
|
||||
|
||||
class LightSensor(SmoothedInputDevice):
|
||||
"""
|
||||
An LDR (Light Dependent Resistor) Light Sensor.
|
||||
Extends :class:`SmoothedInputDevice` and represents a light dependent
|
||||
resistor (LDR).
|
||||
|
||||
A typical LDR circuit connects one side of the LDR to the 3v3 line from the
|
||||
Pi, and the other side to a GPIO pin, and a capacitor tied to ground. This
|
||||
class repeatedly discharges the capacitor, then times the duration it takes
|
||||
to charge (which will vary according to the light falling on the LDR).
|
||||
Connect one leg of the LDR to the 3V3 pin; connect one leg of a 1µf
|
||||
capacitor to a ground pin; connect the other leg of the LDR and the other
|
||||
leg of the capacitor to the same GPIO pin. This class repeatedly discharges
|
||||
the capacitor, then times the duration it takes to charge (which will vary
|
||||
according to the light falling on the LDR).
|
||||
|
||||
The following code will print a line of text when light is detected::
|
||||
|
||||
from gpiozero import LightSensor
|
||||
|
||||
ldr = LightSensor(18)
|
||||
ldr.wait_for_light()
|
||||
print("Light detected!")
|
||||
|
||||
:param int pin:
|
||||
The GPIO pin which the button is attached to. See :doc:`notes` for
|
||||
valid pin numbers.
|
||||
|
||||
:param int queue_len:
|
||||
The length of the queue used to store values read from the circuit.
|
||||
This defaults to 5.
|
||||
|
||||
:param float charge_time_limit:
|
||||
If the capacitor in the circuit takes longer than this length of time
|
||||
to charge, it is assumed to be dark. The default (0.01 seconds) is
|
||||
appropriate for a 0.01µf capacitor coupled with the LDR from the
|
||||
`CamJam #2 EduKit`_. You may need to adjust this value for different
|
||||
valued capacitors or LDRs.
|
||||
|
||||
:param float threshold:
|
||||
Defaults to 0.1. When the mean of all values in the internal queue
|
||||
rises above this value, the area will be considered "light", and all
|
||||
appropriate events will be fired.
|
||||
|
||||
:param bool partial:
|
||||
When ``False`` (the default), the object will not return a value for
|
||||
:attr:`~SmoothedInputDevice.is_active` until the internal queue has
|
||||
filled with values. Only set this to ``True`` if you require values
|
||||
immediately after object construction.
|
||||
|
||||
.. _CamJam #2 EduKit: http://camjam.me/?page_id=623
|
||||
"""
|
||||
def __init__(
|
||||
self, pin=None, queue_len=5, charge_time_limit=0.01,
|
||||
@@ -506,6 +602,31 @@ LightSensor.wait_for_dark = LightSensor.wait_for_inactive
|
||||
class AnalogInputDevice(CompositeDevice):
|
||||
"""
|
||||
Represents an analog input device connected to SPI (serial interface).
|
||||
|
||||
Typical analog input devices are `analog to digital converters`_ (ADCs).
|
||||
Several classes are provided for specific ADC chips, including
|
||||
:class:`MCP3004`, :class:`MCP3008`, :class:`MCP3204`, and :class:`MCP3208`.
|
||||
|
||||
The following code demonstrates reading the first channel of an MCP3008
|
||||
chip attached to the Pi's SPI pins::
|
||||
|
||||
from gpiozero import MCP3008
|
||||
|
||||
pot = MCP3008(0)
|
||||
print(pot.value)
|
||||
|
||||
The :attr:`value` attribute is normalized such that its value is always
|
||||
between 0.0 and 1.0 (or in special cases, such as differential sampling,
|
||||
-1 to +1). Hence, you can use an analog input to control the brightness of
|
||||
a :class:`PWMLED` like so::
|
||||
|
||||
from gpiozero import MCP3008, PWMLED
|
||||
|
||||
pot = MCP3008(0)
|
||||
led = PWMLED(17)
|
||||
led.source = pot.values
|
||||
|
||||
.. _analog to digital converters: https://en.wikipedia.org/wiki/Analog-to-digital_converter
|
||||
"""
|
||||
|
||||
def __init__(self, device=0, bits=None):
|
||||
@@ -572,6 +693,11 @@ class AnalogInputDevice(CompositeDevice):
|
||||
|
||||
|
||||
class MCP3xxx(AnalogInputDevice):
|
||||
"""
|
||||
Extends :class:`AnalogInputDevice` to implement an interface for all ADC
|
||||
chips with a protocol similar to the Microchip MCP3xxx series of devices.
|
||||
"""
|
||||
|
||||
def __init__(self, channel=0, device=0, bits=10, differential=False):
|
||||
self._channel = channel
|
||||
self._bits = bits
|
||||
@@ -583,20 +709,22 @@ class MCP3xxx(AnalogInputDevice):
|
||||
"""
|
||||
The channel to read data from. The MCP3008/3208/3304 have 8 channels
|
||||
(0-7), while the MCP3004/3204/3302 have 4 channels (0-3), and the
|
||||
MCP3301 only has 2 channels.
|
||||
MCP3301 only has 1 channel.
|
||||
"""
|
||||
return self._channel
|
||||
|
||||
@property
|
||||
def differential(self):
|
||||
"""
|
||||
If True, the device is operated in pseudo-differential mode. In this
|
||||
mode one channel (specified by the channel attribute) is read relative
|
||||
to the value of a second channel (implied by the chip's design).
|
||||
If ``True``, the device is operated in pseudo-differential mode. In
|
||||
this mode one channel (specified by the channel attribute) is read
|
||||
relative to the value of a second channel (implied by the chip's
|
||||
design).
|
||||
|
||||
Please refer to the device data-sheet to determine which channel is
|
||||
used as the relative base value (for example, when using an MCP3008
|
||||
in differential mode, channel 0 is read relative to channel 1).
|
||||
used as the relative base value (for example, when using an
|
||||
:class:`MCP3008` in differential mode, channel 0 is read relative to
|
||||
channel 1).
|
||||
"""
|
||||
return self._differential
|
||||
|
||||
@@ -625,6 +753,12 @@ class MCP3xxx(AnalogInputDevice):
|
||||
|
||||
|
||||
class MCP33xx(MCP3xxx):
|
||||
"""
|
||||
Extends :class:`MCP3xxx` with functionality specific to the MCP33xx family
|
||||
of ADCs; specifically this handles the full differential capability of
|
||||
these chips supporting the full 13-bit signed range of output values.
|
||||
"""
|
||||
|
||||
def __init__(self, channel=0, device=0, differential=False):
|
||||
super(MCP33xx, self).__init__(channel, device, 12, differential)
|
||||
|
||||
@@ -669,7 +803,10 @@ class MCP33xx(MCP3xxx):
|
||||
|
||||
class MCP3004(MCP3xxx):
|
||||
"""
|
||||
The MCP3004 is a 10-bit analog to digital converter with 4 channels (0-3).
|
||||
The `MCP3004`_ is a 10-bit analog to digital converter with 4 channels
|
||||
(0-3).
|
||||
|
||||
.. _MCP3004: http://www.farnell.com/datasheets/808965.pdf
|
||||
"""
|
||||
def __init__(self, channel=0, device=0, differential=False):
|
||||
if not 0 <= channel < 4:
|
||||
@@ -679,7 +816,10 @@ class MCP3004(MCP3xxx):
|
||||
|
||||
class MCP3008(MCP3xxx):
|
||||
"""
|
||||
The MCP3008 is a 10-bit analog to digital converter with 8 channels (0-7).
|
||||
The `MCP3008`_ is a 10-bit analog to digital converter with 8 channels
|
||||
(0-7).
|
||||
|
||||
.. _MCP3008: http://www.farnell.com/datasheets/808965.pdf
|
||||
"""
|
||||
def __init__(self, channel=0, device=0, differential=False):
|
||||
if not 0 <= channel < 8:
|
||||
@@ -689,7 +829,10 @@ class MCP3008(MCP3xxx):
|
||||
|
||||
class MCP3204(MCP3xxx):
|
||||
"""
|
||||
The MCP3204 is a 12-bit analog to digital converter with 4 channels (0-3).
|
||||
The `MCP3204`_ is a 12-bit analog to digital converter with 4 channels
|
||||
(0-3).
|
||||
|
||||
.. _MCP3204: http://www.farnell.com/datasheets/808967.pdf
|
||||
"""
|
||||
def __init__(self, channel=0, device=0, differential=False):
|
||||
if not 0 <= channel < 4:
|
||||
@@ -699,7 +842,10 @@ class MCP3204(MCP3xxx):
|
||||
|
||||
class MCP3208(MCP3xxx):
|
||||
"""
|
||||
The MCP3208 is a 12-bit analog to digital converter with 8 channels (0-7).
|
||||
The `MCP3208`_ is a 12-bit analog to digital converter with 8 channels
|
||||
(0-7).
|
||||
|
||||
.. _MCP3208: http://www.farnell.com/datasheets/808967.pdf
|
||||
"""
|
||||
def __init__(self, channel=0, device=0, differential=False):
|
||||
if not 0 <= channel < 8:
|
||||
@@ -709,9 +855,11 @@ class MCP3208(MCP3xxx):
|
||||
|
||||
class MCP3301(MCP33xx):
|
||||
"""
|
||||
The MCP3301 is a signed 13-bit analog to digital converter. Please note
|
||||
The `MCP3301`_ is a signed 13-bit analog to digital converter. Please note
|
||||
that the MCP3301 always operates in differential mode between its two
|
||||
channels and the output value is scaled from -1 to +1.
|
||||
|
||||
.. _MCP3301: http://www.farnell.com/datasheets/1669397.pdf
|
||||
"""
|
||||
def __init__(self, device=0):
|
||||
super(MCP3301, self).__init__(0, device, differential=True)
|
||||
@@ -722,11 +870,13 @@ class MCP3301(MCP33xx):
|
||||
|
||||
class MCP3302(MCP33xx):
|
||||
"""
|
||||
The MCP3302 is a 12/13-bit analog to digital converter with 4 channels
|
||||
The `MCP3302`_ is a 12/13-bit analog to digital converter with 4 channels
|
||||
(0-3). When operated in differential mode, the device outputs a signed
|
||||
13-bit value which is scaled from -1 to +1. When operated in single-ended
|
||||
mode (the default), the device outputs an unsigned 12-bit value scaled from
|
||||
0 to 1.
|
||||
|
||||
.. _MCP3302: http://www.farnell.com/datasheets/1486116.pdf
|
||||
"""
|
||||
def __init__(self, channel=0, device=0, differential=False):
|
||||
if not 0 <= channel < 4:
|
||||
@@ -736,11 +886,13 @@ class MCP3302(MCP33xx):
|
||||
|
||||
class MCP3304(MCP33xx):
|
||||
"""
|
||||
The MCP3304 is a 12/13-bit analog to digital converter with 8 channels
|
||||
The `MCP3304`_ is a 12/13-bit analog to digital converter with 8 channels
|
||||
(0-7). When operated in differential mode, the device outputs a signed
|
||||
13-bit value which is scaled from -1 to +1. When operated in single-ended
|
||||
mode (the default), the device outputs an unsigned 12-bit value scaled from
|
||||
0 to 1.
|
||||
|
||||
.. _MCP3304: http://www.farnell.com/datasheets/1486116.pdf
|
||||
"""
|
||||
def __init__(self, channel=0, device=0, differential=False):
|
||||
if not 0 <= channel < 8:
|
||||
|
||||
@@ -20,14 +20,18 @@ class OutputDevice(SourceMixin, GPIODevice):
|
||||
"""
|
||||
Represents a generic GPIO output device.
|
||||
|
||||
This class extends `GPIODevice` to add facilities common to GPIO output
|
||||
devices: an `on` method to switch the device on, and a corresponding `off`
|
||||
method.
|
||||
This class extends :class:`GPIODevice` to add facilities common to GPIO
|
||||
output devices: an :meth:`on` method to switch the device on, and a
|
||||
corresponding :meth:`off` method.
|
||||
|
||||
active_high: `True`
|
||||
If `True` (the default), the `on` method will set the GPIO to HIGH. If
|
||||
`False`, the `on` method will set the GPIO to LOW (the `off` method
|
||||
always does the opposite).
|
||||
:param int pin:
|
||||
The GPIO pin (in BCM numbering) that the device is connected to. If
|
||||
this is ``None`` a :exc:`GPIODeviceError` will be raised.
|
||||
|
||||
:param bool active_high:
|
||||
If ``True`` (the default), the :meth:`on` method will set the GPIO to
|
||||
HIGH. If ``False``, the :meth:`on` method will set the GPIO to LOW (the
|
||||
:meth:`off` method always does the opposite).
|
||||
"""
|
||||
def __init__(self, pin=None, active_high=True):
|
||||
self._active_high = active_high
|
||||
@@ -94,10 +98,10 @@ class DigitalOutputDevice(OutputDevice):
|
||||
"""
|
||||
Represents a generic output device with typical on/off behaviour.
|
||||
|
||||
This class extends `OutputDevice` with a `toggle` method to switch the
|
||||
device between its on and off states, and a `blink` method which uses an
|
||||
optional background thread to handle toggling the device state without
|
||||
further interaction.
|
||||
This class extends :class:`OutputDevice` with a :meth:`toggle` method to
|
||||
switch the device between its on and off states, and a :meth:`blink` method
|
||||
which uses an optional background thread to handle toggling the device
|
||||
state without further interaction.
|
||||
"""
|
||||
def __init__(self, pin=None, active_high=True):
|
||||
self._blink_thread = None
|
||||
@@ -109,16 +113,10 @@ class DigitalOutputDevice(OutputDevice):
|
||||
super(DigitalOutputDevice, self).close()
|
||||
|
||||
def on(self):
|
||||
"""
|
||||
Turns the device on.
|
||||
"""
|
||||
self._stop_blink()
|
||||
self._write(self._active_state)
|
||||
|
||||
def off(self):
|
||||
"""
|
||||
Turns the device off.
|
||||
"""
|
||||
self._stop_blink()
|
||||
self._write(self._inactive_state)
|
||||
|
||||
@@ -137,19 +135,19 @@ class DigitalOutputDevice(OutputDevice):
|
||||
"""
|
||||
Make the device turn on and off repeatedly.
|
||||
|
||||
on_time: `1`
|
||||
:param float on_time:
|
||||
Number of seconds on
|
||||
|
||||
off_time: `1`
|
||||
:param float off_time:
|
||||
Number of seconds off
|
||||
|
||||
n: `None`
|
||||
Number of times to blink; `None` means forever
|
||||
:param int n:
|
||||
Number of times to blink; ``None`` means forever
|
||||
|
||||
background: `True`
|
||||
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
|
||||
:param bool 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).
|
||||
"""
|
||||
self._stop_blink()
|
||||
@@ -179,11 +177,28 @@ class DigitalOutputDevice(OutputDevice):
|
||||
|
||||
class LED(DigitalOutputDevice):
|
||||
"""
|
||||
An LED (Light Emmitting Diode) component.
|
||||
Extends :class:`DigitalOutputDevice` and represents a light emitting diode
|
||||
(LED).
|
||||
|
||||
A typical configuration of such a device is to connect a GPIO pin to the
|
||||
anode (long leg) of the LED, and the cathode (short leg) to ground, with
|
||||
an optional resistor to prevent the LED from burning out.
|
||||
Connect the cathode (short leg, flat side) of the LED to a ground pin;
|
||||
connect the anode (longer leg) to a limiting resistor; connect the other
|
||||
side of the limiting resistor to a GPIO pin (the limiting resistor can be
|
||||
placed either side of the LED).
|
||||
|
||||
The following example will light the LED::
|
||||
|
||||
from gpiozero import LED
|
||||
|
||||
led = LED(17)
|
||||
led.on()
|
||||
|
||||
:param int pin:
|
||||
The GPIO pin which the button is attached to. See :doc:`notes` for
|
||||
valid pin numbers.
|
||||
|
||||
:param bool active_high:
|
||||
If ``True`` (the default), then the LED will be lit when the GPIO port
|
||||
is high.
|
||||
"""
|
||||
pass
|
||||
|
||||
@@ -192,10 +207,26 @@ LED.is_lit = LED.is_active
|
||||
|
||||
class Buzzer(DigitalOutputDevice):
|
||||
"""
|
||||
A digital Buzzer component.
|
||||
Extends :class:`DigitalOutputDevice` and represents a digital buzzer
|
||||
component.
|
||||
|
||||
A typical configuration of such a device is to connect a GPIO pin to the
|
||||
anode (long leg) of the buzzer, and the cathode (short leg) to ground.
|
||||
Connect the cathode (negative pin) of the buzzer to a ground pin; connect
|
||||
the other side to any GPIO pin.
|
||||
|
||||
The following example will sound the buzzer::
|
||||
|
||||
from gpiozero import Buzzer
|
||||
|
||||
bz = Buzzer(3)
|
||||
bz.on()
|
||||
|
||||
:param int pin:
|
||||
The GPIO pin which the buzzer is attached to. See :doc:`notes` for
|
||||
valid pin numbers.
|
||||
|
||||
:param bool active_high:
|
||||
If ``True`` (the default), then the buzzer will sound when the GPIO
|
||||
port is high.
|
||||
"""
|
||||
pass
|
||||
|
||||
@@ -204,7 +235,15 @@ Buzzer.beep = Buzzer.blink
|
||||
|
||||
class PWMOutputDevice(DigitalOutputDevice):
|
||||
"""
|
||||
Generic Output device configured for PWM (Pulse-Width Modulation).
|
||||
Generic output device configured for pulse-width modulation (PWM).
|
||||
|
||||
:param int pin:
|
||||
The GPIO pin which the device is attached to. See :doc:`notes` for
|
||||
valid pin numbers.
|
||||
|
||||
:param int frequency:
|
||||
The frequency (in Hz) of pulses emitted to drive the device. Defaults
|
||||
to 100Hz.
|
||||
"""
|
||||
def __init__(self, pin=None, frequency=100):
|
||||
self._pwm = None
|
||||
@@ -259,16 +298,17 @@ class PWMOutputDevice(DigitalOutputDevice):
|
||||
def toggle(self):
|
||||
"""
|
||||
Toggle the state of the device. If the device is currently off
|
||||
(`value` is 0.0), this changes it to "fully" on (`value` is 1.0). If
|
||||
the device has a duty cycle (`value`) of 0.1, this will toggle it to
|
||||
0.9, and so on.
|
||||
(:attr:`value` is 0.0), this changes it to "fully" on (:attr:`value` is
|
||||
1.0). If the device has a duty cycle (:attr:`value`) of 0.1, this will
|
||||
toggle it to 0.9, and so on.
|
||||
"""
|
||||
self.value = 1.0 - self.value
|
||||
|
||||
@property
|
||||
def is_active(self):
|
||||
"""
|
||||
Returns `True` if the device is currently active and `False` otherwise.
|
||||
Returns ``True`` if the device is currently active (:attr:`value` is
|
||||
non-zero) and ``False`` otherwise.
|
||||
"""
|
||||
return self.value > 0.0
|
||||
|
||||
@@ -276,7 +316,7 @@ class PWMOutputDevice(DigitalOutputDevice):
|
||||
def frequency(self):
|
||||
"""
|
||||
The frequency of the pulses used with the PWM device, in Hz. The
|
||||
default is 100.
|
||||
default is 100Hz.
|
||||
"""
|
||||
return self._frequency
|
||||
|
||||
@@ -288,11 +328,20 @@ class PWMOutputDevice(DigitalOutputDevice):
|
||||
|
||||
class PWMLED(PWMOutputDevice):
|
||||
"""
|
||||
An LED (Light Emmitting Diode) component with variable brightness.
|
||||
Extends :class:`PWMOutputDevice` and represents a light emitting diode
|
||||
(LED) with variable brightness.
|
||||
|
||||
A typical configuration of such a device is to connect a GPIO pin to the
|
||||
anode (long leg) of the LED, and the cathode (short leg) to ground, with
|
||||
an optional resistor to prevent the LED from burning out.
|
||||
|
||||
:param int pin:
|
||||
The GPIO pin which the device is attached to. See :doc:`notes` for
|
||||
valid pin numbers.
|
||||
|
||||
:param int frequency:
|
||||
The frequency (in Hz) of pulses emitted to drive the device. Defaults
|
||||
to 100Hz.
|
||||
"""
|
||||
pass
|
||||
|
||||
@@ -309,22 +358,35 @@ def _led_property(index, doc=None):
|
||||
|
||||
class RGBLED(SourceMixin, CompositeDevice):
|
||||
"""
|
||||
Single LED with individually controllable red, green and blue components.
|
||||
Extends :class:`CompositeDevice` and represents a full color LED component
|
||||
(composed of red, green, and blue LEDs).
|
||||
|
||||
red: `None`
|
||||
Connect the common cathode (longest leg) to a ground pin; connect each of
|
||||
the other legs (representing the red, green, and blue anodes) to any GPIO
|
||||
pins. You can either use three limiting resistors (one per anode) or a
|
||||
single limiting resistor on the cathode.
|
||||
|
||||
The following code will make the LED purple::
|
||||
|
||||
from gpiozero import RGBLED
|
||||
|
||||
led = RGBLED(2, 3, 4)
|
||||
led.color = (1, 0, 1)
|
||||
|
||||
:param int red:
|
||||
The GPIO pin that controls the red component of the RGB LED.
|
||||
|
||||
green: `None`
|
||||
:param int green:
|
||||
The GPIO pin that controls the green component of the RGB LED.
|
||||
|
||||
blue: `None`
|
||||
:param int blue:
|
||||
The GPIO pin that controls the blue component of the RGB LED.
|
||||
"""
|
||||
def __init__(self, red=None, green=None, blue=None):
|
||||
if not all([red, green, blue]):
|
||||
raise OutputDeviceError('red, green, and blue pins must be provided')
|
||||
super(RGBLED, self).__init__()
|
||||
self._leds = tuple(PWMOutputDevice(pin) for pin in (red, green, blue))
|
||||
self._leds = tuple(PWMLED(pin) for pin in (red, green, blue))
|
||||
|
||||
red = _led_property(0)
|
||||
green = _led_property(1)
|
||||
@@ -333,11 +395,11 @@ class RGBLED(SourceMixin, CompositeDevice):
|
||||
@property
|
||||
def value(self):
|
||||
"""
|
||||
Represents the color of the LED as an RGB 3-tuple of `(red, green,
|
||||
blue)` where each value is between 0 and 1.
|
||||
Represents the color of the LED as an RGB 3-tuple of ``(red, green,
|
||||
blue)`` where each value is between 0 and 1.
|
||||
|
||||
For example, purple would be `(1, 0, 1)` and yellow would be `(1, 1,
|
||||
0)`, while orange would be `(1, 0.5, 0)`.
|
||||
For example, purple would be ``(1, 0, 1)`` and yellow would be ``(1, 1,
|
||||
0)``, while orange would be ``(1, 0.5, 0)``.
|
||||
"""
|
||||
return (self.red, self.green, self.blue)
|
||||
|
||||
@@ -348,7 +410,8 @@ class RGBLED(SourceMixin, CompositeDevice):
|
||||
@property
|
||||
def is_active(self):
|
||||
"""
|
||||
Returns `True` if the LED is currently active and `False` otherwise.
|
||||
Returns ``True`` if the LED is currently active (not black) and
|
||||
``False`` otherwise.
|
||||
"""
|
||||
return self.value != (0, 0, 0)
|
||||
|
||||
@@ -357,14 +420,14 @@ class RGBLED(SourceMixin, CompositeDevice):
|
||||
def on(self):
|
||||
"""
|
||||
Turn the device on. This equivalent to setting the device color to
|
||||
white `(1, 1, 1)`.
|
||||
white ``(1, 1, 1)``.
|
||||
"""
|
||||
self.value = (1, 1, 1)
|
||||
|
||||
def off(self):
|
||||
"""
|
||||
Turn the device off. This is equivalent to setting the device color
|
||||
to black `(0, 0, 0)`.
|
||||
to black ``(0, 0, 0)``.
|
||||
"""
|
||||
self.value = (0, 0, 0)
|
||||
|
||||
@@ -375,7 +438,30 @@ class RGBLED(SourceMixin, CompositeDevice):
|
||||
|
||||
class Motor(SourceMixin, CompositeDevice):
|
||||
"""
|
||||
Generic bi-directional motor.
|
||||
Extends :class:`CompositeDevice` and represents a generic motor connected
|
||||
to a bi-directional motor driver circuit (i.e. an `H-bridge`_).
|
||||
|
||||
Attach an `H-bridge`_ motor controller to your Pi; connect a power source
|
||||
(e.g. a battery pack or the 5V pin) to the controller; connect the outputs
|
||||
of the controller board to the two terminals of the motor; connect the
|
||||
inputs of the controller board to two GPIO pins.
|
||||
|
||||
.. _H-bridge: https://en.wikipedia.org/wiki/H_bridge
|
||||
|
||||
The following code will make the motor turn "forwards"::
|
||||
|
||||
from gpiozero import Motor
|
||||
|
||||
motor = Motor(17, 18)
|
||||
motor.forward()
|
||||
|
||||
:param int forward:
|
||||
The GPIO pin that the forward input of the motor driver chip is
|
||||
connected to.
|
||||
|
||||
:param int backward:
|
||||
The GPIO pin that the backward input of the motor driver chip is
|
||||
connected to.
|
||||
"""
|
||||
def __init__(self, forward=None, backward=None):
|
||||
if not all([forward, backward]):
|
||||
@@ -432,20 +518,29 @@ class Motor(SourceMixin, CompositeDevice):
|
||||
@property
|
||||
def is_active(self):
|
||||
"""
|
||||
Returns `True` if the motor is currently active and `False` otherwise.
|
||||
Returns ``True`` if the motor is currently running and ``False``
|
||||
otherwise.
|
||||
"""
|
||||
return self.value != 0
|
||||
|
||||
def forward(self, speed=1):
|
||||
"""
|
||||
Drive the motor forwards
|
||||
Drive the motor forwards.
|
||||
|
||||
:param float speed:
|
||||
The speed at which the motor should turn. Can be any value between
|
||||
0 (stopped) and the default 1 (maximum speed).
|
||||
"""
|
||||
self._backward.off()
|
||||
self._forward.value = speed
|
||||
|
||||
def backward(self, speed=1):
|
||||
"""
|
||||
Drive the motor backwards
|
||||
Drive the motor backwards.
|
||||
|
||||
:param float speed:
|
||||
The speed at which the motor should turn. Can be any value between
|
||||
0 (stopped) and the default 1 (maximum speed).
|
||||
"""
|
||||
self._forward.off()
|
||||
self._backward.value = speed
|
||||
@@ -460,7 +555,7 @@ class Motor(SourceMixin, CompositeDevice):
|
||||
|
||||
def stop(self):
|
||||
"""
|
||||
Stop the motor
|
||||
Stop the motor.
|
||||
"""
|
||||
self._forward.off()
|
||||
self._backward.off()
|
||||
|
||||
15
mkdocs.yml
@@ -1,15 +0,0 @@
|
||||
site_name: GPIO Zero
|
||||
theme: readthedocs
|
||||
site_url: http://pythonhosted.org/gpiozero
|
||||
repo_url: https://github.com/RPi-Distro/python-gpiozero
|
||||
site_description: A simple interface to everyday GPIO components used with Raspberry Pi
|
||||
site_author: Ben Nuttall
|
||||
site_dir: pythonhosted
|
||||
google_analytics: ['UA-46270871-6', 'pythonhosted.org/gpiozero']
|
||||
pages:
|
||||
- 'Home': 'index.md'
|
||||
- 'Input Devices': 'inputs.md'
|
||||
- 'Output Devices': 'outputs.md'
|
||||
- 'Boards and Accessories': 'boards.md'
|
||||
- 'Notes': 'notes.md'
|
||||
- 'Recipes': 'recipes.md'
|
||||