Computing und Sensorik mit Python im Physikunterricht · Computing und Sensorik mit Python Folie 1...

20
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

Transcript of Computing und Sensorik mit Python im Physikunterricht · Computing und Sensorik mit Python Folie 1...

Page 1: Computing und Sensorik mit Python im Physikunterricht · Computing und Sensorik mit Python Folie 1 Bern, 3./10. März 2017, Aegidius Plüss Computing und Sensorik mit Python im Physikunterricht

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

Page 2: Computing und Sensorik mit Python im Physikunterricht · Computing und Sensorik mit Python Folie 1 Bern, 3./10. März 2017, Aegidius Plüss Computing und Sensorik mit Python im Physikunterricht

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

Page 3: Computing und Sensorik mit Python im Physikunterricht · Computing und Sensorik mit Python Folie 1 Bern, 3./10. März 2017, Aegidius Plüss Computing und Sensorik mit Python im Physikunterricht

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)

Page 4: Computing und Sensorik mit Python im Physikunterricht · Computing und Sensorik mit Python Folie 1 Bern, 3./10. März 2017, Aegidius Plüss Computing und Sensorik mit Python im Physikunterricht

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!

Page 5: Computing und Sensorik mit Python im Physikunterricht · Computing und Sensorik mit Python Folie 1 Bern, 3./10. März 2017, Aegidius Plüss Computing und Sensorik mit Python im Physikunterricht

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

Page 6: Computing und Sensorik mit Python im Physikunterricht · Computing und Sensorik mit Python Folie 1 Bern, 3./10. März 2017, Aegidius Plüss Computing und Sensorik mit Python im Physikunterricht

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!

Page 7: Computing und Sensorik mit Python im Physikunterricht · Computing und Sensorik mit Python Folie 1 Bern, 3./10. März 2017, Aegidius Plüss Computing und Sensorik mit Python im Physikunterricht

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!

Page 8: Computing und Sensorik mit Python im Physikunterricht · Computing und Sensorik mit Python Folie 1 Bern, 3./10. März 2017, Aegidius Plüss Computing und Sensorik mit Python im Physikunterricht

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

Page 9: Computing und Sensorik mit Python im Physikunterricht · Computing und Sensorik mit Python Folie 1 Bern, 3./10. März 2017, Aegidius Plüss Computing und Sensorik mit Python im Physikunterricht

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:

Page 10: Computing und Sensorik mit Python im Physikunterricht · Computing und Sensorik mit Python Folie 1 Bern, 3./10. März 2017, Aegidius Plüss Computing und Sensorik mit Python im Physikunterricht

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

Page 11: Computing und Sensorik mit Python im Physikunterricht · Computing und Sensorik mit Python Folie 1 Bern, 3./10. März 2017, Aegidius Plüss Computing und Sensorik mit Python im Physikunterricht

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

Page 12: Computing und Sensorik mit Python im Physikunterricht · Computing und Sensorik mit Python Folie 1 Bern, 3./10. März 2017, Aegidius Plüss Computing und Sensorik mit Python im Physikunterricht

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)

Page 13: Computing und Sensorik mit Python im Physikunterricht · Computing und Sensorik mit Python Folie 1 Bern, 3./10. März 2017, Aegidius Plüss Computing und Sensorik mit Python im Physikunterricht

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

Page 14: Computing und Sensorik mit Python im Physikunterricht · Computing und Sensorik mit Python Folie 1 Bern, 3./10. März 2017, Aegidius Plüss Computing und Sensorik mit Python im Physikunterricht

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

Page 15: Computing und Sensorik mit Python im Physikunterricht · Computing und Sensorik mit Python Folie 1 Bern, 3./10. März 2017, Aegidius Plüss Computing und Sensorik mit Python im Physikunterricht

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

Page 16: Computing und Sensorik mit Python im Physikunterricht · Computing und Sensorik mit Python Folie 1 Bern, 3./10. März 2017, Aegidius Plüss Computing und Sensorik mit Python im Physikunterricht

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

Page 17: Computing und Sensorik mit Python im Physikunterricht · Computing und Sensorik mit Python Folie 1 Bern, 3./10. März 2017, Aegidius Plüss Computing und Sensorik mit Python im Physikunterricht

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

Page 18: Computing und Sensorik mit Python im Physikunterricht · Computing und Sensorik mit Python Folie 1 Bern, 3./10. März 2017, Aegidius Plüss Computing und Sensorik mit Python im Physikunterricht

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)

Page 19: Computing und Sensorik mit Python im Physikunterricht · Computing und Sensorik mit Python Folie 1 Bern, 3./10. März 2017, Aegidius Plüss Computing und Sensorik mit Python im Physikunterricht

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)

Page 20: Computing und Sensorik mit Python im Physikunterricht · Computing und Sensorik mit Python Folie 1 Bern, 3./10. März 2017, Aegidius Plüss Computing und Sensorik mit Python im Physikunterricht

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