Vielleicht postest du mal dein Beispielprogramm!
Dann wird dir sicher jemand helfen/Tipps geben.
Schwierig ist das ja nun wirklich nicht.
Hallo alle zusammen,
ich verfolgen nun schon seit einigen Tagen mit viel Interesse die threats zu Servos, bis ich mir schließlich gestern auch so ein Teil gekauft habe. Inzwischen habe ich schon einige Programme auf den RP6 geladen, und verändert. Während des Programmierens bin ich auf die Idee gekommen, einen „Malenden RP6“ zu bauen. Habe zwar schon an einigen Programmen gebastelt, aber das Servo tat nicht das was es sollte.
Vielleicht kann ja einer von euch ein beispielprog posten?
Meine ersten Ideen währen. Der RP6 soll sich um 90 Grad drehen, dann das Servo um ca. 40 Grad nach links drehen (Stift herablassen), dann 20cm nach vorne fahren und dann das Servo wieder um 40 Grad nach rechts drehen um den Stift wieder vom Papier heben.
Wer hat eine Idee?
Gruß Fabi
Vielleicht postest du mal dein Beispielprogramm!
Dann wird dir sicher jemand helfen/Tipps geben.
Schwierig ist das ja nun wirklich nicht.
Hier ist mein Programm:
[/code]Code:#include "RP6RobotBaseLib.h" // The RP6 Robot Base Library. // Defines: #define SERVO_OUT SDA // PINC1 XBUS Pin 12 // Servo movement limits (depending on servo type): #define LEFT_TOUCH 1//550 // Left servo touch #define RIGHT_TOUCH 254 // Right servo touch [max. 255] #define PULSE_ADJUST 4 #define PULSE_REPETITION 19 // Pulse repetition frequency //Variablen int richtung=0; //0=rechts; 1=links int speed=5; /*****************************************************************************/ // Functions: /** * INIT SERVO * * Call this once before using the servo task. * */ void initSERVO(void) { DDRC |= SERVO_OUT; // SERVO_OUT -> OUTPUT PORTC &= ~SERVO_OUT; // SERVO_OUT -> LO startStopwatch1(); // Needed for 20ms pulse repetition } void pulseSERVO(uint8_t position) { cli(); PORTC |= SERVO_OUT; // SERVO_OUT -> HI (pulse start) delayCycles(LEFT_TOUCH); while (position--) { delayCycles(PULSE_ADJUST); } PORTC &= ~SERVO_OUT; // SERVO_OUT -> LO (pulse end) sei(); } void task_SERVO(void) {static uint8_t pos; if (getStopwatch1() > PULSE_REPETITION) { // Pulse every ~20ms if(richtung==0) pos=pos+speed; else pos=pos-speed; if (pos > RIGHT_TOUCH) {richtung = 1;} //nach links drechen if (pos < LEFT_TOUCH) {richtung = 0;} //nach rechts drehen pulseSERVO(pos); setStopwatch1(0); } } /*****************************************************************************/ // Main function - The program starts here: int main(void) { initRobotBase(); powerON();//anschalten startStopwatch1(); setLEDs(0b111111); // Turn all LEDs on mSleep(500); // delay 500ms setLEDs(0b000000); // All LEDs off initSERVO(); while(true) { task_SERVO(); rotate(60, RIGHT, 90, true); task_SERVO(); move(70, FWD, DIST_MM(300), true); task_SERVO(); task_RP6System(); } return 0; }
Hi,
was hälst du davon, deiner task_SERVO(void) Methode die Position des Servos als Parameter zu übergeben? Dadurch siehst du im Programm schneller, an welcher Stelle der Stift angehoben, bzw. abgesenkt wird und musst nicht die Aufrufe von task_SERVO() zählen.
Grüße,
Jan
Naja, ich habe den RP6 nun erst seit 3 Wochen und kann noch nicht wirklich programmieren !!
Wäre nett, wenn du mir ein beispielprogramm posten könntest !!
versuchs mal mit diesem code hier.
Ist die Grundkonstruktion (funktioniert auch) für die Steuerung eines Servos.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; }
Versuch einfach das ein Wenig umzuschreiben.
PS:
Schau in den Thread.
Mit dem Programm kann ich leider nichts anfangen, da ich (noch) keine erweiterung gekauft habe. Werde mir aber wahrscheinlich in den nächsten tagen ein m32 bestellen.
hast du vieleicht noch ein prog für die base ?
nein ... aber ich kann das auf die Base umschreiben
ich poste es dann wenn es für die Base passt
Das wäre nun das selbe Programm allerdings für die Base.
Das Servo hängt am SCL Pin (XBUS).
Code:#include"RP6RobotBaseLib.h" void servo_scl (uint8_t imp) { DDRC |= SCL; PORTC |= SCL; sleep(imp); PORTC &= ~SCL; sleep(200-imp); } int main(void) { initRobotBase(); uint8_t i=0, x; i=0; x=10; while(true) { while(i<10) //200ms { servo_scl(x); i=i+1; } x=x+1; if (x>=20) { x=10; } i=0; } while(true) { writeString_P("\n Endlosschleife"); } return 0; }
Servo mit zwei Positionen für RP6-Base:
https://www.roboternetz.de/phpBB2/vi...=479916#479916
Lass es. Du hast es doch kaum geschafft, das Progamm aufs M32 zu Übertragen. Wenn du es jetzt wieder fürs Base umändern willst, kann es nur schlimmer werden.nein ... aber ich kann das auf die Base umschreiben
ich poste es dann wenn es für die Base passt
gruß
mic
[Edit]Zu spät, Glückwunsch
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Lesezeichen