Daten über Lichtimpulse an Arduino senden

Hallo zusammen,

ich bräuchte mal wieder einen Denkanstoß. Ich möchte Daten von Außerhalb an einen Arduino schicken. Dazu möchte ich Lichtimpulse mit einem Phototransistor empfangen. An Daten sind zwei gleichlange Byte Arrays (je max 31 bytes lang) und zwei einzelne bytes, von denen eines die Länge der Arrays angibt. Als Pulsgeschwindigkeit der Lichtquelle reichen 10Hz, evtl sogar langsamer. Mir geht es nicht um die Sendeseite, die wird passend zur Empfangsseite gelöst und auch nicht von mir. Ein Programm am Rechner soll einen Teil des Bildschirms blinken lassen. Meine Idee ist den Empfangsmodus durch einen Tastendruck zu starten, und wenn innerhalb von 10Sekunden keine passende Startsequence kommt würde ich wieder abschalten. Ich suche nicht nach fertigen Lösungen, sondern mich interessiert wie würdet ihr das generell angehen? Wie einzelne bytes definieren, wie codieren? Die einzelnen bits eines bytes blinken, dann Pause? Noch irgendeine Checksumme einfügen, um fehlerhafte Übertragungen zu erkennen? Ich bin noch in der Orientierungsphase und bin für alle Hinweise, die mich in eine richtige Richtung schicken dankbar.

Grüße,

Sven

Am einfachsten geht es die Serielle Schnittstelle auf ein LED schalten und auf der anderen Seite einen Fototransistor. Wenn Du es sicherer gegen Stöhrungen bzw Umweltlicht machen willst dann alles modulieren und mit einem TSOP lesen. Am ende ofder zwischendrin ein odere mehrere Prüfbytes einfügen. Grüße Uwe

Gute Idee, aber die Lichtquelle soll ein blinkendes Quadrat auf einem Monitor sein. nicht eine LED. Es geht darum Daten ohne Kabel, Treiber, sonstwas vom Rechner auf den Arduino zu bekommen. Kann ich die seriell.read Funktion im Arduino mit 10baud oder weniger verwenden? Ich glaube das ist zu langsam. Der Fototransistor soll in ein schwarzes Plastikrohr das an den Monitor gehalten werden kann. Grüße,

Sven

Hallo, hat so ein Monitor nicht eine bestimmte Bildwiederholfrequenz? D.h. doch, dass Deine Signale "länger" als diese Wiederholfrequenz sein müssen? Das über die serielle zu machen ist keine dumme Idee. Wenn Du eine Taste betätigst, dann könntest Du Dir einen "millis() Timer" programmieren, der 10sec runterzählt und dabei die serielle abfragt.

Die serielle Übertragung ist ja ganz genau beschrieben. Im Grunde genommen sind es ja nichts anderes als HIGH/LOW Pegel in einer bestimmten Zeit- mit einer bestimmten Länge. Du könntest also bei HIGH/Bildschirm an, und bei LOW/Bildschirm aus senden. Die "Sicherheit der Übertragung ist ja durch das serielle Protokoll gesichert dass Du verwenden möchtest. Es gibt doch bestimmt ein Terminal Programm, das eine virtuelle LED im Takt der Übertragung blinken läßt. Die würde ich einmal "anzapfen" mit LDR oder Fototransistor. Dieses geblinke fügst Du dann der seriellen des Arduino zu und schaust mal, ob diese Idee Müll ist. Eigentlich sollte das funktionieren. Gruß und Spaß Andreas P.S. zum üben spielt es keine Rolle, ob ein Quadrat oder eine "LED" blinkt.

Kann ich die seriell.read Funktion im Arduino mit 10baud oder weniger verwenden?

10 (bis 20 ?) Bd sollte ein Monitor “blinken” können, bei 60 Hz Bildwiederholrate.
Formal ist

  Serial.begin(10);

erlaubt. Probiers’ aus !
Ansonsten ist das so langsam, dass du es auf Arduino-Seite locker “von Hand” erfasst kriegst.
Das nannte man früher “Morsen” . :wink:

Danke allen Antwortern bisher. Ans Morsen habe ich auch schon gedacht beim Brainstorming, aber dann sofort verworfen, da ich lieber ein byte mit Start und Stopp bit auswerte, als die einzelnen dezimalstellen wieder zusammenfüge. Macht etwas weniger Aufwand und ist damit auch weniger fehleranfällig. Wenn Serial.begin(10); erlaubt ist, und auch funktioniert wäre das großartig. Dann hätte ich wirklich eine sehr einfache Lösung. Muss ich mir anschauen.

