Merge branch 'master' into pinout-man

This commit is contained in:
Ben Nuttall
2017-07-17 02:07:01 +01:00
16 changed files with 290 additions and 11 deletions

View File

@@ -0,0 +1,11 @@
from bluedot import BlueDot
from gpiozero import LED
bd = BlueDot()
led = LED(17)
while True:
bd.wait_for_press()
led.on()
bd.wait_for_release()
led.off()

View File

@@ -0,0 +1,22 @@
from bluedot import BlueDot
from gpiozero import Robot
from signal import pause
bd = BlueDot()
robot = Robot(left=(4, 14), right=(17, 18))
def move(pos):
if pos.top:
robot.forward(pos.distance)
elif pos.bottom:
robot.backward(pos.distance)
elif pos.left:
robot.left(pos.distance)
elif pos.right:
robot.right(pos.distance)
bd.when_pressed = move
bd.when_moved = move
bd.when_released = robot.stop
pause()

View File

@@ -0,0 +1,26 @@
from gpiozero import Robot
from bluedot import BlueDot
from signal import pause
def pos_to_values(x, y):
left = y if x > 0 else y + x
right = y if x < 0 else y - x
return (clamped(left), clamped(right))
def clamped(v):
return max(-1, min(1, v))
def drive():
while True:
if bd.is_pressed:
x, y = bd.position.x, bd.position.y
yield pos_to_values(x, y)
else:
yield (0, 0)
robot = Robot(left=(4, 14), right=(17, 18))
bd = BlueDot()
robot.source = drive()
pause()

View File

@@ -0,0 +1,9 @@
from gpiozero import LEDBarGraph, CPUTemperature
from signal import pause
cpu = CPUTemperature(min_temp=50, max_temp=90)
leds = LEDBarGraph(2, 3, 4, 5, 6, 7, 8, pwm=True)
leds.source = cpu.values
pause()

View File

@@ -0,0 +1,14 @@
from gpiozero import LED, PingServer
from gpiozero.tools import negated
from signal import pause
green = LED(17)
red = LED(18)
google = PingServer('google.com')
green.source = google.values
green.source_delay = 60
red.source = negated(green.values)
pause()

View File

@@ -1,12 +1,12 @@
from gpiozero import Buzzer, Button from gpiozero import LEDBoard, MotionSensor
from gpiozero.pins.pigpio import PiGPIOPin from gpiozero.pins.pigpio import PiGPIOFactory
from signal import pause from signal import pause
ips = ['192.168.1.3', '192.168.1.4', '192.168.1.5', '192.168.1.6'] ips = ['192.168.1.3', '192.168.1.4', '192.168.1.5', '192.168.1.6']
remote_pins = [PiGPIOPin(17, host=ip) for ip in ips] remotes = [PiGPIOFactory(host=ip) for ip in ips]
button = Button(17) # button on this pi button = Button(17) # button on this pi
buzzers = [Buzzer(pin) for pin in remote_pins] # buzzers on remote pins buzzers = [Buzzer(pin, pin_factory=r) for r in remotes] # buzzers on remote pins
for buzzer in buzzers: for buzzer in buzzers:
buzzer.source = button.values buzzer.source = button.values

View File

@@ -1,12 +1,12 @@
from gpiozero import LEDBoard, MotionSensor from gpiozero import LEDBoard, MotionSensor
from gpiozero.pins.pigpio import PiGPIOPin from gpiozero.pins.pigpio import PiGPIOFactory
from signal import pause from signal import pause
ips = ['192.168.1.3', '192.168.1.4', '192.168.1.5', '192.168.1.6'] ips = ['192.168.1.3', '192.168.1.4', '192.168.1.5', '192.168.1.6']
remote_pins = [PiGPIOPin(17, host=ip) for ip in ips] remotes = [PiGPIOFactory(host=ip) for ip in ips]
leds = LEDBoard(2, 3, 4, 5) # leds on this pi leds = LEDBoard(2, 3, 4, 5) # leds on this pi
sensors = [MotionSensor(pin) for pin in remote_pins] # motion sensors on other pis sensors = [MotionSensor(17, pin_factory=r) for r in remotes] # remote sensors
for led, sensor in zip(leds, sensors): for led, sensor in zip(leds, sensors):
led.source = sensor.values led.source = sensor.values

