Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Physical computing with Python and Raspberry Pi...

Physical computing with Python and Raspberry Pi, Ben Nuttall, Raspberry Pi

Выступление на конференции PyCon Russia 2016

IT-People

July 25, 2016
Tweet

More Decks by IT-People

Other Decks in Programming

Transcript

  1. 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. Raspberry Pi Foundation • Educational charity founded in 2006 •

    Owns trading subsidiary Raspberry Pi Trading Ltd • Trading profits fund educational programmes
  3. Raspberry Pi (2012) Raspberry Pi Model B 700MHz single core

    32-bit CPU VideoCoreIV 3D GPU 256MB RAM $35
  4. Made in the UK • Since 2013, Raspberry Pi has

    been manufactured by Sony in Wales • 20k units per day at peak
  5. Raspberry Pi 3 Model B (2016) 1.2GHz quad core 64-bit

    CPU VideoCoreIV 3D GPU 1GB RAM $35
  6. 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. Raspberry Pi Foundation Mission “Putting the power of digital making

    into the hands of people all over the world”
  8. Raspberry Pi computers • We produce low-cost high- power computers

    • They keep getting better and/or cheaper :) • Used in – education – hobby projects – industry
  9. 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. Raspbian • Launch programming applications • Web browser • Preferences

    and settings • Shutdown & reboot • Look – it's a real computer!
  11. Physical computing • Flashy lights • Motors & robots •

    Photo & video • Sensors • Internet of Things • Engaging and empowering
  12. 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)
  13. 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...
  14. 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
  15. Python - GPIO Zero from gpiozero import LED from time

    import sleep led = LED(17) while True: led.on() sleep(1) led.off() sleep(1)
  16. 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
  17. 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
  18. Button polling (pull-up) – GPIO Zero button = Button(4) while

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

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

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

    while True: button.wait_for_press() print(“Pressed”)
  22. Button callback – GPIO Zero button = Button(4) def pressed():

    print(“Pressed”) button.when_pressed = pressed
  23. 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)
  24. Button callback – GPIO Zero button = Button(4) def pressed(button):

    print(“Pin %s pressed” % button.pin.number) button.when_pressed = pressed
  25. Button + LED from gpiozero import LED, Button led =

    LED(17) button = Button(4) button.when_pressed = led.on button.when_released = led.off
  26. 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)
  27. 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
  28. 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)
  29. 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
  30. 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()
  31. 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)
  32. 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
  33. 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
  34. Motion sensor from gpiozero import LED, MotionSensor led = LED(2)

    sensor = MotionSensor(3) sensor.when_motion = led.on sensor.when_no_motion = led.off
  35. 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")
  36. 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)
  37. 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)
  38. 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
  39. 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
  40. 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
  41. Dial up the brightness! from gpiozero import PWMLED, MCP3008 led

    = PWMLED(2) pot = MCP3008() while True: led.value = pot.value
  42. 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
  43. Dial up the brightness! from gpiozero import PWMLED, MCP3008 led

    = PWMLED(2) pot = MCP3008() led.source = pot.values
  44. 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
  45. 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 )
  46. Custom value generators Output Device .value .values .source Input Device

    .value .values Custom generator e.g. read_slowly
  47. Custom value generators def read_slowly(values): for i in values: yield

    i sleep(0.1) blue.source = read_slowly(sensor.values)
  48. Source Tools from gpiozero import PWMLED, MCP3008 from gpiozero.tools import

    inverted led = PWMLED(4) pot = MCP3008(channel=0) led.source = inverted(pot.values)
  49. 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()
  50. 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)
  51. 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)
  52. 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()
  53. 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
  54. 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
  55. v1.3 (a work in progress) • 522 commits • 5

    contributors (+8 minor contributions) • 390 GitHub issues (178 issues, 212 PRs)
  56. 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)
  57. 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
  58. 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
  59. www.raspberrypi.org • Daily blog articles – news, projects and stories

    • OS Downloads • Help pages • Documentation • Community sites • Forums
  60. Raspberry Pi Learning Resources • Teach, Learn and Make •

    Free • Open source • Creative Commons • Created by Raspberry Pi Education Team • Scratch, Python and more
  61. Raspberry Pi Weekly • Free weekly email newsletter • Raspberry

    Pi news, projects and articles • 3 years of issues on the website • raspberrypi.org/weekly
  62. 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)
  63. 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
  64. 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]