1zu160 - Forum



Anzeige:
Harburger Lokschuppen

THEMA: Servos, Arduino und PCA 9685/Startup Jitter

THEMA: Servos, Arduino und PCA 9685/Startup Jitter
Startbeitrag
Struwelpeter - 10.03.21 20:02
Guten Abend,
ich versuche, einen DCC-Decoder für Servos mit einem Arduino und dem PCA 9685 aufzubauen. Bei vorausgehenden Tests ist mir folgendes aufgefallen:

1. Nach einem Reset des Arduino (oder einer gleichwertigen Aktion) "zucken" die Servos kurz. Jedoch nur, wenn sie nicht auf Position "0" stehen.
2. Der Servo, welcher am Ausgang 0 des PCA 9685 angeschlossen ist, geht bei dieser Aktion in eine andere Stellung, und nur dieser.

Weiss jemand eine Erklärung für dieses Verhalten oder eine geeignete Massnahme zur Abhilfe?

n'schönen
Struwelpeter

PS: Die Servos sind TowerPro 9g Servo SG90. Liegt's am Typ?


Hallo Struwwelpeter,

die Servos machen nur, was ihnen vorgegeben wird. Die Vorgabe kommt vom PWM-Baustein. Dieser macht, was er über den I²C-Bus und OE vorgegeben bekommt.
Es gibt hier zwei Vorgaben: Irgendwelche Steuersignale auf dem I²C-Bus, die beim Reset ausgelöst werden könnten sowie das OE-Signal. Wie hast Du das denn geschaltet? Hat es einen festen Pegel (dann sollte es eigentlich vom Arduiono unabhängig sein) oder schaltest Du das mit irgendeinem Ausgang? Wenn der Pegel geschaltet wird, wäre das die Erklärung. Denn beim Reset werden die IOs in Grundstellung gebracht.

Es kommt also auf Deinen Schaltplan und auf Deine Software an. Aus der Ferne ist es schwer, eine Diagnose zu stellen. Auf der anderen Seite: Im Normalbetrieb sollte es doch gar nicht zu Resets kommen. Also kein wirkliches Problem. Der einzige Reset ist der Power-On-Reset. Der kommt zwangsläufig beim Einschalten.

Wie hast Du denn OE beschaltet?

Grüße
Zwengelmann
Moin Struwelpeter,

wozu das Rad neu erfinden ?

Gibt es schon als sehr tolle Lösung:

https://www.arcomora.com/mardec/

Ich habe diese Decoder auch selbst im Einsatz und für das Geld ca. 25 Euro total klasse.

Tolles Projekt finde ich.

LG
Ernie
Hallo Ernie,

Du verstehst nicht, warum sich jemand mit einem Arduino befasst. Um selbst etwas auf die Beine zu stellen. Eine fertige Lösung liegt meist nicht im Interesse des Entwicklers.

Bei dieser Lösung stört mich, dass das Englisch so grottenschlecht ist und für mich kaum lesbar, außerdem braucht man Windows zur Konfiguration. Will auch nicht jeder haben. Der Vorteil ist für mich ein Nachteil. Bei mir muss das auch alles per CV-Programmierung gehen. Weil das auch noch in 20 Jahren funktioniert.

Grüße
Zwengelmann
Hallo,

ja, Zwengelmann hat recht, ich will auf meine alten Tage noch was lernen! UNd darüber hinaus erhoffe ich mir deutlich mehr Flexibilität. Offenbar bin ich aber auf die "Sekundär"literatur hereingefallen, bei der der Eingang OE in beiden Beispielen  unbeschaltet ist
Wo finde ich die Informationen, von denen Du (Zwengelmann) offenbar ausgehst? Habe bisher nur ein sehr knappes Datenblatt gefunden.

Morgendliche Grüsse

Struwelpeter
Zitat

Habe bisher nur ein sehr knappes Datenblatt gefunden.



Wenn man bei irgendeiner Suchmaschine "PCA 9685 datasheet", kommt man auch zum Datenblatt.
https://pdf1.alldatasheet.com/datasheet-pdf/vie...EDCEw+/datasheet.pdf

