Analog Read spinnt

Hallo liebes Forum,

Ich hab schon gegoogled, bin aber nicht wirklich schlau geworden.

Ich sende Werte 0..255 von einem Arduino A über AnalogWrite(pin,Wert) zu einem Arduino B über AnalogRead(pin).

Ich sende zum testen momentan feste Werte, die sich nicht ändern. Trotzdem erhalte ich willkürliche Zahlen zwischen 0 und 1023 aus AnalogRead. Die spanne 0..1023 ist nicht mein Problem.

Ich wüsste gern wieso das so "flackert". Ich hab zum Testen zusätzlich ne LED drangehängt, die reagiert auf Wertänderungen, "flackert" aber nie. Sprich: sind die Werte konstant, ist die Helligkeit konstant.

Bin mir sicher, ein Voltometer würde da auch keine Sprünge erkennen.

Denke es liegt am Read.

Arduino A bekommt Daten per Serial mit eine Baud von 38400, während Arduino B den Serial gar nicht benutzt. Hatte den zum Debuggen mal auf 9600, fänds aber komisch wenn DAS das Problem wäre. Hatte ihn auch mal auf 38400 gestellt, hat natürlich nichts gebracht.

Habe soeben einen Vorwiderstand eingebaut (10K). Zwischen den Arduinos. Hat nix gebracht :/

Ach, die Arduino Macher wieder...

analogWrite() ist kein DAC! Das macht PWM und gibt dir damit keine Konstante Spannung. Je nachdem zu welcher Zeit du dann misst, hast du entweder 0V oder 5V. Die Funktion hat einfach einen völlig bescheuerten Namen, da das nix mit Analog zu tun hat.

Wenn du wirklich eine Variable analoge Spannung brauchst, gibt es billige externe DACs

Aaaaah! wenn ich so über PWM nachdenke, völlig logisch ! da wird ein "analoges" Signal ja nur durch schnelles oder langsames springen simuliert...

hmm könnte ich das nicht einfach mit nem kleinen Kondensater glätten ? oder wird das dann zu träge ? ist quasi für ein ambilight-system. (vlc-player + atmoWin)

Eigentlich muss ich nur 3 Werte von arduino A nach arduino B schaffen. Ich kann die Serial verbindung aber nicht nutzen, die ist belegt.

Dann nimm I2C/TwoWire: http://arduino.cc/en/Tutorial/MasterWriter http://arduino.cc/en/Tutorial/MasterReader http://www.instructables.com/id/I2C-between-Arduinos/

Das ist simpel einfach. Einer ist Master und sendet Daten. Der andere ist Slave und empfängt Daten. Der Code ist minimal. Geht Byte-weise. Also für zwei Bytes einfach mehrmals read() und write() machen.

Zwei-Wege Kommunikation geht auch. Die Slaves können antworten, aber nicht unaufgefordert Daten senden. Siehe das MasterReader Beispiel.

Was in dem Tutorial aber glaube ich fehlt, sind die 4,7k Pullups auf den I2C Leitungen! Ohne die geht das nicht.

Ich nehme mal an du hast UNOs. Der Mega hat mehrere serielle Schnittstellen.

Eigentlich muss ich nur 3 Werte von arduino A nach arduino B schaffen.

Und wie weit sind die voneinander entfernt? I2C/SPI sind ohne Zusatzhardware nur bis ca. 0.5m brauchbar. Etwas mehr Information zu Deinem Projekt könnte nicht schaden.

KYL3R: Aaaaah! wenn ich so über PWM nachdenke, völlig logisch ! da wird ein "analoges" Signal ja nur durch schnelles oder langsames springen simuliert...

hmm könnte ich das nicht einfach mit nem kleinen Kondensater glätten ? oder wird das dann zu träge ? ist quasi für ein ambilight-system. (vlc-player + atmoWin)

Eigentlich muss ich nur 3 Werte von arduino A nach arduino B schaffen. Ich kann die Serial verbindung aber nicht nutzen, die ist belegt.

Nein nichts mit schnell oder langsam springen. Ein Puls Weiten Modulations-Signal (PWM) ist eine Rechteckspannung mit konstanter Frequenz wo das Verhältnis (Zeit) von HIGH zu LOW verändert wird. PWM = 0: H 0%, L 100% PWM = 127: H=50%, L=50% PWM = 255: H=100%, L=0%

Du kannst aus einem PWM-Signal mit einem RC-Glied Gleichstrom machen. Das Gleichstromsignal ändert sich dann aber nicht so schnell.

Für die Übertragung kannst Du auch die Serielle TTL Schnittstelle benutzen. Dann kanst Du aber nicht ohne die Verbindung auszustöpseln ein Update des Sketches machen. Als Distanz sinh einige 10 m leicht machbar.

Grüße Uwe

Danke für die Antworten.

@ playon: Entfernung ca 6m. Was meinst du mit Zusatzhardare ? Gehts um den Spannungsabfall bzw. die geringe Schaltleistung der output-pins ? Ich hab hier noch ein paar Transistoren rumliegen, alte Netzteile zu genüge. Könnte ich das Signal mit einem Netzteil und den Transistoren verstärken ?

@ Serenifly: Habe duemilanoves, denke die zählen als UNOs, oder ?

