PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : servo mit ir-fernbedieung steuern



proevofreak
02.05.2008, 12:48
hallo leute, hab grad mein funktionierendes servoprogramm abgeändert, so dass ich den servo mit der fernbedienung steuern kann. leider funktioniert das programm noch nicht so wie ich will, weil der rp6 glaub nicht auf meine rc5- signale reagiert. hier mein programm:


// RP6 steuert ein Servo an der SL1-LED mit Sleep()

#include "RP6RobotBaseLib.h" // Denn vollen Funktionsumfang der Lib bezahlen
// wir mit den störenden Interrupts

#define RC_PROMO8

#ifdef RC_PROMO8
#define RC5_KEY_LEFT 21
#define RC5_KEY_RIGHT 22
#define RC5_KEY_FORWARDS 16
#define RC5_KEY_BACKWARDS 17
#define RC5_KEY_STOP 11
#define RC5_KEY_CURVE_LEFT 29
#define RC5_KEY_CURVE_RIGHT 13
#define RC5_KEY_CURVE_BACK_LEFT 10
#define RC5_KEY_CURVE_BACK_RIGHT 62
#define RC5_KEY_LEFT_MOTOR_FWD 1
#define RC5_KEY_LEFT_MOTOR_BWD 7
#define RC5_KEY_RIGHT_MOTOR_FWD 3
#define RC5_KEY_RIGHT_MOTOR_BWD 9
#define RC5KEY_SERVO_RIGHT 46
#define RC5KEY_SERVO_LEFT 60
#endif


int main(void)
{
initRobotBase();
powerON();
setLEDs(0);

while(true)
{

while(RC5KEY_SERVO_LEFT)
{
setLEDs(1);
sleep(10);
setLEDs(0);
sleep(200-10);}
while(RC5KEY_SERVO_RIGHT)
{setLEDs(1);
sleep(20);
setLEDs(0);
sleep(200-20);
}
task_RP6System();
}
return(0);
}


gruß

KayH
02.05.2008, 13:27
while(RC5KEY_SERVO_LEFT)
{
setLEDs(1);
sleep(10);
setLEDs(0);
sleep(200-10);}


das ist eine endlosschleife ..., weil RC5KEY_SERVO_LEFT eine Konstante >0 ist, welche somit immer als true ausgewertet wird
was du wahrscheinlich wolltest, ist eine Variable pruefen die gleich dieser Konstanten ist und von einer Empfaengerfunktion bedient wird

hth
Kay

proevofreak
02.05.2008, 14:05
ja glaub schon, dass du mich jetzt richtig verstanden hast. ich will halt den servo nach links und nach rechts drehen lassen, je nachdem welche taste auf der fernbedienung ich drücke. bei mir war des jetzt einmal taste
#define RC5KEY_SERVO_RIGHT 46
und
#define RC5KEY_SERVO_LEFT 60

kannst du mir jetzt vielleicht sagen, wie ich mein programm abändern muss, damit des funktioniert?

gruß

RP6conrad
02.05.2008, 22:47
Sieht du mal das vorbild programma an um den RP6 mid eine RC5 zapper zu steuern. Dan kannst du gleich sehen oder die zapper die richtige RC5 code sendet. Da gibt eine RC5Handlerevent die jeden mal bearbeitet werd wen eine RC5 code kommt. Einfach in diese handler programmieren was gemacht werden soll.

proevofreak
03.05.2008, 12:04
Einfach in diese handler programmieren was gemacht werden soll.
des kann man nicht so einfach machen....
kann mir jetzt bitte mal jemand schreiben, wie ich des obere programm verändern kann, damit des mit dem fernbedienen dann geht? der grundkern des programms dürfte ja schon passen, sollt sich also nur um kleinigkeiten handeln...

gruß

Pr0gm4n
03.05.2008, 22:56
Hi,

ich hab schon öfter was gelesen, von einer Funktion, die die RC5-Daten ausliest, guck doch mal anleitung, sry, ich kann grad nich

dann musst du nur mit



while(1)
{
int key=getRC5Data(); //oder wie das auch immer heisst
switch(key)
{
case RC5KEY_SERVO_RIGHT:
setLEDs(1);
sleep(20);
setLEDs(0);
sleep(200-20);
case RC5KEY_SERVO_LEFT:
setLEDs(1);
sleep(10);
setLEDs(0);
sleep(200-10);
}
task_RP6System();
}


MfG Pr0gm4n

proevofreak
04.05.2008, 12:45
jetzt hab ich s grad mal ausprobiert.... irgendwie klappt des aber damit nicht.
die funktion muss irgendwie anders heißen.
irgendjemand aus m forum hat doch bestimmt schon mal sowas mit der fernbedienung gesteuert...

gruß

Pr0gm4n
04.05.2008, 19:28
Hi proevofreak,

kannst du bitte wenigstens alles lesen?




int key=getRC5Data(); //oder wie das auch immer heisst



das heißt, dass ich nicht weis, wie die Funktion heißt...

und nachgucken kannst du im Selftest-Programm und in der Anleitung, hab ich



von einer Funktion, die die RC5-Daten ausliest, guck doch mal anleitung



da geschrieben, also lasse bitte solche unsinnigen posts...



MfG Pr0gm4n

proevofreak
05.05.2008, 18:49
so, jetzt hab ich weiterprogrammiert. mittlerweile kommen meine ir- signale beim robby an. aber der servo lässt sich noch nicht so steuern wie ich es will. meine ir-signale haben nämlich noch keinen einfluss auf auf den servo.
hier mein programm:


// RP6 steuert ein Servo an der SL1-LED mit Sleep()

#include "RP6RobotBaseLib.h" // Denn vollen Funktionsumfang der Lib bezahlen

#define RC_PROMO8

#ifdef RC_PROMO8

#define RC5_KEY_SERVO_RIGHT 46
#define RC5_KEY_SERVO_LEFT 60

#endif

void receiveRC5Data(RC5data_t rc5data)
{
writeString_P("Toggle Bit:");
writeChar(rc5data.toggle_bit + '0');
writeString_P(" | Device Address:");
writeInteger(rc5data.device, DEC);
writeString_P(" | Key Code:");
writeInteger(rc5data.key_code, DEC);
writeChar('\n');}

void servoTaskRight()
{ if (RC5_KEY_SERVO_RIGHT)
{setLEDs(1);
sleep(10);
setLEDs(0);
sleep(200-10);}
}

void servoTaskLeft()
{ if (RC5_KEY_SERVO_LEFT)
{setLEDs(1);
sleep(20);
setLEDs(0);
sleep(200-20);}
}


int main(void)
{
initRobotBase();
IRCOMM_setRC5DataReadyHandler(receiveRC5Data);
powerON();
setLEDs(0);

while(true)
{
task_RP6System();
servoTaskRight();
servoTaskLeft();
}
return 0;
}

wer kann mir sagen woran es liegt?
gruß

[Edit von radbruch]Bitte verwende code-Tags

KayH
05.05.2008, 19:16
deine beiden servoTasks enthalten immer noch nur Abfragen auf eine Konstante ...


if(RC5_KEY_SERVO_LEFT)
{
...
}

das wird immer ausgefuehrt, weil s.o.!

du wolltest wohl sowas aehnliches:


if(rc5data.key_code == RC5_KEY_SERVO_LEFT)
{
...
}



hth
KaY

proevofreak
05.05.2008, 20:16
dein vorschlag is ja nicht schlecht.... nur kommt halt in übersetzungsfehler wenn ich des auf die art
if(rc5data.key_code == RC5_KEY_SERVO_LEFT)
{
...
}
mache. hast vielleicht noch ne andere idee wie man des machen könnte?

Pr0gm4n
05.05.2008, 21:06
Hi,

das sprudelt mal wieder vor informationen...


also, welchen übersetzungsfehler zeigt er an, und dann muss man überlegen, was der heisst, dann kann man oft sogar als programmieranfänger erkennen, was man falsch gemacht hat...


MfG Pr0gm4n

proevofreak
05.05.2008, 21:19
Hi,

das sprudelt mal wieder vor informationen...


also, welchen übersetzungsfehler zeigt er an, und dann muss man überlegen, was der heisst, dann kann man oft sogar als programmieranfänger erkennen, was man falsch gemacht hat...


MfG Pr0gm4n

ne, das hab ich jetzt nicht gewusst^^ wie wärs wenn du anstatt deinen achso tollen kommentaren mal was zum thema schreibst? für des is der thread ja da....

dass der übersetzungsfehler an der zeile
if(rc5data.key_code == RC5_KEY_SERVO_LEFT)
liegt weiß ich ja, vor ich diese zeile geändert hab war er ja noch nicht da......


p.s. denk mal drüber nach

Pr0gm4n
06.05.2008, 16:23
Also erstmal an dich proevofreak:

-verwende bitte die Zitat-tags oder halt auf auswahl quoten, das iss so unübersichtlich

-dann an dein PS: ich muss da nix nachdenken, das war schon fürs thema

-du hast den Fehler noch immer nicht gepostet und wie ich



also, welchen übersetzungsfehler zeigt er an, und dann muss man überlegen, was der heisst



da geschrieben habe könnte da auch drin stehen, was an der zeile falsch ist...


bevor du also weiter meckerst lies bitte nächstes mal erstmal alles in ruhe zweimal durch und beleidige mich nicht als schon fast nen Troll


was ich dir vorher geschrieben habe



kannst du bitte wenigstens alles lesen?


Zitat:

int key=getRC5Data(); //oder wie das auch immer heisst




das heißt, dass ich nicht weis, wie die Funktion heißt...

und nachgucken kannst du im Selftest-Programm und in der Anleitung, hab ich

Zitat:

von einer Funktion, die die RC5-Daten ausliest, guck doch mal anleitung




da geschrieben, also lasse bitte solche unsinnigen posts...



hast du wohl immernoch nicht gemacht, du fragst die ganze zeit nach problemen, die eh in der anleitung stehen


da du selbst noch nicht geschaut hast mache ich es dir sogar noch einfacher:

du gehst in der RP6-Anleitung auf ende S.95 bzw. anfang S.96, das liest du dir durch und guckst dir dazu noch das Beispiel 8 TV Remote an und dann kannst du dein Programm abändern...

du weist dann auch, warum da ein Compilerfehler war...


ach ja, nur zu deiner Info, hättest du einfach gleich den Compilerfehler gepostet hätten wir dir das gleich sagen können also nur um dir deutlich zu machen, dass deine Aussage



wie wärs wenn du anstatt deinen achso tollen kommentaren mal was zum thema schreibst?



nicht für mich, sondern sogar eher für dich gilt...


Sei lieber nicht so unfreundlich zu Leuten, die so nett sind und dir bei deinen Problemen helfen wollen


MfG Pr0gm4n

proevofreak
06.05.2008, 20:22
// RP6 steuert ein Servo an der SL1-LED mit Sleep()

#include "RP6RobotBaseLib.h" // Denn vollen Funktionsumfang der Lib bezahlen

#define RC_PROMO8

#ifdef RC_PROMO8

#define RC5_KEY_SERVO_RIGHT 46
#define RC5_KEY_SERVO_LEFT 60

#endif

void receiveRC5Data(RC5data_t rc5data)
{
writeString_P("Toggle Bit:");
writeChar(rc5data.toggle_bit + '0');
writeString_P(" | Device Address:");
writeInteger(rc5data.device, DEC);
writeString_P(" | Key Code:");
writeInteger(rc5data.key_code, DEC);
writeChar('\n');}

void servoTaskRight()
{ if (rc5data.key_code == RC5_KEY_SERVO_RIGHT)
{setLEDs(1);
sleep(10);
setLEDs(0);
sleep(200-10);}
}

void servoTaskLeft()
{ if (rc5data.key_code == RC5_KEY_SERVO_LEFT)
{setLEDs(1);
sleep(20);
setLEDs(0);
sleep(200-20);}
}


int main(void)
{
initRobotBase();
IRCOMM_setRC5DataReadyHandler(receiveRC5Data);
powerON();
setLEDs(0);

while(true)
{
task_RP6System();
servoTaskRight();
servoTaskLeft();
}
return 0;
}

fehlermeldung: Compiling: Servoansteuerung.c
avr-gcc -c -mmcu=atmega32 -I. -gdwarf-2 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=Servoansteuerung.lst -I../../RP6Lib -I../../RP6Lib/RP6base -I../../RP6Lib/RP6common -std=gnu99 -MD -MP -MF .dep/Servoansteuerung.o.d Servoansteuerung.c -o Servoansteuerung.o
Servoansteuerung.c:27: warning: function declaration isn't a prototype
Servoansteuerung.c: In function 'servoTaskRight':
Servoansteuerung.c:27: error: 'rc5data' undeclared (first use in this function)
Servoansteuerung.c:27: error: (Each undeclared identifier is reported only once
Servoansteuerung.c:27: error: for each function it appears in.)
Servoansteuerung.c: At top level:
Servoansteuerung.c:35: warning: function declaration isn't a prototype
Servoansteuerung.c: In function 'servoTaskLeft':
Servoansteuerung.c:35: error: 'rc5data' undeclared (first use in this function)
Servoansteuerung.c:58:2: warning: no newline at end of file
make: *** [Servoansteuerung.o] Error 1

> Process Exit Code: 2
> Time Taken: 00:00
ich hab jetzt mittlerweile alle rc5 adressbits anstatt dem rc5data.key_code durchprobiert. aber die fehlermeldung kommt nach wie vor....

gruß

Dirk
06.05.2008, 22:04
Hallo proevofreak,

ich habe 'mal ein bißchen umgeschrieben, damit das Programm kompiliert werden kann. Die Funktion des Programms selbst habe ich aber NICHT getestet:

// RP6 steuert ein Servo an der SL1-LED mit Sleep()

#include "RP6RobotBaseLib.h" // Denn vollen Funktionsumfang der Lib bezahlen

#define RC_PROMO8

#ifdef RC_PROMO8

#define RC5_KEY_SERVO_RIGHT 46
#define RC5_KEY_SERVO_LEFT 60

#endif

void receiveRC5Data(RC5data_t rc5data)
{
writeString_P("Toggle Bit:");
writeChar(rc5data.toggle_bit + '0');
writeString_P(" | Device Address:");
writeInteger(rc5data.device, DEC);
writeString_P(" | Key Code:");
writeInteger(rc5data.key_code, DEC);
writeChar('\n');

if (rc5data.key_code == RC5_KEY_SERVO_RIGHT)
{setLEDs(1);
sleep(10);
setLEDs(0);
sleep(200-10);}

if (rc5data.key_code == RC5_KEY_SERVO_LEFT)
{setLEDs(1);
sleep(20);
setLEDs(0);
sleep(200-20);}
}

int main(void)
{
initRobotBase();
IRCOMM_setRC5DataReadyHandler(receiveRC5Data);
powerON();
setLEDs(0);

while(true)
{
task_RP6System();
}
return 0;
}

Vielleicht kannst du ja damit weiter machen ...

Gruß Dirk

Pr0gm4n
06.05.2008, 22:19
Hi,

also so lobe ich es mir schon mehr...


der compiler sagt, dass die variable rc5data nicht deklariert ist und das stimmt, ist aber auch anders zu verstehen...

versuche doch mal den code so zu kompilieren:



// RP6 steuert ein Servo an der SL1-LED mit Sleep()

#include "RP6RobotBaseLib.h" // Denn vollen Funktionsumfang der Lib bezahlen

#define RC_PROMO8

#ifdef RC_PROMO8

#define RC5_KEY_SERVO_RIGHT 46
#define RC5_KEY_SERVO_LEFT 60

#endif

void receiveRC5Data(RC5data_t rc5data)
{
writeString_P("Toggle Bit:");
writeChar(rc5data.toggle_bit + '0');
writeString_P(" | Device Address:");
writeInteger(rc5data.device, DEC);
writeString_P(" | Key Code:");
writeInteger(rc5data.key_code, DEC);
writeChar('\n');
servoTaskRight();
servoTaskLeft();}

void servoTaskRight(RC5data_t rc5data)
{ if (rc5data.key_code == RC5_KEY_SERVO_RIGHT)
{setLEDs(1);
sleep(10);
setLEDs(0);
sleep(200-10);}
}

void servoTaskLeft(RC5data_t rc5data)
{ if (rc5data.key_code == RC5_KEY_SERVO_LEFT)
{setLEDs(1);
sleep(20);
setLEDs(0);
sleep(200-20);}
}


int main(void)
{
initRobotBase();
IRCOMM_setRC5DataReadyHandler(receiveRC5Data);
powerON();
setLEDs(0);

while(true)
{
task_RP6System();
}
return 0;
}


denn wenn du dir das nochmal genau überlegst:

der Eventhandler ruft die Funktion receiveRC5Data auf, dann gibt das Programm zwar im Terminal alles zum RC5-Code aus, der empfangen wurde, aber die Servos werden ja nicht gestellt. wenn du jetzt aber deine Funktionen in der Hauptschleife aufrufst stehen die Variablen, die du auslesen willst nichtmehr zur Verfügung, da es lokale Variablen sind.

du musst also aus der Funktion raus deine Servos bewegen bzw. so wie ich oben dann über Parameter die Variablen in die Servofunktionen bringen

dein Compiler gibt dir doch



'rc5data' undeclared (first use in this function)


für jede Servofunktion aus, das heisst, er weiss nicht, wo er das rc5data bitte hernehmen soll, also geben wir es ihm einfach über Parameter, soweit verstanden?

Wenn dich die Ausgaben im Terminal stören kannst du die Funktion receiveRC5Data auch bis auf die Aufrufe der Servofunktionen mit Parametern leeren, bzw. einfach die Inhalte der beiden Servofunktionen in die receiveRC5Data kopieren, z.B. so:



void receiveRC5Data(RC5data_t rc5data)
{ if (rc5data.key_code == RC5_KEY_SERVO_RIGHT)
{setLEDs(1);
sleep(10);
setLEDs(0);
sleep(200-10);}

if (rc5data.key_code == RC5_KEY_SERVO_LEFT)
{setLEDs(1);
sleep(20);
setLEDs(0);
sleep(200-20);}
}

verstanden?

so kannst du die 3 Funktionen in eine zusammenfassen, und natürlich auch in der gleichen Funktion noch Ausgaben im Terminal machen, wie das mit Device Adresse oder Togglebit etc...



MfG Pr0gm4n


EDIT: Ich war wohl zu lange am schreiben, um es ja richtig gut zu erklären, da war DIRK mit der gleichen Lösung wohl schneller

proevofreak
07.05.2008, 19:50
danke für eure unterstützung.... jetzt geht die steuerung so wie ich sie mir vorgestellt hab.... jetzt kann ich mich auf das verbauen des servos konzentrieren..... dieses programm wird wohl die grundlage für die ansteuerung der servos meines projektes sein...

gruß

proevofreak
07.05.2008, 19:59
kann mir vielleicht noch jemand sagen warum der servo im folgenden programm flüssiger dreht, als in dem von dirk? liegt das an der ansteuerung mit der fernbedienung?


// RP6 steuert ein Servo an der SL1-LED mit Sleep()

#include "RP6RobotBaseLib.h" // Denn vollen Funktionsumfang der Lib bezahlen
// wir mit den störenden Interrupts

uint8_t stellzeit, servopos=10;
int main(void)
{
initRobotBase();
setLEDs(0);
startStopwatch1();
while(true)
{

while(getStopwatch1()<2000)
{
setLEDs(1);
sleep(10);
setLEDs(0);
sleep(200-10);}
while(getStopwatch1()>2000)
{setLEDs(1);
sleep(20);
setLEDs(0);
sleep(200-20);
}

}
return(0);
}
gruß

