Forum: Mikrocontroller und Digitale Elektronik Lichtschranke


von Steffen (Gast)


Lesenswert?

Hallo liebe User

Ich habe eine Frage bezüglich einer Lichtschranke. Natürlich gibt es 
viele Schaltungen dafür, ich möchte es allerdings mit einem Attiny 
realisieren. Die Frage ist, mit welchem Bauteil/Teilschaltung realisiere 
ich das am besten?
LDR, Fotodiode oder Fototransistor? Ausgelöst werden soll sie durch die 
Unterbrechung eines roten Laserpointers (ich weiß, gefährlich). Um 
Umgebungslich abzuhalten werde ich den Empfänger in ein schwarzes Rohr 
verlegen, welches so lang seine wird, dass nur der Laserstrahl senkrecht 
draufscheinen kann.
Bei allen Schaltungen wird noch ein Widerstand benötigt, kann dieser 
auch ein Poti sein um die Empfindlichkeit einstellen zu können? Ich 
möchte möglichst ein High oder Low Signal auslesen können um dann eine 
Led zu schalten.

Vielleicht hat ja jemand ne Idee, ansonsten bleibt mir nur das "Try and 
Error" Prinzip.

von spontan (Gast)


Lesenswert?

Try and error ist Blödsin.

LDR sind langsam und träge.
Fototransistor mit OP als Verstärker ist wohl das beste.

Es gibt fertige Bausätze oder solls von Grund auf selbst gekauft, 
gelötet, geändert sein?

von Timmo H. (masterfx)


Lesenswert?

spontan schrieb:
> Try and error ist Blödsin.
Da kann ich nur zustimmen, denn es heißt "Trial and Error" ;)

Wenn man eine Lichtschranke unbedingt selbst bauen will, dann geht das 
am einfachsten mit einer IR-Diode mit der man ein mit 36/38/40 kHz 
moduliertes Signal sendet und dies z.B. mit einem TSOP Derivat 
auswertet.

von Steffen (Gast)


Lesenswert?

Ich möchte das schon gerne alles selber machen, sodass ich später auch 
noch was verändern kann (softwareseitig). Ich hab sowas schonmal für ein 
Mikrofonvorverstärker gebaut um eine Analoge Vu Anzeige ansteuern zu 
können. Das müsste eigendlich das selbe Prinzip sein.

Beitrag "analog vu meter"

Die Frage ist nur ob ich da einen festen Wert, also High und Low 
rausbekomme. Funktioniert sowas nicht mit einem Schmittrigger?

von Steffen (Gast)


Lesenswert?

@masterfx
Wär aber toll wenn man den Lichtstrahl sehen kann( wenns nebelig ist 
oder so) , außerdem ist IR so schlecht zu bündeln. Ansonsten wäre das 
auch meine erste Wahl gewesen.

von Steffen (Gast)


Lesenswert?

Ist es nicht auch möglich einfach eine Zehnerdiode oder zwei standart 
Dioden zwischen Phototransistor und Eingangspin zu schalten? Dann habe 
ich ja einen festen Spannungspunkt ab dem High erkannt wird.

von Steffen (Gast)


Lesenswert?

Ich habe jetzt eine Schaltung gebaut, welche genau das tut was ich 
brauche. Jedoch funktioniert mein Programm nicht so wie es soll.

Mir scheint ich hab das mit den Eingängen des ATTINY noch nicht ganz 
verstanden. Untenstehend mein Programm. Wenn ich es einschalte fängt es 
sofort an zu blinken im 0.3 Hertz Takt. Sonst nichts. Das Programm ist 
teilweise aus Tutorials zusammengeschnippelt.

Wäre cool wenn ihr mal einen Blick drüber werfen könntet.

1
 ; Ports Setzen
2
3
     ldi r16, 0xFF       ; lade Arbeitsregister r16 mit der Konstanten 0xFF
4
     out DDRB, r16       ; Inhalt von r16 ins IO-Register DDRB ausgeben
5
 
6
     ldi r16, 0b00000011 ; (LED/laser als Ausgang, Empfänger als Eingang) 
7
     out PORTB, r16      ; r16 ins IO-Register PORTB ausgeben Laser/led on
8
9
     
10
Loop3:                   ; auf Unterbrechung warten
11
12
     in  r16,PINB        ; PINB lesen und Wert in r16 Laden
13
   
14
     SBRC R16,2          ;wenn bit 2 in r16 low ist(Empfänger unterbrochen)
15
16
  rjmp loop3             ; überspringen falls Empfänger nicht mehr high ist 
17
18
19
   
20
21
     ldi r16, 0xFF       ; lade Arbeitsregister r16 mit der Konstanten 0xFF
22
     out DDRB, r16       ; Inhalt von r16 ins IO-Register DDRB ausgeben
23
 
24
     ldi r16, 0b00001000 ; (LED/laser gehen aus)
25
     out PORTB, r16      ;  und schaltet Pieper=pin 3 geht an) 
26
  
27
28
ende:
29
30
  rjmp ende

von Harald W. (wilhelms)


Lesenswert?

Steffen schrieb:
> Hallo liebe User
>
> Ich habe eine Frage bezüglich einer Lichtschranke. Natürlich gibt es
> viele Schaltungen dafür, ich möchte es allerdings mit einem Attiny
> realisieren.

Also da solltest Du mindestens einen Vierkernprozessor mit 3GHz
oder noch besser ein komplettes Rechenzentrum
http://images.computerwoche.de/images/computerwoche/bdb/1840727/890.jpg
nehmen.
Gruss
Harald

von Steffen (Gast)


Lesenswert?

Harald Wilhelms schrieb:
> Also da solltest Du mindestens einen Vierkernprozessor mit 3GHz
> oder noch besser ein komplettes Rechenzentrum

Lustig. Der Laser soll sofort ausgehen und auch ausbleiben um vor 
Augenschäden zu schüzen -> Laser Klasse 2.

von Lukas T. (tapy)


Lesenswert?

Schon über die erste Zeile sollte "man" nachdenken. Du solltest darüber 
nachdenken. DDRB ist das RICHTUNGS-Register. Tutorial nochmal. Und 
Codeformatierung verwenden.

von c-hater (Gast)


Lesenswert?

Steffen schrieb:

> Ich habe eine Frage bezüglich einer Lichtschranke. Natürlich gibt es
> viele Schaltungen dafür, ich möchte es allerdings mit einem Attiny
> realisieren. Die Frage ist, mit welchem Bauteil/Teilschaltung realisiere
> ich das am besten?
> LDR, Fotodiode oder Fototransistor?

Empfänger für IR-Fernbedienungen. Z.B.:

www.reichelt.de/index.html?ACTION=3;ARTICLE=107208

> Ausgelöst werden soll sie durch die
> Unterbrechung eines roten Laserpointers (ich weiß, gefährlich). Um
> Umgebungslich abzuhalten werde ich den Empfänger in ein schwarzes Rohr
> verlegen, welches so lang seine wird, dass nur der Laserstrahl senkrecht
> draufscheinen kann.

Da brauchst du dann auch keinen Laser und keine aufwendigen 
Abschirmmaßnahmen gegen Fremdlicht. LED als Sender reicht, muß eben bloß 
moduliert werden, z.B. mit einem 555er oder dem kleinsten greifbaren 
ATtiny.

Übrigens kann man auch Laserpointer modulieren, aber das ist nicht so 
ganz einfach und nicht immer ohne Änderungen am Innenleben zu erreichen.

von Steffen (Gast)


Lesenswert?

Wie schon gesagt, wüsste ich nicht wie ich einen Infrarotstrahl so stark 
bündeln kann, dass ich 100m überbrücken kann. Ansonsten hätte ich das 
wie von dir beschrieben gemacht.

Aber trotzdem danke für diese sinnvolle Antwort

von c-hater (Gast)


Lesenswert?

Steffen schrieb:

> Wie schon gesagt, wüsste ich nicht wie ich einen Infrarotstrahl so stark
> bündeln kann, dass ich 100m überbrücken kann.

"Wie schon gesagt"? Wo? In diesem Thread jedenfalls nicht. Noch 
nirgendwo war da die Rede von der gewünschten Reichweite und schon 
garnicht davon, daß diese 100 m betragen soll.

von Thomas (Gast)


Lesenswert?

Steffen schrieb:
> ldi r16, 0xFF       ;lade Arbeitsregister r16 mit der Konstanten 0xFF

So ein Kommentar ist ziemlich nutzlos, weil er genau das selbe sagt, wie 
der Assemblerbefehl. Viel interessanter wäre, wozu r16 benutzt wird und 
warum gerade die Konstante 0xFF geladen werden soll.

Steffen schrieb:
> Wie schon gesagt, wüsste ich nicht wie ich einen Infrarotstrahl so stark
> bündeln kann, dass ich 100m überbrücken kann.
Ein Infrarotstrahl läßt sich mit Spiegeln und Linsen genauso bündeln, 
wie sichtbares Licht.
Hast du deinen Laserpointer schon mal nach 100m angeguckt? Der wird auf 
die Enfernung auch nicht mehr ganz so punktförmig aussehen.

von Michael R. (mexman) Benutzerseite


Lesenswert?

> Hast du deinen Laserpointer schon mal nach 100m angeguckt? Der wird auf
> die Enfernung auch nicht mehr ganz so punktförmig aussehen.

Jetzt lass ihn doch.
er will Laserpointer, er bekommt Laserpointer.

Und ich diskutiere auch nicht, dass ein "Laser Klasse 2" dafuer nicht 
geeignet ist und warum.

Dies:

> Ich habe jetzt eine Schaltung gebaut, welche genau das tut was ich
> brauche. Jedoch funktioniert mein Programm nicht so wie es soll.

ist doch wohl klar....also entweder Du hilfst ihm dabei oder laesst es 
sein.

Gruss

Mcihael

von Steffen (Gast)


Lesenswert?

Das euch das so fertig macht mit dem Laserpointer hätte ich ja nie 
gedacht. Und ja nach 100 metern ist der nicht mehr genau, das ist für 
mich mehr oder weniger ein max Wert.

Die Idee dahinter ist, den Strahl über Spiegel umzuleiten und mit 
Desinfektionsspray sichtbar zu machen und dann zu versuchen dadurch zu 
kommen ohne ihn zu berühren, deshalb auch das Abschalten als Schutz fürs 
Auge.

Ich mag halt Filme.

Offensichtlich hätte ich das vorher erläutern sollen.

von Eumel (Gast)


Lesenswert?

Steffen schrieb:
> Offensichtlich hätte ich das vorher erläutern sollen.

Es ist immer eine total gute Idee möglichst wenig von dem zu verraten 
was man vorhat. So können einem die hilfsbereiten Leute hier am aller 
besten helfen!!1!

von LASER (Gast)


Lesenswert?

Wie "spontan" schon ausgeführt hat, bietet sich ein Phototransistor mit 
Verstärkerteil an. Um ein "scharfes", eindeutiges HIGH-LOW-Signal für 
den Mikrocontroller zu erhalten, kann man zB einen Schmitt-Trigger (zB 
CD4093) verwenden.

von Flohzirkus (Gast)


Lesenswert?

Um noch mal zum Softwareproblem zurückzukommen:

Du hast anscheinend die Funktion von DDR, PORT und PIN noch nicht 
verinnerlicht.

Im Detail beschreiben ist das im Datasheet
http://www.atmel.com/Images/doc2543.pdf  (Hier für den ATTiny 2313)

DDR  : Data Direction. LOW steht für Input und HIGH für Output.

Da ich mir selbst nicht mehr sicher war, habe ich mir mal eine Übersicht 
der vier Zustände zusammengestellt.

Der Zustand des Pins (das Beinchen, nicht verwechseln mit PIN-Register) 
ist:

      | DDR    | DDR
      | LOW    | HIGH
------------------------
PORT  | hoch-  | LOW
LOW   | ohmig  |
------------------------
PORT  | Pullup | HIGH
HIGH  |        |


Grundsätzlich würde ich dir empfehlen, zuerst eine LED über einen Taster 
(oder auch eine Drahtbrücke) an einem Input-Pin zu kontrollieren, damit 
du sicher bist, den Code im Griff zu haben.
Dann kannst du den Taster durch deinen Detektor ersetzen und 
kontrollieren, ob du den Strahl zuverlässig erkennst. (Diesen Modus 
brauchst du sicher auch, wenn du deine Spiegel ausrichtest.)

Und dann kannst du anfangen, den Rest deines Codes zu stricken und 
Sirenen heulen zu lassen, wenn ein Einbrecher kommt :-)

Viel Spaß bei diesem Projekt!

von nachgedacht (Gast)


Lesenswert?

spontan schrieb:
> Try and error ist Blödsin.

Das sagst du als Produkt einer Evolution, die auf "Trial und Error" 
beruht?

Es kostet halt seine Anzahl von Versuch. Aber wer nicht zielgerichteter 
arbeiten kann, kommt damit mit viel Glück innerhalb seiner Lebenszeit 
auch ans Ziel.

von Steffen (Gast)


Lesenswert?

Ich habs jetzt abgeändert und am Simulator vom avr Studio funktioniert 
es genauso wie es soll, in der Schaltung jedoch nicht.
Mein Problem bei den Tutorials ist, dass die immer erläutern, PORTA als 
Ausgang und PORTB als Eingang. Der ATTiny hat aber nur einen PORT.
Kann es auch sein, dass der Microcontroller sich am Ende selbst zurück 
setzt? Aufgrund der Endlosschleife.
1
     ldi r16, 0b00000011      
2
     out DDRB, r16       ; Inhalt von r16 ins Register DDRB ausgeben
3
 
4
     ldi r16, 0b00000011 ;LED/laser als Ausgang,Empfänger als Eingang 
5
     out PORTB, r16     ;r16 ins IO-Register PORTB ausgeben Laser/ledon
6
7
8
Loop3:                   ; auf Unterbrechung warten
9
10
     in  r16,PINB        ; PINB lesen und Wert in r16 Laden
11
   
12
     SBRS R16,2       ;wenn bit 2 in r16 High (Empfänger unterbrochen)
13
14
  rjmp loop3             ; überspringen falls Empfänger nicht mehr high 
15
16
loop4:   
17
18
     ldi r16, 0b00001011
19
     out DDRB, r16
20
21
     ldi r16, 0b00001000 ; LED/laser gehen aus
22
     out PORTB, r16      ; und schaltet Pieper=pin 3 geht an) 
23
  
24
25
ende:
26
27
  rjmp ende

von Karl H. (kbuchegg)


Lesenswert?

Steffen schrieb:
> Ich habs jetzt abgeändert und am Simulator vom avr Studio funktioniert
> es genauso wie es soll, in der Schaltung jedoch nicht.
> Mein Problem bei den Tutorials ist, dass die immer erläutern, PORTA als
> Ausgang und PORTB als Eingang. Der ATTiny hat aber nur einen PORT.

Ja und?

Du setzt im DDRB das Bit 3 auf 1  und damit ist am Port B der Pin PB3 
auf Ausgang geschaltet.

Wo ist da jetzt das Problem?
Du hast doch Einzelbitbefehle. Ob die jetzt am Port A und Port B 
angewendet werden oder nur am Port B ist doch Jacke wie Hose.

AVR-Tutorial: IO-Grundlagen

von Karl H. (kbuchegg)


Lesenswert?

>      ldi r16, 0b00000011
>      out DDRB, r16       ; Inhalt von r16 ins Register DDRB ausgeben
>
>      ldi r16, 0b00000011 ;LED/laser als Ausgang,Empfänger als Eingang
>      out PORTB, r16     ;r16 ins IO-Register PORTB ausgeben Laser/ledon
>
>
> Loop3:                   ; auf Unterbrechung warten
>
>      in  r16,PINB        ; PINB lesen und Wert in r16 Laden
>
>      SBRS R16,2       ;wenn bit 2 in r16 High (Empfänger unterbrochen)

Ein auf Eingang geschalteter Portpin ist nicht automatisch auf 0.
Ein auf Eingang geschalteter Portpin, an dem nichts hängt, fängt sich 
jedes dahergelaufene elektromagnetische Feld ein und je nach Tageszeit, 
Sonnenstand, Höhe des Badewasser in der Wanne und Lauf der 
Kaffeemaschine nebenan ist der 0 oder 1, wie es ihm gefällt.

Also: Was hast du an den Pin angeschlossen?

von Karl H. (kbuchegg)


Lesenswert?

>     ldi r16, 0b00001011
>     out DDRB, r16


Tus nicht!
Damit beeinflusst du den kompletten Port.
Wenn du einen einzelnen Portpin schalten willst, dann benutze die
SBI bzw. CBI Befehle.
Damit verringerst du die Gefahr, dass du dir unabsichtlich irgendeinen 
anderen Portpin in einen Zustand schaltest, den du nicht haben willst 
und der von dir auch gar nicht beabsichtigt war.

von Karl H. (kbuchegg)


Lesenswert?

> loop4:
>
>     ldi r16, 0b00001011
>     out DDRB, r16

was fummelst du da schon wieder am DDR Register rum?

Die DDR Register werden typischerweise EINMALIG am Programmanfang 
korrekt eingestellt. Man legt am Anfang fest welcher Pin Ausgang ist, 
welcher Pin Eingang ist (eventuell noch, an welchem der Eingangspins man 
einen Pullup braucht) und dann bleibt diese Konfiguration für den Rest 
des Programms konstant. Im Regelfall gibt es da keinen Grund im 
nachhinein noch mal daran rumzupfriemeln.

von Karl H. (kbuchegg)


Lesenswert?

> Kann es auch sein, dass der Microcontroller sich am Ende selbst
> zurück setzt? Aufgrund der Endlosschleife.

Nein.
Das Problem sitzt, wie in 99% aller Fälle, vor dem Bildschirm :-)

von T.W. (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Die DDR Register werden typischerweise EINMALIG am Programmanfang
> korrekt eingestellt.

Das kann man so allgemein nicht sagen. Wenn man einen Open-Drain Ausgang 
bracht, wird der Port fest auf Low gesetzt und mit dem DDR zwischen High 
(Open) und Low umgeschaltet.

von Karl H. (kbuchegg)


Lesenswert?

T.W. schrieb:
> Karl Heinz Buchegger schrieb:
>> Die DDR Register werden typischerweise EINMALIG am Programmanfang
>> korrekt eingestellt.
>
> Das kann man so allgemein nicht sagen.

Für einen kompletten Neuling kann man das so sagen.

Bis der auf dieses Fall stösst, hat er seine ersten 5000 Zeilen Code 
bereits geschrieben und weiß was da passiert.
(Ausserdem hab ich 'typischerweise' geschrieben und nicht 'immer')

Verwirre bitte Neulinge nicht mit Sonderfällen. Man kann durch 
übertriebene Genauigkeit gerade in den ersten Lernphasen mehr Verwirrung 
stiften als es gut ist.

von Steffen (Gast)


Lesenswert?

So, jetzt habe ich die Finger vom DDR gelassen^^. Habe nur einzelne 
Portbits manipuliert und den Eingang direckt auf Plus, dann auf Minus 
gelegt um alles auszuprobieren und um den Detektor auszuschließen. Ich 
frage auch nur noch einen PIN ab. Ein neues IC ist auch getestet. Mit 
und ohne Internen Pullup macht kein Unterschied. Die LED blinkt einfach 
nur.
Ich habe zwar jetzt schon einiges geschnallt und das Programm ist viel 
kürzer geworden, die "Fehlfunktion" erschließt sich mir leider immer 
noch nicht. Im AVR Studio funktioniert die Simulation wunderbar.

    ldi r16, 0b11111011
    out DDRB, r16       ; Inhalt von r16 ins Register DDRB ausgeben

    ldi r16, 0b11110111 ; (LED/laser als Ausgang, Empfänger als Eingang)
    out PORTB, r16    ; r16 ins IO-Register PORTB ausgeben Laser/led on


Loop3:                   ; auf Unterbrechung warten

         SBIS pinb,2     ; wenn bit 2 in r16 High ist(Empfänger aus)

  rjmp loop3             ; überspringen falls Empfänger nicht mehr high

loop4:

   cbi portb, 0    ;Laser off
   cbi portb, 1    ;led off
   sbi portb, 3    ;Pieper=pin 3 geht an)
