Hallo
Naja, so wirklich brauchbar ist das in meiner Spielzeuggröße wohl nicht.
Irgendwie zieht sich das Projekt nun auch etwas in die Länge. Für die Potis (die noch nicht verwendet werden) habe ich mit Irrwegen locker 3 Wochen gebraucht, die Basis ist verändert, eine kleine Adapterplatine wurde zusammengelötet und der RP6 hat nun einen genutzten USRBUS und einen dritten "freien" ADC. Zudem habe ich endlich eine pfiffige Servoansteuerung gefunden die sich mit den RP6-Libs verträgt. Und schliesslich habe ich noch einen kleinen Greifer zusammengebastelt, der wiederrum war nach einer Stunde fertiggebogen:
Bild hier Bild hier Bild hier
Bild hier Bild hier Bild hier
(Digitales 5€-Miniservo: https://www.roboternetz.de/phpBB2/ze...ag.php?t=42121)
Zusammengebaut sieht das nun so aus:
Bild hier Bild hier
http://www.youtube.com/watch?v=O1G1xVg6CcU
http://www.youtube.com/watch?v=94sjwaqIeAI
Das Programm (für einen 8MHz-Mega32) fährt stur die einzelnen Positionen an:
GrußCode:// Parallele Kinematik 21.3.2008 mic // RP6 steuert Deltaroboter mit Greifer #include "RP6RobotBaseLib.h" // Servoausgänge 1-4 #define servoinit {DDRB |= (1<<PB7); PORTB &= ~(1<<PB7); DDRC |= 0b01110000; PORTC &= ~0b01110000;} #define servo1on PORTC |= (1<<PC4) #define servo1off PORTC &= ~(1<<PC4) #define servo2on PORTC |= (1<<PC5) #define servo2off PORTC &= ~(1<<PC5) #define servo3on PORTC |= (1<<PC6) #define servo3off PORTC &= ~(1<<PC6) #define servo4on PORTB |= (1<<PB7) #define servo4off PORTB &= ~(1<<PB7) typedef struct { uint16_t pos1, pos2, pos3, pos4; uint8_t pause; } schritt; schritt schrittfolge[10]; uint8_t servo1, servo2, servo3, servo4, s[5]={0,200,200,200,200}; //oben offen uint16_t adc1, adc2, adc3; void getadcs(void) { adc1=readADC(7); adc2=readADC(1); adc3=readADC(0); } int main(void) { initRobotBase(); getadcs(); servoinit; //Timer2 Initialisierung TCCR2 = (0 << WGM21) | (0 << COM20) | (1 << CS22); // Normal Mode, prescaler /64 TIMSK |= (1 << TOIE2); // Timer2 Overflow-Interrupt erlauben //TIMSK &= ~(1 << TOIE2); // Timer2 Overflow-Interrupt verbieten servo1=s[1]; servo2=s[2]; servo3=s[3]; servo4=s[4]; while(1) { servo1=200; // hoch servo2=200; servo3=200; mSleep(600); servo4=154; // aufpicken mSleep(200); servo1=150; servo2=150; servo3=150; mSleep(400); servo1=220; // hoch servo2=220; servo3=220; mSleep(400); servo2=70; // rueber servo3=250; mSleep(150); servo1=130; mSleep(500); servo4=170; // oeffnen mSleep(200); servo1=120; // neu positionieren servo2=60; servo3=240; mSleep(300); servo4=154; // schliesen mSleep(200); servo1=200; // hoch servo2=120; servo3=240; mSleep(200); servo1=220; // mitte oben servo2=220; servo3=220; mSleep(600); servo1=170; // runter servo2=170; servo3=170; mSleep(500); // fallenlassen servo4=170; mSleep(300); } return(0); } ISR (TIMER2_OVF_vect) { static uint8_t servo_nr=0, grundimpuls=0; static uint16_t impulspause; if(servo_nr) { if(grundimpuls++ & 1) TCNT2=200; else { if(servo_nr==1) {TCNT2=servo1; servo1on; impulspause-=servo1;} if(servo_nr==2) {TCNT2=servo2; servo1off; servo2on; impulspause-=servo2;} if(servo_nr==3) {TCNT2=servo3; servo2off; servo3on; impulspause-=servo3;} if(servo_nr==4) {TCNT2=servo4; servo3off; servo4on; impulspause-=servo4;} if(servo_nr==5) {servo4off; servo_nr=0;} if(servo_nr) servo_nr++; } } else { if(impulspause>256) impulspause-=256; else {TCNT2=-impulspause; servo_nr++; impulspause=1500;} } }
mic







Zitieren

Lesezeichen