LCD KeyPad Shield For Arduino

Keyz
Messages : 4
Enregistré le : 22 déc. 2011 00:21
Prénom : Matthieu

Re: LCD KeyPad Shield For Arduino

Message par Keyz »

Code : Tout sélectionner

#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
byte smiley[8] = {
B00000,
B10001,
B00000,
B00000,
B10001,
B01110,
B00000,
};
void setup() {
lcd.createChar(0, smiley);
lcd.begin(16, 2);
lcd.write(0);
}
void loop() {}
Cet exemple de création d'un smiley dans la CGRAM (Caracter Generator RAM), qui permet de customiser 8 caractères de matrice 5x8 pixels, soit au total 64 octets; commence à l'adresse 64 (0×40 en hexa) et se termine donc à 127 (0×7F en hexa).
Les cinq LSB(Least Significant Bits) bits de poids faible, de chaque octet déterminent les pixels dans chaque rangée.

http://arduino.cc/fr/Main/LcdcreateChar

cet exemple fonctionne avec une version 22 (Arduino v22) mais pas avec la dernière mouture Arduino 1.0
à moins de remplacer

Code : Tout sélectionner

lcd.write(0);
par

Code : Tout sélectionner

lcd.write((uint8_t)0);
le problème est que 0(zero) peut être un uint8_t ou un char *


la version 1.0 a apporté des modifications à l'api arduino, le fichier WProgram.h se nomme désormais Arduino.h, les classes Print, Serial, ... ont été modifiées.
A l'heure actuelle AUCUNE librairie réalisée pour les versions 0023, 0022 ... ne peut se compiler sous l'arduino IDE 1.0.
Le problème que Fred et moi avions rencontré viendrait donc de là!
http://23-7.net/2011/12/arduino-1-0/
Modifié en dernier par Keyz le 28 déc. 2011 08:02, modifié 1 fois.
Avatar du membre
Christian
Coadmin
Coadmin
Messages : 4824
Enregistré le : 28 août 2007 21:54
Prénom : Christian
Localisation : Entre Alpes et Jura
Contact :

Re: LCD KeyPad Shield For Arduino

Message par Christian »

Merci Mathieu pour les précisions de compatibilité entre version du soft Arduino (c'est un peu ennuyeux, mais pas dramatique ...)
Autrement, c'est marrant que tu proposes cette possibilité de création de caractères spéciaux "graphiques" car j'avais déjà préparé un code pour montrer cela.
Celui-ci créé 4 flèches (haut, bas, gauche, droite, et un carré (select)
J'espère que Fred ne va pas s'arracher les cheveux car là ça se charge un peu ... :mrgreen:
Mais en fait c'est très simple, il suffit de "dessiner" le symbole en plaçant des 1 ou des 0, puis de le déclarer. La librairie LiquidCrystal s'occupe du reste.
Perso je m'aide sur une feuille de papier en dessinant les pixels sur un quadrillage de 5 de large x 8 de haut.
Remarquez au passage le magnifique coup de peinture rouge sur le bouton Reset ! :)
Du vert ou du bleu sur "Select" compléterait bien ...
LCD_Car_Speciaux.jpg
LCD_Car_Speciaux.jpg (121.34 Kio) Vu 17535 fois
Et le code (qui fonctionne bien avec la dernière version du soft Arduino, 1.0) :

Code : Tout sélectionner

/*******************************************************
 * Test activation/désactivation retro-éclairage LCD 5 boutons DFRobot
 * Création de caractères spéciaux LCD
 * Ch.Aubert, Dec. 2011 
 * 
 ********************************************************/


/************* Librairie(s) à inclure ****************/
#include <LiquidCrystal.h>

/****************   Définir des caractères spéciaux LCD (8 caractères max) ********************/

byte Char_UP[8] = { // Flèche haut (tableau de 8 octets)
  B00000, // définition de chaque octet au format binaire
  B00000, // 1 pour pixel affiché - 0 pour pixel éteint
  B00100, // les 3 bits de poids forts ne sont pas écrits car inutiles
  B01110,
  B11111,
  B00000,
  B00000,
  B00000
};
//
byte Char_DOWN[8] = { // Flèche bas 
  B00000, 
  B00000, 
  B11111, 
  B01110,
  B00100,
  B00000,
  B00000,
  B00000
};
//
byte Char_RIGHT[8] = { // Flèche droite 
  B00000, 
  B00000, 
  B10000, 
  B11000,
  B11100,
  B11000,
  B10000,
  B00000
};
//
byte Char_LEFT[8] = { // Flèche gauche 
  B00000, 
  B00000, 
  B00001, 
  B00011,
  B00111,
  B00011,
  B00001,
  B00000
};
//
byte Char_ENTER[8] = { // Enter 
  B00000, 
  B00000, 
  B01110, 
  B01110,
  B01110,
  B01110,
  B00000,
  B00000
};
/****************  Fin caractères spéciaux LCD ********************/


/************* Définition des broches (pins) du LCD 5 boutons DFRobot  ****************/
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); 
const byte PinLCDBacklight = 10; // broche LCD Backlight 
const byte PinBouton = 0; // broche analogique (A0) utisé pour les 5 boutons


/************* Définition des autres E/S ****************/
//const byte PinLedArduino = 13; // Led sur circuit Arduino



/************* Constantes programme ****************/
const byte btnRIGHT = 0; // define some values used by the panel and buttons
const byte btnUP = 1;
const byte btnDOWN = 2;
const byte btnLEFT = 3;
const byte btnSELECT = 4;
const byte btnNONE = 5;


/************* Variables ****************/
byte  lcd_key = 0;
int  adc_key_in = 0;


/************* Setup ****************/
void setup()
{
  lcd.begin(16, 2);        // initialiser la LCD library, 16 caractères, 2 lignes
  //pinMode(PinLedArduino, OUTPUT); 

  lcd.createChar(1, Char_UP); // création du caractère LCD personnalisé numéro 1, etc ...
  lcd.createChar(2, Char_DOWN); // A placer après "LCD.begin"  (ou .init) sinon ça bug !!
  lcd.createChar(3, Char_RIGHT); 
  lcd.createChar(4, Char_LEFT); 
  lcd.createChar(5, Char_ENTER); 

  pinMode(PinLCDBacklight, OUTPUT); // Broche LCD backlight en sortie
  digitalWrite(PinLCDBacklight, HIGH); // Retro-éclairage actif (par défaut il est déjà mais je le justifie ici)


}


/************* Boucle principale ****************/
void loop()
{
  lcd.setCursor(0,0);      // placer le curseur à la première ligne, première position
  lcd.print("LCD backlight"); // texte d'accueil
  lcd.setCursor(0,1);            // placer le curseur au début de la seconde ligne

  lcd.print("On"); // texte boutons
  lcd.write(4); // fl.gauche 
  lcd.print(" Off"); // texte boutons
  lcd.write(3); // fl.droite

  lcd_key = read_LCD_buttons();  // lire la valeur du bouton (->fonction)

  switch (lcd_key)               // selon le bouton appuyé ...
  {
  case btnRIGHT:
    {
      digitalWrite(PinLCDBacklight, LOW); // Retro-éclairage éteint
      //lcd.noDisplay(); // désactive l'affichage texte
      break;
    }
  case btnLEFT:
    {
      digitalWrite(PinLCDBacklight, HIGH); // Retro-éclairage actif
      //lcd.display(); // active l'affichage texte
      break;
    }
  case btnUP:
    {
      break;
    }
  case btnDOWN:
    {
      break;
    }
  case btnSELECT:
    {
      break;
    }
  case btnNONE:
    {
      break;
    }
  }

}

/************* Sous programmes ****************/




/************* Fonctions ****************/

//  Lire la valeur A/D retournée selon le bouton choisi
int read_LCD_buttons()
{
  adc_key_in = analogRead(PinBouton);   
  if (adc_key_in > 1000) return btnNONE; // On commence par la valeur la plus probable : Aucun appui sur bouton !
  if (adc_key_in < 50)   return btnRIGHT;  
  if (adc_key_in < 195)  return btnUP; 
  if (adc_key_in < 380)  return btnDOWN; 
  if (adc_key_in < 555)  return btnLEFT; 
  if (adc_key_in < 790)  return btnSELECT;   
  return btnNONE;  // si aucun appui sur bouton, on retoune la constante btnNONE ...
}
Edit: Renumérotation des caractères spéciaux (de 1 à 5)
Bien amicalement, Christian
Microscope : Leitz Ortholux I - Stéréomicroscope : Novex AP5 - Divers bancs macro
Photos: Nikon (D70) D90, Canon A75, MicCam Tucsen 3 mpx
Soft: Photoshop - MicroCartouche - Helicon focus -Stepduino (stacking automatisé)
Site perso (ancien) ici

Avatar du membre
Fredlab
membre
membre
Messages : 9607
Enregistré le : 27 juin 2010 14:42
Prénom : Frederic
Localisation : Auxonne (21)
Contact :

Re: LCD KeyPad Shield For Arduino

Message par Fredlab »

Hello

Un grand merci à Matthieu le traducteur d'algonquin et à Christian pour toutes vos précisions et le lignes de code qui vont avec.

- Pour le passage "pde" -> "ino", le copier/coller depuis un éditeur de texte, ça marche.
- Pour les librairies, je commence à comprendre... la version de mon logiciel est différente (1.0 - la plus récente) et certaines librairies, extérieures (celle du LCD DFRobot par exemple) sont incompréhensibles pour ce logiciel.
... encore heureux que certains trouvent un moyen de détourner le problème (et dans le cas du LCD DFRobot, la librairie "interne" <LiquidCrystal.h> semble fonctionner)
- en est-il de même pour d'éventuelles librairies pour des cartes de puissance ?

Je vais essayer de faire fonctionner l'écran en-dehors de l'Arduino (je n'ai toujours pas monté le shield de prototypage... j'attends quelques recommandations - avec l'écran enfiché sur l'Arduino, je n'avais accès à aucun port pour tester quoi que ce soit)
Ensuite, j'essaye de comprendre le code fourni par Christian et je teste.
Eventuellement, je regarderais pour rajouter un menu de plus, celui du "bipper" - un piezo sur un autre port...
La planète peut pourvoir aux besoins de tous, mais non pas satisfaire la cupidité de certains (Gandhi)
Avatar du membre
Christian
Coadmin
Coadmin
Messages : 4824
Enregistré le : 28 août 2007 21:54
Prénom : Christian
Localisation : Entre Alpes et Jura
Contact :

Re: LCD KeyPad Shield For Arduino

Message par Christian »

@ Fred
... en est-il de même pour d'éventuelles librairies pour des cartes de puissance ?
Je vais m'y mettre sou peu ! (j'ai déjà repéré pas mal de choses)
En fait il n'y a pas de librairies toute faites ou officiels pour les cartes de puissance que nous avons commandé (Pololu ou Sparkfun).
Mais la programmation de base est très simple et ces 2 drivers possèdent une puce préprogrammée, donc la plupart du travail est fait en interne par celle-ci ;)
(cela n'empêche pas qu'une librairie dédiée serait pratique pour des opérations plus complexes, à voir ...)
En revanche il faut faire attention au préréglage de ces drivers (ampérage), je tâcherai de vous expliquer tout ça, dans un sujet dédié bien sûr !

Pour le shield de prototypage que j'avais proposé au début du fil Stepduino part.1, ben ... il est pas génial finalement ... (le "SrewShield" est bien plus intéressant)
Je poste un topo plus tard. (ne soude pas tout de suite)
Bien amicalement, Christian
Microscope : Leitz Ortholux I - Stéréomicroscope : Novex AP5 - Divers bancs macro
Photos: Nikon (D70) D90, Canon A75, MicCam Tucsen 3 mpx
Soft: Photoshop - MicroCartouche - Helicon focus -Stepduino (stacking automatisé)
Site perso (ancien) ici

Avatar du membre
Fredlab
membre
membre
Messages : 9607
Enregistré le : 27 juin 2010 14:42
Prénom : Frederic
Localisation : Auxonne (21)
Contact :

Re: LCD KeyPad Shield For Arduino

Message par Fredlab »

Bon... Christian, si tu es dans les parages, tu vas pouvoir m'aider.
J'ai déclipsé l'écran de l'Arduino.
J'ai branché des fils pour relier l'Arduino à l'écran, en respectant - a priori - les pins
Je branche l'Arduino, l'écran s'allume... pas de texte dessus (alors qu'hier, il y avait encore quelque chose)
Je copie/colle ton code pour le controle du backlight puis je l'envoie à l'Arduino -> rien de plus.

Une idée ?

