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.
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?
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.
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?
@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.
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.
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)
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
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.
Schon über die erste Zeile sollte "man" nachdenken. Du solltest darüber
nachdenken. DDRB ist das RICHTUNGS-Register. Tutorial nochmal. Und
Codeformatierung verwenden.
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.
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
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.
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.
> 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
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.
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!
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.
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!
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.
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)
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
> 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?
> 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.
> 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.
> 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 :-)
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.
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.
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
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?
> 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?
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
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
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.