View  Edit  Attributes  History  Attach  Print  Search

ACCUEIL | ARDUINO > S'INSTALLER > DEBUTER > APPROFONDIR | PROCESSING | MECATRONIQUE | MATERIEL | OUTILS | TESTS | Plus...|
Python > Shell > ATELIERS Python + Qt > PyQt apps > PyQt+Arduino | Mes Robots | RepRap | Mes lib'Arduino | Mes shields Arduino | Mes distros | Les Mini-PC |
ATELIERS ARDUINO| VIDEOS | COMPRENDRE | REFERENCES | CODER | TECHNIQUE | GNU/LINUX | LIENS | Rien à voir |

Déplacement d'un pixel sur l'écran TFT d'un module S65shield à l'aide d'un encodeur rotatif.

ARDUINO - TFT - ENCODEUR
Par X. HINAULT - Créé le 29/09/2010

Présentation

Ce programme permet de déplacer un pixel sur l'écran du module S65 shield, à la façon d'un "télécran".

Ce programme utilise les fonctionnalités suivantes :

  • Utilise un afficheur TFT 65536 couleurs Graphique 132x176 type S65
  • Utilise l'Encodeur Rotatif du module S65
  • Utilise interruption du Timer 2 à intervalle régulier

Voir également :

Matériel Nécessaire

L'espace de développement Arduino

  • ... pour éditer, compiler le programme et programmer la carte Arduino.

Le matériel suivant pour réaliser le montage associé

  • un module avec afficheur couleur TFT 176x132

Acheté ici ( 35 Euros TTC seulement !) : http://www.watterott.com/en/Arduino-S65-Shield
Documentation ici : Module d'affichage à écran couleur Arduino S65 shield
Librairie pour afficheur TFT couleur S65

Instructions de montage

Le module S65 Shield est à enficher directement broche à broche sur la carte Arduino réalisant ainsi les connexions suivantes : Ecran graphique S65 TFT contrôlé par 5 broches :

  • broche S65_DAT du module sur la broche 11 de la carte Arduino
  • broche S65_CLK du module sur la broche 13 de la carte Arduino
  • broche S65_RS du module sur la broche 4 de la carte Arduino
  • broche S65_RST du module sur la broche 17 de la carte Arduino
  • broche S65_CS du module sur la broche 16 de la carte Arduino

Encodeur rotatif contrôlé par 3 broches :

  • broche RE_SW du module sur la broche 5 de la carte Arduino
  • broche RE_PhA du module sur la broche 6 de la carte Arduino
  • broche RE_PhB du module sur la broche 7 de la carte Arduino


Le schéma théorique du montage


Le schéma théorique du montage

Le circuit du montage


Le schéma du montage à réaliser

Explication du programme

  • Une interruption est générée toutes les millisecondes grâce au timer2 : l'état de l'encodeur est lu à chaque interruption.
  • Deux variables sont utilisées pour les coordonnées x et y du point à afficher et sont incrémentées/décrémentées lors de la rotation de l'encodeur.
  • L'encodeur reste sans effet lorsque l'on atteint les bords de l'écran.
  • L'appui sur le BP d'axe de l'encodeur entraîne le changement de sens de déplacement HAUT/BAS ou DROIT/GAUCHE.
  • 2 versions du programmes sont présentées : une avec affichage d'un seul point et l'autre avec affichage persistant des points.

Mise en oeuvre du programme

Préparation du montage et programmation de la carte Arduino :

  • Commencer par réaliser le montage indiqué sur plaque d'expérimentation
  • Ensuite, programmer la carte Arduino avec ce programme (en bas de page) selon la procédure habituelle

Fonctionnement

  • la rotation de l'encodeur modifie la position du point affiché.
  • L'appui sur le BP d'axe de l'encodeur entraîne le changement de sens de déplacement HAUT/BAS ou DROIT/GAUCHE.

Le programme complet en langage Arduino (version sans trace persistante) :

A copier/coller directement dans l'éditeur Arduino


