Double SoftwareSerial, conflit ?

Bonjour,

Dans le cadre d’un projet, j’ai acquéri une Arduino Nano avec un module bluetooth ZS040 (ou HC05), il fonctionne correctement, si je met un pin à l’état haut ou bas en fonction de la donnée.

Mais si par exemple, j’ai un second software serial, un moteur par exemple, le moteur, qui fonctionne parfaitement sans le bluetooth, je tiens à préciser, il ne fonctionne plus.

Je m’explique: Au début de mon loop, si je met des instructions moteurs, parfait, elle sont bien fonctionnelle, mais si je conditionne ces mêmes instructions par la donnée du bluetooth, plus rien, le moteur ne veut rien savoir.

J’ai essayé de passer par des fonctions (si ma data bluetooth vaut ca, j’appel une fonction moteur mais rien non plus, aucun mouvement)

Alors je me suis dit que c’est peut être un conflit entre les deux SoftwareSerial, je ne voit rien d’autre, avez vous des idées ?

Je met le code que j’utilise ci-dessous:

#include <XL320.h>
#include <SoftwareSerial.h>

//Define connections for motors and bluetooth
SoftwareSerial motors_serial(8, 9); // (RX, TX)
SoftwareSerial bluetooth(11, 10);

//Name of the actual robot
XL320 motor;

// Set some variables for incrementing position & LED colour
char rgb[] = "rgbypcwo";

// Set the default servoID to talk to
int servoID = 24;
char data = ' ';

void setup() 
{
    //Setup the baudrate of the communication for motors
    motors_serial.begin(1000000);
    motor.begin(motors_serial);
  
    //Setup the baudrate for the bluetooth
    bluetooth.begin(9600);

    //Set the default speed, position, led colour for each motors
    motor.setJointSpeed(servoID, 1023);

    //Only for test
    pinMode(4, OUTPUT);
    digitalWrite(4, LOW);
}

void test()
{
    motor.LED(servoID, &rgb[random(0,5)]);
    motor.moveJoint(servoID, random(0, 500)); 
}

void loop() 
{   
    if (bluetooth.available()) 
    {    
        data = bluetooth.read();
        
        if (data == '1') 
        {
            //White led and goal position to 0
            motor.LED(servoID, &rgb[random(0,7)]);
            motor.moveJoint(servoID, 0);
            digitalWrite(4, HIGH);
        }
        
        if(data == '2')
        {
            //Yellow led and goal position to 1023 (max)
            motor.LED(servoID, &rgb[random(0,7)]);
            motor.moveJoint(servoID, 1023);
            digitalWrite(4, LOW);
        }
    }
}

Je tiens aussi à préciser, que le digitalWrite fonctionne parfaitement avec le code ci-dessus, mais pas les instructions moteurs (pour vérifier, j’ai utilise un multimètre, et on voit bien le changement de niveau du pin 4 en question)

Merci de vos réponses.

Cordialement,
Flooow

Flooow: Mais si par exemple, j'ai un second software serial, un moteur par exemple, le moteur, qui fonctionne parfaitement sans le bluetooth, je tiens à préciser, il ne fonctionne plus.

bonjour

Limitations The library has the following known limitations:

  • If using multiple software serial ports, only one can receive data at a time.

et le softwareSerial à 1Mbits/s c’est peut-être un peu trop.

Et pourquoi n’utilises-tu pas Serial pour l’un des deux cela relâcherait un peu la pression sur le soft et il n’y aurait plus de conflit.

D'accord et vu que je ne peut pas le faire, je fait comment du coup ?

Car je dois utiliser les deux (bluetooth et moteurs), a moins qu'il y est une autre méthode pour le bluetooth (compliqué de changer de méthodes pour les moteurs ...)

Et je suis obligé d'être à 1Mbps, c'est la vitesse imposée par les moteurs que j'utilise.

Flooow: Et je suis obligé d'être à 1Mbps, c'est la vitesse imposée par les moteurs que j'utilise.

tu es sur d'avoir besoin de cette vitesse en "serial" ? qui/quoi impose çà ? liens ?

J'utilise ces moteurs : http://www.generationrobots.com/fr/401692-servomoteur-dynamixel-xl-320.html

Je doit pouvoir la changer la vitesse de transmission, mais est-ce que cela changera quelque chose à mon problème, c'est à dire évitera le conflit entre les 2 SoftwareSerial, si oui, je le fait.

Après si modifier cela ne change pas le problème, je ne voit pas l'utilitée, pour le moment, je le ferais plus tard afin d'optimiser le fonctionnement, mais actuellement, mon problème est de pouvoir faire fonctionner mes moteurs, après réception d'une date bluetooth.

Merci de votre aide.

Flooow: J'utilise ces moteurs : http://www.generationrobots.com/fr/401692-servomoteur-dynamixel-xl-320.html

Je doit pouvoir la changer la vitesse de transmission, mais est-ce que cela changera quelque chose à mon problème, c'est à dire évitera le conflit entre les 2 SoftwareSerial, si oui, je le fait.

tu n'a aucune obligation d'etre absolument à 1Mbps pour le dialogue , c'est une valeur MAXI

Vitesse de communication : de 7343bps à 1 Mbps

Je vais changer, mais comme je l’ai dit, pense tu que cela va corriger le problème pour lequel je post ici ?

Car changer ce paramètre sur tous les moteurs va prendre un certain temps et j’aurais preferé le faire à la fin, plutôt que maintenant disons.

Flooow: Je vais changer, mais comme je l'ai dit, pense tu que cela va corriger le problème pour lequel je post ici ?

Car changer ce paramètre sur tous les moteurs va prendre un certain temps et j'aurais preferé le faire à la fin, plutôt que maintenant disons.

je ne connais pas tes moteurs mais de ce que j'ai compris , tu discute en "half-duplex" avec Sauf mauvaise lecture de ma part , tu ne reçois d'info que sur une interrogation adressée (hors cas de broadcast)