Slide 1

Slide 1 text

Programming paradigms for physical computing and IoT Ben Nuttall Raspberry Pi Foundation UK Charity 1129409

Slide 2

Slide 2 text

GPIO Pins – General Purpose Input/Output

Slide 3

Slide 3 text

GPIO Zero – a friendly API for GPIO devices from gpiozero import LED led = LED(2) led.blink()

Slide 4

Slide 4 text

GPIO Zero – a friendly API for GPIO devices ● Zero-boilerplate Pythonic library ● Intended for use in education ● Simple, guessable API with commonly used names and sensible default values ● Simple introduction, smooth learning curve ● Multi-paradigm ● Extendable

Slide 5

Slide 5 text

GPIO Zero supports...

Slide 6

Slide 6 text

GPIO Zero device hierarchy ValuesMixin SourceMixin SharedMixin EventsMixin HoldMixin Device GPIODevice SmoothedInputDevice InputDevice AnalogInputDevice SPIDevice MCP3xxx MCP33xx CompositeDevice CompositeOutputDevice LEDCollection InternalDevice DigitalInputDevice Button MotionSensor LightSensor LineSensor DistanceSensor OutputDevice DigitalOutputDevice LED Buzzer PWMOutputDevice PWMLED RGBLED MCP3004 MCP3008 MCP3204 MCP3208 MCP3301 MCP3302 MCP3304 LEDBoard LEDBarGraph PiLiter PiLiterBarGraph TrafficLights PiTraffic TrafficLightsBuzzer FishDish TrafficHat Robot Energenie RyanteckRobot CamJamKitRobot Motor TimeOfDay PingServer

Slide 7

Slide 7 text

Multi-paradigm: procedural (polling) from gpiozero import LED, Button led = LED(17) button = Button(4) while True: if button.is_pressed: led.on() else: led.off()

Slide 8

Slide 8 text

Multi-paradigm: procedural (blocking) from gpiozero import LED, Button led = LED(17) button = Button(4) while True: button.wait_for_press() led.on() button.wait_for_release() led.off()

Slide 9

Slide 9 text

Multi-paradigm: event-driven (callbacks) from gpiozero import LED, Button led = LED(17) button = Button(4) button.when_pressed = led.on button.when_released = led.off

Slide 10

Slide 10 text

Multi-paradigm: declarative from gpiozero import LED, Button led = LED(17) button = Button(4) led.source = button.values

Slide 11

Slide 11 text

.value >>> led = PWMLED(17) >>> led.value 0.0 >>> led.on() >>> led.value 1.0 >>> led.value = 0

Slide 12

Slide 12 text

.value >>> led = PWMLED(17) >>> pot = MCP3008() >>> led.value 0.0 >>> pot.value 0.510145879738202 >>> led.value = pot.value

Slide 13

Slide 13 text

.value >>> while True: ... led.value = pot.value

Slide 14

Slide 14 text

Source / Values Output Device .value .values .source Input Device .value .values

Slide 15

Slide 15 text

Source / Values Output Device .value .values .source Input Device .value .values

Slide 16

Slide 16 text

Source / Values from gpiozero import LED, Button led = LED(17) button = Button(2) led.source = button.values

Slide 17

Slide 17 text

Processing values Output Device .value .values .source Input Device .value .values function

Slide 18

Slide 18 text

Source tools from gpiozero import Button, LED from gpiozero.tools import negated led = LED(4) btn = Button(17) led.source = negated(btn.values)

Slide 19

Slide 19 text

Source tools – single source conversions ● absoluted ● booleanized ● clamped ● inverted ● negated ● post_delayed ● post_periodic_fltered ● pre_delayed ● pre_periodic_fltered ● quantized ● queued ● smoothed ● scaled

Slide 20

Slide 20 text

Combining values Output Device .value .values .source Input Device .value .values Source tool Input Device .value .values

Slide 21

Slide 21 text

Source tools – combining sources ● all_values ● any_values ● averaged ● multiplied ● summed

Slide 22

Slide 22 text

Artifcial values Output Device .value .values .source function

Slide 23

Slide 23 text

Source tools – artifcial sources ● alternating_values ● cos_values ● ramping_values ● random_values ● sin_values

Slide 24

Slide 24 text

Internal Devices ● TimeOfDay ● CPUTemperature ● PingServer ● More coming soon ● Make your own!

Slide 25

Slide 25 text

Energenie tortoise lamp from gpiozero import Energenie, TimeOfDay from datetime import time lamp = Energenie(1) daytime = TimeOfDay(time(9), time(18)) lamp.source = daytime.values

Slide 26

Slide 26 text

CPU Temperature bar graph from gpiozero import LEDBarGraph, CPUTemperature cpu = CPUTemperature(min_temp=50, max_temp=90) leds = LEDBarGraph(2, 3, 4, 5, 6, 7, 8, pwm=True) leds.source = cpu.values

Slide 27

Slide 27 text

Is the internet working? from gpiozero import LED, PingServer from gpiozero.tools import negated green = LED(17) red = LED(18) google = PingServer('google.com') green.source = google.values green.source_delay = 60 red.source = negated(green.values)

Slide 28

Slide 28 text

