Arduino Uno: Stabile Versorgungsspannung unter erschwerten Netzbedingungen (Peaks)

  • Code
    1. Nach Drücken des Arduino Uno Resett-Buttons funktionierte die Schaltung wieder io.
    2. Also liegt es nicht im Bereich des externen PMW-Boards für die Servo.


    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.

  • 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

    IMG_9951.jpg

  • 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 einige ;)

    c) 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

  • 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:

    Code
    1. int nextButtonCount(int ButtCnt)
    2. { uint8_t PwmVal; if (digitalRead(0)== 0) { ButtCnt++ ; if (ButtCnt > 300) ButtCnt = 299; // ELSE Wert beschreibt den Winkel Klappe zu } else { // digitalRead(0) != 0 ButtCnt--; if (ButtCnt<1) ButtCnt=1; } }

    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
    1. if (Button1_Counter>100)     pwm.setPWM(1, 0, 110); else     pwm.setPWM(1, 0, 290); // Servoarm #1 90 Grad drehen
    2. //diesen Block könnte man auch so schreiben: pwm.setPWM(1, 0, (Button1_Counter>100) ?110 : 290 );
    3. // oder gleich mit einer Var
    4. int PwmVal = (Button1_Counter>100) ? 110 : 290;
    5. // und dann an einer Stelle die Funktion aufrufen:
    6. 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 Board


    Funktion:

    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

    Dateien

    • servo.JPG

      (51,49 kB, 12 Mal heruntergeladen, zuletzt: )
    • Code.txt

      (5,25 kB, 8 Mal heruntergeladen, zuletzt: )
  • 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