SIK Experiment Guide for the Arduino 101/Genuino 101 Board (French)
This Tutorial is Retired!
This tutorial covers concepts or technologies that are no longer current. It's still here for you to read and enjoy, but may not be as useful as our newest tutorials.
Expérience 19 : Détection de frappe
Introduction
L'une des forces de la carte 101 réside dans sa technologie de reconnaissance des gestes et des mouvements relativement sophistiquée. Tout cela est possible grâce à l'unité de mesure inertielle (UMI) présente sur la carte. L'UMI mesure les données de l'accéléromètre (force gravitationnelle) et du gyroscope (rotation). Dans l'expérience 18, nous avons utilisé l'accéléromètre. À présent, explorons plus en profondeur le module Curie, qui donne un sens aux données pour déterminer si vous faites un pas et les compter, détecter si vous tapez sur la carte et même son orientation dans l'espace.
Comme exemple d'utilisation combiné de l'UMI et du module Curie, nous allons créer un circuit RVB simple qui clignotera vert deux fois quand vous tapotez deux fois le haut de la carte 101 et clignotera deux fois en rouge quand vous tapotez deux fois le bas de la carte 101.
Composants nécessaires
Vous aurez besoin des composants suivants :
- 1 plaque Breadboard
- 1 carte Arduino 101 ou Genuino 101
- 1 LED RVB à cathode commune
- 3 résistances 100 Ω
- 6 cavaliers
Vous n'avez pas le SIK ?
Pour réaliser cette expérience sans le SIK, nous vous suggérons d'utiliser les composants suivants :
Vous aurez également besoin d'une carte Arduino 101 ou Genuino 101.
Lectures suggérées
Avant de poursuivre cette expérience, nous vous recommandons de vous familiariser avec les concepts des tutoriels suivants :
Présentation de l'unité de mesure inertielle
Une unité de mesure inertielle (UMI) est une combinaison de capteurs qui permet de déterminer l'orientation des capteurs dans l'espace tridimensionnel. La carte 101 utilise un accéléromètre pour détecter l'orientation physique (en mesurant la force gravitationnelle sur le capteur) et un gyroscope pour détecter le mouvement de rotation.
La carte 101 peut traduire les données de l'UMI en gestes pré-programmés tels que : faire un pas, taper une fois ou deux fois sur la carte, faire tomber la carte. Cette expérience s'axe sur la détection des tapotements/doubles tapotements, mais n'hésitez pas à tester l'autre exemple de code dans File > Examples > CurieIMU.
Note : La carte 101 intègre une UMI accessible via la bibliothèque Arduino. Aucun câblage n'est nécessaire pour utiliser l'UMI !
Branchement du matériel
Vous êtes prêt à tout raccorder ? Consultez le schéma de câblage ci-dessous pour savoir comment faire.
Composants polarisés | Faites particulièrement attention aux marquages indiquant comment placer les composants sur la plaque breadboard, car les composants polarisés ne peuvent être connectés à un circuit que dans une direction. |
Schéma de câblage de l'expérience
Ouverture du sketch
Ouvrez l'EDI Arduino sur votre ordinateur. Le codage en langage Arduino contrôlera votre circuit. Ouvrez le code du Circuit 19 en accédant au « Code du guide SIK 100 » que vous avez précédemment téléchargé et placé dans votre dossier « Examples ».
Pour ouvrir le code, cliquez sur : File > Examples > SIK Guide Code > Circuit_19
Vous pouvez également copier et coller le code suivant dans l'EDI Arduino. Cliquez sur Télécharger et observez ce qu'il se passe.
language:cpp
/*
SparkFun Inventor's Kit
Example sketch 19
TAP DETECTION
Use the 101 board's on-board IMU to detect a tap and double tap and react accordingly.
This sketch was written by SparkFun Electronics,
with lots of help from the Arduino community.
This code is completely free for any use.
Visit http://learn.sparkfun.com/products/2 for SIK information.
Visit http://www.arduino.cc to learn more about Arduino.
*/
#include "CurieIMU.h"
void setup()
{
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
// Initialise the IMU
CurieIMU.begin();
CurieIMU.attachInterrupt(eventCallback);
// Increase Accelerometer range to allow detection of stronger taps (< 4g)
CurieIMU.setAccelerometerRange(3);
// Reduce threshold to allow detection of weaker taps (>= 750mg)
CurieIMU.setDetectionThreshold(CURIE_IMU_TAP, 750); // (750mg)
// Set the time window for 2 taps as a double tap (<= 250 milliseconds)
CurieIMU.setDetectionDuration(CURIE_IMU_DOUBLE_TAP, 250);
// Enable Double-Tap detection
CurieIMU.interrupts(CURIE_IMU_DOUBLE_TAP);
}
void loop()
{
// nothing happens in the loop because all the action happens
// in the callback function.
}
static void eventCallback()
{
if (CurieIMU.getInterruptStatus(CURIE_IMU_DOUBLE_TAP)) {
if (CurieIMU.tapDetected(Z_AXIS, NEGATIVE))
{
digitalWrite(5, HIGH);
digitalWrite(6, LOW);
delay(250);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
delay(250);
digitalWrite(5, HIGH);
digitalWrite(6, LOW);
delay(250);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
delay(250);
}
else if (CurieIMU.tapDetected(Z_AXIS, POSITIVE))
{
digitalWrite(5, LOW);
digitalWrite(6, HIGH);
delay(250);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
delay(250);
digitalWrite(5, LOW);
digitalWrite(6, HIGH);
delay(250);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
delay(250);
}
else
{
digitalWrite(5, LOW);
digitalWrite(6, LOW);
}
}
}
À propos du code
CurieIMU.begin();
Permet d'initialiser ou de lancer l'UMI intégrée à la carte. Sinon, la carte 101 ne peut enregistrer aucune donnée UMI.
CurieIMU.attachInterrupt(eventCallback);
Les interruptions sont des événements qui interrompent la boucle et demandent à la carte 101 de faire immédiatement quelque chose. La carte 101 sort alors de la boucle, effectue cette action, puis revient dans la boucle. L'interruption indique une fonction à réaliser lorsqu'elle est déclenchée (ici eventCallback
).
// Reduce threshold to allow detection of weaker taps (>= 750mg)
CurieIMU.setDetectionThreshold(CURIE_IMU_TAP, 750); // (750mg)
// Set the time window for 2 taps as a double tap (<= 250 milliseconds)
CurieIMU.setDetectionDuration(CURIE_IMU_DOUBLE_TAP, 250);
Pour que l'UMI détecte un double tapotement, une configuration s'avère nécessaire. Vous devez définir un seuil de force pour un tapotement fort et un tapotement plus léger. Vous devez également spécifier la durée d'un double tapotement afin que le module Curie fasse la différence entre un tapotement simple et un double tapotement.
CurieIMU.interrupts(CURIE_IMU_DOUBLE_TAP);
Enfin, nous associons l'interruption à un événement de double tapotement. Ainsi, chaque fois qu'un double tapotement se produit, la carte 101 exécute la fonction eventCallback.
Ce que vous devez voir
Une fois le code téléchargé, la LED RVB doit être éteinte. Prenez la carte et tapotez deux fois le haut de la carte 101 avec le doigt, à un rythme similaire à un double clic de souris. La LED RVB doit clignoter deux fois en vert puis s'éteindre. Si vous faites la même chose sur le bas de la carte, elle clignotera en rouge.
Dépannage
La bibliothèque ne se compile pas
Vérifiez que vous avez une déclaration #include "CurieIMU.h"
. Si c'est le cas, assurez-vous que le nom du fichier en-tête est entre des guillemets droits et pas des chevrons.
La carte ne détecte pas les doubles tapotements
La carte 101 attend un intervalle spécifique pour un double tapotement. Essayez d'accélérer vos tapotements ou de modifier la durée du double tapotement dans la méthode CurieIMU.setDetectionDuration(CURIE_IMU_DOUBLE_TAP, 250);
.
Ne fonctionne toujours pas
Vous pouvez définir la sensibilité de l'accéléromètre. Notre exemple est défini à 2 G ou deux fois la gravité normale sur Terre. Si vous diminuez cette valeur, cela augmentera la sensibilité.