Warum der Umweg über einen Extra-Baustein? Der Controller kann doch die PWM Signale auch selber erzeugen?

Gruß
Klaus
Servus,

mal als Tip: https://www.stummiforum.de/viewtopic.php?f=5&t=144916

Arduinobasierter DIY-Zubehöhrdecoder, eine "eierlegende Wollmilchsau"

Gruß
Lutz
Hallo Struwwelpeter,

das Datenblatt findest Du hier: https://www.nxp.com/docs/en/data-sheet/PCA9685.pdf Alldatasheet.com sollte man nicht nutzen. Das ist eine Reklameschleuder. Außerdem bekommt man die Datenblätter nur in einer m.E. unbrauchbaren Form vorgesetzt. Beim Hersteller ist man besser bedient. Denn der will wirklich informieren und einem nicht hauptsächlich Werbe- und Trackingcookies unterschieben.

"Output Enable" dient dazu, die Ausgänge (alle!) ein- bzw. auszuschalten. Unabhängig von allem anderen. Der Strich darüber bedeutet, dass der Eingang invertiert ist, also auf Low-Pegel reagiert.

Du kannst jetzt entweder Output Enable mit einem Schaltausgang des Arduiono verbinden und damit gezielt an- und ausschalten, oder Du verbindest den Eingang ganz profan mit GND. Dann sind die Ausgänge immer an. Meines Erachtens läuft es dem Konzept des I²C-Bus entgegen, wenn man zusätzlich zum Bus eine zusätzliche Schaltleitung legt. Deshalb würde ich den Pegel statisch festlegen. Der Baustein hat ja einen eingebauten Power-ON-Reset, geht also beim Einschalten in einen definierten Ruhezustand.

Grüße
Zwengelmann
Haaaaalllloooooooo ? Kann mir der Fragensteller mal 'ne Antwort geben? Ich würde es gerne verstehen

Danke!
Klaus
Zitat - Antwort-Nr.: 5 | Name:

Warum der Umweg über einen Extra-Baustein? Der Controller kann doch die PWM Signale auch selber erzeugen?


...weil man mit dem IC unabhängig davon was der µP gerade macht ein ziemlich gutes Zeitsignal erzeugen kann das keinen Jitter durch andere Aktivitäten drauf hat. Weiters sind 16 unabhängige Signale mit einem µP auch nicht mehr ganz so einfach hinzubekommen
-AH-
... und weil man über den I²C-Bus auch durchaus mehr als nur 16 unabhängige Ausgänge realisieren kann.

Ich hatte mal einen Kunden, der wollte die Konfiguration per Mäuseklavier bzw. BCD-Kodierschalter haben und nicht per Software. Alleine mit den dafür nötigen Eingängen hätte ich den Arduiono überfordert.

Man kann sich darüber streiten, ob es sinnvoll ist, das per Hardware zu realisieren. Aber der Kunde wollte halt, dass der Techniker auch ohne Notebook unterm Arm die Anlage warten kann.

Grüße
Zwengelmann
Hoi zsäme,

seid doch mal nicht so ungeduldig mit 'nem ollen Ackergaul!

Also nochmal von vorn:

