Trouver code C d'une télécommande

Support pour le kit de communication infra rouge (IR)

Re: Trouver code C d'une télécommande

Message non lude blepharocyte » Ven 22 Fév 2013 00:31

J'avais aussi eu la même réflexion, comme quoi je suis pas hyper nul mais juste nul ! :roll:
Voila ce que ça me donne avec le dernier code (avec petite modification car tu avais mis en print "p" puis encore "p".. ;) ):

Code: Tout sélectionner
0100000000000100000000010000PREAMBULE RECU<>ATTENDU67125264 <> 16400>> Pas de touche correspondante
0100000000000100000000010000PREAMBULE RECU<>ATTENDU67125264 <> 16400>> Pas de touche correspondante
0100000000000100000000010000PREAMBULE RECU<>ATTENDU67125264 <> 16400>> Pas de touche correspondante
0100000000000100000000010000PREAMBULE RECU<>ATTENDU67125264 <> 16400>> Pas de touche correspondante
0100000000000100000000010000PREAMBULE RECU<>ATTENDU67125264 <> 16400>> Pas de touche correspondante
0100000000000100000000010000PREAMBULE RECU<>ATTENDU67125264 <> 16400>> Pas de touche correspondante

Le premier nombre c'est PR, le deuxieme c'est P.
On voit bien que PR <> P. Il y a un facteur de 4093 approximativement (presque 4096...). Je vois pas pourquoi. Pour moi c'est la variable P je vois pas d'autre erreur.
Le format Decimal de PR est bon. Par contre celui de P ne l'est pas.
J'ai cherché sur google et j'ai lu des cours PDF sur le langage binaire en environnement C mais en vain..
C'est con il n'y a que ça nous touchons au but ! :o

