essayez pour voir avec ce code (tapé ici en piquant la fonction de lecture du port série dans mon tuto pointé en #1, non testé)
Mettez la console série Arduino à 115200 bauds, j'ai conservé la vitesse du BT à ce que vous aviez mis soit 38400
sur le joystick:
#include <SoftwareSerial.h>
const byte RxD = 2;
const byte TxD = 3;
SoftwareSerial BTSerie(RxD, TxD);
const byte potXPin = A0; // ces pins analogiques sont en input par défaut
const byte potYPin = A1;
const char marqueurDeFin = '\n';
int previousX = -1, X;
int previousY = -1, Y;
void setup()
{
Serial.begin(115200);
BTSerie.begin(38400);
Serial.println(F("----- TEST EMISSION JOYSTICK -------"));
delay(500);
}
void loop()
{
X = map(analogRead(potXPin), 0, 1023, 0, 255);
if (X != previousX) {
BTSerie.write('X');
BTSerie.print(X);
BTSerie.write(marqueurDeFin);
previousX = X;
Serial.print(F("X=")); Serial.println(X);
}
Y = map(analogRead(potYPin), 0, 1023, 0, 255); // c'est mieux de laisser un peu de temps entre 2 analogRead de pins différentes, donc on ne groupe pas les appels
if (Y != previousY) {
BTSerie.write('Y');
BTSerie.print(Y);
BTSerie.write(marqueurDeFin);
previousY = Y;
Serial.print(F("Y=")); Serial.println(Y);
}
}
sur le récepteur avec les moteurs:
#include <SoftwareSerial.h> //Software Serial Port
const byte RxD = 10;
const byte TxD = 11;
SoftwareSerial BTSerie(RxD, TxD);
const byte tailleMessageMax = 10; // 10 est largement assez grand pour des messages qui sont au max " Xnnn\n" soit 5 caractères... (on aurait pu mettre 5 si on est juste en mémoire)
char message[tailleMessageMax + 1]; // +1 car on doit avoir un caractère de fin de chaîne en C, le '\0'
const char marqueurDeFin = '\n';
int X = 0, Y = 0;
boolean ecouterBT()
{
static byte indexMessage = 0; // static pour se souvenir de cette variable entre 2 appels consécutifs. initialisée qu'une seule fois.
boolean messageEnCours = true;
while (BTSerie.available() && messageEnCours) {
int c = BTSerie.read();
if (c != -1) {
switch (c) {
case marqueurDeFin:
message[indexMessage] = '\0'; // on termine la c-string
indexMessage = 0; // on se remet au début pour la prochaine fois
messageEnCours = false;
break;
default:
if (indexMessage <= tailleMessageMax - 1) message[indexMessage++] = (char) c; // on stocke le caractère et on passe à la case suivante
break;
}
}
}
return messageEnCours;
}
// LA FONCTION QUI FAIT QUELQUE CHOSE QUAND ON A UN NOUVEL X
void moteurX()
{
Serial.print(F("X=")); Serial.println(X);
}
// LA FONCTION QUI FAIT QUELQUE CHOSE QUAND ON A UN NOUVEL Y
void moteurY()
{
Serial.print(F("Y=")); Serial.println(Y);
}
// L'ANALYSEUR DE LIGNE RECUE.
void traiterMessage()
{
switch (message[0]) { // on regarde quel est le premier caractère
case 'X': // si c'est un X
X = atoi(message + 1); // la valeur numérique suit ce caractère, on la lit cf http://www.cplusplus.com/reference/cstdlib/atoi/
moteurX(); // et on fait quelque chose avec
break;
case 'Y':
Y = atoi(message + 1);
moteurY();
break;
default:
Serial.println(F("Erreur de communication"));
break;
}
}
void setup()
{
Serial.begin(115200);
BTSerie.begin(38400);
Serial.println(F("----- TEST RECEPTION JOYSTICK -------"));
delay(500);
}
void loop()
{
if (! ecouterBT()) traiterMessage();
// ici on peut faire autre chose
}
ça donne quoi? (vous devriez voir aussi que le mémoire flash utilisée baisse car j'ai viré la classe String qui prends plus d'1,5Ko)
au passage - cette partie là nest pas bonne
while (125<Y<130)
et idem pour
while (125 < X < 130)
{
angle = 90;
servo.write(angle);
}
On ne peut pas faire les tests comme cela, il faut séparer en 2 tests ((X > 125) && (X < 130))
et bien sûr il faut que ce qui se trouve dans le while modifie X (ou Y).. sinon vous êtes coincé s'il n'y pas de break dans le corps
enfin n'oubliez pas de tester quand c'est égal à 125 ou 130 dans un des cas, par l'usage de <= ou >= sinon quand le joystick sera sur cette valeur rien ne changera car aucun de vos if ne sera vérifié