Hallo nchmal,
Ich habe mir gestern die oben verlinkte Fernsteueranlage von Conrad gekauft. Sie funktioniert wunderbar und auch das Fernsteuerprogramm von Radbruch läuft super. Nur wollte ich auch mal ein "eigenes" Program schreiben um den RP6 fernsteuern zu können. Es funktioniert leider nicht so wie ich es mir vorgestellt hatte. Deswegen brauche ich noch ml Hilfe!!
Undzwar hatte ich das Teilprogramm um die Signale auszulesen von Radbruch. ( In dem Program werden Werte von SCL und SDA ausgegeben)
Dieses habe ich ein wenig gekürzt und wollte mithilfe einer Ergänzung erreiche, dass die Signalwerte in Motorbefehle umgewandelt werden. Doch wenn ich das Program starte und die Fernsteuerrung anschalte macht der RP6 was er will. Manchmal dreht sich die rechte Kette dann wieder die Linke ohne das ich es beeinflussen kann. (Ein Hardware Problem liegt definitiv nicht vor, weil das rb-programm ja tadellos funktioniert.)
Noch was zu den Variablennamen: Ich habe die absichtlich umbenannt, weil ich jeden Motor einzelnd ansteuern will. (pwrr= rechter Motor, pwrl= linker Motor.)
Die anderen Variablen(y,x,c,v) Sind als Eingrenzung gedacht, damit man die ausgewerteten Signale auch VERWERTEN kann. Ich glaube allerdings nicht, dass das Problem daher kommt. Denn ich habe schon ein Program zum einlesen der Variablen rc_input... laufen lassen und die Eingrenz-Variaben danach ausgerichtet.
Hier ist nun der Code: (mir ist es wichtig die orginal RP6.h Lib zu verwenden, deshalb benutze ich auch nicht Radbruchs Programm mit der rb-Lib als Ansatz.)
Code:
#include "RP6RobotBaseLib.h"
volatile uint8_t rc_input_pwrr=26, rc_input_pwrl=26;
int main(void)
{
initRobotBase();
TIMSK |= (1 << TOIE1); // Die Timer1 Overflow-ISR zur Signalauslesung
powerON();
uint8_t y=29;
uint8_t x=26;
uint8_t c=24;
uint8_t v=28;
while(1)
{
if (rc_input_pwrl>y ) {changeDirection(BWD); while (rc_input_pwrl<y) {moveAtSpeed(0,60);}}
if (rc_input_pwrl<x ) {changeDirection(FWD); while (rc_input_pwrl>x) {moveAtSpeed(0,60);}}
if (rc_input_pwrr<c ) {changeDirection(BWD); while (rc_input_pwrl<c) {moveAtSpeed(60,0);}}
if (rc_input_pwrr>v ) {changeDirection(FWD); while (rc_input_pwrl>v) {moveAtSpeed(60,0);}}
task_motionControl();
}
return 0;
}
ISR (TIMER1_OVF_vect) // RC-Signale an SCL und SDA messen
{
static uint16_t rc_temp_pwrl=0;
static uint16_t rc_temp_pwrr=0;
if (PINC & 1) rc_temp_pwrl++; else
if (rc_temp_pwrl) { rc_input_pwrl=rc_temp_pwrl-1; rc_temp_pwrl=0; }
if (PINC & 2) rc_temp_pwrr++; else
if (rc_temp_pwrr) { rc_input_pwrr=rc_temp_pwrr-1; rc_temp_pwrr=0; }
}
Diejenigen von euch deMir helfen wollen und eine eigene Fernsteuerung besitzen können das Programm ja mal ausprobieren und rumprbieren. Ich bin wirklich dankbar wenn ihr mir helfen könnt.
Lesezeichen