Question:
Meilleur moyen d'envoyer des lectures de capteur via une simple connexion RF
mchr
2011-12-31 22:59:35 UTC
view on stackexchange narkive permalink

J'ai acheté une paire de modules simples TX / RX à 315 MHz. Je souhaite les utiliser pour connecter un ATTiny85 alimenté par batterie à une station de base Arduino. L'ATTiny doit régulièrement se réveiller et envoyer une lecture de capteur à la station de base.

En théorie, je devrais être capable d'écrire simplement des données sur le TX et de les lire à partir du module RX. Cependant, comment puis-je m'assurer que j'écris / lis au bon rythme? Quel code dois-je utiliser pour transmettre à une vitesse particulière (octets / seconde)? Quelle est la meilleure façon de corriger / détecter les erreurs?

Puisque je veux que l'émetteur soit alimenté par batterie, puis-je utiliser un transistor pour désactiver le VCC du module TX lorsqu'il est inactif. Que recevra le module RX lorsque le module TX sera mis hors tension?

Sept réponses:
#1
+10
Olin Lathrop
2011-12-31 23:31:58 UTC
view on stackexchange narkive permalink

Ces modules font que la broche du récepteur oscille en réponse à la façon dont vous pilotez la broche de l'émetteur. Ils ne savent rien de ce que vous pensez que signifie agiter la broche et ne contiennent pas d'UART. Plus de détails n'étaient pas immédiatement évidents sans creuser. C'est votre travail, donc je n'ai pas pris la peine d'aller plus loin. Vous devez fournir un lien vers la fiche technique, pas la page d'accueil du produit.

Ces modules fonctionnent sur la modulation AM. Le bref écrit dit ASK, mais il s'agit probablement simplement de la manipulation marche / arrêt de l'émetteur (qui est techniquement un sous-ensemble de ASK). Le problème avec ce schéma est que le récepteur ne peut pas connaître intrinsèquement le niveau pour lequel l'émetteur est allumé. Il examine donc très probablement les intensités récentes du signal reçu et choisit une valeur au milieu pour décider entre l'activation et la désactivation. Cela s'appelle découpage des données .

Si vous ne transmettez pas régulièrement des ons et des offs, le récepteur perd la trace des niveaux on et off et ne peut plus découper correctement les données. Ceci est généralement traité de deux manières. Tout d'abord, un préambule est envoyé. Celui-ci contient un tas d'activations et de désactivations en succession rapide afin que le récepteur puisse se fixer sur un bon seuil de découpage de données. On s'attend à ce que certains ou tous ces bits ne soient pas correctement interprétés par le récepteur, donc ne soient donc pas vraiment "reçus". La deuxième stratégie consiste à envoyer des données de sorte qu'il y ait toujours une activation et une désactivation récentes auxquelles le récepteur doit se référer. Certains récepteurs, en particulier ceux bon marché qui effectuent le découpage des données en analogique, se contentent de découper la force moyenne du signal reçu filtré passe-bas. Pour de tels récepteurs, vous devez non seulement varier fréquemment entre marche et arrêt, mais la moyenne doit être proche de 1/2 marche.

C'est pourquoi l'encodage Manchester est si populaire pour de telles liaisons RF. Je n'entrerai pas dans l'encodage de Manchester ici car c'est bien connu et vous n'aurez aucun problème à trouver beaucoup d'informations là-dessus. Une caractéristique intéressante du code manchester est qu'il est en moyenne de 1/2 sur chaque bit. Un peu est divisé en deux moitiés. On-off peut signifier 1 et off-on 0. Manchester est probablement le meilleur schéma d'encodage le plus simple à faire.

Vous pouvez utiliser un UART, mais vous devez être prudent et vous perdrez de la bande passante puissance de la batterie). Regardez ce que transmettra un UART. Si vous envoyez les caractères immédiatement les uns après les autres, chacun prendra 10 bits. Il y aura un bit de démarrage, 8 bits de données et un bit d'arrêt. Les bits de démarrage et d'arrêt sont toujours de polarité opposée. Vous pouvez prendre des dispositions pour utiliser des codes dans les 8 bits restants qui ont un nombre égal de 0 et de 1 pour maintenir le seuil du segment de données au milieu. Cela signifie que vous ne pouvez envoyer que 4 bits d'informations dans chaque caractère UART. Vous devrez également réfléchir attentivement au préambule.

En général, vous devriez supposer qu'une transmission RF a un risque significatif d'erreurs de bits. Cela signifie qu'une sorte de somme de contrôle est une bonne idée. Vous pouvez envoyer des données par paquets et inclure quelque chose comme une somme de contrôle CRC de 16 ou 20 bits avec chaque paquet. Si le paquet n'est pas reçu intact, alors il est rejeté comme si cela ne s'était jamais produit.

Le système doit également gérer le bruit aléatoire reçu lorsque l'émetteur est éteint. Dans ce cas, le seuil du récepteur baissera et il commencera à découper les données quel que soit le bruit aléatoire qu'il capte. Avec un préambule et une somme de contrôle correctement conçus, vous pouvez faire en sorte que les bruits aléatoires ressemblent à des données valides de manière extrêmement réduite.

