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) |
26 | |
27 | |
28 | ende: |
29 | |
30 | rjmp ende |
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) |
23 | |
24 | |
25 | ende: |
26 | |
27 | rjmp ende |
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
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.