Du bist hier: Sensor > Fotowiderstand

Arduino Sensor Fotowiderstand

1. Vorbereiten

Der Fotowiderstand ist ein simpler Sensor für Arduino. Steure mit dem Lichtwiderstand/Fotowiderstand/LDR viele Dinge mit Werten zwischen 0% und 100%. Die Abkürzung LDR steht für "Light Dependent Resistor" und erklärt auch gleich seine Funktion:

  • Er erzeugt einen Widerstand zwischen 0Ω (=viel Licht) und 10kΩ (=kein Licht)
  • Er liefert Werte zwischen 100% (=viel Licht) und 0% (=kein Licht)
  • Er kann direkt in einen der vier Sensor Eingänge eingeschraubt werden. Die Polung ist egal.

2. Programmieren

2.1. Eine LED direkt mit einem Fotowiderstand steuern

Sketch 1 - Fotowiderstand schaltet LED direkt

Sketch 1: Lichtwiderstand steuert logischen Zustand einer LED

Sketch 2 - Fotowiderstand schaltet LED umgekehrt

Sketch 2: Lichtwiderstand steuert logischen Zustand einer LED umgekehrt

Sketch 3 - Fotowiderstand reguliert LED direkt

Sketch 3: Lichtwiderstand steuert %-Wert einer LED

Sketch 4 - Fotowiderstand reguliert LED umgekehrt

Sketch 4: Lichtwiderstand steuert %-Wert einer LED umgekehrt

Sketch 5 - Wirkbereich von Fotowiderstand mit Neopixel visualisieren

Sketch 5: Lichtwiderstand Position eines Pixels

3. Aktivität - einen Arduino Roboter mit Fotowiderstand steuern

3.1. Roboter, der in Richtung des Lichts fährt

Baue ein Roboter Auto, lasse jedoch die Fühler weg.

  • Positioniere zwei Fotowiderstände an der Front des Fahrzeugs. Sie sollen nach vorne- und 45° übers Kreuz nach innen schauen.
  • Die genaue Positionierung siehst du am Anfang des folgenden Videos:

Die Programmierung ist simpel:

Sketch 6: Roboter Motorengeschwindigkeit mit Fotowiderstand steuern
Sketch 7: Empfindlichkeit eines Fotowiderstands erhöhen (für Zoom klicken)

3.2. Roboter, der einer weissen Linie folgt (Line follower)

Baue ein Roboter Auto, lasse jedoch die Fühler weg.

  • Positioniere einen Fotowiderstand an der Front des Fahrzeugs, so dass er die Helligkeit des Bodens messen kann.
  • Positioniere dicht neben dem Sensor eine LED, welche den Boden aufhellt.
  • Tip: Um ein perfekt gleichmässig diffuses Licht zu erhalten, schleife die LED an ihrem Kopf so ab, dass eine Fläche entsteht.
  • Tip: Konstruiere die Halterung so, dass du die Höhe über Boden leicht justieren kannst
  • Die genaue Konstruktion siehst du in diesem Video:

Das folgende Grundprogramm entspricht dem Projekt "Line Follower" in Variante 5a. Es tut folgendes:

  • Drehe Motor 1 so langsam, wie die gemessene Helligkeit beträgt (= je heller desto langsamer)
  • Drehe Motor 2 so schnell,   wie die gemessene Helligkeit beträgt (= je heller desto schneller)

Etwas anders ausgedrückt:

  • Wenn hell, dann fahre Richtung Boden
  • Wenn dunkel, dann fahre Richtung Linie
  • Tip: für eine bessere Darstellung im Editor: Rechtsklick auf Blöcke > vertikale Darstellung
Sketch 8: Arduino Line follower mit einem Fotowiderstand. steuern. Grundprogramm.

Einschränkung: Dieses Sketch funktioniert nur "in einer perfekten Welt" wo der Helligkeitsunterschied zwischen Linie und Boden 100% beträgt. Meistens ist dies jedoch nicht der Fall und die Werte die der Lichtwiderstand misst (z.B. Boden = 30%, Linie = 45%) müssen skaliert werden.

