Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Arduino] Contrôle de moteurs DC par bluetooth

    27 janvier 2014 à 17:31:42

    Bonjour,

    Je possède 4 moteurs DC (une petite voiture) que je voudrais contrôler via mon smartphone. J'ai déjà réussi a contrôler 2 servomoteurs par bluetooth et j'arrive à contrôler les moteurs en serial. Seulement dès que je passe en bluetooth rien ne se passe, pourtant le module bluetooth reçoit les données mais n'a pas l'air de les transmettre...

    J'utilise une carte Grove I2C Motor Driver 1.2 pour mes moteurs :

    J'utilise un module bluetooth HB01 :

    Voici mon code arduino :

    #include <Wire.h>
    #include <SoftwareSerial.h>
    
    #define MotorSpeedSet             0x82
    #define PWMFrequenceSet           0x84
    #define DirectionSet              0xaa
    #define MotorSetA                 0xa1
    #define MotorSetB                 0xa5
    #define Nothing                   0x01
    
    #define RxD 0
    #define TxD 1
    
    #define I2CMotorDriverAdd         0x0f   // Set the address of the I2CMotorDriver
    
    
    SoftwareSerial ModBt(RxD,TxD);
    
    void MotorSpeedSetAB(unsigned char MotorSpeedA , unsigned char MotorSpeedB)  {
      MotorSpeedA=map(MotorSpeedA,0,100,0,255);
      MotorSpeedB=map(MotorSpeedB,0,100,0,255);
      Wire.beginTransmission(I2CMotorDriverAdd); // transmit to device I2CMotorDriverAdd
      Wire.write(MotorSpeedSet);        // set pwm header 
      Wire.write(MotorSpeedA);              // send pwma 
      Wire.write(MotorSpeedB);              // send pwmb    
      Wire.endTransmission();    // stop transmitting
    }
    
    void MotorPWMFrequenceSet(unsigned char Frequence)  {    
      Wire.beginTransmission(I2CMotorDriverAdd); // transmit to device I2CMotorDriverAdd
      Wire.write(PWMFrequenceSet);        // set frequence header
      Wire.write(Frequence);              //  send frequence 
      Wire.write(Nothing);              //  need to send this byte as the third byte(no meaning)  
      Wire.endTransmission();    // stop transmitting
    }
    
    void MotorDirectionSet(unsigned char Direction)  {     //  Adjust the direction of the motors 0b0000 I4 I3 I2 I1
      Wire.beginTransmission(I2CMotorDriverAdd); // transmit to device I2CMotorDriverAdd
      Wire.write(DirectionSet);        // Direction control header
      Wire.write(Direction);              // send direction control information
      Wire.write(Nothing);              // need to send this byte as the third byte(no meaning)  
      Wire.endTransmission();    // stop transmitting 
    }
    
    void MotorDriectionAndSpeedSet(unsigned char Direction,unsigned char MotorSpeedA,unsigned char MotorSpeedB)  {  //you can adjust the driection and speed together
      MotorDirectionSet(Direction);
      MotorSpeedSetAB(MotorSpeedA,MotorSpeedB);  
    }
    
    void setup()  {
      Wire.begin(); 
      delayMicroseconds(5000);
      Wire.onReceive(Handler);//On créer un intercepteur de donnees
      pinMode(RxD, INPUT);
      pinMode(TxD, OUTPUT);
      Serial.begin(9600);
      
      setupBlueToothConnection(); //Used to initialise the Bluetooth shield
      delay(5000);
    }
    
    void loop()  {
      ModBt.listen(); //On met le module bluetooth en écoute
      
      if(ModBt.available()) {//si le buffer contient des données
         char data = ModBt.read(); //On lit et on stock les données reçues
         
         Wire.beginTransmission(I2CMotorDriverAdd);
         Wire.write(data);   //On transmet les données et on déclenche le handler
         Wire.endTransmission();
         }
    }
          
    void Handler(int wireData) {
     // wireData = Wire.read();
      if(wireData == 1) {
        MotorSpeedSetAB(100, 100);
        delay(10);
        MotorDirectionSet(0b1010);
        delay(1000);
      }
      if(wireData == 2) {
        MotorSpeedSetAB(100, 100);
        delay(10);
        MotorDirectionSet(0b0101);
        delay(1000);
      }
      if(wireData == 3) {
        MotorSpeedSetAB(0, 100);
        delay(10);
        MotorDirectionSet(0b1010);
        delay(1000);
      }
      if(wireData == 4) {
        MotorSpeedSetAB(100, 0);
        delay(10);
        MotorDirectionSet(0b0101);
        delay(1000);
      }
    }
      
    
    void setupBlueToothConnection()
    {
     ModBt.begin(115200); //Set BluetoothBee BaudRate to default baud rate 38400
     ModBt.print("\r\n+STWMOD=0\r\n"); //set the bluetooth work in slave mode
     ModBt.print("\r\n+STNA=SeeedBTSlave\r\n"); //set the bluetooth name as "SeeedBTSlave"
     ModBt.print("\r\n+STOAUT=1\r\n"); // Permit Paired device to connect me
     ModBt.print("\r\n+STAUTO=0\r\n"); // Auto-connection should be forbidden here
     delay(2000); // This delay is required.
     ModBt.print("\r\n+INQ=1\r\n");
     Serial.println("The slave bluetooth is inquirable!");
     delay(2000); // This delay is required.
     ModBt.flush();
    }
    


    Voila, si vous avez des infos qui me débloqueraient je suis preneur !

    Cordialement.

    • Partager sur Facebook
    • Partager sur Twitter
      27 janvier 2014 à 17:47:43

      Il y aurait pas une confusion entre Wire et ModBt ? Wire c'est pour ton GroveI2C et ModBt c'est pour le bluetooth non ? Dans ce cas pourquoi tu met le handler dans Wire ?

      • Partager sur Facebook
      • Partager sur Twitter

      Retrouvez moi sur mon blog et ma chaine Youtube !

        27 janvier 2014 à 18:28:13

        Je met ModBt en écoute, lorsqu'il reçoit une information il l'envoit a mon Grove I2C, lorsque mon Grove I2C reçoit une info il déclenche handler et la traite.

        Mon code original fonctionnait de cette façon (était censé en tout cas) :

        Je met le ModBt en écoute et lorsque je reçoit une info je la traite directement en envoyant des données aux moteurs. C'est sur ce principe que je me basait pour faire fonctionner mes servomoteurs en bluetooth. Mais n'arrivant à rien j'ai essayer de changer de façon de faire.

        • Partager sur Facebook
        • Partager sur Twitter
          27 janvier 2014 à 18:36:55

          Là la facon dont c'est écris ca donne :

          Quand quelque chose arrive sur l'I2C (du GroveI2C) alors je fais péter le handler. Et quand je recoit des données sur le Bluetooth, je les envoie un octet par transmission à mon grove I2C

          • Partager sur Facebook
          • Partager sur Twitter

          Retrouvez moi sur mon blog et ma chaine Youtube !

          [Arduino] Contrôle de moteurs DC par bluetooth

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown