[TUTO] RFXCom du pauvre sur RPI pour prises radio

La section dédiée aux Raspberry Pi (tous modèles); Comment on l'installe; Comment on ajoute des capteurs; Ce qu'on peut en faire ...

[TUTO] RFXCom du pauvre sur RPI pour prises radio

Messagede cha » 30 Nov 2014, 17:39

Dans ce tuto, nous allons voir comment apprendre et rejouer b√™tement des signaux radio pour des prises 433Mhz sans RFXCom, sur un Raspberry Pi. √áa permettra m√™me de contr√īler des prises avec un protocole "sp√©cial" non support√© par RFXCom. Car on va purement et simplement rejouer ce que la t√©l√©commande a envoy√©, sans comprendre le protocole (c'est chiant les protocoles !)

Matériel

Un kit √©metteur/r√©cepteur qu'on trouve chez tous les vendeurs √† yeux brid√©s (ou pas!) √† 5‚ā¨ maximum : FS1000A (√©metteur radio) et xy-mk-5v (r√©cepteur radio)

Image

Un raspberry Pi (pas besoin de présenter ...)

Image

Une breadboard et des c√Ębles

Image

Présentation du kit RF

Image

Les modules s'alimentent en 5V et fonctionnent sur le port GPIO du RPI. Selon les besoins en portée, il faudra souder un fil d'une dizaine de cm sur le plot antenne des 2 éléments. Sans ça, ils ont quand même une portée de quelques mètres.

Donc les 5V des 2 éléments du kit se branchent sur les 2 pins 5V du RPI, leur masse sur 2 des 5 PIN de masses du RPI. Et le PIN DATA de chaque élément sur des GPIO disponibles du RPI. Moi j'ai choisi 2 et 3 (numérotation WiringPi)
Certains PIN peuvent avoir un autre usage que GPIO selon la configuration de Linux, √©vitez de les utiliser si vous n'√™tes pas s√Ľr.

Image

Numérotation "WiringPi" :
Image

En faisant fonctionner l'émetteur et le récepteur ensemble pour discuter, c'est simple : si l'émetteur envoie 1, l'autre reçoit 1, et vice versa. Donc si le PIN Data de l'émetteur est à 5V en sortie, le PIN DATA sera aussi à 5V en entrée (bon c'est la théorie, en pratique, il y a beaucoup de parasites et la tension varie).