Custom internal devices from gpiozero import InternalDevice class FileReader(InternalDevice): @property def value(self): with open('value.txt') as f: return int(f.read().strip())

Slide 29

Slide 29 text

Blue Dot

Slide 30

Slide 30 text

Multi-paradigm: procedural (polling) from gpiozero import LED from bluedot import BlueDot led = LED(17) bd = BlueDot() while True: if bd.is_pressed: led.on() else: led.off()

Slide 31

Slide 31 text

Multi-paradigm: procedural (blocking) from gpiozero import LED from bluedot import BlueDot led = LED(17) bd = BlueDot() while True: bd.wait_for_press() led.on() bd.wait_for_release() led.off()

Slide 32

Slide 32 text

Multi-paradigm: event-driven (callbacks) from gpiozero import LED from bluedot import BlueDot led = LED(17) bd = BlueDot() bd.when_pressed = led.on bd.when_released = led.off

Slide 33

Slide 33 text

Multi-paradigm: declarative from gpiozero import LED from bluedot import BlueDot led = LED(17) bd = BlueDot() led.source = bd.values

Slide 34

Slide 34 text

GPIO Zero: cross-platform – distributed via apt/pip ● Raspberry Pi ● Raspbian, Debian, Ubuntu, etc ● PC & Mac ● Raspberry Pi Desktop x86 ● Linux ● Mac OS ● Windows

Slide 35

Slide 35 text

Supporting multiple back-ends ● RPi.GPIO ● Low-level GPIO library, implemented in C (current default) ● RPIO ● Low-level GPIO library, implemented in C (only supports Pi 1) ● pigpio ● Low-level GPIO library, implemented in C ● Runs as a daemon on the Pi, can accept remote commands ● Native ● Pure Python, limited functionality, experimental (included in gpiozero) ● Mock ● Pure Python, used in test suite, useful for testing (included in gpiozero)

Slide 36

Slide 36 text

MockPin $ GPIOZERO_PIN_FACTORY=mock python3 >>> from gpiozero import LED >>> led = LED(22) >>> led.blink() >>> led.value True >>> led.value False

Slide 37

Slide 37 text

MockPin >>> from gpiozero import LED, Button >>> led = LED(22) >>> button = Button(23) >>> led.source = button.values >>> led.value False >>> button.pin.drive_low() >>> led.value True

Slide 38

Slide 38 text

pigpio - remote GPIO from Pi or PC $ GPIOZERO_PIN_FACTORY=pigpio PIGPIO_ADDR=192.168.0.2 python3 led.py from gpiozero import LED led = LED(22) led.blink()

Slide 39

Slide 39 text

pigpio - remote GPIO from Pi or PC from gpiozero import LED from gpiozero.pins.pigpio import PiGPIOFactory factory = PiGPIOFactory('192.168.0.2') led = LED(22, pin_factory=factory) led.blink()

Slide 40

Slide 40 text

pigpio - remote GPIO from Pi or PC from gpiozero import LED, Button from gpiozero.pins.pigpio import PiGPIOFactory remote = PiGPIOFactory('192.168.0.2') led = LED(22) btn = Button(22, pin_factory=remote) led.source = btn.values

Slide 41

Slide 41 text

Raspberry Pi Desktop x86 OS

Slide 42

Slide 42 text

Pi Zero GPIO Expander

Slide 43

Slide 43 text

Pi Zero GPIO Expander from gpiozero import LED from gpiozero.pins.pigpio import PiGPIOFactory pizero = PiGPIOFactory('fe80::1%usb0') led = LED(22, pin_factory=pizero) led.blink()

Slide 44

Slide 44 text

IoT devices? from somelib import GardenLight, LightSensor, MotionSensor from gpiozero.tools import all_values, negated garden = GardenLight() light = LightSensor() motion = MotionSensor() garden.source = all_values(negated(light.values), motion.values)

Slide 45

Slide 45 text

Z-Wave devices & asyncio

Slide 46

Slide 46 text

GPIO Zero on GitHub & ReadTheDocs

Slide 47

Slide 47 text

piwheels ● Python package repository providing Arm platform wheels for Raspberry Pi ● Builds automated from PyPI releases, plus manual builds e.g. opencv & tensorfoo ● Raspbian is pre-confgured to use piwheels.org as an additional index to PyPI ● Massively reduces pip install time for Raspberry Pi users ● Natively compiled on Raspberry Pi 3 hardoare (Mythic Beasts Pi cloud) ● Repo hosted on single Raspberry Pi serving 300-400k packages per month

Slide 48

Slide 48 text

Raspberry Jam ● Independently organised community events around the world ● Family-friendly ● Mix of meetup / conference / workshop styles ● Makers, hackers, programmers & beginners come together ● Find one near you – or start your own! ● raspberrypi.org/jam

Slide 49

Slide 49 text

CoderDojo ● Free coding clubs for young people ● Find one near you and volunteer as a mentor – or start a new Dojo in your area ● coderdojo.com

Slide 50

Slide 50 text

Raspberry Pi & Python poster session today!

Slide 51

Slide 51 text

Programming paradigms for physical computing and IoT Ben Nuttall Raspberry Pi Foundation UK Charity 1129409