Cours:Arduino7segt : Différence entre versions

De troyesGEII
Aller à : navigation, rechercher
m (Annulation des modifications 1324 de Bjacquot (discussion))
m ({{Bleu|Ex3: Toujours plus}})
 
(16 révisions intermédiaires par 3 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:Arduino7segtCorrection|{{Vert|<big>'''Éléments de correction'''</big>}}]]
  
  
Ligne 24 : Ligne 26 :
 
||0||1||0||1||1||1||1||0
 
||0||1||0||1||1||1||1||0
 
|}
 
|}
Afficher une valeur se résume à commander l'état de 8 bits, et donc une variable V de type [http://arduino.cc/en/Reference/UnsignedChar unsigned char] de valeur V=0b01011110 permet de mémoriser cette valeur.
+
Afficher une valeur se résume à commander l'état de 8 bits, et donc une variable V de type [http://arduino.cc/en/Reference/UnsignedChar unsigned char] de valeur V=B01011110 permet de mémoriser cette valeur.
  
{{Question|En utilisant par exemple l'opérateur [http://arduino.cc/en/Reference/BitwiseAnd &] compléter le programme suivant pour afficher la lettre d}}
+
'''Exemple 1 :''' Nous allons commencer par un programme qui fait clignoter toutes les LEDs de l'afficheur :
 +
<source lang=C>
  
 +
const char pinMux = 4;
 +
const char pinAff[8]={13,12,6,7,8,10,9,11};
 +
void setup(){
 +
    char i;
 +
// Déclaration des 8 sorties des afficheurs
 +
    for (i=0;i<8;i++) pinMode(pinAff[i],OUTPUT);
 +
// + sortie de multiplexage (choix de l'afficheur)
 +
    pinMode(pinMux,OUTPUT);
 +
}
 +
void loop(){
 +
    char i,c; // Les segments s'allument
 +
    for (i=0;i<8;i++) digitalWrite(pinAff[i],HIGH);
 +
    delay(500);
 +
    for (i=0;i<8;i++) digitalWrite(pinAff[i],LOW);
 +
    delay(500);
 +
}
 +
</source>
 +
'''Exemple 2''' : Comprendre le programme suivant pour un affichage de la lettre d.
 
<source lang=c>
 
<source lang=c>
 
 
 
const char pinMux = 4;
 
const char pinMux = 4;
 
const char pinAff[8]={13,12,6,7,8,10,9,11};
 
const char pinAff[8]={13,12,6,7,8,10,9,11};
const char masques[8]={?,?,4,?,?,?,?,?};                      // Liste des masques pour obtenir l'état d'un seul segment
+
const char masques[8]={1,2,4,8,16,32,64,128};                      // Liste des masques pour obtenir l'état d'un seul segment
  
const unsigned char val=....;                      // Mettre la bonne valeur donnée ci-dessus
+
const unsigned char val = B01011110;
 +
 
 +
void affiche7sgt(unsigned char v)
 +
{
 +
    char i,s;
 +
    unsigned char c;
 +
// boucle d'affichage :
 +
    for (i=0;i<8;i++)
 +
    {
 +
          // delay(300);  // A ajouter pour obtenir un "ralenti"
 +
          c = v & masques[i];  // c dépend de val,masques et du segment qui nous intéresse (donc i)
 +
          if (c == masques[i] ) digitalWrite(pinAff[i],1);        // Modifie successivement l'état des segments a (ou patte 13)
 +
                else digitalWrite(pinAff[i],0);          // puis b (ou patte 12) ... selon la valeur de c
 +
    }
 +
}
  
 
void setup()
 
void setup()
Ligne 48 : Ligne 81 :
 
void loop()
 
void loop()
 
{
 
{
    char i,s;
+
  affiche7sgt(val);
    unsigned char c;
 
 
 
    for (i=0;i<8;i++)
 
    {
 
          delay(300);                              // Inutile ! permet de ralentir pour éventuellement trouver les erreurs
 
          c = ..... ;                              // c dépend de val,masques et du segment qui nous intéresse (donc i)
 
          if (c == .. ) digitalWrite(...,0);        // Modifie successivement l'état des segments a (ou patte 13)
 
                else digitalWrite(...,1);           // puis b (ou patte 12) ... selon la valeur de c
 
    }
 
 
}
 
}
 
</source>
 
</source>
Ligne 86 : Ligne 110 :
 
Après masquage le résultat est soit nul soit strictement positif, selon la valeur du bit b2. Il suffit d'adapter pour compléter les autres valeurs du tableau masques, et de compléter l'affectation de c avec l'opérateur &.
 
Après masquage le résultat est soit nul soit strictement positif, selon la valeur du bit b2. Il suffit d'adapter pour compléter les autres valeurs du tableau masques, et de compléter l'affectation de c avec l'opérateur &.
  
Cet exemple explique la valeur 4<sub>(10)</sub>=00000100<sub>(2)</sub> ([http://arduino.cc/en/Reference/IntegerConstants ou encore 0b00000100 ou bien 0x04]) indiquée comme valeur de masques[2] dans le programme précédent.
+
Cet exemple explique la valeur 4<sub>(10)</sub>=00000100<sub>(2)</sub> ([http://arduino.cc/en/Reference/IntegerConstants ou encore B00000100 ou bien 0x04]) indiquée comme valeur de masques[2] dans le programme précédent.
  
|}
+
{{finAide}}
  
 
={{Bleu|Ex2: 0,1,2 ... 9 !}}=
 
={{Bleu|Ex2: 0,1,2 ... 9 !}}=
Ligne 94 : Ligne 118 :
 
Maintenant que nous avons un code plus facilement flexible, attaquons nous aux chiffres.
 
Maintenant que nous avons un code plus facilement flexible, attaquons nous aux chiffres.
  
Nous avons 10 symboles différents, donc nous utiliserons un tableau de type [http://arduino.cc/en/Reference/UnsignedChar unsigned char] de dimension 10 :
+
Nous avons 10 symboles différents, donc nous utiliserons un tableau de type [http://arduino.cc/en/Reference/UnsignedChar unsigned char] de dimension 10 qui remplacera la variable val de l'exemple 2 :
 
<source lang=c>
 
<source lang=c>
const unsigned char val[10]={0b00111111,..,...};    // Vous avez ici l'état des segments pour afficher le chiffre 0.
+
const unsigned char val[10]={B00111111,..,...};    // Vous avez ici l'état des segments pour afficher le chiffre 0.
 
</source>
 
</source>
  
Ligne 108 : Ligne 132 :
  
 
{{Question|Faire la modification demandée en vous inspirant [[Cours:Shieldinfo#Afficheurs_7_segments|du programme donné en exemple]].}}
 
{{Question|Faire la modification demandée en vous inspirant [[Cours:Shieldinfo#Afficheurs_7_segments|du programme donné en exemple]].}}
 +
 +
'''INDICATION''' : Réaliser d'abord un sous-programme
 +
<source lang=C>
 +
void affiche2Digits(char dizaine,char unite) {
 +
  char c;
 +
  for (c=0;c<20;c++)    {
 +
    digitalWrite(pinMux,1);  // sur l'afficheur unité
 +
  // appeler affiche7sgt
 +
    delay(10);
 +
    digitalWrite(pinMux,0);  // puis sur l'afficheur dizaine
 +
  // appeler affiche7sgt
 +
    delay(10);    }
 +
}
 +
</source>
 +
  
 
Le comptage de 0 à 99 devient alors une formalité, on vous demande 3 méthodes.
 
Le comptage de 0 à 99 devient alors une formalité, on vous demande 3 méthodes.
Ligne 120 : Ligne 159 :
 
unsigned char cpt=0;
 
unsigned char cpt=0;
 
...
 
...
 +
 +
void affiche7sgt(unsigned char v)
 +
{
 +
  ...
 +
}
  
 
void setup()
 
void setup()

Version actuelle datée du 16 janvier 2015 à 15:00

Retour à la liste des Tps

Éléments de correction


La carte utilisée pour les Tps dispose de 2 afficheurs 7 segments.

Ex1: Un premier caractère

Todo.jpg Commencez par lire la documentation et exécutez le programme donné en exemple.

Ce programme très simple ne permet pas de choisir l'état des segments individuellement.

Nous allons modifier le programme afin d'afficher la lettre d : 7-segment bcdeg.svg

L'état des segments est donné dans le tableau suivant :

sgt pt g f e d c b a
Etat Lede.png Leda.png Lede.png Leda.png Leda.png Leda.png Leda.png Lede.png
Val 0 1 0 1 1 1 1 0

Afficher une valeur se résume à commander l'état de 8 bits, et donc une variable V de type unsigned char de valeur V=B01011110 permet de mémoriser cette valeur.

Exemple 1 : Nous allons commencer par un programme qui fait clignoter toutes les LEDs de l'afficheur :

const char pinMux = 4;
const char pinAff[8]={13,12,6,7,8,10,9,11};
void setup(){
    char i;
// Déclaration des 8 sorties des afficheurs
    for (i=0;i<8;i++) pinMode(pinAff[i],OUTPUT);
// + sortie de multiplexage (choix de l'afficheur)
    pinMode(pinMux,OUTPUT);
}
void loop(){
    char i,c; // Les segments s'allument
    for (i=0;i<8;i++) digitalWrite(pinAff[i],HIGH);
    delay(500);
    for (i=0;i<8;i++) digitalWrite(pinAff[i],LOW);
    delay(500);
}

Exemple 2 : Comprendre le programme suivant pour un affichage de la lettre d.

const char pinMux = 4;
const char pinAff[8]={13,12,6,7,8,10,9,11};
const char masques[8]={1,2,4,8,16,32,64,128};                      // Liste des masques pour obtenir l'état d'un seul segment

const unsigned char val = B01011110;

void affiche7sgt(unsigned char v)
{
    char i,s;
    unsigned char c;
// boucle d'affichage :
    for (i=0;i<8;i++)
    {
          // delay(300);  // A ajouter pour obtenir un "ralenti"
          c = v & masques[i];  // c dépend de val,masques et du segment qui nous intéresse (donc i)
          if (c == masques[i] ) digitalWrite(pinAff[i],1);        // Modifie successivement l'état des segments a (ou patte 13)
                else digitalWrite(pinAff[i],0);           // puis b (ou patte 12) ... selon la valeur de c
    }
}

void setup()
{
    char i;

    for (i=0;i<8;i++) pinMode(pinAff[i],OUTPUT);    // Déclaration des 8 sorties des afficheurs
    pinMode(pinMux,OUTPUT);                         // + sortie de multiplexage (choix de l'afficheur)
    digitalWrite(pinMux,1);                         // sur l'afficheur 1
}

void loop()
{
   affiche7sgt(val);
}
Bluebg.png
Aidesmall.png
À propos de cette image

Pourquoi un "ET LOGIQUE" & ???



Les 8 bits de la variable val correspondent à l'état de chacun des segments.

Pour obtenir l'état du segment c, correspondant au bit b2, nous devons "masquer" les autres bits à l'aide de l'opérateur & (et bit à bit) :

Val 0 1 0 1 1 1 1 0
& 0 0 0 0 0 1 0 0
= 0 0 0 0 0 1 0 0

Après masquage le résultat est soit nul soit strictement positif, selon la valeur du bit b2. Il suffit d'adapter pour compléter les autres valeurs du tableau masques, et de compléter l'affectation de c avec l'opérateur &.

Cet exemple explique la valeur 4(10)=00000100(2) (ou encore B00000100 ou bien 0x04) indiquée comme valeur de masques[2] dans le programme précédent.

Ex2: 0,1,2 ... 9 !

Maintenant que nous avons un code plus facilement flexible, attaquons nous aux chiffres.

Nous avons 10 symboles différents, donc nous utiliserons un tableau de type unsigned char de dimension 10 qui remplacera la variable val de l'exemple 2 :

const unsigned char val[10]={B00111111,..,...};     // Vous avez ici l'état des segments pour afficher le chiffre 0.

Question.jpg Modifiez le programme précédent en utilisant un tableau, et affichez en boucle les chiffres de 0 à 9.

Ex3: Toujours plus

Vous allez maintenant faire un compteur de 0 à 99.

Pour ce faire vous allez commencer par modifier le compteur de 0 à 9, pour que la valeur s'affiche "simultanément" sur les 2 afficheurs, soit 00 puis 11, 22, 33 ... 99. Vous conserverez la même vitesse de comptage.

Question.jpg Faire la modification demandée en vous inspirant du programme donné en exemple.

INDICATION : Réaliser d'abord un sous-programme

void affiche2Digits(char dizaine,char unite) {
  char c;
  for (c=0;c<20;c++)    {
    digitalWrite(pinMux,1);  // sur l'afficheur unité
  // appeler affiche7sgt
    delay(10);
    digitalWrite(pinMux,0);  // puis sur l'afficheur dizaine
   // appeler affiche7sgt
    delay(10);    }
}


Le comptage de 0 à 99 devient alors une formalité, on vous demande 3 méthodes.

Question.jpg 1. Utilisez 2 boucles for imbriquées avec 2 variables u (unité) et d (dizaine !).

Question.jpg 2. Utilisez 1 seule boucle for de 0 à 99 et les opérateurs modulo et division.

Question.jpg 3. Sans utiliser de for, en incrémentant une variable globale cpt:

unsigned char cpt=0;
...

void affiche7sgt(unsigned char v)
{
   ...
}

void setup()
{
   ...
}

void loop()
{
   ...
   cpt++;
   ...
}