lundi 18 mai 2015

Utilisation de la carte gps

Objectifs

Affichage des données du GPS qu’on envoyera par GSM

Matériels nécessaires:


  • Arduino UNO
  • Pmod GPS
  • Shield GSM

Tous ces matériels sont disponibles sur notre magasin en ligne

Comment procède t-on?


Pour avoir les données du GPS transmises par satellites on doit choisir l’exemple qui est dans la librairie TinyGPS ( librairie déjà téléchargée) puis on choisit l’exemple nommé “test with gps device”, une fois ouvert on va sur le setup pour mettre sur le Serial.begin 115200 (c’est pour l’affichage des données sur le moniteur série) et 9600 pour le GPS( exemple nss.begin(9600) pour SoftwareSerial et altSerial.begin(9600) pour AltSoftSerial), une fois ce code téléversé on pourra lire directement les données sur le moniteur série.
Pour utiliser le GPS et le GSM en même temps c'est-à-dire on envoie les données du GPS par SMS via le GSM on ne peut pas utiliser la librairie SoftwareSerial car cette dernière est en conflit avec la librairie du GSM mais on peut utiliser AltSoftSerial qui est bien compatible avec le GPS et le GSM.


Exemple:


#include <AltSoftSerial.h>
#include <TinyGPS.h>
#include <GSM.h>

NB: Notons que AltSoftSerial utilisent les pins 9 et 8 respectivement pour TX et RX pour la carte Arduino UNO.
Si j’utilise ces pins respectivement sur le câblage je risque de ne pas avoir de données je ne sais pas exactement la cause mais j’intervertis seulement les pins pour avoir les données.

Pour se faire on peut envoyer le message sans pour autant utiliser le moniteur série pour entrer le numéro c'est-à-dire on entre le numéro de téléphone directement dans le code pour cela on crée une fonction qui comportera et le numéro de téléphone et le contenu du message(les données du GPS) et cette fonction déclarée sera appelée dans le loop.


Exemple:


void sendSMS(char* myNumber,long myMessage1,long myMessage2) et dans le loop j’ai
ça  sendSMS("myNumber",lat,lon);

lat et lon sont la latitude et la longitude que j’ai déclaré dés le début long lat,lon;


Maintenant voici le code qu'on a utilisé, on a seulement comme données la latitude et la longitude que nous allons envoyer comme message toutes les minutes.

  
#include <AltSoftSerial.h>

#include <TinyGPS.h>
#include <GSM.h>
AltSoftSerial altSerial;
TinyGPS gps; // créer gps object
// initialized gsm
#define PINNUMBER ""
GSM gsmAccess;
GSM_SMS sms;
int mySMSCount=1;

long lat,lon; // create object for latitude and longitude

void setup()
{
 Serial.begin(115200); // serial connexion 
 altSerial.begin(9600); // sensor gps connexion 
 
   // verification état
 boolean notConnected = true;

 // Start GSM shield
 // If your SIM has PIN, pass it as a parameter of begin() in quotes
 while(notConnected)
 {
   if(gsmAccess.begin(PINNUMBER)==GSM_READY)
     notConnected = false;
   else
   {
     Serial.println("Not connected");
    
   }
 
   }
     Serial.println("GSM initialized");
     delay(5000);
}
void loop()
{
 while(altSerial.available())
 { 
  if(gps.encode(altSerial.read()))
  { // encode gps data
   gps.get_position(&lat,&lon); // get latitude and longitude
   // display position 
   Serial.print("Position: ");
   Serial.print("lat: ");
   Serial.print(lat);
   Serial.print(" ");// print latitude
   Serial.print("lon: ");
   Serial.println(lon); //print longitude
  }
 }
 
     sendSMS("myNumber",lat,lon);
     Serial.println(" ");
     Serial.print("message sent: ");
     Serial.println(mySMSCount);
     mySMSCount++;
     
}

void sendSMS(char* myNumber,long myMessage1,long myMessage2)
{
     sms.beginSMS(myNumber);
     sms.print(myMessage1);
     sms.print("/");
     sms.print(myMessage2);
     sms.endSMS(); 
     delay(10000);
     
}

Explication des parties essentielles du code:


AltSoftSerial altSerial;
TinyGPS gps; // créer gps object
L'objet "altSerial" est utilisé pour extraire les données du récepteur GPS, l'objet "GPS" est utilisé pour séparer les données du récepteur en composants individuels.

Nous allons vérifier s’il y a des données qui sont disponibles
while(altSerial.available())

Puis on lit et on encode les données
 if(gps.encode(altSerial.read()))

Enfin, nous conservons les valeurs de latitude et de longitude dans les variables lat et lon.
gps.get_position(&lat,&lon);

Et pour envoyer ces données nous avons déclarées une fonction
void sendSMS(char* myNumber,long myMessage1,long myMessage2)

N'hésitez pas à poser des questions dans les commentaires.





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.