Slide 1

Slide 1 text

Physical Computing with Python Ben Nuttall Raspberry Pi Foundation UK Charity 1129409

Slide 2

Slide 2 text

Ben Nuttall ● Raspberry Pi Community Manager – Programmes & outreach – Software & project development – Learning resources & teacher training ● Hobbyist turned employee ● Based in Cambridge, UK ● @ben_nuttall on Twitter

Slide 3

Slide 3 text

Raspberry Pi

Slide 4

Slide 4 text

Raspberry Pi Foundation ● Educational charity founded in 2006 ● Owns trading subsidiary Raspberry Pi Trading Ltd ● Trading profits fund educational programmes

Slide 5

Slide 5 text

A Computer (1981)

Slide 6

Slide 6 text

A Computer (2010)

Slide 7

Slide 7 text

Prototypes

Slide 8

Slide 8 text

Raspberry Pi (2012) Raspberry Pi Model B 700MHz single core 32-bit CPU VideoCoreIV 3D GPU 256MB RAM $35

Slide 9

Slide 9 text

Raspberry Pi Community

Slide 10

Slide 10 text

Raspberry Jam

Slide 11

Slide 11 text

Raspberry Jam raspberrypi.org/jam

Slide 12

Slide 12 text

Made in the UK ● Since 2013, Raspberry Pi has been manufactured by Sony in Wales ● 20k units per day at peak

Slide 13

Slide 13 text

Raspberry Pi Compute Module Prototyping development board Build your product around the Raspberry Pi

Slide 14

Slide 14 text

Raspberry Pi Zero (2015) 1GHz single core 32-bit CPU VideoCoreIV 3D GPU 512MB RAM $5

Slide 15

Slide 15 text

Raspberry Pi 3 Model B (2016) 1.2GHz quad core 64-bit CPU VideoCoreIV 3D GPU 1GB RAM $35

Slide 16

Slide 16 text

Over 9 Million Raspberry Pis sold ● Minor revisions ● Model A ● Model B+ ● Model A+ ● Raspberry Pi 2 Model B ● Raspberry Pi Zero ● Raspberry Pi 3 Model B

Slide 17

Slide 17 text

Raspberry Pi Foundation Mission “Putting the power of digital making into the hands of people all over the world”

Slide 18

Slide 18 text

Raspberry Pi computers ● We produce low-cost high- power computers ● They keep getting better and/or cheaper :) ● Used in – education – hobby projects – industry

Slide 19

Slide 19 text

Raspberry Pi in Schools

Slide 20

Slide 20 text

Education ● We train teachers in computing ● We create free resources for use at home and school ● We run programmes to engage young people in digital making ● We support a network of Code Clubs in Primary Schools

Slide 21

Slide 21 text

Raspbian

Slide 22

Slide 22 text

Raspbian ● Launch programming applications ● Web browser ● Preferences and settings ● Shutdown & reboot ● Look – it's a real computer!

Slide 23

Slide 23 text

Physical computing ● Flashy lights ● Motors & robots ● Photo & video ● Sensors ● Internet of Things ● Engaging and empowering

Slide 24

Slide 24 text

GPIO Pins – General Purpose Input/Output

Slide 25

Slide 25 text

GPIO components

Slide 26

Slide 26 text

Add-on boards / HATs

Slide 27

Slide 27 text

Python - RPi.GPIO import RPi.GPIO as GPIO from time import sleep GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) GPIO.setup(17, GPIO.OUT) while True: GPIO.output(17, GPIO.HIGH) sleep(1) GPIO.output(17, GPIO.LOW) sleep(1)

Slide 28

Slide 28 text

GPIO in Scratch ● GPIO Server ● Use broadcast blocks ● Drag & drop programming – except when you have to write code in those broadcast blocks and get the syntax right as there's no error reporting...

Slide 29

Slide 29 text

Something more approachable? ● Teachers saying Python is too hard to teach with – Particularly RPi.GPIO and PyGame ● Teachers staying in Scratch too long – Need help moving to Python – GPIO in Scratch is difficult ● Problems with RPi.GPIO – Too much boilerplate code required for even simple examples – Lots of copy/paste for complex components – Not Pythonic

Slide 30

Slide 30 text

Python - GPIO Zero from gpiozero import LED from time import sleep led = LED(17) while True: led.on() sleep(1) led.off() sleep(1)

Slide 31

Slide 31 text

Python - GPIO Zero from gpiozero import LED led = LED(17) led.blink()

Slide 32

Slide 32 text

LED from gpiozero import LED led = LED(17) led.on() # on led.off() # off led.toggle() # on­>off or off­>on led.blink() # flash on/off continuously

Slide 33

Slide 33 text

Buzzer from gpiozero import Buzzer buzzer = Buzzer(18) buzzer.on() # on buzzer.off() # off buzzer.toggle() # on­>off or off­>on buzzer.beep() # beep on/off continuously

Slide 34

Slide 34 text

GitHub

Slide 35

Slide 35 text

Button polling (pull-up) – RPi.GPIO GPIO.setup(4, GPIO.IN, GPIO.PUD_UP) while True: if not GPIO.input(4): print(“Pressed”)

Slide 36

Slide 36 text

Button polling (pull-down) – RPi.GPIO GPIO.setup(4, GPIO.IN, GPIO.PUD_DOWN) while True: if GPIO.input(4): print(“Pressed”)

Slide 37

Slide 37 text

Button polling (pull-up) – GPIO Zero button = Button(4) while True: if button.is_pressed: print(“Pressed”)

Slide 38

Slide 38 text

Button polling (pull-down) – GPIO Zero button = Button(4, pull_up=False) while True: if button.is_pressed: print(“Pressed”)

Slide 39

Slide 39 text

Button wait_for_edge (pull-up) – RPi.GPIO GPIO.setup(4, GPIO.IN, GPIO.PUD_UP) while True: GPIO.wait_for_edge(4, GPIO.FALLING) print(“Pressed”)

Slide 40

Slide 40 text

Button wait_for_edge (pull-down) – RPi.GPIO GPIO.setup(4, GPIO.IN, GPIO.PUD_DOWN) while True: GPIO.wait_for_edge(4, GPIO.RISING) print(“Pressed”)

Slide 41

Slide 41 text

Button wait_for_press (pull-up) – GPIO Zero button = Button(4) while True: button.wait_for_press() print(“Pressed”)

Slide 42

Slide 42 text

Button wait_for_press (pull-down) – GPIO Zero button = Button(4, pull_up=False) while True: button.wait_for_press() print(“Pressed”)

Slide 43

Slide 43 text

Button callback – RPi.GPIO GPIO.setup(4, GPIO.IN, GPIO.PUD_UP) def pressed(pin): print(“Pressed”) GPIO.add_event_detect(4, GPIO.FALLING, pressed)

Slide 44

Slide 44 text

Button callback – GPIO Zero button = Button(4) def pressed(): print(“Pressed”) button.when_pressed = pressed

Slide 45

Slide 45 text

Button callback – RPi.GPIO GPIO.setup(4, GPIO.IN, GPIO.PUD_UP) def pressed(pin): print(“Pin %s Pressed” % pin) GPIO.add_event_detect(4, GPIO.FALLING, pressed)

Slide 46

Slide 46 text

Button callback – GPIO Zero button = Button(4) def pressed(button): print(“Pin %s pressed” % button.pin.number) button.when_pressed = pressed

Slide 47

Slide 47 text

Button + LED from gpiozero import LED, Button led = LED(17) button = Button(4) button.when_pressed = led.on button.when_released = led.off

Slide 48

Slide 48 text

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)

Slide 49

Slide 49 text

LED – PWM – GPIO Zero from gpiozero import PWMLED led = PWMLED(17) led.on() # on led.off() # off led.value = 0.5 # half brightness led.pulse() # blink with fade in/out

Slide 50

Slide 50 text

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)

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

Traffic Lights sequence while True: lights.green.on() lights.amber.off() lights.red.off() 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()

Slide 53

Slide 53 text

Traffic Lights sequence while True: lights.value = (1, 0, 0) sleep(10) lights.value = (0, 1, 0) sleep(1) lights.value = (0, 0, 1) sleep(10) lights.value = (0, 1, 1) sleep(1)

Slide 54

Slide 54 text

Traffic HAT from gpiozero import TrafficHat th = TrafficHat() th.lights.red.on() th.lights.amber.on() th.button.when_pressed = th.on th.button.when_released = th.off

Slide 55

Slide 55 text

TrafficHat - PWM from gpiozero import TrafficHat th = TrafficHat(pwm=True) th.lights.red.value = 0.2 th.lights.amber.value = 0.4 th.lights.green.value = 0.8

Slide 56

Slide 56 text

Motion sensor from gpiozero import LED, MotionSensor led = LED(2) sensor = MotionSensor(3) sensor.when_motion = led.on sensor.when_no_motion = led.off

Slide 57

Slide 57 text

Light sensor from gpiozero import LED, LightSensor led = LED(2) sensor = LightSensor(3) while True: sensor.wait_for_light() print("It's light!") sensor.wait_for_dark() print("It's dark")

Slide 58

Slide 58 text

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)

Slide 59

Slide 59 text

Robot from gpiozero import Robot from time import sleep robot = Robot(left=(17, 18), right=(22, 23)) while True: robot.forward() sleep(10) robot.left() sleep(1)

Slide 60

Slide 60 text

Pre-configured robot interfaces robot = RyanteckRobot() robot = CamJamKitRobot()

Slide 61

Slide 61 text

Button controlled Robot from gpiozero import RyanteckRobot, Button 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

Slide 62

Slide 62 text

Picamera from picamera import PiCamera from gpiozero import Button from datetime import datetime camera = PiCamera() left = Button(4) right = Button(5) def capture(): dt = datetime.now().isoformat() camera.capture('/home/pi/%s.jpg' % dt) left.when_pressed = camera.start_preview left.when_released = camera.stop_preview right.when_pressed = capture

Slide 63

Slide 63 text

Push button stop motion from gpiozero import Button from picamera import PiCamera camera = PiCamera() button = Button(4) camera.start_preview() frame = 1 while True: button.wait_for_press() camera.capture('/home/pi/frame%03d.jpg' % frame) frame += 1

Slide 64

Slide 64 text

Analogue - potentiometers from gpiozero import MCP3008 pot = MCP3008() while True: print(pot.value)

Slide 65

Slide 65 text

Dial up the brightness! from gpiozero import PWMLED, MCP3008 led = PWMLED(2) pot = MCP3008() while True: led.value = pot.value

Slide 66

Slide 66 text

Colour mixing 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

Slide 67

Slide 67 text

#76 while True: led.red = pot.value

Slide 68

Slide 68 text

#76 while True: led.red = pot.value

Slide 69

Slide 69 text

#76 while True: led.red = pot.value

Slide 70

Slide 70 text

#76 while True: led.red = pot.value

Slide 71

Slide 71 text

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

Slide 72

Slide 72 text

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

Slide 73

Slide 73 text

Dial up the brightness! from gpiozero import PWMLED, MCP3008 led = PWMLED(2) pot = MCP3008() led.source = pot.values

Slide 74

Slide 74 text

Colour mixing 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) led.red.source = red_pot.values led.green.source = green_pot.values led.blue.source = blue_pot.values

Slide 75

Slide 75 text

Colour mixing 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) led.source = zip( red_pot.values, green_pot.values, blue_pot.values )

Slide 76

Slide 76 text

Source / Values Output Device .value .values .source Custom generator while True: … yield value

Slide 77

Slide 77 text

Custom value generators blue = PWMLED(16) blue.source_delay = 0.1 blue.source = (i / 10000 for i in range(10000))

Slide 78

Slide 78 text

Custom value generators Output Device .value .values .source Input Device .value .values Custom generator e.g. read_slowly

Slide 79

Slide 79 text

Custom value generators def read_slowly(values): for i in values: yield i sleep(0.1) blue.source = read_slowly(sensor.values)

Slide 80

Slide 80 text

Source Tools Output Device .value .values .source Input Device .value .values Source tool e.g. invert

Slide 81

Slide 81 text

Source Tools from gpiozero import PWMLED, MCP3008 from gpiozero.tools import inverted led = PWMLED(4) pot = MCP3008(channel=0) led.source = inverted(pot.values)

Slide 82

Slide 82 text

LEDBoard from gpiozero import LEDBoard from time import sleep leds = LEDBoard(2, 3, 4, 5, 6) for led in leds: led.on() sleep(1) leds.off()

Slide 83

Slide 83 text

LEDBarGraph from gpiozero import LEDBoard from time import sleep leds = LEDBarGraph(2, 3, 4, 5, 6, 7) leds.value = 1/2 # (1, 1, 1, 0, 0, 0) leds.value = ­1/2 # (0, 0, 0, 1, 1, 1) leds.value = 1/4 # (1, 0, 0, 0, 0, 0)

Slide 84

Slide 84 text

LEDBarGraph - PWM from gpiozero import LEDBoard from time import sleep leds = LEDBarGraph(2, 3, 4, 5, 6, 7, pwm=True) leds.value = 1/4 # (1, 0.5, 0, 0, 0, 0) leds.value = 3/4 # (1, 1, 1, 1, 0.5, 0)

Slide 85

Slide 85 text

Supporting multiple back-ends 1) RPi.GPIO 2) RPIO 3) pigpio 4) Native

Slide 86

Slide 86 text

pigpio - remote GPIO from Pi or PC from gpiozero import LED from gpiozero.pins.pigpiod import PiGPIOPin led = LED(PiGPIOPin(12, host='192.168.0.2')) led.blink()

Slide 87

Slide 87 text

GPIO Zero Timeline ● 12 Sept – Idea sparked ● 14 Sept – Initial commit on GitHub ● 15 Sept – Named GPIO Zero, first PR, first alpha released on PyPI ● 28 Sept – v0.6 public beta 1 ● 25 Oct – v0.9 public beta 4 ● 16 Nov – v1.0 released ● 21 Nov – Released in Raspbian Jessie ● 8 Feb – v1.1 released ● 10 Apr – v1.2 released

Slide 88

Slide 88 text

v1.0 ● 200 commits ● 2 contributors (+4 minor contributions) ● 103 GitHub issues (53 issues, 50 PRs) ● 4 alpha releases ● 4 beta releases ● 68 days between initial commit and major release

Slide 89

Slide 89 text

v1.3 (a work in progress) ● 522 commits ● 5 contributors (+8 minor contributions) ● 390 GitHub issues (178 issues, 212 PRs)

Slide 90

Slide 90 text

Future development ● Add more components ● Probably move default from RPi.GPIO to pigpio ● Better remote GPIO support ● Promote use of “gpiozero standard” to allow other modules to provide objects which plug-in to gpiozero objects easily (e.g. source/values)

Slide 91

Slide 91 text

Install GPIO Zero ● Pre-installed in Raspbian Jessie since November ● Update with: sudo apt­get update ● Install with: sudo apt­get install python3­gpiozero or: sudo apt­get install python­gpiozero

Slide 92

Slide 92 text

GPIO Zero ● gpiozero.readthedocs.io – Installation instructions – API Documentation – Examples ● GitHub Issues – Suggestions – Feedback ● Contact me – [email protected] – @ben_nuttall on Twitter ● #gpiozero on Twitter

Slide 93

Slide 93 text

Zero all the things! ● PyGame Zero ● GPIO Zero ● Network Zero ● BlueZero

Slide 94

Slide 94 text

How can you get involved?

Slide 95

Slide 95 text

www.raspberrypi.org ● Daily blog articles – news, projects and stories ● OS Downloads ● Help pages ● Documentation ● Community sites ● Forums

Slide 96

Slide 96 text

Raspberry Pi Learning Resources ● Teach, Learn and Make ● Free ● Open source ● Creative Commons ● Created by Raspberry Pi Education Team ● Scratch, Python and more

Slide 97

Slide 97 text

Raspberry Pi Weekly ● Free weekly email newsletter ● Raspberry Pi news, projects and articles ● 3 years of issues on the website ● raspberrypi.org/weekly

Slide 98

Slide 98 text

The MagPi ● Community magazine established in 2012 (as free PDF download) ● Now the official Raspberry Pi magazine ● Paper copies on sale in UK shops and online ● Still a free PDF download ● Occasionally comes with a free computer ● Book series (also available for free)

Slide 99

Slide 99 text

Raspberry Jam in Russia ● Start a Raspberry Jam in your area ● Create opportunities for kids to learn programming ● Share skills and projects ● See www.raspberrypi.org/jam ● Contact me for support

Slide 100

Slide 100 text

Code Club in Russia ● Translate our projects ● Run a club for 9-11 year olds ● Become a country coordinator ● See www.codeclubworld.org ● Contact me or [email protected]

Slide 101

Slide 101 text

How can you get involved?