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