samedi 25 avril 2015

Charger Doctor: moniteur de tension et de courant pour périphérique USB


Le Charger Doctor est un petit instrument qui affiche en alternance la tension (entre 3,5 V et 7 V) et le courant (entre 0 et 3 A) qui circule dans un périphérique USB.  Sur le modèle que j'ai acheté,  l'affichage de chaque paramètre dure environ 8 secondes.   On peut maintenant s'en procurer sur eBay pour un prix ridiculement bas (le mien m'a coûté 1,5 €, livraison incluse).

L'entrée est un connecteur USB mâle de type A; il peut donc être inséré directement dans le port USB d'un ordinateur, si l'espace le permet (ce qui est loin d'être certain si les ports USB adjacents sont déjà utilisés:  un câble USB mâle/femelle de type A sera particulièrement utile ici).  La sortie est un connecteur USB femelle de type A.

Tel quel, le Charger Doctor est tout à fait approprié pour mesurer la consommation d'un Arduino branché à votre ordinateur, par exemple.

Selon le Charger Doctor, mon Uno consomme environ 70 mA.  Comme vous le voyez sur la photographie ci-dessous, la résolution n'est que de 10 mA:  ce n'est certainement pas un appareil de grande précision, mais ça peut suffire dans bien des applications.


J'allume une LED, et le courant monte à 90 mA:


La présence du Charger Doctor n'affecte aucunement la transmission des données par USB:  vous pouvez très bien téléverser un sketch dans l'Arduino pendant que le moniteur y est branché.


Supposons maintenant que je désire mesurer la consommation de mon Raspberry Pi...  Ici ça se complique un peu, car l'alimentation du Raspberry Pi est dotée d'un connecteur microUSB mâle, alors que l'entrée du Charger Doctor est un connecteur USB mâle de type A.  Je n'ai pas l'adaptateur qu'il faut!

J'ai donc construit mon propre câble USB / fiches bananes:  à une extrémité, un connecteur USB femelle de type A, qui pourra être inséré à l'entrée du Charger Doctor.  À l'autre extrémité, deux fiches bananes qui pourront s'insérer dans une source de tension de labo (dans les câbles USB, le fil noir est la masse et le fil rouge est à 5 volts; le fil vert et le fil blanc servent au transport des données, et je n'en ai pas besoin pour cette application).

 
Je peux maintenant mesurer la consommation de base de mon Raspberry Pi  (un antique modèle B) pendant qu'il est alimenté par une source de tension de labo (réglée à 5 V, bien entendu):  pas loin de 500 mA.



Finalement,  pour rendre mon Charger Doctor encore plus polyvalent, j'ai trafiqué le câble d'une vieille souris USB afin de relier la sortie du Charger Doctor à une breadboard.  Ici encore, seuls le fil noir (GND) et le fil rouge (5 V) sont utiles.


Je peux maintenant mesurer la consommation de n'importe quel circuit (pourvu que la tension se situe entre 3,5 V et 7,0 V).  L'appareil s'alimente au moyen de la tension qu'il mesure; c'est pour cette raison qu'il ne peut pas mesurer une tension inférieure à 3,5 V:  en dessous de cette valeur, l'alimentation est insuffisante.


Yves Pelletier   (Twitter, Facebook

Ajouter une sortie analogique à notre Arduino

Aujourd'hui, je vous explique comment régler une sortie de l'Arduino à n'importe quelle tension continue située entre 0 et 5 V.


Entrée analogique vs entrée numérique

Comme vous le savez sans doute, une carte Arduino comporte un certain nombre d'entrée numériques et d'entrées analogiques.  Une entrée analogique peut distinguer n'importe quelle tension se situant entre 0 et 5 V.  Par exemple, une entrée analogique permet à l'Arduino de distinguer une tension de 2,1 V d'une autre de 2,2 V:  ces deux tensions seront perçues comme des valeurs différentes l'une de l'autre.

Quant aux entrées numériques, elles ne reconnaissent que deux états:  les tensions hautes et les tensions basses.  Ainsi, peu importe que la tension soit de 0 V,  0,5 V ou 1,2 V, elle sera reconnue comme un signal logique bas, alors qu'un signal sera reconnu comme haut peu importe qu'il soit de 3,3 V, de 4,2 V ou de 5,0 V.

La tension d'une entrée analogique se lit au moyen de la commande analogRead, alors que la tension d'une entrée numérique se lit au moyen de la commande digitalRead.

Sortie numérique, mais pas vraiment de sortie analogique

Tout comme les entrées numériques, les sorties numériques ne peuvent se trouver que dans deux états possibles: 0 V (bas) ou 5 V (haut).  On règle l'état de la sortie au moyen de la commande digitalWrite.

Puisqu'il existe une commande analogWrite, on pourrait croire qu'il est possible de régler une sortie de la carte à une valeur analogique, c'est à dire à une tension qui pourrait prendre n'importe quelle valeur située entre 0 et 5 V.  Mais ce n'est pas le cas (du moins, pas directement):  contrairement à ce que son nom pourrait laisser supposer, analogWrite produit un signal modulé par largeur d'impulsion.

Modulation par largeur d'impulsion (MLI, ou PWM pour Pulse Width Modulation)

Un signal modulé par largeur d'impulsion oscille très rapidement entre 0 et 5 V, sans jamais prendre de valeurs intermédiaires:  il ne s'agit donc pas d'un signal analogique.  Un des arguments de la commande analogWrite est le rapport cyclique, qu'on décrit au moyen d'un nombre allant de 0 à 255.
  • Lorsque le rapport cyclique est de 0, le signal est toujours à 0 volt.
  • Lorsque le rapport cyclique est de 20% (donc 51), le signal est à 5 volts pendant 20% du temps, et bas pendant 80% du temps (pour une moyenne pondérée de 1 volt)
  • Lorsque le rapport cyclique est de 40% (donc 102), le signal est à 5 volts pendant 40% du temps, et bas pendant 60% du temps (pour une moyenne pondérée de 2 volts)
  • Lorsque le rapport cyclique est de 60% (donc 153), le signal est à 5 volts pendant 60% du temps, et bas pendant 40% du temps (pour une moyenne pondérée de 3 volts)
  • Lorsque le rapport cyclique est de 80% (donc 204), le signal est à 5 volts pendant 80% du temps, et bas pendant 20% du temps (pour une moyenne pondérée de 4 volts)
  • Lorsque le rapport cyclique est de 100% (donc 255), le signal est toujours à 5 volts.
Voici un sketch qui règle successivement le rapport cyclique de la pin 8 à 20%, 40%, 60%, 80% et 100%. en conservant la même valeur pendant 5 secondes avant de passer à la valeur suivante.



Et voici ce que ça donne à l'écran de mon antique oscilloscope:



Tous ça est fort utile pour varier l'intensité lumineuse d'une LED ou la vitesse de rotation d'un moteur mais, au risque de me répéter: il ne s'agit pas d'un signal analogique.

La solution:  un filtre passe-bas

Comme nous l'avons déjà mentionné dans un autre article, un filtre passe-bas est un dispositif conçu pour atténuer les oscillations de haute fréquence.  Si notre signal modulé passe par un filtre dont la fréquence de coupure a été convenablement choisie, il sera transformé en une tension continue se situant entre 0 et 5 V, selon son rapport cyclique.

Alors essayons:  la version la plus simple d'un filtre passe-bas, c'est la combinaison d'une résistance et d'un condensateur (filtre passif).  Ici, j'ai utilisé une résistance de 15 kΩ et un condensateur de 1 µF (j'ai utilisé les valeurs conseillées sur ce blog).



Et voilà, ça marche!  À l'oscilloscope, la succession de signaux de 0 et 5 V s'est maintenant transformée en une tension continue se situant quelques part entre 0 et 5 V.



Si on mesure le résultat avec un multimètre, on trouve environ 1 V quand le rapport cyclique est de 20%, 2 V quand le rapport cyclique est de 40%, etc.



Mais attendez un instant: tous nos tests ont été réalisés à vide, sans qu'une charge soit alimentée par la sortie de notre Arduino.  Ce serait plus prudent de vérifier comment se comporte notre sortie analogique si elle alimente une résistance.  Essayons une résistance de 1 kΩ, par exemple.



C'est la catastrophe!   Notre charge (pourtant très raisonnable) de 1 kΩ ne reçoit qu'une minuscule tension continue qui représente environ le dixième de ce qu'elle devrait être.  La raison:  la résistance de charge modifie les caractéristiques de notre filtre, qui se comportera différemment selon la charge qui y sera branchée.

La solution à ce nouveau problème:  un amplificateur opérationnel

La solution consiste à isoler le filtre de sa charge, en insérant entre les deux un amplificateur opérationnel branché en suiveur de tension (ça aussi nous en avons déjà parlé dans un précédent article).


Pour les tests, j'ai utilisé un UA741 alimenté à ±12 V au moyen d'une alimentation ATX, mais il est certainement possible d'utiliser un amplificateur "rail to rail" alimenté directement par l'Arduino.

Problème réglé!  La tension de sortie reprend la valeur désirée malgré la présence d'une résistance de charge à la sortie.



Et pourquoi pas une tension analogique supérieure à 5 V?

Pourquoi pas, en effet?  Puisque de toute façon il faut utiliser un amplificateur opérationnel, on peut très bien lui donner un gain supérieur à 1, de façon à ce que la tension de sortie soit supérieure à sa tension d'entrée.  Si votre amplificateur est suffisamment alimenté, rien ne vous empêche, par exemple, de régler la sortie à une valeur analogique située entre 0 et 10 V, par exemple.  Voir par exemple les montages proposés sur le site Sonelec, toujours aussi excellent.

Mais est-ce VRAIMENT un signal analogique?

Presque...  Un véritable signal analogique pourrait prendre n'importe quelle valeur entre la tension minimale et la tension maximale.  Par exemple, si vous tourner le bouton d'un potentiomètre pour le faire passer de 0 V à 5 V, vous pouvez être certain qu'en cours de route il est passé par la valeur 2,34348512 V, car la variation est continue.  Le signal "analogique" généré par notre dispositif ne peut prendre que 256 valeurs possibles.  Entre 0 et 5 V, ça représente une résolution de 5/256, donc environ 0,02 V.  Le signal de sortie passera donc directement de 0 à 0,2 V, sans passer par des valeurs intermédiaires comme 0,01 V ou 0,014 V.

Voir aussi cette autre méthode:  Ajouter une sortie analogique à l'Arduino:  réseau R-2R

Yves Pelletier   (Twitter, Facebook

dimanche 19 avril 2015

Mesure de l'accélération gavitationnelle avec Arduino

Aujourd'hui, nous faisons une expérience de physique!

Un des avantages de l'Arduino, c'est qu'on peut s'en servir pour construire soi-même, à bas prix, des instruments de laboratoire qui se vendent habituellement très cher.

En excluant l'Arduino (que je possédais déjà, bien entendu), le chronomètre à barrière photoélectrique (photogate timer) que j'ai construit ici m'a coûté beaucoup moins que 5 euros, alors que les marchands spécialisés en matériel scientifique vendent du matériel similaire pour une centaine d'euros environ...



Le but

Mesurer de façon expérimentale l'accélération d'un objet en chute libre (qui est, en principe, de 9,8 m/s2, sauf bien sûr si vous habitez sur une autre planète).

Principe de fonctionnement

La lumière d'un laser est dirigée vers un phototransistor.  Entre l'émetteur (le laser) et le récepteur (le phototransistor), on laisse tomber une réglette constituée d'une succession de bandes opaques et de bandes transparentes.  Pendant la chute de la réglette, le faisceau laser est donc interrompu à plusieurs reprises.   Un microcontrôleur mesure de façon précise la durée de chaque interruption, ce qui permet de calculer la vitesse et l'accélération de la réglette pendant sa chute.


Construction de la barrière photoélectrique

En général, un détecteur de passage de ce genre est constitué d'une LED infrarouge et d'un phototransistor, mais j'ai supposé que le fin faisceau d'un laser permettrait peut-être une meilleure précision.  Sur eBay, on peut maintenant se procurer de petit modules laser prêts à l'emploi pour presque rien (je m'en suis procuré 5 pour environ 1 euro!).  Certains de ces modules sont conçus pour être alimentés par une source de 5 volts, d'autres par une source de 3 volts.  Puisque mon modèle est conçu pour fonctionner sous 3 volts, je l'ai accompagné d'une résistance de 100 Ω afin de l'alimenter avec 5 volts sans danger.


Comme détecteur, j'ai utilisé un phototransistor TEPT 5600, qui est sensible à la lumière visible (optimal à 570 nm).  Une photorésistance réagirait probablement trop lentement pour être utilisable dans ce genre d'application.

J'ai constaté qu'en combinant le phototransistor à une résistance de 470 kΩ, j'obtenais une tension de 4,65 volts lorsque le laser atteignait la photodiode, et 1,11 volts lorsqu'il ne l'atteignait pas (malgré l'éclairage ambiant).

Le signal est donc parfait pour être acheminé à une entrée numérique de l'Arduino:  nous aurons un "haut" logique quand le laser atteint le phototransistor, et un "bas" logique quand il est bloqué par un obstacle.



Le laser et la photodiode ont été fixés face à face, dans un cadre rigide en forme de fourche.  L'alignement du laser peu être assez délicat:  il faut s'assurer qu'il vise directement le phototransistor.



Construction de la réglette

J'ai construit la réglette en joignant deux vieux couvercles de boîtiers de CD en plastique transparent, sur lesquels j'ai disposé à intervalle régulier des bandes de ruban gommé opaque.  La largeur du ruban est de 1,9 cm, et la largeur des espaces transparents entre deux rubans opaques est également de 1,9 cm (je dis ça à titre indicatif:  rien ne vous oblige à utiliser un ruban ayant les mêmes dimensions).

J'ai obtenu des résultats plus stables en suspendant à la réglette, au moyen d'une ficelle, un objet un peu plus lourd.  Je crois que ça aidait à éviter que la réglette s'incline pendant sa chute.



Le sketch

Rien de bien compliqué ici:  chaque fois que la réception du laser change d'état (soit qu'on vient tout juste d'entrer dans une zone transparente, ou qu'on vient tout juste d'entrer dans une zone opaque), on affiche le temps dans le moniteur série.



