top of page

Février 2017 , par Techno_fabrik

Difficulté :

Durée :

Projet : Robot commandé par smartphone

LE PROJET  

Piloter un robot qui se déplace grâce à deux moteurs indépendants l'un de l'autre.

Le smartphone commandera le robot avec une application créée sur app inventor 2.

On commandera la puissance des moteurs, deux sens de rotations, et un module utra-son commandera l'arrêt des moteurs selon une certaine distance.

On ajoute une option 'MODE AUTOMATIQUE' ou le robot se déplacera en évitant les murs.

MATÉRIEL :

  1 module ARDUINO UNO 

  4 LEDs de couleurs

  4 résistance 1000 Ohms 

  1 module US 

  1 module Bluetooth (HC-06)

  2 moteurs fort couple

  1 batterie 12V

  1 batterie 6V (4xpile AA)

  1 module pont en H (sn745441one)

  1 interrupteur

PRÉREQUIS :

Connaissance des risques électriques. Montage réalisable par tous. Notion d'électronique et bases en programmation.

RÉALISATION

ETAPE 1 : Moteurs & module H

Le module H nous permet de commander deux moteurs, dans deux sens de rotations, tout en modulant leur vitesse.

     Sur le circuit intégré, la broche 1 est la PWM, tandis que les broches 2 et 7 (violet) sont les broches 'avancer' et 'reculer'. Les broches 3 et 6 se lient au moteur et 4,5 à la masse. De l'autre côté, c'est la même chose ,de la broche 9 à 16.

ETAPE 2 : Module Bluetooth

     On connecte  Tx <--> Rx entre le module et la carte, puis le Vcc au +5V et le GND à la masse.

Cela va nous permettre de commander le robot avec le smartphone.

ETAPE 3 : Batterie pile

   On réalise une batterie grâce à 4 des piles AA reliées en série.

ETAPE 5 : Module capteur US

   On branche de la même manière que le module Bluetooth le VCC et GND, puis on connecte le trigger et echo selon le code.

Nous pourrons alors détecter les murs devant soit.

 

Programme (codé en C)

// 19/02/2017 - Programme C - Commandes basique de deux moteurs en commandes séparéments ( pour commander un robot) par smartphone, via bluetooth - App inventor 2 utilisé - Carte Arduino ( UNO ) , module Bluetooth HC-06
// Ce programme a pour objectif de : 
//                                     -  Connecter les moteurs + module bluetooth au module arduino 
//                                     -  Envoyer un mot/phrase/nombre au smartphone
//                                     -  Recevoir une ou plusieurs commande via smartphone : ici le déplacement d'un robot 
// Programme réalisé par Techno_Fabrik


//********************BIBLIOTHEQUES****************************

//
// bibliothèque permettant d'utiliser les commandes pour servomoteurs facilement

//

//********************DECLARATIONS****************************


word w; // mot recu par le bluetooth
int wpui;
int wcmd;
int wdist;
const int motD_A = 4;
// on  va relier les moteurs à un module H ( qui va permettre de commander deux moteurs, dans les deux sens, avec la puissance( vitesse; rapport cyclique) voulu)
 const int motD_R=5;
 const int puiD=3;
 const int puiG =2;
 const int motG_A=9;
 const int motG_R=8;
 int dre=6;
 int gre=7;

//MODULE US : 2 entrées pour echo/trig , 2 variables utilisées pour la conversion, lecture 
 int echo = 10;
 int trig=11;
 long lecture_echo;
 long cm;
 //*************************INITIALISATION **********************
void setup() {
  Serial.begin(9600);
// communiquer avec le module BT
 pinMode(motD_A, OUTPUT);
pinMode(motD_R, OUTPUT);
pinMode(motG_A, OUTPUT);
pinMode(motG_R, OUTPUT); 
pinMode(puiD,OUTPUT);
pinMode(puiG,OUTPUT);
pinMode(trig,OUTPUT);
pinMode(echo,INPUT);

pinMode(dre,OUTPUT);
pinMode(gre,OUTPUT);
digitalWrite(trig,LOW);
}

// **************** FONCTIONS / PROCEDURES ***********************************
void recevoir()
// fonction permettant de recevoir l'information du smartphone

  if (Serial.available()) 
  {
    w = Serial.read();
    if(w>=0 && w<9) wcmd=w;
    if(w>=10 && w<111) wpui=w;
    if (w>=200 && w<401) wdist=w-200;
    delay(100);
    Serial.flush();
// attend que l'information est reçue avant de demander une nouvelle information
  }
}

//*************************************** BOUCLE ***************************
void loop() 
{
  int puissance ;
  recevoir();
// on recoit la variable w du smartphone
  // on recoit l'information en allumant pendant 10 ms le trig
  digitalWrite(trig,HIGH);
  delayMicroseconds(10);
  digitalWrite(trig,LOW);
  lecture_echo = pulseIn(echo,HIGH);  
//on lit avec lecture echo
  cm=lecture_echo/58; // conversion pour avoir la valeur en centimètre
  puissance=map(wpui,10,110,0,255); // mappage permettant de mettre la puissance de 0 a 100 (%) au lieu de 0 a 255 comme le veut le module
  if ( cm >wdist)
  {
      switch ( wcmd)
// On va coder sur App inventor, de maniere a envoyer un chiffre de 0 a 8, et qui seront les deplacements
      {
        case 0: digitalWrite(motD_A,LOW); digitalWrite(motD_R,LOW);digitalWrite(motG_A,LOW); digitalWrite(motG_R,LOW);analogWrite(puiD,puissance);analogWrite(puiG,puissance);digitalWrite(dre,LOW);digitalWrite(gre,LOW);Serial.println("STOP");delay(100);break;
        case 1: digitalWrite(motD_A,HIGH); digitalWrite(motD_R,LOW);digitalWrite(motG_A,LOW); digitalWrite(motG_R,LOW);analogWrite(puiD,puissance);analogWrite(puiG,puissance);digitalWrite(dre,HIGH);digitalWrite(gre,LOW);Serial.println("DROITE AVANT");delay(100);break;
// 1  = tourner à gauche ;
        case 2: digitalWrite(motD_A,LOW); digitalWrite(motD_R,LOW);digitalWrite(motG_A,HIGH); digitalWrite(motG_R,LOW);analogWrite(puiD,puissance);analogWrite(puiG,puissance);digitalWrite(dre,HIGH);digitalWrite(gre,LOW);Serial.println("GAUCHE AVANT");delay(100);break;
        case 3: digitalWrite(motD_A,HIGH); digitalWrite(motD_R,LOW);digitalWrite(motG_A,HIGH); digitalWrite(motG_R,LOW);analogWrite(puiD,puissance);analogWrite(puiG,puissance);digitalWrite(dre,HIGH);digitalWrite(gre,LOW);Serial.println("EN AVANT ");delay(100);break;
        case 4: digitalWrite(motD_A,LOW); digitalWrite(motD_R,LOW);digitalWrite(motG_A,LOW); digitalWrite(motG_R,HIGH);analogWrite(puiD,puissance);analogWrite(puiG,puissance);digitalWrite(dre,LOW);digitalWrite(gre,HIGH);Serial.println("GAUCHE ARRIERE");delay(100);break;
        case 5: digitalWrite(motD_A,LOW); digitalWrite(motD_R,HIGH);digitalWrite(motG_A,LOW); digitalWrite(motG_R,LOW);analogWrite(puiD,puissance);analogWrite(puiG,puissance);digitalWrite(dre,LOW);digitalWrite(gre,HIGH);Serial.println("DROITE ARRIERE");delay(100);break;
        case 6: digitalWrite(motD_A,LOW); digitalWrite(motD_R,HIGH);digitalWrite(motG_A,LOW); digitalWrite(motG_R,HIGH);analogWrite(puiD,puissance);analogWrite(puiG,puissance);digitalWrite(dre,LOW);digitalWrite(gre,HIGH);Serial.println("EN ARRIERE");delay(100);break;
        case 7: digitalWrite(motD_A,HIGH); digitalWrite(motD_R,LOW);digitalWrite(motG_A,LOW); digitalWrite(motG_R,HIGH);analogWrite(puiD,puissance);analogWrite(puiG,puissance);digitalWrite(dre,HIGH);digitalWrite(gre,HIGH);Serial.println("DEMI TOUR DROITE");delay(100);break;
        case 8: digitalWrite(motD_A,LOW); digitalWrite(motD_R,HIGH);digitalWrite(motG_A,HIGH); digitalWrite(motG_R,LOW);analogWrite(puiD,puissance);analogWrite(puiG,puissance);digitalWrite(dre,HIGH);digitalWrite(gre,HIGH);Serial.println("DEMI TOUR GAUCHE");delay(100);break;
        default:break;
      }
  }
  else
// dans le cas ou l'on est face à un mur
  { 
  Serial.println("MUR, vous devez reculer ");
  digitalWrite(motD_A,LOW); digitalWrite(motD_R,LOW);digitalWrite(motG_A,LOW); digitalWrite(motG_R,LOW);analogWrite(puiD,puissance);analogWrite(puiG,puissance);delay(50);
  switch(wcmd)
  {
    case 0: digitalWrite(motD_A,LOW); digitalWrite(motD_R,LOW);digitalWrite(motG_A,LOW); digitalWrite(motG_R,LOW);analogWrite(puiD,puissance);analogWrite(puiG,puissance);Serial.println("STOP");delay(100);break;
        case 1: Serial.println("impossible");delay(100);break;
        case 2: Serial.println("impossible");delay(100);break;
        case 3: Serial.println("impossible");delay(100);break;
        case 4: digitalWrite(motD_A,LOW); digitalWrite(motD_R,LOW);digitalWrite(motG_A,LOW); digitalWrite(motG_R,HIGH);analogWrite(puiD,puissance);analogWrite(puiG,puissance);digitalWrite(dre,LOW);digitalWrite(gre,HIGH);Serial.println("GAUCHE ARRIERE");delay(100);break;
        case 5: digitalWrite(motD_A,LOW); digitalWrite(motD_R,HIGH);digitalWrite(motG_A,LOW); digitalWrite(motG_R,LOW);analogWrite(puiD,puissance);analogWrite(puiG,puissance);digitalWrite(dre,LOW);digitalWrite(gre,HIGH);Serial.println("DROITE ARRIERE");delay(100);break;
        case 6: digitalWrite(motD_A,LOW); digitalWrite(motD_R,HIGH);digitalWrite(motG_A,LOW); digitalWrite(motG_R,HIGH);analogWrite(puiD,puissance);analogWrite(puiG,puissance);digitalWrite(dre,LOW);digitalWrite(gre,HIGH);Serial.println("EN ARRIERE");delay(100);break;
        case 7: digitalWrite(motD_A,HIGH); digitalWrite(motD_R,LOW);digitalWrite(motG_A,LOW); digitalWrite(motG_R,HIGH);analogWrite(puiD,puissance);analogWrite(puiG,puissance);Serial.println("DEMI TOUR DROITE");digitalWrite(dre,HIGH);digitalWrite(gre,HIGH);delay(100);break;
        case 8: digitalWrite(motD_A,LOW); digitalWrite(motD_R,HIGH);digitalWrite(motG_A,HIGH); digitalWrite(motG_R,LOW);analogWrite(puiD,puissance);analogWrite(puiG,puissance);Serial.println("DEMI TOUR GAUCHE");digitalWrite(dre,HIGH);digitalWrite(gre,HIGH);delay(100);break;
        default : break;
  }
  }
  }
  

APPLICATION SMARTPHONE
VIDEO REALISATION
Robot smartphone
Lire la vidéo
bottom of page