PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [GELÖST]Asuro mit Servogreifer fährt nur Rückwärts



pinsel120866
29.11.2008, 10:13
Hallo,

ich habe meinen Asuro mit einem Greifer ausgestattet, der von einem Servo bewegt wird.
Ich habe nun das Problem dass der Asuro nur rückwärts fährt nachdem ich den Greifer bewege:


#include "asuro.h"

unsigned char i, servo_stellzeit;

void servo(unsigned char winkel)
{
unsigned int count=0;
do
{
count++;

{
PORTB |= (1 << PB0);
Sleep(winkel);
}
PORTB &= ~(1 << PB0);

Sleep(255-winkel);
}
while (count<servo_stellzeit);
}

int main(void)
{

Init();

{
servo_stellzeit=10;
for (i=18; i<80; i+=2) servo(i);
MotorDir(FWD,FWD);
MotorSpeed(120,120);
Msleep(1000);
MotorSpeed(BREAK,BREAK);
}
return 0;
}

Folgender Ablauf: Greifer öffnen - 1 Sekunde vorwärts fahren. Aber er fährt eine Sekunde rückwärts - WARUM?

radbruch
29.11.2008, 12:29
Hallo

Was macht dein asuro wenn du den Servoteil auskommentierst:

//for (i=18; i<80; i+=2) servo(i);

oder wenn du eine andere Drehrichtung angibst:

MotorDir(RWD,RWD);

Vor dem return fehlt auch die obligatorische Endlosschleife:

while(1);
return 0;

btw: Das ist aber keine 20ms Wiederholrate:

Sleep(255-winkel);

Ich kann es leider im Moment nicht selbst testen...

Gruß

mic

pinsel120866
29.11.2008, 12:52
Hallo Radbruch, danke für die Rückmeldung.

es hängt garantiert mit meiner Servofunktion zusammen. Hier habe ich vermutlich ein Timerproblem oder so was. Auch MotorDir(RWD,RWD) macht das Gleiche. Ich habe auch den Servoteil auskommentiert - Asuro führt rückwärts :-(

Ich möchte nur den Greifer öffen (also Servo auf Vollausschlag drehen) und danach 1s verwärtsfahren. Ich vermute allerdings dass es gar nicht so weit kommt bis MotorDir(FWD,FWD) erreicht wird weil das Programm vorher "abstürzt". Kannst du mir bitte sagen, ob void(servo) so stimmt bzw. wie du es machen würdest?

radbruch
29.11.2008, 13:55
es hängt garantiert mit meiner Servofunktion zusammen. Hier habe ich vermutlich ein Timerproblem oder so was.Das kann ich mir nicht vorstellen. Dein Programm nutzt die Timer der Lib ohne sie zu beeinflussen. BP0 ist die StatusLED und hat auch keinen Einfluss auf die Motoransteuerung, zumal dein asuro auch bei auskommentierter Servofunktion nicht vorwärts fährt.

Bist du sicher das die Programmvarianten mit den Änderungen auch geflash wurden? Was passiert wenn du das Programm mit nicht angeschlossenem Servo startest?

Teste mal mit einem anderen Programm ob dein asuro überhaupt noch vorwärts fahren kann. Vielleicht ist die H-Brücke oder deren Ansteuerung defekt.

pinsel120866
29.11.2008, 15:24
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:


#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:

radbruch
29.11.2008, 15:37
Herzlichen Glückwunsch. Der Greifer sieht toll aus :)

oberallgeier
29.11.2008, 16:00
Heul, schnief, schluchz, grein - und ich muss mir das Yoghurt immer noch selber aus dem Kühlschrank holen. MEIN asuro kann so etwas nicht.

Gratulatioooooon.

Und im Sommer zwickt er dann die Mücken aus? Hmmm, gesteuert von einem US-Sensor *gggg*. Und Du kannst das dann auch vom Handy aus bedienen (BT) !

pinsel120866
29.11.2008, 16:44
Danke für die guten Wünsche. Naja, der Greifer ist "nur" aus Holz - war aber ein netter kleiner Bastelnachmittag mit meinen Kindern.

@Radbuch - ohne deine super Unterstützung letztes Wochenende wäre ich nicht so weit, danke nochmals. Der Sechsbeiner rückt näher, zumal ich mit der Erweiterung 3 Servos gleichzeitig steuern kann. Ich habe nun 4xAA - Akkus drin.

@Oberallgeier - "zwicken" ist der richtige Ausdruck, der Servo hat gehörige Kraft. Wieder eine Funktion mehr!