[RESOLU] Relais 5V pour signal servo (ex-Recopier l'état d'un PIN en temps réel)

Bonjour,

Est-il possible de "connecter" virtuelement une PIN d'entrée directement sur une PIN sortie, afin que la sortie soit une parfaite recopie de la PIN d'entrée en temps réel ?

J'aimerai développer un AutoPilot pour avion radio-commandés, mais quand il n'est pas activé, il doit simplement reproduire en temps réel le signal servo qu'il a en entrée, vers une sortie.

Sev
:wink:

EDIT : Ce post est une des questions de mon projet d'Autopilot pour avion RC

Bonjour,
Pas de "connexion" possible à ma connaissance et recopier du PWM en temps réel me semble hors de portée de l'Arduino.
Je pense qu'il vaudrait mieux passer par un by-pass externe à transistor ou autre, via une pin de commande.

En tout cas je suis assez intéressé par ton projet (j'ai quelques modèles réduits que je fais voler de temps en temps).

Oui un vrai bypass serait interressant, mais il faudrait capter le signal quand-même.

J'avais imaginé dans ma caboche de non-electronicien, de commander des relais en sortie d'un registre à décalage, comme ça , on ne prend qu'une voie de l'arduino pour "commuter" les 4 servos...

Pour mon projet, je veux bien l'exposer quelque part, en Français mais ou ?

Pour l'instant il est partiellement ici & en anglais :

Sev

Utiliser un relai pour des trames de servo qui si j'ai bonne mémoire durent dans les 20ms (quoique c'est peut-être pour toutes les voies), c'est pas vraiment envisageable.

Ce qu'il te faudrait c'est sortir le signal PWM de ta télécommande (via la prise de double-commande) ou via un récepteur HF (le signal à destination des servos) si tu te places côté réception, et l'envoyer à l'Arduino. J'ai d'ailleurs l'impression que tu te places côté récepteur?

Là t'as un by-pass à transistor qui soit renvoie ce signal sans traitement vers sa destination, soit le modifie au passage.

Je crois que c'est un peu sur ce principe que fonctionnent les gyroscopes pour hélico R/C par exemple.

J'ai un projet dans les cartons (à long terme car j'ai d'autres trucs en cours), qui vise à commander un avion R/C depuis un simulateur de vol via un Arduino. Il ne s'agit pas de le faire voler, mais de faire bouger ses gouvernes ainsi qu'une plateforme à 2 degrés de rotation sur laquelle il serait posé, à but éducatif.

Bonjour,

patg_:
Pas de "connexion" possible à ma connaissance et recopier du PWM en temps réel me semble hors de portée de l'Arduino.
Je pense qu'il vaudrait mieux passer par un by-pass externe à transistor ou autre, via une pin de commande.

+1
Pas de possibilité hardware de connecter en temps réel une broche à une autre.
Ce genre de chose est possible avec un FPGA ou un cpu ARM (-> DMA) mais pas sur une carte arduino.

La solution la plus viable est de faire un montage à base de transistor, ou mieux de mosfet, qui permettrai de relier ou non les deux broches.

Sinon une autre solution pourrait être d'utiliser un commutateur analogique.
Exemple avec un CD4067 : [Test] Analog Mux 4067 (16 canaux) | Skyduino - Le DIY à la française

Je détaille en image ce que j'entendais par des relais commandé par un registre à décalage :

Dans cette exemple, la PIN4 serait connecté à un registre à décalage, qui piloterait des "relais", pour commuter entre l'arrivée directe du récepteur (pilotage manuel) et les sorties de l'arduino (pilote automatique).

Est-ce électroniquement réalisable ?

Sev

EDIT : Skywodd, le commutateur analogique ne sera pas adapté, car le signal servo est un pseudo PWM

UniseV:
Est-ce électroniquement réalisable ?

Avec 4 mosfet ça se fait sans probléme, pas besoin de relais :wink:
Exemple : http://www.electronics-tutorials.ws/transistor/tran_7.html (tout en bas, le moteur -> ton signal vers les servo, V+ V- -> tes deux signaux sources)

UniseV:
EDIT : Skywodd, le commutateur analogique ne sera pas adapté, car le signal servo est un pseudo PWM

Et alors ? Un signal numérique (PWM ou autre) n'est rien d'autre qu'un signal analogique avec seulement deux états :wink:

UniseV, le schéma est tout à fait réalisable avec des commutateurs analogiques comme indiqué par skywodd, du moins si les courants traversants les inverseurs ne dépassent pas quelques mA (signal servo sans doute OK)

