Bonjour à tous et merci pour vos commentaires !
peyo a écrit :….
Pourrais-tu nous en dire un peu plus sur la manière dont tu as procédé pour remplacer le Multi Prop par l'Arduino (au niveau du programme notamment)?
En particulier quelle est la forme des signaux en entrée du MultiProp, en provenance du récepteur? S'agit-il d'un PWM classique? Mais dans ce cas comment gérer "l'adressage"?
…..
Merci d'avance!
Peyo
Pour répondre à Peyo, je dois reconnaitre que je me suis inspiré de ce que notre ami Stephd a posté il y a déjà quelques temps ici :
viewtopic.php?f=10&t=2956
Mais je vais développer un peu, car cela peut donner des idées, tout en démystifiant un peu la chose !
Petit rappel sur le codage standard de nos radios : chaque voie est codée sous la forme d’un créneau dont la durée varie de 1 à 2 ms en fonction de la position des manches, la position « neutre » générant un créneau de 1,5 ms. L’émetteur range les voies l’une derrière l’autre, en commençant par la voie 1 et en finissant par la 8eme (ou la 4eme dans le cas d’une radio 4 voies…), pour former un train comptant au maximum 8 créneaux, toujours suivis d’un « silence » d’environ 4 ms.
Ensuite, il recommence le cycle au début, de telle sorte que le temps séparant le début de 2 trains est de l’ordre de 20 ms. En conséquence, le message envoyé par l’émetteur se répète toute les 20 ms, chaque voie étant scrutée et codée à chaque cycle.
Au niveau de la réception, c’est le « silence » de 4 ms qui permet de détecter le début du message et de synchroniser le décodage ; il ne reste plus alors qu’à aiguiller chaque voie au fur et à mesure de leur arrivée vers une sortie distincte du récepteur sur laquelle on vient brancher un servo, qui est donc « rafraichi » au rythme du train reçu, à savoir toute les 20 ms.
Bien sûr, dans le cas d’une radio 4 voies, le silence est plus long, à savoir environ 12 ms de façon à respecter le rythme de 20 ms.
Voyons maintenant comment cela se passe avec un module « Multi ».
Il y a déjà un point important à connaitre : au niveau de l’émetteur, les cartes de codage « Muliti-Prop » 4 inters + 4 potentiomètres et « Multi-Switch » 6 inters + 2 potentiomètres, ou « Multi-Switch 16 » sont rigoureusement identiques ! Pour s’en convaincre, il suffit de les regarder et on constate que le circuit est prévu pour recevoir des interrupteurs à la place des potentiomètres !
Et pour cause !
Elles codent les signaux de la même manière, à savoir,
un train de 8 créneaux « standards » rangés dans l’ordre, de la voie « multi n° 1 » à la voie « multi n°8 », à raison d’une « voie Multi » par cycle de 20 ms.
La seule différence entre un interrupteur à 3 positions et un potentiomètre est que le 1er ne connait que les positions 1 ms quant il est poussé vers l’avant, 1,5 ms au neutre et 2 ms quant il est tiré vers l’arrière, alors que le potentiomètre fait varier la valeur de façon continue d’une extrême à l’autre.
A noter qu’un interrupteur raccordé sur une voie « classique » à la place d’un manche produit exactement le même effet !
La carte se contente donc de mettre bout à bout les 8 créneaux générés par les commandes du module « Multi », en y ajoutant un créneau « non conforme » de 0,940 ms qui va servir au niveau du décodeur à reconnaitre le début du train,
le tout au rythme d’une « commande Multi » par cycle de 20 ms.
Ce qui veut dire qu’à la réception, le décodeur « Multi » attend de voir arriver le créneau « non conforme » de 0,940 ms qui lui permet de se synchroniser pour décoder ensuite le 1er créneau du cycle, qui arrive 20 ms plus tard.
Lorsque ce créneau arrive, il est orienté vers la 1ere sortie du décodeur « Multi » puis, 20 ms plus tard, lors de la réception du cycle suivant, le créneau reçu est envoyé vers la 2eme sortie du décodeur et ainsi de suite jusqu’au 8eme créneau.
Ensuite, le décodeur attend le créneau « non conforme » de 0,940 ms suivant, pour recommencer un nouveau cycle.
Donc, chaque sortie du décodeur « Multi » est mise à jour tous les 9 cycles (8 cycles pour 8 voies + 1 cycle de synchronisation) soit 9 X 20 ms = 180 ms. Voilà pourquoi les voies issues des modules « Multi » sont plus lentes que les voies « normale » !
Voyons maintenant comment traiter le problème avec une carte ARDUINO.
La fonction «
pulseIn() » répond tout à fait à l’objectif à atteindre : elle scrute une entrée de la carte jusqu’à voir un passage de l’état bas à l’état haut, par exemple, et nous donne une valeur exprimée en µsecondes du temps écoulé entre les deux changements d’état, ce qui correspond à la largeur du créneau, avec la possibilité de limiter dans le temps cette scrutation, ce qui s’avère utile en cas de perte radio !
Car si au bout de 30 ms par exemple (soit 1,5 cycles), on n’a pas détecté le créneau attendu, c’est qu’il y a un problème et on décide alors de mettre le système en position de sécurité, en coupant, par exemple, l’alimentation de certains équipements afin d’éviter des problèmes plus sérieux !
Dans le programme que j’ai développé, il y a deux boucles distinctes qui utilisent cette fonction.
Dans la 1ere boucle, on attend le début du tout 1er cycle : c’est celui qu’on doit détecter après la mise en marche de la radio ou après une anomalie de réception (perte de portée, parasite….).
Chaque créneau reçu est « mesuré » par comparaison avec la valeur de 940 µs : quant la valeur reçue est « <= » à 940, c’est qu’il s’agit du créneau de synchronisation et on valide le début du cycle ; on attend ensuite dans une « sous-boucle » les 8 créneaux suivant, que l’on compare individuellement aux valeurs extrêmes possibles, à savoir 1 ms minimum et 2 ms maximum (avec, bien sûr, une petite marge de sécurité !)
Là, il y a 2 cas possibles :
- Soit 1 des créneaux reçus est en dehors des valeurs mini – Maxi, ce qui s’apparente à une réception parasité : on revient alors à la boucle de détection du créneau de synchro.
- Soit les 8 créneaux reçus sont conformes : dans ce cas, on sort de cette boucle, en positionnant un « drapeau » qui signale la bonne réception du 1er cycle. Ce « drapeau » est une simple case mémoire pour laquelle on définit deux états distincts, liés au déroulement du programme : soit tout va bien et on le met à « 1 », soit il y a un problème, et on le met à « 0 ». Il peut ensuite être utilisé ailleurs dans le programme.
La deuxième boucle reprend la structure de la 1ere,
mais avec le rangement des valeurs de chaque créneau reçu dans un tableau de données au fur et à mesure de leur arrivée , à condition, bien sûr, qu’ils soient conformes, pour qu’ils puissent être utilisée dans une autre partie du programme.
Car si un créneau reçu n’est pas conforme, ou si le temps impartit à la fonction « pulseIn() » est dépassé, c’est qu’il y a un problème de réception ; le « drapeau » de 1er cycle est remis à « 0 » et on retourne à la 1ere boucle du programme.
Comme il se passe 20 ms entre chaque détection d’un créneau, on a le temps de faire autre chose !
Dans le cas présent, on rafraichit les 8 sorties correspondantes aux 8 voies « Multi » avec les valeurs précédemment rangées dans le tableau, ce qui permet aux servos de fonctionner correctement.
Pour piloter 1 servo, il suffit de positionner à « 1 » la sortie concernée, ce qui correspond au début du créneau, d’attendre le temps égal à la durée du créneau reçu à l’aide de la fonction «
delayMicroseconds() », puis repositionner la sortie à « 0 », ce qui marque la fin du créneau.
Mais attention !
Tant que le 1er cycle correct n’est pas intégralement reçu, les valeurs rangées dans le tableau peuvent être incohérentes et poser un problème au servo correspondant !
Pour éviter ce souci, j’utilise un second drapeau qui est positionné à « 1 » lorsque le cycle reçu est complet et remis à « 0 » en cas de problème de décodage.
Ensuite, dans une autre partie du programme, j’utilise ce drapeau pour activer ou désactiver la sortie qui pilote l’alimentation 6 Volts des servos !
Voilà globalement la structure du programme de mon ARDUINO ; il y a en plus quelques bidouilles de mise en forme des créneaux, entre autre la limitation des courses des servos de largages des mines et l’inversion de sens pour deux d’entre eux, ainsi que la prise en compte des 4 entrées d’autorisation de largage qui, lorsqu’elles ne sont pas valides, forcent la durée du créneau de commande du servo correspondant à « 0 » (il n’y a donc pas de créneau généré en sortie) et coupe en même temps l’alimentation du servo concerné (économie d’énergie oblige !)
Maintenant, vous savez presque tout sur le programme ARDUINO de décodage « Multi-Prop » !
Et on peut facilement extrapoler ce programme pour un décodage « Multi-Switch » !
Il suffit simplement de comparer la durée des créneaux reçus avec des seuils mini et Maxi correspondants aux 3 positions d’un interrupteur pour activer ou non des sorties de la carte, sur lesquelles on vat brancher des lampes, des relais, des motoréducteurs…
Par exemple, si la durée du créneau reçu est « > » à 1900 µs, cela correspond à un inter en position « tirée » (2000 µs), on met donc à « 1 » une sortie qui va, par exemple, allumer une lampe, et on met cette sortie à « 0 » si le test est faut, c'est-à-dire si la durée est « < » à 1900 µs, ce qui est le cas lorsque l’inter est à la position « neutre » (1500 µs) ou en position « poussée » (1000 µs).
Donc, avec les tests qui vont bien, on peut activer ou désactiver 2 autres sorties en exploitant les 2 autres positions de l’inter !
Pas mal quand même, non ??
Cordialement de Jacky-Soum