Physical computing with Python and Raspberry Pi - PyCon Russia

Physical computing with Python and Raspberry Pi - PyCon Russia

An introduction to the Raspberry Pi, and the Foundation's charitable work in education, and to getting started with physical computing using Python and GPIO Zero on the Raspberry Pi.

This was the closing talk at PyCon Russia 2016.

A1995c9abe48450ce2f82d93ca0b863f?s=128

Ben Nuttall

July 04, 2016
Tweet

Transcript

  1. 2.

    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
  2. 4.

    Raspberry Pi Foundation • Educational charity founded in 2006 •

    Owns trading subsidiary Raspberry Pi Trading Ltd • Trading profits fund educational programmes
  3. 8.

    Raspberry Pi (2012) Raspberry Pi Model B 700MHz single core

    32-bit CPU VideoCoreIV 3D GPU 256MB RAM $35
  4. 12.

    Made in the UK • Since 2013, Raspberry Pi has

    been manufactured by Sony in Wales • 20k units per day at peak
  5. 15.

    Raspberry Pi 3 Model B (2016) 1.2GHz quad core 64-bit

    CPU VideoCoreIV 3D GPU 1GB RAM $35
  6. 16.

    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
  7. 17.

    Raspberry Pi Foundation Mission “Putting the power of digital making

    into the hands of people all over the world”
  8. 18.

    Raspberry Pi computers • We produce low-cost high- power computers

    • They keep getting better and/or cheaper :) • Used in – education – hobby projects – industry
  9. 20.

    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
  10. 21.
  11. 22.

    Raspbian • Launch programming applications • Web browser • Preferences

    and settings • Shutdown & reboot • Look – it's a real computer!
  12. 23.

    Physical computing • Flashy lights • Motors & robots •

    Photo & video • Sensors • Internet of Things • Engaging and empowering
  13. 27.

    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)
  14. 28.

    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...
  15. 29.

    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
  16. 30.

    Python - GPIO Zero from gpiozero import LED from time

    import sleep led = LED(17) while True: led.on() sleep(1) led.off() sleep(1)
  17. 32.

    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
  18. 33.

    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
  19. 34.
  20. 37.

    Button polling (pull-up) – GPIO Zero button = Button(4) while

    True: if button.is_pressed: print(“Pressed”)
  21. 38.

    Button polling (pull-down) – GPIO Zero button = Button(4, pull_up=False)

    while True: if button.is_pressed: print(“Pressed”)
  22. 39.
  23. 41.

    Button wait_for_press (pull-up) – GPIO Zero button = Button(4) while

    True: button.wait_for_press() print(“Pressed”)
  24. 42.

    Button wait_for_press (pull-down) – GPIO Zero button = Button(4, pull_up=False)

    while True: button.wait_for_press() print(“Pressed”)
  25. 44.

    Button callback – GPIO Zero button = Button(4) def pressed():

    print(“Pressed”) button.when_pressed = pressed
  26. 45.

    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)
  27. 46.

    Button callback – GPIO Zero button = Button(4) def pressed(button):

    print(“Pin %s pressed” % button.pin.number) button.when_pressed = pressed
  28. 47.

    Button + LED from gpiozero import LED, Button led =

    LED(17) button = Button(4) button.when_pressed = led.on button.when_released = led.off
  29. 48.

    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)
  30. 49.

    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
  31. 50.

    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)
  32. 51.

    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
  33. 52.

    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()
  34. 53.

    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)
  35. 54.

    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
  36. 55.

    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
  37. 56.

    Motion sensor from gpiozero import LED, MotionSensor led = LED(2)

    sensor = MotionSensor(3) sensor.when_motion = led.on sensor.when_no_motion = led.off
  38. 57.

    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")
  39. 58.

    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)
  40. 59.

    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)
  41. 61.

    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
  42. 62.

    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
  43. 63.

    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
  44. 65.

    Dial up the brightness! from gpiozero import PWMLED, MCP3008 led

    = PWMLED(2) pot = MCP3008() while True: led.value = pot.value
  45. 66.

    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
  46. 73.

    Dial up the brightness! from gpiozero import PWMLED, MCP3008 led

    = PWMLED(2) pot = MCP3008() led.source = pot.values
  47. 74.

    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
  48. 75.

    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 )
  49. 78.

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

    .value .values Custom generator e.g. read_slowly
  50. 79.

    Custom value generators def read_slowly(values): for i in values: yield

    i sleep(0.1) blue.source = read_slowly(sensor.values)
  51. 81.

    Source Tools from gpiozero import PWMLED, MCP3008 from gpiozero.tools import

    inverted led = PWMLED(4) pot = MCP3008(channel=0) led.source = inverted(pot.values)
  52. 82.

    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()
  53. 83.

    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)
  54. 84.

    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)
  55. 86.

    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()
  56. 87.

    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
  57. 88.

    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
  58. 89.

    v1.3 (a work in progress) • 522 commits • 5

    contributors (+8 minor contributions) • 390 GitHub issues (178 issues, 212 PRs)
  59. 90.

    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)
  60. 91.

    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
  61. 92.

    GPIO Zero • gpiozero.readthedocs.io – Installation instructions – API Documentation

    – Examples • GitHub Issues – Suggestions – Feedback • Contact me – ben@raspberrypi.org – @ben_nuttall on Twitter • #gpiozero on Twitter
  62. 93.
  63. 95.

    www.raspberrypi.org • Daily blog articles – news, projects and stories

    • OS Downloads • Help pages • Documentation • Community sites • Forums
  64. 96.

    Raspberry Pi Learning Resources • Teach, Learn and Make •

    Free • Open source • Creative Commons • Created by Raspberry Pi Education Team • Scratch, Python and more
  65. 97.

    Raspberry Pi Weekly • Free weekly email newsletter • Raspberry

    Pi news, projects and articles • 3 years of issues on the website • raspberrypi.org/weekly
  66. 98.

    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)
  67. 99.

    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
  68. 100.

    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 indra@codeclub.org.uk