// --- Programme Arduino ---
// Copyright X. HINAULT - Créé le 03/04/2010
// www.mon-club-elec.fr 

//  Code sous licence GNU GPL : 
//  This program is free software: you can redistribute it and/or modify
//  it under the terms of the GNU General Public License as published by
//  the Free Software Foundation, either version 3 of the License,
//  or any later version.
//  This program is distributed in the hope that it will be useful,
//  but WITHOUT ANY WARRANTY; without even the implied warranty of
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//  GNU General Public License for more details.
//  You should have received a copy of the GNU General Public License
//  along with this program.  If not, see <http://www.gnu.org/licenses/>.
//  

// --- Que fait ce programme ? ---
/* test encodeur rotatif avec interruption timer 2 à intervalle régulier*/

// --- Fonctionnalités utilisées ---
// Utilise un afficheur TFT 65536 couleurs Graphique 132x176 type S65
// Utilise l'Encodeur Rotatif du module S65 
// Utilise interruption du Timer 2 à intervalle régulier

// --- Circuit à réaliser ---
// Le module S65 Shield est à enficher directement broche à broche  
// sur la carte Arduino réalisant ainsi les connexions suivantes : 
// Ecran graphique S65 TFT contrôlé par 5 broches : 
// 	> broche S65_DAT du module sur la broche 11 de la carte Arduino 
// 	> broche S65_CLK du module sur la broche 13 de la carte Arduino 
// 	> broche S65_RS du module sur la broche 4 de la carte Arduino 
// 	> broche S65_RST du module sur la broche 17 de la carte Arduino 
// 	> broche S65_CS du module sur la broche 16 de la carte Arduino 
//
// Encodeur rotatif contrôlé par 3 broches : 
// 	> broche RE_SW du module sur la broche 5 de la carte Arduino 
// 	> broche RE_PhA du module sur la broche 6 de la carte Arduino 
// 	> broche RE_PhB du module sur la broche 7 de la carte Arduino 

//**************** Entête déclarative *******
// A ce niveau sont déclarées les librairies, les constantes, les variables...

// --- Inclusion des librairies utilisées ---

#include <S65Display.h> // Inclusion de la librairie pour afficheur TFT couleur S65 

#include <RotaryEncoder.h> // Inclusion de la librairie pour encodeur rotatif du module S65 
#include <MsTimer2.h> // inclusion de la librairie Timer2

// --- Déclaration des constantes ---

// --- constantes des broches ---


// --- Déclaration des variables globales ---
volatile int compt=0;
int compt0=0;

volatile int x=0,y=0;
int xo=0, yo=0; 

volatile int sens=0; 

// --- Déclaration des objets utiles pour les fonctionnalités utilisées ---

S65Display lcd; // Création d'un objet afficheur S65 appelé lcd 


RotaryEncoder encodeur; // Création d'un objet RotaryEncoder appelé encodeur 


//**************** FONCTION SETUP = Code d'initialisation *****
// La fonction setup() est exécutée en premier et 1 seule fois, au démarrage du programme

void setup()   { // debut de la fonction setup()

// --- ici instructions à exécuter au démarrage --- 

lcd.init(4); // initialise l'afficheur TFT couleur S65 avec communication SPI à Fosc/4 = 4 Mhz

// test de l'afficheur 
lcd.clear(RGB(255,0,0)); // efface ecran en rouge
delay (1000); // pause 
lcd.clear(RGB(0,255,0)); // efface ecran en vert
delay (1000); // pause 
lcd.clear(RGB(0,0,255)); // efface ecran en bleu
delay (1000); // pause 
lcd.clear(RGB(255,255,255)); // efface ecran en blanc

lcd.drawPixel(x,y,bleu); // affiche pixel bleu en x,y

encodeur.init(); // initialise l'encodeur rotatif du module S65 sur les broches 5,6,7.


// ------- Broches en sortie -------  


// ------- Broches en entrée -------  


// ------- Activation du rappel au + interne des broches en entrée si nécessaire -------  

// initialisation interruption Timer 2
  MsTimer2::set(1, InterruptTimer2); // période 1ms 
  MsTimer2::start(); // active Timer 2 


} // fin de la fonction setup()
// ********************************************************************************

