-
Um schnell mal in der Ansteuerung Fortschritte zu machen habe ich mir gedacht den Servoarm über IR zu bedienen.
Das ist mein Code:
Code:
/*
* ****************************************************************************
* RP6 ROBOT SYSTEM - Base
* ****************************************************************************
Dieses Prorgamm wird gebaut um mienen Servoarm mit Hilfe einer IR-vernbedienung zu bedienen.
*************************************************
*/
#include "RP6RobotBaseLib.h"
uint8_t i, pause, servo_stellzeit, servo_delay;
//#define RC_EURO_SKY
#define RC_PROMO8
#ifdef RC_PROMO8 // RC Type: Conrad - Promo8
#define RC5_KEY_LEFT 21
#define RC5_KEY_RIGHT 22
#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');
switch(rc5data.key_code)
{
case RC5_KEY_LEFT: // Turn left:
writeString_P("LEFT\n");
int arm
{
i=0;
servo_stellzeit=16;
DDRA |= E_INT1; // E_INT1 als Ausgang
DDRC |= 3; // SCL und SDA als Ausgang
// 5 - 15 - 25 // Min - Mitte - Max
servo(15); // Grundstellung
while (1)
{
servo(17);
servo(18);
servo(19);
servo(20);
servo(21);
servo(22);
servo(23);
servo(24);
}
setLEDs(0b100000);
}
break;
case RC5_KEY_RIGHT: // Turn right:
writeString_P("RIGHT\n");
int arm
{
i=0;
servo_stellzeit=16;
DDRA |= E_INT1; // E_INT1 als Ausgang
DDRC |= 3; // SCL und SDA als Ausgang
// 5 - 15 - 25 // Min - Mitte - Max
servo(15); // Grundstellung
while (1)
{
servo(14);
servo(13);
servo(12);
servo(11);
servo(10);
servo(9);
servo(8);
servo(7);
servo(6);
}
setLEDs(0b000100);
}
break;
}
}
/*****************************************************************************/
int main(void)
{
initRobotBase();
setLEDs(0b111111);
writeChar('\n');
writeString_P("RP6 controlled by RC5 TV Remote\n");
writeString_P("___________________________\n");
mSleep(500);
setLEDs(0b000000);
powerON();
// Set the RC5 Receive Handler:
IRCOMM_setRC5DataReadyHandler(receiveRC5Data);
return 0;
}
Aber er scheint Fehler zu haben ,da ich ine Aussage wie diese erhalte.
Code:
Compiling: RP6Base_tvarm.c
avr-gcc -c -mmcu=atmega32 -I. -gdwarf-2 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=RP6Base_tvarm.lst -I../../../RP6Lib/ -I../../../RP6Lib//RP6base -I../../../RP6Lib//RP6common -std=gnu99 -MD -MP -MF .dep/RP6Base_tvarm.o.d RP6Base_tvarm.c -o RP6Base_tvarm.o
RP6Base_tvarm.c: In function 'receiveRC5Data':
RP6Base_tvarm.c:40: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token
RP6Base_tvarm.c:46: warning: implicit declaration of function 'servo'
RP6Base_tvarm.c:65: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'i'
RP6Base_tvarm.c:85: error: break statement not within loop or switch
RP6Base_tvarm.c: At top level:
RP6Base_tvarm.c:88: error: expected identifier or '(' before '}' token
make: *** [RP6Base_tvarm.o] Fehler 1
-
Hallo carlitoco,
ein Teil der Fehlermeldungen verschwindet, wenn du die Definition "int arm" wegläßt (wird ja gar nicht gebraucht) oder zumindest ein Semikolon anhängst: "int arm;"
Ganz fehlerfrei wird das erst kompiliert, wenn du noch die Funktion "servo" irgendwo definierst.
Was das Programm aber eigentlich so machen soll, kann ich auch dann nicht erkennen. :-k
Gruß Dirk
-
Ziel soll es sein die Servos über die IR Fernbedienung zu steuern.
Es würde erstmal reichen wenn ich 2 servos ansteuern könnte, das wäre eine gute Grundlage. Doch scheint das so noch nicht richtig zu sein.
hier nochmal der
neue code:
Code:
/*
* ****************************************************************************
* RP6 ROBOT SYSTEM - Base
* ****************************************************************************
Dieses Prorgamm wird gebaut um mienen Servoarm mit Hilfe einer IR-vernbedienung zu bedienen.
*************************************************
*/
#include "RP6RobotBaseLib.h"
uint8_t i, pause, servo_stellzeit, servo_delay;
//#define RC_EURO_SKY
#define RC_PROMO8
#ifdef RC_PROMO8 // RC Type: Conrad - Promo8
#define RC5_KEY_LEFT 21
#define RC5_KEY_RIGHT 22
#endif
void servo(uint8_t w0)
{}
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');
switch(rc5data.key_code)
{
case RC5_KEY_LEFT: // Turn left:
writeString_P("LEFT\n");
{
i=0;
servo_stellzeit=16;
DDRA |= E_INT1; // E_INT1 als Ausgang
DDRC |= 3; // SCL und SDA als Ausgang
// 5 - 15 - 25 // Min - Mitte - Max
servo(15); // Grundstellung
while (1)
{
servo(17);
servo(18);
servo(19);
servo(20);
servo(21);
servo(22);
servo(23);
servo(24);
}
setLEDs(0b100000);
}
break;
case RC5_KEY_RIGHT: // Turn right:
writeString_P("RIGHT\n");
{
i=0;
servo_stellzeit=16;
DDRA |= E_INT1; // E_INT1 als Ausgang
DDRC |= 3; // SCL und SDA als Ausgang
// 5 - 15 - 25 // Min - Mitte - Max
servo(15); // Grundstellung
while (1)
{
servo(14);
servo(13);
servo(12);
servo(11);
servo(10);
servo(9);
servo(8);
servo(7);
servo(6);
}
setLEDs(0b000100);
}
break;
}
}
/*****************************************************************************/
int main(void)
{
initRobotBase();
setLEDs(0b111111);
writeChar('\n');
writeString_P("RP6 controlled by RC5 TV Remote\n");
writeString_P("___________________________\n");
mSleep(500);
setLEDs(0b000000);
powerON();
// Set the RC5 Receive Handler:
IRCOMM_setRC5DataReadyHandler(receiveRC5Data);
return 0;
}
Gruss und danke für die Hilfe carlitoco
-
Hier eine kliene Bewegung des Servoarms als Video:
noisia.sytes.net/text/SV_A0074.mp4
-
Würfel sammler
noisia.sytes.net/text/Cube-collector.avi
Code:
#include "RP6RobotBaseLib.h"
uint8_t i, pause, servo_stellzeit, servo_delay;
void servo(uint8_t w0, uint8_t w1, uint8_t w2, uint8_t w3, uint8_t w4)
{
unsigned int count=0;
do{
PORTA |= E_INT1; // E_INT1 (Pin8)
sleep(w0);
PORTA &= ~E_INT1;
PORTC |= 1; // SCL (Pin10)
sleep(w1);
PORTC &= ~1;
PORTC |= 2; // SDA (Pin12)
sleep(w2);
PORTC &= ~2;
PORTB |= 1;
sleep(w3);
PORTB &= ~1;
PORTB |=2;
sleep(w4);
PORTB &=~2;
sleep(servo_delay-(w0+w1+w2+w3+w4));
//sleep(127);
} while (count++ < servo_stellzeit);
mSleep(20*pause);
}
int main(void) {
initRobotBase();
i=0;
servo_stellzeit=20;
DDRA |= E_INT1; // E_INT1 als Ausgang
DDRC |= 3; // SCL und SDA als Ausgang
// 5 - 15 - 25 // Min - Mitte - Max
servo(25,15,20,10,10);
servo(15,5,20,10,10); // Grundstellung
servo(10,5,15,10,10);
while (1)
{
servo(25,24,20,10,10);
servo(25,24,10,10,10);
servo(25,24,5,10,10);
servo(20,24,5,10,10);
servo(10,24,5,10,10);
servo(10,24,7,10,10);
servo(10,24,9,10,10);
servo(10,24,10,10,10);
servo(10,24,12,10,10);
servo(10,24,13,10,10);
servo(10,24,15,10,10);
servo(10,24,18,10,10);
servo(10,24,21,10,10);
servo(10,24,23,10,10);
servo(10,24,25,10,10);
servo(10,8,25,10,10);
servo(10,7,22,10,10);
servo(10,8,18,10,10);
servo(20,8,18,10,10);
servo(25,8,16,10,10);
/*
servo(15,8,20,10,10); //runter&greifer auf
servo(16,8,19,10,10);
servo(17,8,17,10,10);
servo(18,8,15,10,10);
servo(17,8,14,10,10);
servo(16,8,14,10,10);
servo(15,8,14,10,10);//greifer zu
servo(14,8,14,10,10);
servo(13,8,14,10,10);
servo(12,8,14,10,10);
//=(greifer,baseturn,beuger1
servo(12,8,14,10,10);//hoch
servo(12,8,14,10,10);
servo(12,8,16,10,10); //links drehung beginn
servo(12,10,19,10,10);
servo(12,13,21,10,10);
servo(12,15,23,10,10);
servo(12,18,21,10,10);
servo(12,21,19,10,10);
servo(12,22,17,10,10);
servo(12,23,16,10,10);
servo(12,24,13,10,10); //links drehung ende
servo(12,24,12,10,10);//runter greifer auf
servo(13,24,10,10,10);
servo(19,24,10,10,10);
servo(19,24,15,10,10); */
}
return 0;
}
gruss
-
Hallo
Sehr hübsch. Um die Abläufe etwas flüssiger zu gestalten habe ich bei meinen Greifern solche Konstruktionen verwendet:
Code:
// Als Ersatz für z.B.:
servo(25,24,20,10,10);
servo(25,24,10,10,10);
servo(25,24,5,10,10);
servo(20,24,5,10,10);
// Startposition
servo(25,24,20,10,10);
// das Servo sollte noch genug Zeit haben um die neue Position zu erreichen
servo_stellzeit=5;
for(i=20;i>5; i--) servo(25,24,i,10,10);
// oder mit variablen Schrittweiten:
for(i=20;i>5; i--)
{
servo(25,24,i,10,10);
if(i>10) i--;
}
// oder eine zweite Achse gleichzeitig
for(i=20;i>5; i--) if(i>10) servo(25,24,i,10,10); else servo(20,24,i,10,10);
Weiterhin viel Spaß mit deinem Greifarm
mic
-
So sind die Bewegungen auch etwas schöner:
computerkalle.de/rp6.php RP6 Servoarm Video
Code:
#include "RP6RobotBaseLib.h"
uint8_t i, pause, servo_stellzeit, servo_delay;
void servo(uint8_t w0, uint8_t w1, uint8_t w2, uint8_t w3, uint8_t w4)
{
unsigned int count=0;
do{
PORTA |= E_INT1; // E_INT1 (Pin8)
sleep(w0);
PORTA &= ~E_INT1;
PORTC |= 1; // SCL (Pin10)
sleep(w1);
PORTC &= ~1;
PORTC |= 2; // SDA (Pin12)
sleep(w2);
PORTC &= ~2;
PORTB |= 1;
sleep(w3);
PORTB &= ~1;
PORTB |=2;
sleep(w4);
PORTB &=~2;
sleep(servo_delay-(w0+w1+w2+w3+w4));
//sleep(127);
} while (count++ < servo_stellzeit);
mSleep(2000*pause);
}
int main(void) {
initRobotBase();
i=0;
servo_stellzeit=2;
DDRA |= E_INT1; // E_INT1 als Ausgang
DDRC |= 3; // SCL und SDA als Ausgang
// 5 - 15 - 24 // Min - Mitte - Max
//servo(24,15,20,10,10);
//servo(15,5,20,10,10); // Grundstellung
servo(24,24,20,10,10);
servo(24,24,20,10,10);
servo(24,24,20,10,10);
while (1)
{//servo(greifer auf/zu,links/rechts,up/down,10,10);
servo(24,24,20,10,10); //runter
servo(24,24,19,10,10);
servo(24,24,18,10,10);
servo(24,24,17,10,10);
servo(24,24,16,10,10);
servo(24,24,15,10,10);
servo(24,24,14,10,10);
servo(24,24,13,10,10);
servo(24,24,12,10,10);
servo(24,24,11,10,10);
servo(24,24,10,10,10);
servo(24,24,9,10,10);
servo(24,24,8,10,10);
servo(24,24,7,10,10);
servo(24,24,6,10,10);
servo(24,24,5,10,10);//greifen
servo(23,24,5,10,10);
servo(22,24,5,10,10);
servo(21,24,5,10,10);
servo(20,24,5,10,10);
servo(19,24,5,10,10);
servo(18,24,5,10,10);
servo(17,24,5,10,10);
servo(16,24,5,10,10);
servo(15,24,5,10,10);
servo(14,24,5,10,10);
servo(13,24,5,10,10);
servo(12,24,5,10,10);
servo(11,24,5,10,10);
servo(10,24,5,10,10); //hoch
servo(10,24,6,10,10);
servo(10,24,7,10,10);
servo(10,24,8,10,10);
servo(10,24,9,10,10);
servo(10,24,10,10,10);
servo(10,24,11,10,10);
servo(10,24,12,10,10);
servo(10,24,13,10,10);
servo(10,24,14,10,10);
servo(10,24,15,10,10);
servo(10,24,16,10,10);
servo(10,24,17,10,10);
servo(10,24,18,10,10);
servo(10,24,19,10,10);
servo(10,24,20,10,10);
servo(10,24,21,10,10);
servo(10,24,22,10,10);
servo(10,24,23,10,10); //Drehung, von recht nach links
servo(10,23,24,10,10);
servo(10,22,24,10,10);
servo(10,21,24,10,10);
servo(10,20,24,10,10);
servo(10,19,24,10,10);
servo(10,18,24,10,10);
servo(10,17,24,10,10);
servo(10,16,24,10,10);
servo(10,15,24,10,10);
servo(10,14,24,10,10);
servo(10,13,24,10,10);
servo(10,12,24,10,10);
servo(10,11,24,10,10);
servo(10,10,24,10,10);
servo(10,9,24,10,10);
servo(10,8,23,10,10); //runter
servo(10,8,22,10,10);
servo(10,8,21,10,10);
servo(10,8,20,10,10);
servo(10,8,19,10,10);
servo(10,8,18,10,10);
servo(10,8,17,10,10);
servo(10,8,16,10,10);
servo(11,8,15,10,10);//greifer auf
servo(12,8,15,10,10);
servo(13,8,15,10,10);
servo(14,8,15,10,10);
servo(15,8,15,10,10);
servo(16,8,15,10,10);
servo(17,8,15,10,10);
servo(18,8,15,10,10);
//servo(19,8,14,10,10); //hoch
servo(18,8,16,10,10);
servo(18,8,17,10,10);
servo(18,8,18,10,10);
servo(19,8,19,10,10);
servo(20,8,20,10,10);
servo(20,8,21,10,10);
servo(20,8,22,10,10);
servo(20,8,23,10,10);
servo(20,8,24,10,10);
servo(20,9,24,10,10); //Drehung, von links nach rechts
servo(20,10,24,10,10);
servo(20,11,24,10,10);
servo(20,12,24,10,10);
servo(20,13,24,10,10);
servo(20,14,24,10,10);
servo(20,15,24,10,10);
servo(20,16,24,10,10);
servo(20,17,24,10,10);
servo(20,18,24,10,10);
servo(20,19,24,10,10);
servo(20,20,24,10,10);
servo(20,21,24,10,10);
servo(21,22,24,10,10);
servo(22,23,24,10,10);
servo(23,24,24,10,10);
}
return 0;
}