Den Plan, meine Weichen mit einm Arduino zu stellen, hatte ich schon vor einiger Zeit gefasst. Die Suche im Web hat gezeigt, dass das machbar sein müsste. An dem unter #2 erwähnten Lösung bin ich dabei leider nicht vorbeigekommen, wäre vielleicht eine Alternative gewesen. Das Material hatte ich schon besorgt, da ging ein Uhlenbrock-Decoder für ein paar Lichteffekte defekt und Ersatz war auf die Schnelle nicht beschaffbar. Also habe ich den vorhandenen Arduino erst einmal dafür eingesetzt und konnte so insgesamt positive Erfahrung sammeln. Und "nebenbei" habe ich auch noch ein Viessman-Signal mit angesteuert.
Tatsächlich wollte ich anfangs nur den Arduino einsetzen und nicht das PCA-Board. Aber die Anzahl der PWM-fähigen Ausgänge ist begrenzt (6) und das wäre irgendwie knapp geworden. Entscheidend war aber, das die Servos ja einen JST-Stecker haben. Und diese Verdrahtung auf einer Universal-Leiterplatte zu machen fand ich nicht so prickelnd und das Anstecken auf dem PCA-Board ist sicher einfacher.
Mittlerweile habe ich gefunden, das ich ein weiteres solches Board an den Arduino anschliessen kann und da die Beleuchtungseffekte mit steuern kann. Aber das ist Zukunftsmusik.
Sorry für die Länge, nun zurück zum Problem. Der OE-Eingang auf dem Board ist unbeschaltet, nach Messung aber auf LOW. Ebenso der Eingang am Chip. Was ein bisschen merkwürdig ist, weil im Datenblatt (welches für den Chip gilt und nicht unbedingt für das Board) ein Pullup-Resistor gefordert wird. Beim Reset des Arduino habe ich dort aber keine Reaktion gesehen. Kann aber gut sein, das die für ein Multimeter zu schnell ist und einen Oszi habe ich nicht zur Verfügung. Werde mal zwengelmanns Vorschlag folgen und dann berichten.
Warum aber der Servo am Output "0" völlig anders reagiert, klärt die OE-Geschichte wohl nicht. Na ja, vielleicht finde  ich ja noch etwas in der Software.

So, alle zufrieden? (Nein?)

Struwelpeter
Hallo,

nein, das erklärt die Reaktion nicht. Meine erste Vermutung war, dass OE mit irgendeinem Pin des Arduino verbunden ist und dadurch bei einem Reset geschaltet wird. Ist aber wohl nicht der Fall. Zur Sicherheit den Eingang bitte trotzdem auf einen festen Pegel legen.

Normalerweise sollte ein Reset des Arduino dem Baustein völlig wurst sein. Es sei denn, es gibt beim Reset Probleme mit der Spannungsversorgung, etc.

Ist das Thema denn in der Praxis relevant? So ein Reset mitten im Betrieb sollte doch eher die Ausnahme sein.

Grüße
Zwengelmann
Hallo,

diesmal s'birrebitz schneller:
1. Den OE-Input auf einen fixen Wert zu setzen, hat nicht geholfen. Wobei die Variante "HIGH" superprovisorisch war und nicht unbedingt geklappt hat.
2. Der Output "0" wurde wirklich von der Software anders angesteuert, den Teil des Codes konnte ich entfernen und das Teilproblem ist gelöst.
3. Nein, Reset wird im Betrieb eher nicht vorkommen. Nehme ich aber als Ersatz für "Power on", dabei passiert das Allergleiche. Natürlch ist ein Workaround denkbar, z.B. bei "Power off" alle Servos in die Nullstellung zu bringen, dann stimmt aber u.U. die Anzeige in der Zentrale nicht mit der Weichenstellung überein. Natürlich, so ists fast nur noch ein Schönheitsfehler. Aber eben, ich will was lernen und das Phänomen ergründen.
Mal sehen, muss mir nochmal die anderen Softwareteile anschauen. Aber das sind fast ofiizielle (Adafruit_PWMServoDriver.h).

Danke erst mal für lle Kommentare.

Struwelpeter

PS: Die Arduinos (ich verwende Arduino Nano) sind wohl nicht alle gleich. Ausserdem meine ich, schon abweichendes Verhalten bei der Behandlung von Interrupts bemerkt zu haben.
Noch 'n Nachtrag:

Ich stelle die Position der Servos derzeit über die Konsole. Und das Zucken der Servos tritt schon beim Aktivieren bzw. Deaktivieren der Konsole auf. Liegt dort der Hund begraben???

S.
Servus,

mit Ein/Aus der Konsole wird ein Reset des Arduino ausgelöst.

Um die Servostellungen zu restaurieren dauert es einen Moment, bis dahin ist wahrscheinlich die minimale Impulslänge eingestellt.

Bei Analogservos liegt ja die Betriebsspannung auch am Vergleichspoti im Servo, Spannungsschwankungen (gaukeln dem Servo eine falsche Stellung vor) werden also versucht auszuregeln... .

