PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 22 Servos ansteuern



ChRiZ
06.10.2006, 22:41
Hallo Zusammen!
Es geht bei meinem neuen Projekt um einen Humanoiden Roboter.
Ich bräuchte dazu ca. 22 Servos.

Bisher habe ich mit dem SD20 gearbeitet, nun will ich aber auf den I2C Bus verzichten.

Gibt es eine andere Möglichkeit mit einem Atmega128?

Vielen Dank für eure Hilfe!!!

EDatabaseError
06.10.2006, 22:54
Schau mal im robotikhardware.de shop da gibts ne platine für je 8 Servos (RS232) das 3 mal und fertig...

ChRiZ
07.10.2006, 17:06
Vielen Dank für deine Antwort!
Leider habe ich mit rs232 noch nie etwas gemacht, kann ich die Bausteine NS1 ähnlich wie I2C adressieren und über einen BUS laufen lassen?

Ich werd mich mal im internet etwas schlau machen ;)

greetz ChRiZ

PicNick
07.10.2006, 17:24
Interessehalber: Warum gefällt Dir I2C nicht ? Ist doch ein Vielfaches schneller als RS232 ?

Jon
07.10.2006, 17:34
Warum gefällt Dir I2C nicht ? Ist doch ein Vielfaches schneller als RS232 ?
Mir gefällt I2C nicht, da das Programmieren so kompliziert aussieht.
RS232 dafür sehr übersichtlich und einfach.

jon

ChRiZ
09.10.2006, 07:40
eigentlich gefällt mir I2C ja..
nur meine SDA SCL leitung am atmega128 ist schon besetzt durch ein Funkmodul (RF04). Wenn ich jetzt andauernd noch Sensoren über twi abfrage blockier ich den Bus...
desshalb wollte ich das getrennt haben ;)

Ich überlege mir nun aber den Datenverkehr vom Funkmodul so zu minimieren dass es gleichwohl funktioniert...

Jon
09.10.2006, 09:00
das sollte eigendlich auch mit Funkmodul gehen. der I2C-Bus ist so schnell...
Probiere es am besten mal aus.

jon

ChRiZ
09.10.2006, 10:22
ich habs auch probiert, dachte erst auch das müsste funktionieren..
vielleicht liegt es auch am Funkmodul?
werde nun aber das funkprogramm ändern und weitere tests machen ;)

isf
16.10.2006, 13:19
Hi,

du kannst die Signalleitung deiner Servos direkt an die Ports vom Prozessor anschließen. Das PWM Signal über den Timer generieren und auf die jeweiligen Pins verteilen. Mit einem Atmega128 lassen sich dann mind. an die 80 Servos betreiben.

ISF

ChRiZ
16.10.2006, 15:50
vielen Dnak für deinen Tipp!!

hmm, und der atmega ist genug schnell um 30 Servos miteinander anzusteuern?

hat das jemand schonmal ausprobiert??
das wäre natürlich optimal, somit bräuchte ich keine zusätzlichen Servocontroller.

Auf dem Atmeg läuft noch ein Beschleunigungssensor und einige Analoge sachen, ich hoffe das reicht dann mit dem speed?

eigentlich muss ich nur den Beschleunigungssensor schnell auslesen, die anderen (druck, distanz sensoren haben ja Zeit)

SprinterSB
16.10.2006, 16:05
Das packt schon ein ein ATmega8 mit 32 Servos:

https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=24100

Die optimale Lösung sieht IMHO so aus:

Man hängt 4 Portexpander hintereinander und hat so 32 Ports. An jeden dieser Ports (oder einige davon) ein Servo.

Softwaretechnisch: Man aktualisiert im gewünschten Takt (wohl 20kHz-50kHz) die Expander. Bei Verwendung der HW-SPI braucht man ca 27 Takte, um ein Byte rauszukloppen (wegen Software-Overhead der Schleife). Wenn es noch schneller sein soll, könnte man die Schleife aufrollen.

Die 4 Expander parallel zu betreiben wie bei dem Servo-Controller im verlinken Beitrag bringt m.E. nicht viel, das einzige was man davon hat, ist ein Jitter auf den Ausgängen. Wirklich gewinnen tut man da nix... Es ist viel wichtiger, die Ports zuverlässig zu definierten, äquidistanten Zeitpunkten zu aktualisieren.

Selbst wenn man für jedes Servo nen eigenen Port hat, muss man für jedes Pin einen if-else machen und durch Hacks dafür sorgen, daß die Laufzeit unabhängig vom genommenen Zweig bleibt. Ansonsten jitterts. Und schneller ist man damit schwerlich...

Da man zu jedem Tick die Soft-PWM neu berechnen muss, könnte man diese Berechnungen in die Ausgebe-Schleife integrieren, d.h. PWM-Werte berechnen anstatt auf den SPI zu pollen. Evtl ist es besser, die Werte nach(!) der Ausgabe zu berechnen.

