Fragen zum Arduino Mega ADK internen analogen Komparator

Hallo,

ich möchte mein Arduino Mega ADK dazu bringen, einzelne Impulse einer Infrarot-LED mit Hilfe einer IR-Fotodiode aufzuzeichnen. Damit ich wirklich keinen gesendeten Impuls verpasse, möchte ich die Impulse durch Interrupts zählen.

Ich habe mich bereits über Google versucht zu informieren und glaube nun, dass der analoge Komparator mir weiter helfen kann, schließlich soll eine bestimmte Routine ausgeführt werden, wenn die Spannung der Fotodiode eine gewisse Schwelle überschreitet.

Nun vergleicht der Komparator nach meinem bisherigen Verständnis zwei Spannungen (AIN0 und AIN1), ist AIN0 größer gibt er mir eine logische eins aus.
Nach dem Schaltplan des Mega ADK ist der digitale Pin 5 AIN1, doch wie kann ich meine Referenzspannung AIN0 beeinflussen? Geht dass überhaupt, weil der Pin des ATmega gar nicht verbunden zu sein scheint? Und falls dies nicht möglich ist frage ich mich, wie ich meine Schwelle bestimmen kann bevor der Interrupt ausgelöst wird?

Viele Fragen. Ich würde mich über Antworten freuen.

Viele Grüße,
EarlyEarl

Man kann AIN0 auf eine interne Referenz legen. Dazu musst du mal ins Datenblatt schauen. Ich hab jetzt nur das für den Atmega328 da, aber da ist es Bit 6 (ACBG) im ACSR Register. Das wird ca. 1.25V sein (was normal ist für eine "bandgap reference").

Den Schwellenwert-Schalter kannst du dir auch einfach mit einem 4093 bauen. Das ist ein NAND-Gatter mit Schmitt-Trigger. Das erzeugt dir einen schönen 5V Rechteck-Impuls, den du digital weiterverarbeiten kannst. Das kannst du dann einfach auf einen externen Interrupt geben. Da ist der Schaltwert aber nicht einstellbar. Also schlecht wenn du damit die Empfindlichkeit beeinflussen willst. Aber mit Gabellichtschranken funktioniert das super.

Wenn du Impulse zählen willst, kannst du dazu auch einen der 16bit Timer nehmen und ihn extern takten. Dazu muss man einfach die Clock Select Bits auf 110 oder 111 setzen.

Danke für deine Antwort, Serenifly.

Man kann AIN0 auf eine interne Referenz legen. Dazu musst du mal ins Datenblatt schauen. Ich hab jetzt nur das für den Atmega328 da, aber da ist es Bit 6 (ACBG) im ACSR Register. Das wird ca. 1.25V sein (was normal ist für eine "bandgap reference").

Von dieser Möglichkeit habe ich bereits gelesen. Beim Atmega2560 liegt diese Referenzspannung bei 1.1V. Aber dann habe ich ja meine Referenz nicht beliebig eingestellt. Gibt es keine Möglichkeit diese variabel einzustellen, je nachdem wie empfindlich ich meine Fotodiode haben möchte?

Wenn du Impulse zählen willst, kannst du dazu auch einen der 16bit Timer nehmen und ihn extern takten. Dazu muss man einfach die Clock Select Bits auf 110 oder 111 setzen.

Was meinst du genau mit "extern takten"? Leider ist mir diese Option als Neuling noch nicht ganz klar...

Schon komisch, dass man den Pin beim Mega anscheinend nicht herausgeführt hat. Beim UNO sind beide zugänglich.

Bandabstands-Referenzen sind immer fest.

Ist ein externes IC eine Option? Komperatoren es gibt als 8-poliges IC, z.B. LM311. Man auch einen Operations-Verstärker so beschalten, dass ein rechteck-ähnliches Signal raus kommt, das eventuell direkt verwertbar ist. Oder einen einfachen Verstärker, was sowieso die besseren Ergebnisse liefert. Gerade was die Geschwindigkeit der Schaltung betrifft.

Was meinst du genau mit “extern takten”? Leider ist mir diese Option als Neuling noch nicht ganz klar…

Normalerweise zählt ein Timer/Counter bei jedem Takt des Prozessors (geteilt durch den Prescaler) eins weiter. Mit externer Taktung zählt er bei jedem externen Impuls eins weiter. Dann kann man z.B. erst nach 20 Impulsen einen Interrupt auslösen. Oder zählen wie viele Impulse in einer bestimmten Zeit ankommen. Kommt auf die Anwendung an ob das sinnvoll ist.

Ohne extra Beschaltung, die einen vernünftigen Impuls erzeugt ist das aber nichts.

