samedi 23 janvier 2016

Explorons les transistors bipolaires

Aujourd'hui, je vous propose une petite expérience pas trop compliquée qui nous permettra d'explorer le fonctionnement d'un transistor bipolaire.

Avant de commencer: quelques informations de base sur les transistors

Un transistor bipolaire est toujours constitué de 3 broches qu'on appelle la base, le collecteur et l'émetteur.


(Il existe d'autres types de transistors, comme par exemple les transistors à effet de champ (MOSFET, JFET).  Les 3 broches s'appellent alors la grille, le drain et la source, mais ne mélangeons pas tout: aujourd'hui, nous nous limitons aux transistors bipolaires.)

Il existe deux types de transistors bipolaires:  les transistors NPN et les transistors PNP.  Dans un schéma de circuit, il sont représentés de la façon suivante:


Dans un transistor bipolaire, un faible courant qui circule dans la base du transistor permet de contrôler un courant beaucoup plus intense qui circule par le collecteur et l'émetteur.  Le sens dans lequel nous faisons circuler ces courants n'est pas le même dans un transistor NPN et dans un transistor PNP.
Deux courants entrent dans le transistor NPN (IB et IC), et un seul courant en sort (IE).  Si on applique la loi des noeuds de Kirchhoff, qui affirme sans grande surprise que la somme de tout ce qui entre est égale à la somme de tout ce qui sort, nous pouvons déduire que IE = IB + IC.

De plus, puisque IB est très petit:    IE =  IC.

Au moyen de la loi des mailles du même Gustav Kirchhoff, on peut également constater que la différence de potentiel entre le collecteur et l'émetteur est égale à somme de la différence de potentiel entre le collecteur et la base, et la différence de potentiel entre la base et l'émetteur:

                     VCE = VCB + VBE

Maintenant, expérimentons!

Puisque les transistors NPN sont plus souvent utilisés que les transistors PNP, j'ai choisi d'utiliser un un transistor de ce type pour mon expérience.  J'ai fait cette expérience avec un 2N3904, mais si vous préférez utiliser un autre modèle de transistor NPN (2N2222, BC548, etc), ça devrait parfaitement faire l'affaire.

Une consultation de la fiche technique du 2N3904 (ou du modèle que vous avez choisi d'utiliser) permet de distinguer ses broches l'une de l'autre (ce n'est pas toujours identique d'un transistor à l'autre).

Et pendant qu'on y est, voyons quelles sont les valeurs à ne pas dépasser, sous peine de détruire notre transistor.


Il faut donc s'assurer de ne pas dépasser 60 volts entre le collecteur et la base, 40 volts entre le collecteur et l'émetteur, et 6 volts entre l'émetteur et la base.  Puisque j'ai l'intention d'alimenter mon montage avec une tension de 5 volts, aucune de ces valeurs ne risque d'être dépassée...  Il nous reste à nous assurer, en choisissant des résistances de valeurs appropriées, que le courant traversant le collecteur ne dépasse jamais 200 mA.


Circuit 

Le circuit illustré ci-contre est fortement inspiré de celui que propose Charles Platt à la page 81 de son livre "L'électronique en Pratique" (Éditions Eyrolles, collection Serial Makers).  J'ai toutefois jugé plus pratique d'utiliser une source de tension continue de 5 V plutôt que 12 V:  si vous reproduisez cette expérience, vous pouvez utiliser une alimentation USB, la sortie 5 V d'une carte Arduino, ou 4 piles AA (il n'est pas nécessaire que la tension soit précisément 5 V).    Il n'est pas strictement nécessaire d'utiliser les mêmes valeurs de résistances, mais celles qui sont indiquées m'ont permis de faire varier le courant à l'intérieur d'une gamme de valeurs intéressante.



Au moyen d'un multimètre, j'ai mesuré trois paramètres en tournant progressivement le potentiomètre d'une extrémité à l'autre:  le courant qui circule dans la base, le courant qui circule dans le collecteur, et la différence de potentiel entre la base et l'émetteur.

Relation entre le courant dans le collecteur et le courant dans la base

Le graphique ci-contre présente le courant circulant dans le collecteur (axe vertical) en fonction du courant circulant dans la base (axe horizontal).