Merci pour l'excellente réponse. Existe-t-il des exemples de code existants qui font tout cela? Il semble que la plupart / tout cela soit des choses que quiconque utilise ces modules devra résoudre - je ne suis sûrement pas le premier.
J'ai fait plusieurs fois l'encodage et le décodage de Manchester, mais chacun avait ses propres rides et est donc intégré dans le code client que je ne vais pas divulguer. Regardez autour de vous. Il est fort possible que quelqu'un ait fait cela et posté du code. Gardez à l'esprit, cependant, que ceux qui pensent que c'est une affaire assez importante pour publier du code ne sont pas ceux qui veulent du code. Parfois, vous trouvez de bonnes choses là-bas. Comme je l'ai dit, regardez autour de vous.
J'ai généralement trouvé que lorsque je trouve du code comme celui-là, il y a tellement de problèmes qui prennent tellement de temps à déboguer que j'aurais mieux fait d'écrire le mien.
@Kellenjb: Je suis d'accord. Je ne cherche même pas le code des autres. Au mieux, ce n'est pas nul, et c'est rare, mais l'intégrer dans mon projet est difficile et sujet aux erreurs s'il n'a pas été écrit dans mon environnement de développement au départ. Je mentionne de regarder autour de moi uniquement parce qu'il semble que les autres ne se sentent pas de cette façon.
@mchr Je ne l'ai pas encore utilisé personnellement, je ne peux donc pas parler de la fiabilité, mais j'ai vu le [VirtualWire] (http://www.open.com.au/mikem/arduino/VirtualWire.pdf) (note c'est un PDF malheureusement) la bibliothèque mentionnée un peu dans les discussions sur ce type de modules combinés avec Arduinos. Il semble qu'il a été écrit spécialement pour eux.
Virtual Wire sera la solution parfaite pour utiliser le module RX avec l'Arduino. Cependant, la bibliothèque VW ne semble pas fonctionner correctement avec un ATTiny85. Je pense que je vais examiner le portage / la réparation du code à exécuter sur mon ATTiny 85.
Je viens d'être lié à une bibliothèque qui prétend faire ce que je veux sur ATTiny et ATmega - http://arduino.cc/forum/index.php/topic,63755.0.html
#2
+2
mchr
2012-01-31 05:57:34 UTC
view on stackexchange narkive permalink

J'ai fini par utiliser une bibliothèque d'encodage Manchester. La dernière version de cette bibliothèque est maintenant publiée ici: https://github.com/mchr3k/arduino-libs-manchester

Des détails sur mon utilisation de cette bibliothèque peuvent être vu ici: http://mchr3k-arduino.blogspot.com/

#3
+1
vicatcu
2012-01-31 22:00:25 UTC
view on stackexchange narkive permalink

Cette question est directement traitée par les produits Wicked Node / Wicked Receiver Shield que je fabrique (divulgue) sur Wicked Device. Veuillez les vérifier. Ils constituent une liaison radio ASK unidirectionnelle à faible coût sur 433 MHz pour obtenir jusqu'à quatre lectures de capteurs analogiques (par nœud méchant) sans fil vers votre Arduino à des intervalles prescrits. J'ai utilisé un ATTiny24A plutôt qu'un ATTiny85 principalement pour les entrées analogiques supplémentaires. Le logiciel utilise largement les modes veille et le Wicked Node est conçu pour fonctionner avec une pile 9V pendant plusieurs mois.

#4
  0
Dmitry Dzhus
2012-01-09 18:02:40 UTC
view on stackexchange narkive permalink

Je recommanderais de regarder la bibliothèque VirtualWire, qui implémente la transmission RF pour les paires d'émetteur / récepteur de gamme ISM avec sortie ASK. Voir http://www.open.com.au/mikem/arduino/. Je l'ai utilisé avec succès pour collecter des données à partir de capteurs sans fil disséminés dans ma maison.

Malheureusement, la bibliothèque VirtualWire ne prend pas en charge ATTiny85.
#6
  0
David
2014-11-30 13:29:50 UTC
view on stackexchange narkive permalink

Jetez un œil ici:

https://www.sparkfun.com/datasheets/RF/KLP_Walkthrough.pdf

La plupart des réponses que vous recherchez dans le document.

Pouvez-vous ajouter quelques détails supplémentaires à partir du lien vers votre réponse?Les réponses aux liens uniquement sont découragées car elles deviennent inutiles si le lien meurt à l'avenir.
#7
  0
user69308
2015-03-10 15:54:32 UTC
view on stackexchange narkive permalink

Bien que l'affiche originale ait déjà trouvé une solution. Je vais juste ajouter quelques informations pour les personnes qui se retrouvent ici.Il existe essentiellement 2 façons établies d'envoyer des données sans fil entre arduino / Attiny: VirtualWire et Manchester. Les deux ont des bibliothèques disponibles.Virtualwire Je comprends que seul peut envoyer des caractères (bien qu'il y ait un contournement), Manchester peut envoyer des numéros.En utilisant la bibliothèque de manchester, assurez-vous que vous avez la dernière version.Virtualwire et manchester peuvent être placés dans un Attiny En ce qui concerne l'allumage ou l'extinction de l'émetteur pour économiser la batterie, je vous suggère de mettre l'Attiny en veille et, lorsqu'il se réveille, de le faire allumer l'alimentation de l'émetteur via un transistor (broche attiny à la base, faire haut, etc. ) .Il existe un exemple (probablement plus d'un) dans instructables: http://www.instructables.com/id/Attiny85-RF-Transmitter-to-Arduino-Uno-Receiver-Ma/?comments=all # CWNVMX4I6RT1A1N



Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 3.0 sous laquelle il est distribué.
Loading...