Académique Documents
Professionnel Documents
Culture Documents
Figure 1
Il s’agit d’un convertisseur analogique numérique, capable de lire une
tension analogique pouvant varier continûment et la convertir en une valeur
numérique comprise entre 0 et 1023. La tension à lire doit être comprise entre
0 et la tension de référence, qui par défaut est la tension d’alimentation Vcc
mais peut aussi être une tension sur l’entrée AREF ou une des tensions
générée par le chip 1,1 V ou 2,56V. Pour nos applications au train miniature,
cette tension est souvent fournie par un capteur ou un diviseur de tension (par
exemple, un simple potentiomètre). La valeur obtenue est comprise entre 0 et
1023 (soit 1024 possibilités) car l’échantillonnage se fait sur 10 bits (et 2 à la
puissance 10 donne 1024). La carte UNO possède 6 entrées analogiques (ADC0
à ADC5), couramment appelées par l’IDE A0 à A5. Ici, nous voyons que notre
ATtiny possède 4 entrées analogiques ADC0 à ADC3 :
ADC0 est sur la broche 1 qui sert de RESET ; nous éviterons donc de
l’utiliser si nous voulons continuer à programmer facilement nos ATtiny avec
notre carte Arduino UNO. Il nous reste donc 3 entrées analogiques disponibles,
ce qui est bien suffisant pour la majorité des applications au train miniature. Les
broches 7 (ADC1), 3 (ADC2) et 2 (ADC3) sont donc les entrées analogiques de
notre microcontrôleur et l’IDE les appelle respectivement A1, A2 et A3, tout
comme les entrées de la carte UNO étaient appelées A0 à A5. La mise en œuvre
de ces entrées analogiques se fait très simplement avec la fonction analogRead()
du langage de programmation d’Arduino : cette fonction se charge des
différentes opérations nécessaires pour que le microcontrôleur transforme la
tension présente sur la broche en une valeur numérique. Voyons cela sur un
exemple.
Ouvrez le programme « Analoginput » donné en exemple dans l’IDE :
Fichier > Exemples > 03.Analog > AnalogInput comme le montre la figure 2.
Figure 2
Nous allons l’adapter à un microcontrôleur ATtiny25/45/85 en changeant
dans la ligne 30 le A0 en A1 (notre entrée analogique sera donc sur la broche 7)
et dans la ligne 31 int ledPin = 1 au lieu de 13 (la sortie LED sera donc la broche
6). Une fois ces deux lignes modifiées, téléversez le programme dans un µC
ATtiny de la série 25/45/85, en suivant la procédure décrite dans l’article Le
microcontrôleur ATtiny45 (2). Une fois la puce programmée, réalisez le
montage donné par la figure 3.
Figure 3
Le mini-potentiomètre vaut au moins 10 kΩ : ses extrêmes sont reliés à la
masse et au +5 V et la sortie (broche du milieu) est reliée à l’entrée analogique
A1 sur la broche 7 de l’ATtiny. Le potentiomètre agit comme un diviseur de
tension et sur sa broche du milieu, on retrouve une tension comprise entre 0 et 5
V en fonction de la position du curseur du potentiomètre. La sortie PB1 (broche
6 de l’ATtiny) est reliée à une LED par l’intermédiaire d’une résistance de 330
Ω. Le tout est alimenté en 5 V, prélevé par exemple sur une carte Arduino UNO.
En tournant le bouton du potentiomètre, vous ferez varier la tension sur l’entrée
analogique, ce qui fera varier la durée du delay() (comprise entre 0 et 1023),
faisant ainsi varier la fréquence de clignotement de la LED. Bien entendu, vous
auriez pu utiliser une autre entrée analogique (broche 2 ou 3 par exemple) ; il
vous aurait suffit de mettre A1 ou A2 dans le programme. Ce montage vous
prouve donc qu’il est extrêmement simple d’utiliser une entrée analogique de
l’ATtiny grâce à la fonction analogRead() qui se charge de faire ce qu’il faut
pour nous. Comme vous pouvez le remarquer dans le setup, il n’est pas
nécessaire de déclarer l’entrée analogique, la fonction analogRead() faisant
toutes les opérations nécessaires au fonctionnement du convertisseur analogique
numérique.
PWM et ATtiny
Télécharger
La figure 5 montre le montage à réaliser sur une platine d’essai pour
observer les trois PWM et les comparer à une LED allumée en permanence. Il
est alimenté en 5 V prélevé sur un module Arduino UNO.
Figure 5
À partir du moment où on sait générer de la PWM, on peut amplifier le
signal pour commander un moteur ou des locomotives ; on consultera la série
d’articles sur la PWM écrite par Jean-Luc et notamment l’article La PWM :
Qu’est ce que c’est ? (4) qui donne une solution pour le faire. Il devient ainsi
facile de fabriquer une alimentation à courant pulsé pour ceux qui opèrent en
analogique et veulent avoir des ralentis exceptionnels.
Un clignoteur universel
Figure 6
Programme ATtiny_Clignoteur_universel :
1. //*****************************************************************
2. // ATtiny_Clignoteur_universel.ino
3. //*****************************************************************
4. // potentiometre frequence sur broche 7 (A1), potentiometre duree alluma
5. // sur broche 3 (A2), potentiometre luminosite sur broche 2 (A3)
6. // periode de clignotement de 0 à 2 sec approximativement
7.
8.
9. const byte led = 0; // la LED est branchee sur PB0 broche 5 (PWM)
10. int valeurFreq = 0; // en fait valeur de la periode
11. int valeurDure = 0; // valeur duree d allumage
12. int valeurLumi = 0; // valeur luminosite de la LED
13. unsigned long debutCycle = 0;
14.
15. void setup() {
16.
17. }
18.
19. void loop() {
20. // lecture des potentiometres
21. valeurFreq = analogRead(A1); // en millisecondes de 0 à 1023
22. valeurFreq = valeurFreq * 2; // double la periode possible
23. valeurDure = analogRead(A2); // en millisecondes de 0 à 1023
24. valeurDure = valeurDure * 2; // double la duree d allumage possible
25. if(valeurDure > valeurFreq) {valeurDure = valeurFreq;} // ne peut etr
26. valeurLumi = analogRead(A3)/4; // pour intervalle 0-255
27. // prise de top et allumage LED par PWM
28.
29.
30. while((millis() - debutCycle) < valeurDure) {
31. // rester comme cela
32. }
33. // extinction de la LED
34.
35. while((millis() - debutCycle) < valeurFreq) {
36. // rester comme cela
37. }
38. // fin de la periode, il faut recommencer
39. }
Télécharger
Figure 7
Comme pour le module UNO, il existe deux sortes d’interruptions qui sont
très bien décrites dans l’article Les interruptions (1) : en bleu, une interruption
externe sur la broche 7 (PB2) appelée INT0 (le module UNO en possède deux :
INT0 et INT1), en vert, les interruptions générées par un changement d’état sur
les broches PCINT (Pin Change Interrupt) qui sont au nombre de 6 (une par
broche PB0 à PB5).
La fonction attachInterrupt() va nous permettre d’utiliser facilement
l’interruption INT0 sur la broche 7 de l’ATtiny puisqu’elle se charge de tout
configurer à notre place. Le programme suivant est très simple et permet de
changer l’état d’une LED par appui sur un poussoir branché sur la broche 7 de
l’ATtiny, ce qui génère une interruption sur un front descendant. La figure 8
montre le montage à effectuer sur une platine d’essai.
Programme ATtiny_attachInterrupt :
1. // ************************************************************
2. // ATtiny_attachInterrupt.ino
3. // ************************************************************
4. // Ce programme est inspire de l exemple donne en page reference
5. // pour attachInterrupt() en mettant 0 (INT0) a la place de
6. // digitalPinToInterrupt(pin) qui n est pas accepte pour ATtiny
7.
8. const byte ledPin = 0;
9. const byte interruptPin = 2;
10. volatile byte state = LOW;
11.
12. void setup() {
13.
14. pinMode(interruptPin, INPUT_PULLUP);
15.
16. }
17.
18. void loop() {
19.
20. }
21. void blink() {
22. state = !state;
23. }
Télécharger
Figure 8
Les interruptions PCINT peuvent également être utilisées en configurant
comme il se doit les registres du microcontrôleur, ce qui sort du cadre de cet
comme il se doit les registres du microcontrôleur, ce qui sort du cadre de cet
article. Sur ces questions liées aux interruptions, fonctions puissantes, je vous
invite une nouvelle fois à la lecture de l’article cité plus haut.
Conclusion