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.

Pages
Contributors: D___Run___
Favorited Favorite 0

Expérience 18 : Lire l'accéléromètre embarqué

Introduction

Dans l'expérience 13, vous avez contrôlé la vitesse et la direction d'un moteur à l'aide de différentes entrées. Cette expérience est similaire, mais vous allez utiliser l'accéléromètre intégré à la carte Arduino 101 comme une entrée.

L'accéléromètre mesure les forces gravitationnelles appliquées au capteur dans différentes directions. Vous pouvez extrapoler beaucoup d'informations à partir des données de l'accéléromètre s'il est déplacé. Cet appareil est également pratique pour connaître le côté situé vers le bas lorsqu'il est immobile ! La force de gravité de la Terre est toujours présente ; elle peut être mesurée par l'accéléromètre. Il nous servira à déterminer l'orientation de votre carte Arduino 101 et ainsi à faire avancer, reculer ou rester immobile votre moteur. C'est parti !

Composants nécessaires

Vous aurez besoin des composants suivants :

  • 1 plaque Breadboard
  • 1 carte Arduino 101 ou Genuino 101
  • 1 contrôleur de moteur SparkFun
  • 1 moteur de loisirs 42:1
  • 13 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 :

Breadboard - Self-Adhesive (White)

Breadboard - Self-Adhesive (White)

PRT-12002
$5.50
48
Jumper Wires - Connected 6" (M/M, 20 pack)

Jumper Wires - Connected 6" (M/M, 20 pack)

PRT-12795
$2.10
2
Hobby Gearmotor - 140 RPM (Pair)

Hobby Gearmotor - 140 RPM (Pair)

ROB-13302
$5.50
6

SparkFun Motor Driver - Dual TB6612FNG (1A)

ROB-09457
18 Retired

Vous aurez également besoin d'une carte Arduino 101 ou Genuino 101.

Arduino 101

DEV-13787
9 Retired

Genuino 101

DEV-13984
Retired

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'accéléromètre

Les accéléromètres sont des appareils qui mesurent l'accélération, c'est-à-dire le rythme de changement de vitesse d'un objet. Leur valeur est exprimée en mètres par seconde carrée (m/s²) ou en forces G (g). Une seule force G pour nous sur Terre est équivalente à 9,8 m/s², mais elle varie légèrement avec l'altitude (et sera différente sur d'autres planètes en raison des variations d'attraction gravitationnelle). Les accéléromètres sont utiles pour détecter les vibrations dans les systèmes ou pour les applications d'orientation.

Branchement du matériel

Vous êtes prêt à tout raccorder ? Consultez le schéma de câblage ci-dessous pour savoir comment faire.

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

alt text

Pour agrandir le circuit, cliquez sur le schéma.

Ouverture du sketch

Ouvrez l'EDI Arduino sur votre ordinateur. Le codage en langage Arduino contrôlera votre circuit. Ouvrez le code du Circuit 18 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 > 101 SIK Guide Code > Circuit_18

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 18

Controlling a Motor Using an Accelerometer

  Use the on-board accelerometer of the 101 board as an input to control
  a motor based on its orientation in space. If you tilt the 101 to the left,
  the motor spins in one direction; tilted to the right, it spins the opposite direction; and if it
  is flat, the motor stops.

This sketch was written by SparkFun Electronics, and based on the Orientation example
in the CurieIMU Library Examples
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"

const int DIR_A = 4;
const int DIR_B = 5;
const int PWM = 6;

// previous orientation (for comparison). Start at (-1) to start with

void setup()
{
 //set motor control pins to OUTPUT
pinMode(DIR_A, OUTPUT);
pinMode(DIR_B, OUTPUT);
pinMode(PWM, OUTPUT);

 // Start the acceleromter
 CurieIMU.begin();

// Set the accelerometer range to 2G
CurieIMU.setAccelerometerRange(2);
}

void loop()
{
 // read accelerometer:
 int x = CurieIMU.readAccelerometer(X_AXIS);
 int y = CurieIMU.readAccelerometer(Y_AXIS);
 int z = CurieIMU.readAccelerometer(Z_AXIS);

 // calculate the absolute values, to determine the largest
 int absX = abs(x);
 int absY = abs(y);
 int absZ = abs(z);

if ( (absZ > absX) && (absZ > absY))
{
 // base orientation on Z
 if (z > 0)
 {
  brake();
 }
}

 //else if Y is greater than X and Z its on edge
 else if ( (absY > absX) && (absY > absZ))
 {
  // if Y is positive orientation (digital pins up)and is set to 1
  if (y > 0)
  {
    forward();
  }
  //the Y is in the negative orientation (analog pins up) and is set to 2
  else
  {
    reverse();
  }
}
}
//custom function for driving the motor forward
void forward()
{
  digitalWrite(DIR_A, HIGH);
  digitalWrite(DIR_B, LOW);
  digitalWrite(PWM, HIGH);
}

//custom function for driving the motor in reverse
void reverse()
{
  digitalWrite(DIR_A, LOW);
  digitalWrite(DIR_B, HIGH);
  digitalWrite(PWM, HIGH);
}

//custom function for braking the motor
void brake()
{
  digitalWrite(DIR_A, LOW);
  digitalWrite(DIR_B, LOW);
  digitalWrite(PWM, LOW);
}

À propos du code

#include "CurieIMU.h"

Le port série de la carte Arduino sert aussi bien à recevoir qu'à envoyer des données. Comme les données peuvent arriver à tout moment, la carte Arduino 101 stocke (ou place en mémoire « tampon ») les données parvenant au port jusqu'à ce que vous soyez prêt à les utiliser. La commande Serial.available() renvoie le nombre de caractères que le port a reçu mais que vous n'avez pas encore utilisés dans votre sketch. La valeur zéro signifie qu'aucune donnée n'est encore arrivée.

int x = CurieIMU.readAccelerometer(X_AXIS);

Nous lisons la valeur de l'accéléromètre en transmettant la constante de X_AXIS à la méthode readAccelerometer de la bibliothèque CurieIMU. Nous obtenons en retour la valeur lue en temps réel par le capteur. Pour lire les autres axes, transmettez les constantes de X_AXIS, Y_AXIS et Z_AXIS.

int absX = abs(x);

Dans cette expérience, nous ne sommes pas nécessairement intéressés par les valeurs positives ou négatives. Nous voulons juste connaître celles qui sont les plus élevées afin de prendre une décision. Nous nous sommes servis de la fonction 'abs()', qui prend la valeur absolue d'un nombre (en fait, supprime le signe (-)). Nous stockons cette valeur dans une variable locale appelée 'absX' pour pouvoir accéder ultérieurement à la valeur x brute.

language:cpp
//if Z axis is greater than X and Y its facing upright
if ( (absZ > absX) && (absZ > absY))
{
 // base orientation on Z
 if (z > 0)
 {
  brake();
 }
}

 //else if Y is greater than X and Z its on edge
 else if ( (absY > absX) && (absY > absZ))
 {
  // if Y is positive orientation (digital pins up)and is set to 1
  if (y > 0)
  {
    forward();
  }
  //the Y is in the negative orientation (analog pins up) and is set to 2
  else
  {
    reverse();
  }
}

Lorsque nous disposons des valeurs lues par l'accéléromètre sous forme de valeur absolue, nous pouvons les comparer à l'aide d'une déclaration if(). Dans cet exemple, nous voulons uniquement comparer les valeurs obtenues en inclinant la carte vers la gauche et vers la droite, pourtant nous avons encore besoin de trois axes. Par exemple, si Y est supérieur à X, l'axe Y pointe vers le bas (dans la direction de la gravité). Nous effectuons ensuite une comparaison finale pour voir s'il est supérieur à 0 et ainsi nous assurer qu'il se trouve dans la direction positive. Nous définissons la direction du moteur sur la base de ces comparaisons.

Ce que vous devez voir

Une fois le code téléchargé sur la carte 101, prenez-la et inclinez-la vers la gauche (broches d'entrées analogiques vers le bas). Le moteur doit commencer à tourner dans une direction. Inclinez maintenant la carte de l'autre côté (broches GPIO numériques vers le bas) : le moteur doit tourner dans la direction opposée. Quand vous posez la carte à plat, le moteur doit s'arrêter. Dans le cas contraire, consultez la section Dépannage ci-dessous.

alt text

Dépannage

Le moteur ne tourne pas

Vérifiez que le contrôleur de moteur est câblé correctement. Cela fait beaucoup de fils !

Le problème persiste

Vérifiez que le code a bien été téléchargé sur votre carte 101. Le téléchargement prend parfois du temps, soyez patient !

Ne fonctionne toujours pas

Il arrive que la carte Arduino se déconnecte de l'ordinateur. Essayez de la débrancher puis de la rebrancher au port USB.