Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

Ben Nuttall ● Raspberry Pi Community Manager ● Creator of gpiozero python library ● github.com/bennuttall ● @ben_nuttall on Twitter

Slide 3

Slide 3 text

Current models ● Raspberry Pi 3 ● 64-bit quad-core ARMv8 @ 1.2GHz ● 1GB RAM ● $35 ● Raspberry Pi Zero ● 32-bit single-core ARMv6 @ 1GHz ● 512MB RAM ● $5

Slide 4

Slide 4 text

Raspbian Jessie with PIXEL

Slide 5

Slide 5 text

GPIO Pins – General Purpose Input/Output

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

GPIO ● 3V3, 5V ● GPIO, SPI, I2C, UART ● GPIO = variable 3V3

Slide 8

Slide 8 text

GPIO components

Slide 9

Slide 9 text

Add-on boards / HATs

Slide 10

Slide 10 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 11

Slide 11 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 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

GPIO Zero supports...

Slide 17

Slide 17 text

GPIO Zero Device Hierarchy!

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

Source / Values Output Device .value .values .source Custom generator

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

Custom value generators Output Device .value .values .source Input Device .value .values Custom generator

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

Source Tools from gpiozero import LED, Button from gpiozero.tools import all_values led = PWMLED(4) btn_a = Button(2) btn_b = Button(3) led.source = all_values(btn_a.values, btn_b.values)

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

Picamera ● 8 megapixels (v2) – v1 was 5mpx ● Visible light & infra-red versions available ● 1080p30, 720p60 and VGA90 video ● Command line interface and Python library

Slide 31

Slide 31 text

Picamera - capture from picamera import PiCamera from time import sleep camera = PiCamera() camera.start_preview() sleep(3) camera.capture('/home/pi/Desktop/image.jpg') camera.stop_preview()

Slide 32

Slide 32 text

Picamera – record video from picamera import PiCamera from time import sleep camera = PiCamera() camera.start_preview() camera.start_recording('/home/pi/video.h264') sleep(10) camera.stop_recording() camera.stop_preview()

Slide 33

Slide 33 text

Picamera + GPIO push button from picamera import PiCamera from gpiozero import Button camera = PiCamera() button = Button(17) camera.start_preview() button.wait_for_press() camera.capture('/home/pi/Desktop/image.jpg') camera.stop_preview()

Slide 34

Slide 34 text

Picamera image effects from picamera import PiCamera from time import sleep camera = PiCamera() camera.start_preview() for effect in camera.IMAGE_EFFECTS: camera.image_effect = effect camera.annotate_text = "Effect: %s" % effect sleep(5) camera.stop_preview()

Slide 35

Slide 35 text

Picamera image effects

Slide 36

Slide 36 text

Sense HAT workshop ● Special made for Tim Peake's Astro Pi mission ● Sensors, LED display & joystick ● Great for science, games and creativity ● Works on any Pi model ● Emulators also available

Slide 37

Slide 37 text

Sense HAT

Slide 38

Slide 38 text

Sense HAT >>> from sense_hat import SenseHat >>> sense = SenseHat() >>> sense.show_message(“Hello world”) >>> sense.temperature >>> sense.humidity >>> sense.accelerometer >>> sense.gyroscope >>> sense.orientation

Slide 39

Slide 39 text

Random sparkles! from sense_hat import SenseHat from random import randint from time import sleep sense = SenseHat() while True: x = randint(0, 7) y = randint(0, 7) r = randint(0, 255) g = randint(0, 255) b = randint(0, 255) sense.set_pixel(x, y, r, g, b) sleep(0.01)

Slide 40

Slide 40 text

...and breathe... while True: print(sense.humidity) if sense.humidity < 60: sense.clear((255, 255, 255)) sleep(0.5) else: sense.clear((255, 0, 0)) sleep(2)

Slide 41

Slide 41 text

Joystick def foo(ev): if ev.action == 'pressed': sense.show_message(str(sense.temperature)) sense.stick.direction_up = foo

Slide 42

Slide 42 text

Astro Pi

Slide 43

Slide 43 text

Documentation ● gpiozero.readthedocs.io ● picamera.readthedocs.io ● pythonhosted.org/sense-hat