Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Programming paradigms for physical computing an...
Search
Ben Nuttall
April 24, 2018
Programming
0
160
Programming paradigms for physical computing and IoT
Talk given at London Raspberry Pint April 2018 meetup
Ben Nuttall
April 24, 2018
Tweet
Share
More Decks by Ben Nuttall
See All by Ben Nuttall
Numeronyms are obnoxious
bennuttall
0
320
Live Highlights in BBC iPlayer
bennuttall
0
88
Rapid prototyping in BBC News with Python and AWS
bennuttall
0
150
Rapid prototyping in BBC News with Python and AWS
bennuttall
0
97
Running a Python Package Index for Raspberry Pi
bennuttall
0
120
From Acorns to Raspberries
bennuttall
0
100
Innovation in the newsroom
bennuttall
0
120
Innovation in the newsroom - MOS Running Order Manager
bennuttall
0
170
How to market your open source project
bennuttall
0
220
Other Decks in Programming
See All in Programming
技術的負債と戦略的に戦わざるを得ない場合のオブザーバビリティ活用術 / Leveraging Observability When Strategically Dealing with Technical Debt
yoshiyoshifujii
0
170
ts-morph実践:型を利用するcodemodのテクニック
ypresto
1
570
Rethinking Data Access: The New httpResource in Angular
manfredsteyer
PRO
0
220
複数アプリケーションを育てていくための共通化戦略
irof
8
3.2k
テスト分析入門/Test Analysis Tutorial
goyoki
13
2.8k
Use Perl as Better Shell Script
karupanerura
0
680
人には人それぞれのサービス層がある
shimabox
3
600
ワイがおすすめする新潟の食 / 20250530phpconf-niigata-eve
kasacchiful
0
280
TSConfigからTypeScriptの世界を覗く
planck16
2
1.3k
REST API設計の実践 – ベストプラクティスとその落とし穴
kentaroutakeda
2
330
抽象データ型について学んだ
ryounasso
0
210
TSConfig Solution Style & subpath imports to switch types on a per-file basis
maminami373
1
190
Featured
See All Featured
Side Projects
sachag
454
42k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
10
850
Building Flexible Design Systems
yeseniaperezcruz
329
39k
RailsConf 2023
tenderlove
30
1.1k
Testing 201, or: Great Expectations
jmmastey
42
7.5k
jQuery: Nuts, Bolts and Bling
dougneiner
63
7.8k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
129
19k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
32
5.8k
Designing Experiences People Love
moore
142
24k
Java REST API Framework Comparison - PWX 2021
mraible
31
8.6k
4 Signs Your Business is Dying
shpigford
183
22k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
137
34k
Transcript
Programming paradigms for physical computing and IoT Ben Nuttall Raspberry
Pi Foundation UK Charity 1129409
Ben Nuttall • Raspberry Pi Community Manager • Based in
Cambridge • Creator of gpiozero python library and piwheels project • Columnist on opensource.com • github.com/bennuttall • twitter.com/ben_nuttall • ben@raspberrypi.org
GPIO Pins – General Purpose Input/Output
GPIO Zero: a friendly API for GPIO devices from gpiozero
import LED led = LED(17) led.on()
Multi-paradigm: procedural (polling) from gpiozero import LED, Button led =
LED(17) button = Button(4) while True: if button.is_pressed: led.on() else: led.off()
Multi-paradigm: procedural (blocking) from gpiozero import LED, Button led =
LED(17) button = Button(4) while True: button.wait_for_press() led.on() button.wait_for_release() led.off()
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
Multi-paradigm: declarative from gpiozero import LED, Button led = LED(17)
button = Button(4) led.source = button.values
GPIO Zero supports...
GPIO Zero Device Hierarchy!
.value >>> led = PWMLED(17) >>> led.value 0.0 >>> led.on()
>>> led.value 1.0 >>> led.value = 0
.value >>> led = PWMLED(17) >>> pot = MCP3008() >>>
led.value 0.0 >>> pot.value 0.510145879738202 >>> led.value = pot.value
.value >>> while True: ... led.value = pot.value
Source / Values Output Device .value .values .source Input Device
.value .values
Source / Values Output Device .value .values .source Input Device
.value .values
Source / Values from gpiozero import LED, Button led =
LED(17) button = Button(2) led.source = button.values
Processing values Output Device .value .values .source Input Device .value
.values function
Source tools from gpiozero import Button, LED from gpiozero.tools import
negated led = LED(4) btn = Button(17) led.source = negated(btn.values)
Combining values Output Device .value .values .source Input Device .value
.values Source tool Input Device .value .values
Source tools from gpiozero import Button, LED from gpiozero.tools import
all_values button_a = Button(2) button_b = Button(3) led = LED(17) led.source = all_values(button_a.values, button_b.values)
Cross-platform • Raspbian (Raspberry Pi) • Raspberry Pi Desktop x86
(PC) • Linux (PC) • Windows (PC) • Mac OS (Mac)
Supporting multiple back-ends • RPi.GPIO • Implemented in C, current
default • RPIO • Implemented in C • pigpio • Python wrapper for C library, runs as daemon, remote pins • Native • Pure Python, limited functionality, experimental • MockPin & MockPWMPin • Pure Python, used in test suite
MockPin $ GPIOZERO_PIN_FACTORY=mock python3 >>> from gpiozero import LED >>>
led = LED(22) >>> led.blink() >>> led.value True >>> led.value False
MockPin >>> from gpiozero import LED, Button >>> led =
LED(22) >>> button = Button(23) >>> led.source = button.values >>> led.value False >>> button.pin.drive_low() >>> led.value True
pigpio - remote GPIO from Pi or PC
pigpio - remote GPIO from Pi or PC from gpiozero
import LED from gpiozero.pins.pigpio import PiGPIOFactory factory = PiGPIOFactory('192.168.0.2') led = LED(22, pin_factory=factory) led.blink()
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()
Raspberry Pi Desktop x86
Raspberry Pi Desktop x86 – Remote GPIO
Raspberry Pi Desktop x86 – GPIO expander
Internal devices • TimeOfDay • PingServer • CPUTemperature • More
coming soon • Make your own!
Energenie tortoise lamp from gpiozero import Energenie, TimeOfDay from datetime
import time lamp = Energenie(1) daytime = TimeOfDay(time(9), time(18)) lamp.source = daytime.values
Is the internet working? from gpiozero import LED, PingServer from
gpiozero.tools import negated green = LED(17) red = LED(18) google = PingServer('google.com') green.source = google.values green.source_delay = 60 red.source = negated(green.values)
CPU Temperature from gpiozero import LEDBarGraph, CPUTemperature cpu = CPUTemperature(min_temp=50,
max_temp=90) leds = LEDBarGraph(2, 3, 4, 5, 6, 7, 8, pwm=True) leds.source = cpu.values
Custom internal devices from gpiozero import InternalDevice class FileReader(InternalDevice): @property
def value(self): with open('value.txt') as f: return int(f.read().strip())
Blue Dot
Multi-paradigm: procedural (polling) from gpiozero import LED from bluedot import
BlueDot led = LED(17) bd = BlueDot() while True: if bd.is_pressed: led.on() else: led.off()
Multi-paradigm: procedural (blocking) from gpiozero import LED from bluedot import
BlueDot led = LED(17) bd = BlueDot() while True: bd.wait_for_press() led.on() bd.wait_for_release() led.off()
Multi-paradigm: event-driven from gpiozero import LED from bluedot import BlueDot
led = LED(17) bd = BlueDot() bd.when_pressed = led.on bd.when_released = led.off
Multi-paradigm: declarative from gpiozero import LED from bluedot import BlueDot
led = LED(17) bd = BlueDot() led.source = bd.values
IoT devices? from somelib import GardenLight, LightSensor, MotionSensor from gpiozero.tools
import all_values, negated garden = GardenLight() light = LightSensor() motion = MotionSensor() garden.source = all_values(negated(light.values), motion.values)
guizero
GitHub
pinout command line tool
Read the docs!
The MagPi
Programming paradigms for physical computing and IoT Ben Nuttall Raspberry
Pi Foundation UK Charity 1129409