Documente Academic
Documente Profesional
Documente Cultură
Le Bluetooth :
La carte Arduino seule na pas dantenne, il est donc impossible dtablir avec une connexion sans fil
Bluetooth, il faut donc utiliser un module Bluetooth :
Module Bluetooth :
Si lArduino peut thoriquement commander les moteurs de cette faon, cela nest pas suffisant pour
garantir son efficacit, un effet, en tudiant la documentation de larduino on apprend que lintensit
sur chaque borne peut aller jusqu' 50mA (cf : http://arduino.cc/en/Main/ArduinoBoardUno)
Or notre source de courant qui alimentera les moteur devra fournir une intensit pouvant aller
jusqu' 800mA, il est donc impossible dutiliser directement larduino pour commander le moteur, il
faut donc passer par un module dalimentation.
Module dalimentation des moteurs :
Ce module permet une alimentation en toute
scurit des moteurs, il utilise une
alimentation externe pour rcuprer le
courant et le signal PWM de larduino pour
alimenter jusqu' deux moteurs en courant
continu. On notera aussi quil utilise 4 autres
bornes de larduino pour permettre de
paramtrer le sens de rotation de chaque
moteur dans le sens horaire ou antihoraire.
Il permet ainsi de respecter toutes les
caractristiques du cahier des charges.
Chaque module Bluetooth utilise des bornes spcifiques dfinis dans la documentation technique de
chacun deux :
Cette connaissance du cblage est ncessaire pour la rsolution des problmatiques suivantes.
Paramtrage du
module
Mise en attente de
connexion.
Vidage du buffer
Il a fallu aussi tablir un protocole denvoi des donnes du Smartphone vers lArduino.
X:1,23456
Axe sur lequel t
prlev linformation.
Nombre dcimal
entre -10 et 10.
Dlimiteur.
Remarques :
- On filtre le : qui ne sert pas sinon pour le debuguage.
- La valeur envoy peut dpasser 10 ( ou tre infrieur -10), cela serait du des mouvement
brusques.
- La taille maximal dune valeur est donc de 10 caractres (lettre + signe - + 2 chiffres (nombre
suprieur 10) + , + 5 dcimales ).
On notera que pour obtenir les trois valeurs dans une mme entit il faudrait recevoir 40 caractres,
en effet, il faut rcuprer lquivalent de 4 valeurs pour tre certain den avoir trois compltes (cf
lexemple de trame), soit 40 caractres.
Ex de trame potentiellement recevable :
,3456X:-9,33257Y:2,73658Z:10,23456X:1,27
Ici X vaudrait -9,33257, Y vaudrait 2,73658 et Z vaudrait 10,23456.
La position angulaire de laxe X,Y et Z sont ainsi envoys en continu et peuvent ainsi permettre a
lArduino de connaitre linclinaison du tlphone sur chacun de ces axes.
On se rappellera des informations donnes par Maxime sur limpact de lorientation Smartphone sur
les valeurs envoys, nanmoins voici un petit rappel rapide ncessaire pour la comprhension de la
partie suivante :
X>0
X<0
Y=10
Y<10
Z>0
Z<0
Macro principale
Paramtrage du module
Bluetooth et mise en
attente de connexion.
Variables Globales
Algorigramme du
programme potentiel pour
assurer la communication
Arduino/Androd et la
commande des moteurs.
Cration dun
tableau de 40 cases
Cration des
variables de type
entier : X,Y et Z
Extraction des valeurs en
X, Y et Z du tableau
Tant que le
tableau nest pas rempli
Rception dun
caractre Bluetooth et
placement dans le
tableau
Lecture de la
valeur dune case
du tableau
Si la valeur
est X
Oui
Non
Si la valeur
est Y
Extraction des
valeurs en X, Y et
Z du tableau
Transformation en
valeur numrique
des 9 cases suivantes
et placement dans la
variable X.
Oui
Transformation en
valeur numrique
des 9 cases suivantes
et placement dans la
variable Y.
Non
Si la valeur
est Z
Non
Oui
Transformation en
valeur numrique
des 9 cases suivantes
et placement dans la
variable Z.
Pour plus
dinformations
retourner la page n4
Paramtrage du
module Bluetooth
Mise en attente de
connexion
Vidage du buffer.
Modulation de la vitesse
des moteurs
Paramtrage du
module pour faire
tourner le moteur
dans le sens horaire.
Oui
Si Z plus grand
que 0
Non
Paramtrage du
module tel que le
vhicule tourne
gauche.
Oui
Si X plus grand
que 0
Paramtrage du module
pour faire tourner le
moteur dans le sens antihoraire.
Non
Dfinition de la vitesse
de rotation des
moteur en fonction de
Y.
Paramtrage du
module tel que le
vhicule tourne
droite.
Cration du programme :
Pour programmer larduino il faut utiliser un Environnement de Dveloppement Intgr
communment appel IDE (en anglais), comme son nom lindique cest un logicielle qui permet de
dvelopper pour une plateforme dans un ou plusieurs langages (compilation pour la plateforme
donn). Il intgre un grand nombre doutil permettant de faciliter la cration des programmes, en
voici une deux intgrs dans celui de larduino :
- Un dbogueur, utile pour savoir o linterprtation du code chouera.
- Un mulateur de moniteur srie, il permet de voir les messages que nous envoie larduino,
extrmement utile lors du dveloppement des programmes, du dbogage ou encore des phases
dexprimentations.
Le langage utilis par lIDE est un langage extrmement proche du C, cest pour cela que lon dit par
extension que lArduino est programm en C.
Il faut ensuite vrifier que lextraction des valeurs prsentes dans le tableau se fait bien de la faon
que lon souhaite, on utilise de nouveau le moniteur srie et on affiche les valeurs extraites de
chaque tableau :
Marche arrire :
On voit que quand Z est positive le shield moteur est programm en marche avant et quand Z est
ngatif le shield moteur est programm en marche arrire.
Tournant vers la gauche :
On voit que quand Y est proche de 10 (tlphone la vertical) les moteurs ne sont que trs peu
aliments et qua linverse quand le tlphone est lhorizontal (Y proche de 0) les moteurs sont
quasiment aliments au maximum.
Ainsi lArduino devrait normalement pouvoir rpondre toutes les exigences dfinis dans le cahier
des charges dans la communication arduino/androde en vue dune commande de vhicule motoris.
Le vhicule ntant pas encore achev il est pour linstant impossible de tester larduino en
conditions rels, le principe a tout de mme t vrifi avec un systme de LED.
10
Les Entrs M1 et M2
simulent les mmes
entrs prsentent sur le
module dalimentation
des moteurs, cest ces
sorties que seront relis
les moteurs. Cela permet
de vrifier dans quel sens
tournerait le moteur et
lintensit lumineuse
nous informe sur la
tension libr.
11
12
Annexe : Programme
Arduino :
#include <SoftwareSerial.h>
//Software Serial Port
#define RxD 6 // sont bien
configurs mme si c'est
bizarre...
#define TxD 7
#define DEBUG_ENABLED 1
#define EA 9
#define EB 10
#define IN1 8
#define IN2 11
#define IN3 12
#define IN4 13
#define droite 1
#define gauche 2
SoftwareSerial
blueToothSerial(RxD,TxD);
void setup()
{
Serial.begin(9600);
pinMode(RxD, INPUT);
pinMode(TxD, OUTPUT);
pinMode(13,OUTPUT);
pinMode(12,OUTPUT);
pinMode(11,OUTPUT);
pinMode(10,OUTPUT);
pinMode( 9,OUTPUT);
pinMode( 8,OUTPUT);
setupBlueToothConnection();
}
int restatVal(int val);
void loop()
{
char recvChar;
char tabVal[40];//(X12.99999)10 max * 4
int x;
static float valX=0;
static float valY=0;
static float valZ=0;
static int memZ=0;
static int moteurA=0;
static int moteurB=0;
static int directionM = 0;
while(1){
if(blueToothSerial.available()){/
/check if there's an , data sent
from the remote bluetooth
shield
x=0;
while(x<40)
{
48)*0.001;
tabVal[x]=blueToothSerial.read
();
if((tabVal[x]>='0'&&tabVal[x]<
='9')||(tabVal[x]>='X'&&tabVal
[x]<='Z')||tabVal[x]==','||tabV
al[x]=='-')x++;
}
int i,ii;
int rang;
for(ii=0;ii!=40;ii++)
{
Serial.print(tabVal[ii]);
}
Serial.println("");
int boolX,boolY,boolZ;
boolX=0;
boolY=0;
boolZ=0;
for(i=0;i!=40;i++)
{
if(tabVal[i]=='Y'&&!boolY)
{
boolY=1;
rang=i+1;
int signe=0;
float valeur=0;
if(tabVal[rang]=='-')
{
signe=1;
rang++;
}
if(tabVal[i]=='X'&&!boolX)
{
boolX=1;
rang=i+1;
int signe=0;
float valeur=0;
if(tabVal[rang]=='-')
{
signe=1;
rang++;
}
if(tabVal[rang+2]==',')valeur=9.
99;
if(signe)valeur*=1;
valX=valeur;
}
valeur=(float)(tabVal[rang]-48);
valeur+=(float)(tabVal[rang+2]48)*0.1;
valeur+=(float)(tabVal[rang+3]48)*0.01;
valeur+=(float)(tabVal[rang+4]48)*0.001;
if(tabVal[rang+2]==',')valeur=9.
99;
if(signe)valeur*=-1;
valY=valeur;
}
valeur+=(float)(tabVal[rang+3]48)*0.01;
if(tabVal[i]=='Z'&&!boolZ)
{
boolZ=1;
rang=i+1;
int signe=0;
float valeur=0;
if(tabVal[rang]=='-')
{
signe=1;
rang++;
}
valeur+=(float)(tabVal[rang+4]-
valeur=(float)(tabVal[rang]-48);
valeur=(float)(tabVal[rang]-48);
valeur+=(float)(tabVal[rang+2]48)*0.1;
13
valeur+=(float)(tabVal[rang+2]48)*0.1;
valeur+=(float)(tabVal[rang+3]48)*0.01;
moteurA=(int)((10.0valX)*(10.0valY)*255.0/100.0);
moteurB=(int)((10.0valY)*255.0/10.0);
moteurA=restatVal(moteurA);
valeur+=(float)(tabVal[rang+4]48)*0.001;
if(tabVal[rang+2]==',')valeur=9.
99;
if(signe)valeur*=-1;
valZ=valeur;
}
}
Serial.print("X:");
Serial.print(valX);
Serial.print(" Y:");
Serial.print(valY);
Serial.print(" Z:");
Serial.print(valZ);
Serial.println("");
moteurB=restatVal(moteurB);
analogWrite(EA,moteurA);
analogWrite(EB,moteurB);
Serial.println("gauche");
}
if(directionM==droite)
{
moteurA=(int)((10.0valY)*255.0/10.0);
moteurB=(int)((10.0valX)*(10.0valY)*255.0/100.0);
moteurA=restatVal(moteurA);
if(valX<0)
{
directionM=droite;
valX*=-1.0;
}
else
directionM=gauche;
if(valZ>=0&&memZ<1)
{
memZ=1;
digitalWrite(IN1,HIGH);
digitalWrite(IN2,LOW);
digitalWrite(IN3,HIGH);
digitalWrite(IN4,LOW);
}
if(valZ<=0&&memZ>-1)
{
memZ=-1;
digitalWrite(IN1,LOW);
digitalWrite(IN2,HIGH);
digitalWrite(IN3,LOW);
digitalWrite(IN4,HIGH);
}
if(directionM==gauche)
{
moteurB=restatVal(moteurB);
analogWrite(EA,moteurA);
analogWrite(EB,moteurB);
Serial.println("droite");
}
if(memZ==1)Serial.println("Ma
rche avant");
if(memZ==1)Serial.println("Marche
arrire");
Serial.print("A:");
Serial.print(moteurA);
Serial.print("B:");
Serial.print(moteurB);
Serial.println("");Serial.println(
"");
}
if(Serial.available()){//check
if there's any data sent from
the local serial terminal, you