- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 1 bis 8 von 8

Thema: frage zur rc5.c

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    22.03.2008
    Beiträge
    9

    frage zur rc5.c

    Anzeige

    LiFePo4 Akku selber bauen - Video
    hallo zusammen!
    warscheinlich ist es total einfach, aber ich komme partout nicht darauf. in der asuro lib gibt es ja den rc5 test, und in der rc5.c datei kommt:

    #define OFFSET 63
    #define STEP 10

    ich habe den offset wert verändert (anstatt der hexzahl 63 eingefügt) doch ich komme nicht dahinter, für was ich das überhaupt richtig brauche. da ich auch nicht so sehr in c-programmierung bewandert bin kann ich mir das auch nicht herleiten
    danke für antworten!

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    03.07.2007
    Beiträge
    349
    Welche Version verwendest du?
    Ich hab gerade in meiner asurolib nachgeschaut und dort finde ich keine derartigen Makros!?

    Gefühlsmäßig würde ich halt sagen, dass es sich um folgendes handelt, aber ich kann in dem Fall wirklich nur raten weil ich den Sourcecode dazu nicht kenne:
    OFFSET: Die Zeit die man nach dem ersten empfangenen Signal warten muss, bis die ersten Nutzdaten kommen.
    STEP: Das wird halt die Abtastrate sein, also wie oft der IR Empfänger abgefragt wird.

    Wenn du dich ein bisschen einlesen willst zum Thema RC5 Code, dann schau auf folgende Seite:
    http://www.sbprojects.com/knowledge/ir/ir.htm
    Grüße,
    Harri

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    22.03.2008
    Beiträge
    9
    ich verwende die asurolib v280rc1 und im ordner examples kommt der ordner rc5 test. darin befindet sich dann die test.c datei.
    Code:
    #include "asuro.h"
    #include "rc5.h"
    #include <stdlib.h>
    
    #define DIARWD   0x1008
    #define DIAFWD   0x1002
    #define DIALEFT  0x1004
    #define DIARIGHT 0x1006
    #define DIASTOP  0x1029
    
    #define TUNERRWD   0x1021
    #define TUNERFWD   0x1020
    #define TUNERLEFT  0x1011
    #define TUNERRIGHT 0x1010
    #define TUNERSTOP  0x1025
    
    #define OFFSET	0x3F
    #define STEP	5
    
    int speedLeft,speedRight;
    
    void IRFwd(void)
    {
      speedRight += STEP;
      speedLeft  += STEP;
      if (speedLeft < 0 && speedLeft >= -OFFSET) speedLeft = 1;
      if (speedRight < 0 && speedRight >= -OFFSET) speedRight = 1;
      FrontLED(ON);
      BackLED(OFF,OFF);
    }
    
    void IRRwd(void)
    {
      speedRight -= STEP;
      speedLeft  -= STEP;
      if (speedRight > 0 && speedRight <= OFFSET)  speedRight = -1;
      if (speedLeft > 0 && speedLeft <= OFFSET)  speedLeft = -1;
      FrontLED(OFF);
      BackLED(ON,ON);
    }
    
    void IRLeft (void)
    {
      speedLeft  -= STEP;
      if (speedLeft > 0 && speedLeft <= OFFSET) speedLeft = -1;
      speedRight += STEP;
      if (speedRight < 0 && speedRight >= -OFFSET) speedRight = 1;
      FrontLED(OFF);
      BackLED(ON,OFF);
    }
    
    void IRRight (void)
    {
      speedLeft  += STEP;
      if (speedLeft < 0 && speedLeft >= -OFFSET) speedLeft = 1;
      speedRight -= STEP;
      if (speedRight > 0 && speedRight <= OFFSET) speedRight = -1;
      FrontLED(OFF);
      BackLED(OFF,ON);
    }
    
    
    void IRStop(void)
    {
      speedRight = speedLeft = 0;
      FrontLED(OFF);
      BackLED(OFF,OFF);
    }
    
    int main(void)
    {
    
      static unsigned int cmd;
      unsigned char leftDir = FWD, rightDir = FWD;
      char text[7];
    
      Init();
      InitRC5();
    
      SerPrint("RC5 Test\r\n");
      while (1)
      {
        cmd = ReadRC5();
        if (cmd)
        {
          cmd &= RC5_MASK;
          itoa(cmd, text, 16);
          SerPrint(text);
          SerPrint("\r\n");
    
          switch (cmd)
          {
          case TUNERRWD :
          case DIARWD :
            SerPrint("rwd\r\n");
            IRRwd();
            break;
          case TUNERFWD :
          case DIAFWD :
            SerPrint("fwd\r\n");
            IRFwd();
            break;
          case TUNERLEFT :
          case DIALEFT:
            SerPrint("lft\r\n");
            IRLeft();
            break;
          case TUNERRIGHT :
          case DIARIGHT:
            SerPrint("rgt\r\n");
            IRRight();
            break;
          case TUNERSTOP :
          case DIASTOP :
            SerPrint("stp\r\n");
            IRStop();
            break;
          }
        }
        if (speedLeft > 0 && speedLeft <  OFFSET) speedLeft += OFFSET;
        if (speedLeft < 0 && speedLeft > -OFFSET) speedLeft -= OFFSET;
        if (speedRight > 0 && speedRight <  OFFSET) speedRight += OFFSET;
        if (speedRight < 0 && speedRight > -OFFSET) speedRight -= OFFSET;
    
        leftDir = rightDir = FWD;
        if (speedLeft < 0)  leftDir = RWD;
        if (speedRight < 0) rightDir = RWD;
    
        if (speedLeft >   255) speedLeft  =  255;
        if (speedLeft <  -255) speedLeft  = -255;
        if (speedRight >  255) speedRight =  255;
        if (speedRight < -255) speedRight = -255;
    
        MotorDir(leftDir,rightDir);
        MotorSpeed(abs(speedLeft),abs(speedRight));
        Msleep(100);
      }
      return 0;
    }

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    03.07.2007
    Beiträge
    349
    Achso, damit werden die Motoren angesteuert(speedLeft und speedRight werden damit beeinflusst!), das hat nix mit dem IR Signal selber zu tun!
    Grüße,
    Harri

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    22.03.2008
    Beiträge
    9
    das ist mir soweit auch klar, aber warum bruache ich überhaupt dieses offset? was hat das für einen sinn? wenn ich die motorengeschwindigkeit immer mit step erhöhe oder erniedrige, sollte das doch auch funktionieren...

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    03.07.2007
    Beiträge
    349
    Soweit ich das jetzt gesehen habe ist der Offset dazu da, dass du den "toten Bereich" überspringst. Die Motoren drehen ja erst ab einer bestimmten PWM Zahl, z.B. 80. Du müsstest dann ja 80/5=16mal drücken bis Asuro beschleunigt. Mittels Offset springst du gleich in die Nähe des brauchbaren Bereiches, der bei jedem Asuro anders ist und erst von dir ermittelt werden muss.
    Grüße,
    Harri

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    22.03.2008
    Beiträge
    9
    danke für die antwort! das ist mir noch gar nicht aufgefallen, aber du hast recht ich probiere ja gerade den code zu verstehen, aber in den letzten zeilen ist mir noch etwas unklar, und zwar das"abs" vor (speedLeft) und (speedRight). was für einen zweck erfüllt das? ich habe es weggelassen, dadurch gab es bei dem wechsel von der vorwärts in die rückwärtsfahrt eine drastische zunahme der motorengeschwindigkeit. nachdem ich es wieder eingefügt habe, war dies nicht mehr der fall. was soll mir das jetzt sagen, außer das ich es brauche?

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

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    03.07.2007
    Beiträge
    349
    abs gibt den Absolutwert einer Zahl zurück, also auf gut deutsch: ein eventuell vorhandenes Minuszeichen verschwindet.
    abs(5)==5
    abs(-3)==3

    Die Fahrtrichtung wird durch MotorDir bestimmt, daher brauch man in MotorSpeed nur den Absolutwert der Geschw. angeben!
    Grüße,
    Harri

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress