Aller au contenu

Commander le raspberry Pi par radio

Tuto Raspberry pi 4 ovh
Publié dans Tutoriels · 18 Octobre 2020
Tags: GPIODOMOTIKRADIORASPBERRY

Nous avions brièvement abordé l’émission/transmission radio via le raspberry pi lors de notre tutoriel Jouer avec les ondes radio.

Comment donner des ordres au raspberry PI via une télécommande radio achetée dans le commerce.

Le Matériel :

  1. Un raspberry PI
  2. un kit émetteur/récepteur radio 433,92 Mhz sur conrad.
    NB :Vous pouvez n’acheter que le récepteur pour ce tuto, mais nous auront besoin de l’émetteur dans le tutos suivant donc autant grouper.
  3. Un kit télécommande + 3 prises D – IO by chacon modèle encore une fois, nous n’utiliseront dans le tuto que la télécommande, mais dans le prochaine nous nous occuperons des prises donc autant grouper.

<!> Prenez bien le même modèle que moi, car il semblerais que le protocole radio varie légèrement d’un modèle a un autre.

Installation :

Branchez le récepteur au raspberry PI en suivant les instructions du tuto Jouer avec les ondes radio ceci permettra au raspberry de capter les ondes radios sur la fréquence 433 mhz

Si vous avez suivis le tuto Allumer/éteindre une vraie lampe OU comment faire de la domotique low cost., vous pouvez également brancher votre carte relais sur l’une des bornes du raspberry PI afin d’allumer/éteindre une lampe/un réveil comme dans la vidéo, sinon, vous vous contenterez de la partie envois de mail et affichage des codes de la télécommande.

C’est tout pour les branchements Sourire, maintenant voyons le code !

Assurez vous que la librairie wiringPi (qui permet de gérer facilement l’état 0 ou 1 des ports GPIO du raspberry PI) est bien installé sur votre raspberry PI.

Téléchargez mon petit programme de réception en C + PHP nommé originalement radioReception ici.

Décompressez le tout dans le répertoire /var/www de votre raspberry PI

image

  • LICENCE et README :Les infos sur la licence et autres du code.
  • radioReception :l’exécutable C qui vas parser les infos sur port gpio de réception et les envoyer au fichier PHP
  • radioReception.css :la source du programme C, vous pouvez le supprimer si vous ne comptez pas modifier le code.
  • radioReception.php : Le fichier PHP qui vas être exécuté par le programme C, recevoir les infos du signal, et effectuer une action en conséquence.

Utilisation :

positionnez vous dans le répertoire du programme,

cd /var/www/radioReception

définissez que le programme peut être exécuté avec un chmod.

sudo chmod 777 radioReception

puis lancez le programme C avec la commande suivante :

image

./radioReception /var/www/radioReception/radioReception.php  7

/var/www/radioReception/radioReception.php : Chemin vers le fichier PHP qui traitera les informations reçues (identifiant de la télécommande, numéro du bouton, état on/off etc..)

7 : Numéro WiringPi du PIN Gpio auquel est branché le récepteur 433 mhz

Vous pouvez maintenant appuyer sur les boutons de la télécommandes et constater les actions effectuées par le PHP.

image

chaque action exécute le fichier PHP initialement entré en paramètre et lui fournis les informations suivantes :

  • : l’identifiant de la télécommande
  • : Si c’est une commande de groupe (1) ou non (0), avec cette télécommande, cette valeur sera toujours à 0.
  • : si le bouton est on (1) ou off (0)
  • : l’identifiant de la rangée de bouton de la télécommande

A vous de modifier le PHP et de développer les actions qui vous semblent intéressantes, je n’ai laissé que l’exemple d’ouverture/fermeture du port gpio 3 (15 em port physique) dans les sources.

Si vous avez des problèmes de portées, de gros parasites, ou de mauvaise communication, pensez a faire ces deux choses :

  • Prendre une alim externe pour les cartes radio  et les l’alimenter au maximum de ce qu’elles sont capables de faire (cf la clause “voltage max” de fiche technique, souvent c’est entre 5 et 12V)
  • Souder un fil conducteur de 17.3 cm a l’émetteur et au récepteur pour servir d’antennes.

