samedi 21 novembre 2015

Arduino Nano et LCD1602

Après avoir acheté quelques afficheurs LCD 1602 sur le site aliexpress.com il est apparu un problème de reconnaissance du port USB sur nos ordis lorsqu'ils étaient raccordés à un Arduino Nano en utilisant le schéma https://www.arduino.cc/en/Tutorial/HelloWorld . La résistance R4 de 220 Ohms semble poser problème.
Pour ne plus utiliser cette résistance R4 ainsi que le potentiomètre voici un petit montage qui utilise 2 sorties PWM ainsi qu'un exemple de programme de test.
Un transistor économique NPN 2N2222 branché en émetteur commun pilote la broche 12 (ou K) du circuit LCD 1602.
Un autre transistor économique PNP 2N2907 branché en collecteur commun pilote la broche 3 (ou VEE / Vo) du circuit LCD 1602.

Programme de test :

 /*   
    
  lcd1602 avec vatiations de luminosité de l'affichage et du fond.  
  samj le 21 novembre 2015  
  Domaine Public  
   
  Câblage :  
   
  Arduino  Resist.   2N2222        2N2907        LCD1602  
                    (E commun)   (C commun)  
   
  (+5)-------------------------------------------(2)  VCC  
  (+5)-------------------------------------------(15) LED +  
  (GND)------------------------------------------(1)  VSS  
  (GND)------------------------------------------(5)  R/W  
  (GND)-------------------(E)   
  (GND)------------------------------(C)  
  (3)------[4.7kOhm]------(B)  
  (5)------[4.7kOhm]-----------------(B)  
                          (C)---------------------(16) LED -  
                                     (E)----------(3) VEE  
  (7)---------------------------------------------(4) RS  
  (8)---------------------------------------------(6) Enable  
  (9)---------------------------------------------(11) DB4  
  (10)--------------------------------------------(12) DB5  
  (11)--------------------------------------------(13) DB6  
  (12)--------------------------------------------(14) DB7  
   
 */  
   
   
 /**********************************************  
  Initialisation  
 **********************************************/  
   
 #include <LiquidCrystal.h>  
 LiquidCrystal lcd(7, 8, 9, 10, 11 , 12); // LiquidCrystal(rs, enable, d4, d5, d6, d7)   
 int Sortie_PWM_Luminosite_Fond = 3;    // vers resistance 4.7kOhm reliée à la base 2N2222  
 int Sortie_PWM_Contrastes_Caracteres = 5; // vers resistance 4.7kOhm reliée à la base 2N2907  
 int Luminosite_Fond = 255;  
 int Luminosite_Caracteres = 50; // Ajuster cette valeur  
 int Variation_Luminosite_Caracteres;  
   
   
 /**********************************************  
  SETUP  
 **********************************************/  
 void setup()  
 {  
  pinMode(Sortie_PWM_Luminosite_Fond, OUTPUT);  
  pinMode(Sortie_PWM_Contrastes_Caracteres, OUTPUT);  
   
  FondEclaire(Luminosite_Fond, 10);  
    
  Variation_Luminosite_Caracteres = 0;  
  while(Variation_Luminosite_Caracteres < 255){  
   analogWrite(Sortie_PWM_Contrastes_Caracteres, Variation_Luminosite_Caracteres);  
   delay(20);  
   Variation_Luminosite_Caracteres++;  
  }  
   
  analogWrite(Sortie_PWM_Contrastes_Caracteres, Luminosite_Caracteres);  
   
  FondNoir(Luminosite_Fond, 20);  
  // message -> LCD  
  lcd.noCursor();   
  lcd.begin(16, 2);  
  lcd.setCursor(0,0);  
  lcd.print("Bonjour! Hello!");  
  lcd.setCursor(0,1);  
  lcd.print("V 20151121 / ");  
  lcd.print(Luminosite_Caracteres);  
  FondEclaire(Luminosite_Fond, 20);  
 }  
   
   
 /**********************************************  
  LOOP  
 **********************************************/  
 void loop()  
 {  
  FondNoir(Luminosite_Fond, 20);  
  analogWrite(Sortie_PWM_Luminosite_Fond, 0);  
  lcd.noDisplay();  
  FondEclaire(40, 50);  
  FondNoir(100, 25);  
  // message -> LCD  
  lcd.clear();  
  lcd.setCursor(0,0);  
  lcd.print("abcdefghijklmnop");  
  lcd.setCursor(0,1);  
  lcd.print("0123456789ABCDEF");  
  lcd.display();  
  FondEclaire(Luminosite_Fond,20);  
 }  
   
   
 /**********************************************  
  Fond Noir  
 **********************************************/  
 void FondNoir(int Luminosite_Origine, int BaseDeTemps)  
 {  
  int index=Luminosite_Origine;  
  analogWrite(Sortie_PWM_Luminosite_Fond, Luminosite_Origine);  
  while(index > 0){  
   analogWrite(Sortie_PWM_Luminosite_Fond, index);  
   delay(BaseDeTemps);  
   index=index-1;  
  }  
 }  
   
   
 /**********************************************  
  Fond Eclairé  
 **********************************************/  
 void FondEclaire(int Luminosite_Origine, int BaseDeTemps)  
 {  
  int index=Luminosite_Origine;  
  index=0;  
  analogWrite(Sortie_PWM_Luminosite_Fond, 0);  
  delay(2000);  
  while(index < Luminosite_Origine){  
   analogWrite(Sortie_PWM_Luminosite_Fond, index);  
   delay(BaseDeTemps);  
   index=index+1;  
  }  
  analogWrite(Sortie_PWM_Luminosite_Fond, Luminosite_Origine);  
 }  
   
 /* FIN */  

Schéma et raccordements :