dimanche 24 avril 2016

Fabriquons notre propre pont en H

Jusqu'à maintenant, dans chaque projet impliquant le contrôle d'un ou deux moteurs DC par un microcontrôleur, j'ai utilisé un circuit intégré spécialement conçu à cette fin, comme le populaire L293D.  Mais il est très facile de construire soi-même un contrôleur de moteur à partir de quelques transistors, et c'est ce que nous allons faire aujourd'hui.




Pourquoi un contrôleur de moteur?

Supposons que vous avez décidé de contrôler un moteur au moyen d'une carte Arduino (ou un autre microcontrôleur):  pourquoi ne pas simplement brancher le moteur directement sur une de ses sorties?

Les raisons sont multiples.  D'abord, pour protéger l'Arduino.  La résistance d'un moteur n'est souvent pas très grande:  si vous soumettez le moteur à une tension de 5 V, le courant qui traverse la sortie de l'Arduino pourrait dépasser significativement les valeurs tolérables par l'Arduino.  De plus, un bobinage en rotation dans un champ magnétique génère une tension (c'est le principe de la génératrice) qui pourrait également être dommageable pour l'Arduino.  Et dans bien des cas, votre moteur nécessitera une tension supérieure à 5 V pour fonctionner correctement.

La solution:  un transistor!  Un petit courant issu de la sortie de l'Arduino permet de contrôler un courant plus intense circulant dans le moteur.


Pourquoi un pont en H?

Le circuit illustré plus haut (impliquant un seul transistor) est parfait si vous désirez que votre moteur tourne toujours dans la même direction:  si la sortie numéro 5 de l'Arduino est à 5 V, le moteur tourne.  Si la sortie numéro 5 est à 0 V, le moteur ne tourne plus (et vous pouvez contrôler la vitesse de rotation du moteur grâce à la modulation par largeur d'impulsion "PWM").

Mais dans bien des cas, on veut que le moteur tourne parfois dans une direction, et parfois dans l'autre (par exemple:  pour un robot qui est capable d'avancer et de reculer).  Et c'est là qu'un pont en H devient incontournable.

Voici un schéma de pont en H constitué de 4 transistors (on peut aussi faire un pont en H avec des interrupteurs ou avec des relais).

Lorsque la tension de la pin 6 de l'Arduino est de 5 V et que la tension de la pin 5 est nulle, les transistors Q1 et Q3 forment un trajet conducteur et le courant circule vers la droite dans le moteur.

Si on inverse la polarité, ce sont les deux autres transistors qui deviennent conducteurs, et le courant circule maintenant vers la gauche dans le moteur.

Les diodes servent à protéger le microcontrôleur contre les courant générés par la rotation du moteur.

Expérimentation sur breadboard

Vous pouvez facilement construire un pont en H sur une breadboard afin d'explorer son fonctionnement.  Vous aurez besoin de deux transistors PNP et deux transistors NPN.  N'importe quel transistor commun fera l'affaire si vous contrôlez un petit moteur DC fonctionnant sous quelques volts (des transistors de puissance sont nécessaires si votre moteur est plus énergivore).  J'ai fait ce test avec des 2N3906 et 2N3904 (un choix adéquat pour expérimenter, mais qui serait plus discutable pour une application réelle, tel que discuté dans ce blog) .


Sketch Arduino

Voici le sketch utilisé: le moteur tourne lentement dans une direction pendant 5 secondes, puis il tourne rapidement dans l'autre direction pendant 5 autres secondes.  La vitesse du moteur est contrôlée par PWM (modulation par largeur d'impulsion), c'est pourquoi vous devez vous assurer d'utiliser des sorties de l'Arduino qui supportent le PWM (comme par exemples les pins 5 et 6).

Pour la rotation à vitesse plus lente, il se peut que vous soyez obligés d'augmenter le rapport cyclique utilisé dans le sketch, si vous constatez que votre moteur ne tourne que dans une seule direction.




 

Construction d'un Franken-pont-en-H

Suite à cet essai concluant, j'ai décidé construire un pont en H plus permanent,soudé sur une perfboard.  Pour qu'il soit plus polyvalent, je tenais à utiliser des gros transistors de puissance (format TO-220) à la place des petits transistors que j'avais utilisé dans mon circuit expérimental.  De cette façon, je n'aurai pas à m'inquiéter outre-mesure de la possibilité que mes transistors grillent en cas de courant trop élevé.

Mais en cette époque où les revendeurs chinois nous proposent de robustes contrôleurs complets à base de L298 pour moins de $2 (alors qu'un véritable L298 coûte beaucoup plus cher que ça...), je voulais que ma construction soit pertinente d'un point de vue économique.

Je vous présente donc mon Franken-pont-en-H:  un pont en H constitué exclusivement de composants de récup qui ne m'ont rien coûté (bon, d'accord:  j'ai payé pour le bout de perfboard, et pour les connecteurs car ils sont neufs).   Le tout fonctionne correctement, évidemment.




Yves Pelletier   (TwitterFacebook)

mardi 19 avril 2016

Chronométrer une chute libre avec Arduino

Voici une petite expérience scientifique qui nous permettra de déterminer expérimentalement l'accélération gravitationnelle à la surface de la terre qui est, théoriquement, égale à 9,8 m/s2.

Les habitués de ce blog me feront peut-être remarquer que nous l'avons déjà fait (à la même date, l'an passé!)...vous avez raison! Mais cette fois, nous allons procéder de façon différente.

Le principe:

On laisse tomber un objet d'une hauteur connue, et on mesure le temps nécessaire pour qu'il atteigne le sol.  On peut donc calculer son accélération, en supposant (avec raison) qu'elle est constante.

Le problème:  

Si vous laissez tomber l'objet d'une distance de un ou deux mètres, il atteint le sol en moins d'une seconde.  Vous ne pouvez donc pas chronométrer sa chute en contrôlant manuellement un chronomètre, même si vous considérez que vos réflexes sont très aiguisés!  Il faut concevoir un système qui démarre automatiquement le chronomètre dès le départ de l'objet, et qui interrompt automatiquement le chronomètre à l'arrivée de l'objet.

La solution:  

Une carte Arduino, et deux interrupteurs un peu particuliers.

L'interrupteur de départ:

Au départ, notre objet est maintenu en place par une pince serre-joint à ressort:  en appuyant sur les poignées de la pince, nous libérons l'objet.  Nous prendrons soin d'utiliser un objet en métal:  lorsqu'il se trouve entre les mâchoires de la pinces, un courant peut circuler d'une mâchoire à l'autre.


Aussitôt que l'objet en métal n'est plus en contact avec la pince, le courant ne circule plus...



Dans mon cas, la pince est elle-même en métal, ce qui fait qu'elle conduit toujours l'électricité, peu importe que ses mâchoires soient ouvertes ou fermées.  J'ai donc recouvert les deux mâchoires d'un ruban gommé isolant, sur lequel j'ai collé deux petites plaques conductrices auxquelles j'ai soudé des fils conducteurs et une résistance "pull down" de 33 kΩ (la valeur exacte de la résistance n'a pas d'importance).



Donc lorsque l'objet métallique est coincé entre les deux mâchoires de la pince, le courant passe dans la résistance, et une tension de 5 V est acheminée à l'Arduino.  Lorsqu'on libère l'objet, le courant ne passe plus et une tension de 0 V est acheminée à l'Arduino.



L'interrupteur d'arrivée:

Pour détecter l'impact de l'objet sur le plancher, j'ai utilisé un bouton poussoir soudé à une résistance "pull down" de 33 kΩ (mais une fois encore, la valeur exacte de la résistance n'est pas importante).



