Du bist hier:
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 (- und △). Die Polung ist egal.
2. Anschliessen
3. Programmieren
3.1. Eine LED direkt mit einem Fotowiderstand steuern
4. Aktivität - einen Arduino Roboter mit Fotowiderstand steuern
4.1. Roboter, der in Richtung des Lichts fährt
Baue ein Roboter Auto, lasse jedoch die Fühler weg.
- Zur Bauanleitung ↗
- Bausatz Roboter Auto hier kaufen ↗
- Fotowiderstand hier kaufen ↗
- Fotowiderstand direkt mit den Eingängen S1 & S2 verbinden. Die Polung ist egal.
- 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:
- Die Drehgeschwindigkeit eines Rades wird direkt an die Helligkeit, die ein Fotowiderstand sieht, gebunden
- Siehe PGLU.CH>Roboter Auto Programmieren>Variante 4 ↗
4.2. Roboter, der einer weissen Linie folgt (Line follower)
Baue ein Roboter Auto, lasse jedoch die Fühler weg.
- Google Keyword: Line follower challenge ↗
- Zur Bauanleitung Roboter Auto ↗
- Bausatz Roboter Auto hier kaufen ↗
- Fotowiderstand hier kaufen ↗
- Fotowiderstand und LED so anschliessen ↗
- 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
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.
- Zum Arbeitsblatt "Roboter Auto Varianten" ↗
- Kopiere diesen XML-Code mit Klick/Berührung und füge ihn in den Editor ein
<xml xmlns="https://developers.google.com/blockly/xml"><variables><variable id="u7kraQNZAkSWLp|:XL^t">Referenzwert Linie</variable><variable id="8LX9l@qnZEX2uyOH[2D%">Referenzwert Fläche</variable></variables><block type="basic_comment" id="+XHd!8L0`Ar3T`FiiX):" x="-379" y="-399"><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="-379" y="-358"><field name="COMMENT">Es ist egal, ob die Linie heller als der Boden ist oder umgekehrt</field></block><block type="basic_comment" id="CVJqxaLP$EcK3k;)KQMn" x="-380" y="-317"><field name="COMMENT">Im Gegenzug müssen vor jedem Programmstart die Helligkeit des Bodens und der Linie gemessen werden (=kalibrieren)</field></block><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">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%">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="[NA[e}fX)/DrZf`Jg{{n" x="-86" y="-80"><field name="COMMENT">Kalibrierung hell-dunkel-Kontrast:</field></block><block type="basic_comment" id=";F;.(Va$9h{g,Xw4c/g?" x="-84" y="-42"><field name="COMMENT">Bei Signal: Sensor über Linie halten</field></block><block type="basic_comment" id=":PqWPC(lii(sd~+-riOw" x="-83" y="149"><field name="COMMENT">Bei Signal: Sensor über Boden halten</field></block><block type="basic_comment" id="inypP=5iWB]y]TzTvvPv" x="-87" y="335"><field name="COMMENT">Von innen (grün) nach aussen (orange) verstehen!</field></block><block type="basic_comment" id="eS)zdc`xx`Px4E7|4p5Q" x="-87" y="374"><field name="COMMENT">Ändere: skaliert die effektiven Sensorwerte mit den Referenzwerten auf 0 bis 80 resp. 80 bis 0 (je nach Rad - experimentiere mit diesen Werten)</field></block><block type="basic_comment" id="mDBd6Q%:4I?Y)8qi[Mz$" x="-87" y="411"><field name="COMMENT">Begrenze: stellt sicher, dass keine höheren Werte als 100- oder tieferen als 0 entstehen</field></block><block type="basic_main_loop" id="dhSJ,_kciC=*X%Z[L[s*" deletable="false" x="-377" y="427"><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">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%">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">80</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">100</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">Referenzwert Linie</field></block></value><value name="FROMHIGH"><block type="variables_get" id="DLF1o$)Q@Y9X)-fvex4m"><field name="VAR" id="8LX9l@qnZEX2uyOH[2D%">Referenzwert Fläche</field></block></value><value name="TOLOW"><block type="math_number" id="~y!OQeAFQ=Dt2OgYFM]+"><field name="NUM">80</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">100</field></block></value></block></value></block></next></block></statement></block></xml>