Dans la famille 4051, 4052, 4053, 4066 ou 4067 le CD4053 ou HC4053 est tout indiqué avec ses 3 inverseurs gérables individuellement et permettrai sans aucune difficulté de reproduire fonctionnellement ton schéma.... pour un coût modique ! http://www.gotronic.fr/art-74hc4053-10119.htm
Dans ton cas il suffit de relier les 3 entrées A,B et C (pins 9, 10 et 11) pour inverser globalement les 3 inverseurs.
A,B et C à zéro -> ce sont les entrées x qui sont séléctionnées
A,B, et C à un, ce sont les entrées y qui sont sélectionnées

L'idée de registre à décalage par contre est surprenante, ou alors tu n'as pas tout dit ! ça ne parait pas du tout nécessaire pour piloter les inverseurs

4053.png

commande simultanée3 inverseurs.png

triple inverseur.png

skywodd:

UniseV:
Est-ce électroniquement réalisable ?

Avec 4 mosfet ça se fait sans probléme, pas besoin de relais :wink:
Exemple : http://www.electronics-tutorials.ws/transistor/tran_7.html (tout en bas, le moteur -> ton signal vers les servo, V+ V- -> tes deux signaux sources)

Ok, je vois bien l'exemple du moteur, il me reste à savoir si je peux bien mettre ce genre de circuit derrière le registre à décalage de mon kit snootlab, dans ce cas, 1 seul OUTPUT de mon Arduino pourrait commuter plusieurs servos.

mosfet ça veut bien dire transistor ?

Peut-être que je pourrais utiliser d'autres composants de mon kit snootlab du coup :
http://shop.snootlab.com/shields-snootlab/90-snootlab-starter-kit.html
Toutes ces petites puces grises m'intriguent... je ne connaissais que LED, resistances, switch et servo...

skywodd:

UniseV:
EDIT : Skywodd, le commutateur analogique ne sera pas adapté, car le signal servo est un pseudo PWM

Et alors ? Un signal numérique (PWM ou autre) n'est rien d'autre qu'un signal analogique avec seulement deux états :wink:

Ce que je voulais dire, c'est que le commutateur analogique ne me parait pas adapté car je ne veux pas multiplexer dans le temps (vu que le signal servo se mesure dans le temps), pour moi c'est juste une fonction relais que je cherche (et je ne parle pas du composant).

Utiliser un MUX 16 voies pour basculer 2 voies de temps en temps ça me parait un peu similaire à utiliser un bazooka pour tuer une mouche... :slight_smile:

al1fch:
L'idée de registre à décalage par contre est surprenante, ou alors tu n'as pas tout dit ! ça ne parait pas du tout nécessaire pour piloter les inverseurs

L'idée du registre à décalage, c'était de piloter plusieurs circuit "inverseur" avec 1 PIN de l'arduino, dans mon exemple il n'y a que 2 sorties et 4 entrées, mais il pourrait y en avoir le double, mais je réalise en écrivant, qu'il faudrait plus de PIN que ce que j'avai imaginé pour alimenter le registre(4 PIN je crois...)... donc pour 2 inverseurs c'est pas interressant.

Effectivement ce que tu proposes a l'air tout à fait adapté !

Sev

Pourquoi ne pas utiliser la grande base de toute structure logique, le truc logique en soi : une porte logique. Comme son nom l'indique, c'est une porte... Je partirais sur un simple ampli ligne à sortie 3 états. genre des amplis bidirectionnels 8 bits 74HC243, 245, 645, 623, 449... ce sont vraiment les circuits les mieux placés, non? soit on les passe en ampli, soit on les désactive, ça ne demande qu'une pin d'arduino... Je propose du 74HC, car j'ai peur que la norme TTL seule ne soit pas assez restrictive pour conserver des signaux corrects

Les mux analogiques n'ont pas une bande passante assez large pour passer un signal servo (c'est un signal carré, donc avec un spectre plutôt large).

Pourquoi faire simple quand on peut faire compliqué?

@SuperCinci
Bande Passante : avec un 74C4053 on peut compter sur plusieurs dizaines de MHz dans un contact établi. (120MHZ sur un pdf). C'est tout à fait suffisant pour transmettre sans déformation perceptible un signal servo. (fondemental à 500Hz à tout casser, il faut aller très loin dans les harmoniques pour constater celles qui ne passent pas !)
Le basculement des inverseurs est , lui, un peut plus long , mais UniseV ne cherche pas à faire du multiplexage à fréquence élevée, mais juste à commuter de temps à autre...

BP HC4053.png

al1fch:
@SuperCinci
(...) mais UniseV ne cherche pas à faire du multiplexage à fréquence élevée, mais juste à commuter de temps à autre...

