Sujet : leonardo + librairie Wire et VirtualWire

bonjour,

je suis en train de me créer le montage suivant:
j'envoie les commandes reçus d'un nunchuk Wii via i2c dans une communication sans fil avec un module émetteur/récepteur 433MHz.

pour cela j'utilise la librairie Wire.h pour communiquer en i2c avec le nunchuk, et la librairie VirtualWire pour l'utilisation du module émetteur.
mais j'ai l'impression que ces 2 librairies sont en conflit:
dès que j'upload mon code dans la Leonardo, cette dernière après avoir reçu le code entièrement et rebooté, se bloque et la led Rx reste allumé en permanence.
le programme envoyé ne s'exécute pas du tout.

impossible ensuite de re-uploadé un autre code dans la Leonardo, l'auto-reset de fonctionne plus.
je dois rester appuyer sur le bouton reset de la carte manuellement, commencer à uploadé et au moment ou le logiciel Arduino vérifie quel port utilisé, je relache le bouton reset. A ce moment là, dans la phase de boot (environ 8s) le logiciel peut réécrire le code sur la Leonardo.

auriez vous des idées sur ce problème ?
peut être une autre librairie à utiliser pour mon module emetteur/récepteur 433MHz ?

merci pour votre aide

voici mon code:

#include <Wire.h>
#define adressi2c 0x52 //adresse I2C du nunchuck
#include <VirtualWire.h>


byte data1 ; //octet1 --> joystick X (0a255)
byte data2 ; //octet2 --> joystick Y (0a255)
byte data3 ; //octet3 --> accelero X (poid fort)(0a255) mais incomplet
byte data4 ; //octet4 --> accelero Y (poid fort)(0a255) mais incomplet
byte data5 ; //octet5 --> accelero Z (poid fort)(0a255) mais incomplet
byte data6 ; //octet6 --> bit1=boutonZ      bit2=boutonC      bit3et4=acceleroX(poid faible)     bit5et6=acceleroY(poid faible)    bit7et8=acceleroX(poid faible)

int led = 13;

void setup ()
{
  Serial.begin(9600) ; //initialisation de la ligne serie et du moniteur
  Wire.begin(); //initialisation de la ligne I2C

  Wire.beginTransmission(adressi2c);  //sequence d initialisation du nunchuk
  Wire.write(0xF0);
  Wire.write(0x55);
  Wire.endTransmission();

  Wire.beginTransmission(adressi2c); //sequence d initialisation de la lecture du nunchuck
  Wire.write(0xFB);
  Wire.write(0x00);
  Wire.endTransmission();
 
  vw_set_tx_pin(8);
  vw_setup(7000);
  
  pinMode(led, OUTPUT);
}

void loop ()
{
Wire.requestFrom(adressi2c, 6);   //demande d octet au nunchuk

byte nombre = Wire.available();  //pas obligatoire mais creer une variable 'nombre' pour savoir si il y a bien les octets presents
byte data1 = Wire.read();  //les 6 octets sont demandés successivement
byte data2 = Wire.read();
byte data3 = Wire.read();
byte data4 = Wire.read();
byte data5 = Wire.read();
byte data6 = Wire.read();

Wire.beginTransmission(adressi2c);   //bout de code obligatoire pour faire un handshake et permettre une relecture
Wire.write(0x00);
Wire.endTransmission();
delay(100);
     
  unsigned int boutonZ = (data6 & 1); //decodage du bouton Z
  unsigned int boutonC = ((data6 >> 1) & 1);//decodage du boutonC

  if (boutonZ !=1)
  {
      Serial.println("bouton Z ok");
        boutonZjoy();
  }
}

void boutonZjoy() {
  Wire.requestFrom(adressi2c, 6);
  
  byte nombre = Wire.available();
  byte data1 = Wire.read();
  byte data2 = Wire.read();
  byte data3 = Wire.read();
  byte data4 = Wire.read();
  byte data5 = Wire.read();
  byte data6 = Wire.read();
  
  
  Wire.beginTransmission(adressi2c);
  Wire.write(0x00);
  Wire.endTransmission();
  delay(100);
  
  String nb = String(data1, DEC);
  String trame = "go" + nb + "fin";
  int len = trame.length();
  char mess[len];
  trame.toCharArray(mess, sizeof(mess));
  Serial.println(mess);

  digitalWrite(led, HIGH); 
  vw_send((uint8_t *)mess, strlen(mess)); // On envoie le message
  vw_wait_tx();
  digitalWrite(led, LOW); 
}

Re : leonardo + librairie Wire et VirtualWire

bonjour smile
as tu essayé un code lambda mais qui fonctionne correctement pour écarter un défaut de la carte ?
ensuite un code pour le nunchuck seul... puis un code pour les modules émission réception?

Re : leonardo + librairie Wire et VirtualWire

oui bien sûr smile
j'ai tester seul un code pour le nunchuk, et un autre code pour l'émission réception.
ca fonctionne bien.

par contre comme je le dis, les 2 librairies utilisées en même temps, ca fait planter ma carte sad

Re : leonardo + librairie Wire et VirtualWire

bonsoir,

je viens de refaire un test en retéléchargeant la librairie VirtualWire-1.20, et c'est bon smile plus d'erreur.

en revanche, j'ai maintenant un problème cette fois entre Servo.h et VirtualWire.h

Servo\Servo.cpp.o: In function `__vector_11':
C:\Program Files (x86)\Arduino\libraries\Servo/Servo.cpp:103: multiple definition of `__vector_11'
VirtualWire\VirtualWire.cpp.o:I:\Mes documents\Arduino\libraries\VirtualWire/VirtualWire.cpp:639: first defined here

comment puis-je y remédier ?