//*************** FONCTION LOOP = Boucle sans fin = coeur du programme *************
// la fonction loop() s'exécute sans fin en boucle aussi longtemps que l'Arduino est sous tension

void loop(){ // debut de la fonction loop()

// --- ici instructions à exécuter par le programme principal --- 

//variable = encodeur.step(); // renvoie état courant de l'encodeur = valeur 0,1 ou -1
//variable = encodeur.sw(); // renvoie état courant du BP de l'axe de l'encodeur = valeur 0, SW_PRESSED, SW_PRESSEDLONG

if (x!=xo) 
{

  x=constrain (x,0,175); // oblige x à rester dans la fourchette 
  lcd.drawPixel(xo,yo,blanc); // affiche pixel blanc en xo,yo =efface pixel précédent
  lcd.drawPixel(x,y,bleu); // affiche pixel bleu en x,y

  xo=x; 
}

if (y!=yo) 
{
  y=constrain (y,0,131); // oblige y à rester dans la fourchette
  lcd.drawPixel(xo,yo,blanc); // affiche pixel blanc en xo,yo =efface pixel précédent
  lcd.drawPixel(x,y,bleu); // affiche pixel bleu en x,y

  yo=y; 
}

if (encodeur.sw()==SW_PRESSED) // si appui axe encodeur
{
  if (sens==0) sens=1; else sens=0;
}

} // fin de la fonction loop() - le programme recommence au début de la fonction loop sans fin
// ********************************************************************************

//*************** Autres Fonctions du programme *************

void InterruptTimer2() { // debut de la fonction d'interruption Timer2

encodeur.service(); // appel de la routine de gestion de l'encodeur 
if (sens==0) x=x+encodeur.step(); else y=y+encodeur.step();

}
// --- Fin programme ---

Le programme complet en langage Arduino (version avec trace persistante) :

A copier/coller directement dans l'éditeur Arduino


// --- Programme Arduino ---
// Copyright X. HINAULT - Créé le 29/09/2010
// www.mon-club-elec.fr 

//  Code sous licence GNU GPL : 
//  This program is free software: you can redistribute it and/or modify
//  it under the terms of the GNU General Public License as published by
//  the Free Software Foundation, either version 3 of the License,
//  or any later version.
//  This program is distributed in the hope that it will be useful,
//  but WITHOUT ANY WARRANTY; without even the implied warranty of
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//  GNU General Public License for more details.
//  You should have received a copy of the GNU General Public License
//  along with this program.  If not, see <http://www.gnu.org/licenses/>.
//  

// --- Que fait ce programme ? ---
/* test encodeur rotatif avec interruption timer 2 à intervalle régulier*/

// --- Fonctionnalités utilisées ---
// Utilise un afficheur TFT 65536 couleurs Graphique 132x176 type S65
// Utilise l'Encodeur Rotatif du module S65 
// Utilise interruption du Timer 2 à intervalle régulier

// --- Circuit à réaliser ---
// Le module S65 Shield est à enficher directement broche à broche  
// sur la carte Arduino réalisant ainsi les connexions suivantes : 
// Ecran graphique S65 TFT contrôlé par 5 broches : 
// 	> broche S65_DAT du module sur la broche 11 de la carte Arduino 
// 	> broche S65_CLK du module sur la broche 13 de la carte Arduino 
// 	> broche S65_RS du module sur la broche 4 de la carte Arduino 
// 	> broche S65_RST du module sur la broche 17 de la carte Arduino 
// 	> broche S65_CS du module sur la broche 16 de la carte Arduino 
//
// Encodeur rotatif contrôlé par 3 broches : 
// 	> broche RE_SW du module sur la broche 5 de la carte Arduino 
// 	> broche RE_PhA du module sur la broche 6 de la carte Arduino 
// 	> broche RE_PhB du module sur la broche 7 de la carte Arduino 