(les ports A0 - 4-5-6-7-8-9 + 10 + reset + GND (à côté du 13) sont branchés)
(j'ai oublié quelque chose ?)
La planète peut pourvoir aux besoins de tous, mais non pas satisfaire la cupidité de certains (Gandhi)
Avatar du membre
Christian
Coadmin
Coadmin
Messages : 4824
Enregistré le : 28 août 2007 21:54
Prénom : Christian
Localisation : Entre Alpes et Jura
Contact :

Re: LCD KeyPad Shield For Arduino

Message par Christian »

As-tu essayé de le brancher directement sur l'Arduino et chargé mon dernier code, celui-ci n'implique aucune autre connexion. On verra déjà si tout fonctionne bien !
NB: La libraire LiquidCrystal que j'utilise est bien celle installée par défaut avec le soft Arduino ver. 1.0 !
Bien amicalement, Christian
Microscope : Leitz Ortholux I - Stéréomicroscope : Novex AP5 - Divers bancs macro
Photos: Nikon (D70) D90, Canon A75, MicCam Tucsen 3 mpx
Soft: Photoshop - MicroCartouche - Helicon focus -Stepduino (stacking automatisé)
Site perso (ancien) ici

Avatar du membre
Fredlab
membre
membre
Messages : 9607
Enregistré le : 27 juin 2010 14:42
Prénom : Frederic
Localisation : Auxonne (21)
Contact :

Re: LCD KeyPad Shield For Arduino

Message par Fredlab »

J'ai remis le LCD sur l'Arduino
J'ai l'affichage du texte...
si j'appuie sur le bouton de gauche, ça allume le LCD (bouton "On") et si j'appuie sur le bouton de droite ("Off"), alors le rétroéclairage s'éteint.

... étape suivante : si on veut dépasser les deux choix (qui seraient validés par un bouton ou un autre), il faudrait avoir dans la ligne du bas qu'une option ("On" par exemple) et avec une des deux touches, gauche ou droite, on bascule vers l'autre option (ou "x" autres options -> menu "défilant" de gauche à droite ou inversement) et on valide le choix par le bouton "Select" :grat:

Depuis lundi, je suis sensé me pencher sur les nouveaux programmes de TermS :?

signé "Fredlab, la mouche du coche" :oops:
La planète peut pourvoir aux besoins de tous, mais non pas satisfaire la cupidité de certains (Gandhi)
Avatar du membre
Fredlab
membre
membre
Messages : 9607
Enregistré le : 27 juin 2010 14:42
Prénom : Frederic
Localisation : Auxonne (21)
Contact :

Re: LCD KeyPad Shield For Arduino

Message par Fredlab »

Je rebondis sur cette partie de post
Christian a écrit :Pour le shield de prototypage que j'avais proposé au début du fil Stepduino part.1, ben ... il est pas génial finalement ... (le "SrewShield" est bien plus intéressant)
Je poste un topo plus tard. (ne soude pas tout de suite)
Si on ne veut pas se casser la nenette, on achète celui-là ?

Enfin, je pense quand même utiliser les pièces qui sont déjà là.
La planète peut pourvoir aux besoins de tous, mais non pas satisfaire la cupidité de certains (Gandhi)
Avatar du membre
Christian
Coadmin
Coadmin
Messages : 4824
Enregistré le : 28 août 2007 21:54
Prénom : Christian
Localisation : Entre Alpes et Jura
Contact :

Re: LCD KeyPad Shield For Arduino

Message par Christian »

Re Fred,
J'ai celui-ci > http://www.dfrobot.com/index.php?route= ... uct_id=468, c'est visiblement le même.
Le problème avec l'autre http://www.lextronic.fr/P20509-kit-prot ... o-uno.html c'est qu'il s'empile mal sur l'Arduino Uno si on met directement des barrettes mâles/femelles pour empiler (il touche le port USB et c'est dangereux !)
Il peut être utilisable quand même avec des barrettes plus hautes, et/ou les composants sont bien utiles pour les tests sur "breadboard" (boutons, Leds et résistances) ...
Le "SrewShield" a surtout l'avantage des sorties sur borniers, bien pratique en phase d'essais, et pourquoi pas définitif !
Sa partie pastillée est visible ici > http://www.lenaturaliste.net/forum/view ... 452#p52441
Bien amicalement, Christian
Microscope : Leitz Ortholux I - Stéréomicroscope : Novex AP5 - Divers bancs macro
Photos: Nikon (D70) D90, Canon A75, MicCam Tucsen 3 mpx
Soft: Photoshop - MicroCartouche - Helicon focus -Stepduino (stacking automatisé)
Site perso (ancien) ici

pierre4fun
membre
membre
Messages : 731
Enregistré le : 28 oct. 2009 20:18
Prénom : Pierre

Re: LCD KeyPad Shield For Arduino

Message par pierre4fun »

Les essais avec les codes de Christian donnent sur mon LCD:

Le 1er code qui affiche les valeurs de touches fonctionne pour les 4 touches de direction
Le Code pour allumer éteindre fonctionne.
Amicalement, Pierre
Répondre

Retourner vers « Afficheurs LCD et modules de saisie (boutons, joystick, ..) »