Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Programming paradigms for physical computing an...
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Ben Nuttall
April 24, 2018
Programming
220
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Programming paradigms for physical computing and IoT
Talk given at London Raspberry Pint April 2018 meetup
Ben Nuttall
April 24, 2018
More Decks by Ben Nuttall
See All by Ben Nuttall
Numeronyms are obnoxious
bennuttall
1
760
Live Highlights in BBC iPlayer
bennuttall
0
190
Rapid prototyping in BBC News with Python and AWS
bennuttall
0
250
Rapid prototyping in BBC News with Python and AWS
bennuttall
0
190
Running a Python Package Index for Raspberry Pi
bennuttall
0
210
From Acorns to Raspberries
bennuttall
0
180
Innovation in the newsroom
bennuttall
0
240
Innovation in the newsroom - MOS Running Order Manager
bennuttall
0
260
How to market your open source project
bennuttall
0
300
Other Decks in Programming
See All in Programming
ゲームコントローラやキーボードのファームウェアをSwiftで書く
kishikawakatsumi
1
270
テストを司るデーモンに会いに行く 〜隔離した仮想マシンでテストを通すまで〜
h1d3mun3
1
600
モバイル交通系ICへのチャージ実例から考える、クロスプラットフォーム開発におけるiOS実機テスト設計とCI運用
yusuga
1
570
AgentCore CLI で進化した AWS での AI エージェントの作り方 : 必要な機能を必要な時に
icoxfog417
PRO
4
410
Streamlitで実現する自然言語データアプリ開発
ayumu_yamaguchi
1
330
SREの越境 / SRE Collaboration
y0hgi
2
290
AWSに止められる覚悟してますか?
morizo_1984
2
500
wkhtmltopdfの次どうするか問題2026
willnet
2
1.8k
パズルゲームの作り方 / how to make puzzle games
kaityo256
PRO
2
260
JAWS-UG 東京支部が始める、JAWS-UG支部コラボ / JAWS-UG lunchtime LT Collaboration
y0hgi
0
180
Rでドレミ/Do-Re-Mi_with_R
florets1
0
100
GitHubハンズオン講座 — 実務レベルのチーム開発のフローを身につけよう
junhat6
0
120
Featured
See All Featured
Producing Creativity
orderedlist
PRO
348
41k
Code Reviewing Like a Champion
maltzj
528
40k
A better future with KSS
kneath
240
18k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
Ethics towards AI in product and experience design
skipperchong
2
410
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.7k
YesSQL, Process and Tooling at Scale
rocio
174
15k
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
560
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
620
New Earth Scene 8
popppiees
4
2.6k
Building the Perfect Custom Keyboard
takai
2
890
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.9k
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 •
[email protected]
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