Ardu? No!MTobjectsPour les cartes graphiques ≫ MTtouchPadShield: Exemple 1

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é.