Analyse des données

Puisque ma réglette comporte 7 bandes opaques, j'ai obtenu le temps pour 14 positions  consécutives.


Après avoir copié les informations affichées dans le moniteur série du logiciel Arduino, je les ai collées dans LibreOffice Calc (la version gratuite d'Excel) afin de produire un graphique de la position de la réglette en fonction du temps.  Comme vous pouvez le constater, la courbe a la forme parabolique caractéristique des mouvements uniformément accélérés.



Il s'agit ensuite calculer la seconde dérivée de l'équation obtenue (qui est un polynôme du second degré).  Ça consiste à multiplier par 2 le coefficient de x2.

Voici les résultats obtenus lors de 8 essais consécutifs:

       g = 10,04 m/s2,    g = 9,58 m/s2,    g = 9,76 m/s2,    g = 9,36 m/s2
       g = 11,02 m/s2     g = 9,50 m/s2     g = 10,12 m/s2   g = 9,76 m/s2

... pour une moyenne de 9,89 m/s2, qui se situe à moins de 1% d'écart par rapport à la valeur admise de 9,81 m/s2.

Autres utilisations possibles du même matériel

On peut utiliser la barrière pour mesurer, par exemple, la vitesse d'un pendule lorsqu'il atteint le point le plus bas de sa trajectoire.  On peut aussi combiner deux barrières afin de mesurer le temps écoulé entre deux positions successives d'un même mouvement.

Yves Pelletier   (Twitter:  @ElectroAmateur)

vendredi 17 avril 2015

Maintenant sur Facebook...

Je n'ai jamais été le genre de personne qui ressent le besoin de suivre les modes.  Mes vêtements ne sont pas à la mode (mais alors pas du tout!).   Le film que tout le monde à vu, je le visionnerai peut-être dans 10 ans.   Le livre que tout le monde a lu cette année, je le lirai peut-être, un de ces jours...ou peut-être pas.

Pour les réseaux sociaux, c'est un peu la même chose.  Ça fait des années qu'on me parle de Facebook et que je n'y voit aucun intérêt, et voilà que je décide finalement de m'y initier...  Mieux vaut tard que jamais, je suppose.

Alors si vous en avez envie, vous pouvez maintenant cliquer sur le bouton "J'aime" de la vitrine Facebook de ce blog:  chaque fois que je publierai un nouvel article sur le blog, je placerai un lien sur la page Facebook pour que vous en soyez avisé.

(Pour les amateurs de Twitter, je continue évidemment d'alimenter mon compte Twitter de la même manière).

P.S.:  J'ai très peu publié ces derniers temps, mais je devrais pouvoir m'y remettre bientôt!