Bonjour,
en fouillant j'ai trouvé un CI avec 2 afficheurs 7 segments contrôlés par un SAA1064T, comme ici, ma question, très simple, et la suivante : comment puis-je arriver à faire marcher ces 2 afficheurs ?
J'ai déjà trouvé ce code :
/*
Example 39.1 - NXP SAA1064 I2C LED Driver IC Demo I
Demonstrating display of digits
http://tronixstuff.wordpress.com/tutorials > chapter 39
John Boxall July 2011 | CC by-sa-nc
*/
#include "Wire.h" // enable I2C bus
byte saa1064 = 56; // define the I2C bus address for our SAA1064 (pin 1 to GND)
int digits[16]={63, 6, 91, 79, 102, 109, 125,7, 127, 111, 119, 124, 57, 94, 121, 113};
// these are the byte representations of pins required to display each digit 0~9 then A~F
void setup()
{
Wire.begin(); // start up I2C bus
delay(500);
initDisplay();
}
void initDisplay()
// turns on dynamic mode and adjusts segment current to 12mA
{
Wire.beginTransmission(saa1064);
Wire.write((uint8_t)B00000000); // this is the instruction byte. Zero means the next byte is the control byte
Wire.write((uint8_t)B01000111); // control byte (dynamic mode on, digits 1+3 on, digits 2+4 on, 12mA segment current
Wire.endTransmission();
}
void displayDigits()
// show all digits 0~9, A~F on all digits of display
{
for (int z=0; z<16; z++)
{
Wire.beginTransmission(saa1064);
Wire.write(1); // instruction byte - first digit to control is 1 (right hand side)
Wire.write(digits[z]); // digit 1 (RHS)
Wire.write(digits[z]); // digit 2
Wire.write(digits[z]); // digit 3
Wire.write(digits[z]); // digit 4 (LHS)
Wire.endTransmission();
delay(500);
}
// now repeat but with decimal point
for (int z=0; z<16; z++)
{
Wire.beginTransmission(saa1064);
Wire.write(1); // instruction byte - first digit to control is 1 (right hand side)
Wire.write(digits[z]+128); // digit 1 (RHS)
Wire.write(digits[z]+128); // digit 2
Wire.write(digits[z]+128); // digit 3
Wire.write(digits[z]+128); // digit 4 (LHS)
Wire.endTransmission();
delay(500);
}
}
void clearDisplay()
// clears all digits
{
Wire.beginTransmission(saa1064);
Wire.write((uint8_t)1); // instruction byte - first digit to control is 1 (right hand side)
Wire.write((uint8_t)0); // digit 1 (RHS)
Wire.write((uint8_t)0); // digit 2
Wire.write((uint8_t)0); // digit 3
Wire.write((uint8_t)0); // digit 4 (LHS)
Wire.endTransmission();
}
void loop()
{
displayDigits();
clearDisplay();
delay(1000);
}
Tu connais le protocole de communication I²C ? Car ce composant (d'après le code fourni) se base la dessus. Je pense que ton controlleur de led (saa1064) peut piloter jusqu'à quatre afficheur (pas mal !) à la fois
Maintenant Pour le branchement, je vais partir du principe que tu as trouvé les doc. techniques à partir des liens que tu as donnée précédemment et que tu as le plus gros des composants (celui qui peut faire jusqu'à 16 LEDs, donc 4 afficheurs 7 segments en passant par un décodeur BCD par afficheur)
On a donc pin 12 et 13 respectivement masse et +5V.
pin 23 et 24 respectivement SDA et SCL (pour l'I²C)
3,4,5,6 -> afficheur 1
7,8,9,10 -> afficheur 2
15,16,17,18 -> afficheur 3
19,20,21,22 -> afficheur 4
Merci, mais ça c'était déjà tout fais quand je l'ai trouvé (schéma)
je voudrait savoir comment le brancher après, avec les 4 pins, sur l'arduino par exemple.
Sinon par rapport à Arduino, le 5V et la masse pauvent etre trouvé sans trop de difficulté (c'est comme le port salut, c'est marqué dessus !)
et pour SDA/SCL, première ligne de la page sur lalibrairie wire dans la doc officielle arduino :
Citation : Arduino Documentation
This library allows you to communicate with I2C / TWI devices. On most Arduino boards, SDA (data line) is on analog input pin 4, and SCL (clock line) is on analog input pin 5
Donc en francais : pin 4 analogique = SDA et sur sa voisine la 5 analogique on a SCL
Sa marche super !
Mais par contre le mec qui a fait le code l'a fait pour quatre afficheurs, j'en ai que deux, comment je pourrais modifier le code pour que sa marque qqc de normal ?
Si tu utilises exactement le même composant, tu peux utiliser le même code et les deux "Wire.write()" avant le endTransmission tu envoies 0 (ou n'importe quoi), tant que tu n'as pas de truc de brancher ca ne changera rien...
La valeur envoyé dépend du composant utilisé. Pour la comprendre il faut aller faire un tour dans la documentation technique et plus particulièrement les pages 5 et 6.
On voit alors que la ligne 26 signifie "je m'adresse au registre 'controle' " et que la 27 veut dire "On se met en mode 12 mA de courant de sortie" et "Les afficheurs 1+3 et 2+4 sont "not blancked" (donc actifs)"
Pour le configurer pour 2 afficheurs (1+3 ou 2+4) tu devras donc envoyer :
Wire.write((uint8_t)B01000011); //afficheur 1+3
OU
Wire.write((uint8_t)B01000101); //afficheur 2+4
je sais pas qui a fabriquer ça, mais quand je le met en 1+3, juste un marche, et en 2+4, c'est l'autre !
(donc je l'ai laissé normalement)
Et aussi, on peut calculer quel nombre affiche quoi ?
Du style : on veux mettre en marche le segment B et C donc on marque 10.
(parce-que moi j'y suis allé a la bourrin : une boucle entre 0 et 128 qui te dis ou elle en est sur le serial )
En tout Merci de toute ton aide !
EDIT : j'ai vu que j'utilise le 2 et le 3 y'a pas un mode pour sa ?
ben pour afficher qqc sur l'afficheur, il faut mettre un nombre entre 1 et 127 (<math>\(2^7\)</math> possibilités)
et par exemple, pour afficher un, il entrer 10, est-ce qu'il y a un rapport entre les 2 segments qui affiche le un et le 10 que l'on rentre ?
Pour afficher un 10 il faudra que tu envois indépendamment le 1 sur un afficheur et le 0 sur l'autre (en effet le composant ne sais pas comment les afficheurs sont placés, et quel type de décodeur tu utilises etc...)
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !