Cours:ArduinoChenillard : Différence entre versions
(→{{Bleu|Ex 2: Gestion des leds}}) |
m |
||
(9 révisions intermédiaires par 2 utilisateurs non affichées) | |||
Ligne 1 : | Ligne 1 : | ||
[[Cours:TPs_1103|{{Rouge|<big>'''Retour à la liste des Tps'''</big>}}]] | [[Cours:TPs_1103|{{Rouge|<big>'''Retour à la liste des Tps'''</big>}}]] | ||
+ | [[Cours:ArduinoChenillardCorrection|{{Vert|<big>'''Éléments de correction'''</big>}}]] | ||
L'objectif de ce Tp est de commander les différentes Leds de notre carte ShieldInfo, dont vous pouvez trouver [[Cours:Shieldinfo#Leds| le détail sur ce lien]]. | L'objectif de ce Tp est de commander les différentes Leds de notre carte ShieldInfo, dont vous pouvez trouver [[Cours:Shieldinfo#Leds| le détail sur ce lien]]. | ||
Ligne 48 : | Ligne 49 : | ||
={{Bleu|Ex 2: Gestion des leds}}= | ={{Bleu|Ex 2: Gestion des leds}}= | ||
− | {{Info|On constate dans la partie précédente, que la modification simultanée de l'état de plusieurs leds devient vite laborieux. Pour simplifier cela, | + | {{Info|On constate dans la partie précédente, que la modification simultanée de l'état de plusieurs leds devient vite laborieux. Pour simplifier cela, nous allons utiliser une fonction responsable de la modification des sorties.}} |
Nous avons à disposition 8 leds, avec 2 états différents pour chacune. Nous utiliserons donc une variable de type [http://arduino.cc/en/Reference/UnsignedChar unsigned char], ainsi chaque bit correspondra à l'état d'une led. | Nous avons à disposition 8 leds, avec 2 états différents pour chacune. Nous utiliserons donc une variable de type [http://arduino.cc/en/Reference/UnsignedChar unsigned char], ainsi chaque bit correspondra à l'état d'une led. | ||
− | Par exemple si val= | + | Par exemple si val=B11001111, le tableau suivant résume l'état des leds : |
{| class="wikitable" | {| class="wikitable" | ||
Ligne 62 : | Ligne 63 : | ||
|} | |} | ||
− | + | Nous utilisons donc une fonction, dont le prototype est donné ci après, qui prendra en paramètre une valeur de type unsigned char, et allumera en conséquence les leds. | |
<source lang=c> | <source lang=c> | ||
Ligne 68 : | Ligne 69 : | ||
</source> | </source> | ||
− | {{ | + | {{Todo|Le programme suivant, à comprendre, permet de commander indépendamment chaque led, en fonction de val :}} |
<source lang=c> | <source lang=c> | ||
− | unsigned char patteLeds[8] = { | + | unsigned char patteLeds[8] = {6, 7, 8, ... }; // se référer à la page ShieldInfo |
void allumeLeds(unsigned char val) | void allumeLeds(unsigned char val) | ||
Ligne 78 : | Ligne 79 : | ||
unsigned char etat; | unsigned char etat; | ||
− | for (i=0;i<8;i++) | + | for (i=0;i<8;i++) // il y a 8 leds |
{ | { | ||
− | etat = | + | etat = (val>>i)&1; // cette valeur dépend de val, mais aussi de i, cf plus bas |
− | digitalWrite( | + | digitalWrite( patteLeds[i] , etat); // modification de la sortie |
− | |||
} | } | ||
} | } | ||
</source> | </source> | ||
− | {{ | + | {{Aide|Toute la difficulté réside dans la valeur de etat.}} |
+ | |||
+ | |||
+ | Le tableau suivant va vous aider à comprendre la méthode utilisée : | ||
{| class="wikitable" | {| class="wikitable" | ||
|- | |- | ||
− | || val || val>>1 || val>>2 || val>>3 || val>>4 || val>>5 || val>>6 || val>>7 | + | || 1100111{{Rouge|1}} || 110011{{Rouge|1}}1 || 11001{{Rouge|1}}11 || 1100{{Rouge|1}}111 || 110{{Rouge|0}}1111 || 11{{Rouge|0}}01111 || 1{{Rouge|1}}001111 || {{Rouge|1}}1001111 |
+ | |- | ||
+ | || val>>0 || val>>1 || val>>2 || val>>3 || val>>4 || val>>5 || val>>6 || val>>7 | ||
|- | |- | ||
|| 1100111{{Rouge|1}} || 0110011{{Rouge|1}} || 0011001{{Rouge|1}} || 0001100{{Rouge|1}} || 0000110{{Rouge|0}} || 0000011{{Rouge|0}} || 0000001{{Rouge|1}} || 0000000{{Rouge|1}} | || 1100111{{Rouge|1}} || 0110011{{Rouge|1}} || 0011001{{Rouge|1}} || 0001100{{Rouge|1}} || 0000110{{Rouge|0}} || 0000011{{Rouge|0}} || 0000001{{Rouge|1}} || 0000000{{Rouge|1}} | ||
|- | |- | ||
− | || val&1 || (val>>1)&1 || (val>>2)&1 || (val>>3)&1 || (val>>4)&1 || (val>>5)&1 || (val>>6)&1 || (val>>7)&1 | + | || (val>>0)&1 || (val>>1)&1 || (val>>2)&1 || (val>>3)&1 || (val>>4)&1 || (val>>5)&1 || (val>>6)&1 || (val>>7)&1 |
|- | |- | ||
|| 0000000{{Rouge|1}} || 0000000{{Rouge|1}} || 0000000{{Rouge|1}} || 0000000{{Rouge|1}} || 0000000{{Rouge|0}} || 0000000{{Rouge|0}} || 0000000{{Rouge|1}} || 0000000{{Rouge|1}} | || 0000000{{Rouge|1}} || 0000000{{Rouge|1}} || 0000000{{Rouge|1}} || 0000000{{Rouge|1}} || 0000000{{Rouge|0}} || 0000000{{Rouge|0}} || 0000000{{Rouge|1}} || 0000000{{Rouge|1}} | ||
|} | |} | ||
+ | {{finAide}} | ||
− | Vous pourrez utiliser le programme suivant pour tester le bon fonctionnement de | + | Vous pourrez utiliser le programme suivant pour tester le bon fonctionnement de la fonction : |
<source lang=c> | <source lang=c> | ||
− | char patteLeds[8] = { | + | char patteLeds[8] = {6, 7, 8, ... }; // se référer à la page ShieldInfo |
void allumeLeds(char val) | void allumeLeds(char val) | ||
Ligne 114 : | Ligne 120 : | ||
void setup() | void setup() | ||
{ | { | ||
− | char i; | + | char i; |
+ | for (i=6;i<=13;i++) pinMode(i,OUTPUT); // Déclaration des 6 sorties | ||
} | } | ||
void loop() | void loop() | ||
{ | { | ||
− | allumeLeds( | + | allumeLeds(B10101010); |
delay(1000); | delay(1000); | ||
− | allumeLeds( | + | allumeLeds(B01010101); |
delay(1000); | delay(1000); | ||
} | } |
Version actuelle datée du 16 octobre 2014 à 07:59
L'objectif de ce Tp est de commander les différentes Leds de notre carte ShieldInfo, dont vous pouvez trouver le détail sur ce lien.
Il ne faut pas perdre de vue les points suivants :
- avant toute utilisation d'une sortie il faut la passer en mode sortie. Ceci se fait généralement dans le "setup()"
- les leds s'allument lorsqu'un niveau logique haut est présent sur la sortie associée. Ce sera toutjours le cas pour nos LEDs mais d'autre possibilités peuvent se rencontrer en pratique avec d'autres cartes
- digitalWrite(s,v) permet d'attribuer une valeur (v) sur la sortie (s), comme précisé sur cette page
Sommaire
Ex 1: Découverte
Un début simpliste
Commençons simplement par allumer puis éteindre l'une des leds ! Le cadencement sera obtenu par la fonction delay().
Recopier le programme suivant, et exécuter le.
Vous devez ensuite modifier le programme pour faire clignoter les leds f4 et f1 selon le cycle 1s éteintes et 100ms allumées.
void setup() // Configuration, exécuté une seule fois avant tout autre fonction
{
pinMode(6,OUTPUT); // On commande une led, c'est donc une sortie
}
void loop() // Boucle : on exécute les instructions et on recommence
{
digitalWrite(6,1); // On place la sortie à l'état 1, la led s'allume
delay(1000); // Attente de 1s
digitalWrite(6,0); // Passage à 0 de la sortie, extinction de la led
delay(1000); // Attente de 1s
}
Plus de leds
Vous avez à disposition sur votre platine 8 leds indépendantes. Nous souhaitons afficher 2 motifs différents sur cet ensemble de leds, à savoir :
En vous inspirant du programme précédent, faire un programme affichant successivement ces 2 motifs pendant 0,5s. Vous ne pouvez pas faire cet exercice sans lire le détail de l'implantation des LEDs sur notre shield !
Ex 2: Gestion des leds
On constate dans la partie précédente, que la modification simultanée de l'état de plusieurs leds devient vite laborieux. Pour simplifier cela, nous allons utiliser une fonction responsable de la modification des sorties.
Nous avons à disposition 8 leds, avec 2 états différents pour chacune. Nous utiliserons donc une variable de type unsigned char, ainsi chaque bit correspondra à l'état d'une led. Par exemple si val=B11001111, le tableau suivant résume l'état des leds :
val | 1 | 1 | 0 | 0 | 1 | 1 | 1 | 1 |
---|---|---|---|---|---|---|---|---|
État led |
Nous utilisons donc une fonction, dont le prototype est donné ci après, qui prendra en paramètre une valeur de type unsigned char, et allumera en conséquence les leds.
void allumeLeds(unsigned char val);
Le programme suivant, à comprendre, permet de commander indépendamment chaque led, en fonction de val :
unsigned char patteLeds[8] = {6, 7, 8, ... }; // se référer à la page ShieldInfo
void allumeLeds(unsigned char val)
{
char i;
unsigned char etat;
for (i=0;i<8;i++) // il y a 8 leds
{
etat = (val>>i)&1; // cette valeur dépend de val, mais aussi de i, cf plus bas
digitalWrite( patteLeds[i] , etat); // modification de la sortie
}
}
|
Vous pourrez utiliser le programme suivant pour tester le bon fonctionnement de la fonction :
char patteLeds[8] = {6, 7, 8, ... }; // se référer à la page ShieldInfo
void allumeLeds(char val)
{
...
}
void setup()
{
char i;
for (i=6;i<=13;i++) pinMode(i,OUTPUT); // Déclaration des 6 sorties
}
void loop()
{
allumeLeds(B10101010);
delay(1000);
allumeLeds(B01010101);
delay(1000);
}
Modifier ensuite le programme pour répondre à la question 1.2
Ex 3: Chenillard
A l'aide des questions précédentes, écrire le programme du chenillard
Il s'agit d'allumer une seule led et de faire en sorte qu'elle se "déplace" de droite à gauche :