Hallo allerseits,
ich habe zur Zeit ein kleines Problemchen...
Ich möchte an einem Atmega328 32 Servos betreiben. Ich habe bereits
etwas rechachiert und bin auf das Breakout des PCA9685 von Adafruit
gestoßen was mir aber für fast 15€ zu teuer ist und ich eigentlich einen
Chip auf einer Platine fest einsetzen möchte. Andere Überlegung wäre
gewesen per SoftwarePWM und MCP23017 die Servos zu steuern, nur habe ich
da keine Beispiele oder ähnliches gefunden wie das gehen soll.
Nun die Frage: hat vielleicht jemand von euch eine Ahnung oder eine Idee
wie ich das am einfachsten hinbekommen kann?
MFG
Lukas
Ja das dachte ich mir eigentlich schon...
Es werden maximal 4 Servos gleichzeitig angetrieben. Ich denke da dürfe
man nicht so große Probleme mit Geschwindigkeiten bekommen.
Schon mal etwas gerechnet?
Glauben hilft da nich viel.
Mit etwas Programmiergeschick wird das zeitlich völlig unkritisch sein.
Nimm einfach 2 Atmegas damit Du genug portpins hast, billiger und
straiter gehts nicht
Robbe schrieb:> Schon mal etwas gerechnet?> Glauben hilft da nich viel.>> Mit etwas Programmiergeschick wird das zeitlich völlig unkritisch sein.> Nimm einfach 2 Atmegas damit Du genug portpins hast, billiger und> straiter gehts nicht
Du meinst zwei Atmegas per Seriell kommunizieren lassen?
Da der Servo-Impuls deutlich kürzer ist, als die Periodendauer, kann man
das Ausgangssignal von einem Hardware PWM-Ausgang per Dekoder, im
Zeitmultiplex, auf mehrere Servos verteilen. Das würde auch das Problem
lösen, das der ATmega328 gar keine 32 Signalausgänge hat. Wobei solche
Aufgaben mit Software-PWM durchaus lösbar sind, auch ohne Zittern der
Servos, wenn man entsprechend gut programmieren kann. Wenn Du mit 20ms
Periodendauer (ist ein gängiger Wert) arbeiten willst, kannst Du gerade
so 8 Servos (max. 2,5ms Impuls) aus einem PWM-Ausgang bedienen. Die
Arbeit auf mehrere, eventuelle recht kleine (z.B. ATtiny),
Mikrocontroller zu verteilen, wäre vielleicht auch noch eine
Möglichkeit.
Mit freundlichen Grüßen - Martin
Lukas D. schrieb:> Robbe schrieb:>> Schon mal etwas gerechnet?>> Glauben hilft da nich viel.>>>> Mit etwas Programmiergeschick wird das zeitlich völlig unkritisch sein.>> Nimm einfach 2 Atmegas damit Du genug portpins hast, billiger und>> straiter gehts nicht>> Du meinst zwei Atmegas per Seriell kommunizieren lassen?
Wie auch immer, die Stellwerte kommen doch irgendwo her.
Martin S. schrieb:> Die Arbeit auf mehrere, eventuelle recht kleine (z.B. ATtiny),> Mikrocontroller zu verteilen, wäre vielleicht auch noch eine> Möglichkeit.
Viel zu kompliziert. Man nimmt einfach einen Controller der genug
Hardware PWM Channel hat, wie zB diverse STM32.
Außerdem benötigt der Servo PPM nicht PWM.
Welche Plattform Du nutzt hängt von deinen Kenntnissen ab, Hardware wie
Software.
Arduino unterstützt, meine ich, bis zu 12 Servos an beliebigen Pins.
Robbe schrieb:> Außerdem benötigt der Servo PPM nicht PWM.>> Welche Plattform Du nutzt hängt von deinen Kenntnissen ab, Hardware wie> Software.>> Arduino unterstützt, meine ich, bis zu 12 Servos an beliebigen Pins.
Also ich denke die Hardware wäre nicht das Problem nur Software bin ich
in c nicht grad auf der Höhe.
Noch habe ich alle Projekte mit der Arduino Plattform realisieren
können...
Jeweils 8 Servos kann man doch einfach bedienen, indem man eine "1"
durch ein Schieberegister schiebt und den Abstand der Taktflanke
entsprechend der jeweils gewünschten Servopulslänge wählt. Dann braucht
man als µC auch keinen "100-Füßler".
Wolfgang schrieb:> indem man eine "1"> durch ein Schieberegister schiebt
Und wenn man den Takt mit nem PWM-Pin erzeugt, hat man auch keinen
Jitter durch andere Interrupts.
>Noch habe ich alle Projekte mit der Arduino Plattform realisieren>können...https://www.arduino.cc/en/Reference/Servo
Die Servo-Library kann scheinbar 12 Servos ansteuern. Du bräuchtest also
3 Arduino Nanos über eine Schnittstelle verbunden.
Was spricht gegen Multiprozessing?
Markus schrieb:> Du bräuchtest also> 3 Arduino Nanos über eine Schnittstelle verbunden.>> Was spricht gegen Multiprozessing?
So einen Schwachsinn können sich auch nur "Arduidioten" ausdenken....
Die PCA9685 waren schon der richtige Ansatz.
>Die PCA9685 waren schon der richtige Ansatz.
Das hängt alles von dem Anspruch an den Optimierungsgrad und den genauen
Anforderungen ab.
Zwei PCA9685 kosten ca. 30 Euro
https://www.adafruit.com/product/815
3 Arduino Nano vom Chinesen kann man für unter 10 Euro erwerben.
>So einen Schwachsinn können sich auch nur "Arduidioten" ausdenken....
Solche Sprüche lassen die Dumpfbacken (TM) im MC-Netz gerne mal los
( ist scheinbar schon seit 2006 aktiv:
Beitrag "Re: Programmierbarer Widerstand?" )
Ich weiß, bei einer Vielzahl an Lösungsmöglichkeiten eines Problems
kommt eine Dumpfbacke schnell an die Grenzen ihres geistigen Horizonts.
Der 4017 ist der richtige Baustein. Mit dem wurden früher auch die
Signale der Mehrkanalfernbedienungen auf Servos verteilt.
Mit 5 Leitungen kann man so bequem 32 Servos ansteuern.
Reset aller Bausteine bei 0, wenn die On-Zeit für Servo 1 abgelaufen
ist, Taktimpuls und die On-Zeit für Servo 2 startet. Wenn die abgelaufen
ist, wieder einen Taktimpuls und On-Zeit für Servo 3 startet ...
1
R ___|_______________________________________________________________
Harry L. schrieb:> Die PCA9685 waren schon der richtige Ansatz.
8-Bit Auflösung für die Servo-Pulsbreite ist nicht so der Bringer, aber
möglicherweise reicht das für die angedachte Anwendung.
Danke schonmal für die ganzen Hilfestellungen. Ich werde jetzt erstmal
die Möglichkeit mit dem 4017 testen und alternativ das China Board mit
dem PCA9685 im Auge behalten.
Also ich habe 24 Servos an einem Mega8515 mit 8Mhz hängen, das geht ganz
gut.
Ich habe die Servos erstmal in 4 Gruppen aufgeteilt. Für jede Gruppe
werden die Werte der PWM immer neu vergleichen und gesetzt.
Dann einen Timer verwendet, der die Zeit per Output-Compare auflöst. Um
die einzelenen Schritte auszurechnen, lasse ich den Timer alle 10µs
einen Interrupt erzeugen. Dieser beendet dadurch einen Sleep-Befehl. Der
Code läuft dadurch synchron.
1
for(sd_timer=0;sd_timer<SD_TIMER_TOP;sd_timer++)/*10µs pro loop*/
In den Pausen zwischen den 4 Gruppen wird die Position der Servos neu
berechnet und Kommunikation am laufen gehalten.
Ein paar Sachen muss man optimieren, z.B. die ISR
1
/*dieser INT reisst den µc aus dem schlaf*/
2
/*ACHTUNG !!! - Das ist eine pseudo-Interruptroutine*/
3
/*sie wird korrekt eingetragen, aber es werden keine Register gesichert*/
4
voidTIMER1_COMPA_vect(void)
5
{
6
asm("reti");
7
}
Eine andere Idee ist, wenn nicht alle Servos gleichzeitig laufen müssen,
kann man die Servos auch nur dann anschalten, wenn sie gebraucht werden,
also PWM ausschalten. Dann bleiben sie stehen und werden durchs die
Getriebe-Übersetzung gehalten. Das sollte man sowieso machen, da ein
Servo, der immer gegen einen Anschlag drückt warm wird. Deswegen ist bei
mir mal ein Servo richtig abgebrannt. Durch die Erwärmung verstellt sich
bei einfachen Typen der Winkel und das kann das Problem verschlimmern.
Verteile das auf mehrere Mikrocontroller. Ohne großartige Klimmzüge sind
10 Servos an einem ATtiny möglich. Nimm vier davon und verbinde sie per
I2C oder irgend einer anderen seriellen Schnittstelle mit deinem ATmega.
Das Auslagern des zeitkritischen Teils auf separate Controller
verinfacht auch die Programmierung ganz erheblich.
Zum abgucken: http://stefanfrings.de/servocontroller/index.html
> 8-Bit Auflösung für die Servo-Pulsbreite ist nicht so der Bringer
Das dachte ich auch mal. Aber in der Praxis wirst du zwischen 16bit und
8bit keinen Unterschied bemerken. So genau arbeiten die Dinger ohnehin
nicht.
> Du bräuchtest also 3 Arduino Nanos über eine Schnittstelle verbunden.> Was spricht gegen Multiprozessing?
Nichts.
> So einen Schwachsinn können sich auch nur "Arduidioten" ausdenken....
Das halte ich ganz und gar nicht für Schwachsinn. Mit Welcher Begründung
kommst du zu dieser krassen Bemerkung?
> Zwei PCA9685 kosten ca. 30 Euro> Wie kommst du da drauf? ... (Vorschlag für 2x 5,99)
Arduino Nanos sind immer noch bedeutend billiger, falls es noch keiner
gemerkt hat. Und die von mir vorgeschlagenen ATtinies kosten bei
Reichelt noch weniger, und man muss nicht 6 Wochen auf die Lieferung
warten oder gar zum Zoll fahren.
Tja, wenn man nicht programmieren kann, nimmt man eben für jede popelige
Funktion einen eigenen µC - typisch Arduino-Jünger
Dabei vergessen sie meist, daß das Kommunikationsprotokoll zwischen den
µCs für diese Anfänger i.d.R. die viel grössere Hürde darstellt.
Man muß auch keine 6 Wo. auf den PCA9685 warten.
Mein Link zeigt auf einen deutschen Händler, und da hat man die Teile
i.d.R. innerhalb von 2-3 Tagen.
Stefan U. schrieb:> Verteile das auf mehrere Mikrocontroller. Ohne großartige Klimmzüge sind> 10 Servos an einem ATtiny möglich. Nimm vier davon und verbinde sie per> I2C oder irgend einer anderen seriellen Schnittstelle mit deinem ATmega.>> Das Auslagern des zeitkritischen Teils auf separate Controller> verinfacht auch die Programmierung ganz erheblich.>> Zum abgucken: http://stefanfrings.de/servocontroller/index.html
Die Lösung klingt nach einem wirklich interessanten Ansatz...
Ich glaube das werde ich mal probieren müssen ;)
> Dabei vergessen sie meist, daß das Kommunikationsprotokoll zwischen> den µCs für diese Anfänger i.d.R. die viel grössere Hürde darstellt.
Warum hast du (Harry L) dann den PCA9685 vorgeschlagen?
> Tja, wenn man nicht programmieren kann, nimmt man eben für jede> popelige Funktion einen eigenen µC
Na und, Hauptsache, die Bastelei funktioniert an Ende.
Ich denke, es wird auch schwierig sein, eine 1-Chip Lösung in Handarbeit
zu verarbeiten. Da werden ziemlich viele Leitungen sternförmig zum µC
zusammen laufen. Eine dezentrale Lösung mit I2C Bus und kleineren IC's
lässt sich viel leichter handhaben.
Stefan U. schrieb:>> Dabei vergessen sie meist, daß das Kommunikationsprotokoll zwischen>> den µCs für diese Anfänger i.d.R. die viel grössere Hürde darstellt.>> Warum hast du (Harry L) dann den PCA9685 vorgeschlagen?>>> Tja, wenn man nicht programmieren kann, nimmt man eben für jede>> popelige Funktion einen eigenen µC>> Na und, Hauptsache, die Bastelei funktioniert an Ende.>> Ich denke, es wird auch schwierig sein, eine 1-Chip Lösung in Handarbeit> zu verarbeiten. Da werden ziemlich viele Leitungen sternförmig zum µC> zusammen laufen. Eine dezentrale Lösung mit I2C Bus und kleineren IC's> lässt sich viel leichter handhaben.
Merkst du gar nicht, wie du dir widersprichst?
Oder kennst du einfach den PCA9685 nicht?
Aber Hauptsache man gibt seinen Senf dazu....
Der PCA9685 wird über eine I2C Schnittstelle angesteuert.
Du hast argumentiert, "daß das Kommunikationsprotokoll zwischen den
µCs für diese Anfänger i.d.R. die viel grössere Hürde darstellt."
Dann sollte man "diesem Anfänger" doch wohl eher nicht diesen Chip
empfehlen, oder?
Ich würde ihm allerdings schon dazu raten, sich mit dem I2C Protokoll zu
beschäftigen, denn ich finde den von Dir vorgeschlagenen Chip für diesen
Fall sehr gut. Ich habe ja auch nicht von I2C abgeraten.
Stefan U. schrieb:> Dann sollte man "diesem Anfänger" doch wohl eher nicht diesen Chip> empfehlen, oder?
Warum? für den PCA gibt's das Kommunikationsprotokoll über I2C fix und
fertig implementiert als Arduino-Bibliothek. Ziemlich Deppen- und
Maker-Sicher.
https://github.com/adafruit/Adafruit-PWM-Servo-Driver-Library
Bei einer eigenen Multi-µC-Lösung muss er selber ein Protokoll entwerfen
und implementieren.
> für den PCA gibt's das Kommunikationsprotokoll über I2C fix und> fertig implementiert als Arduino-Bibliothek.> Bei einer eigenen Multi-µC-Lösung muss er selber ein Protokoll> entwerfen und implementieren.
Ich stimme Dir zu.
OK, kann man auch machen. Je nachdem, welche Schnittstelle man
bevorzugt.
Bei der seriellen wäre es eine Eindrahtschnittstelle: TX
Interessant wäre vielleicht auch die Verwendung eines BluePills:
http://wiki.stm32duino.com/index.php?title=Blue_Pill
Der hat mehr Pins, damit könnte man vielleicht auch 16 Servos betreiben,
wenn das mit 3.3V geht.
Stefan U. schrieb:>> Zwei PCA9685 kosten ca. 30 Euro>> Wie kommst du da drauf? ... (Vorschlag für 2x 5,99)>> Arduino Nanos sind immer noch bedeutend billiger,
Also bei Digikey kosten PCA9685PW 2.03€ aktuell. Und wer keine PCB
machen will, findet unter 1528-1068-ND ein Dreierpack TSSOP28->DIL28
Breakout-Boards für 4.34€.
Und alles lieferbar.
fchk
Ich finde ziemlich krass, wie unterschiedlich die Verkaufpreise dieser
Chips sind.
Wenn man die bisherigen Vorschläge so anschaut, scheint I2C schonmal
fest zu stehen.
> hier mal das ganze über den Timer
Toll, noch eine Variante davon. Und so Zeitnah. Wie steuerst du damit 32
Servos?
Mein vor 3 Monaten genannter Vorschlag konnte schon 10 Servos ansteuern
und lässt sich immer noch ganz leicht auf 20 erweitern.
Wir waren aber schon längst bei der Erkenntnis, dass dieser PCA9685 die
bessere Wahl ist.
Jobst M. schrieb:> Der 4017 ist der richtige Baustein.
Nö.
Der kann nur 9 Servos ansteuern und läßt sich nicht kaskadieren.
Besser nimmt man daher 4 Stück 74HC164 kaskadiert. Die brauchen
insgesamt 2 Outputs des MCs, wovon der Takt ein Compare-Output ist,
damit jitterfrei.
Der Timerinterrupt lädt dann den nächsten Servowert aus nem 32Byte-Array
nach und schiebt bei jedem ersten Wert das 1Bit raus.
> Mit einem ATMega328 kannst Du keine 32 Servos direkt ansteuern,> 8 via Multiplexing aber schon
8 ist aber wenig. Mein Code steuert mittels Multiplexing 10 Servos mit
einem Timer an. Der ATMega328 hat 3 Timer, was demnach für 30 Servos
reicht. So viele I/O Pins hat der Chip aber gar nicht.
http://stefanfrings.de/servocontroller/index.html