Go Down

Topic: Connection de modules bluetooth (maitre/esclave) (Read 43766 times) previous topic - next topic

arduinoreg

Je sais lol, en tout cas j'ai mis 20ms dans mon programme...
mais ça ne marche pas  :smiley-eek-blue:


john_lenfr

Déjà est ce que ton module bluetooth est bien en 57600, branché sur pins 11 et 12?

Ensuite place des serial.print dans ton programme pour débugger et vérifie que tu rentre dans tes IF

Par ailleurs quel est le programme final de réception?

arduinoreg

Code: [Select]

#include <Servo.h>
//================================================================================
//PINS INDICATRICES DU RAFRAICHISSEMENT (Chaque réception)
//========================================================
#define LEDPIN_PINMODE    pinMode (13, OUTPUT);
#define LEDPIN_OFF        PORTB &= ~(1<<5);
#define LEDPIN_ON         PORTB |= (1<<5);
//=====================================================
#define HORS_TEMPS 50000 //Hors temps de 50 ms
Servo myservo;
Servo myservo2;
byte tab_val[6];
int valeurEchel2;
int valeurEchel;
//=====================================================
//=====================================================
void setup()
{
  LEDPIN_PINMODE 
  //Serial.begin(9600);
  myservo.attach(9);
  myservo2.attach(10);
// Serial.println("enter communication");
  Serial.begin(57600);  // Vitesse de transmission bluetooth défini
                          // dans le programmmes de paramétrage esclave/maitre
 
  for (int i = 0; i <= 5; i++) {   //initialisation des tableaux de réception
    tab_val[i] = 0;                //de valeur en byte   (00000)
    delay(5);
  }
  for (int i = 0; i <= 5; i++) {
    Serial.print(tab_val[i]);
    delay(5);
  }
  delay(500);
}
//==================================================================================
//==================================================================================
void loop()
{

      if (Serial.available() > 0) // Détection de la communication bluetooth
{
  for (int i = 0; i <= 5; i++) {
    tab_val [i] = Serial.read();  //Reception et enregistrement de chaque byte
    long temps=micros();             
    while (Serial.available() == 0 && i<5 && micros()<(temps+HORS_TEMPS));
    if (micros()>(temps+HORS_TEMPS)){
        break;                                             //permet de sortir de la boucle si condition vrai
    }
  }

if (tab_val[0] == '*' && tab_val[5] == 'F') // Detection des caractères d'identification trame (début "*" et fin "F")
    {
        LEDPIN_ON     
      // Serial.print(" CSV formatted string: ");
      // Serial.print(tab_val[1] + (tab_val[2] << 8),DEC);           //recompose la valeur de A0 qui avait été découpé
      // Serial.print(",");                                          //et l'imprime sur le moniteur ( tab_val[1] + (tab_val[2] << 8) = A0 )
      // Serial.print(tab_val[3] + (tab_val[4] << 8),DEC);           //idem
      // Serial.print(",");                                     
        /*Serial.print(tab_val[5] + (tab_val[6] << 8),DEC);        //Possibilité d'ajouter la réception des autres
        Serial.print(",");                                         //valeurs reçu par bluetooth des entrées analogique
        Serial.print(tab_val[7] + (tab_val[8] << 8),DEC);
        Serial.print(",");
        Serial.print(tab_val[9] + (tab_val[10] << 8),DEC);
        Serial.print(",");
        Serial.print(tab_val[11] + (tab_val[12] << 8),DEC);
        */
         
       //commande servo 1
       //===================================================================
        valeurEchel = map(tab_val[1] + (tab_val[2] << 8), 0, 1023, 0, 179);  //tab_val[1] + (tab_val[2] << 8) : valeur de
                                                                             // A0 recomposé
        if(0<=valeurEchel && valeurEchel<=180)    //Commande le servo uniquement si il reçoit une donnée
                                                  //comprise entre 0-180°
        {
          myservo.write(valeurEchel);
        }
        else {
        // Serial.print(" pas de commande servo 1 ");
        }
        //==================================================================
        //commande servo 2
       valeurEchel2 = map(tab_val[3] + (tab_val[4] << 8), 0, 1023, 0, 179);
       if(0<=valeurEchel2 && valeurEchel2 <=180)    //Commande le servo uniquement si il reçoit une donnée
                                                    //comprise entre 0-180°
        {
        myservo2.write(valeurEchel2);
        }
        else {
       // Serial.print(" pas de commande servo2 "); //on ne fait rien
        }   
        //==================================================================
tab_val[0] = -1;   //on efface les caractère de début et de fin
tab_val[5] = -1; 
LEDPIN_OFF
  }
     else
     {
   //  Serial.print("Données reçues incorrectes"); //on ne fait rien
     }
   // Serial.println("");
  }
}
 

john_lenfr

J'avais netoyé ton code des tests inutiles.
Si tu fais un map juste avant inutile de faire ce test par exemple:
Code: [Select]
if(0<=valeurEchel2 && valeurEchel2 <=180)

Autrement rien dans le programme n'a l'air bloquant... a tester avec du debug.

fdufnews

Code: [Select]
void loop()
{

      if (Serial.available() > 0) // Détection de la communication bluetooth
{
  for (int i = 0; i <= 5; i++) {
    tab_val [i] = Serial.read();  //Reception et enregistrement de chaque byte
    long temps=micros();             
    while (Serial.available() == 0 && i<5 && micros()<(temps+HORS_TEMPS));
    if (micros()>(temps+HORS_TEMPS)){
        break;                                             //permet de sortir de la boucle si condition vrai
    }
  }

Ça c'est pas bon.
Il faut attendre d'avoir reçu le marqueur de début de chaîne pour commencer à mémoriser les caractères reçus sinon jamais tu ne te caleras correctement.
Imagine que ton récepteur finisse son reset (ou bien qu'il y ait une perte de transmission temporaire) alors que l'émetteur en est à l'envoie du milieu du message.
Tu prends 5 caractères. C'est pas les bons, tu les rejettes.
Tu prends les 5 suivants, c'est toujours pas les bons puisque tu n'es pas aligné correctement.
Et ainsi tu rejettes tous les messages reçus.
Le problème a déjà été évoqué au début de ce fil c'était d'ailleurs la raison qui avait entraîne la mise en place d'un protocole minimum.

Code: [Select]
  for (int i = 0; i <= 5; i++) {   //initialisation des tableaux de réception
    tab_val[i] = 0;                //de valeur en byte   (00000)
    delay(5);
  }
  for (int i = 0; i <= 5; i++) {
    Serial.print(tab_val[i]);
    delay(5);
  }

Ces delay() sont inutiles lorsqu'on écrit dans un tableau.
L'écriture dans un tableau est instantanée.

arduinoreg

Okok ! ;)
Finalement, je suis partie sur un contrôle avec bouton poussoir + sélecteur de vitesse avec bouton poussoir, déclenché par interruptions sur front montant, et ça rend plutôt bien :)

http://www.youtube.com/watch?v=LUlsJFfQZvQ

john_lenfr


arduinoreg

euh, faut que je retrouve le code... la je viens de passer sur une carte mega, car j'ai besoin de mega broches d'interruption la... y'en à que 2 sur le uno et nano.. Dès que je le retrouve ou que j'ai fini l'étape que je suis en train de réaliser je te l'envoie ;)

arduinoreg

#204
Jul 04, 2014, 10:33 am Last Edit: Jul 06, 2014, 04:50 pm by arduinoreg Reason: 1
Salut, désolé j'ai pas eu le temps de te montrer le programme c'est un peu parce que je suis sur plusieurs projets et aussi que je n'ai pas eu le temps de le poster car je n'ai pas commenté le code, et il est, entre guillemet "fait à la rache" x)  Je te l'envoie au cas ou...
Ne te fie pas à la longueur du code (ça pourrait faire peur)
Ici, j'utilise des interruptions (car j'ai des boutons poussoirs non persistant)
Le but étant :
        -  créer 2 vitesses de fonctionnement rapide et lente(générées par un maintient du bouton (pour les 2 servos)
        - d'envoyer une incrémentation d' angle à chaque appui sur un bouton poussoir, à valeur sélectionnable suivant le nombre d'appuies sur un autre des boutons poussoir... (uniquement pour le servo 1)
 
Si tu veux m'aider le soucis étant que je me suis occupé de réaliser le code d'abord pour un cervo, et maintenant je suis gèné pour les gérer indépendamment, si jamais tu veux m'aider encore une fois !!!
Je suis désolé je n'ai pas eu vraiment le temps de le commenter alors oui c'est un peu brouillon..

PS: Je te mets le code en PJ car le code est trop long..
PS2 : Ne tente pas de le faire avec une nano ou uno (tu n'as que 2 broches d'interruptions) : mega 2+4 !

arduinoreg

Voila un peu ce que ça donne maintenant   :smiley-mr-green:

http://www.youtube.com/watch?v=oG1n--zEBKw

serval70

En faite je me suis trompé,meme en envoyant les commandes une a une depuis un terminal ca plante une fois sur deux sauf si je fait un reset "AT+RST" a chaque fois.
Peut etre que le prob. viens du site.Connaitrais tu un autre site aussi simple a utiliser
?

Artouste

En faite je me suis trompé,meme en envoyant les commandes une a une depuis un terminal ca plante une fois sur deux sauf si je fait un reset "AT+RST" a chaque fois.
Peut etre que le prob. viens du site.Connaitrais tu un autre site aussi simple a utiliser
?

bonsoir
je ne vois pas bien ton problème de bluetooth
tu parle de quel site ?

Go Up