Computing und Sensorik mit Python im Physikunterricht

Computing und Sensorik mit Python Computing und Sensorik mit Python im Physikunterricht Weiterbildungskurs der Deutschschweizerischen Physikkommissio...
3 downloads 0 Views 1MB Size
Computing und Sensorik mit Python

Computing und Sensorik mit Python im Physikunterricht Weiterbildungskurs der Deutschschweizerischen Physikkommission

1. Teil: Freitag, 27. Januar 2017 2. Teil: Samstag, 4. März 2017/11. März 2017

Teil 2: Sensoren und Aktoren am Raspberry Pi Gymnasium Bern-Neufeld, Bremgartenstrasse 133, 3012 Bern Bern, 3./10. März 2017, Aegidius Plüss

Folie 1

Computing und Sensorik mit Python

Kursprogramm 2. Teil

Dozent: Aegidius Plüss unter Mitarbeit von Jarka Arnold Website: www.python-exemplarisch.ch/dpkkurs Folie 2

Bern, 3./10. März 2017, Aegidius Plüss

Computing und Sensorik mit Python

Warum Computing & Sensorik im gymnasialen Unterricht? •

Experimentieren ist wesentlicher Bestandteil der Physik



Einsatz des Computers zum Experientieren ist modern und motivierend



Nicht nur pfannenfertig zur Datenerfassung/Auswertung , sondern auch zur Steuerung (Aktoren)



Beim Experimentieren sind nicht nur intellektuelle Begabung nötig, sondern auch handwerkliches Können (Mechanik/Sensoren/Elektronik selbst gebaut, gelötet)



Computing/Robotik/Handys sind cool (Arduino- und Raspberry Pi-Hype)



Sensoren/Aktoren basieren auf grundlegenden physikalischen Gesetzmässigkeiten Man macht also Physik im besten Sinn des Wortes (Motoren, LEDs, Potentiometer, Schalter)

Bern, 3./10. März 2017, Aegidius Plüss

Folie 3

Computing und Sensorik mit Python

Übersicht Microcontroller-Architekturen 8051/8032 PIC AVR, ATmega ARM ESP8266

Enwickelt von Intel -Architektur in anderen Fabrikaten übernommen ("Pick") Entwickelt von Microchip, sehr beliebt in Kleinsystemen (> 10 Milliarden) Entwickelt von Atmel, im Hobbybereich verbreitet durch Arduino Entwickelt von ARM (England). Vorherrschende Architektur für 32-bit Microcontroller. Im Raspberry Pi verbaut 32-bit Microcontrollermit dem Tensilica Xtensa DSP (Digital Signal Processor)

8051, PIC and AVR haben (8-bit) Harvard-Architektur, d.h. separaten Speicher für Programm und Daten ARM hat (16 oder 32-bit) von Neumann-Architektur, d.h. gemeinsamen Speicher für Programm und Daten 8051 und PIC benötigen mehrere Clockzyklen pro Instruktion AVR und ARM benötigen meist nur 1 Clockzyklus pro Instruktion (RISC) Typisch für Microcontroller: Einfacher Instruktionssatz, internes RAM, eingebaute Peripherie. Beispiel PIC:

A computer on a chip

Folie 4

Bern, 3./10. März 2017, Aegidius Plüss

Computing und Sensorik mit Python

Und los geht's! Alle schalten ein!

Der RPi ist ein Linux Computer mit Bildschirm/Tastatur/Maus Nur im Notfall und für Inbetriebnahme mit Original SD-Karte empfehlenswert Demo: booten

Materialliste: DPKSensorBox • • • • • • • • • • • •

Raspberrry Pi Modell 3 (www.reichelt.de) mit Standfüssen (3mm ausbohren) (www.conrad.ch) Netzteil (USB-Ladegerät, mind 2A) (Reichelt) SD-Karte (microSD 16 GB, Type 10) Firmware: RaspiBrick darauf kopiert (Anleitung: www.raspibrick.com) PowerBank 5V/2600mAh, RealPower PB-T1 (www.elv.ch), Doppelklebeband-Streifen angebracht STS-PI Robot Plattform (shop.pimoroni.com/products/sts-pi) ohne Exlorer Hat Mehrere Verbindungskabel m-m/m-f/f-f für Steckboard (China) Box mit Jumpers für Steckboard (China) Verbindungskabel für RaspEasy (www.didel.com) Lochplatine mit Lötpins (www.reichelt.de) Ausschnitt sägen und Löcher bohren Ohrhörer -Top Quality (China) Speisekabel USB (von PowerBank, zusätzlicher Anschluss gemäss Kurs-Doc) I2C-4 Digit 7-Segmentdisplay mit 4 Ziffern, 4 Tasten und Digital-Temperatursensor (www.elv.ch, Best.# 68105697)

• Box1: (Platikboxen 5x8 cm) www.reichelt.de) • 40 pin Header-Verlängerung (ww.4tronix.co.uk/store) • HC-SR04 Ultrasonic Sensor (China oder www.play-zone.ch) • PCA9685 PWM Driver Board (China oder www.adafruit.com) • 4 Stützen 3mm/10 mm lang (China, 4 Schrauben 3mm/30mm lang , 5 Muttern 3mm (Kiener&Wittlin) • Kamerahalter für Robot Plattform (nicht gebraucht) • Box2: • • • •

Servomotor Tower Pro SG90 mit Platikarmen (China oder www.play-zone.ch) 2 Steckboards (Breadboards) 4.5x3.3cm (China oder www.play-zone.ch) 20 Widerstände 10 kOhm/ 20 Widerstände 1kOhm (1/4W od. 1/2 W) (Elektronikhandel) USB-Sound-Adapter (China oder www.play-zone.ch) Bern, 3./10. März 2017, Aegidius Plüss

Folie 5

Computing und Sensorik mit Python

Materialliste (Fortsetzung) • Box3: • • • • • • • • • • • •

20 Widerstände 270 Ohm (1/4W od. 1/2 W) (Elektronikhandel) 2 SMD Adapter (16 pin) (China oder www.didel.com) (nicht gebraucht) Active Buzzer (2 Anschlüsse) (China oder www.play-zone.ch) 5 LED low-power, div. Farben (China oder Elektronikhandel) 2 IR-Sensoren TCRT5000 (China) 1 High-Power LED Lamp 12W/10W (China) 1 Potentiometer 47 kOhm (nicht gebraucht) (Elektronikhandel) 1 Logic-Level-Converter 3.3V-5V (nicht gebraucht) (China) LM35DZ Temperatursensor (www.reichelt.de) LM358P OpAmp (China oder www.reichelt.de, www.conrad.ch) ULN2003AN Darlington-Array Driver (China oder www.reichelt.de) L293D Double H-Bridge ((China oder www.reichelt.de)

• Box4 (alles von www.didel.com, alle Sensoren mit Anschluss passend auf REM) • RaspEasy Modul (REM) • DgTell 4-fach 7-Segmentanzeige (I2C-Adresse: 0x60) • Linear-Potentiometer 10 kOhm • LDR mit Potentiometer • IR-Distanzsensor mit Pot.meter und I2C-Interface (Adresse: 0x4D) • OLed-Display mit Verbindungskabel (Adresse: 0x3C)

Folie 6

Bern, 3./10. März 2017, Aegidius Plüss

Computing und Sensorik mit Python

Verbindung PC/Notebook-Raspi • • •

Router (DHCP) vergibt IP-Adresse an Host und an Raspi (meist im Bereich 192.168.0.nnn) Damit der Host den Raspi ansprechen kann, muss er dessen IP-Adresse kennen Zwei übliche Arten: • Mit dem Router-Manager (Client-List) • Mit einem Scanner-Programm • Angry IP Scanner (für Windows/Mac/Linux) http://angryip.org • Advanced IP Scanner (nur Windows) http://advanced-ip-scanner.com • Fing App App Store oder Google Play



• •

Damit der Raspi über WLAN an den Router kommt, muss er dessen SSID/Passwort kennen Default für Raspibrick-Firmware: SSID: raspilink, Passwort: aabbaabbaabb Einstellen mit RaspiBrickConfig.jar auf der Windows-Partition der SD-Karte

Host

WLAN-Router (Internet)

1. Art: Ethernet-Ethernet

Geeignet für Poolraum

Target

Router

Ethernet

Ethernet

2. Art: WLAN-Ethernet

Geeignet für Homework

WLAN-Router (Internet)

WLAN

Ethernet

3. Art: WLAN-WLAN

WLAN-Router (Internet)

Geeignet für Bewährter Router: WLAN WLAN Unterrichtsraum TP-LINK TL-WR841N siroop.ch Fr. 18.Konfigurationsanleitung auf :http://www.jython.ch/index.php?inhalt_links=navigation.inc.php&inhalt_mitte=pi2go/configRouter.inc.php

Bern, 3./10. März 2017, Aegidius Plüss

Folie 7

Computing und Sensorik mit Python



Verbindung testen: Windows: Eingabeaufforderung, Mac: Terminal öffnen Eintippen: ping 192.168.0.nnn, wo nnn Ihre Zahl ist Immer, wenn Verbindung nicht klappt, ping machen!



Remote Desktop Auf Raspi ist ein VNC-Server gestartet. Darauf zugreifen mit VNC-Client (VNC Viewer) Anmelden mit IP-Adresse und Port: :5901. Passwort: 123456 TightVNC: www.tightvnc.com (Achtung: nur Viewer installieren) VNC Viewer : www.realvnc.com/download/viewer Der Raspi als vollwertiger Linux-Computer (alles vorinstalliert, z.B. Mathematica, TigerJython, usw.)



In TigerJython: Einstellungen | Bibliotheken Roboter auswählen, Raspberry Pi Ihre IP Adresse angeben



Tools | Remote Terminal und man ist in der Linux Shell Man ist automatisch eingeloggt mit User: pi Password: raspberry



Etwas Linux lernen: Siehe Linux Spickzettel http://www.python-exemplarisch.ch/dpkkurs/download/linux-cheat-sheet.pdf Wichtig: Falls Admin-Rechte nötig, den Befehlen immer sudo voranstellen Software installieren: sudo apt-get update sudo apt-get install

Folie 8

Bern, 3./10. März 2017, Aegidius Plüss

Computing und Sensorik mit Python

Remote Development mit TigerJython •

Programm auf Host editieren. Dann downloaden und auf Target ausführen TigerJython starten Programm eintippen: print "Hallo DPKKurs" Downloadbutton (oder im Menu: Hunterladen/Ausführen) klicken Wichtig: das Programm darf "hängen" z.B. while True: Wichtig: Ausgaben (Fehler und print) werden in TigerJython angezeigt



Weitere Tools im Menü: Remote Shell (über SSH) wie PuTTY Alle mit Herunterladen/Ausführen heruntergeladenen Programm e heissen gleich: myapp.py und befinden sich in pi/scripts. Es kann auch dort ausgeführt werden in Terminal: python myapp.py Name bleibt gleich, keine Ausführung (für Module, Bibliotheken) Notbremse, fast nie nötig! Meist überflüssig , ohne Hemmungen Power weg!

Falls das Programm automatisch beim Booten starten soll, nennt man es autostart.py und lädt es runter (Modul hinterladen)

Remote Entwicklung mit anderer Entwicklungsumgebung (z.B. geany oder PyCharm) Information/Installation hier: www.python-exemplarisch.ch/rpi unter Entwicklungstools

Bern, 3./10. März 2017, Aegidius Plüss

Folie 9

Computing und Sensorik mit Python

Fehlererkennung/Fehlermeldung erspart viel Frust Hauptmerkmal von TigerJython: Syntaxfehlermeldungen, Laufzeitrückmeldungen

Folie 10

Bern, 3./10. März 2017, Aegidius Plüss

Computing und Sensorik mit Python

Management Tips •

Backup/Restore der SD-Karte (micro SD mind. 16 GB, Type 10) USB Image Tool : www.alexpage.de/ SD-Karte muss gleich gross oder grösser sein Falls was nicht geht, Original oder Backup kopieren (www.raspibrick.com)



Manchmal muss man SD-Karte formatieren SDFormatter: www.sdcard.org/downloads/formatter_4

Bern, 3./10. März 2017, Aegidius Plüss

Folie 11

Computing und Sensorik mit Python

Pinbelegung, Spannungen/Ströme •

Pinbelegung GPIO 02..27 = 26 Pins

Grenzwerte: GPIO:



Ausgangsspannung 0, 3.3V (max 16 mA nach oben oder unten, total kleiner als 50 mA, also typisch 2mA / pin) Eingangsspannung: 3.3V (kein Überspannungsschutz!!) •

Versorgungsspannung für externe Geräte: 5V Versorgung: ca. 200-300 mA geteilt mit USB-Versorgung (also sehr wenig, zu wenig für Motoren) 3.3 V Versorgung (von Model B+ an): ca 500 mA



Spannungsversorgung: Micro-USB Netzgerät mit 2A Variante: Externe Spannungsversorgung 5 V (Pin2): NICHT AUF ÜBERSPANNUNG GESCHÜTZT! (Micro-USB Eingang bleibt leer)

Achtung: Im Gegensatz zu Software: Nie TRIAL-AND-ERROR. Führt oft zu TRIAL-AND-NEVER!

Folie 12

Bern, 3./10. März 2017, Aegidius Plüss

Computing und Sensorik mit Python

Digital Out: LED Schema: •

Experiment: Blinkende LED

GPIO (Pin #7)

LED langer Draht bzw. flache Seite ist +

270

Verbindungen mit Steckplatine (Bread board)

Flache Seite Langer Draht

Strombegrenzender Seriewiderstand (typisch 270 Ohm, Strom max 10 mA)

Eventuell als Test ohne Software zuerst einfach statt bei Pin #7 bei Pin #1 (3.3V) einstecken!

LED

(Polarität beachten) GND (Pin #6)

Aufbau auf Steckplatine (Bread Board):

GND #6

GPIO #7 Bern, 3./10. März 2017, Aegidius Plüss

Folie 13

Computing und Sensorik mit Python

Digital Out: LED

# DigitalOut1.py import RPi.GPIO as GPIO import time P_LED = 7

# adapt to your wiring

def setup(): GPIO.setmode(GPIO.BOARD) GPIO.setup(P_LED, GPIO.OUT) print "Starting" setup() while True: GPIO.output(P_LED, GPIO.HIGH) time.sleep(0.1) GPIO.output(P_LED, GPIO.LOW) time.sleep(0.1)

GPIO Module importieren. RPI Tutorial (www.python-examplarisch.ch/rpi unter GPIO Wiki) Ports als Konstanten definieren Wir verwenden immer Pin-Nummerierung GPIO.BOARD oder GPIO. BCM Ports initialisieren gute Idee, damit man sieht, dass Programm wirklich startet eigentlich nicht erlaubt, bei uns aber schon! (man müsste am Schluss GPIO.cleanup() aufrufen) Output-Wert setzen Nicht zu kurz (in Sekunden)

Folie 14

Bern, 3./10. März 2017, Aegidius Plüss

Computing und Sensorik mit Python

Digital Out: Buzzer •

Active Buzzer versus Lautsprecher



Active Buzzer mit 2 pins: + - (Polarität beachten



Active Buzzer mit 3 pins: Signal - + (manchmal S und + vertauscht)



Gleiches Programm wie vorhin (DigitalOut1.py)

Schema:

GPIO (Pin #7) + Active Buzzer

(Polarität beachten) GND (Pin #6)

Übungen: 1.

Morsecode DigitalOut2.py

autostart

Bern, 3./10. März 2017, Aegidius Plüss

Folie 15

Computing und Sensorik mit Python

Digital In: Schalter •

3.3 V

Bei einem Floating Input einen externen Pullup von typisch 10 kOhm verwenden

Pullup

Schema:

Experiment : Schalterstellung lesen und ausschreiben Die GPIO besitzen interne Pullup/Pulldown

ELV Board

Verbindungen mit ELV Board. Tasten ziehen nach unten (nach GND)

Bu4, Pin 4 od. 5 od. 6 od. 7 Bu2, GND

GND (Pin #6) GPIO (Pin #22)

GPIO #6

Bu2, GND

# DigitalIn1.py import RPi.GPIO as GPIO import time Bu4 Pin 7 P_BUTTON = 22 # adapt to your wiring def setup(): GPIO.setmode(GPIO.BOARD) GPIO.setup(P_BUTTON, GPIO.IN, GPIO.PUD_UP) print "Starting" setup() dt = 0.1 while True: v = GPIO.input(P_BUTTON) if v == GPIO.LOW: print LOW" else: print "HIGH" time.sleep(dt)

Folie 16

Internen Pullup verwenden oder GPIO.PUP_DOWN, GPIO.PUP_OFF "Input floating"

Übungen: Schalter pollen! (wichtiger Begriff)

1.

Mit Taster LED oder Buzzer ein/aus

Polling Intervall sehr wichtig->anpassen

Bern, 3./10. März 2017, Aegidius Plüss

Computing und Sensorik mit Python

Lichtschranke mit Schmitt-Trigger, Verwendung eines OpAmps Schema (Aufbau auf Steckboard):

Theorie des LDR: Widerstand nimmt mit Beleuchtung ab (Photonen befördern Elektronen ins Leitungsband)



Spannungsmessung erfordert ADC (später). Für Lichtschranke nur Schwelle wichtig->Digitaler Wert



Potentiometer-Schaltung liefert variable Spannung



OpAmp der in Sättigung getrieben wird (v gross)

Rechts

10k

2

Didel LDR



8

Mitte

1

3 4

2

10k

A

Inbetriebnahme: Bei Umgebungslicht am Pot.meter Schwelle feststellen und gerade auf "DUNKEL" gehen. Dann mit PowerBank-Taschenlampe beleuchten.

Bern, 3./10. März 2017, Aegidius Plüss

Folie 17

Computing und Sensorik mit Python

Lichtschranke mit Schmitt-Trigger, Verwendung eines OpAmps # LDR-OPAMP.py import RPi.GPIO as GPIO import time # Digital input P_LDR = 40 # adapt to your wiring def setup(): GPIO.setmode(GPIO.BOARD) GPIO.setup(P_LDR, GPIO.IN, GPIO.PUD_UP) print "Starting" setup() while True: v = GPIO.input(P_LDR) if v == GPIO.LOW: print "Dunkel" else: print "Hell" time.sleep(0.1)

Folie 18

Übungen: 1.

Buzzer macht Beeps, wenn es hell ist

Beep-Thread nötig!

Bern, 3./10. März 2017, Aegidius Plüss

Computing und Sensorik mit Python

Kurze Theorie ADC und I22C-Bus •

Siehe Tutorial



Sehr wichtiges Bauelement in allen Microcontroller-Anwendungen, oft in uC integriert Designentscheid bei Raspberry Pi: ADC nach eigener Wahl, daher extern

• Wichtigste Eigenschaften: • Bitbreite (typisch 8, 10, 12 bit, d.h. bei 10 bit ist die Auflösung 1024, d.h. der Spannungsschritt bei 3.3V ca. 3 mV) • Umwandlungsgeschwindigkeit/bzw. Taktfrequenz: typisch 100 Hz (langsam), 100 kHz (schnell), man muss die Daten aber auch noch übertragen/verarbeiten! • Datenübertragung (Kommunikationstechnik) mit Bus: • Es gibt einen Master und mehrere Slaves • Es braucht Vereinbarungen (Kommunikationsprotokoll) • Typisch: Slaves haben eine Adresse und "hören" Der Master sendet Adresse und ist dann mit diesem Slave verbunden, die anderen schweigen gefälligst • Das I2C-Protokoll verwendet 3 Leitungen: GND, SDA (Serial Data) SCL (Serial Clock). SCL gibt den Takt vor, mit dem die einzelnen Bits übertragen werden



Master Slave 1 Slave 2 Slave 3

Bei I2C werden die Adressen gewöhnlich in Hex-Form geschrieben. 1 Hex-Ziffer 0..9, A, B, C, D, E, F einspricht 4 bits, zwei Hex-Ziffern also 8 bits, z.B. 0x4A = 0010'1010

Bern, 3./10. März 2017, Aegidius Plüss

Folie 19

Computing und Sensorik mit Python •

RaspEasy von Didel

TigerJython->Tools->Remote Terminal i2cdetect -y 1

Vorsicht beim Aufstecken des RaspEasy, dass Stecker/Buchse genau passen! • • • • •

Alle GPIOs geschützt auf Überspannung und mit 470 Ohm Seriewiderstand (LEDs direkt einsetzbar) 2 Button 2 LEDs 2 ADCs Sockel für I2C (3.3V und 5 V)

#40 #38 #36 #32

GND AIN 3.3V

Folie 20

I2C-Gerät testen mit Terminal

GND

+3.3 V

Btn B ADC ADC Btn A #13 #12 PyTell links rechts LED 7-Segment LED 0x4D 0x48 right left #7 #11

OLED

Bern, 3./10. März 2017, Aegidius Plüss

Computing und Sensorik mit Python

Analog-Digital-Wandler •

Verwendung des RaspEasy



Potentiometer ist wichtigster Sensor-Simulator, denn es gibt eine begrenzte Spannung ab, also keine externen Spannungsquellen (Netzgeräte) verwenden

# ADC1.py import smbus import time

Modul smbus für I2C-Kommunikation

print "starting..." SMBus(0) für (ur)alten Raspi bus = smbus.SMBus(1) # adc_address = 0x4D # left adc_address = 0x48 # right I2C-Adresse des ADCs dt = 0.1 t = 0 Pollen des Device while True: # Reads word (16 bits) as int Die 10 bits sind in einem Word (16 bit) rd = bus.read_word_data(adc_address, 0) geistreich verpackt. # Exchanges high and low bytes v = ((rd & 0xFF) > 8) Wert herausfiltern-> Bit-Jonglieren # Ignores two least significiant bits v = v >> 2 print "t:", t, "v:", v t += dt time.sleep(dt)

Eigene ADC bauen: Siehe Tutorial z.B. Löten eines MCP3021 auf ein Adapter-Board

Bern, 3./10. März 2017, Aegidius Plüss

Folie 21

Computing und Sensorik mit Python

Anwendung Analog-Digital-Wandler Übungen: Spannung am Didel-LDR messen Hell-dunkel ausschreiben Einlesen mit Funktion readADC(address)

Didel-LDR-Modul wirkt wie ein Spannungsteiler (Potentiometerschaltung)

3.3 V

LDR

1. 2. 3.

AIN

A

# ADC-ueb3.py

22 k

zu 3: GND

import smbus import time

Function machen->Modulares Programmieren def readADC(address): rd = bus.read_word_data(address, 0) v = ((rd & 0xFF) > 8) v = v >> 2 return v print "starting..." bus = smbus.SMBus(1) dt = 0.1 t = 0 while True: v = readADC(0x48) # right print "t:", t, "v:", v t += dt time.sleep(dt)

Folie 22

Bern, 3./10. März 2017, Aegidius Plüss

Computing und Sensorik mit Python

Optische Ausgaben (Displays)

Ein Microcontroller-System ohne Rückmeldung sehr unprofessionell



Oft genügen LEDs, event. farbig, event. verschieden blinkend



7-Sement-Displays sind relativ einfach anzusteuern, sind noch immer weit verbreitet



Alphanumerische Displays (Flüssigkristallanzeigen (LCDs), LEDs, Oleds) sind modern und billig, benötigen aber viele ControllerRessourcen (Font in Pixel umwandeln)



Elegant: 7-Segmentanzeigen mit I2C-Interface, z.B. Didel's DgTell, ELV DgTell auf RaspEasy an I2C-Connector einstecken, Protokoll: Liste mit 4 Zahlen 0..255 für die 4 Ziffern Jedes Segment hat eine Wertigkeit.

# DgTell1.py import smbus display_address = 0x60 bus = smbus.SMBus(1) cmd = 1 # segment mode data = [63, 6, 91, 79] # 0123 bus.write_block_data(display_address, cmd, data)

Problem: Buchstaben/Zahlen in Wertigkeit umwandeln siehe DgTell1-ueb1.py (Programm übernehmen)

Übungen: 1. 2.

Hochzählen bis 1000 Sensorwert anzeigen (Helligkeit oder Potentiometerstellung)

siehe DgTell1-ueb2.py Dies ist bereits eine sehr schöne Anwendung!

Bern, 3./10. März 2017, Aegidius Plüss

Folie 23

Computing und Sensorik mit Python

Sound •

Vor allem wegen Motivation



Eingebauter Sound schlecht, man verwendet USB-Soundkarte



Verwenden Schweizer Taschenmesser: SOX, + Kleine PythonSchicht soundplayer.py, die Linux-Commands aufruft Demo: Sofort spielen, mit Button A stoppen und Programm beenden # Sound.py from time import sleep from soundplayer import SoundPlayer import RPi.GPIO as GPIO P_BUTTON = 13 # RaspEasy button A

• Voraussetzung: hunger.py mit FTP auf Raspi kopiert (WinSCP , Filezila) -> zeigen • soundplayer.py in Editor nehmen • unter Tools->Herunterladen auf Raspi laden • RaspEasy verwenden (Buttons)

def setup(): GPIO.setmode(GPIO.BOARD) GPIO.setup(P_BUTTON, GPIO.IN) print "Starting" setup() # Use device with ID 1 (mostly USB audio adapter) p = SoundPlayer("/home/pi/Music/hunger.mp3", 1) p.play() while p.isPlaying(): v = GPIO.input(P_BUTTON) if v == GPIO.HIGH: p.stop() sleep(0.5) # nicht zu kurz (Schalterprellen)! print "Done"

Übungen: 1. Mit Button B Abspielen starten, mit Button A stoppen und Programm beenden (wie vorher) 2. Mit Button B Abspielen starten, mit Button A stoppen, aber mit A erneut spielen. Mit beiden Buttons Stoppen und Programm beenden

Mehr als 2 Buttons mit ELV-Board! Folie 24

Bern, 3./10. März 2017, Aegidius Plüss

Computing und Sensorik mit Python

Abstandssensoren IR-Fotodiode + IR Fototransistor kombiniert in 1 Gehäuse: TCRT5000 In Hobby-Robotik weit verbreitet

3.3 V

Schema:

D

A

C

B

10k



Eigener Aufbau auf Steckboard und Anschluss an RaspEasy ADC (links oder rechts)



Digitalisierter Wert auf Console ausschreiben (Gleiches Programm wie bei ADC1..py, auf linken oder rechten ADC achten)

270 3.3 V

Nichtlinarer Fit:

Ausgangsspannung vs Distanz

10 k Siehe Programm NonLinFit.py im Verzeichnis DPKRober

D

A

blau

GND

Übungen: 1.

Kanten abgeschnitten

Analog In

270

Achtung: So montieren, dass auf DPKRover verwendbar!

Ausschreiben des Werts auf Didel-Display Verwenden von IRDistance.py

Dieser Sensor kann auch wie eine Lichtschranke ohne ADC direkt mit dem GPIO ausgelesen werden, wenn man einen Schmitt-Trigger (z.B. OpAmp) dazwischen schaltet. Bern, 3./10. März 2017, Aegidius Plüss

Folie 25

Computing und Sensorik mit Python

Temperatursensoren

• NTC mit ADC oder Schmitt-Trigger

Wichtiger Sensortyp! Wie ADC1.py: Ausschreiben der Temperatur (Umrechnungsfaktor 3.1 beachten) # Temp.py import smbus import time

• Lineare Sensoren:

Digitalisierter Wert auf Console ausschreiben (Gleiches Programm wie bei ADC1..py, auf print "starting..." linken oder rechten ADC achten) bus = smbus.SMBus(1) adc_address = 0x48 # right #adc_address = 0x4D # left dt = 0.1 t = 0 while True: rd = bus.read_word_data(adc_address, 0) v = ((rd & 0xFF) > 8) v = v >> 2 print "t:", t, "v:", v / 3.1 t += dt time.sleep(dt)

LM35DZ

flach! LM35 direkt am RaspEasy einstecken Polarität beachten!

• Digitale Sensoren Mit Bus: I2C, SPI, 1-Wire Setup/Bit-Jonglieren, z.B. MCP9800 (ELV Board siehe Unterverzeichnis mcp9800) Hier Demo, zuhause selbst machen! Folie 26

Übungen: 1.

ELV Board

Anzeige auf Oled-Display. Dazu downloaden: OLED1306.py und SSD1306.py

Bern, 3./10. März 2017, Aegidius Plüss

Computing und Sensorik mit Python

Aktoren: Relais, Magnete, Ventile, Leistungselektronik Treiber nötig (hoher Strom, hohe Spannung) •

Bipolare Transistoren



Mosfets



Darlington-Arrays: ULN2003 Achtung bei Spulen: Wegen Abschaltspitzen Schutzdioden nötig (Clamp Diodes) ULN2003A

Lamp

Demo: Leistungs-LED 10V/1A (10W) über ULN2003A pro Ausgang 500 mA, Parallelschaltung erlaubt,



GPIO

hier 2 Outputs verwenden!) •

Entspricht der Lichtleistung einer 60W-Lampe



Auf Kühlung achten

Andere typischen Anwendungen •

Relaisplatine



Wasserventil



230V Triac

+ DC 12V/1A extern -

GND

Nur Demo, da keine 12 V verfügbar, aber Material vorhanden!

Achtung: Aufpassen mit den hohen Spannungen! (auch für den Raspi ist es schade) Bern, 3./10. März 2017, Aegidius Plüss

Folie 27

Computing und Sensorik mit Python

Aktoren: Puls Width Modulation (PWM) •

PWM Prinzip: Duty Cycle softwaremässig einstellbar



Experiment: LED dimmen

# PWMDimm.py import RPi.GPIO as GPIO import time

Aufbau mit gewöhnlicher LED direkt an RaspEasy (kein Vorwiderstand)

P_LED = 32 # adapt to your wiring fPWM = 60 # Hz (not higher with software PWM) def setup(): global pwm GPIO.setmode(GPIO.BOARD) GPIO.setup(P_LED, GPIO.OUT) pwm = GPIO.PWM(P_LED, fPWM) pwm.start(0) print "starting" setup() duty = 0 isIncreasing = True while True: pwm.ChangeDutyCycle(duty) print "D =", duty, "%" if isIncreasing: duty += 5 else: duty -= 5 if duty == 100: isIncreasing = False if duty == 0: isIncreasing = True time.sleep(0.5) Folie 28

lang flach

Übungen: 1.

RGB-LED Farbe einstellen

RGB-LED oder LED-Streifen über Treiber (nur Demo)

Bern, 3./10. März 2017, Aegidius Plüss

Computing und Sensorik mit Python

Aktoren: Servomotoren mit PWM-Controller

# ServoMotor1.py # Servo motor driven by PCA9685 controller

Mit Servomotoren bestimmter Drehwinkel softwaremässig einstellbar







from smbus import SMBus from PCA9685 import PWM import time

Mit ext. Spannung betreiben (5V von PowerBank)

fPWM = 50 i2c_address = 0x40 # (standard) adapt to your module channel = 0 # adapt to your wiring a = 8.3 # adapt to your servo b = 2 # adapt to your servo home = 90

Berühmter Controller PCA9685 mit I2C-Interface

def setup(): global pwm bus = SMBus(1) # Raspberry Pi revision 2 pwm = PWM(bus, i2c_address) pwm.setFreq(fPWM)

Benötigen kleine Library PCA9685.py + V+

PowerBank (5V)

GND

def setDirection(direction): duty = a / 180 * direction + b pwm.setDuty(channel, duty) print "direction =", direction, "-> duty =", duty time.sleep(1) # allow to settle

3.3V (pin # 1)

SCL (pin # 5)

SDA (pin # 3)

GND (pin # 6)

print "starting" setup() while True: setDirection(home) for direction in range(0, 181, 10): set setDirection(direction) setDir setDirection(home) PWM

Orange

V+ GND

Braun

Rot

Bern, 3./10. März 2017, Aegidius Plüss

Folie 29

Computing und Sensorik mit Python

USB-Kabel für externe 5V-Versorgung konfektionieren

1. Entzweischneiden/abisolieren (messen, welche 2 Kabel GND/5V liefern)

3. Zwei Kabel je mit Schrumpfschlauch isolieren

Folie 30

2. Bei GND und 5V je drei Leiter zusammenlöten (event. Halter verwenden)

4. Das Ganze mit Schrumpfschlauch stabilisieren

Bern, 3./10. März 2017, Aegidius Plüss

Computing und Sensorik mit Python

Aufbau des DPKRobot

1. 2. 3. 4. 5.

Raspi-Befestigungslöcher auf 3mm ausbohren (gemacht) Raspi mit 3 Schrauben M3x30mm und Stütze sowie Mutter auf Plattform befestigen Lochplatte auflegen, mit 2 Muttern befestigen 2 Breadboards mit Doppelklebband auf Lochplatte ankleben (eventuell vorher die Bauelemente/Verkabelung vornehmen, event. bereits gemacht) PowerBank mit Doppelklebeband befestigen

Bern, 3./10. März 2017, Aegidius Plüss

Folie 31

Computing und Sensorik mit Python

Aktoren: DC-Motoren (H-Brücke)

Prinzip: Schaltung mit der L293D H-Brücke 3.3V

Pin #40

Pin #36

S1, S4 geschlossen: vorwärts S2, S3 geschlossen: rückwärts DPKRover zusammenbauen!!!

Motor A (rechts)

GND

Motor B (links)

GND

Pin #38

Pin #32

GND GND

GND

PowerBank

Der L293D enthält Schutzdioden!

Folie 32

Bern, 3./10. März 2017, Aegidius Plüss

Computing und Sensorik mit Python

Motor A vorwärts, rückwärts, stop # Motor1.py # MotorA forward/backward/stop import RPi.GPIO as GPIO import time P_MOTA1 = 40 P_MOTA2 = 38 def forward(): GPIO.output(P_MOTA1, GPIO.HIGH) GPIO.output(P_MOTA2, GPIO.LOW) def backward(): GPIO.output(P_MOTA1, GPIO.LOW) GPIO.output(P_MOTA2, GPIO.HIGH)

Achtung: Fahrzeug aufbocken!!! print "starting" setup() while True: print "State 'forward'" forward() time.sleep(2) print "State 'stop'" stop() time.sleep(2) print "State 'backward'" backward() time.sleep(2) print "State 'stop'" stop() time.sleep(2)

def stop(): GPIO.output(P_MOTA1, GPIO.LOW) GPIO.output(P_MOTA2, GPIO.LOW) def setup(): GPIO.setmode(GPIO.BOARD) GPIO.setup(P_MOTA1, GPIO.OUT) GPIO.setup(P_MOTA2, GPIO.OUT)

Übungen: 1.

Geschwindigkeitsregelung mit PWM

Übung machen! Die Funktionen schalten Motorzustände um!

Bern, 3./10. März 2017, Aegidius Plüss

Folie 33

Computing und Sensorik mit Python

DPKRover (selbstfahrendes Auto) Robotik in der Schule ist hochaktuell und sehr beliebt • Fest zusammengebaut: Pi2Go, Bee-Bot, Thymio, usw. Pi2Go Bee-Bot • Bausatz: Lego EV3 • Zusammenbau aus Einzelteilen, Arduino, Raspberry Pi (auch im Fächern Werken, Physik)

Pflichtenheft des Grundmodells

Thymo: EPFL

Build-Your-Own Robot

• Fahrgestell mit 2 Motoren hinten und Kugel-Laufrolle (caster-wheel) vorne • Steuerung mit Raspberry Pi (könnte auch Modell Zero sein)

Lego EV3

• Spannungsversorgung mit 5 V PowerBank (keine AA-Batterien verwenden!) • Motortreiber mit L293D H-Brücke • Distanzmessung vorne mit IR-Sensor auf ADC (hier RaspEasy)

Grundaufgabe: Fahren gegen eine Wand • Bei Annäherung fährt der Roboter ein Stück zurück und dann wieder vorwärts

Modifikationen/Erweiterungen • Verwendung der zwei Buttons • Verwendung des Displays • Ultrasonic-Distanzmessung • 2 Infrarot-Sensoren nach unten zur Spurhaltung (Fahren auf Streifen) • Verwendung eines Buzzers • Nach eigener Fantasie! Folie 34

Bern, 3./10. März 2017, Aegidius Plüss

Computing und Sensorik mit Python

DPKRover (selbstfahrendes Auto) Dazu bauen: Infrarot-Distanzmessung, Anschluss an RaspEasy

Programme: 1.

2.

3.

4.

Endlos: Kurz geradeaus fahren: Vorwärts/Rückwärts/Stop DPKRover1.py Endlos: Vorwärts fahren. Bei Annäherung an Hindernis kurz rückwärts fahren DPKRover2.py Hand Follower: Immer in einem bestimmten Abstand zur Hand bleiben (Regelungsprozess) DPKRover3.py Nach eigener Fantasie Wie hängen Messwert v und Distanz zusammen? Für Physikunterricht gute Übung! Verwendung von GPanel und linfit , Resultat d = a * v + b

Bern, 3./10. März 2017, Aegidius Plüss

Folie 35

Computing und Sensorik mit Python

Goodies and Highlights 1.

Global Positioning System (GPS) Idee: Triangulation GPS-Module sind billig, siehe www.python-exemplarisch.ch/rpi GPS-Module verwenden meist die serielle Schnittstelle (RS232, schon sehr lange bekannt)

Man kann die Daten zum Test mit einem Terminal-Emulator, z.B. PuTTY, ansehen. Empfehlenswert! Dazu mit VNC auf Raspi gehen.

PuTTY installieren

PuTTY starten: Menu->Internet->PuTTY

sudo apt-get updata sudo apt-get install putty

für Raspi Model 3 noch eine Einstellung der Taktfrequenz nötig (siehe Website)

Raspi Model 3:

Raspi Model 2:

Daten im NMEA-Format (mühsam) Demo: GPS1.py (Rohdaten) GPS2.py (Gefiltert) Folie 36

Zeit (GMT)

Breite

Länge

# Sat

Höhe

Bern, 3./10. März 2017, Aegidius Plüss

Computing und Sensorik mit Python

Goodies and Highlights 2.

Global System for Mobile Communication (GSM) • Älteres Handy-Verbindungs-Protokoll, heute abgelöst durch UMTS, 2G, 3G, 4G (schneller, weniger Bandbreite) • GSM-Module billig (siehe Website) • Man benötigt eine SIM-Karte, d.h. ein Handy-Abo (für Datentransfer offen, nicht nur Telefon, event. NUR für Datenverkehr) Salt

Swisscom:

500 MB / Monat Fr.19.- / Monat

250 MB / Monat Fr.10.- / Monat

Man kommuniziert mit dem GSM-Modem wieder über eine serielle Schnittstelle. Wie vor 40 Jahren mit den ersten Telefon-Modems verwendet man den sogenannten Hayes-Befehlssatz. Es gibt eine kleine Library SIM800Modem.py, welche Funktionen definiert, die in Hayes-Befehle umgesetzt werden. Typisch: resetModem(), connectGSM(), connectTCP(), sendHTTPRequest()

Demos: 1. 2.

Auslesen mit einem Webbrowser (wie im 1. Kursteil)

StoreCos.py : (Messwert-Simulation) Funktionswerte einer gedämpften harmonischen Schwingung alle 5 Sekunden in der Datenbank abspeichern StoreTemp.py: Dasselbe, aber es werden echte Temperaturwerte abgespeichert

http://www.java-online.eu/raspiremote/showall.php?table=dataNN Tabellenwerte als Text anzeigen http://www.java-online.eu/raspiremote/showgraph.php?table=dataNN Grafik anzeigen (automatischer Refresh) Tabelleninhalt löschen http://www.java-online.eu/raspiremote/deleteall.php?table=dataNN Bern, 3./10. März 2017, Aegidius Plüss

Folie 37

Computing und Sensorik mit Python

Goodies and Highlights 3.

Ultrasonic Modul HC-SR04 (im Sensorkit vorhanden)

D = c * t = 343 * 700*10-6 = 0.24 m -> d = 12 cm

Demo: Ultrasonic1.py Interessanter Algorithmus, um mit GPIO den Trigger-Puls zu erzeugen und die Länge des Echo-Pulses zu messen (kritisch wegen kurzen Zeiten)

Folie 38

Bern, 3./10. März 2017, Aegidius Plüss

Computing und Sensorik mit Python

Goodies and Highlights 4.

RemoteControl/Remote Measurement

TCPClient

TCPServer

Demo: Auf DPK-Rover: RemoteRover.py oder RemoteRoverOled.py Auf PC: RemoteControl.py

Bern, 3./10. März 2017, Aegidius Plüss

Folie 39

Computing und Sensorik mit Python

Bezugsquellen: www.reichelt.de allgemeines Elektronik-Material www.conrad.ch allgemeines Elektronik-Material www.elv.ch allgemeines Elektronik-Material www.didel.ch RaspEasy, Spezialmodule www.ebay.com Suche nach einem bestimmten Artikel, Lieferung von China meist günstig www.aliexpress.com Suche nach chinesischem Lieferanten www.pi-shop.ch Auf Raspberry Pi und Zubehör spezialisiert www.pimoroni.com Robotik-Material, schnelle problemlose Lieferung aus England 4tronix.co.uk Robotik-Material, schnelle problemlose Lieferung aus England

Links: www.python-exemplarisch.ch www.python-exemplarisch.ch/dpkkurs www.brickgate.com www.tigerjython4kids.ch www.aplu.ch www.jython.ch Folie 40

Bern, 3./10. März 2017, Aegidius Plüss