Top Banner
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
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

Sep 08, 2019

Download

Documents

dariahiddleston
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
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