Hallo
Zuerst ein paar Pics:
Bild hier Bild hier Bild hier
Bild hier Bild hier
(Oben ist Minus, Mitte ist Plus und Unten sind die Signale angeschlossen)
Nun zu deinen Fragen:
Ich kann doch den Servo auch direkt an so einen ADC dranhängen oder?
Ja, an ADC0/ADC1 kann man direkt ein Servo anschliessen, allerdings muss man die Pinbelegung des Servosteckers anpassen. Die kleine Zunge am Stecker kann man anheben und den Kontakt rausziehen und umstecken. Das Bild oben zeigt den schon geänderten Anschluß, im orginalen Zustand ist Plus(Vdd) in der Mitte und Minus(GND) außen. Das ist ein JR-Stecker, wenn ich mich nicht irre.
...wie rufe ich denn das Signal der Fernsteuerung dann ab?
Es gibt zwar mehrere Möglichkeiten ein Servo anzusteuern, wirklich gut ist aber nur eine Lösung mit einer Interruptserviceroutine(=ISR) (wie im Wiki beschrieben: Servo). Das so erzeugte Puls/Pause-Timeing ist das gleiche wie es auch eine RC-Fernsteuerung liefert. Deshalb drängt es sich geradezu auf, mit dieser ISR auch die Signale einer Fernbedienung einzulesen. Wie schon weiter oben beschrieben (Link) sieht der Programmteil in der ISR dazu etwa so aus:
Code:
if (PINC & 1) rc_temp_dir++; else
if (rc_temp_dir) { rc_input_dir=rc_temp_dir-1; rc_temp_dir=0; }
(Das RC-Signal ist am SCL-Pin des XBUS(Pin10, Port C0) angeschlossen, in rc_input_dir steht dann der Wert. Diesen kann man übrigens direkt an ein Servo weitergeben...)
Das funktioniert mit 2 RC-Kanälen sehr gut, mit 8 Kanälen wird das allerdings kritisch. Gute (und teure) RC-Empfänger liefern außer den einzelnen Servosignalen auch ein Summensignal (an einem extra Anschluß) Dieses enthält die Steuerpulse für alle Kanäle und könnte ebenfalls ausgewertet werden. Das habe ich allerdings noch nicht versucht, deshalb kann ich dazu keine Lösung anbieten(Link). Über den Sinn einer sochen Funktion könnte man auch philosophieren, schließlich ist der RP6 ja ein autonomer Roboter...
...kannst du mir evtl mal ne art schaltplan ... von deiner Servo-Platine mit Ansteuerungscode schicken?
(Ich vermute, deine ?-Taste prellt...)
Zur Zeit bastle ich an einem 6-fach-Adapter an den LED-Anschlüssen. Am RP6 habe ich Stiftleisten in die Anschlüsse IO1-IO4, BPL und BPR gelötet und dazu passenend Stecker zur Verbindung mit einer kleinen Lochstreifen-Platine angefertigt. Die Stiftleisten auf der Platine sind jeweils an Plus und Minus angeschlossen, ebenso wie die 100uF, 2uF und 100nF-Kondensatoren die zur Pufferung und Entstörung dienen (sollen?). Die Signalpins der Stiftleisten gehen direkt zu den 6 Steckerchen. Die ISR zur Ansteuerung von 6 Servos an den LED-Pins sieht bei mir so aus:
Code:
ISR (TIMER0_COMP_vect)
{
static uint16_t count=0; // Servoansteuerung
(count>s1)?(PORTC&=~SL1):(PORTC|=SL1);
(count>s2)?(PORTC&=~SL2):(PORTC|=SL2);
(count>s3)?(PORTC&=~SL3):(PORTC|=SL3);
(count>s4)?(PORTB&=~SL4):(PORTB|=SL4);
(count>s5)?(PORTB&=~SL5):(PORTB|=SL5);
(count>s6)?(PORTB&=~SL6):(PORTB|=SL6);
/*
(count>s7)?(PORTA &= ~1):(PORTA |= 1);
(count>s8)?(PORTA &= ~2):(PORTA |= 2);
*/
if(count<2000) count++; else count=0;
}
Servo 1 bis 6 (s1-s6) sind die LED-Anschlüsse, Servo 7+8 (s7+s8) sind ADC0/ADC1. Der Code stammt übrigends von meinen ersten "Gehversuchen" und meinen neuen Greifer:
Bild hier Bild hier
http://www.youtube.com/watch?v=i4tYTp2gbPg
Noch eine Anmerkung zum Stromverbrauch: Meine Servos ziehen beim Blockieren bis zu 0,5A! Der Festspannungsregler des RP6 ist aber nur für 1,5A ausgelegt. Er kann zwar größere Stromspitzen vertragen und hat eine eingebaute Überstromabschaltung, wird aber im Dauerbetrieb mit mehreren Servos extrem heis. Deshalb hat mein RP6 ein kleines Kühlblech unter dem Spannungsregler. Im Moment betreibe ich sechs meiner 8 Servos mit einem zusätzlichen 4,8V-Akkupack. Der 7. Stecker oben im Bild ist der Minus-Anschluss (GND) dieses Akkupacks zum Anschluß an den RP6. Um das Übergewicht wieder loszuwerden plane ich aber schon eine zusätzliche Spannungsreglerplatine.
Gruß
mic
Lesezeichen