View File

@@ -0,0 +1,26 @@
from gpiozero import Button, Robot
from gpiozero.pins.pigpio import PiGPIOFactory
from signal import pause
factory = PiGPIOFactory(host='192.168.1.17')
robot = Robot(left=(4, 14), right=(17, 18), pin_factory=factory) # remote pins
# local buttons
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()

View File

@@ -0,0 +1,11 @@
from gpiozero import Robot, MCP3008
from signal import pause
robot = Robot(left=(4, 14), right=(17, 18))
left = MCP3008(0)
right = MCP3008(1)
robot.source = zip(left.values, right.values)
pause()

View File

@@ -0,0 +1,12 @@
from gpiozero import Robot, MCP3008
from gpiozero.tools import scaled
from signal import pause
robot = Robot(left=(4, 14), right=(17, 18))
left = MCP3008(0)
right = MCP3008(1)
robot.source = zip(scaled(left.values, -1, 1), scaled(right.values, -1, 1))
pause()

View File

@@ -0,0 +1,11 @@
from gpiozero import Energenie, TimeOfDay
from datetime import time
from signal import pause
lamp = Energenie(1)
daytime = TimeOfDay(time(8), time(20))
lamp.source = daytime.values
lamp.source_delay = 60
pause()

View File

@@ -0,0 +1,22 @@
from gpiozero import PingServer, LEDBoard
from gpiozero.tools import negated
from signal import pause
status = LEDBoard(
mum=LEDBoard(red=14, green=15),
dad=LEDBoard(red=17, green=18),
alice=LEDBoard(red=21, green=22)
)
statuses = {
PingServer('192.168.1.5'): status.mum,
PingServer('192.168.1.6'): status.dad,
PingServer('192.168.1.7'): status.alice,
}
for server, leds in statuses.items():
leds.green.source = server.values
leds.green.source_delay = 60
leds.red.source = negated(leds.green.values)
pause()

View File

@@ -0,0 +1,18 @@
from gpiozero import PingServer, StatusZero
from gpiozero.tools import negated
from signal import pause
status = StatusZero('mum', 'dad', 'alice')
statuses = {
PingServer('192.168.1.5'): status.mum,
PingServer('192.168.1.6'): status.dad,
PingServer('192.168.1.7'): status.alice,
}
for server, leds in statuses.items():
leds.green.source = server.values
leds.green.source_delay = 60
leds.red.source = negated(leds.green.values)
pause()

View File

@@ -401,8 +401,38 @@ Alternatively, the following example is identical, but uses the
.. literalinclude:: examples/rgbled_pot_2.py .. literalinclude:: examples/rgbled_pot_2.py
:emphasize-lines: 9 :emphasize-lines: 9
Please note the example above requires Python 3. In Python 2, :func:`zip` .. note::
doesn't support lazy evaluation so the script will simply hang.
Please note the example above requires Python 3. In Python 2, :func:`zip`
doesn't support lazy evaluation so the script will simply hang.
Timed heat lamp
===============
If you have a pet (e.g. a tortoise) which requires a heat lamp to be switched
on for a certain amount of time each day, you can use an `Energenie Pi-mote`_
to remotely control the lamp, and the :class:`TimeOfDay` class to control the
timing:
.. literalinclude:: examples/timed_heat_lamp.py
Internet connection status indicator
====================================
You can use a pair of green and red LEDs to indicate whether or not your
internet connection is working. Simply use the :class:`PingServer` class to
identify whether a ping to `google.com` is successful. If successful, the green
LED is lit, and if not, the red LED is lit:
.. literalinclude:: examples/internet_status_indicator.py
CPU Temperature Bar Graph
=========================
You can read the Raspberry Pi's own CPU temperature using the built-in
:class:`CPUTemperature` class, and display this on a "bar graph" of LEDs:
.. literalinclude:: examples/cpu_temperature_bar_graph.py
More recipes More recipes
============ ============
@@ -416,3 +446,4 @@ Continue to:
.. _Push Button Stop Motion: https://www.raspberrypi.org/learning/quick-reaction-game/ .. _Push Button Stop Motion: https://www.raspberrypi.org/learning/quick-reaction-game/
.. _Quick Reaction Game: 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/ .. _GPIO Music Box: https://www.raspberrypi.org/learning/gpio-music-box/
.. _Energenie Pi-mote: https://energenie4u.co.uk/catalogue/product/ENER002-2PI

