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 !
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 ?
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.
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
× 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.
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !