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: <IP-Adresse>: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 <software> 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) | ((rd & 0xFF00) >> 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) | ((rd & 0xFF00) >> 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) | ((rd & 0xFF00) >> 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