sven222: Wenn Serial.begin(10); erlaubt ist, und auch funktioniert wäre das großartig. Dann hätte ich wirklich eine sehr einfache Lösung. Muss ich mir anschauen.

Erlaubt ja, verbietet Dir niemand. Funktioniert, nein.

Unter ca. 250 Baud kannst Du auf einem 16 MHz AVR Controller nicht verwenden, weil sonst ein größerer Baudratenteiler eingestellt werden müßte als er in das zuständige Baudratenregister hineinpasst.

Mit einem "Serial.begin(10);" wirst Du also keine serielle Verbindung mit 10 Baud aufbauen können.

Du kannst Dir aber mal "SoftwareSerial" ansehen, da diese Library nicht die Hardware-Baudratenregister verwendet, könnte es dort anders sein und ggf. beim selben Controller-Takt niedrigere Baudraten unterstützt werden. Ich habe mir den Code diesbezüglich nicht angesehen, aber möglich wäre es (ggf. nach Modifikation der Library?).

Was hälst du davon es so ähnlich zu machen wie DCF77 nur halt mit kürzer Zeiten also z.B. 5ms Signal ist eine 0 und 10ms eine 1 alle 20ms 1 Bit also 5ms on 15ms off =0 10ms on 10ms off =1 das Wären 6 Byte pro Sekunde bei 1 Diode. Die macht dan Takt und Daten sie Steigende Flanke ist der "Takt" die länge ist dann das Bit

Oder wie bei den optischen TAN verfahren. 5 Dioden 1 Diode ist Takt und die Anderen 4 Daten dann hättest du 24byte/s. Dies wird auch über Monitore gemacht aber die Taktfrequenz des "Taktgeberfensters" kenne ich nicht genau. Vorteil hierbei du hast einen Festen Takt könnest eine gute Start Sequenz machen und bist denke ich mal zuverlässiger. Gruß DerDani

Danke nochmal allen. Software Serial scheint nicht zu gehen, zumindest dem Code nach, den ich gesehen habe. Da war das niedrigste 300baud. Das mit dem DCF77 hört sich recht gut an, müsste aber höchstwahrscheinlich verlangsamt werden, da bei 60Hz Bildschirmfrequenz 5 und 10ms wohl zu kurz sind zum Unterscheiden. So langsam wie das originale DCF77 darf es aber auch nicht sein. Es macht aber auch nichts, wenn die Übertragung der 64Byte eine Minute oder zwei dauert. Das mit kurz für 0 und lang für 1 gefällt mir, dann kann man in der Startsequenz kurz und lang definieren. Also dreimal kurz blinken, Durchschnitt ist 20ms, also wird im folgenden kurz zwischen 15 und 25ms definiert. Dann dreimal lang blinken, Durchschnitt ist 41, also wird 1 als 36 bis 46ms definiert. So könnte man je nach Monitor andere Geschwindigkeiten fahren, ohne am Chip was ändern zu müssen. Da muss ich mal weiter darüber nachdenken, ich glaube so könnte das was werden. Für 5 unterschiedliche Dioden ist leider kein Platz. Das könnte die Übertragung natürlich beschleunigen. Grüße,

Sven

sven222: Software Serial scheint nicht zu gehen, zumindest dem Code nach, den ich gesehen habe. Da war das niedrigste 300baud.

Die Tabelle könnte man leicht erweitern, aber wenn ich das richtig sehe, wird ein komplettes Byte im Interrupt-Handler eingelesen, mit "tunedDelay" - Blockade. Das ist schon bei 300 Bd grenzwertig, finde ich.

Ein Protokoll mit kurzen und langen Pulsen ist interessant. Die vielen Startpulse kann man sicher reduzieren, wichtiger ist eher die deutliche Pause ( weder kurz noch lang ) -- bei DCF in Sekunde 59 -- .

Für 5 unterschiedliche Dioden ist leider kein Platz. Das könnte die Übertragung natürlich beschleunigen.

Alternativ ein "optisches 2Wire" Protokoll mit 2 Leuchtflecken ( CLK / DATA ) Da es nicht auf genaue Pulslänge ankommt, gewinnt man sicher Geschwindigkeit ( ca. 4 fach ?) Und ist einfacher zu justieren als die 5 Led - Alternative...

