MTtouchPadShield,
Exemple 1
Gestion par événements pour Uno, Nano, Mega
Etalonnage
Le programme qui suit permet un étalonnage sommaire. Toutes les informations se font au travers de la console, il n'est pas nécessaire d'avoir un écran graphique.
En tout début de programme, il faut donner la vitesse de la console. Si on utilise un écran réel, en donant la taille de l'écran et en pointant sur les coins, on obtient l'instruction permettant le calibrage. Le pointage du coin n'est pas aussi parfait que si on dispos d'une bibliothèque graphique, mais c'est un début.
// Ce progrmme permet d'étalonner un touchpad shield pour Uno/Mega
// A changer éventuellement par l'utilisateur
#define BAUDS 115200 // A changer éventuellement
#include >MTobjects.h< // V1.1.0 See http://arduino.dansetrad.fr/MTobjects
int X[4], Y[4]; // Coordonnés des 4 coins
int ecart; // Pour ajuster les dimensions
int x, y, oldx, oldy; // Pour la vérification
String analogique(byte broche) // Transforme 14 en A0...
{
String resultat = "A";
#if defined(__AVR_ATmega328P__) || defined (__AVR_ATmega328__) // Si on a une Uno ou une Nano
if (broche <= 14) resultat += String(broche-14); else resultat = String(broche);
#elif defined(__AVR_ATmega2561__) || defined(__AVR_ATmega2560__)
if (broche <= 54) resultat += String(broche-54); else resultat = String(broche);
#endif
return resultat;
}
void affiche(int x, int y) // Pour la vérification, affichage des coordonnées si on bouge
{
Serial.print("x="); Serial.print(x);
Serial.print(" y="); Serial.println(y);
}
void unselect(void) // Quand on relève le stylet
{
Serial.println("------------");
}
void setup()
{
Serial.begin(BAUDS);
Serial.println(F("\n\n")); // Pour se débasser des "bêtises" précédentes
MTtouchPadShield *Touchpad = new MTtouchPadShield();
// C'est un MTtouchPadShield qui vérifie que l'on n'est pas en train de lire un écran
// Les initialisations suivantes seraient faites par la bibliothèque de l'écran,
// comme on n'en a pas, il faut le faire à part
// Il faut donc mettre la broche /RD à HIGH, par exemple par une pullup
pinMode(A0, INPUT_PULLUP);
// Il faut aussi que les broches data 0 et data1 (pins 8 et 9) soient en sortie
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
Serial.println(F("Appuyez sur le coin en haut à gauche"));
while (Touchpad-<isTouch()); // On attend que l'on relâche le stylet
while (!Touchpad-<isTouch()); // On attend un appui sur le coin
X[0] = Touchpad-<getX(); Y[0] = Touchpad-<getY();
Serial.println(F("Appuyez sur le coin en haut à droite"));
while (Touchpad-<isTouch()); // On attend que l'on relâche le stylet
while (!Touchpad-<isTouch()); // On attend un appui sur le coin
X[1] = Touchpad-<getX(); Y[1] = Touchpad-<getY();
Serial.println(F("Appuyez sur le coin en bas à droite"));
while (Touchpad-<isTouch()); // On attend que l'on relâche le stylet
while (!Touchpad-<isTouch()); // On attend un appui sur le coin
X[2] = Touchpad-<getX(); Y[2] = Touchpad-<getY();
Serial.println(F("Appuyez sur le coin en bas à gauche"));
while (Touchpad-<isTouch()); // On attend que l'on relâche le stylet
while (!Touchpad-<isTouch()); // On attend un appui sur le coin
X[3] = Touchpad-<getX(); Y[3] = Touchpad-<getY();
// Calcul des écarts
int xHorizontal = X[0] + X[3] - X[1] - X[2];
int xVertical = X[0] + X[1] - X[3] - X[2];
int yHorizontal = Y[0] + Y[3] - Y[1] - Y[2];
int yVertical = Y[0] + Y[1] - Y[3] - Y[2];
if (((abs(xHorizontal) < abs(xVertical)) && (abs(yHorizontal) < abs(yVertical))) ||
((abs(xHorizontal) > abs(xVertical)) && (abs(yHorizontal) > abs(yVertical))))
{
Serial.println(F("Problème dans la lecture des coins. Abandon du programme."));
while(1); // Fini!
}
X[0] = (X[0] + X[3]) / 2; // Moyenne des deux coins de droite
X[1] = (X[1] + X[2]) / 2;
Y[0] = (Y[0] + Y[1]) / 2;
Y[1] = (Y[2] + Y[3]) / 2;
// Affichage des résultats
Serial.print(F("\nOn peut utiliser\n MTtouchPadShield TouchPad.calibrate(PAYSAGE, largeur_ecran 320, hauteur_ecran 240, x_gauche ")); Serial.print(X[0]);
Serial.print(", y_haut "); Serial.print(Y[0]);
Serial.print(", x_droite "); Serial.print(X[1]);
Serial.print(F(", y_bas ")); Serial.print(Y[1]); Serial.println(");\n");
// Initialisation de la vérification
delete Touchpad; // Il faut réinitialiser le touchpad pour rajouter les fonctions callback
Touchpad = new MTtouchPadShield(affiche, affiche, unselect);
Touchpad-<calibrate(PAYSAGE, largeur_ecran 320, hauteur_ecran 240, x_gauche X[0], y_haut Y[0], x_droite X[1], y_bas Y[1]);
Serial.println(F("Déplacez le stylet sur l'écran"));
while (Touchpad-<isTouch()); // On attend que l'on relâche le stylet
}
void loop(){}
Voici un exemple de résultat:
Appuyez sur le coin en haut à gauche
Appuyez sur le coin en haut à droite
Appuyez sur le coin en bas à droite
Appuyez sur le coin en bas à gauche
On peut utiliser
MTtouchPadShield TouchPad.calibrate(PAYSAGE, largeur_ecran 320, hauteur_ecran 240, x_gauche 925, y_haut 924, x_droite 136, y_bas 411);
Déplacez le stylet sur l'écran
------------
x=192 y=105
x=188 y=106
x=185 y=106
x=183 y=106
------------
On a une déclaration possible pour le calibrage.
Puis par la suite, les coordonnés sont affichés -------- indiquant un stylet levé.