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:
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;}
}
}
Gruß
mic
Lesezeichen