Logo Mon Club Elec

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

Le déplacement d’un pixel sur un écran TFT est une tâche complexe qui nécessite une précision et une préparation minutieuses. Cependant, grâce à l’utilisation d’un encodeur rotatif, il est possible de déplacer un pixel sur un écran TFT d’un module S65shield avec une grande précision et une grande facilité. Dans cet article, nous allons examiner en détail comment un encodeur rotatif peut être utilisé pour déplacer un pixel sur un écran TFT d’un module S65shield.

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

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 132×176 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.
Déplacement d’un pixel sur l’écran TFT d’un module S65shield à l’aide d’un encodeur rotatif.

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

  • un module avec afficheur couleur TFT 176×132
Déplacement d’un pixel sur l’écran TFT d’un module S65shield à l’aide d’un encodeur rotatif.

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

Déplacement d’un pixel sur l’écran TFT d’un module S65shield à l’aide d’un encodeur rotatif.
Le schéma théorique du montage

Le circuit du montage

Déplacement d’un pixel sur l’écran TFT d’un module S65shield à l’aide d’un encodeur rotatif.
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 ---

Noter cet article

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Archive Mon Club Elec

Articles populaires

Newsletter

Inscrivez-vous maintenant et bénéficiez d'un soutien continu pour réaliser vos travaux électriques en toute sécurité.