Den SPI im IRQ-Modus zu betreiben ist nicht angesagt, denn der ISR-Overhead ist zeitmäßig schon über der Dauer einer Loop-Umdrehung.

Was den g-Sensor angeht: Der liefert was Analoges (liest du via ADC) oder ne PWM (liest du via InCapt), nutzt also die HW-Parallelität voll aus.

Durch geschicktes SW-Design kannst du die IRQ-Respond-Times weiter drücken, vor allem wichtig für den InCapt.

ChRiZ
16.10.2006, 17:47
Vielen Dank für diene Antwort!
der g-sensor ist digital (ADXL) ich lese ihn via int0 und int1 aus.

des weitern sollte das board im 50ms takt über funk befehle erhalten...
wäre es somit nicht sinvoller einen separaten ic für die Servosteuerung zu verwenden?

die ganze elektronik sollte jedoch so klein und kompakt sein wie möglich, die Ports am Atmega128 zu benützen käme dann schon sehr gelegen...

hmm, ich glaube ich probiere es einfach mal ;)

SprinterSB
16.10.2006, 18:36
50ms ist ja massig Zeit, wenn man nicht gut aufpasst wird einem in 50ms ja schon die Sahne sauer...

Kommt drauf an, wie viel du in einen 50ms Frame reinpackst. Ich denke mal ein 128 sollte das locker packen. Der Übelstand ist, daß du IRQs nicht priorisieren kannst. Ich vermute mal die 50ms-Teile segeln über den UART.

Ich selbst hab noch nie mit Servos gearbeitet :oops: weiß also nicht, wie groß der Jitter auf ihrem Signal sein darf und ab wann sie sich verschlucken und zappeln.

Den ADXL liest du wahrscheinlich besser via InCapt, das gibt genaue Werte. Das ISR-Design kannst du auf 2 Ebenen machen: Eine Ebene ist offen für IRQs, die andere (höher priore) ist es nicht.

Wenn du direkt an die Ports gehst macht du es so: Du berechnest erst alle Ausgaben und setzt sie dann (quasi) parallel, anstatt berechnen-setzen-berechnen-... Zudem muss der µC genug Strom für die Servos liefern. Aber 120mA oder so sollten für 32*TTL reichen.

Evtl ist auch zu überlegen, in deiner Applikation auf die 50ms zu pollen. (Ein Programm hat niemals nicht irgendwo Warteschleifen!). Musst eben mal gegeneinander aufrechen, was wie lange warten kann/darf:
-- 50ms-Baudrate
-- min/max Duty des ADXL
-- Jitter auf Servo-OUT

ChRiZ
16.10.2006, 18:59
Vielen Dank für diene Antwort!
bisher hatte ich 2 Atmegas, ein mega8 für die I2C Funkverbindung zum PC (mit RF04, easyradio), und einem kleinen 4bit Bus zu einem mega32. Auf dem lief der SD20 der ADXL und viel berechnungs schnigg schnagg ;).

Jetzt will ich aber das RN-128-funk modul verwenden. Das ding hat alles schon drinn und ist kompakter/leichter.

so nun auch mein Problem, ich habe noch nie was mir Uart gemacht ;)
wegen dem Jitter mache ich mir weniger sorgen (villeicht auch desshalb weil ich nicht genau weiss was su meinst ;) ), ich mus nie alle Servos miteinander bewegen ;)

den Funk brauche ich nur um Befehle für laufen etc. zu geben.
die 50ms sind somit kein Problem ist ja wirklich ne menge Zeit ;)
für adxl T2 reichen 5ms.

-> könnte ich über rs232 überhaupt ein SSC-32 Servocontroller ansteuern? das Funkmodul vom rn-mega128 funk läuft doch auch über rx/tx?

FuRanKu
30.10.2006, 10:46
Hallo Chriz,

sag mal brauchst Du noch günstig ein paar Servos? Habe da einige noch ungebrauchte im Keller liegen (die Conradteile). Kann ich Dir günstig abgeben, bei Interesse einfachmal ne PM an mich schicken.

Auch wenns jetzt nach angeben klingt, aber mit nem ATmega8 kann man locker 64 Servos gleichzeitig steuern. Theoretisch hätte es auch mit 512 geklappt.
Aber kein IRQ, kein I2C, sondern mit Latches und 4to8bit-Registern (als Portexpander)

ChRiZ
30.10.2006, 23:26
He he ;)
Vielen Dank für dein Angebot.
Mittlerweile werde ich aber DC Motoren verwenden.

das gibt dann ein neues Problem... kann ich die Hall sensoren der Motoren (ca. 40'000 Impulse / min) sauber auslesen?
und von 20 solchen Motoren gleichzeitig?

:)