M32 - verhaltensgesteuerter Roboter + TV Fernsteuerung
Hi Leute,
ich versuche, das 10. Beispielprogramm des M32 (Example_10_Move2), das einen verhaltensgesteuerten Roboter realisiert, um ein zusätzliches Verhalten zu erweitern. Das Verhalten hab ich erstmal OBEY genannt, der RP6 soll damit auf RC5-Signale hören (dafür hab ich weitgehend das Beispielprogramm der RP6Base - Example_08_TV_REMOTE - übernommen).
Hintergrund dafür ist einfach nur, dass ich jederzeit die Kontrolle übernehmen können will, und z.B. nach einer Kurskorrektur mit der Promo 8 Fernbedienung wieder in das autonome Verhalten (CRUISE, ESCAPE, AVOID) umschalten will.
Das Umschalten zwischen den Verhaltensweisen funktioniert auch ohne Probleme. Allerdings funktioniert die Steuerung nicht richtig.
Der RP6 stoppt beim Aktivieren der Fernsteuerung nur kurz, gibt dann aber wieder Gas. Er wird auf der rechten Seite immer langsamer, auf der linken Seite bleibt die Geschwindigkeit konstant. Und er verringert die Geschwindigkeit nicht, wenn er 0,25 Sekunden lang kein RC5 Signal mehr bekommen hat.
Nachdem ich mir jetzt die letzten 3 Wochenenden den Kopf darüber zerbrochen hab, wo zum Geier da der Fehler liegen könnte, frag ich lieber mal euch hier, in der Hoffnung, dass ihr mir weiterhelfen könnt ;)
Ich bin für jeden Tip und Hinweis dankbar! Im Anhang ist der aktuelle Stand des Codes.
schönes Restwochenende noch,
V:X
Seit langem habe ich mal wieder Zeit für meinen RP6
Zitat:
Zitat von Dirk
Hallo V:X,
Zitat:
Weitere Tips und Anregungen sind aber immernoch erwünscht
Noch mehr?
Hier z.B. das Verhalten "RC5 Empfang":
Code:
/*****************************************************************************/
// RC5 Reception Behaviour:
// The TV Remote Control definitions
// ###########################
// Uncomment __one__ (only one!) of the following definitions:
//#define RC_EURO_SKY
//#define RC_PROMO8
#define RC_TOTAL_CONTROL
//#define RC_YOUR_OWN
// ...
// ###########################
// Change the keymapping here:
#ifdef RC_EUROSKY // RC Type: Conrad - EuroSky
#define RC5_KEY_LEFT 22
#define RC5_KEY_RIGHT 21
#define RC5_KEY_FORWARDS 16
#define RC5_KEY_BACKWARDS 17
#define RC5_KEY_STOP 23
#define RC5_KEY_CURVE_LEFT 1
#define RC5_KEY_CURVE_RIGHT 3
#define RC5_KEY_CURVE_BACK_LEFT 7
#define RC5_KEY_CURVE_BACK_RIGHT 9
#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 RC5_KEY_CONTROL_START ?
#define RC5_KEY_CONTROL_END ?
#endif
#ifdef RC_PROMO8 // RC Type: Conrad - Promo8
#define RC5_KEY_LEFT 21
#define RC5_KEY_RIGHT 22
#define RC5_KEY_FORWARDS 32
#define RC5_KEY_BACKWARDS 33
#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 RC5_KEY_CONTROL_START ?
#define RC5_KEY_CONTROL_END ?
#endif
#ifdef RC_TOTAL_CONTROL // RC Type: Conrad - TOTAL control
#define RC5_KEY_LEFT 4 // 4
#define RC5_KEY_RIGHT 6 // 6
#define RC5_KEY_FORWARDS 2 // 2
#define RC5_KEY_BACKWARDS 8 // 8
#define RC5_KEY_STOP 5 // 5
#define RC5_KEY_CURVE_LEFT 32 // P+
#define RC5_KEY_CURVE_RIGHT 16 // L+
#define RC5_KEY_CURVE_BACK_LEFT 33 // P-
#define RC5_KEY_CURVE_BACK_RIGHT 17 // L-
#define RC5_KEY_LEFT_MOTOR_FWD 1 // 1
#define RC5_KEY_LEFT_MOTOR_BWD 7 // 7
#define RC5_KEY_RIGHT_MOTOR_FWD 3 // 3
#define RC5_KEY_RIGHT_MOTOR_BWD 9 // 9
#define RC5_KEY_CONTROL_START 23 // ENTER
#define RC5_KEY_CONTROL_END 0 // 0
#endif
#ifdef RC_YOUR_OWN // Your own RC!
#define RC5_KEY_LEFT 4
#define RC5_KEY_RIGHT 6
#define RC5_KEY_FORWARDS 2
#define RC5_KEY_BACKWARDS 8
#define RC5_KEY_STOP 5
#define RC5_KEY_CURVE_LEFT 1
#define RC5_KEY_CURVE_RIGHT 3
#define RC5_KEY_CURVE_BACK_LEFT 7
#define RC5_KEY_CURVE_BACK_RIGHT 9
#define RC5_KEY_LEFT_MOTOR_FWD 10
#define RC5_KEY_LEFT_MOTOR_BWD 11
#define RC5_KEY_RIGHT_MOTOR_FWD 12
#define RC5_KEY_RIGHT_MOTOR_BWD 13
#define RC5_KEY_CONTROL_START ?
#define RC5_KEY_CONTROL_END ?
#endif
//... you can add more Remote control keymappings or implement something
// better than this if you like...
#define RC5RECEPTION_MOVE 1
behaviour_command_t rc5Reception = {0, 0, FWD, false, false, 0, IDLE};
/**
* Behaviour with RC5 Reception.
*/
void behaviour_rc5Reception(void)
{
}
#define RC5RECEPTION_SPEED_ROTATE 60
#define RC5RECEPTION_SPEED_MAX 80
#define RC5RECEPTION_SPEED_L_ARC_LEFT 20
#define RC5RECEPTION_SPEED_L_ARC_RIGHT 80
#define RC5RECEPTION_SPEED_R_ARC_LEFT 80
#define RC5RECEPTION_SPEED_R_ARC_RIGHT 20
/**
* RC5 Event Handler
*/
void receiveRC5Data(RC5data_t rc5data)
{
// Check which key is pressed:
switch(rc5data.key_code)
{
case RC5_KEY_LEFT: // Turn left:
rc5Reception.speed_left = RC5RECEPTION_SPEED_ROTATE;
rc5Reception.speed_right = 0;
rc5Reception.dir = LEFT;
rc5Reception.move = false;
rc5Reception.rotate = true;
rc5Reception.move_value = 100;
rc5Reception.state = RC5RECEPTION_MOVE;
break;
case RC5_KEY_RIGHT: // Turn right:
rc5Reception.speed_left = RC5RECEPTION_SPEED_ROTATE;
rc5Reception.speed_right = 0;
rc5Reception.dir = RIGHT;
rc5Reception.move = false;
rc5Reception.rotate = true;
rc5Reception.move_value = 100;
rc5Reception.state = RC5RECEPTION_MOVE;
break;
case RC5_KEY_FORWARDS: // Move forwards
rc5Reception.speed_left = RC5RECEPTION_SPEED_MAX;
rc5Reception.speed_right = RC5RECEPTION_SPEED_MAX;
rc5Reception.dir = FWD;
rc5Reception.move = true;
rc5Reception.rotate = false;
rc5Reception.move_value = 100;
rc5Reception.state = RC5RECEPTION_MOVE;
break;
case RC5_KEY_BACKWARDS: // Move backwards
rc5Reception.speed_left = RC5RECEPTION_SPEED_MAX;
rc5Reception.speed_right = RC5RECEPTION_SPEED_MAX;
rc5Reception.dir = BWD;
rc5Reception.move = true;
rc5Reception.rotate = false;
rc5Reception.move_value = 100;
rc5Reception.state = RC5RECEPTION_MOVE;
break;
case RC5_KEY_STOP: // Stop!
rc5Reception.speed_left = 0;
rc5Reception.speed_right = 0;
rc5Reception.dir = FWD;
rc5Reception.move = false;
rc5Reception.rotate = false;
rc5Reception.move_value = 0;
rc5Reception.state = RC5RECEPTION_MOVE;
break;
case RC5_KEY_CURVE_LEFT: // Drive curve left - forwards
rc5Reception.speed_left = RC5RECEPTION_SPEED_L_ARC_LEFT;
rc5Reception.speed_right = RC5RECEPTION_SPEED_L_ARC_RIGHT;
rc5Reception.dir = FWD;
rc5Reception.move = true;
rc5Reception.rotate = false;
rc5Reception.move_value = 100;
rc5Reception.state = RC5RECEPTION_MOVE;
break;
case RC5_KEY_CURVE_RIGHT: // Drive curve right - forwards
rc5Reception.speed_left = RC5RECEPTION_SPEED_R_ARC_LEFT;
rc5Reception.speed_right = RC5RECEPTION_SPEED_R_ARC_RIGHT;
rc5Reception.dir = FWD;
rc5Reception.move = true;
rc5Reception.rotate = false;
rc5Reception.move_value = 100;
rc5Reception.state = RC5RECEPTION_MOVE;
break;
case RC5_KEY_CURVE_BACK_LEFT: // Drive curve left - backwards
rc5Reception.speed_left = RC5RECEPTION_SPEED_L_ARC_LEFT;
rc5Reception.speed_right = RC5RECEPTION_SPEED_L_ARC_RIGHT;
rc5Reception.dir = BWD;
rc5Reception.move = true;
rc5Reception.rotate = false;
rc5Reception.move_value = 100;
rc5Reception.state = RC5RECEPTION_MOVE;
break;
case RC5_KEY_CURVE_BACK_RIGHT: // Drive curve right - backwards
rc5Reception.speed_left = RC5RECEPTION_SPEED_R_ARC_LEFT;
rc5Reception.speed_right = RC5RECEPTION_SPEED_R_ARC_RIGHT;
rc5Reception.dir = BWD;
rc5Reception.move = true;
rc5Reception.rotate = false;
rc5Reception.move_value = 100;
rc5Reception.state = RC5RECEPTION_MOVE;
break;
case RC5_KEY_LEFT_MOTOR_FWD: // Only left motor on - forwards
rc5Reception.speed_left = RC5RECEPTION_SPEED_MAX;
rc5Reception.speed_right = 0;
rc5Reception.dir = FWD;
rc5Reception.move = true;
rc5Reception.rotate = false;
rc5Reception.move_value = 100;
rc5Reception.state = RC5RECEPTION_MOVE;
break;
case RC5_KEY_LEFT_MOTOR_BWD: // Only left motor on - backwards
rc5Reception.speed_left = RC5RECEPTION_SPEED_MAX;
rc5Reception.speed_right = 0;
rc5Reception.dir = BWD;
rc5Reception.move = true;
rc5Reception.rotate = false;
rc5Reception.move_value = 100;
rc5Reception.state = RC5RECEPTION_MOVE;
break;
case RC5_KEY_RIGHT_MOTOR_FWD: // Only right motor on - forwards
rc5Reception.speed_left = 0;
rc5Reception.speed_right = RC5RECEPTION_SPEED_MAX;
rc5Reception.dir = FWD;
rc5Reception.move = true;
rc5Reception.rotate = false;
rc5Reception.move_value = 100;
rc5Reception.state = RC5RECEPTION_MOVE;
break;
case RC5_KEY_RIGHT_MOTOR_BWD: // Only right motor on - backwards
rc5Reception.speed_left = 0;
rc5Reception.speed_right = RC5RECEPTION_SPEED_MAX;
rc5Reception.dir = BWD;
rc5Reception.move = true;
rc5Reception.rotate = false;
rc5Reception.move_value = 100;
rc5Reception.state = RC5RECEPTION_MOVE;
break;
case RC5_KEY_CONTROL_START: // Start of the RC5 control mode
rc5Reception.speed_left = 0;
rc5Reception.speed_right = 0;
rc5Reception.dir = FWD;
rc5Reception.move = false;
rc5Reception.rotate = false;
rc5Reception.move_value = 0;
rc5Reception.state = RC5RECEPTION_MOVE;
break;
case RC5_KEY_CONTROL_END: // End of the RC5 control mode
rc5Reception.speed_left = 0;
rc5Reception.speed_right = 0;
rc5Reception.dir = FWD;
rc5Reception.move = false;
rc5Reception.rotate = false;
rc5Reception.move_value = 0;
rc5Reception.state = IDLE;
break;
}
if(rc5Reception.state == RC5RECEPTION_MOVE)
{
if(getStopwatch2() > 500)
{
clearPosLCD(1, 0, 13);
setCursorPosLCD(1, 0);
// Display the received data:
writeStringLCD_P("RC5 ");
writeCharLCD(rc5data.toggle_bit + '0');
writeStringLCD_P(" |");
writeIntegerLCD(rc5data.device, DEC);
writeStringLCD_P(" |");
writeIntegerLCD(rc5data.key_code, DEC);
setStopwatch2(0);
}
}
}
/*****************************************************************************/
Gruß Dirk
Hallo
Mir ist nicht klar, wie dieser Code in das weiter oben vorgestellte erweiterte move Programm eingefügt werden muß.
kann mir hier jemand helfen?
Gruß Klaus
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
etwas bin ich weiter gekommen. Im Prinzip funktioniert es schon, aber wenn per IR nur der linke oder rechte Motor laufen soll, läuft erst einmal auch der andere mit an
Gruß Klaus
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Dirk,
Schande über mein Haupt, ich hatte die falsche Datei angehängt :-s
Gruß
Klaus