Il y a très longtemps , dans l'idée de construire une station météo , j'avais commencé par réalisé une girouette électronique .
Pour se faire , j'ai encoder sur un disque (vieux CD avec un filtre papier collé dessus) un code binaire Gray que je monte sur un axe .
Quelques Opto-coupleurs réfléchissants CNY70 pour lire la position sans frottements et le tour est joué .
Coté décodage , un 4514 ou un 4515 (mutiplexeur 1 parmi 15) et des leds branchés en fil volant .
Ça permet d'avoir 16 points cardinaux en lisant un binaire de 4 bits .
Désirant reprendre le projet mais avec un décodage logiciel , je me suis penché sur ce fameux code GRAY .
C'est pas encore le printemps , mais j'ai des idées qui bourgeonnes avec les beaux jours .
Après quelques tâtonnements , j'ai réussi à trouver la logique et à pondre le code d'encodage et le plus important , le décodage de ce fameux code binaire GRAY.
Je ne dirais pas merci à Wikipédia !!!
Je le met ici pour ceux que ça intéresserait :
Je n'ai pas vu de projet station météo avec girouette !!!
Code : Tout sélectionner
#!/usr/bin/python3
def Gray (valeur, decode=False) :
    """
    valeur = nombre décimal entier
    decode = False, True, 0, 1 
     
    Encodage : Bin => Gray
       Deux bits consécutifs identiques = 0
       Deux bits consécutifs différents = 1
    
    Décodage : Gray => Bin
       En partant de la gauche (MSB) , on additionne les bits lus
       Si la somme est un nombre pair   = 0 
       Si la somme est un nombre impair = 1
     
    Liste des 8 premiers codes
     
           Bin  , Gray                       210
       0 ,   00 ,   0 , 0 , eteint le bit 2  ---  
       1 ,   01 ,   1 , 1 , allume le bit 0  --█  
       2 ,  010 ,  11 , 3 , allume le bit 1  -██  
       3 ,  011 ,  10 , 2 , eteint le bit 0  -█-  
       4 , 0100 , 110 , 6 , allume le bit 2  ██-  
       5 , 0101 , 111 , 7 , allume le bit 0  ███  
       6 , 0110 , 101 , 5 , eteint le bit 1  █-█  
       7 , 0111 , 100 , 4 , eteint le bit 0  █--  
     
    Chronologiquement , 1 seul bit est permuté en code Gray
    """
     
    
    if decode :     # décodage 
        dec = somme = 0
        l = len(bin(valeur)[2:])        # nombre de bits à traiter
        mb = 2** l >> 1                 # masque du bit à lire
        for n in range (l) :
            somme += (valeur & mb) > 0
            dec =  (dec << 1) + (somme & 0b1)
            mb >>= 1                    # masque du bit suivant à droite
        return dec
    else :          # encodage    
        enc = 0
        for n in range (len(bin(valeur)[2:])) :
            bits = valeur & 0b11
            enc += 2 ** n * (bits is 0b01 or bits is 0b10)
            valeur >>= 1
        return enc
