Computing und Sensorik mit Python
Computing und Sensorik mit Python im Physikunterricht Weiterbildungskurs der Deutschschweizerischen Physikkommission
1. Teil: Freitag, 27. Januar 2017 2. Teil: Samstag, 4. März 2017/11. März 2017
Teil 2: Sensoren und Aktoren am Raspberry Pi Gymnasium Bern-Neufeld, Bremgartenstrasse 133, 3012 Bern Bern, 3./10. März 2017, Aegidius Plüss
Folie 1
Computing und Sensorik mit Python
Kursprogramm 2. Teil
Dozent: Aegidius Plüss unter Mitarbeit von Jarka Arnold Website: www.python-exemplarisch.ch/dpkkurs Folie 2
Bern, 3./10. März 2017, Aegidius Plüss
Computing und Sensorik mit Python
Warum Computing & Sensorik im gymnasialen Unterricht? •
Experimentieren ist wesentlicher Bestandteil der Physik
•
Einsatz des Computers zum Experientieren ist modern und motivierend
•
Nicht nur pfannenfertig zur Datenerfassung/Auswertung , sondern auch zur Steuerung (Aktoren)
•
Beim Experimentieren sind nicht nur intellektuelle Begabung nötig, sondern auch handwerkliches Können (Mechanik/Sensoren/Elektronik selbst gebaut, gelötet)
•
Computing/Robotik/Handys sind cool (Arduino- und Raspberry Pi-Hype)
•
Sensoren/Aktoren basieren auf grundlegenden physikalischen Gesetzmässigkeiten Man macht also Physik im besten Sinn des Wortes (Motoren, LEDs, Potentiometer, Schalter)
Bern, 3./10. März 2017, Aegidius Plüss
Folie 3
Computing und Sensorik mit Python
Übersicht Microcontroller-Architekturen 8051/8032 PIC AVR, ATmega ARM ESP8266
Enwickelt von Intel -Architektur in anderen Fabrikaten übernommen ("Pick") Entwickelt von Microchip, sehr beliebt in Kleinsystemen (> 10 Milliarden) Entwickelt von Atmel, im Hobbybereich verbreitet durch Arduino Entwickelt von ARM (England). Vorherrschende Architektur für 32-bit Microcontroller. Im Raspberry Pi verbaut 32-bit Microcontrollermit dem Tensilica Xtensa DSP (Digital Signal Processor)
8051, PIC and AVR haben (8-bit) Harvard-Architektur, d.h. separaten Speicher für Programm und Daten ARM hat (16 oder 32-bit) von Neumann-Architektur, d.h. gemeinsamen Speicher für Programm und Daten 8051 und PIC benötigen mehrere Clockzyklen pro Instruktion AVR und ARM benötigen meist nur 1 Clockzyklus pro Instruktion (RISC) Typisch für Microcontroller: Einfacher Instruktionssatz, internes RAM, eingebaute Peripherie. Beispiel PIC:
A computer on a chip
Folie 4
Bern, 3./10. März 2017, Aegidius Plüss
Computing und Sensorik mit Python
Und los geht's! Alle schalten ein!
Der RPi ist ein Linux Computer mit Bildschirm/Tastatur/Maus Nur im Notfall und für Inbetriebnahme mit Original SD-Karte empfehlenswert Demo: booten
Materialliste: DPKSensorBox • • • • • • • • • • • •
Raspberrry Pi Modell 3 (www.reichelt.de) mit Standfüssen (3mm ausbohren) (www.conrad.ch) Netzteil (USB-Ladegerät, mind 2A) (Reichelt) SD-Karte (microSD 16 GB, Type 10) Firmware: RaspiBrick darauf kopiert (Anleitung: www.raspibrick.com) PowerBank 5V/2600mAh, RealPower PB-T1 (www.elv.ch), Doppelklebeband-Streifen angebracht STS-PI Robot Plattform (shop.pimoroni.com/products/sts-pi) ohne Exlorer Hat Mehrere Verbindungskabel m-m/m-f/f-f für Steckboard (China) Box mit Jumpers für Steckboard (China) Verbindungskabel für RaspEasy (www.didel.com) Lochplatine mit Lötpins (www.reichelt.de) Ausschnitt sägen und Löcher bohren Ohrhörer -Top Quality (China) Speisekabel USB (von PowerBank, zusätzlicher Anschluss gemäss Kurs-Doc) I2C-4 Digit 7-Segmentdisplay mit 4 Ziffern, 4 Tasten und Digital-Temperatursensor (www.elv.ch, Best.# 68105697)
• Box1: (Platikboxen 5x8 cm) www.reichelt.de) • 40 pin Header-Verlängerung (ww.4tronix.co.uk/store) • HC-SR04 Ultrasonic Sensor (China oder www.play-zone.ch) • PCA9685 PWM Driver Board (China oder www.adafruit.com) • 4 Stützen 3mm/10 mm lang (China, 4 Schrauben 3mm/30mm lang , 5 Muttern 3mm (Kiener&Wittlin) • Kamerahalter für Robot Plattform (nicht gebraucht) • Box2: • • • •
Servomotor Tower Pro SG90 mit Platikarmen (China oder www.play-zone.ch) 2 Steckboards (Breadboards) 4.5x3.3cm (China oder www.play-zone.ch) 20 Widerstände 10 kOhm/ 20 Widerstände 1kOhm (1/4W od. 1/2 W) (Elektronikhandel) USB-Sound-Adapter (China oder www.play-zone.ch) Bern, 3./10. März 2017, Aegidius Plüss
Folie 5
Computing und Sensorik mit Python
Materialliste (Fortsetzung) • Box3: • • • • • • • • • • • •
20 Widerstände 270 Ohm (1/4W od. 1/2 W) (Elektronikhandel) 2 SMD Adapter (16 pin) (China oder www.didel.com) (nicht gebraucht) Active Buzzer (2 Anschlüsse) (China oder www.play-zone.ch) 5 LED low-power, div. Farben (China oder Elektronikhandel) 2 IR-Sensoren TCRT5000 (China) 1 High-Power LED Lamp 12W/10W (China) 1 Potentiometer 47 kOhm (nicht gebraucht) (Elektronikhandel) 1 Logic-Level-Converter 3.3V-5V (nicht gebraucht) (China) LM35DZ Temperatursensor (www.reichelt.de) LM358P OpAmp (China oder www.reichelt.de, www.conrad.ch) ULN2003AN Darlington-Array Driver (China oder www.reichelt.de) L293D Double H-Bridge ((China oder www.reichelt.de)
• Box4 (alles von www.didel.com, alle Sensoren mit Anschluss passend auf REM) • RaspEasy Modul (REM) • DgTell 4-fach 7-Segmentanzeige (I2C-Adresse: 0x60) • Linear-Potentiometer 10 kOhm • LDR mit Potentiometer • IR-Distanzsensor mit Pot.meter und I2C-Interface (Adresse: 0x4D) • OLed-Display mit Verbindungskabel (Adresse: 0x3C)
Folie 6
Bern, 3./10. März 2017, Aegidius Plüss
Computing und Sensorik mit Python
Verbindung PC/Notebook-Raspi • • •
Router (DHCP) vergibt IP-Adresse an Host und an Raspi (meist im Bereich 192.168.0.nnn) Damit der Host den Raspi ansprechen kann, muss er dessen IP-Adresse kennen Zwei übliche Arten: • Mit dem Router-Manager (Client-List) • Mit einem Scanner-Programm • Angry IP Scanner (für Windows/Mac/Linux) http://angryip.org • Advanced IP Scanner (nur Windows) http://advanced-ip-scanner.com • Fing App App Store oder Google Play
•
• •
Damit der Raspi über WLAN an den Router kommt, muss er dessen SSID/Passwort kennen Default für Raspibrick-Firmware: SSID: raspilink, Passwort: aabbaabbaabb Einstellen mit RaspiBrickConfig.jar auf der Windows-Partition der SD-Karte
Host
WLAN-Router (Internet)
1. Art: Ethernet-Ethernet
Geeignet für Poolraum
Target
Router
Ethernet
Ethernet
2. Art: WLAN-Ethernet
Geeignet für Homework
WLAN-Router (Internet)
WLAN
Ethernet
3. Art: WLAN-WLAN
WLAN-Router (Internet)
Geeignet für Bewährter Router: WLAN WLAN Unterrichtsraum TP-LINK TL-WR841N siroop.ch Fr. 18.Konfigurationsanleitung auf :http://www.jython.ch/index.php?inhalt_links=navigation.inc.php&inhalt_mitte=pi2go/configRouter.inc.php
Bern, 3./10. März 2017, Aegidius Plüss
Folie 7
Computing und Sensorik mit Python
•
Verbindung testen: Windows: Eingabeaufforderung, Mac: Terminal öffnen Eintippen: ping 192.168.0.nnn, wo nnn Ihre Zahl ist Immer, wenn Verbindung nicht klappt, ping machen!
•
Remote Desktop Auf Raspi ist ein VNC-Server gestartet. Darauf zugreifen mit VNC-Client (VNC Viewer) Anmelden mit IP-Adresse und Port: :5901. Passwort: 123456 TightVNC: www.tightvnc.com (Achtung: nur Viewer installieren) VNC Viewer : www.realvnc.com/download/viewer Der Raspi als vollwertiger Linux-Computer (alles vorinstalliert, z.B. Mathematica, TigerJython, usw.)
•
In TigerJython: Einstellungen | Bibliotheken Roboter auswählen, Raspberry Pi Ihre IP Adresse angeben
•
Tools | Remote Terminal und man ist in der Linux Shell Man ist automatisch eingeloggt mit User: pi Password: raspberry
•
Etwas Linux lernen: Siehe Linux Spickzettel http://www.python-exemplarisch.ch/dpkkurs/download/linux-cheat-sheet.pdf Wichtig: Falls Admin-Rechte nötig, den Befehlen immer sudo voranstellen Software installieren: sudo apt-get update sudo apt-get install
Folie 8
Bern, 3./10. März 2017, Aegidius Plüss
Computing und Sensorik mit Python
Remote Development mit TigerJython •
Programm auf Host editieren. Dann downloaden und auf Target ausführen TigerJython starten Programm eintippen: print "Hallo DPKKurs" Downloadbutton (oder im Menu: Hunterladen/Ausführen) klicken Wichtig: das Programm darf "hängen" z.B. while True: Wichtig: Ausgaben (Fehler und print) werden in TigerJython angezeigt
•
Weitere Tools im Menü: Remote Shell (über SSH) wie PuTTY Alle mit Herunterladen/Ausführen heruntergeladenen Programm e heissen gleich: myapp.py und befinden sich in pi/scripts. Es kann auch dort ausgeführt werden in Terminal: python myapp.py Name bleibt gleich, keine Ausführung (für Module, Bibliotheken) Notbremse, fast nie nötig! Meist überflüssig , ohne Hemmungen Power weg!
Falls das Programm automatisch beim Booten starten soll, nennt man es autostart.py und lädt es runter (Modul hinterladen)
Remote Entwicklung mit anderer Entwicklungsumgebung (z.B. geany oder PyCharm) Information/Installation hier: www.python-exemplarisch.ch/rpi unter Entwicklungstools
Bern, 3./10. März 2017, Aegidius Plüss
Folie 9
Computing und Sensorik mit Python
Fehlererkennung/Fehlermeldung erspart viel Frust Hauptmerkmal von TigerJython: Syntaxfehlermeldungen, Laufzeitrückmeldungen
Folie 10
Bern, 3./10. März 2017, Aegidius Plüss
Computing und Sensorik mit Python
Management Tips •
Backup/Restore der SD-Karte (micro SD mind. 16 GB, Type 10) USB Image Tool : www.alexpage.de/ SD-Karte muss gleich gross oder grösser sein Falls was nicht geht, Original oder Backup kopieren (www.raspibrick.com)
•
Manchmal muss man SD-Karte formatieren SDFormatter: www.sdcard.org/downloads/formatter_4
Bern, 3./10. März 2017, Aegidius Plüss
Folie 11
Computing und Sensorik mit Python
Pinbelegung, Spannungen/Ströme •
Pinbelegung GPIO 02..27 = 26 Pins
Grenzwerte: GPIO:
•
Ausgangsspannung 0, 3.3V (max 16 mA nach oben oder unten, total kleiner als 50 mA, also typisch 2mA / pin) Eingangsspannung: 3.3V (kein Überspannungsschutz!!) •
Versorgungsspannung für externe Geräte: 5V Versorgung: ca. 200-300 mA geteilt mit USB-Versorgung (also sehr wenig, zu wenig für Motoren) 3.3 V Versorgung (von Model B+ an): ca 500 mA
•
Spannungsversorgung: Micro-USB Netzgerät mit 2A Variante: Externe Spannungsversorgung 5 V (Pin2): NICHT AUF ÜBERSPANNUNG GESCHÜTZT! (Micro-USB Eingang bleibt leer)
Achtung: Im Gegensatz zu Software: Nie TRIAL-AND-ERROR. Führt oft zu TRIAL-AND-NEVER!
Folie 12
Bern, 3./10. März 2017, Aegidius Plüss
Computing und Sensorik mit Python
Digital Out: LED Schema: •
Experiment: Blinkende LED
GPIO (Pin #7)
LED langer Draht bzw. flache Seite ist +
270
Verbindungen mit Steckplatine (Bread board)
Flache Seite Langer Draht
Strombegrenzender Seriewiderstand (typisch 270 Ohm, Strom max 10 mA)
Eventuell als Test ohne Software zuerst einfach statt bei Pin #7 bei Pin #1 (3.3V) einstecken!
LED
(Polarität beachten) GND (Pin #6)
Aufbau auf Steckplatine (Bread Board):
GND #6
GPIO #7 Bern, 3./10. März 2017, Aegidius Plüss
Folie 13
Computing und Sensorik mit Python
Digital Out: LED
# DigitalOut1.py import RPi.GPIO as GPIO import time P_LED = 7
# adapt to your wiring
def setup(): GPIO.setmode(GPIO.BOARD) GPIO.setup(P_LED, GPIO.OUT) print "Starting" setup() while True: GPIO.output(P_LED, GPIO.HIGH) time.sleep(0.1) GPIO.output(P_LED, GPIO.LOW) time.sleep(0.1)
GPIO Module importieren. RPI Tutorial (www.python-examplarisch.ch/rpi unter GPIO Wiki) Ports als Konstanten definieren Wir verwenden immer Pin-Nummerierung GPIO.BOARD oder GPIO. BCM Ports initialisieren gute Idee, damit man sieht, dass Programm wirklich startet eigentlich nicht erlaubt, bei uns aber schon! (man müsste am Schluss GPIO.cleanup() aufrufen) Output-Wert setzen Nicht zu kurz (in Sekunden)
Folie 14
Bern, 3./10. März 2017, Aegidius Plüss
Computing und Sensorik mit Python
Digital Out: Buzzer •
Active Buzzer versus Lautsprecher
•
Active Buzzer mit 2 pins: + - (Polarität beachten
•
Active Buzzer mit 3 pins: Signal - + (manchmal S und + vertauscht)
•
Gleiches Programm wie vorhin (DigitalOut1.py)
Schema:
GPIO (Pin #7) + Active Buzzer
(Polarität beachten) GND (Pin #6)
Übungen: 1.
Morsecode DigitalOut2.py
autostart
Bern, 3./10. März 2017, Aegidius Plüss
Folie 15
Computing und Sensorik mit Python
Digital In: Schalter •
3.3 V
Bei einem Floating Input einen externen Pullup von typisch 10 kOhm verwenden
Pullup
Schema:
Experiment : Schalterstellung lesen und ausschreiben Die GPIO besitzen interne Pullup/Pulldown
ELV Board
Verbindungen mit ELV Board. Tasten ziehen nach unten (nach GND)
Bu4, Pin 4 od. 5 od. 6 od. 7 Bu2, GND
GND (Pin #6) GPIO (Pin #22)
GPIO #6
Bu2, GND
# DigitalIn1.py import RPi.GPIO as GPIO import time Bu4 Pin 7 P_BUTTON = 22 # adapt to your wiring def setup(): GPIO.setmode(GPIO.BOARD) GPIO.setup(P_BUTTON, GPIO.IN, GPIO.PUD_UP) print "Starting" setup() dt = 0.1 while True: v = GPIO.input(P_BUTTON) if v == GPIO.LOW: print LOW" else: print "HIGH" time.sleep(dt)
Folie 16
Internen Pullup verwenden oder GPIO.PUP_DOWN, GPIO.PUP_OFF "Input floating"
Übungen: Schalter pollen! (wichtiger Begriff)
1.
Mit Taster LED oder Buzzer ein/aus
Polling Intervall sehr wichtig->anpassen
Bern, 3./10. März 2017, Aegidius Plüss
Computing und Sensorik mit Python
Lichtschranke mit Schmitt-Trigger, Verwendung eines OpAmps Schema (Aufbau auf Steckboard):
Theorie des LDR: Widerstand nimmt mit Beleuchtung ab (Photonen befördern Elektronen ins Leitungsband)
•
Spannungsmessung erfordert ADC (später). Für Lichtschranke nur Schwelle wichtig->Digitaler Wert
•
Potentiometer-Schaltung liefert variable Spannung
•
OpAmp der in Sättigung getrieben wird (v gross)
Rechts
10k
2
Didel LDR
•
8
Mitte
1
3 4
2
10k
A
Inbetriebnahme: Bei Umgebungslicht am Pot.meter Schwelle feststellen und gerade auf "DUNKEL" gehen. Dann mit PowerBank-Taschenlampe beleuchten.
Bern, 3./10. März 2017, Aegidius Plüss
Folie 17
Computing und Sensorik mit Python
Lichtschranke mit Schmitt-Trigger, Verwendung eines OpAmps # LDR-OPAMP.py import RPi.GPIO as GPIO import time # Digital input P_LDR = 40 # adapt to your wiring def setup(): GPIO.setmode(GPIO.BOARD) GPIO.setup(P_LDR, GPIO.IN, GPIO.PUD_UP) print "Starting" setup() while True: v = GPIO.input(P_LDR) if v == GPIO.LOW: print "Dunkel" else: print "Hell" time.sleep(0.1)
Folie 18
Übungen: 1.
Buzzer macht Beeps, wenn es hell ist
Beep-Thread nötig!
Bern, 3./10. März 2017, Aegidius Plüss
Computing und Sensorik mit Python
Kurze Theorie ADC und I22C-Bus •
Siehe Tutorial
•
Sehr wichtiges Bauelement in allen Microcontroller-Anwendungen, oft in uC integriert Designentscheid bei Raspberry Pi: ADC nach eigener Wahl, daher extern
• Wichtigste Eigenschaften: • Bitbreite (typisch 8, 10, 12 bit, d.h. bei 10 bit ist die Auflösung 1024, d.h. der Spannungsschritt bei 3.3V ca. 3 mV) • Umwandlungsgeschwindigkeit/bzw. Taktfrequenz: typisch 100 Hz (langsam), 100 kHz (schnell), man muss die Daten aber auch noch übertragen/verarbeiten! • Datenübertragung (Kommunikationstechnik) mit Bus: • Es gibt einen Master und mehrere Slaves • Es braucht Vereinbarungen (Kommunikationsprotokoll) • Typisch: Slaves haben eine Adresse und "hören" Der Master sendet Adresse und ist dann mit diesem Slave verbunden, die anderen schweigen gefälligst • Das I2C-Protokoll verwendet 3 Leitungen: GND, SDA (Serial Data) SCL (Serial Clock). SCL gibt den Takt vor, mit dem die einzelnen Bits übertragen werden
•
Master Slave 1 Slave 2 Slave 3
Bei I2C werden die Adressen gewöhnlich in Hex-Form geschrieben. 1 Hex-Ziffer 0..9, A, B, C, D, E, F einspricht 4 bits, zwei Hex-Ziffern also 8 bits, z.B. 0x4A = 0010'1010
Bern, 3./10. März 2017, Aegidius Plüss
Folie 19
Computing und Sensorik mit Python •
RaspEasy von Didel
TigerJython->Tools->Remote Terminal i2cdetect -y 1
Vorsicht beim Aufstecken des RaspEasy, dass Stecker/Buchse genau passen! • • • • •
Alle GPIOs geschützt auf Überspannung und mit 470 Ohm Seriewiderstand (LEDs direkt einsetzbar) 2 Button 2 LEDs 2 ADCs Sockel für I2C (3.3V und 5 V)
#40 #38 #36 #32
GND AIN 3.3V
Folie 20
I2C-Gerät testen mit Terminal
GND
+3.3 V
Btn B ADC ADC Btn A #13 #12 PyTell links rechts LED 7-Segment LED 0x4D 0x48 right left #7 #11
OLED
Bern, 3./10. März 2017, Aegidius Plüss
Computing und Sensorik mit Python
Analog-Digital-Wandler •
Verwendung des RaspEasy
•
Potentiometer ist wichtigster Sensor-Simulator, denn es gibt eine begrenzte Spannung ab, also keine externen Spannungsquellen (Netzgeräte) verwenden
# ADC1.py import smbus import time
Modul smbus für I2C-Kommunikation
print "starting..." SMBus(0) für (ur)alten Raspi bus = smbus.SMBus(1) # adc_address = 0x4D # left adc_address = 0x48 # right I2C-Adresse des ADCs dt = 0.1 t = 0 Pollen des Device while True: # Reads word (16 bits) as int Die 10 bits sind in einem Word (16 bit) rd = bus.read_word_data(adc_address, 0) geistreich verpackt. # Exchanges high and low bytes v = ((rd & 0xFF) > 8) Wert herausfiltern-> Bit-Jonglieren # Ignores two least significiant bits v = v >> 2 print "t:", t, "v:", v t += dt time.sleep(dt)
Eigene ADC bauen: Siehe Tutorial z.B. Löten eines MCP3021 auf ein Adapter-Board
Bern, 3./10. März 2017, Aegidius Plüss
Folie 21
Computing und Sensorik mit Python
Anwendung Analog-Digital-Wandler Übungen: Spannung am Didel-LDR messen Hell-dunkel ausschreiben Einlesen mit Funktion readADC(address)
Didel-LDR-Modul wirkt wie ein Spannungsteiler (Potentiometerschaltung)
3.3 V
LDR
1. 2. 3.
AIN
A
# ADC-ueb3.py
22 k
zu 3: GND
import smbus import time
Function machen->Modulares Programmieren def readADC(address): rd = bus.read_word_data(address, 0) v = ((rd & 0xFF) > 8) v = v >> 2 return v print "starting..." bus = smbus.SMBus(1) dt = 0.1 t = 0 while True: v = readADC(0x48) # right print "t:", t, "v:", v t += dt time.sleep(dt)
Folie 22
Bern, 3./10. März 2017, Aegidius Plüss
Computing und Sensorik mit Python
Optische Ausgaben (Displays)
Ein Microcontroller-System ohne Rückmeldung sehr unprofessionell
•
Oft genügen LEDs, event. farbig, event. verschieden blinkend
•
7-Sement-Displays sind relativ einfach anzusteuern, sind noch immer weit verbreitet
•
Alphanumerische Displays (Flüssigkristallanzeigen (LCDs), LEDs, Oleds) sind modern und billig, benötigen aber viele ControllerRessourcen (Font in Pixel umwandeln)
•
Elegant: 7-Segmentanzeigen mit I2C-Interface, z.B. Didel's DgTell, ELV DgTell auf RaspEasy an I2C-Connector einstecken, Protokoll: Liste mit 4 Zahlen 0..255 für die 4 Ziffern Jedes Segment hat eine Wertigkeit.
# DgTell1.py import smbus display_address = 0x60 bus = smbus.SMBus(1) cmd = 1 # segment mode data = [63, 6, 91, 79] # 0123 bus.write_block_data(display_address, cmd, data)
Problem: Buchstaben/Zahlen in Wertigkeit umwandeln siehe DgTell1-ueb1.py (Programm übernehmen)
Übungen: 1. 2.
Hochzählen bis 1000 Sensorwert anzeigen (Helligkeit oder Potentiometerstellung)
siehe DgTell1-ueb2.py Dies ist bereits eine sehr schöne Anwendung!
Bern, 3./10. März 2017, Aegidius Plüss
Folie 23
Computing und Sensorik mit Python
Sound •
Vor allem wegen Motivation
•
Eingebauter Sound schlecht, man verwendet USB-Soundkarte
•
Verwenden Schweizer Taschenmesser: SOX, + Kleine PythonSchicht soundplayer.py, die Linux-Commands aufruft Demo: Sofort spielen, mit Button A stoppen und Programm beenden # Sound.py from time import sleep from soundplayer import SoundPlayer import RPi.GPIO as GPIO P_BUTTON = 13 # RaspEasy button A
• Voraussetzung: hunger.py mit FTP auf Raspi kopiert (WinSCP , Filezila) -> zeigen • soundplayer.py in Editor nehmen • unter Tools->Herunterladen auf Raspi laden • RaspEasy verwenden (Buttons)
def setup(): GPIO.setmode(GPIO.BOARD) GPIO.setup(P_BUTTON, GPIO.IN) print "Starting" setup() # Use device with ID 1 (mostly USB audio adapter) p = SoundPlayer("/home/pi/Music/hunger.mp3", 1) p.play() while p.isPlaying(): v = GPIO.input(P_BUTTON) if v == GPIO.HIGH: p.stop() sleep(0.5) # nicht zu kurz (Schalterprellen)! print "Done"
Übungen: 1. Mit Button B Abspielen starten, mit Button A stoppen und Programm beenden (wie vorher) 2. Mit Button B Abspielen starten, mit Button A stoppen, aber mit A erneut spielen. Mit beiden Buttons Stoppen und Programm beenden
Mehr als 2 Buttons mit ELV-Board! Folie 24
Bern, 3./10. März 2017, Aegidius Plüss
Computing und Sensorik mit Python
Abstandssensoren IR-Fotodiode + IR Fototransistor kombiniert in 1 Gehäuse: TCRT5000 In Hobby-Robotik weit verbreitet
3.3 V
Schema:
D
A
C
B
10k
•
Eigener Aufbau auf Steckboard und Anschluss an RaspEasy ADC (links oder rechts)
•
Digitalisierter Wert auf Console ausschreiben (Gleiches Programm wie bei ADC1..py, auf linken oder rechten ADC achten)
270 3.3 V
Nichtlinarer Fit:
Ausgangsspannung vs Distanz
10 k Siehe Programm NonLinFit.py im Verzeichnis DPKRober
D
A
blau
GND
Übungen: 1.
Kanten abgeschnitten
Analog In
270
Achtung: So montieren, dass auf DPKRover verwendbar!
Ausschreiben des Werts auf Didel-Display Verwenden von IRDistance.py
Dieser Sensor kann auch wie eine Lichtschranke ohne ADC direkt mit dem GPIO ausgelesen werden, wenn man einen Schmitt-Trigger (z.B. OpAmp) dazwischen schaltet. Bern, 3./10. März 2017, Aegidius Plüss
Folie 25
Computing und Sensorik mit Python
Temperatursensoren
• NTC mit ADC oder Schmitt-Trigger
Wichtiger Sensortyp! Wie ADC1.py: Ausschreiben der Temperatur (Umrechnungsfaktor 3.1 beachten) # Temp.py import smbus import time
• Lineare Sensoren:
Digitalisierter Wert auf Console ausschreiben (Gleiches Programm wie bei ADC1..py, auf print "starting..." linken oder rechten ADC achten) bus = smbus.SMBus(1) adc_address = 0x48 # right #adc_address = 0x4D # left dt = 0.1 t = 0 while True: rd = bus.read_word_data(adc_address, 0) v = ((rd & 0xFF) > 8) v = v >> 2 print "t:", t, "v:", v / 3.1 t += dt time.sleep(dt)
LM35DZ
flach! LM35 direkt am RaspEasy einstecken Polarität beachten!
• Digitale Sensoren Mit Bus: I2C, SPI, 1-Wire Setup/Bit-Jonglieren, z.B. MCP9800 (ELV Board siehe Unterverzeichnis mcp9800) Hier Demo, zuhause selbst machen! Folie 26
Übungen: 1.
ELV Board
Anzeige auf Oled-Display. Dazu downloaden: OLED1306.py und SSD1306.py
Bern, 3./10. März 2017, Aegidius Plüss
Computing und Sensorik mit Python
Aktoren: Relais, Magnete, Ventile, Leistungselektronik Treiber nötig (hoher Strom, hohe Spannung) •
Bipolare Transistoren
•
Mosfets
•
Darlington-Arrays: ULN2003 Achtung bei Spulen: Wegen Abschaltspitzen Schutzdioden nötig (Clamp Diodes) ULN2003A
Lamp
Demo: Leistungs-LED 10V/1A (10W) über ULN2003A pro Ausgang 500 mA, Parallelschaltung erlaubt,
•
GPIO
hier 2 Outputs verwenden!) •
Entspricht der Lichtleistung einer 60W-Lampe
•
Auf Kühlung achten
Andere typischen Anwendungen •
Relaisplatine
•
Wasserventil
•
230V Triac
+ DC 12V/1A extern -
GND
Nur Demo, da keine 12 V verfügbar, aber Material vorhanden!
Achtung: Aufpassen mit den hohen Spannungen! (auch für den Raspi ist es schade) Bern, 3./10. März 2017, Aegidius Plüss
Folie 27
Computing und Sensorik mit Python
Aktoren: Puls Width Modulation (PWM) •
PWM Prinzip: Duty Cycle softwaremässig einstellbar
•
Experiment: LED dimmen
# PWMDimm.py import RPi.GPIO as GPIO import time
Aufbau mit gewöhnlicher LED direkt an RaspEasy (kein Vorwiderstand)
P_LED = 32 # adapt to your wiring fPWM = 60 # Hz (not higher with software PWM) def setup(): global pwm GPIO.setmode(GPIO.BOARD) GPIO.setup(P_LED, GPIO.OUT) pwm = GPIO.PWM(P_LED, fPWM) pwm.start(0) print "starting" setup() duty = 0 isIncreasing = True while True: pwm.ChangeDutyCycle(duty) print "D =", duty, "%" if isIncreasing: duty += 5 else: duty -= 5 if duty == 100: isIncreasing = False if duty == 0: isIncreasing = True time.sleep(0.5) Folie 28
lang flach
Übungen: 1.
RGB-LED Farbe einstellen
RGB-LED oder LED-Streifen über Treiber (nur Demo)
Bern, 3./10. März 2017, Aegidius Plüss
Computing und Sensorik mit Python
Aktoren: Servomotoren mit PWM-Controller
# ServoMotor1.py # Servo motor driven by PCA9685 controller
Mit Servomotoren bestimmter Drehwinkel softwaremässig einstellbar
•
•
•
from smbus import SMBus from PCA9685 import PWM import time
Mit ext. Spannung betreiben (5V von PowerBank)
fPWM = 50 i2c_address = 0x40 # (standard) adapt to your module channel = 0 # adapt to your wiring a = 8.3 # adapt to your servo b = 2 # adapt to your servo home = 90
Berühmter Controller PCA9685 mit I2C-Interface
def setup(): global pwm bus = SMBus(1) # Raspberry Pi revision 2 pwm = PWM(bus, i2c_address) pwm.setFreq(fPWM)
Benötigen kleine Library PCA9685.py + V+
PowerBank (5V)
GND
def setDirection(direction): duty = a / 180 * direction + b pwm.setDuty(channel, duty) print "direction =", direction, "-> duty =", duty time.sleep(1) # allow to settle
3.3V (pin # 1)
SCL (pin # 5)
SDA (pin # 3)
GND (pin # 6)
print "starting" setup() while True: setDirection(home) for direction in range(0, 181, 10): set setDirection(direction) setDir setDirection(home) PWM
Orange
V+ GND
Braun
Rot
Bern, 3./10. März 2017, Aegidius Plüss
Folie 29
Computing und Sensorik mit Python
USB-Kabel für externe 5V-Versorgung konfektionieren
1. Entzweischneiden/abisolieren (messen, welche 2 Kabel GND/5V liefern)
3. Zwei Kabel je mit Schrumpfschlauch isolieren
Folie 30
2. Bei GND und 5V je drei Leiter zusammenlöten (event. Halter verwenden)
4. Das Ganze mit Schrumpfschlauch stabilisieren
Bern, 3./10. März 2017, Aegidius Plüss
Computing und Sensorik mit Python
Aufbau des DPKRobot
1. 2. 3. 4. 5.
Raspi-Befestigungslöcher auf 3mm ausbohren (gemacht) Raspi mit 3 Schrauben M3x30mm und Stütze sowie Mutter auf Plattform befestigen Lochplatte auflegen, mit 2 Muttern befestigen 2 Breadboards mit Doppelklebband auf Lochplatte ankleben (eventuell vorher die Bauelemente/Verkabelung vornehmen, event. bereits gemacht) PowerBank mit Doppelklebeband befestigen
Bern, 3./10. März 2017, Aegidius Plüss
Folie 31
Computing und Sensorik mit Python
Aktoren: DC-Motoren (H-Brücke)
Prinzip: Schaltung mit der L293D H-Brücke 3.3V
Pin #40
Pin #36
S1, S4 geschlossen: vorwärts S2, S3 geschlossen: rückwärts DPKRover zusammenbauen!!!
Motor A (rechts)
GND
Motor B (links)
GND
Pin #38
Pin #32
GND GND
GND
PowerBank
Der L293D enthält Schutzdioden!
Folie 32
Bern, 3./10. März 2017, Aegidius Plüss
Computing und Sensorik mit Python
Motor A vorwärts, rückwärts, stop # Motor1.py # MotorA forward/backward/stop import RPi.GPIO as GPIO import time P_MOTA1 = 40 P_MOTA2 = 38 def forward(): GPIO.output(P_MOTA1, GPIO.HIGH) GPIO.output(P_MOTA2, GPIO.LOW) def backward(): GPIO.output(P_MOTA1, GPIO.LOW) GPIO.output(P_MOTA2, GPIO.HIGH)
Achtung: Fahrzeug aufbocken!!! print "starting" setup() while True: print "State 'forward'" forward() time.sleep(2) print "State 'stop'" stop() time.sleep(2) print "State 'backward'" backward() time.sleep(2) print "State 'stop'" stop() time.sleep(2)
def stop(): GPIO.output(P_MOTA1, GPIO.LOW) GPIO.output(P_MOTA2, GPIO.LOW) def setup(): GPIO.setmode(GPIO.BOARD) GPIO.setup(P_MOTA1, GPIO.OUT) GPIO.setup(P_MOTA2, GPIO.OUT)
Übungen: 1.
Geschwindigkeitsregelung mit PWM
Übung machen! Die Funktionen schalten Motorzustände um!
Bern, 3./10. März 2017, Aegidius Plüss
Folie 33
Computing und Sensorik mit Python
DPKRover (selbstfahrendes Auto) Robotik in der Schule ist hochaktuell und sehr beliebt • Fest zusammengebaut: Pi2Go, Bee-Bot, Thymio, usw. Pi2Go Bee-Bot • Bausatz: Lego EV3 • Zusammenbau aus Einzelteilen, Arduino, Raspberry Pi (auch im Fächern Werken, Physik)
Pflichtenheft des Grundmodells
Thymo: EPFL
Build-Your-Own Robot
• Fahrgestell mit 2 Motoren hinten und Kugel-Laufrolle (caster-wheel) vorne • Steuerung mit Raspberry Pi (könnte auch Modell Zero sein)
Lego EV3
• Spannungsversorgung mit 5 V PowerBank (keine AA-Batterien verwenden!) • Motortreiber mit L293D H-Brücke • Distanzmessung vorne mit IR-Sensor auf ADC (hier RaspEasy)
Grundaufgabe: Fahren gegen eine Wand • Bei Annäherung fährt der Roboter ein Stück zurück und dann wieder vorwärts
Modifikationen/Erweiterungen • Verwendung der zwei Buttons • Verwendung des Displays • Ultrasonic-Distanzmessung • 2 Infrarot-Sensoren nach unten zur Spurhaltung (Fahren auf Streifen) • Verwendung eines Buzzers • Nach eigener Fantasie! Folie 34
Bern, 3./10. März 2017, Aegidius Plüss
Computing und Sensorik mit Python
DPKRover (selbstfahrendes Auto) Dazu bauen: Infrarot-Distanzmessung, Anschluss an RaspEasy
Programme: 1.
2.
3.
4.
Endlos: Kurz geradeaus fahren: Vorwärts/Rückwärts/Stop DPKRover1.py Endlos: Vorwärts fahren. Bei Annäherung an Hindernis kurz rückwärts fahren DPKRover2.py Hand Follower: Immer in einem bestimmten Abstand zur Hand bleiben (Regelungsprozess) DPKRover3.py Nach eigener Fantasie Wie hängen Messwert v und Distanz zusammen? Für Physikunterricht gute Übung! Verwendung von GPanel und linfit , Resultat d = a * v + b
Bern, 3./10. März 2017, Aegidius Plüss
Folie 35
Computing und Sensorik mit Python
Goodies and Highlights 1.
Global Positioning System (GPS) Idee: Triangulation GPS-Module sind billig, siehe www.python-exemplarisch.ch/rpi GPS-Module verwenden meist die serielle Schnittstelle (RS232, schon sehr lange bekannt)
Man kann die Daten zum Test mit einem Terminal-Emulator, z.B. PuTTY, ansehen. Empfehlenswert! Dazu mit VNC auf Raspi gehen.
PuTTY installieren
PuTTY starten: Menu->Internet->PuTTY
sudo apt-get updata sudo apt-get install putty
für Raspi Model 3 noch eine Einstellung der Taktfrequenz nötig (siehe Website)
Raspi Model 3:
Raspi Model 2:
Daten im NMEA-Format (mühsam) Demo: GPS1.py (Rohdaten) GPS2.py (Gefiltert) Folie 36
Zeit (GMT)
Breite
Länge
# Sat
Höhe
Bern, 3./10. März 2017, Aegidius Plüss
Computing und Sensorik mit Python
Goodies and Highlights 2.
Global System for Mobile Communication (GSM) • Älteres Handy-Verbindungs-Protokoll, heute abgelöst durch UMTS, 2G, 3G, 4G (schneller, weniger Bandbreite) • GSM-Module billig (siehe Website) • Man benötigt eine SIM-Karte, d.h. ein Handy-Abo (für Datentransfer offen, nicht nur Telefon, event. NUR für Datenverkehr) Salt
Swisscom:
500 MB / Monat Fr.19.- / Monat
250 MB / Monat Fr.10.- / Monat
Man kommuniziert mit dem GSM-Modem wieder über eine serielle Schnittstelle. Wie vor 40 Jahren mit den ersten Telefon-Modems verwendet man den sogenannten Hayes-Befehlssatz. Es gibt eine kleine Library SIM800Modem.py, welche Funktionen definiert, die in Hayes-Befehle umgesetzt werden. Typisch: resetModem(), connectGSM(), connectTCP(), sendHTTPRequest()
Demos: 1. 2.
Auslesen mit einem Webbrowser (wie im 1. Kursteil)
StoreCos.py : (Messwert-Simulation) Funktionswerte einer gedämpften harmonischen Schwingung alle 5 Sekunden in der Datenbank abspeichern StoreTemp.py: Dasselbe, aber es werden echte Temperaturwerte abgespeichert
http://www.java-online.eu/raspiremote/showall.php?table=dataNN Tabellenwerte als Text anzeigen http://www.java-online.eu/raspiremote/showgraph.php?table=dataNN Grafik anzeigen (automatischer Refresh) Tabelleninhalt löschen http://www.java-online.eu/raspiremote/deleteall.php?table=dataNN Bern, 3./10. März 2017, Aegidius Plüss
Folie 37
Computing und Sensorik mit Python
Goodies and Highlights 3.
Ultrasonic Modul HC-SR04 (im Sensorkit vorhanden)
D = c * t = 343 * 700*10-6 = 0.24 m -> d = 12 cm
Demo: Ultrasonic1.py Interessanter Algorithmus, um mit GPIO den Trigger-Puls zu erzeugen und die Länge des Echo-Pulses zu messen (kritisch wegen kurzen Zeiten)
Folie 38
Bern, 3./10. März 2017, Aegidius Plüss
Computing und Sensorik mit Python
Goodies and Highlights 4.
RemoteControl/Remote Measurement
TCPClient
TCPServer
Demo: Auf DPK-Rover: RemoteRover.py oder RemoteRoverOled.py Auf PC: RemoteControl.py
Bern, 3./10. März 2017, Aegidius Plüss
Folie 39
Computing und Sensorik mit Python
Bezugsquellen: www.reichelt.de allgemeines Elektronik-Material www.conrad.ch allgemeines Elektronik-Material www.elv.ch allgemeines Elektronik-Material www.didel.ch RaspEasy, Spezialmodule www.ebay.com Suche nach einem bestimmten Artikel, Lieferung von China meist günstig www.aliexpress.com Suche nach chinesischem Lieferanten www.pi-shop.ch Auf Raspberry Pi und Zubehör spezialisiert www.pimoroni.com Robotik-Material, schnelle problemlose Lieferung aus England 4tronix.co.uk Robotik-Material, schnelle problemlose Lieferung aus England
Links: www.python-exemplarisch.ch www.python-exemplarisch.ch/dpkkurs www.brickgate.com www.tigerjython4kids.ch www.aplu.ch www.jython.ch Folie 40
Bern, 3./10. März 2017, Aegidius Plüss