Der LM311 sieht gut aus. Werde ich mir mal anschauen...

Man auch einen Operations-Verstärker so beschalten, dass ein rechteck-ähnliches Signal raus kommt, das eventuell direkt verwertbar ist. Oder einen einfachen Verstärker, was sowieso die besseren Ergebnisse liefert. Gerade was die Geschwindigkeit der Schaltung betrifft.

Da ich noch einen OPV in einer Kiste bei mir gefunden habe, finde ich diese Lösung aber auch sehr interessant. Aber wie muss ich diesen denn genau beschalten? Leider habe ich auch hier noch keine Erfahrungen. Wenn ich ein digitales Rechtecksignal aus dem OPV bekomme, könnte ich dieses ja auch wiederum als externen Interrupt weiterverarbeiten, oder? Bekomme ich überhaupt ein digitales Signal?

So viel Erfahrung habe ich damit auch nicht. Einen Photoverstärker habe ich zwei mal gebaut und das ist schon etwas her :slight_smile:

Was willst du da überhaupt genau machen? Wenn du nur digitale Signale übertragen willst, ist das hier eine gute Option, die für sowas sehr oft verwendet wird:

Damit ist erstens das Umgebungslicht heraus gefiltert und zweitens ist der Verstärker schon eingebaut. Die IR-LED muss dann auf 38kHz moduliert werden.
Allgemein werden so Fernbedienungen aufgebaut.

Bei einer Lichtschranke z.B. kann man das einfach mit einem NE555 machen:
http://www.robotroom.com/Infrared555.html
Mit LOW an Reset kann man die ganze Schaltung ausschalten und damit per Hand Impulse erzeugen. Man kann auch einen zweiten NE555 als Monoflop schalten. Den braucht man dann nur kurz anzutriggern und hat einen Impuls fester Breite. Mit einem µC (über einen Timer) kann aber auch gleich direkt ca. 38kHz erzeugen und je nach Bedarf ein-und ausschalten. Der ATtiny wird da auch oft verwendet.

Dafür gibt es auch eine fertige Library für den Arduino:

Möglichkeiten gibt es da viele.

Bekomme ich überhaupt ein digitales Signal?

Nein. Bestenfalls ein grob rechteck-ähnliches Analogsignal. So ähnlich:

Der µC erkennt halt bei 0,6V * Vcc = 3V HIGH, deshalb geht es u.U. auch damit. Wird alleine damit unzuverlässig sein, aber man kann es über einen Komparator weiter verarbeiten und dann auf einen Interrupt legen.

Am flexibelsten bist du wahrscheinlich mit einer Kombination aus Photoverstärker + Komparator mit Hysterese. Dann hast du erst mal den geringen Photostrom auf etwas höheres gebracht und kannst danach die gewünschte Schaltschwelle am Komparator einstellen. Aber generell ist ein Photoverstärker dafür gedacht Analogsignale zu erzeugen. Für eine Digitalübertragung ist das vielleicht etwas übertrieben. Da ist der TSOP4838 wahrscheinlich besser und man muss sich nicht darum kümmern eine Analog-Schaltung zu dimensionieren.

Photoverstärker:
http://www.mikrocontroller.net/articles/Lichtsensor_/_Helligkeitssensor#Konstantstromquelle_mit_Transimpedanzverst.C3.A4rker

Wie da beschrieben ist muss der Rückkoppelwiderstand so hoch wie möglich (>1 MOhm) und der Kondensator so klein wie möglich (einstellige pF) sein. Im ersten Link steht auch eine Formel zur Berechnung. Mit einem Trimm-kondensator kann man das auch ausprobieren.

Hier zum Komparator:
http://www.elektronik-kompendium.de/sites/slt/0311271.htm
http://elektroniktutor.de/analogverstaerker/kompar.html (du willst den unteren. Nicht-invertierend. Wichtig ist dabei die Formel für Uhyst - die Breite des gelben Bereichs)

Für den Spannungsteiler der Referenzspannung am besten einen Trim-Widerstand verwenden, dann kann man daran herumspielen. Ein Oszilloskop ist hier fast zwingend nötig um die Signale zu messen.

Du kannst auch erst mal die Version mit Photo-Diode und Widerstand probieren (siehe den Mikrokontroller.net Artikel) und sehen was da raus kommt. Über den Widerstand hast du etwas Spielraum um die Spannung einzustellen, aber der muss generell sehr hoch sein, weil der Photostrom gering ist. Die Schaltung ist halt langsam. Es kommt dann auf die Anwendung an ob das brauchbar ist.

