[Conseil] Beug sur Serial (bluetooth)

Bonjours,
J’ai récement acheter un module bleutooth HC-06 sur ce site : Module bluetooth HC-06 compatible avec Arduino
Je l’ai donc utilisé pour commander ma arduino (mega 2560) qui controlle une voiture telecommandé à partir de mon télephone (que je controllai avant avec ma telecommande de télé). Les actions sont simples :
-avancer
-reculer
-tourner à droite
-tourner à gauche
-s’arreter
Le robot possède deux moteurs arrières controllé indépendamment et une roue jocket à l’avant (ce qui facilite la maniabilité je trouve enfin bref). Les deux moteurs sont controllé par 4 relais. Deux relais font office de “levier” et les deux autres servent à inverser la polarité pour les mouvements avancer/reculer. C’est moteur sont, par défault, alimenté avec du 4,5 V mais il y a un autre relais qui fait une bascule sur du 9V.

Voici le programme de la arduino :

int ledPin = 13;
int ledPin2 = 2;
int cn = 0;
int Stop1 = 0;
int Stop2 = 0;

void setup()
{
pinMode(ledPin, OUTPUT);
pinMode(ledPin2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
digitalWrite(3, 255);
digitalWrite(4, 255);
digitalWrite(5, 255);
digitalWrite(6, 255);
digitalWrite(7, 0);
Serial.begin(9600);
}

void loop()
{
while (Serial.available() == 0);
byte c = Serial.read();
if (c >= 105 && c <= 120) //avancer
{
digitalWrite(6, 255);
digitalWrite(5, 255);
digitalWrite(4, 0);
digitalWrite(ledPin, HIGH);
digitalWrite(3, 0);
Serial.println(“droit”);
Stop1 = 0;
}
else if (c <= 88 && c >= 70) //arriere
{
digitalWrite(5, 0);
digitalWrite(6, 0);
digitalWrite(3, 0);
digitalWrite(4, 0);
digitalWrite(ledPin, HIGH);
Serial.println(“arriere”);
Stop1 = 0;
}
else if (c <= 47 && c >= 40) //droite
{
digitalWrite(6, 255);
digitalWrite(5, 255);
digitalWrite(3, 255);
digitalWrite(4, 0);
digitalWrite(ledPin, HIGH);
Serial.println(“droite”);
Stop2 = 0;
}
else if (c >= 53 && c <= 60) //gauche
{
digitalWrite(6, 255);
digitalWrite(5, 255);
digitalWrite(4, 255);
digitalWrite(3, 0);
digitalWrite(ledPin, HIGH);
Serial.println(“gauche”);
Stop2 = 0;
}
else if (c == 64) //2eme vitesse
{
digitalWrite(ledPin2, HIGH);
digitalWrite(7, 255);
Serial.println(“2eme vitesse”);
}
else if (c == !64) { //1ere vitesse
digitalWrite(ledPin2, LOW);
digitalWrite(7, 0);
Serial.println(“1ere vitesse”);
}
else if (c == 244) { //stop total
digitalWrite(6, 255);
digitalWrite(5, 255);
digitalWrite(4, 255);
digitalWrite(ledPin, LOW);
digitalWrite(3, 255);
Serial.println(“stop total”);
}
else if (c == 100) {
Stop1 = 1;
}
else if (c == 50) {
Stop2 = 1;
}
if (Stop1 == 1 && Stop2 == 1) {
digitalWrite(6, 255);
digitalWrite(5, 255);
digitalWrite(4, 255);
digitalWrite(ledPin, LOW);
digitalWrite(3, 255);
Serial.println(“stop”);
}
Serial.println(c);
}

Et l’application que j’utilise sur mon telephone est celle-ci : https://play.google.com/store/apps/details?id=com.andico.control.joystick
Je l’ai re-parametré pour obtenir les valeurs qui sont “demandées” ou “traitées” dans le programme.

Et on arrive donc au problème…
Je ne sais pas ce qui cloche mais certaines actions rendent “fou” le port série… Lorsque je lui dit d’aller a droite, aucun soucis… A gauche, pareil… Mais pour ce qu’il en est d’avancer ou de reculer… La commande est reconnue seulement les valeurs qui apparaissant dans le port série deviennent totalement alléatoires!
Un aperçu :
Au repos (aucun ordre lancé à la arduino) :

0
stop
243
stop
100
stop
50
1ere vitesse
stop

Direction droite :

43
1ere vitesse
0
243
228
droite
43
1ere vitesse
0
243
228
droite

Direction gauche :

58
1ere vitesse
0
243
100
gauche
58
243
100
gauche
58
1ere vitesse
0
243
100
gauche
58
243
100
gauche

Avant :

200
104
1ere vitesse
0
253
254
241
255
10
50
13
13
13
1ere vitesse
0
130
51
gauche
53
48
97
droit
114
gauche
55
droit
114
5
67
arriere
72
droit
106
13
13
13
13
13
10
13
67
154
gauche
53
gauche
53
50
gauche
56
48
gauche
53
gauche
53
48
gauche
53
gauche
57
13
10
10
254
195
66
1ere vitesse
0
12
255
252
248
252
144
34
241
droit

Arrière :

242
25
7
232
143
158
129
126
121
252
125
droit
115
243
droit
109
arriere
79
248
209
189
droit
112
arriere
79
8
droit
110
255
255
arriere
77
255
254
192
248
255
8
255
arriere
79
255
254
207
252
217
10
255
255
255
254
249
252
253
arriere
72
67
arriere
77
249
254
10
227
253
248
195
253
17
253
250
168
droit
115
248
248
253
49
11
93
253
252
255
174
248
36
10
63
94
159
6
102
253
254
255

Voila mais malheureusement ce n’est pas tout… Le relais qui s’occupe de la tension d’alimentation des moteur, une fois actionné… La arduino fais exactement ce qui est montrer juste au dessus… Les données entrées et traitées par la arduino sont completement fausses ! Et cela ne vient pas de l’application car je l’ai tester sur un autre programme :

byte c;

void setup() // Fonction d’initialisation de la carte
{
Serial.begin(9600); // Demarrer la liaison a 9600bauds
}

void loop() // Fonction principale, elle se répète (s’exécute) à l’infini
{
while (Serial.available() == 0); // Attendre de recevoir des caracteres
c = Serial.read(); // Lire les caracteres recus et les stocker dans c
Serial.println(c);
}

Sur ce programme, les données sont les bonnes…
Si quelqu’un peut m’aider… Merci

T~

Terra25:
...

Et l'application que j'utilise sur mon telephone est celle-ci : https://play.google.com/store/apps/details?id=com.andico.control.joystick
Je l'ai re-parametré pour obtenir les valeurs qui sont "demandées" ou "traitées" dans le programme.

bonjour
connais pas
mais l'appli a été mise à jour aujourd'hui
verifie déjà si ça corrige tes soucis

Nouveautés
---------Version 1.1---------

  • Corrected a bug that mapped the left and right values for the tilt pan incorrectly.

Bonjour,

Ya peux être un bug dans l’appli android mais ya définitivement un bug dans le code arduino !

else if (c == !64) { //1ere vitesse

D’où sort ce !, si tu veux faire un “a différent de b” la syntaxe c’est a != b :wink:

Dans tout les cas, ta suite de if n’est pas logique.
Si c == 64 → 2e vitesse
Sinon si c != 64 → 1er vitesse, du coup tout les autres if aprés le if(c != 64) ne seront jamais atteint (soit c’est égale, soit ça l’est pas).

en effet, !64 donne zéro :wink: