Ben Nuttall ● Education Developer Advocate at the Raspberry Pi Foundation – Runs www.raspberrypi.org – Software & project development – Learning resources & teacher training – Outreach ● Hobbyist turned employee ● @ben_nuttall on Twitter
Current state of affairs with RPi.GPIO ● Broad use of RPi.GPIO – Used in Raspberry Pi learning resources – 132k code search results on github.com ● Lots of typing required for basic examples ● Lots of copy/paste code when using more complicated devices like sensors ● Requires fundamental understanding of electronics ● Lots of use of polling ● Implementation in C – exposes a non-Pythonic API
sudo ● In Raspbian Wheezy, root access was needed to access the GPIO pins ● This meant running Python files with sudo ● This also meant opening IDLE from the menu did not allow GPIO access, must be opened with sudo idle & ● The pi user was given access to GPIO pins in Raspbian Jessie (released during development of GPIO Zero)
Motivation ● CamJam talk 12/9/15 - How to build Python APIs for Raspberry Pi Hardware ● Teachers saying it's too hard to use Python ● Too much code to write to flash an LED (what is this, Java?) ● Too much boilerplate code needed to get started ● Too many electronics concepts required to understand (or ignore) e.g. pull-up vs. pull-down, and falling/rising edge ● Lots of bad code out there – all being copied
Inspiration ● Python libraries for Pimoroni add-on boards ● Community users like Martin O'Hanlon commonly using LED class, etc. ● Picamera Python library ● Flotilla ● PyGame Zero – zero boilerplate wrapper for Pygame
Some initial comments ● “You're making it too easy” ● “Part of the fun is learning how it works” ● “It shouldn't be this easy to blink an LED” ● “You're dumbing down the flexibility of RPi.GPIO” ● “It's nice but I'll still use RPi.GPIO for the complex stuff”
More initial comments ● “I'll have one of those. Can you get it ready for the next Raspbian release?” - Eben Upton ● “It's great! I never meant for RPi.GPIO to be an end-user library anyway!” - Ben Croston
LED from gpiozero import LED from time import sleep led = LED(17) led.on() # on led.off() # off led.toggle() # on>off or off>on led.blink() # flash on/off continuously
Buzzer from gpiozero import Buzzer from time import sleep buzzer = Buzzer(18) buzzer.on() # on buzzer.off() # off buzzer.toggle() # on>off or off>on buzzer.beep() # beep on/off continuously
LED – PWM – RPi.GPIO GPIO.setup(17, GPIO.OUT) # pin 17 p = GPIO.PWM(17, 100) # pin 17, frequency 100Hz p.start(0) # initial duty cycle for i in range(101): p.ChangeDutyCycle(i) sleep(0.01)
Full colour LED from gpiozero import RGBLED led = RGBLED(red=2, green=3, blue=4) led.red.on() # full red led.color = (1, 0, 1) # purple led.blue = 0.3 # dim the blue value to 0.3 # now (1, 0, 0.3)
Traffic Lights from gpiozero import TrafficLights lights = TrafficLights(9, 10, 11) lights.on() # all on lights.off() # all off lights.red.on() # red on lights.toggle() # swap state of all lights
Motor from gpiozero import Motor from time import sleep motor = Motor(forward=17, backward=18) while True: motor.forward() sleep(5) motor.backward() sleep(5)
Custom value generators blue = PWMLED(16) blue.source = [i / 10000.0 for i in range(10000)] red = PWMLED(12) red.source = blue.values blue.source = [i / 10000.0 for i in range(10000)] sensor = LightSensor(18) blue.source = sensor.values
Custom value generators def read_slowly(iterable): for i in iterable: yield i sleep(0.1) red.source = read_slowly(blue.values) blue.source = read_slowly(sensor.values)
GPIO Zero Timeline ● 12 Sept – CamJam talk sparked idea ● 14 Sept – Initial commit on GitHub ● 15 Sept – Named GPIO Zero, first PR, first alpha released on PyPi ● 23 Sept – Mentioned in talk at PyConUK ● 28 Sept – v0.6 public beta 1 ● 09 Oct – v0.7 public beta 2 ● 16 Oct – v0.8 public beta 3 ● 25 Oct – v0.9 public beta 4 ● 29 Oct – Featured in The MagPi ● 16 Nov – v1.0 released ● 21 Nov – Released in Raspbian Jessie
Future development ● Add more components ● Integrate more add-ons ● Add test suite ● Replace RPi.GPIO dependency ● Promote use of “gpiozero standard” to allow other modules to provide objects which plug-in to gpiozero objects easily (e.g. source/values)
What have I learned? ● Issue-driven development works really well ● Dave Jones is awesome (ok I already knew that) ● User-focused API design is important ● Getting feedback from teachers is hard ● Getting code contributions is hard ● Getting documentation contributions is easier