PS: Voici mon code, j'ai ajouté des touches.
Code: Tout sélectionner
 /* Librairie de lecture IR */
        #include <IRremote.h>
        /* PIN signal recepteur IR */
        int RECV_PIN = 11;
        int i;

        const unsigned long P = (((B01000000) * 256 | B00000100 ) * 256 | B00000001) * 16 | B0000; // préambule commun de 28 bits:
        const unsigned int T[10] = {B00000000,  // les 8 derniers bits sont les différentiateurs
                                   B00001000,
                                   B00000100,
                                   B00001100,
                                   B00000010,
                                   B00001010,
                                   B00000110,
                                   B00001110,
                                   B00000001,
                                   B00001001};
        char* Touche[10] = {"1","2","3","4","5","6","7","8","9","0"};

        IRrecv irrecv(RECV_PIN);

        decode_results results;

        void setup()
        {
          Serial.begin(9600);
          irrecv.enableIRIn(); // Démarre les interruptions de surveillance du capteur IR
        }

        void dump(decode_results *results) {
          int count = results->rawlen -1;
          unsigned long PR = 0;
          unsigned int TR = 0;
          int i=0;

          // Le signal s'initialise
          if ( (results->rawbuf[1] < 77) and (results->rawbuf[1] > 63) )
          {}
          else
          { Serial.print("-PAS BON 1:");Serial.print(results->rawbuf[i], DEC); Serial.print("-");goto RATE;};

          if ( (results->rawbuf[2] < 39) and (results->rawbuf[2] > 31) )
          {}
          else
          { Serial.print("-PAS BON 2:");Serial.print(results->rawbuf[i], DEC); Serial.print("-");goto RATE;};

          if ( (results->rawbuf[3] < 12) and (results->rawbuf[2] > 7) )
          {}
          else
          { Serial.print("-PAS BON 3:");Serial.print(results->rawbuf[i], DEC); Serial.print("-");goto RATE;};
         
          // Réception du préambule de 28 bits
          for (i = 4; i < 60; i++)
            {
            if ((i % 2) == 0)
                {
                if ( (results->rawbuf[i] < 12) and (results->rawbuf[i] > 7) )
                  { Serial.print("0"); PR=PR<<1; }
                  else
                  {
                    if ( (results->rawbuf[i] < 29) and (results->rawbuf[i] > 23) )
                    { Serial.print("1"); PR=PR<<1; PR++; }
                    else
                    {
                      Serial.print("-PAS BON "); Serial.print(i, DEC); Serial.print(":");Serial.print(results->rawbuf[i], DEC); Serial.print("-");goto RATE;
                    };
                  };
                }
            else
              {
              if ( (results->rawbuf[i] < 12) and (results->rawbuf[i] > 7) )
                {
                }
            else
              { Serial.print("-PAS BON "); Serial.print(i, DEC); Serial.print(":");Serial.print(results->rawbuf[i], DEC); Serial.print("-");goto RATE;
              }
            };
          }; // FIN RECEPTION PREAMBULE         
          if (PR == P)
            {
              for (i = 60; i < count; i++) // La fin du code
              {
              if ((i % 2) == 0)
                  {
                  if ( (results->rawbuf[i] < 12) and (results->rawbuf[i] > 7) )
                    { Serial.print("0"); TR=TR<<1; }
                    else
                    {
                      if ( (results->rawbuf[i] < 29) and (results->rawbuf[i] > 23) )
                      { Serial.print("1"); TR=TR<<1; TR++; }
                      else
                      {
                        Serial.print("-PAS BON "); Serial.print(i, DEC); Serial.print(":");Serial.print(results->rawbuf[i], DEC); Serial.print("-");goto RATE;
                      };
                    };
                  }
              else
                {
                if ( (results->rawbuf[i] < 12) and (results->rawbuf[i] > 7) )
                  {
                  }
                else
                  { Serial.print("-PAS BON "); Serial.print(i, DEC); Serial.print(":");Serial.print(results->rawbuf[i], DEC); Serial.print("-");goto RATE;
                  };
                };
              };
              for (i=0; i<10; i++)
                {
                if (TR==T[i])
                  { Serial.print(">> TOUCHE "); Serial.print(Touche[i]); goto RATE;
                  };
                };
              }
            else
              { Serial.print("PREAMBULE RECU<>ATTENDU");Serial.print(PR,DEC);Serial.print("   ");Serial.print(P,DEC);};
          Serial.print(">> Pas de touche correspondante");
          RATE:
          Serial.println("");
        }


        void loop() {
          if (irrecv.decode(&results)) {
            dump(&results);
            irrecv.resume();
          };
        }
blepharocyte
 
Messages: 18
Inscription: Ven 15 Fév 2013 00:31

Re: Trouver code C d'une télécommande

Message non lude blepharocyte » Dim 24 Fév 2013 16:04

Personne ? :oops:
blepharocyte
 
Messages: 18
Inscription: Ven 15 Fév 2013 00:31

Re: Trouver code C d'une télécommande

Message non lude Sarish » Lun 25 Fév 2013 16:15

Bonjour,
Lisant beaucoup le forum, il y a quelques temps je suis tombé sur un sujet ou l'auteur voulais récupérer le code émis par une télécommande RF en utilisant le même principe qu'on lui a proposé, je te soumet cela :

ir.PNG
ir.PNG (11.38 Kio) Vu 1949 fois


Le principe :
On Appuie sur une touche de la télécommande
la photorésistance (ou le capteur IR) va faire basculer l'ampli, ce qui te permet d'avoir un beau carré bien propre.
et en sortie tu a un jack que tu branche a l'entrée audio de ton pc, et avec un logiciel de capture sonore (exemple : audacity) tu analyse ta trame.
Je ne sait pas du tout si cela fonctionne, mais je ne voit pas en quoi ça ne fonctionnerait pas 8-)
Sur ceux bon courage et si tu test la méthode que je te propose je serais curieux de voir ce que ça donne :D .
Sarish
 
Messages: 33
Inscription: Lun 9 Juil 2012 10:22

Re: Trouver code C d'une télécommande

Message non lude Sarish » Lun 25 Fév 2013 16:20

blepharocyte a écrit:
Code: Tout sélectionner
0100000000000100000000010000PREAMBULE RECU<>ATTENDU67125264 <> 16400>> Pas de touche correspondante



Juste une piste de recherche, 0100000000000100000000010000 (en binaire) = 67125264 en décimal donc pour moi ton code fonctionne (a une conversion prêt)
Sarish
 
Messages: 33
Inscription: Lun 9 Juil 2012 10:22

Re: Trouver code C d'une télécommande

Message non lude blepharocyte » Lun 25 Fév 2013 23:25

Oui exacte, il trouve bien le bon code binaire, mais l'instruction if PR == P ne fonctionne pas. c'est pour cela que je pense que la constante P est mal écrite, ne sachant pas l'écrire j'aimerais de l'aide.

J'ai essayé aussi de changer la constante P par la valeur décimale du code binaire de la télécommande, et après transformation du code binaire recu en valeur hexadécimal l'instruction if ne fonctionne pas non plus. Mais la je pense que c'est de ma faute je ne sais certainement pas encore bien comprendre le language C.
blepharocyte
 
Messages: 18
Inscription: Ven 15 Fév 2013 00:31

Re: Trouver code C d'une télécommande

Message non lude Bemolu » Mar 26 Fév 2013 22:30

blepharocyte a écrit:Oui exacte, il trouve bien le bon code binaire, mais l'instruction if PR == P ne fonctionne pas. c'est pour cela que je pense que la constante P est mal écrite, ne sachant pas l'écrire j'aimerais de l'aide.
C.

Pourtant tout se passe bien, notre code détecte tous les bits. On a:
0100000000000100000000010000 = 67125264 = P
0000000000000100000000010000 = 16400 = PR
Ca fait comme si on perdait les premiers bits de PR - comme s'ils n'étaient pas assez longs en mémoire. Pourtant, les unsigned long font bien 32 bits, donc on a encore de la marge. Le problème dépassant mes compétences, je te propose une solution pas universelle mais qui devrait permettre de contourner la difficulté (on vire le premier '1'):
Peux-tu changer la définition de P:
Code: Tout sélectionner
const unsigned long P = (((B01000000) * 256 | B00000100 ) * 256 | B00000001) * 16 | B0000; // préambule commun de 28 bits:

Par
Code: Tout sélectionner
const unsigned long P = (((B00000000) * 256 | B00000100 ) * 256 | B00000001) * 16 | B0000; // préambule commun de 28 bits:
Bemolu
 
Messages: 63
Inscription: Mer 8 Fév 2012 21:19

Re: Trouver code C d'une télécommande

Message non lude blepharocyte » Mer 27 Fév 2013 14:48

A c'est pas idiot j'y avais pas pensé, j'avais pas convertit 16400 en binaire pour voir..

Ca fonctionne maintenant..

Voici le code final (j'ai ajouté un variable "premier" pour virer le premier 1 dans PR):
Code: Tout sélectionner
 /* Librairie de lecture IR */
        #include <IRremote.h>
        /* PIN signal recepteur IR */
        int RECV_PIN = 11;
        int i;

        const unsigned long P = (((B00000000) * 256 | B00000100 ) * 256 | B00000001) * 16 | B0000; // préambule commun de 28 bits:
        const unsigned int T[10] = {B00000000,  // les 8 derniers bits sont les différentiateurs
                                   B00001000,
                                   B00000100,
                                   B00001100,
                                   B00000010,
                                   B00001010,
                                   B00000110,
                                   B00001110,
                                   B00000001,
                                   B00001001};
        char* Touche[10] = {"1","2","3","4","5","6","7","8","9","0"};

        IRrecv irrecv(RECV_PIN);

        decode_results results;

        void setup()
        {
          Serial.begin(9600);
          irrecv.enableIRIn(); // Démarre les interruptions de surveillance du capteur IR
        }

        void dump(decode_results *results) {
          int count = results->rawlen -1;
          unsigned long PR = 0;
          unsigned int TR = 0;
          int i=0;
          int premier = 0;

          // Le signal s'initialise
          if ( (results->rawbuf[1] < 77) and (results->rawbuf[1] > 63) )
          {}
          else
          { Serial.print("-PAS BON 1:");Serial.print(results->rawbuf[i], DEC); Serial.print("-");goto RATE;};

          if ( (results->rawbuf[2] < 39) and (results->rawbuf[2] > 31) )
          {}
          else
          { Serial.print("-PAS BON 2:");Serial.print(results->rawbuf[i], DEC); Serial.print("-");goto RATE;};

          if ( (results->rawbuf[3] < 12) and (results->rawbuf[2] > 7) )
          {}
          else
          { Serial.print("-PAS BON 3:");Serial.print(results->rawbuf[i], DEC); Serial.print("-");goto RATE;};
         
          // Réception du préambule de 28 bits
          for (i = 4; i < 60; i++)
            {
            if ((i % 2) == 0)
                {
                if ( (results->rawbuf[i] < 12) and (results->rawbuf[i] > 7) )
                  { Serial.print("0"); PR=PR<<1; }
                  else
                  {
                    if ( (results->rawbuf[i] < 29) and (results->rawbuf[i] > 23) )
                    { if (premier == 0) {Serial.print("0"); PR=PR<<1; premier = 1;} else {Serial.print("1"); PR=PR<<1; PR++; }}
                    else
                    {
                      Serial.print("-PAS BON "); Serial.print(i, DEC); Serial.print(":");Serial.print(results->rawbuf[i], DEC); Serial.print("-");goto RATE;
                    };
                  };
                }
            else
              {
              if ( (results->rawbuf[i] < 12) and (results->rawbuf[i] > 7) )
                {
                }
            else
              { Serial.print("-PAS BON "); Serial.print(i, DEC); Serial.print(":");Serial.print(results->rawbuf[i], DEC); Serial.print("-");goto RATE;
              }
            };
          }; // FIN RECEPTION PREAMBULE         
          if (PR == P)
            {
              for (i = 60; i < count; i++) // La fin du code
              {
              if ((i % 2) == 0)
                  {
                  if ( (results->rawbuf[i] < 12) and (results->rawbuf[i] > 7) )
                    { Serial.print("0"); TR=TR<<1; }
                    else
                    {
                      if ( (results->rawbuf[i] < 29) and (results->rawbuf[i] > 23) )
                      { Serial.print("1"); TR=TR<<1; TR++; }
                      else
                      {
                        Serial.print("-PAS BON "); Serial.print(i, DEC); Serial.print(":");Serial.print(results->rawbuf[i], DEC); Serial.print("-");goto RATE;
                      };
                    };
                  }
              else
                {
                if ( (results->rawbuf[i] < 12) and (results->rawbuf[i] > 7) )
                  {
                  }
                else
                  { Serial.print("-PAS BON "); Serial.print(i, DEC); Serial.print(":");Serial.print(results->rawbuf[i], DEC); Serial.print("-");goto RATE;
                  };
                };
              };
              for (i=0; i<10; i++)
                {
                if (TR==T[i])
                  { Serial.print(">> TOUCHE "); Serial.print(Touche[i]); goto RATE;
                  };
                };
              }
            else
              { Serial.print("PREAMBULE RECU<>ATTENDU");Serial.print(PR,DEC);Serial.print("   ");Serial.print(P,DEC);};
          Serial.print(">> Pas de touche correspondante");
          RATE:
          Serial.println("");
        }


        void loop() {
          if (irrecv.decode(&results)) {
            dump(&results);
            irrecv.resume();
          };
        }
blepharocyte
 
Messages: 18
Inscription: Ven 15 Fév 2013 00:31

Précédente

Retourner vers Kit Communication IR

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités

cron