Étape 2: Échantillonnage, Deglitching et les États de lecture
Boutons sont comme beaucoup de choses : l’imparfait. Même quand ils donnent une sensation mécanique ferme, ils génèrent un couple d’oscillations lorsque le bouton position de changements.
Ces oscillations sont appelées glitches ou rebondit. Ils peuvent être éliminés en ajoutant un condensateur (présentant peu de retard), ou de logiciels.
Le filtrage par échantillonnage
Souvent, votre application Arduino est boucle ()-basé, c'est-à-dire fait quelque chose, puis dort pendant quelque temps, à plusieurs reprises. Le bouton Etat d’échantillonnage code peut ressembler à :
void loop() { // handle button boolean button_pressed = read_button(); // do other things do_stuff(button_pressed); // sleep a moment before next iteration delay(DELAY); }
Cela signifie qu’au moins retarder millisecondes s’écouler entre les échantillonnages de bouton successifs. Fonction de retard, cela nous rendra insensible aux pépins. La réactivité n’est pas tout à fait exacte, mais largement suffisante : il y aura quelques gigue dans l’ampleur du retard. Il doit être assuré que les choses que nous faisons au cours de chaque boucle prennent un temps « faible » et comparable pour chaque itération.
La première photo de cette étape montre les pépins et l’échantillonnage périodique (indiqué en bleu).
Lecture de l’État
Le code ci-dessous montre comment l’échantillonnage périodique est fait. Lorsque le bouton est considéré comme non pressée, un point est envoyé à la ligne sérielle ; Lorsque le bouton est considéré comme pressé, un signe d’insertion est envoyé.
La deuxième photo de cette étape montre la sortie série, d’une pression longue suivie de deux impulsions courtes.
Programmation
Dans le code ci-dessous, Notez que j’ai choisi un nom de variable (button_pressed) qui représente un niveau élevé d’abstraction (l’état du bouton) et non l’État électrique (bouton, mener ou non, ni électrique valeur lue sur l’axe), qui serait source de confusion en raison du fait que, en raison de la résistance de pull-up, la broche lit haut lorsque le bouton est relâché.
Pro/Cons
Mise en œuvre très simple. Adapté pour le contrôle continu (par exemple les pédale de pause).
Inadaptée pour contrôle supplémentaire (p. ex. le contrôle sonore volume différentiel)--qui est expliqué dans l’étape suivante.
Code
––––––––––8<––––––––––
#define BUTTON_PIN 2 // Button #define DELAY 20 // Delay per loop in ms void setup() { pinMode(BUTTON_PIN, INPUT); digitalWrite(BUTTON_PIN, HIGH); // pull-up Serial.begin(9600); } boolean handle_button() { int button_pressed = !digitalRead(BUTTON_PIN); // pin low -> pressed return button_pressed; } void loop() { // handle button boolean button_pressed = handle_button(); // do other things Serial.print(button_pressed ? "^" : "."); // add newline sometimes static int counter = 0; if ((++counter & 0x3f) == 0) Serial.println(); delay(DELAY); }
––––––––––>8––––––––––