Bien sûr, ce serait problématique d'aligner le montage de façon à s'assurer que l'objet tombe précisément sur ce minuscule bouton poussoir...  Pour augmenter la surface de mon détecteur, j'ai inséré ce bouton-poussoir entre deux plaques rigides reliées par une charnière (dans mon cas, la charnière, c'était simplement du ruban gommé).





Un peu par hasard j'ai obtenu une situation idéale pour laquelle le poids de la plaque du haut était déjà presque suffisant pour actionner le bouton.  Il s'agissait de déposer l'objet sur la plaque pour que le bouton s'enfonce.

Donc lorsque l'objet n'est pas sur la plaque, le courant ne peut pas passer à travers la résistance, et une tension de 0 V est acheminée à l'Arduino.  Aussitôt que l'objet tombe sur la plaque, le courant passe à travers la résistance et une tension de 5 V est acheminée à l'Arduino.



L'objet en chute libre:

On veut un objet qui conduit l'électricité, et qui est assez massif pour actionner l'interrupteur d'arrivée et pour rendre négligeable la friction de l'air:  un petit objet en métal, donc.  J'ai utilisé une douille de clé à cliquet.



Le circuit:

C'est ultra-simple:  nos deux interrupteurs un peu spéciaux sont branchés à l'Arduino.



Le sketch:

Le sketch est également très simple.  Au départ, on vérifie que les deux interrupteurs sont dans l'état prévu. On note le temps (millis()) au départ de l'objet, et on le note à nouveau à son arrivée au sol.  Il ne reste plus qu'à afficher la durée de la chute dans le moniteur série.

La variable "enChute" prend la valeur "0" avant la chute (l'objet est encore dans la pince à ressort), "1" pendant la chute (l'objet n'est plus dans la pince, mais n'a pas encore atteint le sol), et "2" quand la chute est terminée (l'objet a actionné l'interrupteur d'arrivée).

Avant de prendre une nouvelle mesure, on appuie sur le bouton reset de l'Arduino.




Les résultats:

Voici quelques durées de chutes mesurées au moyen de ce dispositif, avec une hauteur de chute de 132,5 cm:

518 ms, 511 ms, 512 ms, 511 ms, 511 ms, 514 ms, 507 m

...donc une durée moyenne de 512 ms

Puisque la vitesse initiale de l'objet était nulle, on peu calculer l'accélération de cette façon:

a = 2 * hauteur / (durée)2 = 2 * 1,325 / (0,512)= 10,1 m/s2

... ce qui n'est pas très loin des 9,8 m/s2 prévus.

Yves Pelletier   (TwitterFacebook)

lundi 7 mars 2016

8 capteurs analogiques sur le même ESP8266

Il y a quelque jours, je vous ai présenté un projet qui consistait à afficher dans une page web les mesures prises par des capteurs branchés à un module ESP8266.  Puisque l'ESP-12 ne comporte qu'une seule entrée analogique, nous nous étions limité à un seul capteur analogique.

Doit-on en conclure qu'il est impossible de brancher plusieurs capteurs analogiques sur un même ESP8266? Pas du tout:  grâce au multiplexeur CD4051 (que nous avions déjà étudié dans cet article publié à l'été 2014), il est possible de brancher jusqu'à 8 capteurs analogiques différents sur l'unique entrée analogique de l'ESP8266.  C'est ce que nous allons faire aujourd'hui.

Notre projet consiste donc à brancher 8 capteurs analogiques à un même module ESP8266, et à afficher leur valeur dans une page web...

...bon d'accord, dans les faits, je me suis contenté de 4 capteurs, car ça devenait un peu redondant, mais puisque le CD4051 comporte 8 entrées, vous pouvez facilement modifier mon sketch pour brancher 8 capteurs si c'est ce dont vous avez besoin.

IDE Arduino

Nous allons programmer l'ESP8266 au moyen de l'IDE Arduino.  Les extensions nécessaires à la programmation de l'ESP8266 doivent donc avoir été installées.  Si ce n'est pas le cas, vous pouvez suivre les instructions disponibles ici.

Le circuit

  • Vous devez utilisez un module ESP8266 qui comporte une entrée analogique (ADC), comme par exemple le module ESP-12.  Le module ESP-01 ne convient pas, puisqu'il ne comporte pas d'entrée analogique.
  • L'entrée ADC de l'ESP8266 requiert une tension située entre 0 et 1 V;  puisque les capteurs sont alimentés par une tension de 3,3 V,  vous devez concevoir vos diviseurs de tension de façon à tenir compte de cette limite. La loi d'Ohm vous permet de calculer facilement les valeurs de résistances nécessaires, et c'est une bonne idée de faire quelques tests avec un multimètre avant de brancher vos capteurs sur l'ESP8266.
  • L'alimentation de 3,3 V n'est pas la sortie 3,3 V du convertisseur USB-UART.  Il s'agit d'une alimentation externe, car l'ESP8266 a la réputation d'être plutôt gourmand en courant.
  • Je n'explique pas ici le fonctionnement détaillé du multiplexeur CD4051, puisque je l'ai déjà fait ici.
  • Le capteur 1 (un potentiomètre) est relié à l'entrée Y0 (pin 13) du CD4051.
  • Le capteur 2 (une photorésistance) est relié à l'entrée Y1 (pin 14) du CD4051
  • Le capteur 3 (une thermistance) est relié à l'entrée Y2 (pin 15) du CD4051
  • Le capteur 4 (un potentiomètre) est relié à l'entrée Y3 (pin 12) du CD4051
  • GPIO4 de l'ESP8266 est configuré en sortie et relié à l'entrée S0 (pin 11) du CD4051
  • GPIO5 de l'ESP8266 est configuré en sortie et relié à l'entrée S1 (pin 10) du CD4051
  • GPIO15 de l'ESP8266 est configuré en sortie et relié à l'entrée S2 (pin 9) du CD4051
  • La sortie du CD4051 est la pin 3; elle est reliée à l'entrée ADC de l'ESP8266.
  • Les pins GPIO4, GPIO5 et GPIO6 servent à sélectionner le capteur dont la valeur sera acheminée à l'entrée ADC de l'ESP8266,


Le sketch

Voici le sketch qui permet à l'ESP8266 d'afficher les résultats sur une page web:


Utilisation et résultats

Lors du démarrage du programme, l'adresse IP de votre ESP8266 s'affiche dans le moniteur série.


Il s'agit d'accéder à cette adresse IP à partir de n'importe quel fureteur web lié au même réseau WiFi pour voir s'afficher les valeurs mesurées par chaque capteur­.   Vous devez rafraîchir la page pour que ces valeurs se mettent à jour.




Yves Pelletier   (TwitterFacebook)