Construire une résistance variable digitale

Construire une résistance variable digitale

On nous demande de temps en temps si Yoctopuce n'aurait pas envie de créer un potentiomètre digital USB. La réponse est non, parce que le produit qui en résulterait serait probablement trop limité pour être intéressant. En revanche on peut vous expliquer comment fabriquer une résistance variable digitale à l'aide de quelques relais et d'une poignée de résistances.



Le problème des potentiomètres digitaux

Bien sûr, il existe des potentiomètres digitaux sous forme de composants électroniques qu'il nous serait très facile d'interfacer pour faire un potentiomètre digital contrôlable par USB. Mais si on y regarde de plus près, on se rend compte que ces composants sont extrêmement limités: il ne supportent pas plus de quelques mA, et ne supportent généralement pas une tension plus haute que celle de leur alimentation, soit quelques volts. De plus ces composants ne sont pas isolés: la partie commande n'est pas électriquement isolée de la partie résistance. Ces composants sont donc loin d'offrir le même éventail d'applications que leur équivalent mécaniques. C'est pourquoi, chez Yoctopuce, on pense qu'il n'est pas très raisonnable d'essayer de fabriquer un produit générique basé sur ces chips.

Un potentiometre digital et un mécanique: les deux ne sont absolument pas interchangeable
Un potentiometre digital et un mécanique: les deux ne sont absolument pas interchangeable


Alternative DIY

Il y a donc peu de chance de voir un jour un potentiomètre digital Yoctopuce. Cependant il est relativement facile de se fabriquer une résistance variable pilotée par USB à l'aide de quelques relais et de résistances bien choisies.

Le principe

Le principe consiste à utiliser le fait que n'importe quel entier positif peut être décomposé en une somme de puissance de deux, toutes différentes. Par exemple:


42 = 2 + 8 + 32 = 21 + 23 + 25


Sachant que les valeurs de résistances montées en série s'ajoutent, si on construit un chapelet de n résistances dont chaque valeur est une puissance de 2, et qu'on trouve un moyen de neutraliser les éléments dont on n'a pas besoin, alors on peut simuler n'importe quelle résistance entre 0 et 2n-1. Le moyen le plus simple de neutraliser une résistance est de la court-circuiter, l'aide d'un relais par exemple:

Le principe de notre résistance variable digitale
Le principe de notre résistance variable digitale



Il est donc archi-facile de créer sa propre résistance variable contrôlable à l'aide d'une poignée résistances des plus ordinaires et de quelques relais. Ça tombe bien, Yoctopuce vend justement des relais :-)

Quelques relais, une poignée de résistances, et le tour est joué
Quelques relais, une poignée de résistances, et le tour est joué



Réalisation

On a choisi de construire un système capable de simuler une résistance de 0 à 10230Ω par pas de 10Ω. Il nous fallait donc des résistances de 10,20,40,80Ω... La théorie est archi-simple, en revanche la pratique est un peu plus compliquée: il est probablement possible de trouver des résistances dont la valeur soit exactement des multiples de puissance de 2, mais ce n'est pas très courant. On s'est donc rabattu sur des combinaisons de valeurs plus faciles à trouver. On a choisi des résistances 1W à 2%, on a essayé de se limiter à un maximum de deux résistantes en série pour chaque valeur afin de ne pas trop compliquer la construction. On n'arrive pas toujours à obtenir exactement la valeur voulue, mais tant que l'erreur reste en dessous de la tolérance des résistances utilisées, ce n'est pas trop grave.

valeur désirée (Ω)combinaisonvaleur obtenue (Ω)
101010
2010+1020
4039+140
8068+1280
160150+10160
320270+47317
640560+82642
12801.2K+821282
25602.2K+330+392569
51204.7K+390+395129