Man kann auch normale OPs als Komparatoren beschalten, aber durch die interne Beschaltung für den Verstärker sind die langsam und haben eine ganze Reihe anderer Nachteile. Aber als Versuch kann man es auf einem Breadboard mal probieren bis bessere Teile bestellt sind. Mit einem OP + der Dioden/Widerstandskombination als Eingangs-Signal könntest du daher schon etwas basteln, aber die Schaltung ist alles andere als gut.

Aber schaue wie gesagt mal ob der TSOP für dich in Frage kommt. Dann hast du schon ein richtiges Digital-Signal am Ausgang und musst dich nur darum kümmern, dass die Pulse am LED-Modulator korrekt erzeugt werden. Das hat einen geringeren Schwierigkeitsgrad :slight_smile:

Danke für deine ausführliche Antwort.

Was willst du da überhaupt genau machen?

Die Idee war eigentlich Daten digital zu übertragung. Zum Beispiel ein Audiosignal mit dem Arduino zu kodieren, dann per IR-Signal zu versenden und auf der Empfängerseite wieder zu dekodieren.
Für diesen Zweck ist vielleicht tatsächlich der TSOP am sinnvollsten. Allerdings ist die Thematik offensichtlich komplizierter als ich mir sie vorgestellt habe. Aber ich werde trotzdem noch weiter probieren, auch wenn ich nicht so ganz weiß ob das Projekt tatsächlich für einen Anfänger realistisch ist. :wink:

Es ist immer ein Unterschied zwischen einer Schaltung die gerade so funktioniert und einer die gut ist :slight_smile:

Gerade was die Reichweite betrifft ist da der TSOP48 besser. Der schafft ca. einen halben Meter mit Reflektion was man so liest:

Direkt bestrahlt geht da wahrscheinlich noch mehr.

Eine reine Photodiode reagiert halt auch auf das Umgebungslicht. Ich habe mal zugesehen wie jemand so eine analoge Audioübertragung aufgebaut hat. Das funktionierte super, aber nur über ein paar Centimeter. Wenn die LED über eine Linse fokussiert wurde gingen auch mehr. Digital wirst du da sicher besser liegen, da du eben über einen Komparator einen bestimmten Schaltpegel einstellen kannst und so ein gewisses Grundrauschen heraus filtern kannst, aber wie gut das letztendlich ist müsste man ausprobieren. Das hängt auch von der Abstrahlcharakteristik der LED ab (man könnte ich auch mehrere LEDs nehmen) und der Empfindlichkeit der Photodiode für deren Wellenlänge. Idealerweise hast du da eine die nur bei Infrarot leitet.

Vergleiche z.B. das:

Mit dem hier:

Die BPX-65 hat zwar ihr Maximum auch im IR Bereich, aber sie leitet schon bei 400nm, d.h. blau/violet. Die SFH-205 fängt erst bei ca. 780nm an zu leiten und hat ihr Maximum bei 950nm. d.h. man sollte dann auch eine 950nm LED haben. Das sieht man im Diagram für "relative spectral sensitivity", jeweils oben links auf Seite 4.

Bei Audio-Codierung ist die Frage ob da der Arduino schnell genug ist. Wenn du da ständig Analog-Digital-Wandlung machen willst, musst du den ADC direkt ansteuern und nicht das langsame analogRead() verwenden. Da gibt es fertigen Code dafür, aber dadurch dass der Wandler sukzessive Approximation verwendet ist das immer noch relativ langsam.
Da musst du mal nachforschen ob das generell machbar ist, da für AD-Wandlung -> Codierung -> Senden sehr viel Zeit drauf geht. Aus dem Stegreif würde ich mal sagen, dass das für Musik nichts ist, aber für niederfrequente Sprach-Anteile (wie beim Telefon) vielleicht machbar wäre.

Von der Übertragungszeit her ist eine Photodiode natürlich wesentlich schneller, da der TSOP eine bestimmte Anzahl an Impulsen braucht um zu Triggern. Das geht dann eben auf Kosten der Reichweite und Zuverlässigkeit. Die empfohlene Mindest-Bitbreite des TSOP48xx liegt laut Datenblatt bei 10 Taktzyklen. Das sind 260µs bei 38kHz und auch noch 178µs für die 56kHz Version. Aber oft werden da mehre ms verwendet. Und zwischen jedem Bit muss nochmal mindestens 12 Takte Pause sein (mehr wenn man länger als 70 Takte schickt). Ist also sehr langsam.

Die Bauteile sind so oder so nicht teuer. Wenn du also Zeit hast und was lernen willst, kann man durchaus mit beidem basteln und sehen ob was brauchbares rauskommt.