Lorsque nous avons conçu le Yocto-SDI12, nous l'avons destiné à collecter les données de capteurs SDI-12, soit en les interrogeant explicitement, soit en surveillant l'activité d'un enregistreur existant. Ce module n'était donc pas prévu à la base pour se comporter comme un capteur SDI-12. Mais comme comme un client nous l'a demandé, nous avons maintenant ajouté au Yocto-SDI12 cette nouvelle possibilité.
Pour être franc, utiliser une interface USB pour construire un capteur qui communique en SDI-12 n'est a priori pas la manière la plus efficace de procéder, surtout en terme de consommation d'énergie. Par contre, si vous devez construire un système pour tester une infrastructure SDI-12, ça devient intéressant de disposer d'une interface SDI-12 pilotable par USB qui puisse se comporter comme un capteur.
Problématique et solution
Le protocole SDI-12 est basé sur des machines à états avec des timings assez précis, car il doit gérer la coexistence de plusieurs capteurs et la communication bidirectionnelle sur un seul fil de donnée. C'est précisément la raison pour laquelle le comportement de base du Yocto-SDI12 ne lui permet pas de répondre comme un client: il est programmé pour éviter d'envoyer des messages qui entreraient en collision avec un capteur qui répond au master. Par ailleurs, le Yocto-SDI12 vérifie aussi que toute commande transmise reçoit une réponse, et la retransmet si nécessaire. Or si l'on doit envoyer une réponse en tant que capteur, il n'est pas permis de faire une retransmission avant la demande du maître.
La solution consiste donc à indiquer explicitement au Yocto-SDI12 à l'aide d'un caractère spécial qu'un message doit être transmis tel quel, en tant que nœud client. Ce caractère devant préfixer tout message client est le circonflexe (^). Nous avons choisi ce caractère car il ne fait pas partie des codes d'adresse valable en SDI-12, et il ne peut donc jamais se trouver au début d'un message envoyé par le maître.
Exemple
Supposons que vous désirez émuler un capteur SDI-12 qui répond à l'adresse 3 et donne son identification.
Lorsque vous recevez la requête
3I!
il vous suffit d'utiliser le code suivant pour envoyer une réponse valide:
Le caractère ^ ne sera pas envoyé, mais assure que la réponse soit envoyée telle quelle sur le bus SDI-12. Un petit temps de latence de 9ms au minimum après le dernier message reçu est garanti avant l'envoi du message, pour assurer que le maître ait eu le temps de désactiver son circuit de transmission.
Emulation autonome
Il est même possible de configurer un job directement sur le Yocto-SDI12 pour émuler un capteur SDI-12 sans devoir le piloter par un programme. Créez simplement un job contenant une ou plusieurs tâches, chacune pour gérer un message. Par exemple:
- Tâche "address query": expect "?!"
writeLine "^3" - Tâche "acknowledge active": expect "3!"
writeLine "^3" - Tâche "send identification": expect "3I!"
writeLine "^3I14Acme_incPseudo777" - Tâche "send measurement": expect "3M!"
writeLine "^30012" - Tâche "send data": expect "3D0!"
writeLine "^3+3.14-2.71"
Et voilà, le tour est joué !
Pour utilisez cette nouvelle fonctionnalité, n'oubliez pas de commencer par mettre à jour votre Yocto-SDI12 au firmware 63221 ou tout autre plus récent.