IMU 9D0F

Bonjour,

Je cherche a faire fonctionner un capteur 9 axes (RAZOR 9D0F) qui contient un accéléromètre, un gyroscope et un magnetomètre.

Il fonctionne directement en liaison série USB sur le pc, dans son moniteur je voit bien toutes les données, mais j'aimerais les envoyer vers un pc via bluetooth.

J'ai donc configurer une liaison BL avec un HC05 fonctionelle, et quand le module BL reçoit "c" il doit envoyer les informations du capteur 9 axes.

J'ai donc définit 2 liaisons série dans mon code arduino, une pour le BL l'autre pour le capteur et je lui ai dit, quand tu reçoit "c" sur le BL, tu envois sur cette même liaison, la donnée que tu va lire que la liaison du capteur.

Or, je reçoit toujours -1 comme retour si je demande "c" au bluetooth.

Je pense que cela est du à un format de donnée qui ne lui correspond pas, et il doit renvoyer cette valeur par défaut ?

Je n'arrive pas à trouver d'informations concernant ce problème sur internet. Des idées ?

Merci.

Bonne soirée
Flooow.

Vous avez un bug ligne 42 et votre fil rouge n'est pas bien connecté... enfin peut-être....

Sérieusement, vous nous dites "j'ai un bug dans mon code, pouvez vous devinez où?"... et vous croyez qu'on va pouvoir vous aider?... postez le code (-1 sur un Serial.read() ça veut dire pas de données dispo)

Je ne sais pas s le problème est dans le code, mais niveau montage c'est basique quoi, le TX de mon IMU sur le port 9 de l'arduino et puis l'alimentation, idem pour le BL.

#include <SoftwareSerial.h>

SoftwareSerial bluetooth(10, 11);
SoftwareSerial IMU(8, 9);

char bluetoothData = ' ';

void setup() 
{
    pinMode(4, OUTPUT);
    IMU.begin(57600);
    bluetooth.begin(19200);
    Serial.begin(9600);
}

void loop() 
{
 
  if (bluetooth.available())
  {
      bluetoothData = bluetooth.read();
       
      /*Conditions on the data we receive*/
      switch(bluetoothData)
      {
        case 'a':
          digitalWrite(4, HIGH);
          bluetooth.println("a-recu");
          break;

        case 'b':
          digitalWrite(4, LOW);
          bluetooth.println("b-recu");
          break;

        case 'c':
          bluetooth.println(IMU.read());
          break;

        default:
          digitalWrite(4, LOW);
          break;
      } 

       delay(100);
    }
}

Merci du retour :wink:

Pourquoi quand vous recevez une commande sur Bluetooth une donnée serait aussi dispo à lire sur l'IMU?

De plus software serial est un peu touchy quand vous en avez 2 en même temps. Cf la doc et l'usage de listen()

Il semble que vous n'utilisez pas Serial, qui est le port série matériel - ce serait bien de mettre votre Imu dessus par exemple et utiliser software serial pour le BT - ce serait plus robuste

Faut repenser entièrement la lecture du contenu de l'IMU

Une image du montage ?

http://hpics.li/621e910

Voilà le montage fait rapidement.

Le code j'ai essayé, même en supprimant le BL, et je reçois -1 aussi.

J'ai aussi essayé avec SerialEvent et c'est le même problème (peut être qu'il y a vraiment aucune données, mais si je branche le cable USB sur le capteur avec RX et TX et sur le pc directement, dans le moniteur j'ai les bonnes données ...)

si vous virez le BT et vous faites cela

Arduino Pin digital 8 ---> IMU Tx
Arduino Pin digital 9 ---> IMU Rx
et bien sûr alimentation correcte et GND partagés entre l'arduino et le IMU

->en mettant la console de l'IDE à 115200 bauds, ça vous dit quoi?

#include <SoftwareSerial.h>

// Arduino Pin 8 ---> IMU Tx
// Arduino Pin 9 ---> IMU Rx
SoftwareSerial IMU(8, 9);

void setup()
{
  Serial.begin(115200);
  IMU.begin(57600);
}

void loop()
{
  if (IMU.available())
    Serial.print((char) IMU.read());
}

Voilà le montage fait rapidement.

Ou ?

-Standby:
Ou ?

il a mis un lien

