okay thx dann werde ich das heute mal versuchen
ja, die servoansteuerung1 vehält sich wie Du es beschreibst...Zitat von radbruch
und hier passiert wieder das schon mal beschriebene:Dann wäre jetzt Schritt zwei an der Reihe:
Das Servo sollte damit im Wechsel zwei Positonen anfahren, dazu hat es jeweils eine Sekunde Zeit. Wenn du die Werte für die jeweiligen Positionen änderst um den maximalen Drehbereich auszutesten sollte das Servo in der jeweiligen Position kurz verweilen. Wenn es dies nicht macht, muss die Zeit (=maxwert für c in der Schleife) solange erhöht werden, bis die kurze Pause erkennbar ist.Code:// Servoansteuerung2: Wir erzeugen zwei Impulse im Wechsel 10.1.2010 mic // sleep(1) verzögert ca. 0,1ms, 50 Impulse dauern ca. 1 Sekunde // Servo an SDA (PC1) (XBUS Pin 12) #include "RP6RobotBaseLib.h" uint8_t c; // allgemeine 8-Bit-Variable (ein Char) int main(void) { initRobotBase(); DDRC |= SDA; PORTC &= ~SDA; while(1) { for(c=0; c<50; c++) // 50 Impulse senden, das dauert ca. 1 Sekunde { PORTC |= SDA; // Impulsstart sleep(12); // 1,2ms warten = Servoposition 1 PORTC &= ~SDA; // Impulsende sleep(190); // 19ms warten } for(c=0; c<50; c++) { PORTC |= SDA; sleep(18); // 1,8ms warten = Servoposition 2 PORTC &= ~SDA; sleep(190); } } return(0); // wird nie erreicht }
Wie gehts nun weiter? Entweder erhöhen wir die Auflösung der Positionen (und trennen uns damit von der sleep()-Ansteuerung) oder wir fahren die Positionen langsamer an oder wir steuern gleichzeitig ein zweites Servo an. Sag was du willst/brauchst.
Gruß
mic
der servo fährt die mittenposition an (egal ob vorher rechts oder links am mechanischen anschlag) und bleibt stehen. Jeder weiterer versuch mit dem taster neu zu starten wird nur mit einem zucken nach links quitiert...
gruß inka
okay thx dann werde ich das heute mal versuchen
ich habs jetzt zum laufen gebracht
Mit dem Code funktionierts.Code:#include "RP6ControlLib.h" void servo_io5 (uint8_t imp) { DDRC |= IO_PC5; PORTC |= IO_PC5; sleep(imp); PORTC &= ~IO_PC5; sleep(200-imp); } int main(void) { initRP6Control(); initLCD(); uint8_t i=0, x; i=0; x=10; while(true) { while(i<10) //200ms { servo_io5(x); i=i+1; } x=x+1; if (x>=20) { x=10; } i=0; } while(true) { showScreenLCD("Endlosschleife", ""); } return 0; }
... ein Wunder ist geschehen.
hi mic,
war jetzt bei C, habe das servo umgetauscht, eine gute und eine schlechte nachricht:
- das kleine billigservo (4,95€) geht auf XBUS1 & 2 (1,3,12) schön im takt hin und her - damit kann ich jetzt erstmal experimentieren...
- das große geht nicht, nur so, wie bereits beschrieben, auch mit einer externen 6V versorgung und dem steueranschluss an XB1-12 nicht. Wenn das jetzt gegangen wäre (ext power) hätte ich gesat es zieht zuviel strom, aber so?
gruß inka
Eigentlich brauchen auch große Servos nicht wirklich viel Strom ...Wenn das jetzt gegangen wäre (ext power) hätte ich gesat es zieht zuviel strom, aber so?
Würde es zu viel Strom brauchen, würde man es bemerken, da der Spannungsregler dann warm werden würde.
Bzw. der RP6 würde sich einfach abschalten (er wäre damit nicht kaputt).
Hast du schon mal versucht den Servo an einer normalen Fernsteuerungsanlage (falls du eine hast) zu betreiben?
sowas habe ich leider nicht, sind meine ersten gehversuche mit servos...
was mich stutzig macht ist, dass das kleine servo geht, das große nicht (wie auch das andere große, was ich schon hatte). Ist doch nicht normal...
gruß inka
Vl kennst du jemanden der nen Empfänger und nen Sender hat ...
Das Servos kaputt bzw. nicht od. nicht richtig funktionieren ist eigentlich wirklich sehr selten der Fall.
edit:
jemanden in deiner nähe
hi mic,
habe nun mit der servoansteuerung2 experimentiert, habe jetzt glaube ich verstanden wie die einzelnen positionen am servo mittels sleep bestimmt werden, was mir noch fehlt ist die antwort auf´s warum (siehe fragen im code):
Code:// Servoansteuerung2: Wir erzeugen zwei Impulse im Wechsel 10.1.2010 mic // sleep(1) verzögert ca. 0,1ms, 50 Impulse dauern ca. 1 Sekunde // Servo an SDA (PC1) (XBUS Pin 12) #include "RP6RobotBaseLib.h" uint8_t c; // allgemeine 8-Bit-Variable (ein Char) int main(void) { initRobotBase(); DDRC |= SDA; PORTC &= ~SDA; while(1) { for(c=0; c<50; c++) //50 = 50 Impulse senden, das dauert ca. 1 Sekunde { PORTC |= SDA; // Impulsstart sleep(1); // 1 = 0.1ms warten = Servoposition 1 PORTC &= ~SDA; // Impulsende sleep(150); //150ms warten } /* die for/++ schleife wird 50* durchlaufen, d.h. das signal wird 50* in längen von 0,1sec und zwischenpausen von 150ms abgegeben sleep(1) bestimmt die äußerste linke position am servo - warum eigentlich? ist das so irgendwo festgelegt? die äußerste linke position am servo müsste dem potiwert=0 entsprechen, oder? gibt es einen zusammenhang mit sleep(1)?*/ . . . . . for(c=0; c<50; c++) { PORTC |= SDA; sleep(30); //30 = 3ms warten = Servoposition 2 PORTC &= ~SDA; sleep(150); } /* die for/++ schleife wird 50* durchlaufen, d.h. das signal wird 50* in längen von 0,1sec und zwischenpausen von 150ms abgegeben, sleep(30) bestimmt die äußerste rechte position am servo......*/ . . . . . } return(0); // wird nie erreicht }
gruß inka
Bild hier
Quelle: http://wiki.rc-network.de/Servo
Das ist eine (nicht masstäbliche!) Darstellung der Servoimpulse. Die Impulslänge für Servomitte dauert ca. 1ms, der Drehbereich geht von 0,5ms bis 1,5ms (Manche Dokus sprechen auch von Mitte=1,5ms und Drehbereich 1-2ms) Die Impulse sollten alle 20ms wiederholt werden, das ist der Abstand zwischen zwei ansteigenden Flanken des Signals, in einer Sekunde werden so ca. 50 Impulse-Pausen gesendet (50Hz). Solange das Servo diese Impulse empfängt, versucht es, auf den entsprechenden Drehwinkel zu fahren bzw. diese Position zu halten. Für eine vernünftige Ansteuerung muss das Signal mindestens solange gesendet werden bis das Servo die entsprechende Position erreicht hat (zeitgesteuert weil keine Lagerückmeldung des Servos zur Verfügung steht).
Ein Sleep(1) dauert beim RP6 ca. 0,1ms weil die Zeit mit dem 10kHz-Timer0 erzeugt wird. Deshalb entsprechen Sleep(10) ca. 1ms und Sleep(200) ca. 20ms. Weil die 20ms-Pause jeweils zwischen den Impulsstarts liegen soll, ist eine Pause von Sleep(190) grundsätzlich nicht schlecht.
Meine Vorgehensweise: Ich markiere ein Servohorn (der Hebelarm auf dem Servo) an einer Stelle und drehe das Servo mit der Hand von Anschlag zu Anschlag. Dabei versetze ich das Servohorn solange in der Vielverzahnung der Antriebswelle bis der Drehbereich symetrisch in Bezug auf das Servogehäuse ist. Dann merke ich mir (oder markiere) die Mitte dieses Drehbereichs und sichere das Horn mit der Befestigungsschraube.
Nun schliese ich das Servo an den RP6 an und starte das Servoprogramm1 für eine Position. Ich beginne mit einer Impulslänge die etwa in der Mittelstellung des Servos liegt (z.B. mit 12 für 1,2ms) und ändere dann diesen Wert solange bis sich die Markierungen für Servomitte decken. (Ja, ich flashe dabei jedesmal neu ;) Anschliessend ermittle ich in gleicher weise die Werte für die Anschläge. Das sind dann die Min- und Maxwerte des Drehbereichs, diese sollten dann aber im Betrieb nicht angefahren werden!
Wenn das erledigt ist, wird man feststellen, dass die Werte für diese besonderen Positionen nicht exakt mit den Dokuwerten übereinstimmen. Das ist eben der Unterschied zwischen Theorie und Praxis :) Außerdem ist der Bereich meist nicht linear aufgeteilt und auch noch abhängig von der Betriebstemperatur.
Noch eine Info zur 20ms-Pause: Sie kann auch länger sein, das Servo wird dann träger und beginnt zu zuckeln. Kleinere Werte machen die Servos aggressiver und erhöhen die Stromaufnahme.
Der Wert des Potis ist für die Ansteuerung ohne Bedeutung. Er dient dem Servo zur Lagerückmeldung der Abtriebswelle. Der Sollwert wird von der Servoelektronik aus der Impulslänge berechnet.
Gruß
mic
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Wenn man im Programm bei der Pause statt 200 20 eingibt, was dann einer Pause von 2ms entspricht, beginnt das übrigens zu RauchenKleinere Werte machen die Servos aggressiver und erhöhen die Stromaufnahme.
PS:
Das war nicht ich und auch nicht meiner Servo bzw. mein Roboter ... zum Glück
Lesezeichen