@ uwefed: Ich weis wie PWM funktioniert, ich drücke mich nur manchmal ungenau aus. Mir gings darum, dass die Spannung immer von HIGH zu LOW (und andersherum) springt. Die variablen Pausen dazwischen, habe ich unglücklicherweise mit “schnell” und “langsam” ausgedrückt.

Du kannst aus einem PWM-Signal mit einem RC-Glied Gleichstrom machen. Das Gleichstromsignal ändert sich dann aber nicht so schnell.

  • Das war mein Grundgedanke mit dem Kondensator. Kannst du grob sagen, wie träge die Übertragung dann wird ? Die Aufladung eines Kondensators läuft ja, wenn ich mich jetzt richtig ausdrücke, immer als eine Näherung ab. Der Wert nähert sich der angelegten Spannung. Angenommen mir reicht eine genauigkeit von 80%, in welchem Bereich liegen die Verzögerungen ? <100ms ?, <500ms oder größer ?

Für die Übertragung kannst Du auch die Serielle TTL Schnittstelle benutzen. Dann kanst Du aber nicht ohne die Verbindung auszustöpseln ein Update des Sketches machen. Als Distanz sinh einige 10 m leicht machbar.

Das müsste dann ein ähnliches Problem sein, wie bei Bluetooth modulen. Die nutzen die RX und TX pins, dann muss man das Modul auch immer abklemmen um neuen Code zu laden.
Ich ändere den Code nicht häufig, daher wäre das egal.
Aber was mich an Bluetooth gestört hat (anderes Projekt) war, dass der Microcontroller neu startet, wenn die Bluetoothverbindung beendet wird. Da musste ich einen Kondensator an 2 Pins hängen, was auch nicht immer geholfen hat.
So etwas würde ich gern vermeiden.

edit: mir fällt gerade ein: Wenn die Spannung im USB kabel reicht, kann ich den Arduino A auch direkt neben den Arduino B stellen, dann bräuchte ich zwar ein 6m USB Kabel, aber dann hätte ich das Reichweitenproblem mit I2C/SPI nicht mehr.

Ok, bei 6m kannst du I2C vergessen.

Hier bietet sich dann vielleicht RS485 an: http://de.wikipedia.org/wiki/RS485

Das würde hier sehr, sehr ausführlich diskutiert: http://forum.arduino.cc/index.php?topic=206317.0

Dazu bräuchtest du je einen MAX485 als Transceiver: http://www.maximintegrated.com/datasheet/index.mvp/id/1111

Software technisch geht das über SoftSerial.

Bei 6m könntest du auch Infrarot. also Fernbedienungscodes, oder 433Mhz-Funk nehmen.

KYL3R:

  • Das war mein Grundgedanke mit dem Kondensator. Kannst du grob sagen, wie träge die Übertragung dann wird ? Die Aufladung eines Kondensators läuft ja, wenn ich mich jetzt richtig ausdrücke, immer als eine Näherung ab. Der Wert nähert sich der angelegten Spannung. Angenommen mir reicht eine genauigkeit von 80%, in welchem Bereich liegen die Verzögerungen ? <100ms ?, <500ms oder größer ?

Das hängt im wesentlichen davon ab, wie genau die übertragene Spannung sein soll.
Beispiel: du nimmst einen PWM-Kanal mit 980Hz, hängst an den einen Tiefpass mit 4,7K und 10µF. Dann hast du nach ca. 250ms deinen Endwert erreicht, und eine Restwelligkeit des Signals von ca. 27mV.
Wenn du den Tiefpass kleiner nimmst, z.B. 4.7k / 1µF, dann hast du deinen Pegel bereits nach 25ms erreicht, aber einen Riple von 270mV.

Genauigkeit von 80%? Ich denke du meinst 20%, also 20% von 5V = 1V.
Dann könntest du sogar auf 4.7k / 330nF gehen, damit hast du einen Riple von ca. 800mV und deinen Pegel bereits nach ca. 8ms erreicht.

Im Anhang findest du Simulationsplots der drei Varianten für einen Sprung von 0% auf 50% PWM.

Hallo,

Du hast zwar geschrieben, so lese ich das heraus, dass es nicht so genau darauf ankommt, jedoch macht es aus meiner Sicht keinen Sinn ein schon vorhandendes digitales Signal/Wert, wieder zu "analog" zu wandeln dann wieder zurück. Ein digitales Signal wird bis zum Ende beibehalten. Erst zum Schluss, wenn man analog wirklich benötigt wandelt man es um.

Mit einer seriellen Übertragung kannst Du Deine 6m locker überbrücken. Sollte man nicht die allzu dünnsten Kabel/Querschnitte nehmen. Zur Not kann man auch mit 2x MAX232 den Pegel für die Übertragung erhöhen.

Mit dem RC Glied das PWM Signal "stabil" zubekommen geht zwar auch, ist aber in meinen Augen Pfusch am Bau. Du kannst niemals aus der Ladezustand des Kondensator zurück auf dem Originalwert schließen. Weil es davon abhängt wann Du die Spannung analog einliest. Dazu müßtest Du wissen wann die letzte PWM Änderung war und in welche Richtung, rauf oder runter, und dann immer nach der gleichen Zeit die Kondensatorspannung einlesen. Ein Ding der Unmöglichkeit.

Danke für die Antworten, ich bastel dann mal ein wenig :)