ende:

  rjmp ende

von Karl H. (kbuchegg)


Lesenswert?

Steffen schrieb:

> und ohne Internen Pullup macht kein Unterschied. Die LED blinkt einfach
> nur.

Ein Indiz dafür, dass dein µC dauernd abstürzt oder du den Code gar 
nicht in den µC gebrannt hast (und da von vorher noch ein Blinkprogramm 
drinnen war)

In deinem Code ist nichts, was ein blinken hervorrufen könnte.

Wie sieht denn deine Hardware aus?

von Karl H. (kbuchegg)


Lesenswert?

>    sbi portb, 3    ;Pieper=pin 3 geht an)

Pieper?
Welcher Pieper?

Dir ist hoffentlich klar, dass solche Dinge des öfteren dir die 
versorgungsspannung versauen können. Was, wenn man es nicht 
berücksichtigt, genug Schmutz erzeugen kann, damit der µC abstürzt.

Womit wir wieder beim Thema 'Blinken' wären.


Also:
Aufbau. Wie ist der µC beschaltet? Wie ist deine Spannungsversorgung 
aufgebaut?

von Steffen (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> oder du den Code gar
> nicht in den µC gebrannt hast

Daran dachte ich auch schon und habe das IC gelöscht und eingebaut-> 
nichts. Dann neu beschrieben und eingebaut->blinken.


Ich habe den ATTINY an Versorgungsspannung angeschlossen. Dann 3 LEDS 
mit Widerständen (LASER ist jetzt erstmal dadurch ersetzt worden) 
angeschlossen und den, als Eingang gesetzten PIN, auf Masse bzw auf Plus 
gelegt. Die Schaltung hat also nichts mit dem Detektor zu tun. Den Reset 
Pin Habe ich mal angeschlossen und mal nicht. Auch an Plus und Masse 
(nun doch als Trial and error) geschaltet.

Nach meinem Verständniss m

von Steffen (Gast)


Lesenswert?

Steffen schrieb:
> Nach meinem Verständniss m
müsste die LED dauerhaft oder gar nicht leuchten.

von Flohzirkus (Gast)


Lesenswert?

Das macht auf mich den Eindruck, als würde der Tiny zwar mit Code 
bespielt, aber mit dem falschen.

Nämlich einem Hallo-Welt Blinken.

von Steffen (Gast)


Lesenswert?

Na geht doch es läuft, die Spannungsversorgung hatte einen Wacko. Vielen 
Dank für die viele Hilfe und sorry für diesen blöden Fehler. Gelernt hab 
ich trotzdem was =P

von Steffen (Gast)


Lesenswert?

Kleines Update für die Zweifler:

Alles funktioniert wunderbar. Ich kann die Empfindlichkeit einstellen 
und trotz direktem Sonnenlicht (ohne Abschirmung) schaltet die 
Lichtschranke beim Unterbrechen des Laserpointers. Wenn man alles 
richtig ausrichtet, sind auch größere Entfernungen gut möglich.

Mein Dank gilt vor allem Karl Heinz Buchegger
für die geduldige Hilfe.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.