Justement, alors pourquoi ne pas utiliser un composant spécialement prévu pour comme un ampli ligne (qui n'est autre qu'une porte ET) : le signal sur une entrée, la commande sur la pin "OE", si la commande est à "1", le signal servo se retrouve en sortie, si la commande est à "0", la sortie est "en l'air"... exactement le même fonctionnement qu'un relais, mais bien moins cher... et avec une seule pin de commande, on peut gérer 8 voies. on peut aussi imaginer un multiplexeur logique 4 x 2=>1, avec en entrée An le signal servo(n) et en Bn les sorties "servo" de l'arduino, la sortie du Mux Yn irait ensuite vers l'émetteur. avec un simple bit, on choisit d'envoyer soit les commandes originelles, soit les commandes "arduino".

Je ne vois vraiment pas l'intérêt d'utiliser un mux analogique ici, ça n'a aucun sens!

Bonjour SuperCinci

Alors va pour un 74HC157, quadruple multiplexeur numérique 2 vers 1 qui, je comprend tout à fait, représente la réponse 'normale' au problème posé par UniseV !
http://etronics.free.fr/dossiers/num/num20/multiple.htm
(Dans le contexte les signaux numériques à commuter passeraient, sans être défigurés, à travers un HC4053. Solution acceptable à mon avis , sinon idéale)

Bonjour,

Tout d'abord, merci pour vos réponses et votre implication, l'inconvénient du mux numérique, c'est que je ne peux basculer les canaux que tous ensembles, et il me parait étrange de traiter le signal servo comme un signal numérique... alors que c'est son "timing analogique" qui est important.

Je partirais donc plutôt vers un HC4053... qui me semble rassembler tout ce qu'il faut.
DATASHEET : System Logic Semiconductor 84669, DS datasheet pdf
A votre avis, peut-on se permettre de ne pas connecter la broche "ENABLE" ? Doit-on dans ce cas le mettre à la masse ?

Dans le cas ou on voudrait commuter 16 entrée sur 8 sorties, alors je mettrais bien un registre à décalage (j'y tien !!), pour alimenter les "channel select input" :zipper_mouth_face: :slight_smile:

Sev

ne pas confondre temporel et analogique... l'analogique se réfère au niveau du signal en volts, et c'est tout. le temporel est le temps en secondes entre deux "états" précis. (ne me laissez pas seul à le dire, ce serait une insulte à tous les profs d'électronique qui m'ont eu en cours...) un servo a besoin d'une impulsion logique, c'est tout.

je prends l'exemple d'une liaison série : c'est du numérique (des 1 et des 0), mais le temps entre un 1 et un 0 est super important! Pourtant, on utilise toujours des circuits logiques pour faire circuler un signal série...

Une porte logique n'a rien à péter de la valeur temporelle, elle ne considère que l'amplitude su signal : 1 ou 0. Dans un circuit de commutation analogique, ton signal de servo aura des slew-rate trop importants, et les servos sont très sensibles à la forme du signal.

Il serait intéressant que quelqu'un puisse nous fournir des exemples concrets (je n'ai que ma tête pour cela), comme le spectre d'un train d'impulsions servo par exemple, car n'étant pas symétrique, ce signal a des harmoniques de fou! (donc un spectre fréquentiel très large), qu'une porte logique ne déformera pas, mais une "porte" analogique va lisser grave, modifiant ainsi le "timing analogique" dont tu parles...

Bref, j'ai donné mon avis, si tu veux rester dans l'analogique, tu reviendras tôt ou tard car ta commande servo sera bien trop déformée!

je serais aussi surpris qu'un mux analo soit moins cher qu'un mux logique... (et je le répète : avec ma solution, tu aiguilles autant de signaux logiques que tu veux avec seulement un bit...) ne perds pas ton temps avec un registre à décalage...

Pour compléter ce que dit SuperCinci, et abonder dans son sens, j'ajouterais que traiter le signal "numériquement" est fondamentalement différent que de le traiter "analogiquement".

Un traitement analogique "respecte du mieux qu'il peut" le spectre du signal (a sa capacité en bande passante près, a sa distortion harmonique prés et a son facteur de bruit prés).
Il est compréhensible de voir que quand on cascade 10 amplis de 10 Mhz de bande passante, la bande passante résultante sera à peine de quelques Mhz.

Un traitement numérique "détecte un niveau logique à partir de la comparaison d'une tension" et décide s'il a affaire à un "0" ou un "1" logique.
Les étages de sortie des portes ne sont pas linéaires et ne possèdent que deux états stables : 0V ou Vcc.
La commutation d'un état à l'autre se fait très rapidement donnant un signal carré.
Il y a donc "régénèration du signal". C'est là la différence fondamentale.