On a choisi d'utiliser deux Yocto-MaxiPowerRelay. Le câblage est relativement simple, il suffit d'entrer et de sortir de chaque relais. L'ordre de câblage n'a en théorie pas d'importance, mais il est préférable d'alterner entre chaque relais, ainsi les requêtes de mise à jour des relais seront entrelacées, ce qui et légèrement plus rapide que de mettre à jour tous les relais d'un module, puis tous les relais du second.

le schéma de câblage
le schéma de câblage



La même chose, en vrai.
La même chose, en vrai.



Le software de contrôle

La partie software est quasiment triviale, il suffit de décomposer un entier donné en paramètre en une liste de puissance de deux et d'activer ou non les relais correspondants. Afin de simplifier la programmation on a donné à chaque relais un numéro correspondant au bit qu'il contrôle: 0 pour 10Ω 1 pour 20Ω 2 pour 40Ω etc... Voici le code de gestion en python, mais on aurait faire la même chose dans n'importe quel autre langage

import os,sys
from yocto_relay import *

bitcount = 10
factor   = 10.0
maxvalue = factor*((1<<bitcount)-1)

# check parameters
if len(sys.argv)<2 :
    scriptname = os.path.basename(sys.argv[0])
    sys.exit("usage:" + scriptname + " value (0.."+str(maxvalue)+")")
value= int(sys.argv[1])

if value>maxvalue:
   sys.exit("maxvalue is "+str(maxvalue))

# Setup the API to use local USB devices
errmsg=YRefParam()
if YAPI.RegisterHub("usb", errmsg)!= YAPI.SUCCESS:
    sys.exit("init error"+errmsg.value)

value= int(value/factor)

# check for relays presence,
relays = []
for i in range(0,bitcount):
  relays.append(YRelay.FindRelay(str(1<<i)))
  if not(relays[i].isOnline): sys.exit("cannot find any relay called "+str(1<<i))

# set relays
for i in range(0,bitcount):
  if  value & (1<<i):
    relays[i].set_state(YRelay.STATE_A)
  else:
    relays[i].set_state(YRelay.STATE_B)

sys.exit("done")



Voici une petite vidéo du système en action

  



Limitations et améliorations

On vient de voir qu'il est plutôt facile de créer une résistance variable contrôlable par USB, mais attention ce n'est pas magique non plus, il y a quelques limitations qu'il faut bien comprendre

  • Il s'agit d'une résistance variable avec deux pôles, ce qui n'est pas strictement équivalent à un potentiomètre qui a trois pôles qui permettent de faire des ponts diviseurs.
  • La mise à jour des relais n'est pas instantanée, ce qui signifie que la valeur de la résistance peut transiter par des valeurs non voulues pendant les quelques millisecondes que dure la mise à jour.
  • Même si il est possible de configurer les relais pour qu'il prennent un état par défaut à la mise sous tension, ils vont tous retourner à leur position de repos à la mise hors tension, soit dans notre cas, une valeur de ~10KΩ.
  • Comme on utilise des relais electro-mécaniques la consommation totale du système peut être significative: ici maintenir une résistance de 0Ω nous coute environ 450mA.


Il est possible d'améliorer le concept en utilisant des trimmers à la place de chaque résistance, il suffira des les régler une bonne fois pour toute sur des valeurs qui soient exactement des puissances de 2 et on obtiendra une bien meilleure précision au prix d'une petite baisse de puissance admissible.

on peut utiliser des trimmers à la place des résistances
on peut utiliser des trimmers à la place des résistances



Le code qu'on a écrit est extrêmement simple, il est possible de l'améliorer afin qu'il limite au mieux l'effet des valeurs de transition pendant une mise à jour. Il est aussi possible de l'améliorer pour qu'il tienne compte de l'imprécision des résistances choisies.

Conclusion

Il est peu probable que Yoctopuce produise un jour des potentiomètres digitaux, mais si vous n'avez pas peur de vous retrouver avec un bricolage peu esthétique et somme toute assez cher, il est plutôt aisé de se fabriquer une résistance variable contrôlable par USB.

Commenter aucun commentaire Retour au blog












Yoctopuce, get your stuff connected.