(→Allons plus loin dans l'explication) |
|||
Ligne 36 : | Ligne 36 : | ||
En démarrant le montage, on charge électriquement la surface conductrice pour l'amener à un potentiel. Lorsqu'on touche la surface en question, le corps agit comme une capacité et décharge la plaque, ce qui réduit le potentiel sur la surface. | En démarrant le montage, on charge électriquement la surface conductrice pour l'amener à un potentiel. Lorsqu'on touche la surface en question, le corps agit comme une capacité et décharge la plaque, ce qui réduit le potentiel sur la surface. | ||
+ | === '''Code de l'application''' === | ||
<math> | <math> | ||
// Pin a connecter a la LED | // Pin a connecter a la LED | ||
Ligne 46 : | Ligne 47 : | ||
// the start of the program to dynamically calculate this. | // the start of the program to dynamically calculate this. | ||
int touchedCutoff = 60; | int touchedCutoff = 60; | ||
- | |||
void setup(){ | void setup(){ | ||
Serial.begin(9600); | Serial.begin(9600); | ||
Ligne 52 : | Ligne 52 : | ||
pinMode(LEDPin, OUTPUT); | pinMode(LEDPin, OUTPUT); | ||
digitalWrite(LEDPin, LOW); | digitalWrite(LEDPin, LOW); | ||
- | |||
// sets the pin as output | // sets the pin as output | ||
pinMode(4, OUTPUT); | pinMode(4, OUTPUT); | ||
} | } | ||
- | |||
void loop(){ | void loop(){ | ||
// Si le capateur atteint un certain seuil de tension, la led s'allume | // Si le capateur atteint un certain seuil de tension, la led s'allume | ||
- | |||
if (readCapacitivePin(capSensePin) > touchedCutoff) { | if (readCapacitivePin(capSensePin) > touchedCutoff) { | ||
digitalWrite(LEDPin, HIGH); | digitalWrite(LEDPin, HIGH); | ||
Ligne 68 : | Ligne 65 : | ||
noTone(4); | noTone(4); | ||
} | } | ||
- | |||
// Affiche toute les 500 millisecondes la valeur du capteur | // Affiche toute les 500 millisecondes la valeur du capteur | ||
if ( (millis() % 500) == 0){ | if ( (millis() % 500) == 0){ | ||
Ligne 122 : | Ligne 118 : | ||
*port &= ~(bitmask); | *port &= ~(bitmask); | ||
*ddr |= bitmask; | *ddr |= bitmask; | ||
- | |||
return cycles; | return cycles; | ||
} | } | ||
+ | |||
</math> | </math> | ||
Sommaire |
Un détecteur capacitif permet de détecter une pression sur une surface conductrice d'électricité.
Appuyer sur la surface conductrice avec le doigt
Lorsqu'on appuie sur la surface conductrice utilisée dans le montage, on peut observer un allumage de la LED et un bruit de buzzer.
La pression du doigt fait varier la tension dans la surface conductrice. Cette variation est détectée par l'arduino, qui allume alors la LED et déclenche le buzzer.
Ici je mets les questions soulevées par l'expérience, qui n'ont pas trouvé de réponses !!
En démarrant le montage, on charge électriquement la surface conductrice pour l'amener à un potentiel. Lorsqu'on touche la surface en question, le corps agit comme une capacité et décharge la plaque, ce qui réduit le potentiel sur la surface.
<math> // Pin a connecter a la LED int LEDPin = 13; // Pin a connecter a la feuille de papier int capSensePin = 2; // This is how high the sensor needs to read in order // to trigger a touch. You'll find this number // by trial and error, or you could take readings at // the start of the program to dynamically calculate this. int touchedCutoff = 60; void setup(){
Serial.begin(9600); // Set up the LED pinMode(LEDPin, OUTPUT); digitalWrite(LEDPin, LOW); // sets the pin as output pinMode(4, OUTPUT);
} void loop(){
// Si le capateur atteint un certain seuil de tension, la led s'allume if (readCapacitivePin(capSensePin) > touchedCutoff) { digitalWrite(LEDPin, HIGH); tone(4,880); } else { digitalWrite(LEDPin, LOW); noTone(4); } // Affiche toute les 500 millisecondes la valeur du capteur if ( (millis() % 500) == 0){ Serial.print("Capacitive Sensor on Pin 2 reads: "); Serial.println(readCapacitivePin(capSensePin)); }
}
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; if ((pinToMeasure >= 0) && (pinToMeasure <= 7)){ port = &PORTD; ddr = &DDRD; bitmask = 1 << pinToMeasure; pin = &PIND; } if ((pinToMeasure > 7) && (pinToMeasure <= 13)){ port = &PORTB; ddr = &DDRB; bitmask = 1 << (pinToMeasure - 8); pin = &PINB; } if ((pinToMeasure > 13) && (pinToMeasure <= 19)){ port = &PORTC; ddr = &DDRC; bitmask = 1 << (pinToMeasure - 13); pin = &PINC; } // Discharge the pin first by setting it low and output *port &= ~(bitmask); *ddr |= bitmask; delay(1); // Make the pin an input WITHOUT the internal pull-up on *ddr &= ~(bitmask); // Now see how long the pin to get pulled up int cycles = 16000; for(int i = 0; i < cycles; i++){ if (*pin & bitmask){ cycles = i; break; } } // 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;
}
</math>
© Graphisme : Les Petits Débrouillards Grand Ouest (Patrice Guinche - Jessica Romero) | Développement web : Libre Informatique