@J-M-L: Ton code fonctionne, enfin j'ai une suite de chiffre et de valeur sur une ligne, peu compréhensible, mais j'ai une donnée qui arrive déjà. (Normalement l'IMU envoi la donnée x,y,x sur la liaison série)

Au fait on dirait que c'est un device 3.3V - c'est ça que vous avez?

Flooow:
@J-M-L: Ton code fonctionne, enfin j'ai une suite de chiffre et de valeur sur une ligne, peu compréhensible, mais j'ai une donnée qui arrive déjà. (Normalement l'IMU envoi la donnée x,y,x sur la liaison série)

vous pouvez copier coller ce que ça dit ?? (vous avez bien mis à 115200?)

-1.98-110.237.59-1.98-110.227.60-1.98-110.217.61-2.00-110.217.61-2.00-110.217.62-2.00-110.207.62-2.00-110.207.64-2.00-110.207.58-2.08-110.207.57-2.06-110.207.58-2.06-110.217.59-2.04-110.227.59-2.02-110.237.58-2.04-110.237.58-2.05-110.247.58-2.06-110.237.58-2.06-110.237.57-2.07-110.237.58-2.07-110.227.57-2.05-110.227.56-2.05-110.237.56-2.05-110.227.58-2.05-110.217.58-2.05-110.227.57-2.03-110.227.56-2.03-110.217.56-2.03-110.217.55-2.04-110.227.55-2.04-110.217.55-2.02-110.227.54-1.99-110.227.55-2.01-110.207.56-2.01-110.207.56-1.98-110.207.57-1.97-110.197.57-1.96-110.187.58-1.96-110.187.59-1.96-110.187.60-1.95-110.177.59-1.94-110.177.60-1.93-110.177.62-1.93-110.177.61-1.94-110.187.62-1.94-110.187.61-

Indéfinement des valeurs comme cela, pas exploitable sous ce format mais les valeurs ont l'air bonne.

OK donc ça fonctionne...

ensuite faut lire la doc pour voir ce que ça vous envoie...

j'ai regardé un peu il semble que vous puissiez envoyer des commandes par la liaison série pour obtenir un mode où il va vous envoyer des lignes sous la forme

[color=red]$[/color]accelx,accely,accelz,gyrox,gyroy,gyroz,magx,magy,magz#[color=red]\n\r[/color]

donc assez faciles à parser

--> mettre la bonne commande dans le setup()

Parfait, pour traiter les données et les parser, je ne le fait pas dans la carte arduino, je met en place une interface WPF (Visual Studio)

L'arduino va envoyer la chaine complète et le traitement se fera de l'autre côté.

Je vais donc essayer de remettre le BL, voir si cela fonctionne maintenant.

Merci.

#include <SoftwareSerial.h>

SoftwareSerial Heol_bluetooth(10, 11);
SoftwareSerial IMU(8, 9);

char IMUData = ' ';

void setup()
{
  Serial.begin(115200);
}

void loop()
{
    /* Begin the IMU Serial and if data is available, capture this */
    IMU.begin(57600);
    
    if (IMU.available())
    {
      IMUData = (char)IMU.read();
      IMU.end();
    }

    /* Now begin the Bluetooth Serial and send the IMUData is data is available on BL Flow */
    Heol_bluetooth.begin(115200);
    
    if (Heol_bluetooth.available())
    {
      Heol_bluetooth.print(IMUData);
      Heol_bluetooth.end();
    }
}

J'ai donc réessayer le BL et comme je m'y attendais, cela ne fonctionne pas.
Pourtant j'ai essayer ce code, qui est censé arrêté la liaison une fois que la donnée IMU est capturé avant de commencer celle du BL, mais rien n'y fait.

J'ai donc essayer de prendre la liaison série direct de l'arduino avec le code suivant:

#include <SoftwareSerial.h>

SoftwareSerial Heol_bluetooth(10, 11);
SoftwareSerial IMU(8, 9);

char IMUData = ' ';

void setup()
{
  Serial.begin(115200);
  Heol_bluetooth.begin(115200);
}

void loop()
{
    /* Begin the IMU Serial and if data is available, capture this */    
    if (Serial.available())
      IMUData = (char)Serial.read();

    /* Now begin the Bluetooth Serial and send the IMUData is data is available on BL Flow */    
    if (Heol_bluetooth.available())
      Heol_bluetooth.print(IMUData);
}

Je reçoit bien une donnée sur le BL, mais complètement inexploitable:

Une idée ?

Merci

cf post #3 --> software serial est très touchy quand vous en avez 2 en même temps

il faut bien séparer les communications, utiliser listen() etc. cf la doc

à mon sens il vous faut mettre l'IMU sur du software Serial et le BT sur le hardware serial, une fois déconnecté le câble USB

#include <SoftwareSerial.h>

SoftwareSerial IMU(8,9);

char bluetoothData = ' ';
char imuData = ' ';

void setup()
{
  Serial.begin(115200);
  IMU.begin(57600);
}

void loop()
{
  IMU.listen();

  if(IMU.available()) 
    imuData = (char)IMU.read();

  if(Serial.available()) 
    bluetoothData = (char)Serial.read();

  if(bluetoothData == 'a')
  {
    Serial.print(imuData);
  }
  
}

Ce code est en parti fonctionnel, à savoir si le BL reçoit a, il envoi les données de l'IMU, mais juste une question:

Pourquoi quand je rajoute dans le if bluetoothData == 'a' un bluetoothData = ' ' à la fin, pour qu'il ne me l'envoi qu'une fois le temps qu'il n'y a pas de relecture, cela ne fonctionne plus ?

Je reçoit un vide (c'est à dire qu'il rentre dans le if mais ne m'envoi un blanc), très étrange ...

J'ai donc corrigé 3/4 du problème.

Un dernier soucis, lorsque je suis connecté à L'IMU en direct, le moniteur m'affiche une donnée par ligne, alors que lorsque je les lit sur le BL, j'ai 1 donnée, plein de ligne blanche, 1 donnée etc ...

Savez vous d'ou peut venir ce soucis ?

Merci. Bon Dimanche

si vous faites cela

#include <SoftwareSerial.h>
SoftwareSerial IMU(8, 9);

void setup()
{
  Serial.begin(115200); // le BT
  IMU.begin(57600); // l'IMU
}

void loop()
{
  int imuData;

  if (IMU.available()) {
    imuData = IMU.read();
    if (imuData != -1) Serial.print((char)imuData);
  }
}

ça donne quoi? (avec le BT connecté sur les pins 0 et 1 du port série matériel)