Pb "Liaison série" : ITG-I2C- Leonardo-série-Leonardo-USB-PC

Bonjour à tous

ATTENTION Débutant :~

Après avoir trainé sur les forums français, anglais, espagnols et italiens (merci Google translate), je me décide à poster.

Je souhaite lire, uniquement les valeurs de l’axe Z , d’un accéléro ITG3200 sur un PC via 2 Leonardo comme indiqué ci-dessous

La liaison
ITG3200 vers Leonardo(1) en I2C: c"est tout OK
Un deuxième Leonardo(2) branché sur le PC via USB : OK

Le Pb est la liaison entre les deux Leonardo :
Leo(1) Rx 0 vers D10 de Leo(2)
Leo(1) Tx 1 vers D11 de Leo(2) avec utilisation de SoftwareSerial.

J’ai utilisé successivement les infos de Skywodd
http://arduino.cc/forum/index.php/topic,85310.0.html
La librairie EasyTransfer, qui ne veut pas compiler chez moi.

Etant parfaitement conscient que je n’ai pas compris grand-chose à la transmission série,
Et que mon problème est entre le siège et le clavier.

Merci pour vos conseils

code émetteur

#include <Wire.h>
#include <SoftwareSerial.h>
 
int a = 0; 

void setup() 
{ 
  Serial.begin(9600); 
  Wire.begin(); 
  GyroInit();
 } 


void GyroInit() 
{
  Wire.beginTransmission(0x68); // address of the gyro 
  // reset the gyro 
  Wire.write(0x3E); 
  Wire.write(0x80); 
  Wire.endTransmission(); 
   
  Wire.beginTransmission(0x68); // address of the gyro 
  // low pass filter 10 Hz 
  Wire.write(0x16); 
  Wire.write(0x1D); 
  Wire.endTransmission(); 
   
  Wire.beginTransmission(0x68); // address of the gyro 
  // use internal oscillator 
  Wire.write(0x3E); 
  Wire.write(0x01); 
  Wire.endTransmission(); 
} 

void GyroRead() 
{ 
  Wire.beginTransmission(0x68); // address of the gyro 
  Wire.write(0x1D); // set read pointer 
  Wire.endTransmission(); 
  Wire.requestFrom(0x68, 6);     // read in 3 axis of data, 16 bits each, print to terminal 
  a = Wire.read() << 8; //axe X 
  a += Wire.read(); 
  a = Wire.read() << 8; //axe Y
  a += Wire.read();
  a = Wire.read() << 8; //axe Z
  a += Wire.read();
  Serial.write(a);// & 0xFF); //master
  delay (250);//for debug

void loop() 
{ 
  GyroRead();
 }

Code récepteur

#include <SoftwareSerial.h>

#define txPin 10
#define rxPin 11

SoftwareSerial slave(txPin, rxPin); // RX, TX

int a = 0;              //horiz move-pointer-itg.

void setup() 
{ 
  Serial.begin(9600);
  slave.begin(9600);
  } 

void loop() 
  {
    Serial.print("Data from liaisonitg Z: "); //for debug
      while(slave.available() < 2);
      a = slave.read() ;
    //delay (10); //for debug
    Serial.print(a); 
    Serial.println(); //for debug
    delay (250); //for debug
       }

Bonjour,

Analysons ces deux morceaux de code :

Serial.write(a);
while(slave.available() < 2);
a = slave.read();
Serial.print(a);

Bien, ici "a" est un int, soit deux octets.
Serial.write() envoi un octet (valeur max 255 donc).
Serial.write() lit un octet.
Tu attends deux octet puis tu en lit un octet avec Serial.read().
Tu vois où est le problème ? :wink:

Sinon petite remarque :

a = Wire.read() << 8; //axe Z
a += Wire.read();

Si tu veut "assembler" deux octets pour faire un word (16 bits) préfère les opérations binaire (bitwise) :

a = ((uint16_t) Wire.read() << 8) | Wire.read(); //axe Z

Merci pour la réponse, effectivement "ça devait coincer dans le tuyau!"

J"ai compris l'erreur, c'est corrigé avec les moyens du bord,
seulement je n'arrive plus à retrouver la liaison sur mon moniteur ? c'est perdu où?

J'ai lu sur des post, que l'on rajoutait des caractères pour le début et la fin de trame... (rien à voir?)

Code émetteur

#include <Wire.h>
#include <SoftwareSerial.h>
 
int a = 0; 

void setup() 
{ 
  Serial.begin(9600); 
  Wire.begin(); 
  GyroInit();
 } 


void GyroInit() 
{
  Wire.beginTransmission(0x68); // address of the gyro 
  // reset the gyro 
  Wire.write(0x3E); 
  Wire.write(0x80); 
  Wire.endTransmission(); 
   
  Wire.beginTransmission(0x68); // address of the gyro 
  // low pass filter 10 Hz 
  Wire.write(0x16); 
  Wire.write(0x1D); 
  Wire.endTransmission(); 
   
  Wire.beginTransmission(0x68); // address of the gyro 
  // use internal oscillator 
  Wire.write(0x3E); 
  Wire.write(0x01); 
  Wire.endTransmission(); 
} 

void GyroRead() 
{ 
  Wire.beginTransmission(0x68); // address of the gyro 
  Wire.write(0x1D); // set read pointer 
  Wire.endTransmission(); 
  Wire.requestFrom(0x68, 6);     // read in 3 axis of data, 16 bits each, print to terminal 
  
  a = ((uint16_t) Wire.read() << 8) | Wire.read();//axe X 
  a = ((uint16_t) Wire.read() << 8) | Wire.read(); //axe Y
  a = ((uint16_t) Wire.read() << 8) | Wire.read(); //axe Z
  
  Serial.write(a & 0xFF); // Envoi l'octet de poids faible
  Serial.write((a >> 8) & 0xFF); // puis l'octet de poids fort
  
 // Serial.print(a & 0xFF); //for debug
 // Serial.println((a >> 8) & 0xFF);//for debug
  
  delay (250);//for debug
} 
void loop() 
{ 
  GyroRead();
 }

Code récepteur

#include <SoftwareSerial.h>

#define txPin 10
#define rxPin 11

SoftwareSerial slave(txPin, rxPin); // RX, TX

int a = 0;              //horiz move-pointer-itg.

void setup() 
{ 
  Serial.begin(9600);
  slave.begin(9600);
  } 

void loop() 
  {
    Serial.print("Data from itg Z: "); //for debug
    
     while(slave.available() < 2);
     a = slave.read() + (slave.read() << 8); //axe Z  
     Serial.print(a & 0xFF); 
     Serial.println((a >> 8) & 0xFF);

     delay (250); //for debug
      }

Vérifie que le code de l'émetteur marche seul.

Ensuite côté récepteur affiche en ASCII directement, pas besoin de découpage par octet :

Serial.println(a, DEC);

PS: a = (uint16_t) slave.read() | ((uint16_t) slave.read() << 8);

Alors, alors.....
L’emetteur marche impecc, données de l’accelero sur le moniteur – donc Leo1 et ITG OK

Après avoir tenté différents sketch, exemples en bas de code recepteur,
J’ai toujours [-1], c'est-à-dire, je pense, que je n’ai pas de liaison RxTx !!!!!
Déclaration fausse sous SoftwareSerial avec D10 et D11 ?

J"ai meme recroisé les fils Rx-Tx avec D10-D11, rien....
Je commence à sécher sérieusement

emission

#include <Wire.h>
#include <SoftwareSerial.h>
 
int a = 0; 

void setup() 
{ 
  Serial.begin(9600); 
  Wire.begin(); 
  GyroInit();
 } 


void GyroInit() 
{
  Wire.beginTransmission(0x68); // address of the gyro 
  // reset the gyro 
  Wire.write(0x3E); 
  Wire.write(0x80); 
  Wire.endTransmission(); 
   
  Wire.beginTransmission(0x68); // address of the gyro 
  // low pass filter 10 Hz 
  Wire.write(0x16); 
  Wire.write(0x1D); 
  Wire.endTransmission(); 
   
  Wire.beginTransmission(0x68); // address of the gyro 
  // use internal oscillator 
  Wire.write(0x3E); 
  Wire.write(0x01); 
  Wire.endTransmission(); 
} 

void GyroRead() 
{ 
  Wire.beginTransmission(0x68); // address of the gyro 
  Wire.write(0x1D); // set read pointer 
  Wire.endTransmission(); 
  Wire.requestFrom(0x68, 6);     // read in 3 axis of data, 16 bits each, print to terminal 
  
  a = ((uint16_t) Wire.read() << 8) | Wire.read();  //axe X 
  a = ((uint16_t) Wire.read() << 8) | Wire.read(); //axe Y
  a = ((uint16_t) Wire.read() << 8) | Wire.read(); //axe Z
 
  //Serial.println(a);
  
  Serial.write(a);
  

  delay (250);//for debug
} 
void loop() 
{ 
  GyroRead();
 }

Recepteur

#include <SoftwareSerial.h>

#define txPin 10
#define rxPin 11

SoftwareSerial slave(txPin,rxPin); // RX, TX

int a = 0;              //horiz move-pointer-itg.

void setup() 
{ 
  Serial.begin(9600);
  slave.begin(9600);
     } 

void loop() 
  {
   while(slave.available() > 2);
   a = (uint16_t) slave.read() | ((uint16_t) slave.read() << 8);
   Serial.println(a);    
   
   delay (250); //for debug
     } 
    
    
    
   /* 
 ************************************************************************************  
   while (Serial.available() >= 3) {
    if (Serial.read() == 0xff) { 
    int val = Serial.read();
    int val2 = Serial.read();
    int val3 = Serial.read();
    Serial.flush();
    a=((val3<<16)|(val2<<8)|(val));
    Serial.println(a);
 ******************************************************************************************
    
    while (slave.available() >= 3) {
    if (slave.read() == 0xff) { // le premier octet, équivaut depart
    a = (slave.read() << 8) | (slave.read());
    //Serial.print(0xff);
    Serial.println("Data from itg Z: "); //for debug
    Serial.println(slave.read(), DEC); 
    //Serial.println((a >> 8) & 0xFF);
    
 ******************************************************************************************   
    }
  }
    /* while(slave.available() < 2);
     a = slave.read() + (slave.read() << 8); //axe Z  
     Serial.print(a & 0xFF); 
     Serial.println((a >> 8) & 0xFF);
************************************************************************************
  */

Mise à jour, pour tenter de comprendre mes pb de transmission.

j'écris 82, donc soit un R ou un 82 suivant 1 ou deux octets,
et j'essaie de recupérer quelque chose de l"autre coté.

En fait, vu mon niveau, je ne sais pas si j'ai une erreur d'écriture de code ou une panne sur la transmission
série entre TxRx et D8-D9 avec SoftwareSerial et comment y remedier.

Merci de vos retours.

code émission

int P; 

void setup() {
  Serial.begin(9600);
  P = 82;
}

void loop() {
  Serial.write(P);
  Serial.println();
  Serial.println("essai transmission");
  Serial.println(P);
  delay (250);
  }

code reception

#include <SoftwareSerial.h>
#define txPin 8
#define rxPin 9

SoftwareSerial myPort(txPin, rxPin); // TX, RX 
             

void setup() {
  
   myPort.begin(9600);
   Serial.begin(9600);
}

void loop() {
    
    Serial.println("Data from myPort :");
    delay (100); 
    Serial.println(myPort.read());
    delay (250); 

}

Tu utilise quel version de l'ide arduino ?

Sinon :

while(slave.available() > 2);

C'est pas une boucle d'attente ça :wink:

Ça c'est une boucle d'attente de deux octets :

while(slave.available() < 2);

IDE 1.0.2 mais aussi 1.5.2 les deux me donnent le meme effet.

Merci pour le <, je ne reçoit rien.
par contre si je //while(slave.available() < 2); alors je reçoit mon [-1].

J'ai échangé les cartes ( et les programmes) et tout pareil.......

J'ai un doute sur l'histoire de Serial et Serial1 sur la Leonardo, enfin plus qu'un doute....

gillianlcr:
IDE 1.0.2 mais aussi 1.5.2 les deux me donnent le meme effet.

1.5.2 c'est pour la Due, pour les cartes classique il faut rester en 1.0.3.

gillianlcr:
par contre si je //while(slave.available() < 2); alors je reçoit mon [-1].

-1 ça veut dire que tu n'as rien à lire.

gillianlcr:
J'ai un doute sur l'histoire de Serial et Serial1 sur la Leonardo, enfin plus qu'un doute....

Sur la leonardo :
Serial -> port série usb
Serial1 -> port série hardware
http://arduino.cc/en/Guide/ArduinoLeonardo#toc6

1.0.2 _ça c'est fait

-1 rien à lire, ok (hélas)

Sur la leonardo :
Serial -> port série usb --------------- donc ordi: ok
Serial1 -> port série hardware ---------- c'est ce que j'affecte au pin 10 et 11 avec SoftwareSerial

Questions: à part Serial.print() pour valider le départ des données?
Je dois pouvoir lire les données de la liaison serie en les renvoyant sur le pc via l'usb ?(d"après ton lien et celui-là Akafugu Corporation)
ou je dois basculer à la Mega ?

En complement

Sans titre 1.bmp (1.37 MB)

Bonsoir,

gillianlcr:
Serial1 -> port série hardware ---------- c'est ce que j'affecte au pin 10 et 11 avec SoftwareSerial

erreur de pins:
Serial1 est sur les pins 0 (RX) et 1 (TX), avec la librairie Serial car série hardware (donc avec un tampon disponible qui sécurise la réception de data)

"On the Leonardo, the main Serial class refers to the virtual serial driver on the Leonardo for connection to your computer over USB. It's not connected to the physical pins 0 and 1 as it is on the Uno and earlier boards. To use the hardware serial port (pins 0 and 1, RX and TX), use Serial1. (See the Serial reference pages for more information.)" Serial - Arduino Reference

donc recabler et remplacer "slave.read" par "Serial1.read" etc....

Merci papybricol,

Rx avec Tx et vice versa, Serial1 comme indiqué,
mais toujours des -1 sur le moniteur.

http://vort.org/2012/05/25/trouble-softserial-arduino-leonardo/

Merci à Skywodd et Papybricol puisque après reflexion de tous vos posts, çà marche.

Je m'étais focalisé sur les fils et la reception, alors que la Leonardo 1 envoyait sur Serial à la place de Serial1 (c'est balot).

Reste à mettre en forme pour que ce que je reçois ressemble à l"envoi............

@ Papybricol
Pour info , la déclaration suivante permet d"affecter les pins (8,9 ou 10,11) au Serial1.

Encore Merci et à bientot.

#include <SoftwareSerial.h>

#define rxPin 9
#define txPin 8

SoftwareSerial slave(rxPin,txPin); // RX, TX*/
  
void setup() 
  { 
    Serial.begin(9600);
    slave.begin(9600);
     } 
void loop() 
  {    
    int a = slave.read() + (slave.read() << 8);
    Serial.println(a);
    delay (250); //for debug
     }