Logo Robot Sumo              
   
       
   
       
       
Ligne
Ligne
  slogan    
Ligne
Ligne
       
 

Voici un petit tutoriel pour piloter un robot filoguidé avec une télécommande qui permet de gérer les directions mais également la vitesse du robot.

Le matériel nécessaire :

- Une carte Arduino, le modèle Uno est largement suffisant
- Un shield moteur pour Arduino, j'ai choisi celui de chez Adafruit, car il permet de piloter plusieurs moteurs
- Un shield Joystick, j'ai récupéré un joystick de PS3, ca fonctionne aussi
- 2 alimentations : une en 12 volts pour la carte arduino et une autre de 12 volts pour la carte adafruit si vos moteurs fonctionnent en 12 volts. Il faut bien lire la notice adafruit, pour savoir si vos moteurs fonctionnent avec la carte. En 12 volts pas de soucis, attention à l'ampérage tout de même, la carte supporte 3A maximum mais pas en continue.
- Un cable USB pour relier la carte Arduino à l'ordinateur.
- Des fils pour brancher sur la carte arduino, pensez à les acheter avec votre carte.
- Votre robot ou vos moteurs.

et il faut aussi le code pour le programme.

La carte Arduino Uno

Arduino Uno


Le shield moteur Adafruit

Shield Adafruit


Le shield Joystick

Joystick


Pour la carte Adafruit, quand vous la recevrez il faudra souder les composants. Rien de sorcier, mais il faut être minutieux.
Une fois tout cela en votre possession, il faut tout brancher. Commencez par retirer le petit cavalier (power jump) de la carte adafruit si vous ne voulez pas griller la carte arduino. Ensuite, assembler les deux cartes, en posant la carte Adafruit sur la carte arduino. Brancher les alimentations sur chaque carte.

Ensuite, il faut brancher le joystick. Le 5V du joystick sur le 5V de la carte adafruit près du cavalier que vous avez retiré, le GND sur le GND, vous avez le choix il y en a deux. Ensuite il y a IRx et IRy, IRx vous le branchez sur Analog In 0 (A0) et IRy sur Analog In 4 (A4). Le plus compliqué est fait, il reste les moteurs, j'ai utilisé les ports M1 et M2 de la carte adafruit. Si le robot recule au lieu d'avancer ou tourne à droite au lieu de tourner à gauche, il faut changer les fils de vos moteurs de place entre le + et le -.

Reste le code du programme.

Pour installer le code sur la carte aduino, il faut un petit programme (IDE) que vous pouvez télécharger ici :
http://www.arduino.cc/en/Main/Software. Prenez la dernière version.
Il faut aussi vérifier que vous avez bien installé la librairie adafruit. La librairie est à télécharger sur le site Adafruit. https://www.adafruit.com/

Copier - Coller le code ci-dessous dans l'IDE arduino, téléversez le programme dans la carte arduino et si vous ne vous êtes pas trompés, votre joystick dirige les moteurs du robot.
Je n'ai pas configuré le bouton poussoir du joystick, c'est pour cela que SW du joystick n'est pas branché. Vous pouvez toujours le coder en regardant les tutoriels pour les boutons poussoirs.

ATTENTION : Adafruit a sorti une nouvelle version de sa Shield moteur (V2.3). Selon votre version, la librairie et le code change. Je vous mets ci-dessous les codes pour la V1 et la V2.

AMUSEZ-VOUS BIEN !!!

[CODE VERSION 1] ci-dessous à copier-coller ou Librairie v1 et code à télécharger ici : V1

//-V1----------- CODE CLUB ROBOTIQUE SAINT BARTHELEMY-D'ANJOU -----------
// Librairie Adafruit
#include <AFMotor.h>

// Branchement joystick et moteur
const int x = A0;
const int xMin = 0;
const int xMax = 1023;
const int y = A4;
const int yMin = 0;
const int yMax = 1023;
int neut = 2; // zone neutre
int neutn = -2; // zone neutre négative
AF_DCMotor motor_dc_1(1, MOTOR12_2KHZ);
AF_DCMotor motor_dc_2(2, MOTOR12_2KHZ);

// Définition des variables
int lecX, lecY, calX, calY, retX, retY, vit;

void setup () {
// Initialisation port serie
Serial.begin(9600);

// Lecture des valeurs en x et y
lecX = analogRead(x);
lecY = analogRead(y);
}

void loop() {

// Calibration du joystick en 0,0
calX = analogRead(x)-lecX;
calY = analogRead(y)-lecY;

// Réatalonnage x et y de 0,1023 à -255,255
retX = map(calX, xMin, xMax, 0, 512);
retX= constrain(calX, -255, 255);
retY = map(calY, yMin, yMax, -255, 255);
retY = constrain(calY, -255, 255);
Serial.print("X : ");
Serial.print(retX);
Serial.println();
Serial.print("Y : ");
Serial.print(retY);
Serial.println();
delay(50);

if ((abs(retX)) > (abs(retY)))
{
vit = (abs(retX));
}
else
{
vit = (abs(retY));
}

//Vitesse et direction moteurs
if (((retX) > (neut)) && ((retY) < (neutn)))
{
motor_dc_1.setSpeed(abs(vit));
motor_dc_1.run(BACKWARD);
motor_dc_2.setSpeed(abs(vit));
motor_dc_2.run(FORWARD);
Serial.print("Bas-gauche");
Serial.println();
}
else if (((retX) < (neutn)) && ((retY) < (neutn)))
{
motor_dc_1.setSpeed(abs(vit));
motor_dc_1.run(FORWARD);
motor_dc_2.setSpeed(abs(vit));
motor_dc_2.run(BACKWARD);
Serial.print("Bas-droit");
Serial.println();
}
else if (((retX) < (neutn)) && ((retY) > (neut)))
{
motor_dc_1.setSpeed(abs(vit));
motor_dc_1.run(BACKWARD);
motor_dc_2.setSpeed(abs(vit));
motor_dc_2.run(FORWARD);
Serial.print("Haut-droit");
Serial.println();
}
else if (((retX) > (neut)) && ((retY) > (neut)))
{
motor_dc_1.setSpeed(vit);
motor_dc_1.run(FORWARD);
motor_dc_2.setSpeed(vit);
motor_dc_2.run(BACKWARD);
Serial.print("Haut-Gauche");
Serial.println();
}
else if (((retY) <= (neut)) && ((retY) >= (neutn)) && ((retX) >= (neut)))
{
motor_dc_1.setSpeed(vit);
motor_dc_1.run(BACKWARD);
motor_dc_2.setSpeed(vit);
motor_dc_2.run(FORWARD);
Serial.print("demi-tour-gauche");
Serial.println();
}
else if (((retY) <= (neut)) && ((retY) >= (neutn)) && ((retX) <= (neutn)))
{
motor_dc_1.setSpeed(vit);
motor_dc_1.run(FORWARD);
motor_dc_2.setSpeed(vit);
motor_dc_2.run(BACKWARD);
Serial.print("demi-tour-droit");
Serial.println();
}
else if (((retX) <= (neut)) && ((retX) >= (neutn)) && ((retY) >= (neut)))
{
motor_dc_1.setSpeed(vit);
motor_dc_1.run(FORWARD);
motor_dc_2.setSpeed(vit);
motor_dc_2.run(FORWARD);
Serial.print("Avant");
Serial.println();
}
else if (((retX) <= (neut)) && ((retX) >= (neutn)) && ((retY) <= (neutn)))
{
motor_dc_1.setSpeed(vit);
motor_dc_1.run(BACKWARD);
motor_dc_2.setSpeed(vit);
motor_dc_2.run(BACKWARD);
Serial.print("Arriere");
Serial.println();
}
else
{
motor_dc_1.setSpeed(0);
motor_dc_1.run(RELEASE);
motor_dc_2.setSpeed(0);
motor_dc_2.run(RELEASE);
}

}


[CODE VERSION 2] ci-dessous à copier-coller ou Librairie v2 et code à télécharger ici : V2

//-V2------------ CODE CLUB ROBOTIQUE SAINT BARTHELEMY-D'ANJOU -----------
// Librairie Adafruit
#include <Wire.h>
#include <Adafruit_MotorShield.h>
#include "utility/Adafruit_MS_PWMServoDriver.h"

