Pilotage d'afficheurs 8 segments avec le MAX7219 avec Arduino

1407906-1360x768-[DesktopNexus.com]_thumb[32]
Le MAX7219 est un contrôleur série d'afficheur 8 segments. Il permet de contrôler jusqu’à 8 afficheurs de 8 segments, donc 64 LEDs. On peu également les coupler pour contrôler un nombre infini de LED.
Il est très facilement utilisable avec les cartes Arduino grâce à la bibliothèque
LedControl.
Ce contrôleur fonctionne uniquement avec les afficheurs à cathode (borne -) commune.
Cette puce est trouvable à presque 10€ mais il existe des copie fonctionnant parfaitement qui se vendent environs 2€ sur internet (c'est ce que j'ai choisi).

La puce est de type traversante, donc parfait pour une breadboard et possède 24 pins. Voici le schéma :


Elle peut donc s'utiliser facilement avec une résistance de 10Kohms et un condensateur de 0,1µF.
Notez que la résistance détermine le courant traversant l'ensemble des LEDs, il peut donc être utile de légèrement la modifier, mais 10Kohms est une bonne valeur pour commencer.
Sachez que lorsque que vous tenez un afficheur 8 segment à l'endroit, la borne 1 est celle en bas à gauche et la dernière borne est celle en haut a gauche.

Je me suis donc fabriqué une petite carte regroupant tout ces composants et des connecteurs bien pratiques.



Pour l'utiliser avec Arduino, il vous faut :
  • un Arduino (évidement)
  • l'IDE d'Arduino installé sur votre ordinateur
  • un ou plusieurs afficheur 8 segments à cathode commune (ou une matrice de LED)
  • la bibliothèque LedControl installé: playground.arduino.cc/Main/LedControl

Voyons un peu le code :
#include "LedControl.h"   //on ajoute la bibliotheque LedControl

//LedControl afficheur1=LedControl(DataIn,CLK,LOAD,nombre de MAX7219);
LedControl afficheur1=LedControl(12,11,10,1);           


// prises de l'arduino sur lesquelles est branche le contrôleur.

void setup() {
  afficheur1.shutdown(0, false);  // allumer l'afficheur
  afficheur1.setIntensity(0, 15);  // regler la luminosite au maximum
  afficheur1.clearDisplay(0);   //vider l'afficheur

}

void loop() { 
  //afficheur1.setDigit(puce max7219, afficheur, nombre, point);
  afficheur1.setDigit(0,0,8,false);   


//on affiche un 8 sur le premier afficheur du premier MAX7219 avec le point décimal éteins
  afficheur1.setDigit(0,1,1,true);   


//on affiche un 1 sur le deuxième afficheur du premier MAX7219 avec le point décimal allume

}



Voici le résultat, on a bien le 8, puis le 1 et enfin le point décimal :








Quelques liens :



Une horloge sur bus I2C avec Arduino

1407906-1360x768-[DesktopNexus.com]_thumb[32]
Si votre arduino a besoin de se souvenir de l'heure qu'il est, et ce même après l'avoir débranché, vous avez besoin d'une RTC (real time clock ou horloge temps réel).
Le circuit RTC le plus répandus est le DS1307 et ce n'est pas pour rien; il est très simple, se branche sur bus I²C et ne coute que 1€ chez la plupart des vendeurs.

Le circuit DS1307 possède 8 pattes, mais une n'est pas utile, il s'utilise avec deux résistances de pull-up de 10kohms, un cristal à 32 768 kHZ et en option une pile de +3v de type CR2032.

Le SDA est la borne A4 de l'arduino et le SCL la borne A5.
Vous pouvez bien évidement acheter des modules tout fait mais je ne trouve pas ça marrant donc je me suis soudé moi-même le petit circuit en rajoutant un condensateur de 0.1µF entre le +5v et le GND.

Ensuite pour contrôler ça avec Arduino, j'utilise une librairie RTC classique : rtc-library.rar
Voici un exemple de code Arduino :

#include <Wire.h>
#include "RTClib.h"

RTC_DS1307 RTC;

void setup () {
  Serial.begin(9600);

  Wire.begin();
  RTC.begin();

  if (! RTC.isrunning()) {
    Serial.println("Le RTC ne marche pas");
    // mise à l'heure :
    RTC.adjust(DateTime(__DATE__, __TIME__));
  }


}

void loop () {
  DateTime now = RTC.now();

  Serial.print(now.year(), DEC);   //on affiche la date et l'heure sur le port série
  Serial.print('/');
  Serial.print(now.month(), DEC);
  Serial.print('/');
  Serial.print(now.day(), DEC);
  Serial.print(' ');
  Serial.print(now.hour(), DEC);
  Serial.print(':');
  Serial.print(now.minute(), DEC);
  Serial.print(':');
  Serial.print(now.second(), DEC);
  Serial.println();

  Serial.print(" depuis 1970 = ");
  Serial.print(now.unixtime());
  Serial.print("sec = ");
  Serial.print(now.unixtime() / 86400L);
  Serial.println("jours");


  Serial.println();
  delay(1000);
}



Une petite horloge que j'ai monté :










Quelques liens :