Gruß
Lutz

Edit:
Das die Nanos unterschiedliches Verhalten zeigen, ist mir zwar noch nicht aufgefallen, aber es gibt ja zwei  Versionen  des Bootladers; vlt. liegts daran.
Hallo,

hier:
https://forums.adafruit.com/viewtopic.php?f=25&...9685+startup#p842972
wird das Thema offenbar behandelt. Irgendwie bricht die Sache aber ab. Was ist mit "a iK pullup resistor"
gemeint? Tippfehler, wohl 1 k. Hab' ich grad nicht zur Hand, macht aber Sinn, wenn ein 10 k pulldown auf dem Board ist.

n'schönen
Struwelpeter
Hallo Struwwelpeter,

Du hättest gleich schreiben sollen, dass Du hier zusammengekauften Komponenten zusammenstöpselst und nicht selbst baust. Dann hätte sich auch die Diskussion mit dem OE erübrigt. Ich war davon ausgegangen, dass Du hier etwas selbst gelötet oder gesteckt hast. Du solltest dann auch von Änderungen an OE absehen, denn das ist schon richtig geschaltet. Du findest bei Adafruit den Schaltplan und auch das Datenblatt.

Damit ist auch klar, dass Du eine fertige Treibersoftware benutzt. Was die tut, wird Dir hier kaum jemand beantworten können. Da würde ich dann das Adafruit-Forum empfehlen. Der Baustein kennt übrigens einen Software-Reset. Es kann durchaus sein, dass der Treiber bei einem Reset des Arduino dieses Kommando schickt. Das würde das Verhalten erklären. Da musst Du Dich dann mal durch die Programmcode der mitgelieferten Bibliothek wühlen. Die Bibliothek ist Open Source, Du kannst sie also problemlos ändern.

Trotzdem nochmal die Frage: Wie oft rechnest Du im laufenden Betrieb mit Resets? Ist das Problem überhaupt existent?

Zitat - Antwort-Nr.: 15 | Name: Lutz

Um die Servostellungen zu restaurieren dauert es einen Moment, bis dahin ist wahrscheinlich die minimale Impulslänge eingestellt.

Bei Analogservos liegt ja die Betriebsspannung auch am Vergleichspoti im Servo, Spannungsschwankungen (gaukeln dem Servo eine falsche Stellung vor) werden also versucht auszuregeln... .


Hallo Lutz,

ein Reset des Arduino verändert überhaupt nichts. Das steht so in der Anleitung, und auch aus dem Datenblatt geht nichts entsprechendes hervor. Lediglich beim Einschalten wird es zucken.
Wenn man zur Konsole schreibt, wird auch kein Reset ausgelöst. Dann wäre überhaupt keine Ausgabe möglich, das Ding würde permanent resetten.
Das mit dem Ausregeln von Spannungsschwankungen entstammt wohl auch Deiner Phantasie. Der Baustein hat keine entsprechende Funktion. Schwankungen der Spannungen können durchaus ein Zucken auslösen, bis hin zum Power-On-Reset. Hier würde Puffern mit einem Kondensator helfen.

Grüße
Zwengelmann
Hallo,

wenn man das Terminal Fenster in der Arduino IDE öffnet, wird ein Reset ausgelöst.

Grüße, Peter W
Hallo Struwelpeter,
Zitat - Antwort-Nr.: | Name:

... Kann aber gut sein, das die für ein Multimeter zu schnell ist und einen Oszi habe ich nicht zur Verfügung. ...


