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