//**************** Entête déclarative *******
// A ce niveau sont déclarées les librairies, les constantes, les variables...

// --- Inclusion des librairies utilisées ---

#include <S65Display.h> // Inclusion de la librairie pour afficheur TFT couleur S65 

#include <RotaryEncoder.h> // Inclusion de la librairie pour encodeur rotatif du module S65 
#include <MsTimer2.h> // inclusion de la librairie Timer2

// --- Déclaration des constantes ---

// --- constantes des broches ---


// --- Déclaration des variables globales ---
volatile int compt=0;
int compt0=0;

volatile int x=0,y=0;
int xo=0, yo=0; 

volatile int sens=0; 

// --- Déclaration des objets utiles pour les fonctionnalités utilisées ---

S65Display lcd; // Création d'un objet afficheur S65 appelé lcd 


RotaryEncoder encodeur; // Création d'un objet RotaryEncoder appelé encodeur 


//**************** FONCTION SETUP = Code d'initialisation *****
// La fonction setup() est exécutée en premier et 1 seule fois, au démarrage du programme

void setup()   { // debut de la fonction setup()

// --- ici instructions à exécuter au démarrage --- 

lcd.init(4); // initialise l'afficheur TFT couleur S65 avec communication SPI à Fosc/4 = 4 Mhz

// test de l'afficheur 
lcd.clear(RGB(255,0,0)); // efface ecran en rouge
delay (1000); // pause 
lcd.clear(RGB(0,255,0)); // efface ecran en vert
delay (1000); // pause 
lcd.clear(RGB(0,0,255)); // efface ecran en bleu
delay (1000); // pause 
lcd.clear(noir); // efface ecran en blanc

lcd.drawPixel(x,y,vert); // affiche pixel bleu en x,y

encodeur.init(); // initialise l'encodeur rotatif du module S65 sur les broches 5,6,7.


// ------- Broches en sortie -------  


// ------- Broches en entrée -------  


// ------- Activation du rappel au + interne des broches en entrée si nécessaire -------  

// initialisation interruption Timer 2
  MsTimer2::set(1, InterruptTimer2); // période 1ms 
  MsTimer2::start(); // active Timer 2 


} // fin de la fonction setup()
// ********************************************************************************

//*************** FONCTION LOOP = Boucle sans fin = coeur du programme *************
// la fonction loop() s'exécute sans fin en boucle aussi longtemps que l'Arduino est sous tension

void loop(){ // debut de la fonction loop()

// --- ici instructions à exécuter par le programme principal --- 

//variable = encodeur.step(); // renvoie état courant de l'encodeur = valeur 0,1 ou -1
//variable = encodeur.sw(); // renvoie état courant du BP de l'axe de l'encodeur = valeur 0, SW_PRESSED, SW_PRESSEDLONG

if (x!=xo) 
{

  x=constrain (x,0,175); // oblige x à rester dans la fourchette 
  //lcd.drawPixel(xo,yo,blanc); // affiche pixel blanc en xo,yo =efface pixel précédent
  lcd.drawPixel(x,y,vert); // affiche pixel bleu en x,y

  xo=x; 
}

if (y!=yo) 
{
  y=constrain (y,0,131); // oblige y à rester dans la fourchette
  //lcd.drawPixel(xo,yo,blanc); // affiche pixel blanc en xo,yo =efface pixel précédent
  lcd.drawPixel(x,y,vert); // affiche pixel bleu en x,y

  yo=y; 
}

if (encodeur.sw()==SW_PRESSED) // si appui axe encodeur
{
  if (sens==0) sens=1; else sens=0;
}

} // fin de la fonction loop() - le programme recommence au début de la fonction loop sans fin
// ********************************************************************************

//*************** Autres Fonctions du programme *************

void InterruptTimer2() { // debut de la fonction d'interruption Timer2

encodeur.service(); // appel de la routine de gestion de l'encodeur 
if (sens==0) x=x+encodeur.step(); else y=y+encodeur.step();

}
// --- Fin programme ---