Hallo alle zusammen,
Ich und ein Kumpel wollen für unsere Facharbeit in der Schule eine
Lichtschranke bauen, die in einer hohen Frequenz blinken soll, um
Störungen durch Fremdlicht zu vermeiden. Und da kommen wir nicht weiter.
Ich habe schon in einem anderem Thread gesehen, dass es so manche gibt,
die nicht so die Fans von BASIC sind, allerdings ist es mir leichter
gefallen, in BASIC einzusteigen, als in Assembler. Da wir so ziemlich
keine Ahnung vom Programmieren eines Mikrocontrollers haben - und wir
benutzen zwi ATtiny12s - haben wir uns auf eine simple Methode geeinigt:
Der eine tiny steuert ein Senderprgramm, der andere ein das
Empfängerprogramm.
Eine LED soll in einem gleichmäßigen Takt blinken, wobei An- und
Auszeiten gleich lang sind.
Das Empfängerprogramm soll warten, bis es einen ersten Input bekommt,
sodass es sich mit der Blink-LED syncrhonisieren kann. Dann soll es in
dem Takt, in dem die LED umschaltet, deren Status abfragen. D.h. es
weiß, wann die LED an sein sollte und wann aus. Ist kein Licht
vorhanden, obwohl die LED an ist, dann soll eine neue LED leuchten, die
signalisiert, dass etwas den Lichstrahl blockiert. Genauso soll diese
LED leuchten, wenn Licht vorhanden ist, obwohl die Blink-LED aus ist. So
soll darauf hingewiesen werden, dass zuviel Störlicht vorhanden ist.
Alles in allem recht simpel. Das Senderprogramm funktioniert. Die
Blinkfrequenz ist uns momentan egal, Hauptsache es läuft. Gelötet ist
der Sender bereits und eine Möglichkeit, das analoge Signal in ein
digitales umzuwandeln haben wir auch.
Was uns fehlt, ist ein funktionierender Code in BASIC. Ich habe schon
versucht, einen zu schreiben, aber der scheint nicht zu funktionieren
und ich glaube er ist so schlecht, dass ich ihn hier besser nicht poste.
Könnt ihr uns irgendwie helfen?
> haben wir uns auf eine simple Methode geeinigt:>> Der eine tiny steuert ein Senderprgramm, der andere ein das> Empfängerprogramm.
Merke:
2 Prozessoren in einem Projekt einzusetzen, in dem einer schon
unterfordert ist, ist NIEMALS simpler, als alles nur auf einem Prozessor
zu machen.
Mehrere Prozessoren VERKOMPLIZIEREN die Dinge normalerweise, weil die
beiden Prozessoren dann auch noch miteinander reden müssen!
> Dann soll es in dem Takt, in dem die LED umschaltet, deren Status> abfragen.
Woher weiß er den exakten Takt?
> D.h. es weiß, wann die LED an sein sollte und wann aus.
Trugschluss: Genau das weiß er eben nicht. Denn die beiden µC werden
nicht exakt genau gleich schnell arbeiten. Noch nicht einmal dann, wenn
beide einen Quarz spendiert bekommen.
Wenn ihr von Tuten und Blasen keine Ahnung habt, solltet ihr tunlichst
davon Abstand nehmen, die Aufgabenstellung aus Coolness heraus
komplizierter zu machen als unbedingt notwendig.
Fremdlicht ist zwar ein Problem, aber wenn ihr das mit einer
Modulationsfrequenz nicht hinbekommt, dann lasst das fürs erste weg.
Kommt halt der Empfänger in ein Rohr mit einer Blende, so dass er
tatsächlich nur den Sender sieht, und schon ist Femdlicht auch kein
Problem mehr.
(Hinweis: es gibt aber auch Infrarotempfänger, die haben die notwendigen
Filter schon in Hardware eingebaut. Dieser Empfänger liefert nur dann
eine 1, wenn Licht mit der richtigen Modulationsfrequenz drauf fällt)
Ok, sowas ähnliches hatte ich schon fast befürchtet. Dann ändern wir mal
die Bedingungen: Es soll alles über einen Prozessor laufen und nicht
über zwei. Ich hoffe, da lässt sich schon mehr machen. Und die
Blinkfunktion hätten wir aber trotzdem gerne drin.^^ Wie sieht das Ganze
jetzt aus?
Niklas schrieb:> Ok, sowas ähnliches hatte ich schon fast befürchtet. Dann ändern wir mal> die Bedingungen: Es soll alles über einen Prozessor laufen und nicht> über zwei. Ich hoffe, da lässt sich schon mehr machen. Und die> Blinkfunktion hätten wir aber trotzdem gerne drin.^^ Wie sieht das Ganze> jetzt aus?
Programm schaltet LED ein
Programm sieht nach ob der Empfänger das Licht auch sieht
Programm schaltet LED wieder aus
Programm sieht nach ob der Empfänger jetzt kein Licht sieht
und alles wieder von vorne
(und natürlich nocht entsprechende Ausgaben bzw. Fehlerausgaben wenn das
erwartete Ergebnis nicht vorhanden ist)
Wo ist da jetzt das Problem?
(Und ehe du jetzt antwortest: Du wirst hier im Forum niemanden finden,
der euch das Programm schreibt. Die Spielregeln lauten: Ihr legt vor,
das Forum korrigiert oder erläutert unklare Punkte)
Ehe es ans Coden geht, solltet ihr euch einen Ablaufplan zurecht legen.
Dann stellt sich nämlich raus, das die umgekehrte Reihenfolge besser
ist, weil die Erkennung einer Störung dann einfacher ist. Nur dann wenn
keine Störung vorliegt, muss überhaupt nachgesehen werden, ob die
Lichtschranke unterbrochen wurde.
1
LED ausschalten <-----------------------------+<--+<--+
2
Empfänger abfragen | | |
3
Licht vorhanden? Ja ----------> Störung! --------+ | |
4
| | |
5
Nein | |
6
| | |
7
LED eischalten | |
8
Empfänger abfragen | |
9
Licht vorhanden? Ja ----- LS nicht unterbrochen!-----+ |
Meiner Meinung nach ist das Konzept nicht ganz durchacht. Der Trick bei
der Modulationsfrequenz ist ja der, daß erkannt wird, ob die Beleuchtung
jetzt durch den Sender oder durch Fremdlicht kommt.
Wenn ihr jetzt eine einfache Fotodiode als Empfänger nehmt und nicht
schon auf der analogen Ebene die Modulationsfrequenz als Nutzsignal
herausfiltert passiert folgendes: Ohne Fremdlicht kommt tatsächlich die
Modulationsfrequenz als Ausgangssignal raus. Mit Fremdlicht kommt ein
Dauersignal mit überlagerter Frequenz heraus. Dieses Signal wird am
Digitaleingang eines Mikrocontrollers nur einen dauerhaften
Schaltzustand auslösen. Er erkennt: Licht da, aber keine Frequenz. Das
kann nur noch als Störung ausgewertet werden, da jetzt nicht mehr
erkennbar ist ob die Schranke unterbrochen ist.
Empfehlung: Verwendet einen Empfänger, der bereits intern die
Modulationsfrequenz ausfiltert wie z. B. SFH5110. Das Teil ist ziemlich
unempfindlich gegen Fremdlicht. Da kann man dann ziemlich sehr sicher
sein, daß ein Ausgangssignal nur noch dann vorhanden ist, wenn die
Lichtschranke nicht unterbrochen ist.
Sooo..
$regfile = "attiny12.dat"
$crystal = 8000000
$tiny
Blinker Alias Portb.0
Eingang Alias Pinb.1
Status Alias Portb.2
Config Blinker = Output
Config Eingang = Input
Config Status = Output
Do
Ausphase:
Blinker = 0
If Eingang = 1 Then
Status = 1
Goto Ausphase
Else
Status = 0
Goto Anphase
End If
Anphase:
Blinker = 1
If Eingang = 0 Then
Status = 1
Goto Anphase
Else
Status = 0
Goto Ausphase
End If
End
Da ich meinen Computer neu starten müsste, damit ich BASCOM zum Laufen
bringe und ich darauf keine Lust habe, weiß ich nicht, ob vor dem End
noch ein "Loop" fehlt. Laut meiner Logik sollte es aber sonst das tun,
was ich möchte, aber funktioniert es auch so?
PS: Falls der Code schon zu lang ist, um ihn im Text zu posten, dann
sagt es mir bitte.
Hallo!
Das Froblem des Fremdlichts ist ja nicht bei Gleichlicht oder
Wechsellicht mit 50 oder 100 Hz zu Ende. EVGs (elektronische
Vorschaltgeräte) oder LED-Dimmer erzeugen unter Umständen Wechsellicht
im Modulationsbereich der Lichtschranke. Auch mehrere Lichtschranken an
einer Maschine können sich manchmal, über spiegelnde Metallteile,
gegenseitig "sehen". Eine geeignete Codierung des eigenen Senders, mit
(quasi-)zufälligem Wechsel, ist ja für den Prozessor normalerweise kein
Problem.
würde Euch jede Unterstützung verweigern, wenn Ihr schon zu faul seid,
den
Computer neu zu starten um ein Programm zu testen. Nur so, aus
pädagogischen Gründen und weil ihr mal für unsere Rente zuständige sein
sollt usw....
Das einfachste ist, eine komplette, fertige Lichtschrankge zu kaufen.
Aber was wollt ihr mit dem Projekt lernen?
Zwischen "Kaufen" und "Rad neu erfinden" gibt es diverse Abstufungen.
Bei einer Lichtschranke, die ein bisschen mehr als eine
Gabellichtschranke kann, gibt es diverse Baustelle: Optik,
Analogelektronik, Auswertung, Steuerung usw. Je besser die Signale sind,
um so einfacher ist die Auswertung. Also würde ich nicht ganz hinten
anfangen sondern erstmal einen Plan machen, wie die Anforderungen genau
sind, wo die Knackpunkte liegen, was fertig gelauft werden soll und wo
selber Erfahrungen gemacht und Arbeit reingesteckt werden soll.
Gruß Optiker
Ja, es fehlt noch das "Loop". Das Programm ist doch auch im Simulator
von
Bascom gut zu testen. Damit kannst Du schon mal "trocken" testen, ob es
das
tu, was Du erwartest.
Entrümpele mal Deinen Rechner, wenn das Booten so lange dauert, daß Du
Dich 2x rasieren kannst, bevor er benutzbar ist.
;-)
MfG Paul
Paul Baumann schrieb:> wenn das Booten so lange dauert, daß Du Dich 2x rasieren kannst
LOL...
Erst mal so alt werden... ;-)
Niklas schrieb:> Ich und ein Kumpel wollen für unsere Facharbeit in der Schule eine> Lichtschranke bauen, die in einer hohen Frequenz blinken soll, um> Störungen durch Fremdlicht zu vermeiden.
Ich würde da einfach einen Pin mit einer PWM-Frequenz von 10kHz vor sich
hin toggeln/"blinken" lassen und damit die LED ansteuern.
Auf der Emfpängerseite reicht dann ein Phototransistor/-diode, ein
Kondensator und ein Verstärker mit anschliessender
Dioden-Gleichrichtung. Mit dem resultierenden Signal auf einen
AD-Eingang und fertig ist die Laube.
Warum macht ihr euch nicht erst mal schlau, wie Andere diese Aufgabe
gelöst haben?
Für einen Ideenklau auf nicht allzu hohem Niveau immer gut:
http://people.ece.cornell.edu/land/courses/ece4760/FinalProjects/
Hm, ATtiny12 ist natürlich auch eine 'alte' Gurke, hat kein ADC.
Ein ATtiny13 hat nen ADC, mit dem könnte man in Software einen einfachen
digitalen Lock-in realisieren. Nette Idee, muss ich mir merken :)
Wenn's unbedingt der ATtiny12 sein soll, klingt Lothars Vorschlag gut
(vielleich noch mit nem Filter gene 50Hz?), oder eben die Benutzung von
Standard-Fernbedienungskomponenten.
(Gast) schrieb:> vielleich noch mit nem Filter gene 50Hz?)
50Hz ist Gleichspannung verglichen mit 10kHz.
Ein billiger Hochpass (aka. Kondensator) reicht da idR. schon aus...
Und für die ganz Ausgefuchsten darf es dann ein Bandpass (aka.
Schwingkreis) sein...