Ich habe nun herausgefunden, woran es liegt: Nach jeder Greiferbewegung braucht der ASURO eine kurze Pause, keine Ahnung warum. Das Programm sieht nun so aus:
Code:
#include "asuro.h"
unsigned char i, servo_stellzeit;
void servo(unsigned char winkel)
{
unsigned int count=0;
do
{
count++;
if(winkel)
{
PORTB |= (1 << PB0);
Sleep(winkel);
}
PORTB &= ~(1 << PB0);
Sleep(255-winkel);
}
while (count<servo_stellzeit);
}
int main(void)
{
Init();
DDRB |= (1 << PB0);
{
servo_stellzeit=12; //Servozeit einstellen
MotorSpeed(10,10); //kurze Pause
Msleep(1);
MotorDir(FWD,FWD); //Kleines Stück vor
MotorSpeed(120,120);
Msleep(500);
MotorSpeed(BREAK,BREAK);
for (i=15; i<85; i+=2) servo(i); //Greifer zumachen
MotorSpeed(10,10); //Kurze Pause
Msleep(1);
MotorDir(RWD,RWD); //Kleines Stück zurück
MotorSpeed(120,120);
Msleep(500);
MotorSpeed(BREAK,BREAK);
MotorSpeed(135,0); //Vierteldrehung nach links
Msleep(1000);
MotorSpeed(BREAK,BREAK);
for (i=75; i>17; i-=2) servo(i); //Greifer aufmachen
MotorSpeed(10,10); //Kurze Pause
Msleep(1);
MotorDir(RWD,RWD); //Kleines Stück zurück
MotorSpeed(120,120);
Msleep(500);
MotorSpeed(BREAK,BREAK);
MotorSpeed(0,135); //Vierteldrehung nach rechts
Msleep(1000);
MotorSpeed(BREAK,BREAK);
MotorSpeed(10,10); //Kurze Pause
Msleep(1);
MotorDir(FWD,FWD); //2s Weiterfahren
MotorSpeed(120,120);
Msleep(2000);
MotorSpeed(BREAK,BREAK);
}
}
Den Ablauf habe ich hier dokumentiert:
http://www.youtube.com/watch?v=wQY2dqMZH3Y
Noch 2 Fotos:
Lesezeichen