Raspberry Pi Pico: Lichtschranke mit LED und LDR (KY-018)
Eine Lichtschranke besteht aus einer Lichtquelle und einem Lichtempfänger. In der Regel bilden beide eine Einheit, wobei das optische Signal von einem Spiegel reflektiert wird.
Wir bauen uns hier eine einfache Lichtschranke, mit einer LED als Lichtquelle und einem LDR als Lichtempfänger, die sich gegenüberstehen. Für einfache Anwendungen und wenigen Zentimetern Distanz funktioniert das gut genug. Voraussetzung ist, dass die beiden Bauteile exakt zueinander ausgerichtet sind.
Aufbau und Bauteile mit KY-018 - Photo Resistor Module
- R1: Widerstand, 470 Ohm
- LED1: Leuchtdiode, weiß
- LDR1: KY-018
Dieser Aufbau sieht vor, dass LDR und LED auf wenige Millimeter exakt zueinander ausgerichtet sind. Selbstverständlich kannst Du die Bauteile weiter auseinander und sogar versetzt platzieren. Beim ersten Versucht empfiehlt sich nicht zu sehr von diesem Aufbau abzuweichen.
Hinweis: Wenn Du keine weiße LED hast, dann geht auch jede andere Farbe. Mit einer weißen LED funktioniert es am Besten.
- Leuchtdiode
- Widerstand
- KY-018 - Fotowiderstand (Photo Resistor Module) oder Fotowiderstand (LDR)
- GPIO-Belegung (Pinout)
Raspberry Pi Pico | KY-018 | |
---|---|---|
Pin 38 | GND | - |
Pin 36 | 3V3 / +VCC | Mitte |
Pin 31 | ADC0 (GPIO26) | S |
Hinweis: Beim Verbinden des Raspberry Pi Pico mit dem Modul ist auf die Modul Beschriftung der Pins zu achten. +VCC ist nicht zwangsläufig in der Mitte.
Schnell und einfach alle Bauteile zusammen bestellen
Programmcode
Im Prinzip wird die Helligkeit der gegenüberliegenden LED mit einem Fotowiderstand mit Hilfe eines ADC-Eingangs gemessen. Wird das Licht der LED durch ein Objekt verdeckt, dann verändert sich der Widerstandswert des Fotowiderstands, beeinflusst das Spannungsverhalten und am ADC-Eingang verändert sich der Wert. Diese Veränderungen wird im Programmcode erkannt und mit einem Text in der Kommandozeile vermerkt.
Im Programmcode wird die Variable „threshold“ (= Schwelle) definiert. Das ist der Wert ab dem eine Unterbrechung erkannt wird. Unterhalb wird keine Unterbrechung erkannt. Wie groß oder wie klein die Schwelle sein muss hängt stark vom Umgebungslicht, der Entfernung und der Helligkeit der LED ab. Es kann sein, dass es mit dem vorgegebenen Wert ganz gut funktioniert. Vermutlich muss dieser an die Lichtverhältnisse und Bauteile angepasst werden.
# Bibliotheken laden from machine import ADC from time import sleep # Initialisierung des ADC0 ldr = ADC(0) # Schwellwert bei Unterbrechung threshold = 5000 # weiße LED #threshold = 10000 # rote LED # Unterbrechung (0/1) interrupt = 0 # Dauer der Unterbrechung count = 0 # Wiederholung (Endlos-Schleife) while True: # ADC als Dezimalzahl lesen value = ldr.read_u16() # ADC-Wert ausgeben #print('ADC:', value) # ADC-Wert auswerten if value > threshold: interrupt = 1 count = count + 1 else: interrupt = 0 count = 0 # Erste Unterbrechung erkannt if count == 1: print('Unterbrechung') # Zähler ausgeben if count > 0: print('Zähler:', count) # Warten sleep(0.1)
Erweiterung: Integrierte Kalibrierung
Denkbar wäre, wenn der Aufbau in wechselnden Umgebungen verwendet wird, dass vor der Endlos-Schleife der Threshold-Wert automatisch kalibriert wird, damit unterschiedliche Lichtverhältnisse berücksichtigt werden können. Für die Kalibrierung muss der Programmcode die LED durch einen GPIO-Ausgang ein- und ausgeschalten können.
Aufbau mit integrierter Kalibrierung
Damit die Lichtschranke kalibriert werden kann, muss die LED ein- und ausgeschaltet werden. Dazu darf sie nicht mit +3,3 Volt verbunden sein, sondern mit einem GPIO-Ausgang.
Programmcode mit integrierter Kalibrierung
Der folgende Programmcode kalibriert sich selber. Das heißt, er ermittelt die Helligkeit der Lichtverhältnis mit ausgeschalteter und eingeschalteter LED. Daraus berechnet der Programmcode die Schaltschwelle, ab wann eine Unterbrechung erkannt wird.
# Bibliotheken laden from machine import ADC, Pin from time import sleep # Initialisierung des ADC0 ldr = ADC(0) # Initialiserung GPIO16 für LED led = Pin(16, Pin.OUT, value=0) # Kalibrierung des Schwellwerts print('Kalibrierung') # Messung: Helligkeit, wenn LED aus (Unterbrechung) valueOff = ldr.read_u16() print('Schaltschwelle bei Unterbrechung:', valueOff) # LED einschalten led.on() sleep(1) # Messung: Helligkeit, wenn LED an (Normal) valueOn = ldr.read_u16() print('Schaltschwelle wenn LED an:', valueOn) # Berechnung: Schwellwert threshold = int(valueOff + (valueOn - valueOff) / 2) print('Berechneter Schwellwert:', threshold) print('Kalibrierung beendet') # Unterbrechung (0/1) interrupt = 0 # Dauer der Unterbrechung count = 0 # Wiederholung (Endlos-Schleife) while True: # ADC als Dezimalzahl lesen value = ldr.read_u16() # ADC-Wert ausgeben #print('ADC:', value) # ADC-Wert auswerten if value > threshold: interrupt = 1 count = count + 1 else: interrupt = 0 count = 0 # Erste Unterbrechung erkannt if count == 1: print('Unterbrechung') # Zähler ausgeben if count > 0: print('Zähler:', count) # Warten sleep(0.1)
Weitere verwandte Themen:
- Raspberry Pi Pico: Helligkeit messen
- Raspberry Pi Pico: Unterbrechungserkennung mit Lichtschranke KY-010
- Raspberry Pi Pico: Unterbrechungszähler mit Lichtschranke KY-010
Teilen:
Hardware-nahes Programmieren mit dem Raspberry Pi Pico und MicroPython
Das Elektronik-Set Pico Edition ist ein Bauteile-Sortiment mit Anleitung zum Experimentieren und Programmieren mit MicroPython.
- LED: Einschalten, ausschalten, blinken und Helligkeit steuern
- Taster: Entprellen und Zustände anzeigen
- LED mit Taster einschalten und ausschalten
- Ampel- und Lauflicht-Steuerung
- Elektronischer Würfel
- Eigene Steuerungen programmieren
Online-Workshop: Programmieren mit dem Raspberry Pi Pico
Gemeinsam mit anderen und unter Anleitung experimentieren? Wir bieten unterschiedliche Online-Workshops zum Raspberry Pi Pico und MicroPython an. Einführung in die Programmierung, Sensoren programmieren und kalibrieren, sowie Internet of Things und Smart Home über WLAN und MQTT.
Für Ihre Fragen zu unseren Online-Workshops mit dem Raspberry Pi Pico besuchen Sie unseren PicoTalk (Online-Meeting). (Headset empfohlen)