Beiträge von Knisterbein

    Das ist eine gute Frage KaiR, nein

    ich hatte mir das Protokoll des Modbuses angeschaut und fand es zu weit entfernt, für das was ich benutze. Vermutlich, mangels Erfahrung. Im Augenblick habe ich den RS485 Treiber noch nicht in Betrieb und behelfe mir mit einem 5V Serial Interface. Mit einem Terminal (HTERM) teste ich meine HW jeweils aus. Die UART Schnittstelle dient in erster Linie der Konfiguration und dem Auslesen der Messwerte.

    Der im Block gezeigte Schaltungsteil sammelt und rechnet die Messdaten anhand von gesetzten Parametern. Die Befehle sind sehr einfach gehalten, z.B:

    setInpAtt B 60000 bedeutet dann soviel wie, setze die Werte des davor liegenden Koppler mit einer Dämpfung von -60dB.

    showCalData zeigt die Kalibrierdaten der beiden Messkanäle (vor und Rücklauf).

    usw.

    Der Umfang der Kalibrierdaten (2 float für jedes kalibrierte Frequenzband von 1Mhz-51MHz, wovon ich im Augenblick 10 definiert habe) und alle Parameter würden die 255 Byte EEprom Kapazität sprengen, weshalb ich die Kalibrierwerte jeweils nur als Differenz zu einer Referenz abspeichere.


    Im Idealfall misst man den Rückfluss möglichst nahe am Fusspunkt der Antenne, die dann hoffentlich irgendwo auf dem Dach steht. Deshalb kann man die Messdaten auch via UART abholen, oder, wenn man das Gerät in Sichtweite betreibt, schicke ich alle Messwerte in binärer Form über die SPI Schnittstelle.

    Dort sitzt im Augenblick nochmals ein ATtiny, der dann die Messwerte auf die Anzeige schreibt.

    Die SPI Schnittstelle soll dann später auch eine Steuerung einer automatischen Anpasseinheit (Tuner) mit dem notwendigen Daten beschicken.


    Clipboard01.jpg

    in etwa so sieht dann die Anzeige aus, die ich oft benutze um die Messwerte schnell kontrollieren zu können. Im gezeigten Bild sind die Leistungswerte sehr klein (hoffentlich stimmen sie ;))

    Gruss

    Pius

    *grinst*


    ein guter Kondensator kann auch noch teurer sein. Es ist nun mal so, wenn ich einen Kondensator benötige, dann kann ich ihn nicht mit einem Chip ersetzen.

    Den benutzten Tiny habe ich noch längst nicht im Griff, aber die Unbekannten sind ja die Dinge die einem das Ausprobieren nahe legen.

    Gruss

    Pius

    Block.png

    hier noch das Block Schema meiner Auswertelektronik

    Danke KaiR


    ich stimme Dir voll zu, dass in diesem Forum sich keiner über einen anderen lustig gemacht hat und ich sah auch nie Tendenzen dazu. Es war gerade der Umgangston, der dieses Forum für mich attraktiv gemacht hat.

    Das Einstellen von Informationen kostet Zeit und ich muss mir jeweils überlegen, ob eine gemachte Erfahrung auch andere interessiern könnte. Nun, mit meinem kuzen Post von heute ging ich davon aus, dass es sicher Dich interessieren könnte, zuma ich weiss, dass Dich nicht nur die digitale Technik fasziniert.

    Ich denke, eine gute Idee kann es sein, aus beidne Welten (analog und digital) möglichst das optimalste zu benutzen.


    Und wenn Franz glaubt, dass ich selber kein Wissen aus dem Forum abgreifen kann, dann irrt er, denn nur zu oft haben mich scheinbar "dumme" Fragen auf andere Lösungen gebracht. Desweitern ist kaum einer in der Lage, all die techn. Dinge zu wissen, geschweige dann auch umsetzen zu können.

    So konnte auch ich keine der detaillierten Fragen von Nische, auch nicht ansatzweise, beantworten. Ehrlich, die Technik dahinter ist ein ganz anderer Schuh. Aber wenn man sich in die Chip Entwicklung ein wenig einlesen möchte dann empfehle ich nach wie vor das Buch von Hans Camenzind.

    Gruss

    Pius

    Ich bin seit längerer Zeit am Eigenbau eines Stehwellen Messgerätes.


    Diese Geräte bestimmen im Grunde genommen die HF-Leistung die in ein Kabel fliesst und errechnet aus dem Verhältnis der zugeführten zur reflektierten Leistung das Verhältnis, das durch Fehlanpassungen am Ende des Kabels entstehen.

    Mein Gerät misst somit Leistungen (bei einer bekannten Last von 50 Ohm Impedanz), die ich zur Anzeige bringen muss. Die Leistung wird mittels eines Log Amps, dessen analoges Ausgangssignal von einem uC in einen digitalen Wert umgewandelt wird. Die zu messenden Leistungen schwanken durch modulierte Signale stark. Um da mit einem AD Wandler die Spitzen zu ermitteln müsste ich die Abtastfrequenz mehr als doppelt so hoch wie die höchste Modulationsfrequenz realisieren.

    PeakDetect.png

    Um die Schaltung einfach zu halten entschied ich mich auf eine analoge Lösung zurück zu greifen.

    Obiger Schema Ausschnitt zeigt die Beschaltung. Um die Spitzenspannung (die eine Leistung reflektiert) zu bekommen, wird ein Kondensator (C10) von einer Gleichrichter Schaltung (OP und D1) aufgeladen. Dabei verhindert die Diode einen Rückfluss der Ladung aus dem C10. Da die OP Beschaltung als Spannungsfolger beschaltet ist, ist der Ausganswiderstand gering, was ein schnelles Laden von C10 ermöglicht. Der Widerstand R14 dient der Überbelastung des OP Ausganges. Die Spannung des Kondensators wird dann durch einen weiteren Spannungsfolger dem AD-Konverter des Controllers zur Verfügung gestellt.


    Bild1.jpg


    Obiges Oscilloscope Bild zeigt mit der violetten Kurve das mit einem Rechteck AM modulierte HF Signal (Modulationsgrad = 50%), die gelbe Linie zeigt die Modulation (Ein/Aus) und die oberste Linie verdeutlicht die Spannung am C10 resp. am Ausgang des Spannungsfolgers. Anhand der Zeiten erkennt man, dass der Kondensator innerhalb von 100 uS bereits aufgeladen wurde. Im Zeitpunkt der gelben abfallenden Flanke (das HF Signal reduziert wieder die Amplitude) bleibt die Spannung am Ausgang mehr oder weniger erhalten und der Controller kann nun in einem späteren Zeitpunkt die anliegende Spitzenspannung ermitteln. Die SW selbst speichert darauf die ermittelte Spitzenspannung ab, sofern sie grösser war, als die bereits gespeicherte Spannung (nur der grösste Wert wird gehalten). Nach einer in der SW bestimmten Zeit (ich legte sie in meinem Fall auf 2 Sec fest, was dem Auge genügend Zeit zum Ablesen des Spitzenwertes ermöglicht) wird der Kondensator C10 über den FET Q1 entladen und der nächste Messzyklus kann beginnen.



    Bild2.jpg



    Dieses Oscilloscope Bild zeigt den Ladevorgang eines sehr kurzen Ereignisses und die Spannung während einer etwas längeren Zeit. Selbstverständlich könnte man die durch Verluste entstehende Entladung durch den Einsatz eines «besseren» Kondensators noch verbessern. Da meine Abtastfrequenz habe schnell genug ist, so dass sicher innerhalb der ca. ersten 100mS eine AD Konversion abläuft, ist die Verkleinerung der Verluste nicht notwendig. Übrigens, das Bild ist ein schönes Beispiel für Effekte der Unterabtastung eines Oscilloscopes. Die violette Kurve (ein HF Signal um die 20 Mhz) zeigt eine Sinusform, obwohl die Horizontal Zeit wesentlich zu lange ist. Dies ist ein typischer Artefakt der Unterabtastung des digitalen Oscilloscopes. Mit einem analogen Oscilloscope betrachtet, würde die violette Kurve ein Band zeigen so ähnlich wie im ersten gezeigten Bild.

    Übrigens benutze ich als uC für mein Gerät einen ATTiny1626. Die Wahl fiel auf diesen Controller, weil ich mich für diese Serie interessierte, ich mich da etwas einarbeiten wollte und dieser unter anderem eine 12 Bit AD Wandler verfügt. Dieser ist um Faktoren (als ATMega xx) besser und ermöglicht das mehrmalige Konvertieren, ohne dass die SW etwas dazu tun muss und dies zu einem Preis um die eines Dollars.


    Gruss

    Pius


    Vielen Dank Nische


    Ab und an habe ich mir überlegt, ob ich hier etwas aus meinen Basteleien zu berichten habe, aber ich dachte mir, dass es eh ganz wenige interessieren würde, und habe es deshalb gelassen. KaiR hat sich tatsächlich durch seine Dienstleistungen hier arg angestrengt. Seine Mühen wurden meist mit einem Danke und dann bin ich wieder weg gedankt. Ich nehme an, dass dies der Lauf der Zeit darstellt, dass man Wissen irgendwo abholen kann und wenn man es gemacht hat, dann ist man zufrieden. Sollte es in den Schulen auch so abgehen, dann tun mir die Lehrer leid, dürften sie da auch nur Wissen bereitstellen, mühsam erklären, nochmals erklären und dann tschüss sagen.


    Natürlich habe ich Dein verlinktes Video angeschaut und staune immer wieder, ob dem Mehr, dem Grösser und Schneller unserer Konsumzeit, muss ich dennoch staunen wie Du. 1T ist nur ein Zahl, Autos mit 700pS ist nur ein Zahl die sich von den Daten eines anderen Fahrzeuges unterscheidet. Wenn man sich dann aber darüber Gedanken macht, was diese Zahlen bedeuten, dann kommt man unweigerlich auf Fragen wie die Deinen. Wir brauchen diesen Speicher, weil unser Leben voll mit Informationen gestopft wird und es gilt diese Informationen bis ans Lebensende aufzubewahren. Dann, wenn es vorbei ist, wird der Chip, die Disk mit den vielleicht noch vorhandenen Fotos auf Papier in die Mulde geworfen und der vermeintliche Trieb zu Sammeln bekommt einen definitiven Abort. Ich bin der Meinung, dass es im Grunde genommen viel wichtiger wäre zu fragen, was wir mit diesen Dingen und den grossen Zahlen tun, als wie man sie erreicht? Ein Gärtner baut Gemüse an, weil er weiss dass wir es essen wollen, und viel weniger, weil er es kann. Wir sollten wieder Ziele haben (zugegeben, 1T auf einen Chip zu packen mag eines sein) und das Tun darauf ausrichten. Hätte ich in den jungen Jahren gewusst, dass ein Speicher von 1Mbyte nicht nur machbar, sondern auch bezahlbar wird, dann hätte ich mir vielleicht solche Ziele gesetzt, die ich nie erreicht hätte. Zum Glück war ich und bin ich gewohnt, in kleinen Schritten zu denken. So habe ich in kleinen Schritten meine Freude gehabt.


    Pius



    PS: die Panele sind nicht vergessen

    Hallo Franz


    Du könntest den Rx doch wieder in Stand setzen und dann damit wieder mal reinhören? Wer weiss, vielleicht packt Dich dann das Fieber. Selber habe ich die Prüfung nur absolviert, weil ich wissen wollte, ob ich den Prüfungsstress aushalten würde und nebenbei war es ein gutes Gefühl ohne schlechtes Gewissen mit HF zu basteln.
    Natürlich ist das Gerät viel zu schade um in der Entsorgung zu landen und da es einige Sammer gibt, nehme ichmal an, dass Du das Gerät auch los wirst.

    herzliche Grüsse

    Pius

    Hallo Franz

    kenne mich damit auch nicht weiter aus. Es ist ein Gerät des Sommercamp Labels, die Daten findest Du sicher.

    der FR-100b ist der Empfänger und der Sender hat die Bezeichnung FL200B

    Ein Rat, schalte das Gerät nicht ein, resp. steck es nicht in die Steckdose um es auszuprobieren. Nach solanger Zeit sind die Elkos ausgetrocknet und sollten vor der Inbetriebname geprüft werden. Wird das Gerät eingeschaltet kann es passieren, dass ein Elko Schluss macht und damit weitere Bauteile zerstört.

    Wenn man dann die verdächtigen Kandidaten ersetzt hat, dann schaltet man das Gerät "langsam" ein (mit Regeltrafo) um den Kondensatoren die Möglichkeit zu geben, sich zu erholen. Gute Quellen für die Restaurierung alter Geräte findest Du hier beim Radiomuseum.

    Gruss

    Pius

    #Teckelfreund

    Die Uhr ist super geworden, vorallem für einen, der sich mit 3D Druck und Co nicht auskennt.
    Mein Respekt und nun eine DCF77 Synchronisierung?
    Muss ja nicht sein, die staunenden Blicke auf die Uhr reichen aus.

    Pius

    Super Kai


    beeindruckend, echt da wird C++ auch benutzt.

    Kleiner Hinweis, ich weiss nicht ob die Arduino C++ Compiler dies auch unterstützen (denke schon).

    Code
    1. class Timer {
    2. public:
    3. void start() { timeStamp = millis(); }
    4. bool operator()(const unsigned long duration) { return (millis() - timeStamp >= duration) ? true : false; }
    5. private:
    6. unsigned long timeStamp {0};
    7. };

    In obiger Klasse fragt man mit dem Operator ab, ob die Zeit erreicht ist. Soweit ich feststelle verändert der Operator den Inhalt der Klasse Timer nicht.

    In solchen Fällen, kann man den Compiler dies mitteilen mit "const" am Ende


    Code
    1. bool operator()(const unsigned long duration)const {
    2. return (millis() - timeStamp >= duration) ? true : false;
    3. }

    In allen Fällen, wo man mit der Klasse Timer dann weiterarbeiten möchte und diese selbst als const deklariert haben möchte, weil vielleicht nicht alle "Benutzer" der Klasse eine Veränderung im Inhalt der Klasse erlaubt sein soll. Im obigen Fall denke ich, ist es nicht notwendig.

    Aber ich habe mir angewöhnt alle Memberfunktionen einer Klasse, die den Inhalt der Klasse selbst nicht verändern mit dem const zu deklarieren.


    Code
    1. constexpr byte seq[NUM_SEQUENCES][NUM_PORTS] {
    2. {LOW, HIGH, HIGH, LOW },
    3. {LOW, LOW, HIGH, LOW },
    4. {LOW, LOW, HIGH, HIGH},
    5. {LOW, LOW, LOW, HIGH},
    6. {HIGH, LOW, LOW, HIGH},
    7. {HIGH, LOW, LOW, LOW },
    8. {HIGH, HIGH, LOW, LOW },
    9. {LOW, HIGH, LOW, LOW }
    10. };

    Bei dieser Tabelle könnte man nochviel Platz einsparen, da ich annehme dass der Compiler für LOW/HIGH jeweils ein Byte benutzt. Aber solange man nicht knapp mit Flash da steht, ist Deine Lösung schöner zu lesen.
    Ich stehe im Augenblick in einem meiner Projekte ganz hart an der Grenze des verfügbaren Flash Speichers und verbringe Tage damit um vielleicht 100 Byte einzusparen. So bin ich soweit, dass ich

    einen f(float n) Aufruf als f(float *pn) realisiere. Ein float belegt 4 Byte, ein Zeiger auf ein float belegt bei meiner 8-Bit CPU nur 2 Byte ...

    Es ist anstrengend ja, aber wenn Du dubuggen willst und der Compiler meldet dass ich 4 Bytes zu viel Code produziere, dann muss ich im Debug Mode Texte verkleinern und eben auch *pfloat anstelle einer Kopie auf dem Stack benutzen. Eine weitere Erkentnis war, dass ich öffters mal das Schlüsselwort "register" für lokale Daten in Funktionen benutze, was oft zu kleinerem Code führt.

    Code
    1. switch (btn.tick()) {
    2. case Btn::ButtonState::longPressed:
    3. rotate(STEPS_PER_MINUTE);
    4. timer.start();
    5. break;
    6. default: checkForNextMinute(timer); break;
    7. }

    würde man das switch mit einem if() else ersetzen:

    Code
    1. if (btn.tick() == Btn::ButtonState::longPressed) {
    2. rotate(STEPS_PER_MINUTE);
    3. timer.start();
    4. }
    5. else {
    6. checkForNextMinute(timer);
    7. }

    spart man etwas Platz ein. Was aber nur Sinn ergibt, wenn das switch case wenige Überprüfungen hat.

    Es macht Spass Code von Dir zu lesen!;)

    schönen Abend

    Pius

    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

    Hans, mir geht es so, dass je älter ich werde umso weniger wage ich mich etwas auszuprobieren. Bevor ich es tue, wird überlegt, studiert, gesucht und wenn ich mich dann aufgerafft habe etwas zu probieren, ärgere ich mich, dass ich es nicht viel früher wagte. Und obwohl ich meinen Mechanismus kenne, scheint es sich zu wiederholen.

    Für das aktuelle Projekt mit der Einarbeitung eines ATTinys tat ich mich sehr schwer, wagte es dann und war erstaunt, dass sich viele meiner Fragen zuvor in Luft aufgelöst haben und andere, nicht angedachte Probleme, löste ichdann eben in kleinen Schritten.

    Mein Fazit, ich befehle mir nun öffters: Probier es aus!

    Hallo Hans


    Code
    1. Was ich überhaupt nicht verstehe, dass am Ausgang eine positive Spannung anliegt.
    2. Frage: Sollte die Spannung nicht Negativ sein?

    Das Eingangssignale Deiner Beschaltung wird dem OP am - Eingang zugeführt. Damit ist der OP im Invertierenden Betrieb, wie Du bereits richtig festgestellt hast.

    ABER, Dein Foto zeigt zur Versorgung eine 9V Batterie was mich vermuten lässt, dass Du am OP lediglich eine positive Versorgung hast, womit die Ausgangsspannung am OP natürlich nie negativen Werte erreichen kann.

    Übrigens, das Messen von Spannungen am OP Eingang erscheint mir nicht zielführend, da es sich um sehr kleine Eingangsströme handelt, die in den - oder + Anschluss fliessen.

    Aber zuerst nimm eine zweite 9V Batterie in Serie geschaltet. Der gemeinsam verbundene Punkt der Batterien ist der Nullbezug (Masse). +9V führst Du auf den OP V+ und den -9V auf das V- des OP.

    Gruss
    Pius

    vielleicht hilft dier Link weiter: Grundlagen


    sorry, den Link hast Du ja schon

    nun Kai es geht natürlich in beide Richtungen, schliesslich kann ein Schrittmotor in zwei Richtungen positioniert werden. Meist sind die Schrittweiten (ich habe keine Ahnung von Schrittmotoren) 1.8 Grad under der Kreis hat ... passt doch.

    Sicher eine machbare und interessante Aufgabe.

    Hallo Franz


    ich kann leider auch nicht aus Erfahrung sprechen, betrachte ich jedoch meine Funkuhr an der Wand (Zeiger) und erinnere mich, wie sie sich manchmal nach dem Batteriewechsel richtet, dann könnte dies zumindest ein Lösungsansatz sein.
    Soll sich die Uhr richten, dann bewegt sie die Zeiger als erstes auf high noon (12h). Die Position(en) sind vermutlich mit Kontakten oder Schaltern definiert. Dann, wenn die Uhr eine Zeit korrekt empfangen konnte, bewegt sie die Zeiger vorwärts, was mit Schrittmotoren wohl einfach zu realisieren ist. Kurz, die Uhr benötigt eine mechanische Position, die bekannt sein muss. Damit steht aber auch sicher, dass sich die Uhr lediglich ab und an nach der empfangenen Zeit ausrichten kann. Mit mehr Aufwand sollte aber auch dies machbar sein, wenn die interne Uhrzeit (Positionen der Anzahl Schritte der Zeiger) mit der externen Zeit verglichen wird und dann eben gewartet oder die Zeiger vorwärts bewegt werden.


    Gruss

    Pius

    @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