Go Down

Topic: Touche tactile capacitif sans hardware (Read 1 time) previous topic - next topic

tomt

Bonjour à tous,

J'ai trouvé ce code qui permet de faire une touche tactile sans matériel.
http://playground.arduino.cc/Code/CapacitiveSensor
Je suis débutant dans le domaine et je ne le comprends pas.
Que faut-il mettre dans void setup et dans void loop? 

Pourriez-vous me donner un peu plus d'explications?

J'aimerai par exemple allumer la led de la sortie digitale 13 avec l'entrée digitale 2. Que faut-il ajouter?

Un grand merci d'avance.


Code: [Select]
// readCapacitivePin
//  Input: Arduino pin number
//  Output: A number, from 0 to 17 expressing
//  how much capacitance is on the pin
//  When you touch the pin, or whatever you have
//  attached to it, the number will get higher
#include "pins_arduino.h" // Arduino pre-1.0 needs this
uint8_t readCapacitivePin(int pinToMeasure) {
  // Variables used to translate from Arduino to AVR pin naming
  volatile uint8_t* port;
  volatile uint8_t* ddr;
  volatile uint8_t* pin;
  // Here we translate the input pin number from
  //  Arduino pin number to the AVR PORT, PIN, DDR,
  //  and which bit of those registers we care about.
  byte bitmask;
  port = portOutputRegister(digitalPinToPort(pinToMeasure));
  ddr = portModeRegister(digitalPinToPort(pinToMeasure));
  bitmask = digitalPinToBitMask(pinToMeasure);
  pin = portInputRegister(digitalPinToPort(pinToMeasure));
  // Discharge the pin first by setting it low and output
  *port &= ~(bitmask);
  *ddr  |= bitmask;
  delay(1);
  // Make the pin an input with the internal pull-up on
  *ddr &= ~(bitmask);
  *port |= bitmask;

  // Now see how long the pin to get pulled up. This manual unrolling of the loop
  // decreases the number of hardware cycles between each read of the pin,
  // thus increasing sensitivity.
  uint8_t cycles = 17;
       if (*pin & bitmask) { cycles =  0;}
  else if (*pin & bitmask) { cycles =  1;}
  else if (*pin & bitmask) { cycles =  2;}
  else if (*pin & bitmask) { cycles =  3;}
  else if (*pin & bitmask) { cycles =  4;}
  else if (*pin & bitmask) { cycles =  5;}
  else if (*pin & bitmask) { cycles =  6;}
  else if (*pin & bitmask) { cycles =  7;}
  else if (*pin & bitmask) { cycles =  8;}
  else if (*pin & bitmask) { cycles =  9;}
  else if (*pin & bitmask) { cycles = 10;}
  else if (*pin & bitmask) { cycles = 11;}
  else if (*pin & bitmask) { cycles = 12;}
  else if (*pin & bitmask) { cycles = 13;}
  else if (*pin & bitmask) { cycles = 14;}
  else if (*pin & bitmask) { cycles = 15;}
  else if (*pin & bitmask) { cycles = 16;}

  // Discharge the pin again by setting it low and output
  //  It's important to leave the pins low if you want to
  //  be able to touch more than 1 sensor at a time - if
  //  the sensor is left pulled high, when you touch
  //  two sensors, your body will transfer the charge between
  //  sensors.
  *port &= ~(bitmask);
  *ddr  |= bitmask;

  return cycles;
}
yes

skywodd

Bonjour,

C'est de la programmation de haut niveau, bien loin de la programmation arduino classique.
Ton code est une fonction toute prête qui vient ce placer âpres setup() et loop() directement dans le corps du code.

Si tu veut un exemple d'utilisation j'utilise exactement le même principe dans mon article ici :
http://skyduino.wordpress.com/2012/06/02/arduino-faire-une-touche-tactile-avec-une-simple-resistance/
Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

tomt

Salut skywood,

Merci pour le lien vers ton site! Mais je l'avais déjà trouvé  XD. C'est la première page que j'ai lu à ce sujet et que je trouve très bien faite! Bravo pour ton site.

Ce qui m'intéresse dans le code que j'ai posté, c'est qu'il ne faut aucun composant supplémentaire.
As-tu un lien à me conseiller où je pourrais trouver des infos pour pouvoir utiliser ce code et éventuellement tenter de comprendre le fonctionnement?

Merci et bonne journée.


yes

skywodd


Ce qui m'intéresse dans le code que j'ai posté, c'est qu'il ne faut aucun composant supplémentaire.
As-tu un lien à me conseiller où je pourrais trouver des infos pour pouvoir utiliser ce code et éventuellement tenter de comprendre le fonctionnement?

Les résistances dans mon montage sont des sécurités, tu peut les virer et faire exactement comme dans le code du playground.
On utilise le même principe et quasiment le même code à une boucle prés.
Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

tomt

Salut à tous,

Après quelques essais, je n'en suis pas beaucoup plus loin!

J'ai utilisé ton code Skywodd. Mais je n'arrive pas à le faire fonctionne sans résistance externe.
Le programme semble bloquer et n'envoi presque rien sur le moniteur série. Il envoi de temps en temps une valeur qui ne correspond à rien.

J'ai fait un essai en ne lisant que l'entrée 9 et avec une résistance:
Code: [Select]
const uint16_t THRESHOLD = 50; /* Seuil de détection */
void setup() {
  Serial.begin(115200);   /* Initialise le port série à 115200 bauds */
  /* Aucune initialisation requise des broches "tactiles",
   * la fonction touch_measure() se charge de tout ;)*/
}
void loop() {
  /* Pour la broche  D9 (1 touche) */
  for (uint8_t i = 9; i < 10; ++i){
    if(touch_measure(i) > THRESHOLD){ /* Test si la "touche" a été appuyé ou non */
      Serial.print(touch_measure(i));
      Serial.println();
    }
  }
  delay(100);  /* Délai no-flood */
}

Voici le résultat que j'obtiens quand je touche l'entrée:
Code: [Select]
212
47
55
7
54
109
194
47

Ça fonctionne mais ce que je ne comprends pas pourquoi j'ai un 7? Le minimum devrait être 50 non?

Lorsque je fais le test sans résistance, j'obtiens un peu n'importe quoi! La carte envoi beaucoup de valeurs mais il n'y a aucune différence si je touche l'entrée ou pas.


Bête question de débutant: ne manque-t-il pas les accolades dans le code après le if ?
Code: [Select]
for (uint8_t i = 2; i < 12; ++i){

    /* Test si la "touche" a été appuyé ou non */
    if(touch_measure(i) > THRESHOLD)
      Serial.print('1');
    else
      Serial.print('0');

    //Serial.println(touch_measure(i), DEC);

    /* Sépare chaque bits */
    Serial.print(' ');
  }


Mes excuses pour le retard de ma réponse!

Merci d'avance pour votre aide.

yes

Go Up