On peut distinguer deux zones bien distinctes sur ce graphique.  Tout d'abord, pour un courant de base allant de 0 à environ 18 µA, le courant de collecteur est proportionnel au courant de base: c'est ce qu'on appelle la zone linéaire.  Pour des valeurs du courant de base supérieures à 18 µA, le courant de collecteur plafonne à une valeur constante:  c'est la zone de saturation.

Tel que prévu, le fort courant qui circule dans le collecteur dépend du petit courant qui circule dans la base.  Selon vos besoins, vous pourrez utiliser le transistor comme commutateur, ou comme amplificateur.

Commutateur

C'est la façon la plus simple d'utiliser un transistor, puisqu'il n'y a que deux situations possibles:
  • aucun courant ne circule dans la base, donc aucun courant ne circule dans le collecteur (transistor bloqué)
  • un courant circule dans la base, donc un courant (plus intense) circule dans le collecteur (transistor saturé)

Par exemple, vous pourriez utiliser un transistor en mode commutation pour produire un son au moyen d'un haut-parleur branché à une carte Arduino, ou pour contrôler un moteur branché à l'Arduino.  Comme tous les microcontrôleurs, l'Arduino ne supporte pas de très forts courants:  vous alimentez donc la base du transistor avec le faible courant provenant de l'Arduino (en mettant dans le trajet de ce courant une résistance suffisamment grande pour que ce courant demeure faible), et vous vous servez du courant dans le collecteur et l'émetteur pour alimenter le haut-parleur ou le moteur.

Puisque les sorties de l'Arduino n'ont que deux états possibles (0 ou 5 V), votre transistor n'aura également que deux états possibles (présence de courant, ou absence de courant).

Amplificateur

À la condition de demeurer à l'intérieur de la zone linéaire du graphique, notre transistor amplifie le courant par un facteur constant.  Le gain en courant, qu'on symbolise par la lettre grecque β (ou parfois "hfe"), est égal au rapport Ic/Ib.  En utilisant les valeurs du graphique, je constate que mon transistor avait un gain β d'environ 330:  le courant qui traverse le collecteur est donc 330 fois plus intense que le courant qui traverse la base.

(Il ne faudrait pas croire que ce courant amplifié provient du transistor:  il est causé par l'alimentation de 5 volts.  Une augmentation du courant dans la base fait diminuer la résistance interne du transistor dans le trajet collecteur-émetteur, et il en résulte une augmentation du courant à cet endroit).

Cette faculté de produire un courant qui est multiplié par une valeur constante est extrêmement utile pour amplifier un signal analogique (un signal audio, par exemple):  le signal devient plus puissant, mais sa forme demeure la même.


Il y a tout de même un hic:  ce gain en courant β dépend de la température.  Ça signifie que votre transistor n'aura pas un comportement identique selon que vous l'utilisez sous le soleil de juillet ou pendant une randonnée en skis de fond.  Pire encore: la valeur de β peut être très différente d'un transistor à l'autre, mêmes s'ils ont tous le même numéro de modèle!  Un autre transistor 2N3904 utilisé dans les mêmes conditions pourrait très bien me donner un résultat de 100, ou 250!

Pour compenser, les ingénieurs en électronique on mis au point des agencements de résistances qui font en sorte qu'un circuit comportant un transistor se comporte de la même manière peu importe la valeur exacte de β (l'amplificateur de tension à émetteur commun, par exemple).

Tension minimale entre la base et l'émetteur

Si on revient à mon montage expérimental, je vous avais mentionné que j'avais également mesuré la différence de potentiel entre la base et l'émetteur du transistor:  voici le graphique du courant circulant dans le collecteur en fonction de cette différence de potentiel.

Ces données illustrent une caractéristique importante des transistors:  pour qu'ils puissent fonctionner, la différence de potentiel entre la base et l'émetteur doit être d'au moins 0,6 volts. De plus, cette valeur varie assez peu, même si vous faites varier les autres paramètres du circuit.  On peut donc affirmer que, pendant son fonctionnement, la différence de potentiel entre la base et l'émetteur d'un transistor se situe dans les environs de 0,7 volt (le concepteur du circuit doit s'assurer que le transistor sera correctement polarisé).

Et les transistors PNP?

Si vous voulez faire ce genre de mesures sur un transistor PNP (par exemple le 2N3906), vous pouvez utiliser le même montage dans lequel vous inversez la polarité de l'alimentation (ce qui aura pour effet d'inverser le sens du courant dans le transistor).


Yves Pelletier   (Twitter, Facebook)

vendredi 15 janvier 2016

Mesurer la fréquence d'un son avec Arduino


Maintenant que je suis en mesure de capturer un signal audio avec mon Arduino, j'aimerais bien que l'Arduino détermine la fréquence fondamentale de ce signal. De cette façon, je pourrais utiliser l'Arduino pour accorder ma guitare.  Ou peut-être même que l'Arduino serait en mesure de reconnaître les notes jouées par la guitare et transmettre à un synthétiseur les messages MIDI correspondants?

Matériel

Aduino Uno, guitare électrique, et interface audio. L'interface audio joue deux rôles très importants: amplifier le minuscule signal électrique émis par la guitare électrique, et faire en sorte que ce signal amplifié demeure dans les limites de tension pouvant être supportées par une entrée de l'Arduino, c'est à dire entre 0 et 5 V. Une fois amplifié et additionné à une tension continue de 2,5 volts, le signal audio est acheminé à l'entrée analogique A0 de la carte Arduino.

Quelques notions de théorie concernant les sons

La fréquence d'un son émis par un instrument de musique détermine la hauteur de la note jouée.  Par exemple, un son dont la fréquence est de 262 Hz est un do, alors qu'un son dont la fréquence est de 440 Hz est un la (pour connaître la note associée à d'autres fréquences, voir ici).

Alors que la fréquence représente le nombre d'oscillations par seconde, la période est le temps nécessaire pour effectuer une oscillation complète.

Pour le signal audio ci-dessous, la période est d'environ 6 ms (ce qui correspond à une fréquence de 167 Hz).
Mesurer la fréquence d'un signal périodique simple comme un sinus ou une dent de scie n'a rien de bien compliqué:  la période est simplement égale au temps écoulé entre deux moments où le signal atteint sa valeur maximale, par exemple.  À la condition que la fréquence du signal soit significativement plus basse que la fréquence à laquelle l'Arduino effectue ses mesures, nous obtenons une mesure fiable au moyen d'un algorithme simple.

Mais les choses se compliquent sensiblement lorsqu'un désire déterminer la fréquence fondamentale d'une note produite par un instrument de musique.  Le signal se répète,  bien sûr, mais sa forme peut être très complexe:  il peut atteindre plusieurs fois la même valeur maximale à l'intérieure d'une même oscillation, traverser plusieurs fois la valeur médiane (qui est ici de 2,5 V) à l'intérieur d'une même oscillation, etc.  De plus, les oscillations ne sont pas toutes rigoureusement identique (par exemple, le signal émis par une corde de guitare devient de moins en moins intense avec le temps).

Le sketch d'Amanda Ghassaei

J'ai trouvé un sketch assez efficace proposé par la jeune physicienne Amanda Ghassaei sur le site Instructables.  Son sketch se trouve à la toute fin de l'article (4e page).

En gros, son algorithme consiste à mesurer la pente du signal chaque fois ce dernier passe par la valeur 2,5 V (qui est la valeur moyenne de notre signal audio), de chronométrer le temps écoulé entre chaque passage par cette valeur, et de vérifier s'il y a une répétition des paires pente/délai.

En général, le convertisseur analogique-numérique de l'Arduino n'est pas d'une très grande rapidité, ce qui peut devenir problématique lorsqu'on cherche à prendre des mesures sur un signal qui varie rapidement, comme c'est le cas ici.   Pour rendre l'Arduino plus rapide, Amanda Ghassaei manipule directement les ports de l'Atmega plutôt que d'utiliser des instructions typiques de la programmation Arduino comme "analogRead".

De plus, grâce à quelques lignes de code placés dans la partie "setUp" de son sketch, elle a modifié les paramètres du convertisseur analogique numérique. De cette façon, le taux d'échantillonnage de l'Arduino devient  38,5 kHz (c'est 4 fois plus rapide que la normale).  En contrepartie, sa résolution est diminuée ( les 5 volts sont réparties sur 255 valeurs possibles, alors que c'est généralement 1024) et les autres entrées analogiques de l'Arduino sont désactivée.

Tests du sketch d'Amanda Ghassaei avec ma guitare électrique

Voici ce que m'a présenté le moniteur série lorsque j'ai mis à l'essai le sketch d'Amanda Ghassei pour chacune des 6 cordes de ma guitare électrique:


Comme vous pouvez le constater, le sketch donne généralement une valeur plausible, mais de temps à autre (une ou deux fois sur dix), une fréquence incorrecte apparaît dans la liste.

Pour améliorer les performances de son programme, Amanda nous invite à modifier deux variables:  slopeTol et timerTol, qui contrôlent respectivement la tolérance lors de la comparaison des pentes et des durées chronométrées.  Je n'ai pas constaté d'améliorations notables en modifiant ces deux paramètres.

Le sktech modifié

J'ai plutôt décidé de filtrer les résultats, puisqu'ils ne sont mauvais qu'occasionnellement.

Avant d'afficher la fréquence au moniteur série, je m'assure d'abord qu'elle se trouve à l'intérieur des valeurs plausibles pour une guitare.   Ma guitare ne devrait pas produire des notes dont la fréquence est inférieure à 50 Hz ou supérieure à 1000 Hz, donc tous les résultats qui ne se situent pas entre 50 Hz et 1000 Hz sont nécessairement des anomalies, qui ne seront pas retenues.

De plus, chaque fois que la fréquence calculée est significativement différente de la fréquence précédente, j'attends une deuxième mesure similaire avant de l'afficher.

Voici ce que ça donne, suite à mes modifications:

(En fait, il arrive encore occasionnellement qu'une mauvaise fréquence soit affichée, mais c'est vraiment rare).

Et voici le sketch d'Amanda Ghassaei, avec une toute petite modification de ma part:


Oui, mais...

Les résultats sont corrects pour ma guitare électrique, mais ça ne fonctionne pas pour n'importe quel instrument.  Par exemple, pour le son de ma guitare acoustique capté par un micro, les faux résultats demeurent très nombreux malgré les modifications que j'ai apportées au sketch.  Pour les sons produits par un clavier musical, les résultats sont très variables dépendant du timbre choisi:  c'est parfois excellent, parfois catastrophiques.

On peut probablement obtenir un résultat intéressant pour un instrument donné en changeant la valeur des variables slopeTol et timerTol, mais il ne semble pas possible de rendre l'algorithme infaillible pour tous les sons possibles.

D'autres solutions

Il existe des algorithme plus robustes, mis au point par des mathématiciens dans le but spécifique de déterminer la fréquence fondamentale d'un signal sonore.  En gros, l'autocorrélation consiste à superposer deux segments sonores et déplacer progressivement l'un des deux segments jusqu'à ce qu'on trouve la position pour laquelle l'écart entre les deux signaux est minimal.   Puisque le sketch proposé plus haut semble répondre à mes besoins immédiats, je n'ai pas poussé très loin mon exploration du sujet, mais je vous indique rapidement quelques pistes intéressantes.

Voici d'abord un article du site Instructables (écrit par David Dein). Malheureusement, puisque ce sketch a été conçu pour un violon, il ne détecte pas les fréquences situées en-dessous de 196 Hz (qui correspond à la note la plus grave pouvant être émise par un violon).  C'est assez problématique pour une guitare, puisque la note la plus grave est de 82 Hz.  On peut certainement éliminer cet irritant en modifiant la valeur de la variable "delay_index_high_limit".  Je n'ai pas pris cette peine, ayant constaté que, même pour des notes au-dessus de 200 Hz, cet algorithme donnait des résultats pitoyables pour ma guitare électrique (il semblait beaucoup plus performant avec mon clavier, toutefois).

Frédéric Hamel a aussi utilisé un algorithme d'autocorrélation lors de la conception de son accordeur de guitare.  Il a été forcé de faire plusieurs compromis afin de rester à l'intérieur des limites de l'Arduino original, basé sur l'Atmega 168 (c'est un projet qui date de 2008).  Je n'ai pas pu tester les résultats car la portion de sketch concernant la détermination de la fréquence se trouve à l'intérieur du sketch complet  (incluant la gestion de l'afficheur LCD, l'envoi de messages MIDI, etc).

J'ai aussi trouvé ce projet très récent, apparemment mené par un garçon de 11 ans avec un peu d'aide de son père (mouais...).  C'est un projet assez complexe, mais très bien documenté,  et il semble que tout le nécessaire se trouve à l'intérieur du fichier "frequency.cpp".

Voilà!  J'espère que vous avez trouvé ici quelques informations utiles pour la réalisation de vos projet...

Yves Pelletier   (Twitter, Facebook)

dimanche 10 janvier 2016

Visualisation d'un son avec le traceur série de l'Arduino

Dans mon article précédent, j'ai fabriqué une interface qui transforme un signal audio afin qu'il respecte les limites d'une entrée Arduino (minimum de 0 V, maximum de 5 V).  Grâce à un oscilloscope, j'avais pu constater le fonctionnement correct du circuit:  la forme du signal est préservée suite à l'amplification et la superposition à une tension continue de 2,5 V.

L'étape logique suivante:  si j'achemine ce signal sur une de ses entrées analogiques, l'Arduino voit-il la même chose que moi?

Le montage

La sortie pour casque d'écoute d'un clavier musical est branchée à l'entrée de l'interface précédemment fabriquée, et la sortie de l'interface est acheminée à l'entrée A0 d'une carte Arduino Uno.

Dans un premier temps, je règle le clavier pour qu'il produise un signal simple (dent de scie), et j'appuie sur la touche "do 3" (262 Hz), ce qui donne ce résultat si je mesure le signal à la sortie du clavier, avec un oscilloscope:


Première tentative (ratée...)

Au départ, j'ai naïvement affiché mes mesures une par une dans le moniteur série, puis je les ai copiées dans un tableur pour visualiser le signal.


Échec total; la forme du signal enregistré par l'Arduino  n'avait rien à voir avec la forme du signal d'origine.


Raison:  taux d'échantillonnage trop lent.  Le signal audio variait trop rapidement par rapport au rythme auquel l'Arduino prenait les mesures.

Deuxième tentative (ça fonctionne!)

J'ai croisé les doigts pour que le principal responsable de cette lenteur soit l'affichage de la valeur numérique sur le moniteur série.  Augmenter la vitesse de transmission (baud rate) a semblé améliorer les choses, mais pas suffisamment.

J'ai donc essayé un deuxième sketch, dans lequel je commençait par accumuler une centaine de données, pour ne les afficher qu'à la fin de la prise de mesures.



Et cette fois, le résultat a été beaucoup plus satisfaisant:


En utilisant la fonction "millis()", j'ai constaté qu'environ 11 millisecondes étaient nécessaires pour que l'Arduino effectue les 100 mesures.  Nous voyons sur le tracé que presque 3 périodes ont été effectuées pendant ces 11 millisecondes, ce qui donne une fréquence estimée de 273 Hz, très similaire à la valeur réelle de 262 Hz.

Troisième étape, le traceur série

Le nouveau traceur série de l'IDE Arduino m'a semblé une façon pratique de visualiser le signal audio en temps réel, sans avoir besoin de sortir de l'IDE. Pour étaler un peu l'échelle de temps (horizontale), je dois toutefois ajouter un délai lors du traçage.

Voici donc un sketch qui effectue 200 mesures du signal audio (ce qui nécessite un temps imperceptible de 22 ms), puis affiche le résultat au traceur série (ce qui nécessite une durée d'environ 2 secondes, à cause du délai que j'ai imposé).

J'ai aussi soustrait 512 à la valeur mesurée, qui correspond à la tension continue de 2,5 V, afin que le signal affiché oscille autour de zéro.   De plus j'ai ajouté une suite de zéros pour séparer les différentes suites de mesure.




 Le do situé un octave plus bas (131 Hz) comporte deux fois moins d'oscillations:






Et le do situé un octave plus haut (523 Hz) en comporte deux fois plus:





Essayons maintenant des formes plus complexes... Voici le do 262 Hz joué avec plusieurs timbres différents, en comparant le résultat affiché par l'Arduino (en haut, en bleu) à celui obtenu à l'oscilloscope (en bas, en rouge).

Imitation de clarinette:


Imitation de hautbois:


Imitation de saxophone alto:




Imitation de trompette:


Et un dernier test:  une guitare électrique branchée sans ampli (j'ai dû régler le gain de mon interface audio au maximum):





Yves Pelletier   (Twitter, Facebook)