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)