Eine mögliche Lösung wird in Variante 5b (Arbeitsblatt zweite Seite) geliefert. Die Helligkeitswerte von Boden und Linie werden zuerst ausgemessen, gespeichert und dann auf 0% bis 100% skaliert.

<xml xmlns="http://www.w3.org/1999/xhtml"><variables><variable type="" id="u7kraQNZAkSWLp|:XL^t">Referenzwert Linie</variable><variable type="" id="8LX9l@qnZEX2uyOH[2D%">Referenzwert Fläche</variable><variable type="" id="bd#}|`]R!kO}ryUv5%,!">Mittelwert</variable><variable type="" id="#GLcp?AtDQ|I)`:e=;S3">Messung</variable><variable type="" id="JUh.Bkv^6,r7fcm/fw2L">Begrenzter Wert</variable><variable type="" id="qqs*Hd*;xyRrFr#_.r/k">Zu begrenzender Wert</variable><variable type="" id="3,4VG$L!_JSy`f9`99(Y">x</variable><variable type="" id="GMn0zyv-8Hf)be#ke{Uv">Motor 1</variable><variable type="" id=",^Tvn#On6t:(gY%2uJd4">Motor 2</variable><variable type="" id="%D%mZss`rs9hkVVx@|4M">Helligkeit</variable></variables><block type="expert_setup" id="|YwQ,gyoa85O$:BSO.uS" x="-378" y="-256"><statement name="CODE"><block type="led_write_state" id="J-ecK1w.nbJZ#(Stq,RR"><value name="LED"><block type="led_pin" id="OEoX_TjM4eHlkdV.8bc|"><field name="LED">LED1</field></block></value><value name="VALUE"><block type="basic_digital_state" id="4@+Ao@JEOg/gm5vf~%z@"><field name="STATE">HIGH</field></block></value><next><block type="led_write_state" id="p-lzh?EHRKxlJBq`t+hU"><value name="LED"><block type="led_pin" id="XUXLe=:@t^%[Hdt[2]RM"><field name="LED">LED2</field></block></value><value name="VALUE"><block type="basic_digital_state" id="LYD`n`G{zb5C?RV8d0DH"><field name="STATE">HIGH</field></block></value><next><block type="led_write_state" id="[Af^3a%I4J_5Fq{o1!#$"><value name="LED"><block type="led_pin" id="();kteGuayC(rROulC05"><field name="LED">LED3</field></block></value><value name="VALUE"><block type="basic_digital_state" id=".CyX1A=]j9PCtimI1,SY"><field name="STATE">LOW</field></block></value><next><block type="flow_delay" id="]K481*^8VGA_Wkc6?S@+"><value name="DELAY"><block type="math_number" id="UbZ-.1-lAt(iV]qzEBvN"><field name="NUM">1000</field></block></value><next><block type="led_write_state" id="{cLh^I_o[J)j!5R264Zd"><value name="LED"><block type="led_pin" id="FOS=L%tZT~{2R`l(U#!X"><field name="LED">LED1</field></block></value><value name="VALUE"><block type="basic_digital_state" id="ph#/Qsr1-Y87*cjNlS17"><field name="STATE">LOW</field></block></value><next><block type="flow_delay" id="Y((CHBmJrfM#F`Qhrr(a"><value name="DELAY"><block type="math_number" id="VQ0~^:1`#4O(Yqxq0Q8O"><field name="NUM">1000</field></block></value><next><block type="variables_set" id="AP6v08}+T*hp.|9#7Jl+"><field name="VAR" id="u7kraQNZAkSWLp|:XL^t" variabletype="">Referenzwert Linie</field><value name="VALUE"><block type="sensor_read_percentage" id="_83]UOjQ*XxU6MjnHsIM"><value name="SENSOR"><block type="sensor_pin" id="~6#/_f8HV{6|}qX,#;E4"><field name="SENSOR">SENSOR3</field></block></value></block></value><next><block type="led_write_state" id="qQtf~Y4ffQJXY)kJ:9e1"><value name="LED"><block type="led_pin" id=",5lfKCQw7%Pq3!j1LwI~"><field name="LED">LED1</field></block></value><value name="VALUE"><block type="basic_digital_state" id="T1/=TA:1FOkL61xJQ12]"><field name="STATE">HIGH</field></block></value><next><block type="flow_delay" id="Z17eKHRTgIddCi?O_$W@"><value name="DELAY"><block type="math_number" id="A0QK1$0*;-G(]lAJzQkJ"><field name="NUM">1000</field></block></value><next><block type="led_write_state" id="xKdrxDF|TF3yVf,:GaZI"><value name="LED"><block type="led_pin" id=".rPnu^z91A280B,,Bu6z"><field name="LED">LED2</field></block></value><value name="VALUE"><block type="basic_digital_state" id="~=#vF^~RFD5aN2:X[bhL"><field name="STATE">LOW</field></block></value><next><block type="flow_delay" id="G,u=_6uX;o4{9sVXPOI%"><value name="DELAY"><block type="math_number" id="AL]T$!g$|ynvdo9{H]YK"><field name="NUM">1000</field></block></value><next><block type="variables_set" id="UoeK,})el-h$dkcHZ%^="><field name="VAR" id="8LX9l@qnZEX2uyOH[2D%" variabletype="">Referenzwert Fläche</field><value name="VALUE"><block type="sensor_read_percentage" id="{}]^!0:7QwZ1quT^~F^d"><value name="SENSOR"><block type="sensor_pin" id="Wp?EMC3+lvjH!/Kk,QQ="><field name="SENSOR">SENSOR3</field></block></value></block></value><next><block type="led_write_state" id="IDGIRU2YZ5c@a?K5/w9R"><value name="LED"><block type="led_pin" id="/TnB/le1x.mvCM}m]3.V"><field name="LED">LED2</field></block></value><value name="VALUE"><block type="basic_digital_state" id="Gj5LPw+nf_}-r975V,?Y"><field name="STATE">HIGH</field></block></value></block></next></block></next></block></next></block></next></block></next></block></next></block></next></block></next></block></next></block></next></block></next></block></next></block></statement></block><block type="basic_comment" id="+XHd!8L0`Ar3T`FiiX):" x="210" y="-247"><field name="COMMENT">Diese Linefollower Programmierung ist optimiert für Linien mit wenig Kontrast (z.B. Klebband)</field></block><block type="basic_comment" id="|H0(*`l_dW|fKad(~1vo" x="210" y="-196"><field name="COMMENT">Es ist egal, ob Linie oder Boden hell oder dunkel sind</field></block><block type="basic_comment" id="CVJqxaLP$EcK3k;)KQMn" x="210" y="-163"><field name="COMMENT">Im Gegenzug muss vor jedem Programmstart die Helligkeit des Bodens und der Linie gemessen werden</field></block><block type="basic_comment" id="[NA[e}fX)/DrZf`Jg{{n" x="-110" y="-76"><field name="COMMENT">Kalibrierung hell - dunkel:</field></block><block type="basic_comment" id=";F;.(Va$9h{g,Xw4c/g?" x="-108" y="-40"><field name="COMMENT">Sensor über Linie halten</field></block><block type="basic_comment" id=":PqWPC(lii(sd~+-riOw" x="-103" y="144"><field name="COMMENT">Sensor über Boden halten</field></block><block type="basic_comment" id="inypP=5iWB]y]TzTvvPv" x="-86" y="262"><field name="COMMENT">Von innen nach aussen verstehen!</field></block><block type="basic_comment" id="eS)zdc`xx`Px4E7|4p5Q" x="-87" y="298"><field name="COMMENT">Ändere: skaliert die effektiven Sensorwerte mit den Referenzwerten auf 0 bis 50 resp. 50 bis 0 (je nach Rad)</field></block><block type="basic_main_loop" id="dhSJ,_kciC=*X%Z[L[s*" deletable="false" x="-381" y="342"><statement name="CODE"><block type="motor_write_percentage" id="KE]^Zl5fe~Ush[D`r2#|"><value name="MOTOR"><block type="motor_pin" id="z[%(}YWv.la:`IO/a4`C"><field name="MOTOR">MOTOR1</field></block></value><value name="PERCENTAGE"><block type="math_constrain" id="]rKSi6bu,]F0V;H;^83H"><value name="VALUE"><block type="math_map" id="NHo#/Q_-X#0@rY[*SgkJ"><value name="VALUE"><block type="sensor_read_percentage" id=":fXQ[_%Y0ERkJa6.M0Ta"><value name="SENSOR"><block type="sensor_pin" id="w5(gM9y5k*_Nwy{=g#(}"><field name="SENSOR">SENSOR3</field></block></value></block></value><value name="FROMLOW"><block type="variables_get" id="G3SO]6=_-1~J5gOu4yq]"><field name="VAR" id="u7kraQNZAkSWLp|:XL^t" variabletype="">Referenzwert Linie</field></block></value><value name="FROMHIGH"><block type="variables_get" id="^E~IOn_Ddiih=L=@Xh]7"><field name="VAR" id="8LX9l@qnZEX2uyOH[2D%" variabletype="">Referenzwert Fläche</field></block></value><value name="TOLOW"><block type="math_number" id="j25pZ#;wYKNCp|t[.x;Y"><field name="NUM">0</field></block></value><value name="TOHIGH"><block type="math_number" id="t%#Jk_mFgPP-_x6we,oc"><field name="NUM">50</field></block></value></block></value><value name="MIN"><block type="math_number" id="+624Qj~,`Z9EVDpx!w8L"><field name="NUM">0</field></block></value><value name="MAX"><block type="math_number" id="snM/7Dv|@i%8S;J]pW/T"><field name="NUM">50</field></block></value></block></value><next><block type="motor_write_percentage" id="dAha^;t?6/[Z2CxDrq%0"><value name="MOTOR"><block type="motor_pin" id="1h3xuBb@jToYx-qwk^ZG"><field name="MOTOR">MOTOR2</field></block></value><value name="PERCENTAGE"><block type="math_constrain" id="SMFG5Mq$23_^aKl{vxV7"><value name="VALUE"><block type="math_map" id="^Tw}_L@1F4/Eq3NVD5|="><value name="VALUE"><block type="sensor_read_percentage" id="24n7?*fS?V(b?h.jYRa5"><value name="SENSOR"><block type="sensor_pin" id="wWNu,2e5U0p}6#zH.-{c"><field name="SENSOR">SENSOR3</field></block></value></block></value><value name="FROMLOW"><block type="variables_get" id=",X_wp!p29e^(0j]}2*~-"><field name="VAR" id="u7kraQNZAkSWLp|:XL^t" variabletype="">Referenzwert Linie</field></block></value><value name="FROMHIGH"><block type="variables_get" id="DLF1o$)Q@Y9X)-fvex4m"><field name="VAR" id="8LX9l@qnZEX2uyOH[2D%" variabletype="">Referenzwert Fläche</field></block></value><value name="TOLOW"><block type="math_number" id="~y!OQeAFQ=Dt2OgYFM]+"><field name="NUM">50</field></block></value><value name="TOHIGH"><block type="math_number" id="YxWFa@17-]|^sVZ;}v?["><field name="NUM">0</field></block></value></block></value><value name="MIN"><block type="math_number" id="z}dw-H)RPbO7JlQQ+Zq4"><field name="NUM">0</field></block></value><value name="MAX"><block type="math_number" id="ZxnMad|Ng@M^(%TmUN-%"><field name="NUM">50</field></block></value></block></value></block></next></block></statement></block><block type="basic_comment" id="mDBd6Q%:4I?Y)8qi[Mz$" x="-87" y="333"><field name="COMMENT">Begrenze: stellt sicher, dass keine höheren Werte als 50- oder tieferen als 0 entstehen</field></block></xml>

Frage etwas oder gib uns dein Feedback