PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : asuro infrarotsteuerung



tape
09.05.2008, 16:29
hallo zusammen!
ich bin relativ neu hier und habe da noch ein wohl kleines verständinsproblem. aus den examples der asurolib2.8 im rc5 test programmcode befindet sich unter anderem:

#define TUNERRWD 0x1021
#define TUNERFWD 0x1020
#define TUNERLEFT 0x1011
#define TUNERRIGHT 0x1010
#define TUNERSTOP 0x1025

die tabelle für die rc5 codierung hab ich mir schon angeschaut unter: https://www.roboternetz.de/wissen/index.php/RC5-Code

aber meine frage jetzt wäre: wie kommt man auf die 0x1021 für TUNERRWD oder die 0x1020 für TUNERFWD?

danke für euer hilfe!
gruß tape

m.a.r.v.i.n
10.05.2008, 21:28
Hallo tape,

in dem Beispiel RC5Test werden die empfangenen RC5 Codes über die serielle Schnittstelle ausgegeben. So kannst du dir im Hyperterminal die empfangenen Codes ansehen und die Defines für TUNERRWD usw. an deine Fernbedienung anpassen. Falls keine Codes empfangen werden, dann sendet deine Fernbedienung wahrscheinlich keine RC5 Codes.


while (1)
{
cmd = ReadRC5();
if (cmd)
{
cmd &= RC5_MASK;
itoa(cmd, text, 16);
SerPrint(text);
SerPrint("\r\n");
...

tape
11.05.2008, 09:28
hallo m.a.r.v.i.n.!
das geht mit meiner fernbedienung, ist eine hauppauge von einer alten tv karte. was ich daran nicht verstanden hab ist was mit: 0x1021 gemeint ist? bzw. eher wie kommt man auf 0x1021? aus was setzt sich das zusammen?

m.a.r.v.i.n
11.05.2008, 10:50
Hallo tape,

die Werte für die RC5 Codes bestehen lediglich aus den 7 Kommando Bits, ohne Adress und Toggle Bits eines 14-Bit RC5 Code.
Siehe Abb. in https://www.roboternetz.de/wissen/index.php/RC5-Code
C0..5 entspricht Bit 0..5
C6 entspricht Bit 12

auf C6 könnte man natürlich auch verzichten. Dises Kommando Bit wurde später zur RC5 Norm dazugenommen, als man mit 64 Codes nicht mehr auskam.

tape
12.05.2008, 15:57
hallo m.a.r.v.i.n.!
erstmal danke für deine antwort, hat mir sehr weitergeholfen und ich konnte jetzt mal die tasten für funktionen des asuro so legen, wie ich das haben wolllte :) . bloß für was das 0x gut sein soll, ist mir noch nicht klar. bloß ohne dieses 0x gehts ja auch nicht.

gruß tape

hai1991
12.05.2008, 16:07
hallo tape

das 0x zeigt dem compiler an, dass jetzt eine hexadezimale zahl folgt

wenn nichts davor steht ist es eine dezimalzahl, und bei 0b folgt ein binäre zahl ( das wird jedoch nicht von alle compiler akzeptiert!)

mr_johnson
12.05.2008, 19:27
Ich misch mich mal mir meinem eigenen Problem ein!

Ich hab mir hier aus dem Forum einen Beispielcode auf den asuro geflasht, und zwar den aus der Test.zip in diesem Thread:
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=13478
Der funktionierte auch wunderbar, aber ich wollte die Tastenbelegung ändern und stoße auf Probleme!

Nachdem ich die alten Codes ersetzt hab mit den Codes für die Tasten die ich verwenden will lief erstmal nichts. Daraufhin hab ich was geändert und es funktioniert, aber die Reaktionszeiten sind ganz fies nach unten gegangen!

Das hier hab ich geändert:
cmd = rxdata; // (rxdata & 0x3F);



#include "asuro.h"
#include <stdlib.h>

#define IRFWD 0x1794
#define IRRWD 0x1795
#define IRLEFT 0x1796
#define IRRIGHT 0x1797
#define IROK 0x17A5
#define IRSTOP 0x1786

#define OFFSET 100
#define STEP 60

int speedLeft, speedRight;
volatile unsigned int rxdata;
volatile unsigned char rxbits;

SIGNAL (SIG_OVERFLOW0)
{
rxbits++;
rxdata<<=1;
rxdata |= (PIND & (1 << PD0)); // liest Datenbits
TCNT0 = 34; // Timer auf 1778µs
if(rxbits==14)
{
TCCR0 &= ~((1 << CS01) | (1 << CS00)); // stoppt Timer
}
}

void Driver(void)
{
unsigned char leftDir= FWD, rightDir= FWD;

leftDir = rightDir = FWD;
if (speedLeft < 0)
leftDir = RWD;
if (speedRight < 0)
rightDir = RWD;

if (speedLeft > 240)
speedLeft = 240;
if (speedLeft < -240)
speedLeft = -240;
if (speedRight > 240)
speedRight = 240;
if (speedRight < -240)
speedRight = -240;

MotorDir(leftDir, rightDir);
MotorSpeed(abs(speedLeft),abs(speedRight));
}

void IRFwd(void)
{
speedRight += STEP;
speedLeft += STEP;
if (abs(speedLeft) < OFFSET)
{
speedRight += STEP;
speedLeft += STEP;
}
FrontLED(ON);
BackLED(OFF,OFF);
}

void IRRwd(void)
{
speedRight -= STEP;
speedLeft -= STEP;
if (abs(speedLeft) < OFFSET)
{
speedRight -= STEP;
speedLeft -= STEP;
}
FrontLED(OFF);
BackLED(ON,ON);
}

void IRLeft(void)
{
FrontLED(OFF);
BackLED(ON,OFF);
if (speedLeft != 0)
{
speedLeft /= 4;
Driver();
Msleep(80);
speedLeft *= 4;
}
else
{
speedLeft = -150;
speedRight = 150;
Driver();
Msleep(80);
speedLeft = speedRight = 0;
}
}

void IRRight(void)
{
FrontLED(OFF);
BackLED(OFF,ON);
if (speedRight != 0)
{
speedRight /= 4;
Driver();
Msleep(80);
speedRight *= 4;
}
else
{
speedLeft = 150;
speedRight = -150;
Driver();
Msleep(80);
speedLeft = speedRight = 0;
}
}

void IRStop(void)
{
speedRight = speedLeft = 0;
FrontLED(OFF);
BackLED(OFF,OFF);
}

int main(void)
{
static unsigned int cmd;

Init();
while (1)
{
rxbits = 1;
rxdata = 0;
TIMSK |= (1 << TOIE0);
// Interrupt scharf
while (PIND & (1 << PD0))
; // warte auf 1. Flanke
TCNT0 = 90;
// Timer auf 1333µs
TCCR0 = (1 << CS01) | (1 << CS00);
// Start Timer
while (rxbits < 14)
; // warte bis alle Bits empfangen

cmd = rxdata; // (rxdata & 0x3F);
// 6 Command-Bits werden verwertet

switch (cmd)
{
case IRRWD:
IRRwd();
break;
case IRFWD:
IRFwd();
break;
case IRLEFT:
IRLeft();
break;
case IRRIGHT:
IRRight();
break;
case IRSTOP:
case IROK:
IRStop();
break;
}
Driver();
}
return 0;
}

hai1991
13.05.2008, 16:48
hallo mr_johnson

wenn ich es richtig verstanden habe willst du doch die tastenbelegung ändern, dafür wären aber die #defines am anfang gedacht. damit wird festgelegt, mit welcher taste du vorwärts, rückwärts, usw. fahren willst.

um andere tasten benutzen zu können musst du diese werte entsprechend ändern

mr_johnson
13.05.2008, 19:51
das habe ich auch getan nur ging danach erstmal nichts!
IRFWD war vorher als 0x21 (ch_up) definiert. erst nachdem ich die änderung in main() vorgenommen habe ging die steuerung wieder, aber die reaktionszeit war danach viel höher!

Jetzt funktioniert es, aber ich bin trotzdem völlig verwirrt!
Ich benutze jetzt den Code aus dem RC5Test Beispiel, habe meine Tasten erfolgreich angepasst und die Latenzprobleme sind auch verschwunden, aber ich wundere mich über die Funktionierenden Codes an sich!

Wenn irgendwer hier eine silberne hauppauge a415-hpg-we-a oder ähnliches hat, würde ich gern wissen was für Codes er benutzt!

Ich habe meine Codes nämlich aus einer lirc config datei und die sind alle nach dem Schema 0x17Yx und wenn ich sie nach 0x10(Y-8)x ändere funktionieren sie.
(Wobei die 0x17xx Codes auch funktionierten, wenn ich im alten Code den ich oben gepostet habe die kleine erwähnte änderung vorgenommen habe).

Alles sehr verwirrend.