PROJET AUTOBLOG


Idleman

source: Idleman

⇐ retour index

Raspberry PI ~ 10 : Commander le raspberry Pi par radio

samedi 8 décembre 2012 à 16:34

 

Ce post est le dixième d’une liste de tutoriels sur le raspberry PI dont voici le sommaire :

  1. Raspberry PI  ~ 01 : Présentation
  2. Raspberry PI  ~ 02 : Exploration technique
  3. Raspberry PI  ~ 03 : Brancher et installer le Raspberry PI
  4. Raspberry PI  ~ 04 : Configurer en serveur
  5. Raspberry PI ~ 05 : Protéger notre précieux
  6. Raspberry PI ~ 06 : Utiliser le GPIO et Interagir avec le monde réel
  7. Raspberry PI ~ 07 : Allumer/éteindre une vraie lampe OU comment faire de la domotique low cost.
  8. Raspberry PI ~ 08 : Jouer avec les ondes radio
  9. Raspberry PI ~ 09 : Créer une interface vocale
  10. Raspberry PI ~ 10 : Commander le raspberry Pi par radio
  11. Raspberry PI ~ 11 : Relier à un écran et afficher du texte
  12. Raspberry PI ~ 12 : Allumer des prises à distance
  13. Raspberry PI ~ 13 : Détecter l’ouverture des portes et fenêtres

 

Nous avions brièvement abordé l’émission/transmission radio via le raspberry pi lors de notre tutoriel n°8.

Je vous avais promis une application concrète et plus poussée, nous allons donc aujourd’hui donner des ordres au raspberry PI via une télécommande radio achetée dans le commerce.

Voici la petite vidéo traditionnelle avec l’objectif final à atteindre et la démonstration du processus Sourire

Commander le raspberry Pi par radio from idleman on Vimeo.

 

Je sais, la vidéo est encore à l’envers, j’arrive pas à m’y faire… à ce propos je cherche un bénévole un peu calé en vidéo montage pour améliorer la qualité de ces dernières, si une bonne âme se sent de remanier les vidéos qu’il me contacte Sourire.

Tenté par l’idée de reproduire ça chez vous ? Bien ! Mettons nous au travail !! Rire

<!> NB : Vous devez avoir suivis les tutoriaux 04, 06,07 et 08 minimum avant d’aller plus loin.

Le Matériel :

Si vous avez bien suivi le tuto 8, la pluparts de ces éléments sont déjà en votre possession :)

  1. Un raspberry PI en état de marche Sourire
  2. un kit émetteur/récepteur 433,92 Mhz pour la modique somme de 15,95€ (au moment ou j’écris ce tuto), j’ai acheté le mien ici : http://www.conrad.fr/ce/fr/product/130428/?insert=62&insertNoDeeplink&productname=Ensemble-metteurrcepteur-radio-433-MHz-AM
    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 54795 vendu 29,95€, 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

  1. Vous voila équipé bande de veinards !!

Installation :

Branchez le récepteur au raspberry PI en suivant les instructions du tuto N°8, ceci permettra au raspberry de capter les ondes radios sur la fréquence 433 mhz

Si vous avez suivis le tuto N°7, 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

 

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 (je sais, on peux faire moins permissif)

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 :

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.

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

(on fait moins le malin la pas vrai ? Tire la langue)

Hum, j’y comprends plus rien la… tu nous a bien enflé avec ton histoire de 32 bits !

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.

Je suis a disposition pour d’éventuelles questions et incompréhensions du processus Sourire