Avec ces deux points, vous pouvez passer de quelques centimètres à plusieurs centaines de mètres de portée, la différence est vraiment flagrante.

C’est tout pour ce tuto !! Si vous ne voulez pas comprendre ce que vous faites, vous pouvez vous arrêter ici ^^, sinon je vous invite a entrer avec moi dans les subtilités du protocole radio utilisé en lisant les paragraphes ci dessous.

Dans le prochain tuto nous tenterons le processus inverse, à savoir émettre avec le raspberry PI pour allumer/éteindre les prises chacon (et on pourra jeter cette vilaine télécommande XD)

Comprendre plus en profondeur :

C’est une chose d’appliquer bêtement un tuto, c’en est une autre de comprendre entièrement ses tenants et ses aboutissants, pour les curieux qui voudraient comprendre plus en détail comment nous récupérons et nous traitons le signal radio, voila quelques explications…

Zallez voir, c’est pas ultra compliqué quand on a toutes les infos bout à bout (ce que j’ai passé 2 mois a réunir) mais il faut s’accrocher un minimum Sourire

Concrètement qu’envoie la télécommande chacon ?

Cette télécommande envoie un signal radio sur la fréquence 433.92 mhz, ce signal respecte (plus ou moins) le protocole radio domotique home easy (très mal documenté au passage).

Le protocole home easy transmet les informations sous la forme d’un signal de 32 bits, un bit étant un 1 ou un 0 (ça tombe bien, les ports GPIO peuvent lire les 1 et le 0 Rire)

il y a donc un signal de 32 : 0 ou 1 par exemple : 00011000101001010010100100010110

Vous noterez l’utilisation de zoulies ptites couleurs Sourire, ce n’est pas pour rien :

Les 26 premiers bits (en bleu) correspondent à l’identifiant de la télécommande
Le 27em bit (en violet) correspond au numéro de groupe (information que nous n’utiliseront pas)
Le 28em bit (en rouge), correspond à l’état (ON ou OFF) envoyé, 0=off, 1=on
Les bits 29 à 32 (en vert) correspondent au numéro du bouton de la télécommande appuyé

La télécommande vas donc envoyer le signal en fonction du bouton appuyé, de la télécommande et de l’état ON ou OFF de ce bouton.

  1. Okay mais on a un seul pin branché au récepteur non ? comment on vas capter tout ces 0 et ces 1 d’un coup ?

C’est une bonne question !! :D En fait toutes les infos vont être envoyé par le récepteur sur le même pin (dans notre exemple, le pin 7) mais avec des délais entre chaque 0 ou 1 afin de bien les distinguer les uns des autres !

Mais alors le signal vas être long à capter non ?

Pas du tout ! En effet les délais dont je vous parlais sont de l’ordre de la micro seconde ! Donc un signal dans son intégralité a peu de chance de dépasser la milli-seconde ce qui est totalement ridicule pour la perception humaine :).

Bon, et t’as mis 2 mois pour comprendre ça ?

En réalité, nous ne sommes pas au bout de nos peines, c’est un peu plus compliqué que ca Sourire, admettons que la télécommande nous envoie le code :

00011000101001010010100100010110

Nous recevrions en réalité quelque chose comme ça :

01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101

que nous traduirions en ça :

0101011010010101100110010110011001011001100101100101011001101001

et enfin en ça :

00011000101001010010100100010110

C’est juste Sourire, mais il fallait simplifier pour ne pas vous perdre dès le début ^^, en réalité le signal est bien de 32 bits, mais il est “traduit” deux fois avant émission et réception pour les raisons que nous allons voir ci dessous.

La première traduction, est liée a ce qu’on appelle le “codage de manchester” derrière ce nom étrange se cache un principe tout simple : on vas convertir les 0 en 01 et les 1 en 10.

Donc le code de la télécommande

00011000101001010010100100010110

vas se transformer (avant d’être émis) en ce signal de 64 (car 32*2) bits :

0101011010010101100110010110011001011001100101100101011001101001

Mais pourquoi se compliquent t’ils la vie avec leurs codage de machin chose?

Dans notre contexte, le code de manchester est utilisé pour diverses raisons mais essentiellement pour éviter les parasites, et croyez moi, des parasite radio, nous en sommes blindés ! Rire Bref je ne vais pas m’étaler sur le principe, les infos sont sur wikipedia mais en gros si une paire de bit est égale a 11 ou 00 le programme comprendras qu’il s’agit d’un parasite (car en prenant les bits par paire depuis el début du signal, on ne peux avoir que des 10 ou des 01 si le signal n’est pas un parasite).

Ok donc on à juste une petite conversion à faire, c’est pas méchant, mais c’est quoi la deuxième traduction alors ?

Et bien la seconde traduction, c’est tout simplement la transformation en “onde”, c’est ce dont nous parlions tout à l’heure avec les délais, par exemple pour que la télécommande émette “1” il lui faut envoyer une impulsion (impulsion qui n’est autre qu’un passage de 0 à 1 ) avec un certain délais entre le 0 et le 1 (pour signifie qu’on envoie un 1 et pas un zero.

Donc envoyer un 1 reviendrais a envoyer ce genre de signal :

image

C’est le délais en micro seconde ou le signal est bas qui définit si un 1 ou un 0 a été envoyé.

Attention nous disons ici qu’un 1 a été envoyé, mais comme nous respectons le codage de Manchester nous devons envoyer “10” :

image

Comme vous pouvez le voir sur le schéma pas du tout précis, le premier “front bas” (qui représente le 1) est plus court que le second (qui représente le 0), leurs somme fait “10” qui, en codage Manchester signifie “1”

Je suppose que vous êtes sur les rotules, mais soyez fiers de vous, il n’y a plus rien à comprendre par la suite (vous pouvez imaginer maintenant pourquoi j’ai mis un peu de temps à décrypter le protocole de cette fichue télécommande sans la moindre doc et sans connaitre les lois de la radio transmission).

Voila un petit graphique pour résumer le chemin d’un signal :

HomeEasyProtocol

Et voila un petit script tout droit sortis de mes petites papattes pour vous aider a visualiser un signal :http://domotique.idleman.fr/radiograph.htm

Notez une dernière chose importante !

Le protocol home easy, contient encore une petite subtilité : les verrous.

Les verrous sont des bits émis par la télécommande avant et après le signal afin d’annoncer au récepteur que le signal commence et se termine (ce qui permet également de distinguer un signal d’un parasite).

Ces verrous sont au nombre de 3 : deux avant le signal, un a la fin. Les pulsations de ces verrous sont très long (pour les distinguer des pulsations de bits d’informations) de l’ordre d’une centaine de micro secondes.

Bon, j’ai bien tout compris, mais tu as oublié de nous donner quelque chose d’important : les délais de chaque pulsation (0, 1 et verrous) !!?

C’est bien !! Vous suivez !! Rire Et vous avez raison je ne vous les ai pas donnés pour la raison suivante : je ne les connais pas ! Ha ha ha ha !!

En fait c’est la que le manque de doc se fait ressentir sur le protocole home easy :

  1. Aucune doc n’est complète
  2. Les docs se contredisent entre elles pour les délais
  3. La marque Dio by chacon semble altérer légèrement les délais d’un modèle à un autre (pour brouiller les pistes?)

Bref on ne peux qu’estimer les valeurs de chaque délais, c’est la raison pour laquelle vous noterez que mon programme ne capte pas à tout les coups, les délais étant encore mal calibrés, libre a vous de tester les délais et de me faire vos retours si vous parvenez a être plus précis, voila mes délais actuels :

Verrou 1 : Entre 2700 et 2800 micro secondes
Verrou 2 : ?
0 : Entre 180 et 420 micro secondes
1 : Entre 1280 et 1480 micro secondes
Verrou 3 : ?

Vous noterez aussi que dans mon code, je n’ai pas tenu compte des verrous 2 et 3, qui ne sont pas indispensables dans ce cas précis (même si ce serait mieux de les demander), en revanche quand nous émettrons depuis le raspberry PI, il nous faudra être plus rigoureux.





Mentions Légales - raspberry-pi.ovh 2022 © Copyright- Raspberry Pi est une marque déposée de la Raspberry Foundation - Les contenus rédigés par raspberry-pi.ovh sont distribués sous license open source.
Retourner au contenu