Distortion harmonique :
Quand un circuit n'est pas parfaitement linéaire, c'est à dire quand la sortie n'est l'exacte recopie de l'entrée au gain prés, il va créer de lui même des fréquences du double de celles qu'il reçoit en entrée.
L'explication se trouve dans la formule de trigonométrie sin2(2PIf)= 1/2(1+cos(2PI2f)

Facteur de bruit :
Un semiconducteur émet toujours des tensions de bruit (mouvement aléatoire des électrons, agitation d'origine thermique etc). C'est particulièrement gênant quand le niveau du signal a amplifier est trés faible comme celui qui sort d'un microphone par exemple.

Ho lala je regrette un peu de ne pouvoir vous suivre dans toutes vos reflexions... :cold_sweat:
En tout cas je vous remercie pour votre acharnement :wink:

Ce que je comprends, en vulgarisant :
A partir du moment ou je rentre dans une "puce", mon signal peut être déformé.
Je ne peux donc pas esperer un signal "linéaire", y compris dans le temps, ce que je croyais pouvoir espérer, comme d'un "relais" ou d'un "commutateur" dont le travail ne serait QUE de mettre en contact une entrée et une sortie, sans aucune altération du signal en ni dans la forme ni dans le temps.

A partir de là, vous me dite que le mux numérique ne sera pas plus déformant ou temporisant que le mux analogique... ça va comme ça ? :roll_eyes:

Sev

EDIT :

Super_Cinci:
...et je le répète : avec ma solution, tu aiguilles autant de signaux logiques que tu veux avec seulement un bit...

Oui mais je ne peux pas commander les "aiguillages" indépendamment les uns des autres si ?

Je me (re)lance...

je t'ai fait un graph pour t'expliquer comment ton signal va être transformé en passant par un module analogique :

en haut et en rouge : le signal d'origine, du bon vrai logique, qui passe à 1 à l'instant t0 (et t0') et repasse à 0 pour t1 (et t1'). il n'a rien d'analogique, le changement d'état est tellement rapide qu'il devient immédiat.

au milieu, la sortie de ton circuit analogique : l'analogique ne peut pas recopier un brutal changement de valeur de l'entrée, car son slew-rate est limité à qq dizaines voire qq centaines de µV/s selon la qualité et le prix (pente de la courbe bleue : il ne peut pas monter plus vite que ça). la ligne violette est la référence pour laquelle le circuit qui reçoit le signal (servo par exemple) va considérer si c'est un 1 ou un 0 (la courbe bleue au dessus : c'est un 1, en dessous, c'est un 0.

En bas, ce que va interpréter le servo. comme ton circuit analogique n'a pas les mêmes slew-rate en montée et en descente, la courbe marron n'est pas la même que la rouge d'origine, et surtout, t3-t2 n'est pas du tout égal à t1-t0!!! manque de bol, c'est justement la durée de l'impulsion (t3-t2) qui détermine la position du servo. Je te laisse deviner les dégâts...

Bref, si on peut se dire que t2'-t2 = t0'-t0 (temps entre deux impulsions), la durée de l'impulsion n'est pas conservée. Comme quoi, l'analogique ne conserve pas les valeurs temporelles!

Dans mon exemple, j'ai mis Vref au milieu, il faut savoir que ce n'est pas toujours le cas. imagine si Vref = 0.3 x Vcc (un tiers), alors descends la ligne violette, et imagine que l'impulsion obtenue pourrait durer beaucoup plus que celle de départ...

Un circuit logique a un temps de réponse de l'ordre de la nS (nano-seconde, 1 ns = 0.001µs), soit 10 000 à 50 000 fois plus rapide que le circuit analogique... là, ce temps de réponse devient négligeable devant la précision du servo.

il existe tout un tas de circuits répondant à tout un tas de besoins... il faut se fixer un besoin, et si le circuit n'existe pas, alors il faut modifier le besoin. C'est l'avantage de la bidouille! Dans l'industrie, on le fait fabriquer, ce circuit.

Bon courage!

Heuuu,

J'ai une question bête... les composants de mon kit snootlab sont un mystère pour moi... aucun d'eux ne pourrait-il servir de "relais" ?

Transistor de puissance x3 (Ref : TIP102)
Transistor d'usage général x3 (Ref : P2N2222AG)
Huit rangées de montage Darlington x1 (Ref : ULN2803AN)
Registre à décalage x1 (Ref : M74HC595)
Amplificateur Opérationnel x1 (Ref : LM358N)

Je partirai bien sur ce genre de montage (proposé par skywodd), avec mes P2N2222AG :
http://www.electronics-tutorials.ws/transistor/tran_7.html (Complementary MOSFET Motor Controller)

Mais le schéma montre des "Depletion-mode MOSFET"... :frowning:

Merci