proevofreak
07.05.2008, 20:19
so, jetzt hab ich das programm von dirk oben mal versucht so umzuprogrammieren, dass ich den servo auf der experimentierplatine am xbus an der sda leitung anschließen kann. leider reagiert der servo jetzt nicht mehr auf die signale meiner fernbedienung.
hier mein abgeändertes programm:


// RP6 steuert ein Servo an der SL1-LED mit Sleep()

#include "RP6RobotBaseLib.h" // Denn vollen Funktionsumfang der Lib bezahlen

#define SERVO_OUT SDA

#define RC_PROMO8

#ifdef RC_PROMO8

#define RC5_KEY_SERVO_RIGHT 46
#define RC5_KEY_SERVO_LEFT 60

#endif

void receiveRC5Data(RC5data_t rc5data)
{
writeString_P("Toggle Bit:");
writeChar(rc5data.toggle_bit + '0');
writeString_P(" | Device Address:");
writeInteger(rc5data.device, DEC);
writeString_P(" | Key Code:");
writeInteger(rc5data.key_code, DEC);
writeChar('\n');



if (rc5data.key_code == RC5_KEY_SERVO_RIGHT)
{cli();
PORTC |= SERVO_OUT; //SDA high
sleep(10);
PORTC &= ~SERVO_OUT;
sleep(200-10);
sei();}

if (rc5data.key_code == RC5_KEY_SERVO_LEFT)
{cli();
PORTC |= SERVO_OUT;
sleep(20);
PORTC &= ~SERVO_OUT;
sleep(200-20);
sei();}

}

void initSERVO(void)
{
DDRC |= SERVO_OUT;
PORTC &= ~SERVO_OUT;

}

int main(void)
{
initRobotBase();
IRCOMM_setRC5DataReadyHandler(receiveRC5Data);
powerON();
initSERVO();

while(true)
{
task_RP6System();
}
return 0;
}

proevofreak
07.05.2008, 20:23
hat sich erledigt... hab meinen fehler gefunden... die cli(); und sei(); anweisungen müssen raus... jetzt funktionierts einwandfrei...

radbruch
08.05.2008, 08:34
{cli();
PORTC |= SERVO_OUT; //SDA high
sleep(10);
PORTC &= ~SERVO_OUT;
sleep(200-10);
sei();}
Genau darüber hatten wir vor ein paar Tagen gesprochen. *lol*

proevofreak
08.05.2008, 19:28
ja stimmt schon.... aber was bedeutet eigentlich cli(); und sei();?

gruß

radbruch
08.05.2008, 19:41
was bedeutet eigentlich cli(); und sei();?http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Interrupts_mit_dem_AVR_GCC_Compiler_.28Wi nAVR.29

proevofreak
08.05.2008, 19:52
kann mir vielleicht noch jemand sagen warum der servo im folgenden programm flüssiger dreht, als in dem von dirk? liegt das an der ansteuerung mit der fernbedienung?


// RP6 steuert ein Servo an der SL1-LED mit Sleep()

#include "RP6RobotBaseLib.h" // Denn vollen Funktionsumfang der Lib bezahlen
// wir mit den störenden Interrupts

uint8_t stellzeit, servopos=10;
int main(void)
{
initRobotBase();
setLEDs(0);
startStopwatch1();
while(true)
{

while(getStopwatch1()<2000)
{
setLEDs(1);
sleep(10);
setLEDs(0);
sleep(200-10);}
while(getStopwatch1()>2000)
{setLEDs(1);
sleep(20);
setLEDs(0);
sleep(200-20);
}

}
return(0);
}
gruß

danke... aber die frage hast du mir immer noch nicht beantwortet....

gruß

radbruch
09.05.2008, 08:25
Hallo


aber die frage hast du mir immer noch nicht beantwortet
Wenn du Dirks Version vom 6.5. meinst (Link (https://www.roboternetz.de/phpBB2/viewtopic.php?p=372056#372056)):

if (rc5data.key_code == RC5_KEY_SERVO_RIGHT)
{setLEDs(1);
sleep(10);
setLEDs(0);
sleep(200-10);}

Nur wenn das richtige IR-Zeichen eingelesen und erkannt wurde, wird ein einziger Impuls gesendet, ansonsten ist Impulspause. Anders ist es hier:

while(getStopwatch1()<2000)
{
setLEDs(1);
sleep(10);
setLEDs(0);
sleep(200-10);}

Es wird zwei Sekunden lang das zur gewünschten Position gehörende Impuls/Pause-Signal gesendet. Das Servo hat reichlich Zeit die neue Position zu erreichen. Das war nun hoffentlich die erwartete Anwort:)

Gruß

mic

proevofreak
09.05.2008, 13:56
ja das hab ich gemeint. kann man dann den 2. code von dir jetzt so umschreiben, dass man den servo mit ir steuern kann? im 2. code von dir is des ganze bisher ja zeitgesteuert....

gruß

Pr0gm4n
10.05.2008, 17:04
Hi proevofreak,

ich wollte zu



kann man dann den 2. code von dir jetzt so umschreiben, dass man den servo mit ir steuern kann?


unbedingt was sagen:

WARUM SOLLTE ES NICHT GEHEN BZW. WARUM NIMMST DU NICHT DEN 2. CODE HER???

das ist doch exakt das gleiche.....



MfG Pr0gm4n

proevofreak
10.05.2008, 18:07
@Pr0gm4n:
hab ich schon ausprobiert den 2. code zu nehmen und auf ir steuerung abzuändern. ergibt dann folgendes programm:


// RP6 steuert ein Servo an der SL1-LED mit Sleep()

#include "RP6RobotBaseLib.h" // Denn vollen Funktionsumfang der Lib bezahlen
// wir mit den störenden Interrupts
#define RC_PROMO8

#ifdef RC_PROMO8

#define RC5_KEY_SERVO_RIGHT 46
#define RC5_KEY_SERVO_LEFT 60

#endif
uint8_t stellzeit, servopos=10;
void receiveRC5Data(RC5data_t rc5data)
{
writeString_P("Toggle Bit:");
writeChar(rc5data.toggle_bit + '0');
writeString_P(" | Device Address:");
writeInteger(rc5data.device, DEC);
writeString_P(" | Key Code:");
writeInteger(rc5data.key_code, DEC);
writeChar('\n');
}
int main(void)
{
initRobotBase();
setLEDs(0);
IRCOMM_setRC5DataReadyHandler(receiveRC5Data);
powerON();

while(true)
{

while(rc5data.key_code == RC5_KEY_SERVO_RIGHT)
{
setLEDs(1);
sleep(10);
setLEDs(0);
sleep(200-10);}
while(getStopwatch1()>2000)
{setLEDs(1);
sleep(20);
setLEDs(0);
sleep(200-20);
}
task_RP6System();
}
return(0);
}
dieses programm bringt aber beim kompilieren folgende fehlermeldung:


Compiling: ServoLinksRechts.c
avr-gcc -c -mmcu=atmega32 -I. -gdwarf-2 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=ServoLinksRechts.lst -I../../RP6Lib -I../../RP6Lib/RP6base -I../../RP6Lib/RP6common -std=gnu99 -MD -MP -MF .dep/ServoLinksRechts.o.d ServoLinksRechts.c -o ServoLinksRechts.o
ServoLinksRechts.c: In function 'main':
ServoLinksRechts.c:34: error: 'rc5data' undeclared (first use in this function)
ServoLinksRechts.c:34: error: (Each undeclared identifier is reported only once
ServoLinksRechts.c:34: error: for each function it appears in.)
ServoLinksRechts.c:50:2: warning: no newline at end of file
make: *** [ServoLinksRechts.o] Error 1

> Process Exit Code: 2
> Time Taken: 00:02

gruß

Pr0gm4n
14.05.2008, 16:49
Hi,

der 2. Code ist schon auf IR-Steuerung...

du musst nichts abändern, das ist schon fertig gewesen, also mein Vorschlag da...


nimm einfach mal den von mir oben geposteten Code




// RP6 steuert ein Servo an der SL1-LED mit Sleep()

#include "RP6RobotBaseLib.h" // Denn vollen Funktionsumfang der Lib bezahlen

#define RC_PROMO8

#ifdef RC_PROMO8

#define RC5_KEY_SERVO_RIGHT 46
#define RC5_KEY_SERVO_LEFT 60

#endif

void receiveRC5Data(RC5data_t rc5data)
{
writeString_P("Toggle Bit:");
writeChar(rc5data.toggle_bit + '0');
writeString_P(" | Device Address:");
writeInteger(rc5data.device, DEC);
writeString_P(" | Key Code:");
writeInteger(rc5data.key_code, DEC);
writeChar('\n');
servoTaskRight();
servoTaskLeft();}

void servoTaskRight(RC5data_t rc5data)
{ if (rc5data.key_code == RC5_KEY_SERVO_RIGHT)
{setLEDs(1);
sleep(10);
setLEDs(0);
sleep(200-10);}
}

void servoTaskLeft(RC5data_t rc5data)
{ if (rc5data.key_code == RC5_KEY_SERVO_LEFT)
{setLEDs(1);
sleep(20);
setLEDs(0);
sleep(200-20);}
}


int main(void)
{
initRobotBase();
IRCOMM_setRC5DataReadyHandler(receiveRC5Data);
powerON();
setLEDs(0);

while(true)
{
task_RP6System();
}
return 0;
}


genau den, den hab ich auch oben schon gepostet, das meinte ich mit 2. Code


es fehlt nur noch, dass du den Servos Zeit gibst, um sich neu zu stellen, ist aber ganz einfach mit while-Schleife zu lösen:


void servoTaskRight(...){
if(...){
while(stellzeit){
stellzeit--;
...
}
}
}


dann müsste alles passen...


MfG Pr0gm4n

proevofreak
16.05.2008, 17:20
also... jetzt programmier ich schon seit über ner woche an ner vernünftigen servoansteuerung mit ir- fernbedienung rum. leider bisher mit mäßigem erfolg, weil mein servo zu ruckartig dreht.
ich hab es mit verschiedenen programmiervarianten versucht....

bei der folgenden dreht der servo zwar flüssig, ist aber jedoch nur über zeitgesteuert:


// RP6 steuert ein Servo an der SL1-LED mit Sleep()

#include "RP6RobotBaseLib.h" // Denn vollen Funktionsumfang der Lib bezahlen
// wir mit den störenden Interrupts

uint8_t stellzeit, servopos=10;
int main(void)
{
initRobotBase();
setLEDs(0);
startStopwatch1();
while(true)
{

while(getStopwatch1()<2000)
{
setLEDs(1);
sleep(10);
setLEDs(0);
sleep(200-10);}
while(getStopwatch1()>2000)
{setLEDs(1);
sleep(20);
setLEDs(0);
sleep(200-20);
}

}
return(0);
}


im folgende programm dreht lässt sich der servo über ir steuern, aber dreht aber viel zu ruckartig:


// RP6 steuert ein Servo an der SL1-LED mit Sleep()

#include "RP6RobotBaseLib.h" // Denn vollen Funktionsumfang der Lib bezahlen

#define RC_PROMO8

#ifdef RC_PROMO8

#define RC5_KEY_SERVO_RIGHT 46
#define RC5_KEY_SERVO_LEFT 60

#endif

void receiveRC5Data(RC5data_t rc5data)
{
writeString_P("Toggle Bit:");
writeChar(rc5data.toggle_bit + '0');
writeString_P(" | Device Address:");
writeInteger(rc5data.device, DEC);
writeString_P(" | Key Code:");
writeInteger(rc5data.key_code, DEC);
writeChar('\n');

if (rc5data.key_code == RC5_KEY_SERVO_RIGHT)
{setLEDs(1);
sleep(10);
setLEDs(0);
sleep(200-10);}

if (rc5data.key_code == RC5_KEY_SERVO_LEFT)
{setLEDs(1);
sleep(20);
setLEDs(0);
sleep(200-20);}
}

int main(void)
{
initRobotBase();
IRCOMM_setRC5DataReadyHandler(receiveRC5Data);
powerON();
setLEDs(0);

while(true)
{
task_RP6System();
}
return 0;
}
meiner meinung nach liegt das daran, dass die servo funktion nicht in einer while- schleife ausgeführt wird. d.h. man müsste, was mir bisher noch nicht gelungen ist, das zweite programm so abändern, dass die servofunktion auch hier in einer while schleife ausgeführt wird.
kann mir vielleicht jemand da weiterhelfen?

gruß

radbruch
16.05.2008, 18:45
So vielleicht, ich hab's nicht getestet:

// RP6 steuert ein Servo an der SL1-LED mit Sleep()

#include "RP6RobotBaseLib.h"

#define RC_PROMO8

#ifdef RC_PROMO8

#define RC5_KEY_SERVO_RIGHT 46
#define RC5_KEY_SERVO_LEFT 60

#endif

#define servorechts 10
#define servolinks 20
uint8_t servopos=15;
uint8_t stellzeit;

void receiveRC5Data(RC5data_t rc5data)
{
writeString_P("Toggle Bit:");
writeChar(rc5data.toggle_bit + '0');
writeString_P(" | Device Address:");
writeInteger(rc5data.device, DEC);
writeString_P(" | Key Code:");
writeInteger(rc5data.key_code, DEC);
writeChar('\n');

if (rc5data.key_code == RC5_KEY_SERVO_RIGHT)
if(servopos > servorechts) // wenn nicht in Position
while(--servopos >= servorechts) // Position schrittweise annähern
for(stellzeit=0; stellzeit<5; stellzeit++) // Signal mehrmals senden
{
setLEDs(1);
sleep(servopos);
setLEDs(0);
sleep(200-servopos);
}

if (rc5data.key_code == RC5_KEY_SERVO_LEFT)
if(servopos < servolinks)
while(++servopos <= servolinks)
for(stellzeit=0; stellzeit<5; stellzeit++)
{
setLEDs(1);
sleep(servopos);
setLEDs(0);
sleep(200-servopos);
}
}

int main(void)
{
initRobotBase();
IRCOMM_setRC5DataReadyHandler(receiveRC5Data);
powerON();
setLEDs(0);

while(true)
{
task_RP6System();
}
return 0;
}
gruß

Pr0gm4n
16.05.2008, 18:51
meiner meinung nach liegt das daran, dass die servo funktion nicht in einer while- schleife ausgeführt wird. d.h. man müsste, was mir bisher noch nicht gelungen ist, das zweite programm so abändern, dass die servofunktion auch hier in einer while schleife ausgeführt wird.


völliger schwachsinn!!

der Servo dreht so ruckartig, weil du ihm nur entweder den Befehl linker Anschlag oder rechter Anschlag gibst...

wenn du es unbedingt ganz flüssig haben willst, dann musst du den Servo nach und nach an seine Position fahren lassen, je mehr schritte, desto flüssiger wird das ganze

das ist allerdings einiges an programmieraufwand und das werde ich dir hier bestimmt nicht wieder als fertigen Code hier posten, da musst du schon selbst ran...


Mir ist ausserdem noch aufgefallen, dass du den servo vielleicht am anfang einmal in die mittelstellung fahren lassen könntest...

Du hast allerdings auch in beiden Programmen noch keine Stellzeit wie ich oben gepostet habe eingebaut...

Füg das mal an, dann wirds auch flüssiger


Noch dazu: du lässt gerade die ganze Zeit andere Leute für dich programmieren, hast nichtmal Tipps, die ich zum Programm mitgepostet habe mit dazugeschrieben, also mach das mal zuerst und lies die Antwortposts nochmal genau durch bevor du sowas wieder schreibst...


MfG Pr0gm4n

EDIT: hab radbruchs Code nur kurz überflogen, könnte hinhauen, das ist die Kurzversion von dem, was ich meinte

Ich denke es ist aber garnicht nötig, er muss nur genug stellzeit lassen, das reicht denke ich auch. Das mit der Stellzeit ist auch schnell eingebaut, er sollte das mal lieber kurz zuerst versuchen denke ich.

radbruch
16.05.2008, 19:04
Hallo Pr0gm4n


völliger schwachsinn!
Bitte etwas freundlicher.

Manchen macht es Spass anderen zu helfen ein Programm zu entwickeln, es ist eine gute Übung. Wenn es dich nervt dann behalte es für dich und antworte einfach nicht auf die Fragen.

Gruß

mic

proevofreak
16.05.2008, 19:16
Hallo Pr0gm4n


völliger schwachsinn!
Bitte etwas freundlicher.

Manchen macht es Spass anderen zu helfen ein Programm zu entwickeln, es ist eine gute Übung. Wenn es dich nervt dann behalte es für dich und antworte einfach nicht auf die Fragen.

Gruß

mic

seh ich ganz genauso

@radbruch: danke, hast mir sehr geholfen. das programm funktioniert einwandfrei. aber was bedeutet ++servopos bzw. --servopos?
ich werd da nicht ganz schlau draus...

gruß

radbruch
16.05.2008, 19:28
Hallo


was bedeutet ++servopos bzw. --servopos
VOR der Überprüfung der Abbruchbedingung in der while-Funktion wird der Wert von servopos um eins erhöht bzw. verringert. servopos++/servopos-- würde den Wert NACH dem Vergleich ändern.


das programm funktioniert einwandfrei
Prima. btw: Wenn du while() durch servopos--; bzw. servopos++; ersetzt, fährt das Servo nicht zu den Endpositionen sondern macht nur einen Step pro IR-Kommando.

Gruß

mic

Pr0gm4n
16.05.2008, 20:15
Hi,



Bitte etwas freundlicher.

Manchen macht es Spass anderen zu helfen ein Programm zu entwickeln, es ist eine gute Übung. Wenn es dich nervt dann behalte es für dich und antworte einfach nicht auf die Fragen.


also erstmal vorweg, mir macht es auch spass, anderen zu helfen, aber nicht, wenn ich bei jemandem merke, dass er von mir einfach die Lösung präsentiert haben will...

Es gibt einige dinge, die man auch mit 2 Klicks schnell in der Anleitung nachlesen kann

Das mit der guten Übung kann ich nur bestätigen, nur so kann ich schon einige Sachen, für die ich gar keine Anwendung an meinem Robby hätte

dann zu



Zitat:
völliger schwachsinn!

Bitte etwas freundlicher.



Ok, es war schon ein bisschen unfreundlich, sorry proevofreak dafür, ich wollte nur irgendwie deutlich ausdrücken, dass das nichts damit zu tun hat, da ist mir auf die Schnelle halt irgendwas eingefallen, ich mein das ja nicht böse

Ach was ich aber vergessen habe zu schreiben, ich finde es schon in Ordnung, wenn man mal jemanden bittet, einem einen kurzen Code zu schreiben, aber das mit dem fertige Codes präsentieren usw. meinte ich ist halt dann schon sehr nett und dafür könnte man sich ja bedanken, ich meine dass ich mich zum Beispiel auch gerne hingesetzt hätte und den fertigen Code mit der Stellzeit usw. noch schnell gemacht hätte, aber da sich proevofreak noch nicht einmal bei mir bedankt hat, dass ich für ihn allein für diesen Thread schon bestimmt 2 Stunden was in der Anleitung nachgelesen, Codes getippt, getestet usw. habe finde ich, dass er das auch selbst machen kann

Ich hoffe das ist verständlich


MfG Pr0gm4n

EDIT: @proevofreak: wenn du dich noch längere Zeit mit Mikrocontrollern beschäftigen willst würde ich dir empfehlen, ein AVR-C-Tutorial durchzuarbeiten, das hat mir sehr geholfen, jetzt kann ich mir die meisten Sachen einfach von selbst erschliessen.

Vorschlag: https://www.roboternetz.de/phpBB2/pafiledb/uploads/3795073c93275d630a7846ad8cf543b6.pdf
oder: http://derjulian.net/mikrocontroller