Upload
others
View
7
Download
0
Embed Size (px)
Citation preview
Computing und Sensorik mit Python
Folie 1 Bern, 3./10. März 2017, Aegidius Plüss
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
Gymnasium Bern-Neufeld, Bremgartenstrasse 133, 3012 Bern
Teil 2: Sensoren und Aktoren am Raspberry Pi
Computing und Sensorik mit Python
Folie 2 Bern, 3./10. März 2017, Aegidius Plüss
Kursprogramm 2. Teil
Website: www.python-exemplarisch.ch/dpkkurs
Dozent: Aegidius Plüss unter Mitarbeit von Jarka Arnold
Computing und Sensorik mit Python
Folie 3 Bern, 3./10. März 2017, Aegidius Plüss
Warum Computing & Sensorik im gymnasialen Unterricht?
• Experimentieren ist wesentlicher Bestandteil der Physik
• Beim Experimentieren sind nicht nur intellektuelle Begabung nötig, sondern auch handwerkliches Können (Mechanik/Sensoren/Elektronik selbst gebaut, gelötet)
• Nicht nur pfannenfertig zur Datenerfassung/Auswertung , sondern auch zur Steuerung (Aktoren)
• Computing/Robotik/Handys sind cool (Arduino- und Raspberry Pi-Hype)
• Sensoren/Aktoren basieren auf grundlegenden physikalischen GesetzmässigkeitenMan macht also Physik im besten Sinn des Wortes (Motoren, LEDs, Potentiometer, Schalter)
• Einsatz des Computers zum Experientieren ist modern und motivierend
Computing und Sensorik mit Python
Folie 4 Bern, 3./10. März 2017, Aegidius Plüss
Übersicht Microcontroller-Architekturen
8051/8032 Enwickelt von Intel -Architektur in anderen Fabrikaten übernommen PIC ("Pick") Entwickelt von Microchip, sehr beliebt in Kleinsystemen (> 10 Milliarden) AVR, ATmega Entwickelt von Atmel, im Hobbybereich verbreitet durch Arduino ARM Entwickelt von ARM (England). Vorherrschende Architektur für 32-bit Microcontroller. Im Raspberry Pi verbaut ESP8266 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 InstruktionAVR 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
Computing und Sensorik mit Python
Folie 5 Bern, 3./10. März 2017, Aegidius Plüss
Und los geht's!
• 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)
Der RPi ist ein Linux Computer mit Bildschirm/Tastatur/Maus Nur im Notfall und für Inbetriebnahme mit Original SD-Karte empfehlenswert
Demo: booten
Alle schalten ein!
Materialliste: DPKSensorBox
Computing und Sensorik mit Python
Folie 6 Bern, 3./10. März 2017, Aegidius Plüss
• 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)
Materialliste (Fortsetzung)
Computing und Sensorik mit Python
Folie 7 Bern, 3./10. März 2017, Aegidius Plüss
Verbindung PC/Notebook-Raspi
• 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
Ethernet Ethernet
Ethernet WLAN
WLAN WLAN
• 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
WLAN-Router (Internet)
WLAN-Router (Internet)
WLAN-Router (Internet)
Host Target Router
1. Art: Ethernet-Ethernet
2. Art: WLAN-Ethernet
3. Art: WLAN-WLAN
• 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 Bewährter Router:
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
Geeignet für Poolraum
Geeignet für Homework
Geeignet für Unterrichtsraum
Computing und Sensorik mit Python
Folie 8 Bern, 3./10. März 2017, Aegidius Plüss
• Verbindung testen:
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
• 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
VNC Viewer : www.realvnc.com/download/viewer
TightVNC: www.tightvnc.com (Achtung: nur Viewer installieren)
Der Raspi als vollwertiger Linux-Computer (alles vorinstalliert, z.B. Mathematica, TigerJython, usw.)
Software installieren: sudo apt-get update sudo apt-get install <software>
Windows: Eingabeaufforderung, Mac: Terminal öffnen Eintippen: ping 192.168.0.nnn, wo nnn Ihre Zahl ist
• In TigerJython: Einstellungen | Bibliotheken Roboter auswählen, Raspberry Pi Ihre IP Adresse angeben
• Tools | Remote Terminal und man ist in der Linux Shell
Immer, wenn Verbindung nicht klappt, ping machen!
Computing und Sensorik mit Python
Folie 9 Bern, 3./10. März 2017, Aegidius Plüss
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 Entwicklung mit anderer Entwicklungsumgebung (z.B. geany oder PyCharm)
Information/Installation hier: www.python-exemplarisch.ch/rpi unter Entwicklungstools
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)
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
Remote Shell (über SSH) wie PuTTY
Computing und Sensorik mit Python
Folie 10 Bern, 3./10. März 2017, Aegidius Plüss
Fehlererkennung/Fehlermeldung erspart viel Frust Hauptmerkmal von TigerJython: Syntaxfehlermeldungen, Laufzeitrückmeldungen
Computing und Sensorik mit Python
Folie 11 Bern, 3./10. März 2017, Aegidius Plüss
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
Computing und Sensorik mit Python
Folie 12 Bern, 3./10. März 2017, Aegidius Plüss
Pinbelegung, Spannungen/Ströme • Pinbelegung GPIO 02..27 = 26 Pins
• GPIO:
Eingangsspannung: 3.3V (kein Überspannungsschutz!!)
Ausgangsspannung 0, 3.3V (max 16 mA nach oben oder unten, total kleiner als 50 mA, also typisch 2mA / pin)
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
Variante: Externe Spannungsversorgung 5 V (Pin2): NICHT AUF ÜBERSPANNUNG GESCHÜTZT! (Micro-USB Eingang bleibt leer)
• Spannungsversorgung: Micro-USB Netzgerät mit 2A
• Versorgungsspannung für externe Geräte:
Grenzwerte:
Achtung: Im Gegensatz zu Software: Nie TRIAL-AND-ERROR. Führt oft zu TRIAL-AND-NEVER!
Computing und Sensorik mit Python
Folie 13 Bern, 3./10. März 2017, Aegidius Plüss
Schema:
GND (Pin #6)
GPIO (Pin #7)
LED
270
Flache Seite Langer Draht
(Polarität beachten)
GND #6 GPIO #7
Digital Out: LED
Aufbau auf Steckplatine (Bread Board):
• Experiment: Blinkende LED
Verbindungen mit Steckplatine (Bread board)
Strombegrenzender Seriewiderstand (typisch 270 Ohm, Strom max 10 mA)
LED langer Draht bzw. flache Seite ist +
Eventuell als Test ohne Software zuerst einfach statt bei Pin #7 bei Pin #1 (3.3V) einstecken!
Computing und Sensorik mit Python
Folie 14 Bern, 3./10. März 2017, Aegidius Plüss
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
GPIO.BOARD oder GPIO. BCM
Ports initialisieren
gute Idee, damit man sieht, dass Programm wirklich startet
Nicht zu kurz (in Sekunden)
Output-Wert setzen
(man müsste am Schluss GPIO.cleanup() aufrufen)
Wir verwenden immer Pin-Nummerierung
eigentlich nicht erlaubt, bei uns aber schon!
Computing und Sensorik mit Python
Folie 15 Bern, 3./10. März 2017, Aegidius Plüss
Digital Out: Buzzer
• Active Buzzer versus Lautsprecher
Übungen:
1. Morsecode DigitalOut2.py
• Gleiches Programm wie vorhin (DigitalOut1.py)
• Active Buzzer mit 2 pins: + - (Polarität beachten
• Active Buzzer mit 3 pins: Signal - + (manchmal S und + vertauscht)
Schema:
GND (Pin #6)
GPIO (Pin #7)
Active Buzzer
+
-
(Polarität beachten)
autostart
Computing und Sensorik mit Python
Folie 16 Bern, 3./10. März 2017, Aegidius Plüss
Digital In: Schalter
• Experiment : Schalterstellung lesen und ausschreiben
Die GPIO besitzen interne Pullup/Pulldown
# DigitalIn1.py
import RPi.GPIO as GPIO
import time
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)
Verbindungen mit ELV Board. Tasten ziehen nach unten (nach GND)
Internen Pullup verwenden
Schema:
GND (Pin #6)
GPIO (Pin #22)
oder GPIO.PUP_DOWN, GPIO.PUP_OFF
"Input floating"
Schalter pollen! (wichtiger Begriff)
Bu4, Pin 4 od. 5 od. 6 od. 7 ELV Board
Bei einem Floating Input einen externen Pullup von typisch 10 kOhm verwenden
Polling Intervall sehr wichtig->anpassen
Übungen:
1. Mit Taster LED oder Buzzer ein/aus
Bu2, GND
3.3 V
Pullup
Bu2, GND
Bu4 Pin 7
GPIO #6
Computing und Sensorik mit Python
Folie 17 Bern, 3./10. März 2017, Aegidius Plüss
Lichtschranke mit Schmitt-Trigger, Verwendung eines OpAmps
• Potentiometer-Schaltung liefert variable Spannung
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
• OpAmp der in Sättigung getrieben wird (v gross)
Mitte
2
Rechts
A
8
4
1
3
2
10k
10k
Did
el
LDR
Inbetriebnahme: Bei Umgebungslicht am Pot.meter Schwelle feststellen und gerade auf "DUNKEL" gehen. Dann mit PowerBank-Taschenlampe beleuchten.
Computing und Sensorik mit Python
Folie 18 Bern, 3./10. März 2017, Aegidius Plüss
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)
1. Buzzer macht Beeps, wenn es hell ist
Beep-Thread nötig!
Übungen:
Computing und Sensorik mit Python
Folie 19 Bern, 3./10. März 2017, Aegidius Plüss
Kurze Theorie ADC und I2C-Bus 2
• 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
Computing und Sensorik mit Python
Folie 20 Bern, 3./10. März 2017, Aegidius Plüss
RaspEasy von Didel
• 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)
i2cdetect -y 1
Vorsicht beim Aufstecken des RaspEasy, dass Stecker/Buchse genau passen!
• I2C-Gerät testen mit Terminal
TigerJython->Tools->Remote Terminal
GND
GND +3.3 V
ADC links 0x4D
ADC rechts 0x48
AIN
#40 #38 #36 #32
PyTell 7-Segment
OLED Btn A #13
Btn B #12
LED left #11
LED right #7
3.3V
Computing und Sensorik mit Python
Folie 21 Bern, 3./10. März 2017, Aegidius Plüss
Analog-Digital-Wandler
• Verwendung des RaspEasy
• Potentiometer ist wichtigster Sensor-Simulator, denn es gibt eine begrenzteSpannung ab, also keine externen Spannungsquellen (Netzgeräte) verwenden
Eigene ADC bauen: Siehe Tutorial z.B. Löten eines MCP3021 auf ein Adapter-Board
# ADC1.py
import smbus
import time
print "starting..."
bus = smbus.SMBus(1)
# adc_address = 0x4D # left
adc_address = 0x48 # right
dt = 0.1
t = 0
while True:
# Reads word (16 bits) as int
rd = bus.read_word_data(adc_address, 0)
# Exchanges high and low bytes
v = ((rd & 0xFF) << 8) | ((rd & 0xFF00) >> 8)
# Ignores two least significiant bits
v = v >> 2
print "t:", t, "v:", v
t += dt
time.sleep(dt)
Modul smbus für I2C-Kommunikation
SMBus(0) für (ur)alten Raspi
I2C-Adresse des ADCs
Pollen des Device
Die 10 bits sind in einem Word (16 bit) geistreich verpackt.
Wert herausfiltern-> Bit-Jonglieren
Computing und Sensorik mit Python
Folie 22 Bern, 3./10. März 2017, Aegidius Plüss
Anwendung Analog-Digital-Wandler
1. Spannung am Didel-LDR messen 2. Hell-dunkel ausschreiben 3. Einlesen mit Funktion readADC(address)
Übungen:
Didel-LDR-Modul wirkt wie ein Spannungsteiler (Potentiometerschaltung)
22
k
A
LDR
zu 3:
# ADC-ueb3.py
import smbus
import time
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)
Function machen->Modulares Programmieren
3.3 V
AIN
GND
Computing und Sensorik mit Python
Folie 23 Bern, 3./10. März 2017, Aegidius Plüss
Optische Ausgaben (Displays)
Übungen:
1. Hochzählen bis 1000 2. Sensorwert anzeigen (Helligkeit oder Potentiometerstellung)
# 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)
siehe DgTell1-ueb2.py Dies ist bereits eine sehr schöne Anwendung!
• Oft genügen LEDs, event. farbig, event. verschieden blinkend
Ein Microcontroller-System ohne Rückmeldung sehr unprofessionell
• 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 Controller-Ressourcen (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.
Problem: Buchstaben/Zahlen in Wertigkeit umwandeln siehe DgTell1-ueb1.py (Programm übernehmen)
Computing und Sensorik mit Python
Folie 24 Bern, 3./10. März 2017, Aegidius Plüss
Sound
• Vor allem wegen Motivation
• Eingebauter Sound schlecht, man verwendet USB-Soundkarte
• Verwenden Schweizer Taschenmesser: SOX, + Kleine Python-Schicht soundplayer.py, die Linux-Commands aufruft
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
Übungen:
# Sound.py
from time import sleep
from soundplayer import SoundPlayer
import RPi.GPIO as GPIO
P_BUTTON = 13 # RaspEasy button A
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"
Demo: Sofort spielen, mit Button A stoppen und Programm beenden
Mehr als 2 Buttons mit ELV-Board!
• 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)
Computing und Sensorik mit Python
Folie 25 Bern, 3./10. März 2017, Aegidius Plüss
Abstandssensoren
Übungen:
1. Ausschreiben des Werts auf Didel-Display Verwenden von IRDistance.py
IR-Fotodiode + IR Fototransistor kombiniert in 1 Gehäuse: TCRT5000 In Hobby-Robotik weit verbreitet
Schema:
• Eigener Aufbau auf Steckboard und Anschluss an RaspEasy ADC (links oder rechts)
Achtung: So montieren, dass auf DPKRover verwendbar!
• Digitalisierter Wert auf Console ausschreiben (Gleiches Programm wie bei ADC1..py, auf linken oder rechten ADC achten)
3.3 V
3.3 V
Analog In
10 k
270
GND
Ausgangsspannung vs Distanz
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.
A
D
B C
D
A
270 10k
Kanten abgeschnitten
blau
Nichtlinarer Fit:
Siehe Programm NonLinFit.py im Verzeichnis DPKRober
Computing und Sensorik mit Python
Folie 26 Bern, 3./10. März 2017, Aegidius Plüss
Temperatursensoren
Wichtiger Sensortyp!
• Lineare Sensoren:
• NTC mit ADC oder Schmitt-Trigger
• Digitale Sensoren
Mit Bus: I2C, SPI, 1-Wire Setup/Bit-Jonglieren, z.B. MCP9800 (ELV Board siehe Unterverzeichnis mcp9800)
flach! LM35 direkt am RaspEasy einsteckenPolarität beachten!
Digitalisierter Wert auf Console ausschreiben (Gleiches Programm wie bei ADC1..py, auf linken oder rechten ADC achten)
Übungen:
1. Anzeige auf Oled-Display. Dazu downloaden: OLED1306.py und SSD1306.py
Hier Demo, zuhause selbst machen!
# Temp.py
import smbus
import time
print "starting..."
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)
Wie ADC1.py: Ausschreiben der Temperatur
(Umrechnungsfaktor 3.1 beachten)
ELV Board
LM35DZ
Computing und Sensorik mit Python
Folie 27 Bern, 3./10. März 2017, Aegidius Plüss
Aktoren: Relais, Magnete, Ventile, Leistungselektronik
• Bipolare Transistoren
• Mosfets
• Darlington-Arrays: ULN2003
Achtung bei Spulen: Wegen Abschaltspitzen Schutzdioden nötig (Clamp Diodes)
• Entspricht der Lichtleistung einer 60W-Lampe
Achtung: Aufpassen mit den hohen Spannungen! (auch für den Raspi ist es schade)
Andere typischen Anwendungen
Treiber nötig (hoher Strom, hohe Spannung)
Demo: Leistungs-LED 10V/1A (10W) über ULN2003A
• pro Ausgang 500 mA, Parallelschaltung erlaubt,
hier 2 Outputs verwenden!)
• Auf Kühlung achten
• Relaisplatine
• Wasserventil
• 230V Triac
Nur Demo, da keine 12 V verfügbar, aber Material vorhanden!
GPIO
GND DC 12V/1A extern
+
-
Lamp ULN2003A
Computing und Sensorik mit Python
Folie 28 Bern, 3./10. März 2017, Aegidius Plüss
Aktoren: Puls Width Modulation (PWM)
• Experiment: LED dimmen
• PWM Prinzip: Duty Cycle softwaremässig einstellbar
Übungen:
1. RGB-LED Farbe einstellen
Aufbau mit gewöhnlicher LED direkt an RaspEasy (kein Vorwiderstand)
RGB-LED oder LED-Streifen über Treiber (nur Demo)
# PWMDimm.py
import RPi.GPIO as GPIO
import time
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)
lang flach
Computing und Sensorik mit Python
Folie 29 Bern, 3./10. März 2017, Aegidius Plüss
Aktoren: Servomotoren mit PWM-Controller
• Mit Servomotoren bestimmter Drehwinkel softwaremässig einstellbar
• Mit ext. Spannung betreiben (5V von PowerBank)
• Berühmter Controller PCA9685 mit I2C-Interface
Benötigen kleine Library PCA9685.py
# ServoMotor1.py
# Servo motor driven by PCA9685 controller
from smbus import SMBus
from PCA9685 import PWM
import time
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
def setup():
global pwm
bus = SMBus(1) # Raspberry Pi revision 2
pwm = PWM(bus, i2c_address)
pwm.setFreq(fPWM)
def setDirection(direction):
duty = a / 180 * direction + b
pwm.setDuty(channel, duty)
print "direction =", direction, "-> duty =", duty
time.sleep(1) # allow to settle
print "starting"
setup()
while True:
setDirection(home)
for direction in range(0, 181, 10):
setDirection(direction)
setDirection(home)
PowerBank (5V)
V+ GND
+
-
GN
D (
pin
# 6
)
SCL
(pin
# 5
)
SDA
(p
in #
3)
3.3
V (
pin
# 1
)
Orange
Rot
Braun
set
setDir
GND
V+
PWM
Computing und Sensorik mit Python
Folie 30 Bern, 3./10. März 2017, Aegidius Plüss
USB-Kabel für externe 5V-Versorgung konfektionieren
1. Entzweischneiden/abisolieren (messen, welche 2 Kabel GND/5V liefern)
2. Bei GND und 5V je drei Leiter zusammen- löten (event. Halter verwenden)
3. Zwei Kabel je mit Schrumpfschlauch isolieren
4. Das Ganze mit Schrumpfschlauch stabilisieren
Computing und Sensorik mit Python
Folie 31 Bern, 3./10. März 2017, Aegidius Plüss
Aufbau des DPKRobot
1. Raspi-Befestigungslöcher auf 3mm ausbohren (gemacht) 2. Raspi mit 3 Schrauben M3x30mm und Stütze sowie Mutter auf Plattform befestigen 3. Lochplatte auflegen, mit 2 Muttern befestigen 4. 2 Breadboards mit Doppelklebband auf Lochplatte ankleben
(eventuell vorher die Bauelemente/Verkabelung vornehmen, event. bereits gemacht) 5. PowerBank mit Doppelklebeband befestigen
PowerBank mit Doppelklebeband befestigen
Computing und Sensorik mit Python
Folie 32 Bern, 3./10. März 2017, Aegidius Plüss
Aktoren: DC-Motoren (H-Brücke)
S1, S4 geschlossen: vorwärts
S2, S3 geschlossen: rückwärts
Schaltung mit der L293D H-Brücke
Prinzip:
DPKRover zusammenbauen!!!
Der L293D enthält Schutzdioden!
3.3V
GND
Pin #40
Pin #38
Pin #36
Pin #32
GND GND
GND GND
Motor A (rechts)
Motor B (links)
PowerBank
Computing und Sensorik mit Python
Folie 33 Bern, 3./10. März 2017, Aegidius Plüss
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)
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)
Die Funktionen schalten Motorzustände um!
Übungen:
1. Geschwindigkeitsregelung mit PWM
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)
Achtung: Fahrzeug aufbocken!!!
Übung machen!
Computing und Sensorik mit Python
Folie 34 Bern, 3./10. März 2017, Aegidius Plüss
DPKRover (selbstfahrendes Auto)
Pflichtenheft des Grundmodells • Fahrgestell mit 2 Motoren hinten und Kugel-Laufrolle (caster-wheel) vorne
• Steuerung mit Raspberry Pi (könnte auch Modell Zero sein)
• Spannungsversorgung mit 5 V PowerBank (keine AA-Batterien verwenden!)
• Motortreiber mit L293D H-Brücke
• Distanzmessung vorne mit IR-Sensor auf ADC (hier RaspEasy)
Modifikationen/Erweiterungen
Grundaufgabe: Fahren gegen eine Wand
• Bei Annäherung fährt der Roboter ein Stück zurück und dann wieder vorwärts
• 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!
Robotik in der Schule ist hochaktuell und sehr beliebt
• Fest zusammengebaut: Pi2Go, Bee-Bot, Thymio, usw.
• Bausatz: Lego EV3
• Zusammenbau aus Einzelteilen, Arduino, Raspberry Pi (auch im Fächern Werken, Physik)
Build-Your-Own Robot
Thymo: EPFL
Lego EV3
Pi2Go Bee-Bot
Computing und Sensorik mit Python
Folie 35 Bern, 3./10. März 2017, Aegidius Plüss
DPKRover (selbstfahrendes Auto)
Programme:
1. Endlos: Kurz geradeaus fahren: Vorwärts/Rückwärts/Stop DPKRover1.py
2. Endlos: Vorwärts fahren. Bei Annäherung an Hindernis kurz rückwärts fahren DPKRover2.py
3. Hand Follower: Immer in einem bestimmten Abstand zur Hand bleiben (Regelungsprozess) DPKRover3.py
4. Nach eigener Fantasie
Dazu bauen: Infrarot-Distanzmessung, Anschluss an RaspEasy
Wie hängen Messwert v und Distanz zusammen? Für Physikunterricht gute Übung! Verwendung von GPanel und linfit , Resultat d = a * v + b
Computing und Sensorik mit Python
Folie 36 Bern, 3./10. März 2017, Aegidius Plüss
1. Global Positioning System (GPS)
Goodies and Highlights
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 sudo apt-get updata
sudo apt-get install putty
PuTTY starten: Menu->Internet->PuTTY für Raspi Model 3 noch eine Einstellung der Taktfrequenz nötig (siehe Website)
Daten im NMEA-Format (mühsam)
Demo: GPS1.py (Rohdaten) GPS2.py (Gefiltert)
Raspi Model 3: Raspi Model 2:
Breite Länge # Sat Höhe Zeit (GMT)
Computing und Sensorik mit Python
Folie 37 Bern, 3./10. März 2017, Aegidius Plüss
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)
Swisscom: Salt
250 MB / Monat Fr.10.- / Monat
500 MB / Monat Fr.19.- / 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.
1. StoreCos.py : (Messwert-Simulation) Funktionswerte einer gedämpften harmonischen Schwingung alle 5 Sekunden in der Datenbank abspeichern
2. StoreTemp.py: Dasselbe, aber es werden echte Temperaturwerte abgespeichert
Demos: Auslesen mit einem Webbrowser (wie im 1. Kursteil)
Es gibt eine kleine Library SIM800Modem.py, welche Funktionen definiert, die in Hayes-Befehle umgesetzt werden. Typisch: resetModem(), connectGSM(), connectTCP(), sendHTTPRequest()
http://www.java-online.eu/raspiremote/showall.php?table=dataNN
http://www.java-online.eu/raspiremote/deleteall.php?table=dataNN
http://www.java-online.eu/raspiremote/showgraph.php?table=dataNN
Tabellenwerte als Text anzeigen
Tabelleninhalt löschen
Grafik anzeigen (automatischer Refresh)
Computing und Sensorik mit Python
Folie 38 Bern, 3./10. März 2017, Aegidius Plüss
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)
Computing und Sensorik mit Python
Folie 39 Bern, 3./10. März 2017, Aegidius Plüss
Goodies and Highlights
4. RemoteControl/Remote Measurement
Demo: Auf DPK-Rover: RemoteRover.py oder RemoteRoverOled.py Auf PC: RemoteControl.py
TCPServer TCPClient
Computing und Sensorik mit Python
Folie 40 Bern, 3./10. März 2017, Aegidius Plüss
www.reichelt.de allgemeines Elektronik-Material
Bezugsquellen:
www.conrad.ch allgemeines Elektronik-Material
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/dpkkurs
www.brickgate.com
www.tigerjython4kids.ch
www.aplu.ch
www.didel.ch RaspEasy, Spezialmodule
www.elv.ch allgemeines Elektronik-Material
www.jython.ch
www.python-exemplarisch.ch