View File

@@ -22,11 +22,66 @@ travispy``.
Button controlled robot Button controlled robot
======================= =======================
Alternatively, use four buttons to program the directions and add a fifth Alternatively to the examples in the simple recipes, you can use four buttons
button to process them in turn, like a Bee-Bot or Turtle robot. to program the directions and add a fifth button to process them in turn, like
a Bee-Bot or Turtle robot.
.. literalinclude:: examples/robot_buttons_2.py .. literalinclude:: examples/robot_buttons_2.py
Who's home indicator
====================
Using a number of green-red LED pairs, you can show the status of who's home,
according to which IP addresses you can ping successfully. Note that this
assumes each person's mobile phone has a reserved IP address on the home router.
.. literalinclude:: examples/whos_home_leds.py
Alternatively, using the `STATUS Zero`_ board:
.. literalinclude:: examples/whos_home_status.py
Robot controlled by 2 potentiometers
====================================
Use two potentiometers to control the left and right motor speed of a robot:
.. literalinclude:: examples/robot_pots_1.py
.. note::
Please note the example above requires Python 3. In Python 2, :func:`zip`
doesn't support lazy evaluation so the script will simply hang.
To include reverse direction, scale the potentiometer values from 0-1 to -1-1:
.. literalinclude:: examples/robot_pots_2.py
BlueDot
=======
BlueDot is a Python library an Android app which allows you to easily add
Bluetooth control to your Raspberry Pi project. A simple example to control a
LED using the BlueDot app:
.. literalinclude:: examples/bluedot_led.py
Note this recipe requires ``bluedot`` and the associated Android app. See the
`BlueDot documentation`_ for installation instructions.
BlueDot robot
=============
You can create a Bluetooth controlled robot which moves forward when the dot is
pressed and stops when it is released:
.. literalinclude:: examples/bluedot_robot_1.py
Or a more advanced example including controlling the robot's speed and precise
direction:
.. literalinclude:: examples/bluedot_robot_2.py
Controlling the Pi's own LEDs Controlling the Pi's own LEDs
============================= =============================
@@ -71,3 +126,5 @@ run the following commands:
.. _travispy: https://travispy.readthedocs.io/ .. _travispy: https://travispy.readthedocs.io/
.. _STATUS Zero: https://thepihut.com/status
.. _BlueDot documentation: http://bluedot.readthedocs.io/en/latest/index.html

View File

@@ -44,6 +44,15 @@ doorbell, and use a push button as the doorbell:
This could also be used as an internal doorbell (tell people it's time for This could also be used as an internal doorbell (tell people it's time for
dinner from the kitchen). dinner from the kitchen).
Remote button robot
===================
Similarly to the simple recipe for the button controlled robot, this example
uses four buttons to control the direction of a robot. However, using remote
pins for the robot means the control buttons can be separate from the robot:
.. literalinclude:: examples/remote_button_robot.py
Light sensor + Sense HAT Light sensor + Sense HAT
========================= =========================