[Programmation] Décoder du binaire avec arduino
Répondre à la discussion
Affichage des résultats 1 à 10 sur 10

Décoder du binaire avec arduino



  1. #1
    Tryg

    Décoder du binaire avec arduino


    ------

    Bonjour,
    Sur un actuel projet de télécommande, j’ai besoin de transmettre plusieurs valeurs booléennes (des boutons) avec un nrf24l01.
    Or, je ne peux transmettre que 8 valeurs (de 0 à 256) par séquence, et ce n’est pas assez pour intégrer tout ce que j’ai besoin de transmettre. Et comme la transmission se fait en octets, j’ai eu une idée :
    Sur un octet, on peut en principe faire tenir 8 valeurs booléennes :
    Est-ce que l’arduino serait capable de le faire puis de décoder l’octet pour le savoir ? Comment ?
    Je ne sais pas si je suis clair, voilà un exemple :

    -> Le bouton 1 et le bouton 4 sont appuyés;
    -> l’arduino crée la valeur en binaire 10010000 ( chaque bit correspondant à un bouton)
    -> on envoie par l’émetteur la valeur 144 qui y correspond
    -> l’arduino qui reçoit retransforme 144 en binaire et en déduit que les boutons 1 et 4 sont appuyés

    Merci !

    Tryg

    -----

  2. #2
    antek

    Re : Décoder du binaire avec arduino

    Comme tu te proposes de faire fonctionne bien avec 8 interrupteurs (16 états donc), il existe plusieurs moyens d'y arriver (masque, opération logique, test sur bit, . . .).
    Mais avec un octet on peu coder 256 valeurs, soit les états de 128 interrupteurs.
    L'électronique c'est comme le violon. Soit on joue juste, soit on joue tzigane . . .

  3. #3
    umfred

    Re : Décoder du binaire avec arduino

    valeur numérique base 10 ou valeur binaire c'est la même chose, seule la base d'affichage change
    144 =0b10010000 (0b pour indiquer la notation binaire)
    tout est question de masque ensuite ou de décalage de bit
    (144 >> 7) & 1 donne directement la valeur du bit 7
    (144 >> 4) & 1 donne directement la valeur du bit 4
    (le & 1 permet de mettre à 0 les autres bits)

  4. #4
    paulfjujo

    Re : Décoder du binaire avec arduino

    bonjour,


    je ne travaille pas sur arduino, mais le principe reste valable ...

    Dans un Byte (ou Octet) ,chaque bit a un poids binaire

    Code:
     const unsigned char  Poids[]={128,64,32,16,8,4,2,1};

    il suffit de comparer ta valeur , qui represente les boutons à tester
    avec un masque ET ( AND) logique entre ta valeur et chaque poids, pour en deduire quels sont les bits à 1 ( bouton appuyé)

    je vois que tu t'attaque à un nrf24l01 !!! en posant ce genre de question !
    alors que les fonctions logiques (AND OR XOR ..) sont les bases meme de programmation



    exemple de code pour un PIC27K42 avec MikroC
    transposable pour arduino..

    oublie l'initialisation et la gestion UART .. secondaire ici , juste pour pouvoir afficher le resultat sur un terminal PC

    Code:
     const unsigned char  Poids[]={128,64,32,16,8,4,2,1};
     unsigned char Value;
     char txt[80];
     int i,j,k;
    
     void CRLF1()  // changement de ligne
    {
     UART1_Write(13); UART1_Write(10);
    }
    
     void CPrint(const char *txt)
     {
       while (*txt)
          UART1_Write(*txt++);
     }
    
     void main()
     {
        OSCCON1 = 0x60;
        OSCFRQ = 0x08;        // FOSC = 64MHz
        while (OSCSTAT.HFOR == 0);       // wait oscillator is ready     Etat Oscillateur OSCSTAT := 0081
        Delay_ms(1000);
    
      ANSELB=0;
      PORTB = 0x00;
      TRISB = 0b11111111;  // all input  Boutons
     
     
      Value=144;  // ou Value=PORTB;
       
       UART1_Init(115200);
       UART_Set_Active(&UART1_Read, &UART1_Write, &UART1_Data_Ready, &UART1_Tx_Idle); // set UART1 active
       Delay_ms(100);
    
       
       for (i=0;i<8;i++)
       {
          CPrint(" Bouton #");  UART1_Write(i+'1');
          if ( (Poids[i]& Value)==Poids[i])
          {
           CPrint("  Appuyé");
          }
         else
          CPrint(" repos");
       CRLF1();
       }
       while(1);
    }
    resultat:
    Bouton #1 Appuyé
    Bouton #2 repos
    Bouton #3 repos
    Bouton #4 Appuyé
    Bouton #5 repos
    Bouton #6 repos
    Bouton #7 repos
    Bouton #8 repos

    nota: ce code devrait pouvoir tourner avec la version gratuite de MikroC limitée à 2K

    nota: UART1_Write(i+'1'); le +1 car en C , une table commence par l'indice 0 et ' ' pour ascii
    Dernière modification par paulfjujo ; 19/01/2022 à 14h29.

  5. A voir en vidéo sur Futura
  6. #5
    gienas
    Modérateur

    Re : Décoder du binaire avec arduino

    Bonjour Tryg et tout le groupe

    Citation Envoyé par Tryg Voir le message
    ... je ne peux transmettre que 8 valeurs (de 0 à 256) ...
    Peut être faut-il corriger ta phrase qui est "incorrecte".

    Tu ne peux transmettre que 8 bits qui peuvent donner lieu à 256 valeurs différentes.

    Citation Envoyé par Tryg Voir le message
    ... Sur un octet, on peut en principe faire tenir 8 valeurs booléennes:
    Est-ce que l’arduino serait capable de le faire puis de décoder l’octet pour le savoir? ...
    Plutôt que "valeurs booléennes", il serait préférable de t'habituer à employer le terme de bit, plus explicite et clair.

    Bien sûr, l'Arduino en est bien capable.

    La question que je me pose c'est pourquoi ne te limiter à 8 touches (donc les 8 bits) et es-tu tenté de prévoir plus de "messages" différents?

    Il est vrai que si 8 cas de figures sont suffisants, ta solution est bien la plus simple.

    Citation Envoyé par Tryg Voir le message
    ... Comment? ...
    Ton idée est bonne. Tu transmets le code 144 qui, à la réception, recevra également la valeur 144 pour l’octet, qu'il sera facile de décoder pour savoir quels bits sont à 1.

    Il est possible de tester un par un tous les 8 bits pour savoir (huit fois) s'ils sont là ou pas.

    Si le nombre de combinaisons est faible, moins d'une quinzaine, tu peux les tester chacun leur tour

    Code:
    if ( codeRecu == 144 ) recu144 () ;  // j'exécute la fonction recu144 ()
    if ( codeRecu == ...

  7. #6
    Tryg

    Re : Décoder du binaire avec arduino

    Bonsoir, merci beaucoup pour vos réponses.

    je vais vous répondre un par un :

    - @antek : en fait oui mais je ne crois pas que ce soit possible si on veut pouvoir allumer deux boutons en même temps.

    -@umfred :
    (144 >> 7) & 1 donne directement la valeur du bit 7
    (144 >> 4) & 1 donne directement la valeur du bit 4
    ca veut dire que si par exemple dans le code je mets :

    Code:
    valeurb1 = ((144 >> 7) &1)
    alors valeurb1 sera égal à 1 ?

    -@paulfjujo :
    Merci beaucoup pour ton programme, je pense que je ferai comme ça

    -@gienas :
    pourquoi ne te limiter à 8 touches (donc les 8 bits) et es-tu tenté de prévoir plus de "messages" différents?
    en réalité je n'aurai même que 5 boutons à gérer (eh oui je sis limité par le nombre de pins de l'ATmega 328p)
    Il est possible de tester un par un tous les 8 bits pour savoir (huit fois) s'ils sont là ou pas
    Oui, c'est ce qu'a fait paulfjujo je crois.


    Je pense que je vais réussir à faire le programme inverse (pour l'émetteur, qui transforme les valeurs des boutons en chiffres), en m'inspirant de son programme

  8. #7
    Tryg

    Re : Décoder du binaire avec arduino

    Ca y est, j'ai fait le code pour passer des valeurs des boutons vers le signal à envoyer :

    Code:
    poids = [128, 64,32,16,8,4,2,1]
    boutons = [1, 0, 0, 1, 0, 0, 0 0]; //les boutons 1 et 4 sont appuyés, les autres sont relâchés
    int i;
    int signal = 0;
    
    void setup ()
    {
    
    }
    
    void loop ()
    {
      for (i=0, i<=8, i++){
        if (boutons[i] == 1) {
          signal = signal + poids[i];
        }
      }
    }
    Par contre pour l'utilisation des liste je ne sais pas si mes instructions sont bonnes pour l'IDE d'arduino, j'ai fait comme paulfjujo mais puisqu'il utilise un lautre langage...

    Est-ce que le programme ets bon ? Merci encore !

  9. #8
    umfred

    Re : Décoder du binaire avec arduino

    il faut utiliser la même syntaxe, ça reste du c/c++; donc des const byte ou des const unsigned char pour les tableaux
    Code:
    const byte poids[] = {128, 64,32,16,8,4,2,1};
    const byte boutons[] =  {1, 0, 0, 1, 0, 0, 0 0}; //les boutons 1 et 4 sont appuyés, les autres sont relâchés
    il manquait le ; à la fin de la 1ere ligne (le compilateur l'aurait signalé)
    et il manque aussi dans le setup la config du port série; et dans la loop, l'envoi.

  10. #9
    Tryg

    Re : Décoder du binaire avec arduino

    Merci Umfred, et merci à tous pour vos réponses !!

  11. #10
    umfred

    Re : Décoder du binaire avec arduino

    Sinon la réponse à la question sur (144>>7) & 1 sera bien égal à 1 (mais tu as du le découvrir par toi-même)

Discussions similaires

  1. [Exercices] Décoder une trame pocsag (pager/biper) sur un arduino
    Par invite869f5fd7 dans le forum Électronique
    Réponses: 4
    Dernier message: 17/08/2017, 16h46
  2. Arduino anti rebond avec arduino
    Par invited0bffa74 dans le forum Électronique
    Réponses: 13
    Dernier message: 23/10/2014, 17h04
  3. Problème avec un compteur binaire ?
    Par invite92587daf dans le forum Électronique
    Réponses: 15
    Dernier message: 03/04/2014, 16h22
  4. Communication arduino-arduino avec module Xbee
    Par inviteda9a8a4b dans le forum Électronique
    Réponses: 2
    Dernier message: 23/12/2013, 17h24
  5. Convertion binaire To BCD avec pic16f
    Par invite2ae8d33b dans le forum Électronique
    Réponses: 24
    Dernier message: 26/08/2006, 14h09
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...