Vielen Dank Pius für Deine Gedanken.
Arduino Uno: Stabile Versorgungsspannung unter erschwerten Netzbedingungen (Peaks)
-
-
wie kommst Du auf diese Annahme? Für mich heisst dies (Reset am Arduino funktioniert) lediglich, dass es mit hoher Wahrscheinlichkeit kein latchup Effekt die Ursache ist. In Deiner Handzeichnung erkennt man schwarz die Masseverbindung (en) zwischen den Boards, aber nicht die Verdrahtung der Servos. Ich nehme an, dass die jeweils drei Leitungen 5V, Gnd und das PWM Signal darstellen. Ist sichergestellt dass das Masspotential möglichst an einem zentralen Punkt erfolgt, oder nicht? Dünne Leitungen mit längerem Weg weisen schnell mal Potentialdifferenzen aus, die dann bei schon relativ kleinen Störungen (von aussen) unschöne Auswirkungen haben können.
Aber zuvor würde ich versuchen die SW mit einer per Software blinkenden Led zu erweitern, direkt beim Arduino. Stellt sich der Fehler wieder ein und die Led blinkt nach wie vor, kann man daraus schliessen, dass die SW nach wie vor ihren Dienst erledigt.
Wenn ich in der Zeichnung (ein Schema wäre viel aufschlussreicher) mögliche Verdächtige suche, dann würde ich als erstes beim 220V Relais (ist die ein Schütz?) suchen, weil eine AC versorgte Spule, und dies mit hoher Spannung (230V) doch sehr viel magnetische Felder erzeugt.
Ok, wenn Du schreibst, die Servo Leitungen sind nicht verdrillt, dann frage ich mich wer mit wem verdrillt sein soll. Die Masse dient als Rückleiter für die Versorgung der Servos und gleichzeitig auch für das PWM Signal. Ist die Leitung lange (vielleicht sind 3m bei einem dünnen Querschnitt bereits lange) dann addiert sich der Versorgungsstrom des Servos mit dem Rückstrom des PWM Signals wobei der Strom des PWM Signals vermutlich um Faktoren kleiner ist.
Hier wäre es ein Versuch wert, jedes Servo-Kabel am Board jeweils 2-3 mal um einen Ferritkern zu wickeln.
Mehr fällt mir im Moment leider auch nicht ein. Aber es führt kein Weg drum herum, viele einzelne Schritte nacheinander auszuprobieren. Wichtig, nur immer ein Schritt aufs mal, weil man andernfalls nicht sicher sein kann ob die Kombination zweier Dinge sich nicht wieder aufheben oder verstärken.
schönen Abend
Pius
-
Guten Abend
Zwischenstand:
Heute war ich vor Ort die eingebaute Schaltung vor Ort bei meinem Kollegen anzuschauen.
Zu meinem und seinem Erstaunen konnten wir die Störung kaum auslösen. Schlussendlich tratt der Fehler doch auf.
Nach Drücken des Arduino Uno Resett-Buttons funktionierte die Schaltung wieder io.
Also liegt es nicht im Bereich des externen PMW-Boards für die Servo.
Die Schaltung wurde gespiessen per Autobatterie. Ich stellte fest, dass die angeschlossenen Servokabel bis 3m lang sind und unverdrillt.
Leider haben die 5k Ohm Pull-Up Wiederstände keinen Verbesserung gebracht.
LG
-
Ist natürlich ohne nähere Messwerte ein reines Raten. Kannst ja mal mit 3.9kΩ und 10μF anfangen. da brauch es für 1τ 39ms.
Das ist recht lang, sollte aber Störspitzen dämpfen und fürs Entprellen ist es auch gut. Nach 39ms müssten etwa 3V erreicht werden nach 78ms etwas über 4V. Der Rest ist fast egal. Einen Versuch ist es ja wert.
Die Grenzfrequenz liegt bei etwas über 4Hz.
Ansonsten halt mal mit den Werten spielen. Kleinerer Widerstand, kürzerer τ Wert und umgekehrt.
-
-
Ein RC Glied an dem „Button1“ wäre vielleicht nicht verkehrt, dann wäre der Relaiskontakt gegenüber dem Arduino-Pin auch gleich entprellt.
-
Die erste Steuerung meiner Portalfräse war ein Arduino Uno mit Schrittmotoren und den dazugehörigen Treibern.
Aus Erfahrung kann ich nur empfehlen alle Schirme einseitig aufzulegen. Der Uno gehört in einen geerdeten Blechschrank oder eine Blechdose. Alle Netzteile erden. Die Servos erden. Auf saubere Verdrahtung achten. Sollte der Arduino an einen PC angeschlossen sein, ein hochwertiges USB Kabel benutzen. Dann bist Du meiner Meinung nach alle Probleme los.
-
Der aktuelle Fokus ist mal wieder weg von der SW
Der Hauptverdacht ist die nicht geschirmte Leitung (gelb im Schema)
Schliesst mein Kollege direkt einen Schalter am Arduino an, da kann er 40x schalten. Immer alles gut.
Nun, ich habe ja den internen Pullup der Input Pins aktiviert. Neu schalte ich bei jedem Input mal einen externen Widerstand (4,7kOhm) auf 5V.
Vielleicht löst das mein Problem
IMG_9950.jpg
-
Guten Abend
in Beilage das Grobschema. -
Achso .. Pin0 (bis 8 ) Arduino -> Relais und bei pwm.setPWM(0, 0, 110) wird der Pin 0 auf dem Servotreiber-Board angesteuert...
Ergänzung: Irgendwie verstehe ich es immer noch nicht. Ein Schaltplan wäre echt schön. Ich nehme mal an, SSR in Deinem Quellcode steht für Solid State Relais.... Das brauchst Du nicht zu entprellen, da es keine mechanischen Kontakte hat.
-
Salü zusammen
Herzlichen Dank für Euer Feedback.
a) Das mit den Pin0 und Pin1 als Input ist ein guter Hinweis.
b) Ich habe nochmals ein Foto reingestellt dass Ihr seht was das Ding ansteuert. Die Klappe wird 30x Tag angesteuert. Es öffnet den Abluftkanal oberhalb
einer Schleifmaschine. Und von denen hat es einigec) KaiR: Die Variable Button0_Counter ist eine Art Entprellung des Eingangsschalter (Relaiskontakt). Ich zähle diese Variable rauf und runter. An den
Endpunkten schalte ich das Servo bezüglich PWM auf den gewünschten Wert. Soweit der Plan.
Sobald alle Relais in Endpostion verharren, schalte ich die externe Speisung der Servos des PWM Boards ab.Interessanterweise tritt der Bug immer dann auf, wenn eine Klappe geöffnet ist.
d) Bezüglich den erstlichen Inputs muss ich noch nachdenken.
Vielen Dank
Beste Grüsse
Felix
-
Ich verstehe nichts von Arduino und den Lib's, könnte mir aber vorstellen dass das sehr schnelle und wiederholte Beschicken der pwm.setPwm() Funktion ein Grund für heisse Servos sein könnte.
Darum habe ich noch einmal nachgefragt, was das inkrement/dekrement überhaupt soll.
Irgendwie scheinen damit die Pulse gezählt zu werden, weil die PWM Ausgabe auf demselben Pin erfolgt, der mit dem pwm.setPwm() angesteuert wird.Ich komme da gedanklich nur gerade nicht mit, weil der Wert dann ja eigentlich immer 1 sein müsste, denn wenn der Pin auf High geht, wird eins dekrementiert, wenn er auf Low geht eins inkrementiert. Da das bei PWM abwechselnd passiert, kapier ich gar nicht, was da abgeht.Das ganze kann auch nicht mit Serial.print mal debuggt werden, weil die Pins 0 und 1 für die Servos verwendet werden. Da funkt dann der UART auch noch dazwischen, weil die beiden Pins für RX/TX verwendet werden.
Die Servos werden jedenfalls permanent umgestellt weil if (Button0_Counter>100) pwm.setPWM(0, 0, 110); else pwm.setPWM(0, 0, 250); immer zutrifft. Das kann nicht gesund sein.
-
@Franz
das Bild das Felix geschickt hat, zeigt einen Servo für den Antrieb der Klappe. Demnach gehe ich davon aus, dass man die Klappe mit dem Servo bestimmt und anschliessend, solange keine Veränderung gewünscht ist, so ruhen lassen kann. Im Code selbst wird aber, sofern ich das richtig interpretiert habe, der Servo, resp. Alle, bei jedem Loop Durchgang neu gesetzt. Da es sich um eine Lüftung handelt, kann ich mir nicht vorstellen, dass die Servos häufig betätigt werden müssen und dass man die Servos (vermutlich) nicht alle abwechelnd bewegen muss.
Gruss
Pius
-
Ist das Servoventil ein Ventil mit einer Spule (magnetisch), oder hat das Ventil einen Motor?
Grüße, Franz
-
Hallo Felix
ich habe nur mal schnell in den Code reingeschaut und erschrak an den sich repetierenden Code Teilen.
Für jeden Knopf machst Du sowas:
wobei ich in diesem Besipiel die Range Prüfung zumindest da hingestellt habe, wo sie auch plausibel werden. Damit meine ich, dass ich keine Prüfung von <1 machen muss, wenn ButtCnt zuvor inkrementiert wurde. Auf jeden Fall wird bei jedem Loop Durchgang entweder incrementiert oder dekrementiert.
Was ist mit mit dem Button Wert von 0?
Nach der Range Prüfung machst Du dann:
Code- if (Button1_Counter>100) pwm.setPWM(1, 0, 110); else pwm.setPWM(1, 0, 290); // Servoarm #1 90 Grad drehen
- //diesen Block könnte man auch so schreiben: pwm.setPWM(1, 0, (Button1_Counter>100) ?110 : 290 );
- // oder gleich mit einer Var
- int PwmVal = (Button1_Counter>100) ? 110 : 290;
- // und dann an einer Stelle die Funktion aufrufen:
- pwm.setPWM(1, 0, PwmVal); // Servoarm #1 90 Grad drehen
was dann vermutlich bei jedem Button identisch gemacht wird -> Redundanz
Ich verstehe nichts von Arduino und den Lib's, könnte mir aber vorstellen dass das sehr schnelle und wiederholte Beschicken der pwm.setPwm() Funktion ein Grund für heisse Servos sein könnte. Zusätzlich könnte es sein, da IMMER inkrementiert oder dekrementiert wird, dass alle Servos laufend etwas hin und her bewegt werden, auch wenn die Position schon längst erreicht ist. Dies produziert daurende Stromänderungen, die sich als Transienten auf den Leitungen äussern können (hang up, latchup).
Gruss
Pius
-
Also was das mit dem hoch- bzw. runterzählen der Buttonvariablen soll ist mir nicht klar. Kannst Du das mal erklären? Was auffällt, die Pins 0 und 1 sind beim Uno für die serielle Kommunikation (USB Anschluss) reserviert und werden besser nicht als Schalter verwendet. Nimm besser 2 bis 10.
-
Guten Morgen zusammen
Hier ein kleines Update zum Troubleshooting:
Ausgangslage:
HW: Arduino UNO (Original) mit Ardunio AZ Delivery PCA9685, 16-Kanal 12Bit PWM Servotreiber BoardFunktion:
Meine Arduino Schaltung ist in einem grossen LKW-Anhänger eingebaut und dient dazu 8 Lüftungsventile per je einem Servo zu öffnen und zu schliessen (90 Grad Klappe). Jedem Servo ist ein korresponsierender Eingangspin xy zugwiesen. Dieser Eingangspin wird durch ein Relais angesteuert. Wenn Schleifmaschiene xy an -> Relais xy aktiv -> Eingangspin xy aktiv. Jetzt öffnet das Servo das Lüftungsventil.
Da unglücklicherweise Digitalservos und zusätzlich sehr Preiswerte eingesetzt werden, wurden diese in der Endstellung sehr warm (da immer unter Last). Darum schalte ich die externe Servo-Speissung des PMW Servotreiber Board per Relais aus wenn die Relais nicht aktiv sein müssen.
Hinweis: Da der LKW-Anhänger nicht bei mir um die Ecke steht, kann ich nur Ferndiagnose machen
Problem:
Grosse Schleifmaschinen, häufiges Ein-/Ausschalten. LKW-Anhänger mal am EW-Netz, mal an Generator. Preiswertes Netzteil 5V/3A. vom Chinesen. Das Problem ist, dass nach x Stunden oder häufiger die Schaltung sind aufhängt. Ein Power off/on der Boards wird notwendig. Danach alles wieder io
Verdacht betreffend Ursache:
Zuerst dachte ich Speissungsproblem oder Störung durch eine Magn. Feld. Bei mir im Lab funktionierte alles 1A. Ok, ich habe natürlich auch nicht stundenlange Tests gefahren und die Servos waren nicht unter Last
Ich sehe keine Systematik wieso der Fehler auftritt. Unterdessen hat mein Kollege die Schaltung vor Ort derart reduziert, dass nur noch ein Relais
operativ ist. Der Fehler tritt immer noch auf.
Nun bin ich nicht mehr so sicher ob doch ein SW-Problem vorhanden ist. Darum poste ich mal den Code. Es geht mir nicht darum, dass jemand den Code detailliert analysiert oder den Fehler sucht.
Vielleicht sieht jemand einen gundsätzlichen Mangel weil ich ggf. gewisse Variablen nicht korrekt initialisiere.
Ich werde die Schaltung mir zuhause nochmals auf aufbauen. Für allfällige Tipps oder Hinweise bin ich sehr dankbar.
Beste Grüsse
Felix
-
-
Zitat
Das Einzige das wir wissen ist, dass ein Reset die Schaltung wieder neu starten lässt.
@Pius: wir wissen nicht mal das sicher. Eingangs hat der TO geschrieben, dass der Arduino einen Neustart braucht um wieder zu funktionieren.
Das deutet für mich darauf hin, dass das durchaus auch ein Softwarefehler sein kann (Speicherüberlauf) -> wie Du sagtest, Software läuft in den Tod.
Davon will der TO aber nichts wissen, weil er sich auf Störungen durch die Schleifmaschinen eingeschossen hat, ohne es aber selber genau zu wissen.
Wir wissen ja nicht mal, wie Arduino und PWM Treiber/Servos miteinander verdrahtet sind. Evtl. liegt auch hier ein Fehler vor (Netzteil überlastet).
Wie ich schon sagte... das ist orakeln hier. Aber "Hellseher" gibt es meines Wissens nur in Geschichten und Sagen..
Danke für Eure Beiträge, auch an Hans64 ...
-
Hallo Pius,
ich sehe es genau wie Du, dass es mehrere Ursachen für einen Ausfall geben kann. Ohne eine genaue Beschreibung bzw. Schaltpläne kann man schwerlich eine Aussage treffen, da hat auch Kai vollkommen Recht. Mir war es "nur" nicht plausibel, wenn die Maschinen an einem Generator angeschlossen sind, dass deswegen der Arduino abstürzt. Zumindest habe ich es so verstanden.
Gruß
Hans