Adafruit_MotorShield AFMS = Adafruit_MotorShield();

// Branchement joystick et moteur
const int x = A0;
const int xMin = 0;
const int xMax = 1023;
const int y = A4;
const int yMin = 0;
const int yMax = 1023;
int neut = 10; // zone neutre
int neutn = -10; // zone neutre négative
Adafruit_DCMotor *myMotor1 = AFMS.getMotor(1);
Adafruit_DCMotor *myMotor2 = AFMS.getMotor(2);

// Définition des variables
int lecX, lecY, calX, calY, retX, retY, vit;

void setup () {
// Initialisation port serie
Serial.begin(9600);
AFMS.begin();

// Lecture des valeurs en x et y
lecX = analogRead(x);
lecY = analogRead(y);
}

void loop() {

// Calibration du joystick en 0,0
calX = analogRead(x)-lecX;
calY = analogRead(y)-lecY;

// Réatalonnage x et y de 0,1023 à -255,255
retX = map(calX, xMin, xMax, -255 , 255);
retX= constrain(calX, -255, 255);
retY = map(calY, yMin, yMax, -255, 255);
retY = constrain(calY, -255, 255);
Serial.print("X : ");
Serial.print(retX);
Serial.println();
Serial.print("Y : ");
Serial.print(retY);
Serial.println();
delay(50);

if ((abs(retX)) > (abs(retY)))
{
vit = (abs(retX));
}
else
{
vit = (abs(retY));
}

//Vitesse et direction moteurs
if (((retX) > (neut)) && ((retY) < (neutn)))
{
myMotor1->setSpeed(abs(vit));
myMotor1->run(FORWARD);
myMotor2->setSpeed(abs(vit));
myMotor2->run(BACKWARD);
Serial.print("Bas-gauche");
Serial.println();
}
else if (((retX) < (neutn)) && ((retY) < (neutn)))
{
myMotor1->setSpeed(abs(vit));
myMotor1->run(BACKWARD);
myMotor2->setSpeed(abs(vit));
myMotor2->run(FORWARD);
Serial.print("Bas-droit");
Serial.println();
}
else if (((retX) < (neutn)) && ((retY) > (neut)))
{
myMotor1->setSpeed(abs(vit));
myMotor1->run(FORWARD);
myMotor2->setSpeed(abs(vit));
myMotor2->run(BACKWARD);
Serial.print("Haut-droit");
Serial.println();
}
else if (((retX) > (neut)) && ((retY) > (neut)))
{
myMotor1->setSpeed(vit);
myMotor1->run(BACKWARD);
myMotor2->setSpeed(vit);
myMotor2->run(FORWARD);
Serial.print("Haut-gauche");
Serial.println();
}
else if (((retY) <= (neut)) && ((retY) >= (neutn)) && ((retX) >= (neut)))
{
myMotor1->setSpeed(vit);
myMotor1->run(BACKWARD);
myMotor2->setSpeed(vit);
myMotor2->run(FORWARD);
Serial.print("demi-tour-gauche");
Serial.println();
}
else if (((retY) <= (neut)) && ((retY) >= (neutn)) && ((retX) <= (neutn)))
{
myMotor1->setSpeed(vit);
myMotor1->run(FORWARD);
myMotor2->setSpeed(vit);
myMotor2->run(BACKWARD);
Serial.print("demi-tour-droit");
Serial.println();
}
else if (((retX) <= (neut)) && ((retX) >= (neutn)) && ((retY) >= (neut)))
{
myMotor1->setSpeed(vit);
myMotor1->run(FORWARD);
myMotor2->setSpeed(vit);
myMotor2->run(FORWARD);
Serial.print("Avant");
Serial.println();
}
else if (((retX) <= (neut)) && ((retX) >= (neutn)) && ((retY) <= (neutn)))
{
myMotor1->setSpeed(vit);
myMotor1->run(BACKWARD);
myMotor2->setSpeed(vit);
myMotor2->run(BACKWARD);
Serial.print("Arriere");
Serial.println();
}
else
{
myMotor1->setSpeed(0);
myMotor1->run(RELEASE);
myMotor2->setSpeed(0);
myMotor2->run(RELEASE);
}

}