PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RP6_TV_ Remote



rp6_thom
17.03.2011, 21:47
Hallo
Hab versucht mit dem Beispielprogramm RP6Base_TV_REMOTE zu arbeiten.
Meine Fernbedienung sendet.Ich bekomme auch Ausgaben welche Funktion
er ausführen würde, im Terminal.
Zeile 80 ist auskommentiert aber der Robby bewegt sich kein Stück.
Sebsttest fkt ohne Prob. Hab ich noch irgendwo einen Denkfehler??

Gruß Tom

RolfD
19.03.2011, 07:24
Also Du bekommst Ausgaben wie sie die Switch vorsieht mit:
writeString_P("LEFT\n");
writeString_P("RIGHT\n");
usw. ?
Und die LEDs schalten wie vorgegeben:
setLEDs(0b100000);
setLEDs(0b000100);
usw.?
Hm... wieso Zeile 80? Du meinst Zeile 10? 80 ist bei mir:
#define ACCELERATE_VALUE 8
Zeile 10 würde ich verstehen:
//#define DO_NOT_MOVE
Da später
#ifndef DO_NOT_MOVE
abgefragt wird, würde das aktivieren von DO_NOT_MOVE die Switsch entfernen.
Stimmt denn die Zuordnung der keycodes mit Deiner Fernbedienung?
Für Links und rechts müssten ja
#define RC5_KEY_LEFT 21
#define RC5_KEY_RIGHT 22
Kommen was Dir bei
writeString_P(" | Key Code:");
writeInteger(rc5data.key_code, DEC);
writeChar('\n');
auch angezeigt werden müsste. Egal ob jetzt mit oder ohne DO_NOT_MOVE

Damit wäre zumindest einzugrenzen wo der Fehler liegt...
Poste doch mal eine Ausgabe aus dem Terminal beim drücken der Tasten incl. Info welche Tasten du gedrückt hast. Daran müsste man ja erkennen ob der Fehler im IR-Receiverteil oder im Steuerteil des Motors liegt... oder ggf. in der Wahl falscher Keycodes - was ich für warscheinlich halte....
Ich muss dazu sagen, ich hab mit dem RC5 noch nichts gemacht aber eigentlich sind die Examples alle lauffähig.


Aber vielleicht noch eine Frage an geneigte Mitleser zum Thema IR.
Kennt jemand diese IR-Fernbedienungen für indoor-Hubschrauber und hat damit schon mal versucht den RP6 zu steuern? Ich hab leider keine Idee, was die für Signale ausgeben aber die dürften deutlich zuverlässiger und weiter senden als jede TV-RC - allerdings auch mit weniger Steuersignalen.

LG Rolf

rp6_thom
20.03.2011, 11:54
Hallo Rolf
Die Ausgaben im Terminal bekomme ich. Hab ich angehängt.
Sorry, meinte die Zeile 10. Hab jetzt mal die Keycodes gwechselt.
Die werden auch angzeigt aber der Motor schweigt .

Gruß Tom

RolfD
20.03.2011, 12:20
Ok.. schaut gesund aus. ggf. must Du dein Mapping noch anpassen. Aber ne ganz andere Frage... hast Du das hier gelesen und verstanden?

* You need to HOLD DOWN the key - then the RP6 will accelerate slowly to the
* MAX_SPEED values defined in this program. If you release the key again,
* it starts to deccelerate slowly.

und

* (yes it is intentionally that the robot accelerates and decelerates so
* slow ;) Of course you can change this if you want!)

Es stammt aus dem dokumentierten File... sprich.. nicht einfach nur kurz drücken und warten das er los fährt sondern gedrückt halten BIS er los fährt....
Zumindest Dein Log zeigt das so nicht an, würde ich mal sagen...
LG Rolf

rp6_thom
21.03.2011, 10:36
stimmt, ist aus dem Log nicht zu sehen, wollte es übersichtlich halten.
Gedrückt halten führt leider nicht zum Erfolg....

Gruß Tom

RolfD
21.03.2011, 11:44
hm... hm... ok. Das war's wohl nicht.
Nun gut.. also Du bekommst ja offensichtlich RC5 Signale rein da die receiveRC5Data wie gesehen aufgerufen wird und die Zuordnung ist erst mal 2.Frage ...
Ansich passiert dann nicht mehr viel... berechnen der Accel-Daten für die Antriebe links und rechts... und dann per moveAtSpeed ab auf die MosFets.
Poweron, initrobotbase und task_rp6sstem werden auch ausgeführt. Den Selbsttest hattest Du gemacht wie Du sagtest...
Man könnte sich nun noch die errechneten Accel-Werte ausgeben lassen... um zu sehen ob der denn beschleunigen würde.
Aber irgendwie glaube ich nicht an ein Fehler da... der würde sonst auch bei anderen zuschlagen.

Hm.. Du Sorry... ich kann Dir nicht helfen :) Gesetzt den Fall, das alles so ist wie ich vermute und Du ja bestätigst, müsste er losfahren.
Ich würde vorschlagen, du machst noch mal den Selbsttest - um sicher zu stellen das die Antriebe wirklich ok sind.
Ich rechne allerdings damit, das der positiv ausgeht... und Dir damit nicht weiter hilft. Eine andere Fernbedienung kann man noch testen aber ob das was bringt....
Ne Du.. ich bin am Ende mit meinen Tips. Tut mir leid.
Vielleicht findet sich jemand, der Dir besser helfen kann. Warte mal ein paar Tage. Und wenn Du raus hast wo es dran lag, schreib es mal hier rein. Würd mich ja doch interssieren.
LG Rolf

EDIT: Eine Idee hab ich noch... aber wild geraten und ungeprüft.

In deccelerate(void)
wird per Timer mit
if(getStopwatch1() > 250)
4 mal / sek "gebremst" ... folglich müsste eine Fernbedienung mehr als 4 Impulse leisten?
Da gibst aber noch die
#define ACCELERATE_VALUE 8
#define DECELERATE_VALUE 4
Das würde dann glaube ich auf 2/sec reduzieren um die Waage zu halten und 3/sek damit man beschleunigt?
Ich weis es nicht genau aber da in der Ecke könnte man mal etwas genauer gucken... mach mal aus der
#define ACCELERATE_VALUE 8 eine 12, 16 oder 24 .. je nach dem wie viel Impulse/sek Du reinbekommst.
Oder kommentier mal die deccelerate(void) versuchsweise ganz aus. Dann weisst Du zumindest, das es der richtige Weg ist.

rp6_thom
21.03.2011, 19:58
Hallo Rolf

#define ACCELERATE_VALUE 8 eine 12, 16 oder 24 .. je nach dem wie viel Impulse/sek Du reinbekommst. Das war die Lösung für das Prob.Hab den Wert auf 24 geändert und es fkt.
Danke für den tollen Einfall.

Gruß Tom

fabqu
07.12.2011, 11:29
Hätte auch eine Frage zum RP6 mit TV-Remote:
Wo wird denn bewerkstelligt, dass der RP6 weiß, dass eine Taste auf der Remote losgelassen wurde?
In der großen Switch wird zwar die Stopwatch1 gestartet und in der "deccelerate" wird sie ausgelesen, aber wo und wie genau weiß das Programm denn nun, dass nichts mehr kommt? Wird da irgendwo "rc5data.key_code" zurückgesetzt, oder wie?
Ich bräuchte so etwas wie eine Zurücksetzung von "rc5data.key_code" auf sagen wir "-1", um mehrfach-drücken einbauen zu können.

Danke Euch

oberallgeier
07.12.2011, 13:19
... Wo wird denn bewerkstelligt, dass der RP6 weiß, dass eine Taste auf der Remote losgelassen wurde ...Die Antwort hat ja schon die Fernsteuerung parat: im ersten Byte - Start- und Adressbits - ist das dritte Bit (von Bit1 bis Bit 8 ) das Togglebit. Das wird invertiert jedes Mal, wenn eine Taste gelöst und neu gedrückt wird. Damit ist einfach festzustellen, ob die gleiche Taste festgehalten wird => das Togglebit bleibt dabei gleich.

fabqu
07.12.2011, 14:22
Hmm, danke dir.
Das geht nun auch, aber ich bin grad am verzweifeln:
Wenn ich die Abfragen für RC5-Code, -Adresse und -Togglebit drinnen habe, dann geht auf der Base nahzu nix mehr. Sie führt zwar Befehle aus, aber das Senden der Sensordaten der Base durch die M128 an den PC (Licht L/R, Speed L/R, Bumper L/R vorne/hinten, Objekte L/R vorne/hinten, Motorstrom L/R, Register der Status-LEDs) geht überhaupt nicht mehr. Bestenfalls um etliche Sekunden verzögert...
Streiche ich das Zeug raus, geht wieder alles!!!
Und wenn ich nur alles für die RC5-Adresse rausnehme, geht alles, bis auf Speed L/R, Strom L/R, Bumper vorne und ACS vorne. Das heißt, ACS hinten, Bumper hinten und Helligkeit geht wieder.
Was geht da ab???

Hier mal mein Code ohne RC5-Adr.:
In der Base:


...
#define I2C_REG_LEDS 27
//#define I2C_REG_RC5_ADR 28
#define I2C_REG_RC5_DATA 28
#define I2C_REG_RC5_TOGGLE 29
#define I2C_REG_BUMP_BACK_L 30
#define I2C_REG_BUMP_BACK_R 31
...

I2CTWI_readRegisters[I2C_REG_LEDS] = (uint8_t)(statusLEDs.byte);
//I2CTWI_readRegisters[I2C_REG_RC5_ADR] = (uint8_t)((lastRC5Reception.device)|(lastRC5Recept ion.toggle_bit<<5));
I2CTWI_readRegisters[I2C_REG_RC5_DATA] = (uint8_t)(lastRC5Reception.key_code);
I2CTWI_readRegisters[I2C_REG_RC5_TOGGLE] = (uint8_t)(lastRC5Reception.toggle_bit);
I2CTWI_readRegisters[I2C_REG_BUMP_BACK_L] = (uint8_t)(bumper_back_left);
I2CTWI_readRegisters[I2C_REG_BUMP_BACK_R] = (uint8_t)(bumper_back_right);


In der M128:


...
status_leds_base = messageBuf[24];
//RC5_adr = messageBuf[25];
RC5_data = messageBuf[25];
RC5_toggle = messageBuf[26];
bumper_back_left = messageBuf[27];
bumper_back_right = messageBuf[28];


/*print("RC5-Adr:");
printInteger(RC5_adr);
print("\n");*/

print("RC5-Code:");
printInteger(RC5_data);
print("\n");

print("RC5-Toggle:");
printInteger(RC5_toggle);
print("\n");

print("LEDsBase:");
printInteger(status_leds_base);
print("\n");

print("BumpHL:");
printInteger(bumper_back_left);
print("\n");

print("BumpHR:");
printInteger(bumper_back_right);
print("\n");


Danke Euch