- Labornetzteil AliExpress         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 29

Thema: Odometrie / Fernsteuerung - Fragen+Probleme

  1. #11
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo

    Leider kenne ich diese RC5-Erweiterung nicht, aber das hier ist mir aufgefallen:
    Code:
        cmd = ReadRC5(); 
        if (cmd) 
        { 
          cmd &= RC5_MASK; 
          itoa(cmd, text, 16); 
          SerPrint(text); 
          SerPrint("\r\n");
    Der asuro müßte also nach erfolgreichem Empfang eines RC5-Signals den Wert in cmd zum Terminal senden (hexadezimal). Kommt da was an? Wenn nicht könnte es an der Maske liegen, diese Zeile könnte man testweise auskommentieren: "cmd &= RC5_MASK;"

    Außer dem Kommando wird bei RC5 auch ein Gerätecode übertragen (damit man die Geräte auch einzeln bedienen kann ;). Keine Ahnung ob ReadRC5() dies irgendwie beachtet. Möglicherweise muss man das gewünschte Gerät irgendwie definieren (Doko zu rc5.h?)

    Gruß

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  2. #12
    Neuer Benutzer Öfters hier
    Registriert seit
    04.05.2009
    Beiträge
    19
    Das übersteigt leider auch meine Kenntnisse ;(
    Ich bin erst seit ~2 Monaten aktiv am Asuro

    Der asuro müßte also nach erfolgreichem Empfang eines RC5-Signals den Wert in cmd zum Terminal senden (hexadezimal). Kommt da was an?
    Wie kann ich das Prüfen?

    Ich habe mich noch nicht so sehr mit dem Programm selbst beschäftigt, weil ich erst sichergehen wollte, dass es funktioniert, da ich eine schriftliche Arbeit zu dem Thema verfassen muss.

    Code:
    #include "asuro.h"
    
    #define pow1 150 // Langsame Geschwindigkeit
    #define pow2 200 // Schnelle Geschwindigkeit
    #define taste (!(PINC & (1<<PC4))) // Tastenabfrage
    #define keine_taste (PINC & (1<<PC4))
    
    unsigned int count, temp; // Zaehler, IR-Kommando
    unsigned char daten[14], ir_status; // IR-Datenspeicher, IR-Eingangspegel
    
    int main(void) {
    
    Init();
    do{
       temp=0;
       while (PIND & (1 << PD0)) //warten auf die Flanke des Startbits
          {if keine_taste StatusLED(GREEN); else StatusLED(RED); // Tastenspielerei
           if taste BackLED(ON,ON); else BackLED(OFF,OFF);}
       StatusLED(RED); // Alarmstufe ROT: ein Zeichen ist im Anflug
    
       for (count=0; count<14; count++) { // im Gesammten warten wir auf 14 bits
    /*
    lt. Spettel-Diagramm betraegt die Bitlaenge 1,778 ms. Bei 36 Takten pro Millisekunde ergibt das 36*1,778 = 64
    */
       Sleep(48); // Information einlesen nach 3/4 der Bitlaenge
          ir_status=(PIND & (1 << PD0)); // Pegel Speichern
          if (ir_status) daten[count]='1'; else daten[count]='0'; // und merken
          if (ir_status) temp |= (1 << (13-count)); // das MSB(=mostsuefikantbit) zuerst
          while (ir_status == (PIND & (1 << PD0))); // Bit gelesen, warten auf naechste Flanke
       }
       temp=temp/2 & 0xf; // Die Info steht in den Bits 1-4
       StatusLED(YELLOW); // Daten gelesen
       //Msleep(2000); // Zeit um den IR-Transceifer ueber den asuro zu bringen
       SerWrite("\n\r",2);
       SerWrite(daten,14); // Bitmuster zum PC senden
       SerWrite("-",1);
       PrintInt(temp); // erkannte Daten zum PC senden
    
    /* asuro steuern.
       Mit dem 10er-Block der Fernbedienung kann der asuro nun gesteuert werden:
       Alle anderen Tasten stoppen den asuro
    */
    
       switch (temp) {
          case 1: MotorDir(FWD,FWD); MotorSpeed(pow1,pow2); break;
          case 2: MotorDir(FWD,FWD); MotorSpeed(pow2,pow2); break;
          case 3: MotorDir(FWD,FWD); MotorSpeed(pow2,pow1); break;
          case 4: MotorDir(BREAK,FWD); MotorSpeed(0,pow1); break;
          case 5: MotorDir(BREAK,BREAK); MotorSpeed(0,0); break;
          case 6: MotorDir(FWD,BREAK); MotorSpeed(pow1,0); break;
          case 7: MotorDir(RWD,BREAK); MotorSpeed(pow1,0); break;
          case 8: MotorDir(RWD,RWD); MotorSpeed(pow1,pow1); break;
          case 9: MotorDir(BREAK,RWD); MotorSpeed(0,pow1); break;
          default: MotorDir(BREAK,BREAK); MotorSpeed(0,0); break;
       }
       StatusLED(GREEN); //endlos
       //Msleep(1000);
    
    }while (1);
    return 0;
    }
    Das ist ja das Programm aus deinem Beitrag in einem anderen Thread, stimmt es, dass es bei nahezu jeder Philips-Fernbedienung funktioniert?

    Dann könnte ich ja auch das verwenden, meine Universal ist von Philps
    und kann auf mehrere Philips Fernseher eingestellt werden.


    Vielleicht meldet sich ja noch ein Experte, der sich schon mit der RC5-Erweiterung beschäftigt hat.

    *Edit*
    Das mit der Odometrie hat sich erledigt, habs noch halbwegs hinbekommen, für den 2. Platz bei dem Wettbewerb in der Schule hat es gereicht


    Gruß
    Seuche

  3. #13
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Wie kann ich das Prüfen?
    Der Ablauf sollte so sein: Die Fernbedienung sendet, asuro empfängt, asuro sendet cmd an Terminal (dein PC mit Terminalprogramm), du schaust auf Terminal....

    Ob mein Programm wirklich alle Philips-Fernbedienungen versteht kann nicht natürlich nicht sagen. Aber es funktioniert zufriedenstellend, ist selbstgebastelt und knackig kurz. Es wäre wohl besser wenn du mich bei deiner schriftlichen Prüfung nicht erwähnst ;)

    Das Programm funktioniert nur mit einer 36kHz-Library! Für die orginale CD-Lib muss man hier eine 96 eintragen:

    Sleep(96); // Information einlesen nach 3/4 der Bitlaenge

    ...für den 2. Platz bei dem Wettbewerb in der Schule hat es gereicht
    Glückwunsch. Dann kannst du uns ja mal dein Progamm zeigen.

    Gruß

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  4. #14
    Neuer Benutzer Öfters hier
    Registriert seit
    04.05.2009
    Beiträge
    19
    Ich werd das Programm von dir einfach mal ausprobieren!

    Mein Programm war eine von mir modifizierte Version des Geradeaus-Programms aus "Mehr Spaß mit Asuro II":

    Code:
    // *******************************************
    // * Odometrie für ASURO                     *
    // * Fährt exakt geradeaus                   *
    // *                                         *
    // *                                         *
    // * (c) 2007 Robin Gruber                   *
    // * Details zum Code in:                    *
    // * "Mehr Spaß mit ASURO, Band II"          *
    // *******************************************
    
    #include "asuro.h"
    
    // Schwellwert fr die Hell/Dunkel-Unterscheidung
    // Für meinen Asuro angepasster Wert
    #define TRIGGERLEVEL 525
    #define HYSTERESIS 50
    #define LOW 0
    #define HIGH 1
    
    int main(void)
    {
        unsigned int data[2];
        signed int status[2]={0,0};
        signed int difference=0;
        Init();
        MotorDir(FWD, FWD);
        while(1) {
            // Helligkeitswerte der Lichtschranken auslesen
            OdometrieData(data);
            // Wechsel linker Sensor von niedrig auf hoch?
            if ((status[0]==LOW) && (data[0]>TRIGGERLEVEL+HYSTERESIS)) {
                status[0]=HIGH;
                difference++;
            }
            // Wechsel linker Sensor von hoch auf niedrig?
            if ((status[0]==HIGH) && (data[0]<TRIGGERLEVEL-HYSTERESIS)) {
                status[0]=LOW;
                difference++;
            }
            // Wechsel rechter Sensor von niedrig auf hoch?
            if ((status[1]==LOW) && (data[1]>TRIGGERLEVEL+HYSTERESIS)) {
                status[1]=HIGH;
                difference--;
            }
            // Wechsel rechter Sensor von hoch auf niedrig?
            if ((status[1]==HIGH) && (data[1]<TRIGGERLEVEL-HYSTERESIS)) {
                status[1]=LOW;
                difference--;
            }        
            // Z?ldifferenz passend auf die Motoren verteilen
            if (difference>0) MotorSpeed(150-difference,150);
            else MotorSpeed(150,150+difference);
        }
        return 0;
    }
    Natürlich wirst du erwähnt in der Danksagung

    Wir müssen nicht alles selbst machen, das wäre auch zu viel verlangt, da wir nur sehr kurz und oberflächlich C-Programmierung in der Schule (12. Klasse, allgemeinbildendes Gymnasium) hatten und auch, bis auf im Physikunterricht, keine Elektronik bzw. Mechanikkenntnisse haben.

    Es reicht, wenn wir schon ausprobierte Themen von anderen, nachbauen und gegebenfalls anpassen oder erweitern.

    Der Inhalt der schriftlichen Arbeit ist auch eher theoretischer Natur, ich werde hauptsächlich über Dioden, Infrarotlicht, und Datenübertragung schreiben, die Fernbedienung ist dann aber die direkte Verknüpfung zum Asuro.

    Der Ablauf sollte so sein: Die Fernbedienung sendet, asuro empfängt, asuro sendet cmd an Terminal (dein PC mit Terminalprogramm), du schaust auf Terminal....
    Ich versteh, wie du das meinst, aber ich hab keine Ahnung, wie ich das programmieren soll

    Danke für deine Bemühungen mir zu helfen!


    Gruß
    Seuche

  5. #15
    Neuer Benutzer Öfters hier
    Registriert seit
    04.05.2009
    Beiträge
    19
    Hey spitze, dein Programm funktioniert und sogar mit allen Fernbedienungen die ich zur Hand hatte!

    Die Reichweite ist phänomenal, bis zu 3m und trotzdem noch perfekte Übertragung, sehr gut durch das Leuchten der StatusLED zu erkennen.

    Mein einziges Problem ist noch, dass er bisher nur eine Rechtskurve fährt, d.h. jede Taste auf der Fernbedienung (auch andere als 1-9) stoppt (fast immer) durch einmaliges Drücken und durch Draufbleiben fährt er rechtsrum im Kreis (rechter Motor steht, linker fährt - manchmal ein bisschen langsamer als sonst).

    Das heißt doch, dass er die verschiedenen Tasten noch nicht richtig unterscheiden kann, oder?

    Hab ich was übersehen? Ist das normal so?
    Oder soll ich mal die möglichen Philips-Codes durchprobieren, die es im "Code-Heft" meiner Universalfernbedienung gibt?

    Dein Programm ist wirklich klasse =D> um längen besser als das in der AsuroWiki, wenn das mit den verschiedenen Befehlen noch klappt, wäre es perfekt!

    *Edit*
    Mein rechter Motor war nur verklemmt, jetzt fährt er fast immer geradeaus und dann manchmal Vorwärtskurven, manchmal Rückwärtskurven, wirklich steuern kann ich es noch nicht, stoppen kann ich ihn immer noch über kurzes Drücken irgendeiner Taste.
    Wenn er an die Wand fährt, leuchten die BackLEDs nur das Rückwärtsfahren hab ich noch garnicht gefunden.
    Klar erkennen tut er die einzelnen Tasten, bzw. Befehle also trotzdem nicht, aber ist trotzdem schonmal echt super!


    Gruß
    Seuche

  6. #16
    Neuer Benutzer Öfters hier
    Registriert seit
    04.05.2009
    Beiträge
    19
    So, ich hab jetzt mal alle Philips-Codes meiner Fernbedienung durchprobiert.

    Der Asuro reagiert auf fast alle, aber auf keinen so, wie er es sollte sondern willkührlich auf die selbe Taste im einen Moment anders als im anderen!

    Hat jemand eine Idee, woran das liegt?
    Ich benutze eine Universal-Fernbedienung von Tevion (MD 81035).

    War das bei dir auch so, radbruch, oder konntest du ihn, wie gewollt, mit Ziffer 1-9 steuern?

    Hoffe ihr könnt mir helfen.
    Gruß
    Seuche

  7. #17
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Bei mir funktionierte das richtig mit den Ziffern.

    Ich versteh, wie du das meinst, aber ich hab keine Ahnung, wie ich das programmieren soll
    Ich denke, du verstehst es nicht. Die Funktionen sind schon eingebaut, du must nur das Terminal starten und, wie beim Selbsttest, zuschauen was der asuro meldet. Hier sendet der asuro was er empfangen hat:

    Code:
       temp=temp/2 & 0xf; // Die Info steht in den Bits 1-4 
       StatusLED(YELLOW); // Daten gelesen 
       //Msleep(2000); // Zeit um den IR-Transceiver ueber den asuro zu bringen 
       SerWrite("\n\r",2); 
       SerWrite(daten,14); // Bitmuster zum PC senden 
       SerWrite("-",1); 
       PrintInt(temp); // erkannte Daten zum PC senden
    Die StatusLED leuchtet kurz gelb wenn der asuro senden will. Zuerst kommt das Bitmuster und dann das Kommando.

    auf die selbe Taste im einen Moment anders als im anderen!
    Die Tasten senden beim Drücken, Draufbleiben oder Loslassen jeweils einen anderen Code. Hast du die verschiedenen Versionen der asuro-Libraries beachtet (wie oben beschrieben)?

    Noch eine Anmerkung zu deinem Geradeausfahrprogramm: Ich weiß ja nicht wie groß dein Anteil daran ist, aber es ist ein gutes Beispiel für die Anwendung der Odometrie beim asuro.

    Interesanterweise enthält dein Quellcode denselben Umlautebug den ich vor Urzeiten auch schon mal entdeckte. Ich hatte deshalb eine zeitlang Umlaute in den Kommentaren vermieden. Irgendwie hat sich das aber von selbst geheilt, heute verwende ich auch wieder Umlaute ohne Probleme. Vielleicht ist das ein Problem des Editors der Umlaute nicht im richtigen Code speichert? Ich verwende nicht das Notepad sondern KamAVR. [https://www.roboternetz.de/phpBB2/ze...ag.php?t=29123]

    Gruß

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  8. #18
    Neuer Benutzer Öfters hier
    Registriert seit
    04.05.2009
    Beiträge
    19
    Zitat Zitat von radbruch
    Ich denke, du verstehst es nicht. Die Funktionen sind schon eingebaut, du must nur das Terminal starten und, wie beim Selbsttest, zuschauen was der asuro meldet. Hier sendet der asuro was er empfangen hat:

    Code:
       temp=temp/2 & 0xf; // Die Info steht in den Bits 1-4 
       StatusLED(YELLOW); // Daten gelesen 
       //Msleep(2000); // Zeit um den IR-Transceiver ueber den asuro zu bringen 
       SerWrite("\n\r",2); 
       SerWrite(daten,14); // Bitmuster zum PC senden 
       SerWrite("-",1); 
       PrintInt(temp); // erkannte Daten zum PC senden
    Die StatusLED leuchtet kurz gelb wenn der asuro senden will. Zuerst kommt das Bitmuster und dann das Kommando.
    Das hab ich gemacht, hier ist das was im Hyperterminal ankommt:

    Taste 1 (einzelnes Drücken 20x):
    Code:
    1‚Š‚‚‚‚ŠŠ‚‚‚‚‚‚j‚þŸL˜˜00010000001-01j‚‚‚‚‚‚ŠŠ‚‚‚‚‚‚j‚þϘ000001000000-01 ‚Š‚‚‚‚
    ŠŠ‚‚‚‚‚‚j‚þŸ˜000001000000-0ƘÄb1       j‚‚‚‚‚‚ŠŠ‚‚‚‚‚‚j‚þþL˜˜00010000001-0ÆŸ
    Á‚‚‚‚‚ŠŠ‚‚‚‚‚‚j‚þŸLœ˜00010000001-01>    1‚‚‚‚‚‚ŠŠ‚‚‚‚‚‚ŸL˜˜00010100001-015‚‚‚‚
    ‚‚ŠŠ‚‚‚‚‚‚j‚þŸ˜°010-1˜Æb1      j‚‚‚‚‚‚ŠŠ‚‚‚‚‚‚j‚þž1j‚‚‚‚‚Š‚‚‚‚Š‚‚j’þÄž
    00010011010000-815‚‚‚‚‚‚ŠŠ‚‚‚‚‚‚j‚þ00000001000000-01
    Taste 1 (gedrückt für 10sec):
    Code:
    00000001000000-0Ï5Á‚‚Š‚‚ŠŠ‚‚‚‚‚‚j‚þŸ5‚‚‚‚‚‚‚Š‚‚‚‚‚‚j‚þj‚‚‚‚‚‚‚Š‚‚‚‚‚‚j‚þ‚‚‚‚Š
    ‚Š‚Š‚‚‚j¢þÏR`‚‚‚‚‚Š‚‚‚‚‚‚‚j‚þj‚‚‚‚‚‚‚Š‚‚‚‚‚‚j‚þ%‚‚‚‚‚‚‚Š‚‚‚‚‚‚j‚þÏ%‚‚‚‚‚‚‚Š‚‚‚
    ‚‚‚j‚þž  ‚‚‚‚‚‚‚Š‚‚‚‚‚‚j‚þÏ      ‚‚‚‚‚‚‚Š‚‚‚‚‚‚j‚þÁ€‚‚‚‚‚Š‚‚‚‚‚‚j‚þÏ   ‚‚‚‚‚‚‚
    Š‚‚‚‚‚‚j‚þ    h‚‚‚‚‚‚‚Š‚‚‚‚‚‚j‚þŸ…00000010000000-0j‚‚‚‚‚‚‚Š‚‚‚‚‚‚j‚þž      `
    ‚‚‚‚‚‚‚Š‚‚‚‚‚‚j‚þ ‚‚‚‚‚‚‚Š‚‚‚‚‚‚j‚þžž0010000001-0Á‚‚‚‚‚‚Š‚‚‚‚‚‚j‚þŸ       $
    ‚‚‚‚‚‚‚Š‚‚‚‚‚‚j‚þŸ ‚‚‚‚‚‚‚Š‚‚‚‚‚‚j‚þŸ  =‚‚‚‚‚‚‚Š‚‚‚‚‚‚j‚þŸ     j‚‚‚‚‚‚‚Š‚‚‚‚‚‚j
    ‚þž5Á‚‚‚‚‚‚Š‚‚‚‚‚‚j‚þŸ        >‚‚‚‚‚‚‚Š‚‚‚‚‚‚j‚þ      ‚‚‚‚‚‚‚Š‚‚‚‚‚‚j‚þj‚‚‚‚‚
    ‚‚Š‚‚‚‚‚‚j‚þ4‚‚‚‚‚‚‚Š‚‚‚‚‚‚j‚þ        0‚‚‚‚‚‚‚Š‚‚‚‚‚‚j‚þŸ ‚‚‚‚‚‚‚Š‚‚‚‚‚‚j‚þj‚
    ‚‚‚‚‚‚Š‚‚‚‚‚‚j‚þŸ       (‚‚‚‚‚‚‚Š‚‚‚‚‚‚j‚þ
    Die Tasten senden beim Drücken, Draufbleiben oder Loslassen jeweils einen anderen Code.
    Meistens fährt er nur durch kurzes Draufbleiben, einzelnes Drücken zeigt zwar ein leuchten der LED aber es tut sich nichts, nur wenn er fährt, wird er dann zumeist gestoppt.

    Hast du die verschiedenen Versionen der asuro-Libraries beachtet (wie oben beschrieben)?
    Das Programm funktioniert nur mit einer 36kHz-Library! Für die orginale CD-Lib muss man hier eine 96 eintragen:

    Sleep(96); // Information einlesen nach 3/4 der Bitlaenge
    Wenn du das meinst, die Änderung habe ich vorgenommen, ich benutze die Asuro libv271, stimmt der Wert (Sleep(96) dann so?
    Soll ich es mal mit der 36kHz-Library versuchen?

    Noch eine Anmerkung zu deinem Geradeausfahrprogramm: Ich weiß ja nicht wie groß dein Anteil daran ist, aber es ist ein gutes Beispiel für die Anwendung der Odometrie beim asuro.
    Mein Anteil ist nicht so groß, ich habe nur den TRIGGERLEVEL auf meinen Asuro angepasst und die Geschwindigkeit auf einen für mich passenden Wert geändert.

    Interesanterweise enthält dein Quellcode denselben Umlautebug den ich vor Urzeiten auch schon mal entdeckte. Ich hatte deshalb eine zeitlang Umlaute in den Kommentaren vermieden. Irgendwie hat sich das aber von selbst geheilt, heute verwende ich auch wieder Umlaute ohne Probleme. Vielleicht ist das ein Problem des Editors der Umlaute nicht im richtigen Code speichert? Ich verwende nicht das Notepad sondern KamAVR. [https://www.roboternetz.de/phpBB2/ze...ag.php?t=29123]
    Meinst du im Geradeaus-Programm?

  9. #19
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Bitte entschuldige wenn ich mich ungenau ausgedrückt habe. Schau mal hier: "þŸL˜˜00010000001-01j‚‚‚‚‚‚" Links sind die Bits, rechts ddas erkannte Kommando. Es sind 11-14 Bits, es sollten aber immer 14 sein, das Kommando würde dann in Bit 1-4 stehen. Offensichtlich stimmt dein Timeing nicht, die Lib 2.71 ist eine 36kHz-Lib also ist 96 falsch!

    Gruß

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  10. #20
    Neuer Benutzer Öfters hier
    Registriert seit
    04.05.2009
    Beiträge
    19
    Zitat Zitat von radbruch
    Bitte entschuldige wenn ich mich ungenau ausgedrückt habe. Schau mal hier: "þŸL˜˜00010000001-01j‚‚‚‚‚‚" Links sind die Bits, rechts ddas erkannte Kommando. Es sind 11-14 Bits, es sollten aber immer 14 sein, das Kommando würde dann in Bit 1-4 stehen. Offensichtlich stimmt dein Timeing nicht, die Lib 2.71 ist eine 36kHz-Lib also ist 96 falsch!
    Super, ich habe es jetzt wieder auf Sleep48 geändert und jetzt funktioniert es perfekt. Ein großes Lob für dein Programm, es ist einfach spitzenmäßig!

    Damit wäre mein Problem eigentlich geklärt.
    Ich melde mich die Tage nochmal, falls ich Probleme beim Verständnis rund um das Programm habe, ich hoffe das ist okay.

    Ein großes Danke, radbruch, das hätte ich ohne dich bestimmt nicht hinbekommen.


    Gruß
    Seuche

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Berechtigungen

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

12V Akku bauen