lundi 11 mai 2015

Comment concevoir une voiture téléguidée par Bluetooth?





Présentation du tutoriel


Piloter une voiture par Bluetooth avec un téléphone Android. Pour se faire on a utilisé le châssis d’une ancienne voiture qu’on n'a assemblé avec le matériel que nous avons listé ci dessous pour réaliser ce projet. Pour les moteurs qui ont permis à la propulsion et la direction nous avons utilisé ceux d’origine qui se trouvaient déjà sur la voiture (puisqu'ils étaient en bon état).


Ce dont vous avez besoin


  • 1 Arduino UNO R3
  • 1 Bluetooth SMIRF Silver
  • 1 ProtoShield
  • 1 circuit intégré L239D H-bridge
  • 1 châssis voiture
  • 2 moteurs DC
  • 5 piles AA assemblées
  • 4 leds
  • 2 résistances 220 Ohm pour les phares
  • 2 résistances de 1000 Ohm pour les transistors
  • 2 transistors 2N3904 NPN ou équivalent
  • Des fils de différentes couleurs
  • Des connecteurs males et femelles

 Vous pouvez avoir tous ces composant sur Dakar Proto Shop


1- Montage sur BreadBord




  Image1: Câblage sur une breadbord

Apres avoir terminé avec les phares nous allons vous montrer comment nous avons monté le kit Bluetooth. Mais tout d’abord nous allons faire un petit résumé sur ce module Bluetooth pour vous faciliter sa compression.
Comme nous l'avons dis précédemment à la partie matériel nous avons utilisé un BlueSMIRF silver qui a une portée maximale de 10 mètre contrairement au Gold qui peut atteindre les 100 mètres. Il est facile à utiliser et très compatible avec Arduino UNO R3 ici utilisé. Vous pouvez le trouver ici et ici.

2- Présentation de la carte bluetooth

Il contient deux LEDS. Une LED rouge appelée «STAT LED» et une LED verte appelée «CONNECT LED». Elles sont utilisées pour montrer l’état dans lequel se trouve la carte.

    Image2: la carte bluetooth et les différentes parties

      Les entrées, sorties et puissance


Nom des pins

Fonction des pins

Entrées sorties et puissance

Description

RTS-O

Request to send

Output

RTS est utilisé pour le contrôle de flux matériel dans
certaines interfaces série. Cette sortie n’est pas critique pour la
communication série simple.

RX-I

Serial receive

Input

Cette broche reçoit des données de série d'un autre
appareil. Il doit être raccordé au TX de l'autre appareil.

TX-O

Serial transmit

Output

Cette broche transmet les données série à un autre
appareil. Il doit être connecté à la RX de l'autre appareil.

VCC

Voltage supply

Power In

Ce signal de tension d'alimentation est acheminé à
travers un régulateur de 3,3 V, alors acheminé vers le module Bluetooth. Il
devrait se situer entre 3,3 V à 6V.

CTS-I

Clear to send

Input

CTS est un autre signal série de contrôle de flux.
Comme RTS, il ne est pas nécessaire pour la plupart, des interfaces série
simples.

GND

Ground

Power In

La tension de référence 0V, commune à un autre appareil
connecté au modem Bluetooth.

Le BlueSMiRF s’alimente aussi bien en 3,3V qu’en 5V. La tension fournie aux broches VCC / GND peut être ne importe où entre 3,3 et 6V. Les tensions sur les signaux séries et de commande d'entrée (RX-I et CTS-I) peuvent être comprises entre 3,3 V et 5 V. Les signaux de sortie (TX-O et O-RTS) sont à 0 V pour le niveau logique bas, et VCC pour un niveau logique haut.

3-Comment monter sa carte BlueSMiRF ?

Nous avons souder des pins sur la carte pour faciliter son montage sur notre protoshield


     Image3: la carte avec des pins soudés

TX-O est reliée au pin 2 de l'Arduino, RX-i est reliée au pin 3 de l’arduino, GND à GND, VCC à 5V. Les broches CTS-I et RTS-S ne sont pas connectées. Les broches TX-O et RX-I pourraient être connectées à n’importe quelle broche numérique (supérieur à 0 et 1), si vous avez besoin 2 et 3 pour autre chose.

Image4: montage de la carte BlueSMiRF sur un Arduino UNO R3

Après avoir préparé notre carte Bluetooth on va à présent faire un peu de soudure sur le Protoshield. On va ajouter le H-Bridge L239D IC ( dans le cercle rouge) et des pins femelles pour monter la carte. Comme dans l’image qui suit.



Image5: Protoshield et le H-Bridge monté la dessus.

Un petit commentaire sur le L239D IC s’impose parce que c’est un élément très important pour le pilotage. Le circuit intégré H-Bridges L239D IC permet de contrôler deux moteurs DC grâce à ses 16 pins dont 4 pins de contrôle qui sont ici les pins (2, 7, 10 et 15) pins respectives des moteurs de propulsion et direction. Il s’active avec le Enable pin qui se trouve sur ces pattes (1 et 9). Ses deux pattes du milieu de chaque cote sont relies au GND (ground, 0V). Les autres les pattes (4, 5, 12 et 13) sont raccordées aux deux moteurs. Et le reste de ses pattes (8 et 16) sont reliées au VCC (5V). Et c’est grâce à ce petit circuit intégré qu’on peut contrôler les moteurs dans notre application. Vous pouvez vous procurer ce composant dans sur dakarprotoshop.


Code Arduino:



  
#include <SoftwareSerial.h>  

// bluetooth setup
int bluetoothTx = 2;  // TX-O pin of bluetooth mate, Arduino D2
int bluetoothRx = 3;  // RX-I pin of bluetooth mate, Arduino D3
SoftwareSerial bluetooth(bluetoothTx, bluetoothRx);


// H-Bridges pins
int const controlPin1=6; // pin 2 on L293D IC
int const controlPin2 = 4; // pin 7 on L293D IC
int const controlPin3 = 8; // pin 10 on L293D IC
int const controlPin4 = 11; // pin 15 on L239D IC
int const enablePin1 = 9; // pin 1 on L239D IC
int const enablePin2 = 10;// pin 9 on L293D IC
// lights pins
int ledPin1 = 7; // LED connected to pin 7 
int ledPin2 = 12; // LED connected to pin 12  
int hornPin = 5;

int motorSpeed = 100;
boolean warningOn=false;
boolean frontLightOn=false;
boolean backLightOn=false;

void setup() 
{
   //Setup des pins
   pinMode(controlPin1, OUTPUT); 
   pinMode(controlPin2, OUTPUT);
   pinMode(enablePin1, OUTPUT);
   pinMode(controlPin3, OUTPUT);
   pinMode(controlPin4, OUTPUT);
   pinMode(enablePin2, OUTPUT);
   pinMode(ledPin1, OUTPUT);
   pinMode(ledPin2, OUTPUT);  
   pinMode(hornPin, OUTPUT);
   digitalWrite(controlPin1, LOW); 
   digitalWrite(controlPin2, LOW);
   digitalWrite(enablePin1, LOW);
   digitalWrite(controlPin3, LOW);
   digitalWrite(controlPin4, LOW);
   digitalWrite(enablePin2, LOW);
   digitalWrite(ledPin1, LOW);
   digitalWrite(ledPin2, LOW);  
   digitalWrite(hornPin, LOW);
   
   Serial.begin(9600);  // Begin the serial monitor at 9600bps
   
   // activation du bluetooth
    bluetooth.begin(115200);  // The Bluetooth Mate defaults to 115200bps
    bluetooth.print("$");  // Print three times individually
    bluetooth.print("$");
    bluetooth.print("$");  // Enter command mode
    delay(100);  // Short delay, wait for the Mate to send back CMD
    bluetooth.println("U,9600,N");  // Temporarily Change the baudrate to 9600, no parity
    // 115200 can be too fast at times for NewSoftSerial to relay the data reliably
    bluetooth.begin(9600);  // Start bluetooth serial at 9600
    bluetooth.flush();
}
void loop() 
{
  char val; // variable to receive data from the serial port
  
  if(bluetooth.available())  // If the bluetooth sent any characters
  { 
    val =(char)bluetooth.read();         // read it and store it in 'val'
  }
  switch(val)              
  {
    case 'F':
      forward (); // car run forward
      straight();
      break;
    case 'B':
      back (); // car run back
      straight();
      break;
    case 'R':
      turnRight (); // car turn Rght
      stopProp();
      break;
    case 'L':
      turnLeft (); // car turn Left
      stopProp();
      break;
    case 'W':
      frontLightOn=true; // light front on
      break;
    case 'w':
      frontLightOn=false; // light front off
      break;
    case 'U':
      backLightOn=true; // light back on
      break;
    case 'u':
      backLightOn=false; // light back off
      break;
    case 'G':
      {
        turnLeft();
        forward ();
      }
      break;
    case 'I':
      {
        turnRight();
        forward ();
      }
      break;
    case 'H':
      {
        turnLeft ();
        back ();
      }
      break;
    case 'J':
      {
        turnRight ();
        back();
      }
      break;
    case 'V':
      hornOn ();
      break;
    case 'v':
      hornOff ();
      break;
    case 'X':
      warningOn=true;
      break;
    case 'x':
      warningOn=false;
      break;
    case 'S':
      stopAll ();
      break;
    default:  //Get velocity
      if(val=='q')
        {
          motorSpeed= 255;  //Full velocity
        }
      else
        {
          if((val >= 48) && (val <= 57))
           //Chars '0' - '9' have an integer equivalence of 48 - 57, accordingly.
            { 
              //Subtracting 48 changes the range from 48-57 to 0-9.
              //Multiplying by 25 changes the range from 0-9 to 0-225.
              motorSpeed= (val- 48)*25; 
              Serial.print("motorSpeed:");
              Serial.println(motorSpeed);   
             }   
         }
   
  }
  
  setLight();
  
}
void forward ()
{
   digitalWrite(controlPin1,LOW);
   digitalWrite(controlPin2,HIGH);
   analogWrite(enablePin1, motorSpeed);
   
}
void back ()
{
   digitalWrite(controlPin1,HIGH);
   digitalWrite(controlPin2,LOW);
   analogWrite(enablePin1, motorSpeed);
}
void stopProp ()
{
   analogWrite(enablePin1, 0);
}

void turnLeft ()
{
  digitalWrite(controlPin3, HIGH);
  digitalWrite(controlPin4, LOW);
  analogWrite(enablePin2, 250);
}
void turnRight ()
{
  digitalWrite(controlPin3, LOW);
  digitalWrite(controlPin4, HIGH);
  analogWrite(enablePin2, 250);
}
void straight ()
{
  analogWrite(enablePin2, 0);
}
void stopAll ()
{
  analogWrite(enablePin1, 0);
  analogWrite(enablePin2, 0);
}

void hornOn ()
{
  tone(hornPin, 220);
}
void hornOff ()
{
  noTone(hornPin);
}
void setLight ()
{
  if (warningOn){
    if (millis()%1000 <500)
    {
      digitalWrite(ledPin1, HIGH);
      digitalWrite(ledPin2, HIGH);
    }
    else 
    {
      digitalWrite(ledPin1, LOW);
      digitalWrite(ledPin2, LOW);
    }
  }
 else
  {
    digitalWrite(ledPin1, frontLightOn);
    digitalWrite(ledPin2, backLightOn);
  }
}
   


Si vous avez des questions n’hésitez pas à les posez en commentaires.

                                                                                                                                                                                                                     






           

1 commentaire: