dimanche 27 juillet 2014

[Arduino] Alimentation externe

Lorsque l'on parle de robot mobiles, l'une des partie vitale est l'alimentation de tous les systèmes. Ici, je ne vais faire que redire ce que l'on trouve sur le net, l’alimentation de l'Arduino.

Lors des tests et debug de programme, il est facil de passer par l'alimentation USB. Néanmoins, ce port montre vite ses limites pour alimenter notre carte. D'autant plus, si on ajoute toutes sorte d'actionneurs-capteurs.

Heureusement, les concepteurs de l'Arduino ont pensé à tout. En effet, la carte est munie d'un régulateur de tension. Pour s'en servir, il nous suffit d'utiliser le jack de type : Fiche d'alimentation mâle 2,1x5,5x9,5 mm.
L'entrée ainsi disponible permet d'accueillir une batterie 7-12V.

Pour ma part, j'ai opté pour la pile de 9V mais par la suite, je passerai sur une batterie rechargeable pour plus de souplesse.

Au final, j'obtiens ça :




jeudi 10 juillet 2014

[Arduino] Accéléromètre Nunchuck

Comme on me le dit souvent, rien ne sert de ré-inventer la roue.
Aujourd'hui, je vais donc faire appel un tutoriel trouvé sur le site : http://www.skitoo.net .

Son auteur montre de manière détaillée comment intégrer le Nunchuck de la Wii à notre carte Arduino pour y récupérer les différentes accélérations. Dans son test, il manipule un servomoteur mais ce n'est pas la seul chose que l'on puisse faire avec de telles informations.

Ce dont vous avez besoin

  • 1 servomoteur
  • 1 nunchuk de console Wii
  • 1 kit Arduino
  • 1 breadboard 
  • quelques straps

Les principes du montage

Le nunchuck Wii utilise le protocole de communication I2C. Ce qui nous va très bien puisque Arduino gère très bien ce protocole via les broches analogiques 4 (SDA) et 5 (SCL). Depuis la version Uno R3, 2 nouvelles broches peuvent être utilisées pour cela : SDA et SCL qui se trouvent à coté de la broche AREF. Si vous possédez cette version de l'Arduino vous pouvez donc au choix utiliser l'une ou l'autre paire de broches. Pour ma part je vais utiliser les broches analogiques 4 et 5. 
Coté software, Arduino possède une librairie prévu pour cela : Wire.
La photo qui suit nous montre à quoi correspond chaque broche du câble Nunchuck Wii.
Schéma du câble Nunchuck
Vous remarquerez qu'en plus des broches SDA et SCL, le nunchuck a besoin d'une alimentation de 3,3v. Attention à ne pas mettre une tension supérieure au risque de le déteriorer.
Le servomoteur quant à lui possède 3 fils : 2 pour l'alimentation (+5v et GND) et un troisième pour le contrôler. Ce dernier doit absolument être connecté à l'une des 6 broches PWM de votre Arduino.
Coté software, là aussi, Arduino nous propose une librairie qui va bien : Servo.

Partie électronique

Pour la réalisation des schémas qui suivent j'ai utilisé un logiciel bien pratique : Fritzing. Celui-ci est gratuit et multi-plateforme. Il permet de réaliser rapidement des montages avec une vue de la platine d'essai, une vue shématique et enfin une vue du circuit imprimé. Vous trouverez à la fin de cette article le fichier Fritzing du montage.
Le composant "Nunchuck" n'étant pas encore disponible dans la bibliothèque de Fritzing j'ai pris un composant assez proche pour le représenter dans notre schéma.

Vue de la platine d'essai

Platine d'essai

Partie programmation

#include <Servo.h>;
#include <Wire.h>;

// Doit être ajusté en fonction de chaque nunchuck
#define ZEROX 530  
#define ZEROY 530
#define ZEROZ 530

// adresse I2C du nunchuck
#define WII_NUNCHUK_I2C_ADDRESS 0x52

// définition d'une variable Servo
Servo servomoteur;

// définition d'une variable counter
int counter;

// définition d'un tableau de données
uint8_t data[6];

void setup() 
{ 
  // on attache le servomoteur à la pin 11 (PWM)
  servomoteur.attach(11);

  // initialisation du nunchuck
  Wire.begin();

  Wire.beginTransmission(WII_NUNCHUK_I2C_ADDRESS);
  Wire.write(0xF0);
  Wire.write(0x55);
  Wire.endTransmission();

  Wire.beginTransmission(WII_NUNCHUK_I2C_ADDRESS);
  Wire.write(0xFB);
  Wire.write(0x00);
  Wire.endTransmission();
}


void loop() 
{ 
    // on demande 6 octets au nunchuck
    Wire.requestFrom(WII_NUNCHUK_I2C_ADDRESS, 6);

    counter = 0;
    // tant qu'il y a des données
    while(Wire.available())
    {
      // on récupère les données
      data[counter++] = Wire.read();
    }

    // on réinitialise le nunchuck pour la prochaine demande
    Wire.beginTransmission(WII_NUNCHUK_I2C_ADDRESS);
    Wire.write(0x00);
    Wire.endTransmission();

    if(counter >= 5)
    {
      // on extrait les données
      // dans mon exemple j'utilise uniquement les données d'accélération sur l'axe Y
      double accelX = ((data[2] << 2) + ((data[5] >> 2) & 0x03) - ZEROX);
      double accelY = ((data[3] << 2) + ((data[5] >> 4) & 0x03) - ZEROY);
      double accelZ = ((data[4] << 2) + ((data[5] >> 6) & 0x03) - ZEROZ);

      // on limite la valeur entre -180 et 180
      int value = constrain(accelY, -180, 180);
      // on mappe cette valeur pour le servomoteur soit entre 0 et 180
      value = map(value, -180, 180, 0, 180);
      // on écrit sur le servomoteur la valeur
      servomoteur.write(value);

      // un petit delai pour pas saturer le servomoteur
      delay(100);
    }}

Sur son site, l'auteur présente une vidéo de son application. Je remercie ce dernier pour ses explications claires qui je pense m'aideront dans un futur projet.