Gut das du Bilder gepostet hast. Wenn ich das richtig sehe nutzt du nicht den "Ground" neben A und B auf dem RS485-Adapter, sondern gehst direkt mit dem roten Kabel vom DPM zum Arduino GND. Das ist nicht richtig. Verbinde einfach den dritten Kontakt "Ground" neben A und B mit dem DPM "GND" und nicht den Arduino direkt. Das hatte ich oben schon mal so geschrieben. Sieh dir auch mal an wie @nili76 die drei gelben Leitungen angeschlossen hat. Ein Bild von meinem Aufbau schauen nicht viel anders aus, außer das ich drei unterschiedliche Farben für die Leitungen nutze.
Die falschen Spannungswerte können dann von fehlerhaften Massepotentialen durch deine falsche Verdrahtung kommen. Aber das ist nur eine Vermutung. Falsch angeschlossene Masseleitungen und GND Leitungen sind immer und überall eine häufige Fehlerquelle. Auch bei Profis. Noch ein Tip. Nimm für Vcc (also z.B. +5V ) ein rotes oder oranges Kabel und für Masse, Ground oder GND ein schwarzes oder blaues. Das hilft bei der Fehlersuche und ist eigentlich so üblich. Signalleitungen dann die restlichen Farben.
Viele Grüße,steve
Danke dir für die Bilder.
Als größter Unterschied zu unseren Verkabelungen fällt mir auf, dass ich den GND vom DPM mit dem Arduino verbunden hast. Du dagegen verbindest GND vom DPM mit dem Ground vom Adapter.
Genau für solche möglichen Unterschiede habe ich auch die Bilder gezeigt. Deine Verkabelung werde ich mit dem Arduino heute Abend mal testen.
Danke dir, verkabel ich heute Abend mal um. Könnte dann besser klappen.
Die Farbgebung setze ich noch um, aktuell ist es nur ein Testaufbau bei dem mir Farben erstmal egal waren. Wenn ich dann doch es irgendwann schaffe 4 Geräte anzuschließen, mache ich es übersichtlicher.
Ich bin übrigens jetzt schon gespannt, ob die von euch vorgeschlagene Verkabelung dann vllt auch mit dem DPM8624 funktioniert. Der einfache kann ich nur TTL verstehen aber die DPM8600 Lib kommuniziert ja über TTL.
Ihr hattet ja schon genug über GND gesprochen, aber nur nochmal zur Sicherheit:
GND vom DPM zum Adapter. Aber auch GND vom Adapter zum Arduino. Ich hab nur 3 Adern verdrahtet. Der Adapter und der DPM braucht kein VCC (bei mir). Deswegen der Knoten in einem Kabel.
Du warst ja so gut und hast auch deine Verkabelung geteilt. Darauf konnte ich schon erahnen, wo du GND verbunden hast.
Das hilft schon enorm und genau das hatte ich mir vom Teilen meiner Bilder erhofft hatte.
Bin wirklich gespannt über das Ergebnis heute Abend.
Ich gehe immer davon aus, dass ich alles verstehen und lernen kann, aber manchmal sieht man den Wald vor lauter Bäumen nicht.
Bin fest davon ausgegangen und gehe es immer noch, dass ich Fehler im Aufbau habe.
Hier das erste Update:
Ich habe die Verkabelung so gemach wie beschrieben. Leider ohne Erfolg.
Daher teile ich nochmal die Bilder der Verkabelung und meinen Code. Morgen komme ich vllt dazu das nochmal in anderer Kombi und übersichtlicher zu testen.
Ausgabe ist übrigens v = 27.00 oder v = 28.00
Ich bin mir übrigens über 90% sicher, dass ich alles korrekt angeschlossen habe.
VCC 5V und GND an den Adapter, dazu Rx und Tx.
Dann Ground des Adaper zu GND des DPM und A->A, B->B.
Und es ist ein DPM8624-485.
Wenn ich diese Schaltung so übrigens an dem DPM8624 probiere, der nur TTL kann, kommt gar nichts an.
Die Bilder sollen u.a. zeigen, dass meine Schreibbefehle durchaus beim DPM ankommen. V und C kann ich im Code setzen, power an/aus geht auch so.
Code:
#include <DPM8600.h> DPM8600 converter; float v; void setup() { Serial1.begin(9600); converter.begin(Serial1); Serial.begin(9600); Serial.println("DCDC Test"); } void loop() { // Turn on the power converter.power(true); delay(2000); converter.write('v',5); converter.write('c',1); v=0.0; v = converter.read("v"); Serial.print("v = "); Serial.println(v); delay(2000); // Turn off the power converter.power(false); delay(2000); }
Update:
Ich habe es jetzt endlich am Laufen.
Aber ausgerechnet mit der Version ohne rs485.
Ich habe entsprechend der Libraray es nochmal auf TTL Basis probiert.
Anschluss ist dann:
Arduino -> DPM
RX1 -> A
TX1 -> B
GND -> GND
Aber es war nicht nur der Anschluss der Kabel. Ich habe auch nochmal in die Library geschaut und dort die read() Funktion angeschaut. Nachdem ich dort nochmal neu Ausgaben eingefügt habe, hat der Arduino den Code wohl nochmal neu eingebunden. Danach klappte es nämlich plötzlich.
Programmiertechnisch gibt es keinen Grund, wieso "Serial.println(processString(response));" das Ergebnis von response von 28 auf 500 ändert.
Der einzig logische Grund dafür ist, dass der Arduino die lib vorher nicht korrekt eingebunden hatte und damit immer die gleiche response bekam.
Nachtrag:
Programmiertechnisch gibt es für das Verhalten keinen Grund:
float DPM8600::read(char cmd) { int8_t retry = 0; bool completed = false; String response = ""; String command = ""; // Getting the correct command number switch (cmd) { case 'v': case 'V': command = "30"; break; // Voltage case 'c': case 'C': command = "31"; break; // Current case 'p': case 'P': command = "12"; break; // Power case 's': case 'S': command = "32"; break; // CC/CV case 'm': case 'M': command = "01"; break; // Max Current default: command = "33"; break; // Internal temperature } do { // Clear response //response = ""; // Send a command _serial->println(":" + _address + "r" + command + "=0,"); // Listen for a reply completed = listen(response); 1! Serial.println(processString(response)); // Add a retry retry += 1; } while ((!completed) && (retry < _maxRetry)); // Stop running either when data received or max attempts happened. if (!completed) { switch (cmd) { case 'v': case 'V': return -10; // Voltage reading error case 'c': case 'C': return -11; // Current reading error case 'p': case 'P': return -12; // Power reading error case 's': case 'S': return -13; // CC/CV reading error case 'm': case 'M': return -14; // Max current reading error default: return -15; // Internal temperature reading error } } 2! Serial.print("response vor: "); 3! Serial.println(response); float result = processString(response); 4! Serial.print("response nach: "); 5! Serial.println(response); switch (cmd) { case 'v': case 'V': return result/100; // Voltage has 2 decimals case 'c': case 'C': case 'm': case 'M': return result/1000; // Current has 3 decimals default: return result; } }
Die Zeilen, die ich mit 1! bis 5! sind Sonderkommentare für hier. Der Code selbst ist so nicht Lauffähig und dient der schnelleren Lesbarkeit.
Aktuell scheinen diese 5 Zeilen zwingend notwendig zu sein im Code. Wenn ich eine dieser Zeilen abändere wir z.B. Zeile 1! zu "processString(response);" oder eine der 5 Zeilen auskommentiere, dann liefert response wieder falsche Werte. Mal 27.00, mal 28.00 oder auch gerne 30.00. Jedenfall nicht die Spannung, die eingestellt ist.
Update um 23:37 nach 3 Bier... Fehler gefunden.
Ich habe den Code nochmal kopiert und als My... Funktionen parallel zum Debuggen eingefügt. Der Fehler war so simpel wie schwer zu finden.
Dadurch kam dieses unlogische und zufällige Verhalten zustande. Mit einer Übergabe der Char Variablen in '' klappt es jetzt und ich kann v, c und p auslesen.
Danke für dein Skript bei Github ( github.com/aloishockenschlohe/dpm86_power_supply ) - das ist genau was ich benötige! Da ich meinen angebundenen Raspberry einfach nur per SSH Befehle erteilen möchte.
Ich bekomme allerdings keine Verbindung vom Raspberry zum DPM aufgebaut. Ich glaube es liegt an meiner Verkabelung, aber ich komme nicht auf den Fehler.
Das Skript arbeitet laut Anleitung mit dem Simple-Protokoll - das habe ich mit '0' beim DPM auch gesetzt.
Nun habe ich einmal den beim DPM beiliegenden USB-Adpater mit 2-Adern zur Verfügung oder einen selbst gekauften seriellen USB-Anschluss mit 4 ausgehenden Adern (rot, weiß, grün, schwarz).
Ich habe es mit dem beiliegenden Adapater zunächst mit A->A und B->B versucht. Das ging aber nicht. Also habe ich den anderen Adapter mit A->weiß, B->grün und GND->schwarz versucht. Geht aber auch nicht. Bei beiden Verkabelungen passiert nichts, wenn ich bspw. ./dpm86 output/o oder ./dpm86 mal zum auslesen teste.
Kann ich den beiliegenden USB-Adapter mit nur 2 Adern für das Script am Raspberry verwenden oder habe ich hier ein Verkabelungsfehler?
Ich danke dir! Bzw. euch! Vllt hat ja jemand anderes noch einen Hinweis für mich hier!
-----
Edit:
Ahhh! Nachdem ich den hash vom Skript verglichen habe, lag es tatsächlich an einem kaputt file!
Für alle anderen, die sich die gleiche Frage gestellt hatten:
Einfach den beiliegenden Adapter A->A & B->B verbinden, dann auf '0' für das einfache Protokoll setzen und schon geht's 🙂
DANKE @aloishockenschlohe
Moin,
eine ganz blöde Frage: wenn ich den DPM8624 OHNE "-485" gekauft habe, dann ist der Unterschied nicht nur, dass der 485 Adapter nicht beiliegt, sondern das Gerät kann das dann auch gar nicht (ohne dass ich dazu jedweden Hinweis gefunden habe)? Auch wenn ich im Menü darauf umschalten kann? Liegt es daran dann, dass ich "COM" zwar zum Blau-Blinken bekomme (ohne sichtbare Reaktion), aber nie nicht Daten?
@jstammi Das würde mich auch interessieren. Überlege mir so Teil zuzulegen habe aber den Unterschied zur RS485 bzw TTL Version (was ja eigentlich nur eine RS232 Schnittstelle ist) nicht verstanden. Was die Schnittstellen an sich betrifft kann ich folgen, aber brauche ich den die RS485? Der mehrfach erwähnte Adapter setzt ja das 485 Signal nur auf TTL um. Also warum der Umweg? Oder da etwas falsch verstanden? Wenn mir eine Punkt zu Punkt Verbindung (RS232) reicht sollten doch die ihr beschrieben Wege zur Kommunikation auch funktionieren?
Mein Verständnis war, dass der DPM8624 immer eine RS-485 Schnittstelle hat. Ich konnte nirgends eine gegenteilige Aussage finden. Auch nicht im Datenblatt oder im Handbuch.
Den Namens-Zusatz bei DPM8624-RS485 habe ich so verstanden, dass dann ein UART TTL von/zu RS-485 Adapter beiliegt, das Gerät selber aber identisch wäre.
Über diese Schnittstelle "versteht" der DPM8624 (mindstens) 2 verschiedene Protokolle:
- Simple (Setting am Gerät: 0)
- Modbus (Setting am Gerät: 1)
Ins Schleudern bin ich bei jetzt bei der AUssage von @Fifadoc in https://www.akkudoktor.net/forum/postid/140006/ gekommen. Darum meine Nachfrage. Wobei das beiliegende Programm nach Simple Protokoll aussieht. Aber per direkte RX/TX-DPM Verbindung, ohne Adapter dazwischen.
Am Ende des Tages will ich das Gerät per ESPhome auf einem ESP32 in Homeassistant einbinden, um aus einem Akku einzuspeisen. Eine entsprechende Modbus Definition habe ich gefunden und adaptiert. Für das Simple-Protokoll habe ich leider nichts gefunden, da müsste ich ran und ein Custom UART Device wohl erst programmieren.
Der ESP32 läuft und ich sehe auch TX LED auf dem TTL-RS485 sowie die blaue COM LED am DPM blinken. Also mindestens elektrisch tut sich etwas. Aber weder reagiert der DPM auf Kommandos, noch sehe ich Daten zurück fließen (die RX LED am Adapter bleibt auch passend dazu stumm).
Der DPM ist prinzipiell iO, per USB am Computer mit der Junctek Benutzeroberfläche klappt alles.
Adapter habe ich jetzt schon 2 verschiedene probiert mit identischem Ergebnis.
Kabel sind durchgemessen.
Und ich habe es auch mit beiden UARTs (UART0, UART2) mit gleichem Ergebnis probiert.
Bin so ein wenig ratlos ... und hoffe trotzdem noch auf einen dummern Fehler bei mir, statt dass ich das falsche Gerät am Start habe 😉
Ok, der Adapter wird nicht gebraucht. Jedenfalls nicht bei mir. Einfach direkt verkabeln wie von @fifadoc beschrieben. Und schon klappt das per ESPhome Modbus Komponente über ESP32 UART2 mit DPM8624 auf Protokoll 1 gestellt.
Ich habe hier 2 TTL 8624 und eine 485 Version.
Der Unterschied bei der rs485 ist, dass wirklich ein rd485 Modul verbaut ist, für die komplexere Kommunikation. Beide verstehen aber die TTL Basis Kommunikation mit Modus 0.
Für den Funktionsumfang zur Steuerung (Power, Voltage, Current / lesen und schreiben) reicht die TTL Version aus meiner Sicht. Jedenfalls für Basis Systeme wie den Arduino und vermutlich auch einen ESP.
Habe dieses Netzteil im Einsatz. Funktioniert über Modbus. Nur das Verstellen der Parameter (MAX Und MIN Spannung /Strom) geht mal und mal nicht. Wenn ich eine Einstellung vorgenommen habe, soll ich "OK" drücken. Wie lange? Ganz kurz, kurz, oder länger?
Bin mir unsicher was ich schreiben soll, da mir Deine Umgebung nicht ganz klar ist.
Wenn "ok" gedrückt ist und kein Verbraucher angeschlossen ist, siehst Du beim Strom kein max Wert mehr, sondern nur den aktuellen Wert, also 0.00. Änderst Du den max Strom (min Strom gibt es nicht), wird sich der aktuelle Verbrauch nicht ändern, es sei denn, Dein angeschlossener Verbraucher benötigt gerade den max Strom und kann mehr verbrauchen.
Beim Spannungswert kann ich nur raten, dass deine Eingangsspannung (minus ein wenig Eigenspannungsabfall) den Umax Wert nicht erreicht und deswegen vielleicht nicht den Wert ändert.
"ok" ist eigentlich nur ein An/Aus, um den Ausgang entsprechend zu versorgen.
@nili76 Mein Problem ist die Einstellungsübernahme mit "OK". Vermutlich darf man die Taste nur sehr kurz drücken. 0,5 Sek. sind scheinbar schon zu lange. Nach einigen Versuchen sind die Einstellungen übernommen worden. Ist jedes Mal ein Ratespiel mit ungewissem Resultat, ich ändere deshalb ungern etwas an den Einstellungen.