ich habe mir für die "Untersuchung" von digitalen Signalen im Faden:
https://www.1zu160.net/scripte/forum/forum_show.php?id=1230261
für einen Analyzer entschieden, der mir bisher sehr gute Dienste leistet und sehr preisgünstig ist.
Meine Aufgabenstellung hätte ich mit einem Oszi sehr schwer hinbekommen.
nur als Tipp für deine Recherche
LG
Günter
Hallo,
nach ein paar Tagen Pause geht's weiter (leider kann ich immer nur sehr kurze Zeit am Projekt schaffen).
Sorry, wenn ich Verwirrung gestiftet habe. Aber das sowohl das Board als auch der Chip die gleiche Bezeichnung haben, war mir entgangen.
Tatsächlich ist der Anschluss OE auch auf dem Board herausgeführt, leider fehlt in der Kennzeichnung der Überstrich. Und ja, wenn dort 10 k nach Masse geschaltet sind, kann ich mit einem Widerstand in der gleichen Grössenordnung nach U+ kein HIGH erzeugen. Mit < 1k geht das, sollte auch mit < 2 k funktionieren. Damit werden die Ausgänge abgesperrt (in etwa die Fahrstrasse festgelegt) und auch der Startup-Jitter unterdrückt. Der Output am Arduino wird aber beim Einschalten nicht rechtzeitig HIGH, so dass etwas mehr Aufwand erforderlich ist.
Werde jetzt erst einmal am mechanischen Aufbau weiter werkeln und vielleicht später mitteilen, wie das Ganze ausgegangen ist.
Danke für alle Beiträge.
Struwelpeter
Hallo Struwelpeter,

hast du eine Lösung gefunden und wie sieht sie aus ?

Danke
Uli
Hallo Uli,

nein, es gibt noch nichts Neues zum Thema. Erst habe ich mich noch mit den Servos beschäftigt und seit zwei Monaten ruhen die Arbeiten ganz.

Sorry,

Struwelpeter
Hallo Struwelpeter,

ich habe nur gefragt, weil ich ebenfalls den PCA9685 mit Arduino einsetze (DCC-EX). Ich selber habe damit keine Probleme, aber im Forum von DCC-EX wird dieses Problem diskutiert. Bis jetzt ohne Lösung.

Viel Spass mit dem Arduino
Uli
Hallo zusammen,

ich nutze auch die PCA9685 am Arduino und hatte zunächst ebenfalls Probleme mit willkürlichen Bewegungen, nicht nur beim Startup, sondern sporadisch auch zwischendurch. Servos sind MG90S, mit SG90 war's aber ähnliches Verhalten. OE zu schalten war nicht zielführend, weil oft bei Enable ein oder mehrere gerade gar nicht angesteuerte Servos sich bewegt haben.

Letztlich habe ich ein Relais zwischen die Servo-Stromversorgung vom 5V-Netzteil  zum PCA9685 dazwischengeschaltet, das immer erst direkt vor der Servobewegung den Strom anschaltet und (nach kurzer Wartezeit) nach der Bewegung wieder trennt. Seitdem ist Ruhe. OE bleibt permanent auf Enable stehen. Als Relais nehme ich Solid-State-Relais (weil lautlos), gibt's mit 1-8 Kanälen z.B. https://www.makershop.de/module/relais/1-kanal-omron-solid-state/ - wenn das Klacken nicht stört geht aber natürlich auch ein anderes Relais.

Schöne Grüße
Matthias
Moin,

Seit 1,5 Jahren wird dieses Problem hier diskutiert ... ich habe bis jetzt keinen Schaltplan etc gesehen, wie die Servos !und die Stromversorgung angeschlossen sind.

Wenn man mehrere Servos über den Baustein betreibt, muß zwangsläufig ein eigenes Netzteil für die Servos vorhanden sein, was auch nicht einbricht, wenn alle Servos gleichzeitig laufen.

Es gibt aber auch einige Diskussionen darüber, dass einige der Platinen wohl von Haus aus defekt sind.
https://forum.arduino.cc/t/problem-with-pca9685...rvo-driver/889397/15

Viele Grüße, Franzi
Hallo Hamburgerin,

sorry, aber gut Thing will Weile haben.
Im Moment habe ich aber andere Probleme, nict der Moba-Art.
Technisch ist der Vorschlag über den OE-Eingang machbar, braucht aber wohl externe Hardware.

Struwelpeter


Nur registrierte und eingeloggte User können Antworten schreiben.
Einloggen ->

Noch nicht registriert? Hier können Sie Ihren kostenlosen Account anlegen: Neuer N-Liste Account





Zum Seitenanfang

© by 1zu160.net;