Exemple de montage (remerciez mon iPhone pour la #flashfail) :

Image

Programmes

Pour lire et rejouer le signal, nous allons utiliser des programmes que "j'ai fais" en me basant sur celui d'Idleman : http://blog.idleman.fr/raspberry-pi-10- ... -par-radio. Merci à lui.
(merci de ne pas être méga exigent, je suis pas expert C++ !)

Recepteur (binaire) : https://dl.dropboxusercontent.com/u/6897509/touteladomotique.com_tutorial_rf_universel_rpi/Recepteur
Recepteur (code source) : https://dl.dropboxusercontent.com/u/6897509/touteladomotique.com_tutorial_rf_universel_rpi/Recepteur.cpp
Emetteur (binaire) : https://dl.dropboxusercontent.com/u/6897509/touteladomotique.com_tutorial_rf_universel_rpi/Emetteur
Emetteur (code source) : https://dl.dropboxusercontent.com/u/6897509/touteladomotique.com_tutorial_rf_universel_rpi/Emetteur.cpp

La difficulté majeure est que nous devons acquérir et envoyer des signaux GPIO en "temps réel". Linux n'est pas temps réel sous sa forme distribuée couramment sur RPI. Ce programme passe donc en mode priorité élevée pour avoir des timings les plus précis possible.

Le premier programme, d√®s son lancement, lit ce qu'il se passe sur le PIN GPIO qu'on lui passe en param√®tre (num√©rotation WiringPi). Il va prendre une mesure de la valeur (0-1) sur le GPIO du r√©cepteur radio toutes les 100√Ļs, les m√©moriser. Quand on appuie sur Ctrl+C, il va arr√™ter l'√©coute, et enregistrer les mesures dans un fichier CSV dont le nom est pass√© en param√®tre.

Usage :
Code: Tout sélectionner
./Recepteur 3 ON.csv

Ctrl+C une fois la l'acquisition faite

Exemple de fichier CSV produit :
Code: Tout sélectionner
4966;0
4967;0
4968;1
4969;1
4970;1
4971;1
4972;0


La première colonne est l'index de la mesure (1, 2, 3 ...). La seconde, la présence d'une tension ou non sur le PIN GPIO lu.

Le second programme fait l'inverse. Il lit le CSV, et envoie les valeurs 0-1 dans le m√™me ordre, espac√©es de 100√Ļs, sur le PIN GPIO de l'√©metteur radio. On a donc reproduit le signal, et la prise s'allume ! Clap clap.

Usage :
Code: Tout sélectionner
./Emetteur 2 ON.csv


Pourquoi du CSV ?

Parce que ça va vous permettre d'analyser vous même le signal, et enlever tout ce qui sert à rien, si vous récupérez le CSV depuis le RPI (par SSH par exemple).

Avec le logiciel GNU Plot, vous allez pouvoir tracer la courbe du signal.

Code: Tout sélectionner
cd 'C:\Users\utilisateur\Documents'
set datafile separator ";"
plot "signal.csv" with linespoint


Appuyez sur entrée, la courbe s'affiche.

Image
Oui ceci est une courbe !

Les contr√īles de base de GNU Plot :
Molette : monter / descendre
Ctrl + molette : Zoom proportionnel sur les 2 axes
Shift + molette : Droite / gauche
Ctrl + maj + molette : Zoom sur l'axe X sans modifier le zoom de Y


Jouez un peu avec Ctrl + maj + molette, vous aurez un signal un peu plus lisible.
Maintenant, il faut localiser le vrai signal de la télécommande de la prise, il y a beaucoup de "bruit". Avec shift + molette, défilez un peu pour trouver un signal net, régulier, et qui se répète (les télécommandes de prises envoient souvent plusieurs fois le même code à la suite).

Image
Nous voyons ici 3 fois le même signal (le 3ième est légèrement beaucoup coupé sur l'image)

Image

On a trouvé la télécommande ! Ici on l'a 2 fois. On voit que le signal commence à 13800 environ en X, et se fini à 14400. Vous pouvez supprimer tout ce qui est avant et après dans le CSV, avec un éditeur de texte.
Vous avez donc isol√© le signal utile. Ca sert √† ce que la prise r√©agisse plus vite. Car tout ce qui se trouve avant, c'est autant de signal envoy√© dans le vent (je suis trop dr√īle) et prendra du temps et √™tre r√©p√©t√©. Si vous enregistrez 5 secondes de signal, et que vous avez appuy√© au bout de 3 secondes sur la t√©l√©commande, en r√©√©mettant le m√™me signal, la prise r√©agira au moins au bout de 3 secondes.

100√Ļs d'√©chantillonnage ?

Ouai, ça marche bien avec les prises chez moi ^^ Mais il est possible qu'il soit nécessaire de réduire cette valeur si vous constatez uniquement des "pics courts" , sans "creux", sans "U" dans le signal.
Par exemple, ce signal semble pas mal ,,,,,|''''''|,,,,,|''''''|,,,,,
Avec celui-l√†, il faudra r√©duire les 100√Ļs : ,'',',',',,',',',',',, (admirez mes talents de graphistes)

Intégration avec Domoticz

Oui, je vous l'ai dit, on fait de la domotique du pauvre ici !

Sur le RPI, commencez par créer un dossier avec les fichiers
- "Emetteur" (le fichier exécutable donné plus haut en lien) et faite
sudo chmod +x ./Emetteur
pour qu'il soit exécutable.
- ON.csv et OFF.csv pour une prise donnée.

Image

Ensuite, créer un switch virtuel.
- Dans ON Action, mettre
script:///home/pi/domo/domoticz_perso/Emetteur 2 ON.csv

- Dans OFF Action, mettre
script:///home/pi/domo/domoticz_perso/Emetteur 2 OFF.csv


Je vous rappelle que 2 est le PIN GIO o√Ļ se trouve l'√©metteur RF. N'oubliez pas de changer le chemin jusqu'au fichier "Emetteur" par celui de chez vous.

Image

Et ensuite, quand vous cliquez sur le switch virtuel, la magie opère ! (normalement)

Pour plusieurs prises, mettez plusieurs fichiers ON1, ON2, OFF1, OFF2 ... et créez plusieurs switchs virtuels.

Conclusion

Ca roxx les poneys à fond !

Améliorations possibles

- Détection automatique du signal utile pour ne pas enregistrer de bruit dans le CSV. Comment ?! Sait pas ! Peut être utiliser les fonctions analogRead() et faire un seuillage pour supprimer le bruit et enlever les longues suites de 0 aux extrémités du signal enregistré ?
- La lecture et l'enregistrement du CSV est assez long, je ne sais pas comment optimiser pour l'instant. J'ai déjà utilisé des fonctions I/O de C car celles de C++ étaient encore plus lentes.
- Ménage dans le code source et gestion des erreurs. Il n'y a aucune, en cas de problème : paf le chien, sans sommation.
- Pouvoir changer la fréquence échantillonnage sans recompiler (argument en ligne de commande)
- Arrêter d'être radin et acheter un RFXCom. Mais il ne saura pas gérer les codages / protocoles variables de certaines prises, ni les protocoles supra exotiques.
cha
Membre Actif
 
Messages: 13
Inscription: 12 Juil 2014, 19:03

Re: [TUTO] RFXCom du pauvre sur RPI pour prises radio

Messagede lecameleon99 » 03 D√©c 2014, 16:25

Excellent et merci pour ce tuto.
Contr√īleur domotique : Veralite + RFXCOM Usb
NAS : Syno DS411j
Sondes : THGR122NX + EW99
Radiateurs : FGS-221
Détecteur ouverture : None
Détecteur de présence : None
Lumières : None
Caméra : None
Prises : None
lecameleon99
P'tit Guru de domotique
 
Messages: 58
Inscription: 23 Fév 2012, 14:51

Re: [TUTO] RFXCom du pauvre sur RPI pour prises radio

Messagede cha » 03 D√©c 2014, 16:29

Encore toi, tu étais déjà ici, t'es partout :)
cha
Membre Actif
 
Messages: 13
Inscription: 12 Juil 2014, 19:03

Re: [TUTO] RFXCom du pauvre sur RPI pour prises radio

Messagede Zescientist » 03 D√©c 2014, 21:00

Bonsoir,
Tout nouveau ici, je me suis inscrit suite à la découverte de ce tutoriel fort bien rédigé. Merci à toi Cha!
Ayant réalisé un POC pour arduino assez proche sur le concept, je pense pouvoir apporter ma petite contribution pour améliorer l'idée. :idea:
Par manque de temps, entre divers projets, je ne pense pas toucher au code moi-même dans les jours qui viennent, donc je vais commencer par proposer les idées, puis je verrais pour travailler dessus quand l'occasion se présentera, sur accord de l'auteur.

C'est parti! :D :mrgreen:

I - L'hardware :
1 - Remplacer ce récepteur... moisi

Je commence par les choses qui f√Ęchent.
J'avais plein de bons espoirs dans ces récepteurs pas cher du tout, mais ils ont vite disparu. J'ai essayé toutes sortes d'antennes, la qualité n'est jamais au rendez-vous.
Du coup, j'ai orienté mon choix sur le modèle ci-dessous, un poil plus cher :
Image
Ref : RFL-00002 (sur google, le premier lien de boutique qui vend de l'arduino en kit)

D'autres modèles existent, mais pour faire simple, choisissez un modèle un peu plus cher et la qualité sera au rendez-vous. Personnellement, j'ai beaucoup moins de bruit en sortie du récepteur.

2 - Sinon, modifiez votre récepteur chinois low-cost


Là, ça intéressera plus les habitués du fer à souder.
Comme je l'ai indiqué, j'ai pas mal bossé sur ces récepteurs low-cost, que ce soit en jouant sur la qualité de l'alimentation ou en tentant de filtrer le signal. Puis j'ai trouvé une énorme astuce, qui permet de supprimer quasi intégralement le bruit environnant, au détriment de la portée. Dans le cadre de ce tutoriel, pas de soucis, on cherche à recopier le signal d'une télécommande, je pars donc sur le principe que l'on peut venir à proximité du Raspberry Pi avec celle-ci pour en faire la copie.
La modification consiste à venir souder une résistance de forte impédance en entrée du premier AOP jusque la masse, ce qui agira comme une résistance pull-down, plaçant le niveau de sortie à 0, sauf si réception d'un fort signal! :twisted:
Et comme une photo vaut mieux qu'un long discours :
Image

Résistance : tout au dessus de 1Mohms suffira
Il faut souder la résistance entre les pins 3 et 4 du LM358.


II - Le software :
1 - 100√Ļs d'√©chantillonnage... seriously??!
Alors l√† je suis √©tonn√©. On voit beaucoup de protocoles o√Ļ √ßa se joue √† 10√Ļs pr√®s, voir moins.
De fait, multiplier le taux d'échantillonnage par 10 ne serait pas du luxe. Par contre ça va alourdir encore plus le fichier CSV, et il faudra donc ...

2 - Optimiser la méthode d'enregistrement des informations
Actuellement, Cha propose de faire une copie, à un moment donné via l'index d'échantillonnage I, de l'état E de la sortie TTL du récepteur.
Dans le CSV, on a donc N lignes représentant I et E.
En modifiant un peu le script, on peut facilement et drastiquement réduire la taille du fichier :
Il suffit de remplacer I (index d'échantillonnage) par le temps passé T (nombre d'échantillonnages x taux d'échantillonnage) depuis le dernier changement d'état E.
Ce qui donnerait un fichier de N lignes représentant T et E.
Forcément, le nombre de lignes N sera très fortement réduit.
Le script de lecture du CSV devra lui aussi être modifié pour être capable de les relire.

3 - Filtrer l'enregistrement
L√† pour le coup, j'ai jamais pouss√© tr√®s loin. Mon filtre consistait √† ne pas prendre en compte les √©tats qui duraient moins de 200√Ļs ou plus de 10ms.



Voilà pour ce premier jet :)
Dernière édition par Zescientist le 03 Déc 2014, 21:30, édité 1 fois.
Zescientist
Membre un peu timide !
 
Messages: 2
Inscription: 02 Déc 2014, 22:27

Re: [TUTO] RFXCom du pauvre sur RPI pour prises radio

Messagede cha » 03 D√©c 2014, 21:25

Merci pour ces idées et bienvenue !
100√Ļs, comme dit, √ßa passe avec mes prises (2 mod√®les compl√®tement diff√©rents) qui ont une dizaine d'ann√©e. Il faudrait essayer et voir si le RPI supporte une telle pr√©cision.
Bien vu pour le CSV ! On pourrait aussi enregistrer en binaire pour diviser encore par 8 ... mais ça devient incompatible avec GNU Plot.

Pour le filtrage, tu proposes d'ignorer les √©tats < 200√Ļs, mais tu dis que 100√Ļ √©chantillonnage c'est pas assez court ?
L'idée serait de détecter directement le signal utile sans devoir bidouiller le CSV, pour gagner du temps, et éventuellement pour interfacer ça avec le bouton d'apprentissage de domoticz par exemple. J'ai pas essayé mais je me dis que le bruit produit une tension moindre qu'un signal proche, du coup en récupérant la valeur de tension sur le PIN GPIO (et pas juste la présence ou non de tension) et en faisant un seuillage, on pourrait virer tout ce qui ne provient pas de la télécommande. Suffirait ensuite d'enregistrer qu'à partir du premier 1 jusqu'à la dernière longue répétition de 0.
cha
Membre Actif
 
Messages: 13
Inscription: 12 Juil 2014, 19:03

Re: [TUTO] RFXCom du pauvre sur RPI pour prises radio

Messagede cha » 03 D√©c 2014, 21:28

J'ai précisé dans le tuto mais le même principe pourrait être utilisé pour les télécommandes, signaux infrarouge. Suffirait de remplacer le kit RF par une LED infrarouge pour l'émission (supportant 38khz), et un TSOP4838 pour la réception, et augmenter la durée échantillonnage pour le 38Khz (et voir si le programme / Linux supporte bien cette fréquence, à cause du fait que c'est pas temps réel)
cha
Membre Actif
 
Messages: 13
Inscription: 12 Juil 2014, 19:03

Re: [TUTO] RFXCom du pauvre sur RPI pour prises radio

Messagede Zescientist » 03 D√©c 2014, 21:48

Le RPI devrait supporter un taux d'échantillonnages plus rapide, mais il faudra peut-être revoir le code (avec des interruptions?).

Plut√īt que du binaire, on pourrait utiliser de l'hexa. Je pense que GNU Plot le g√®re √ßa.

En fait, si on part sur une base d'√©chantillons de 10√Ļs, on supprimerais toutes les "p√©riodes" (pas au sens p√©riode/demi-p√©riode) o√Ļ un √©tat durerait moins de 200√Ļs, soit moins de 20 √©chantillons avec le m√™me niveau logique.
Par contre, on enregistrerait bien la "p√©riode" pendant laquelle on aurait 340√Ļs (34 √©chantillons donc) √† 0.

Le récepteur sort un signal TTL. Du coup, que ce soit du bruit ou du signal, on a toujours VCC(3,3V ou 5V) ou 0V. Pas possible le seuil analogique donc.

Oui effectivement, on pourrait le transposer à du IR ou a du RF 868Mhz aussi (EnOcean/Zwave?! Il y a des sécurités, mais si c'est qu'un code tournant c'est jouable)
Zescientist
Membre un peu timide !
 
Messages: 2
Inscription: 02 Déc 2014, 22:27

Re: [TUTO] RFXCom du pauvre sur RPI pour prises radio

Messagede Xavier14 » 14 D√©c 2014, 22:52

bonsoir et merci !
Gr√Ęce √† ce tutoriel, toutes mes t√©l√©commandes exotiques (non Chacon) fonctionnent, prises, portail, sonnette.
J'utilise le récepteur préconisé mais pour l'émetteur j'ai choisi un modèle plus performant pour gagner en porté et la différence est nette !

Petit bémol, la commande Emetteur fonctionne en mode console, mais pas avec Domoticz.

Mes autres scripts fonctionnent, notamment celui de idleman (radioEmission), mais pas Emetteur, je trouve dans les logs le message suivant :
"Error: Error executing script command (/home/pi/rxtx/Emetteur). returned: 35584"
Je n'ai pas trouvé d'information précise sur ce message d'erreur.
J'ai tenté de modifier les droits, recompilé, réinstallé, mais rien à faire.
Merci pour votre aide
Xavier14
Membre un peu timide !
 
Messages: 1
Inscription: 14 Déc 2014, 22:28

Re: [TUTO] RFXCom du pauvre sur RPI pour prises radio

Messagede cha » 15 D√©c 2014, 13:49

On dirait un segfault. Il me semble que j'avais eu un problème de droits, pour lancer Emetteur par domoticz, quand je lançais domoticz en ligne de commande et pas en tant que service. Peut être une piste ?
Il y a à la fois les droits chmod mais peut être aussi le groupe et le propriétaire du binaire Emetteur.
cha
Membre Actif
 
Messages: 13
Inscription: 12 Juil 2014, 19:03

Re: [TUTO] RFXCom du pauvre sur RPI pour prises radio

Messagede cha » 09 F√©v 2015, 16:58

J'ai tenté avec de l'infrarouge et ça ne fonctionne pas, même en raccourcissant les timings.
L'idée que j'ai en tête serait qu'il manque la modulation. C'est cette page qui me fait dire ça : http://www.sbprojects.com/knowledge/ir/sirc.php
Sur du 433 c'est le module qui la fait, mais ici, on est directement sur l'émetteur sans aucune électronique faisant la modulation.
Pensez vous que j'ai juste ?
cha
Membre Actif
 
Messages: 13
Inscription: 12 Juil 2014, 19:03

Re: [TUTO] RFXCom du pauvre sur RPI pour prises radio

Messagede fran√ßois ROLAND » 15 F√©v 2015, 20:37

Excellent tuto que je viens de suivre

Il va m'aider pour pas mal de systemes 433Mhz ( portail, prises, ....)

Quelqu'un a t il déjà essayé avec une télécommande somfy RTS,

Ce protocole est en 433, mais a la réputation d'être complexé

Peut être avec un échantillonnage plus fin?

Je suis preneur d'idées
françois ROLAND
Membre Actif
 
Messages: 22
Inscription: 26 Ao√Ľ 2014, 15:03

Re: [TUTO] RFXCom du pauvre sur RPI pour prises radio

Messagede fran√ßois ROLAND » 15 F√©v 2015, 21:14

Encore moi

Je viens de tester avec la télécommande de ma hotte aspirante

J'obtiens bien des 0 et des 1 dans le fichier csv mais cela ne fonctionne pas (alors que cela fonctionne avec les prises commandées

Comme la hotte est récente, je me suis dis que c'était peut être un problème d'échantillonnage

Comment faire pour r√©duire ce 100√Ļs a 10√Ļs?

Suffit il de changer ce rimer (ou est il) dans le fichier Ç et de faire un "make" après?
françois ROLAND
Membre Actif
 
Messages: 22
Inscription: 26 Ao√Ľ 2014, 15:03

Suivante

Retourner vers Raspberry Pi

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités

Copyright © 2011 - Touteladomotique.com - Tous droits r√©serv√©s
Les blogs partenaires : Abavala, Domo-Blog, Domotique34, Maison et Domotique


cron