Computing und Sensorik mit Python im Physikunterricht

Werbung
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
Herunterladen