Dein Vorhaben erinnert mich ein wenig an Onlinebanking. Da werden auch Photozellen an einen Monitor gehalten, der dann mit blinkenden Quadraten eine Kennung an eine kleine Box überträgt, in die die EC Karte eingesteckt wurde und an der man dann die errechnete TAN für die Autorisation einer Überweisung oder einer anderen Transaktion ablesen kann.

Ich würde das ggf. so machen, dass ich mit fünf Photodioden arbeite. Eine gibt den Takt vor, die anderen vier empfangen die Bits. Damit könntest Du mit Statusveränderungen (also einmal An und einmal Aus) ein ganzes Byte übertragen. Durch die relativ niedrige Frequenz des Monitors könntet Du damit dann wenigstens etwas schneller übertragen...

Grüße Tim

hi,

hab' mich schon gewundert, warum keiner die idee mit data und clock bringt. das würde die sache immens vereinfachen und "sicherer" machen. einfach mit zwei photozellen in zwei röhrchen nebeneinander und auf dem bildschirm zwei kleine quadrate. immer wenns auf dem einen quadrat hell wird, auf dem anderen schauen, ob hell oder dunkel.

gruß stefan

Danke Euch allen. Wenn es das Platz Problem nicht gäbe, bzw. mir eine Lösung für das Platzproblem einfällt, dann wären fünf LEDs wirklich großartig. Zweimal Blinken und ein ganzes Byte übertragen wäre großartig. Aber auch zwei Fotodioden, für die habe ich auf alle Fälle Platz, wären schon prima. Ich muss mir so ein Olinebanking-Tan-Dings mal genau anschauen.

Grüße,

Sven

Hallo Sven, hi all,

bei den SPS- Steuerungen, wenn wir mit Bus Teilnehnehmern kommunizieren, dann arbeiten wir häufig mit 'Lebensbits'

Der eine Partner sendet regelmäßig eineInformation, der andere Partner kontrolliert, ob sich diese Info geändert hat. Wenn, alles ok, wenn nicht, dann stimmt mit der Kommunikation etwas nicht.

Wenn dein Empfänger auf den Monitor schaut, dann kannst Du eine Startinfo senden, um den Datenverkehr zu aktivieren. Dann kommt die Info, dann der EOF Befehl/ eine Checksumme. Solange dann keine Signale eintreffen, steht die Info halt, bis sie, ohne Taster, aufgeweckt wird..

Such doch mal bei Volksbanken oder Sparkassen. Ich meine die haben ein 'Online Testkonto' wo auch solche Sachen mal angeguckt werden könnten..

Greetz, Linpo

Hi Linpotec,

ist jetzt zwar etwas OT, aber Du glaubst gar nicht, was für Fehler ich schon in den verschiedensten Watchdogauswertungen gefunden habe. Teilweise nur Alarmauswertung bei Null, wenn er also auf eins hängen blieb ist nichts passiert, teilweise dasselbe mit Zustand Eins, und teilweise mit Zeitverzögerungen, so dass die Änderungen nicht erfasst wurden. Und dann sitzt auf der Gegenüberliegenden Seite ein studierter Automatisierer, der einem Doddel wie mir nichts glaubt, weil ich ja nicht gelerneter sondern hineingewachsener Automatisierer bin. Aber das nur so am Rande zum Thema Watchdog, und alle drei Vorfälle innerhalb der letzten sechs Monate.

Grüße,

Sven, der ein zählendes Watchdogbyte bevorzugt

OHHH,

Hallo Kollege.... wo ist das Emoticon mit den Bierchen...

so machen wir das auch, dass sich zwei Zähler im Ping Pong überwachen... Watchdog war daaaamals, A020 AEG Zeiten..

Jetzt, Siemens, 300er, PN oder DP Bus, da können die Systembausteine schon einiges, gerade in Kommunikation mit anderen, also außerhalb unserer Steuerungen, da ist so eine Busüberwachung mit Zähler schon wichtig.

BTT: Bei den Fernschreibern kenne ich die RY- MEthode, also es wird zu Begin der Übertragung z.B. 10 mal RY gesendet (IOIOI-OIOIO), dies weckt den Partner quasi auf...

Welchen Datendurchsatz also Zeichen pro Zeit/ die Datenmenge strebst Du denn an? Luft zu Luft?Laser? LWL?

Greetz, Linpotec

Die Geschwindigkeit wird der Sender festlegen. So schnell wie wir zwei Quadrate auf dem Monitor blinken lassen können, so schnell wird übertragen. Es sollen tatsächlich Daten von einem Monitor abgegriffen werden.