Share
Embed
Physical computing with Python and Raspberry Pi, Ben Nuttall, Raspberry Pi
Выступление на конференции PyCon Russia 2016
IT-People
July 25, 2016
Transcript
101 slides
-
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 -
Raspberry Pi Foundation • Educational charity founded in 2006 •
Owns trading subsidiary Raspberry Pi Trading Ltd • Trading profits fund educational programmes -
Raspberry Pi (2012) Raspberry Pi Model B 700MHz single core
32-bit CPU VideoCoreIV 3D GPU 256MB RAM $35 -
Made in the UK • Since 2013, Raspberry Pi has
been manufactured by Sony in Wales • 20k units per day at peak -
Raspberry Pi Compute Module Prototyping development board Build your product
around the Raspberry Pi -
Raspberry Pi Zero (2015) 1GHz single core 32-bit CPU VideoCoreIV
3D GPU 512MB RAM $5 -
Raspberry Pi 3 Model B (2016) 1.2GHz quad core 64-bit
CPU VideoCoreIV 3D GPU 1GB RAM $35 -
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 -
Raspberry Pi Foundation Mission “Putting the power of digital making
into the hands of people all over the world” -
Raspberry Pi computers • We produce low-cost high- power computers
• They keep getting better and/or cheaper :) • Used in – education – hobby projects – industry -
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 -
Raspbian • Launch programming applications • Web browser • Preferences
and settings • Shutdown & reboot • Look – it's a real computer! -
Physical computing • Flashy lights • Motors & robots •
Photo & video • Sensors • Internet of Things • Engaging and empowering -
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) -
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... -
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 -
Python - GPIO Zero from gpiozero import LED from time
import sleep led = LED(17) while True: led.on() sleep(1) led.off() sleep(1) -
Python - GPIO Zero from gpiozero import LED led =
LED(17) led.blink() -
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 -
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 -
Button polling (pull-up) – RPi.GPIO GPIO.setup(4, GPIO.IN, GPIO.PUD_UP) while True:
if not GPIO.input(4): print(“Pressed”) -
Button polling (pull-down) – RPi.GPIO GPIO.setup(4, GPIO.IN, GPIO.PUD_DOWN) while True:
if GPIO.input(4): print(“Pressed”) -
Button polling (pull-up) – GPIO Zero button = Button(4) while
True: if button.is_pressed: print(“Pressed”) -
Button polling (pull-down) – GPIO Zero button = Button(4, pull_up=False)
while True: if button.is_pressed: print(“Pressed”) -
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”) -
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”) -
Button wait_for_press (pull-up) – GPIO Zero button = Button(4) while
True: button.wait_for_press() print(“Pressed”) -
Button wait_for_press (pull-down) – GPIO Zero button = Button(4, pull_up=False)
while True: button.wait_for_press() print(“Pressed”) -
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) -
Button callback – GPIO Zero button = Button(4) def pressed():
print(“Pressed”) button.when_pressed = pressed -
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) -
Button callback – GPIO Zero button = Button(4) def pressed(button):
print(“Pin %s pressed” % button.pin.number) button.when_pressed = pressed -
Button + LED from gpiozero import LED, Button led =
LED(17) button = Button(4) button.when_pressed = led.on button.when_released = led.off -
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) -
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 -
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 -
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() -
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) -
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 -
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 -
Motion sensor from gpiozero import LED, MotionSensor led = LED(2)
sensor = MotionSensor(3) sensor.when_motion = led.on sensor.when_no_motion = led.off -
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") -
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) -
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) -
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 -
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 -
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 -
Analogue - potentiometers from gpiozero import MCP3008 pot = MCP3008()
while True: print(pot.value) -
Dial up the brightness! from gpiozero import PWMLED, MCP3008 led
= PWMLED(2) pot = MCP3008() while True: led.value = pot.value -
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 -
Dial up the brightness! from gpiozero import PWMLED, MCP3008 led
= PWMLED(2) pot = MCP3008() led.source = pot.values -
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 -
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 ) -
Source / Values Output Device .value .values .source Custom generator
while True: … yield value -
Custom value generators blue = PWMLED(16) blue.source_delay = 0.1 blue.source
= (i / 10000 for i in range(10000)) -
Custom value generators Output Device .value .values .source Input Device
.value .values Custom generator e.g. read_slowly -
Custom value generators def read_slowly(values): for i in values: yield
i sleep(0.1) blue.source = read_slowly(sensor.values) -
Source Tools Output Device .value .values .source Input Device .value
.values Source tool e.g. invert -
Source Tools from gpiozero import PWMLED, MCP3008 from gpiozero.tools import
inverted led = PWMLED(4) pot = MCP3008(channel=0) led.source = inverted(pot.values) -
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() -
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) -
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) -
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() -
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 -
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 -
v1.3 (a work in progress) • 522 commits • 5
contributors (+8 minor contributions) • 390 GitHub issues (178 issues, 212 PRs) -
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) -
Install GPIO Zero • Pre-installed in Raspbian Jessie since November
• Update with: sudo aptget update • Install with: sudo aptget install python3gpiozero or: sudo aptget install pythongpiozero -
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 -
Zero all the things! • PyGame Zero • GPIO Zero
• Network Zero • BlueZero -
www.raspberrypi.org • Daily blog articles – news, projects and stories
• OS Downloads • Help pages • Documentation • Community sites • Forums -
Raspberry Pi Learning Resources • Teach, Learn and Make •
Free • Open source • Creative Commons • Created by Raspberry Pi Education Team • Scratch, Python and more -
Raspberry Pi Weekly • Free weekly email newsletter • Raspberry
Pi news, projects and articles • 3 years of issues on the website • raspberrypi.org/weekly -
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) -
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 -
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]