Besoin d'aide pour mettre en parallèle deux capteurs VCNL4000

Bonjour tout le monde !

Voila j’ai un petit problème, je suis actuellement en Terminale scientifique en option SI (science de l’ingénieur).
Et pour le BAC je dois présenter un projet qui est un bras exoscelette. Le problème se situe dans la programmation des deux capteurs qui activeront ou non le moteur. Les professeurs m’ont conseillés deux capteurs infrarouge VCNL4000.
Pour le moment j’ai essayé de modéliser l’action du moteur avec une led qui s’active quand le moteur devra marcher et s’éteind quand le moteur sera à l’arret ( rien de sorcier me dirais vous).

Voila le code (il marche) :

#include <Wire.h>

#define VCNL4000_ADDRESS 0x13  //I2C Address of the board

int ledPin = 2;

void setup(){
  
  // declare the ledPin as an OUTPUT:
  pinMode(ledPin,OUTPUT);
  
  Serial.begin(9600);  // Serial's used to debug and print data
  Wire.begin();  // initialize I2C stuff
  initVCNL4000(); //initilize and setup the board
  
}

void loop(){
 
   unsigned int proximityValue = readProximity();
   
   if (proximityValue < 100) {
    digitalWrite(ledPin, HIGH);
  }
  else {
    digitalWrite(ledPin, LOW);
  } 
  


  Serial.println(proximityValue);

  delay(100);  //Just here to slow down the printing
  //note that the readings take about 100ms to execute
}


void initVCNL4000(){
  byte temp = readVCNLByte(0x81);

  if (temp != 0x11){  // Product ID Should be 0x11
    Serial.print("initVCNL4000 failed to initialize");
    Serial.println(temp, HEX);
  }else{
    Serial.println("VNCL4000 Online...");
  } 

  /*VNCL400 init params
   Feel free to play with any of these values, but check the datasheet first!*/
  writeVCNLByte(0x84, 0x0F);  // Configures ambient light measures - Single conversion mode, 128 averages
  writeVCNLByte(0x83, 15);  // sets IR current in steps of 10mA 0-200mA --> 200mA
  writeVCNLByte(0x89, 2);  // Proximity IR test signal freq, 0-3 - 781.25 kHz
  writeVCNLByte(0x8A, 0x81);  // proximity modulator timing - 129, recommended by Vishay 
}


unsigned int readProximity(){
  // readProximity() returns a 16-bit value from the VCNL4000's proximity data registers
  byte temp = readVCNLByte(0x80);
  writeVCNLByte(0x80, temp | 0x08);  // command the sensor to perform a proximity measure

  while(!(readVCNLByte(0x80)&0x20));  // Wait for the proximity data ready bit to be set
  unsigned int data = readVCNLByte(0x87) << 8;
  data |= readVCNLByte(0x88);
}
  
  byte readVCNLByte(byte address){
  // readByte(address) reads a single byte of data from address
  Wire.beginTransmission(VCNL4000_ADDRESS);
  Wire.write(address);
  Wire.endTransmission();
  Wire.requestFrom(VCNL4000_ADDRESS, 1);
  while(!Wire.available());
  byte data = Wire.read();

  return data;
}

void writeVCNLByte(byte address, byte data){
  // writeVCNLByte(address, data) writes a single byte of data to address
  Wire.beginTransmission(VCNL4000_ADDRESS);
  Wire.write(address);
  Wire.write(data);
  Wire.endTransmission();
}

Etant novice en programmation et surtout avec Arduino que je n’avais jamais utilisé auparavant, en faisant quelques recherches sur internet j’ai trouvé toute la partie sur le capteur, j’ai seulement eut à programmer la LED :

int ledPin = 2;

void setup(){
  
  // declare the ledPin as an OUTPUT:
  pinMode(ledPin,OUTPUT);
  
}

void loop(){
 
   unsigned int proximityValue = readProximity();
   
   if (proximityValue < 100) {
    digitalWrite(ledPin, HIGH);
  }
  else {
    digitalWrite(ledPin, LOW);
  }

Le problème survient au moment de mettre les deux capteurs en parallèle et opposé si l’un s’active l’autre ne doit pas s’activer, je ne sais pas si je refait exactement la même chose en mettant un VCNL4000a et un VCNL4000b et en dédoublant tout le reste où s’il existe une autre façon de faire.
Le but serai si le capteur A marche la Led 1 s’allume où si le capteur B marche la Led2 s’allume.

Merci d’avance pour vos réponses.

Sans vouloir contredire tes professeurs, le VCNL4000 n'ayant pas de chip select ou de broche permettant de fixer son adresse, ça ne pas pas être facile d'en brancher 2 sur le bus I2C

Quel est le cahier des charges pour les capteurs de proximité ?

Alors si j'ai bien compris ta question les capteurs seront fixé chacun d'un coté de mon poignet si l'un s'active alors un moteur se mettra en marche et si l'autre s'active alors le moteur se mettra en marche dans l'autre sens et bien évidemment les capteurs ne pourront pas s'activer en même temps et nous fonctionnerons en tout ou rien pour le moteur.

et de quelle distance de détection de présence as-tu besoin ?

5cm au maximum.

Et tu as juste besoin de détecter la présence à moins de 5cm ou bien une mesure de distance est nécessaire (même si ce que l’on récupère comme valeur de distance n’est pas très clair dans la datasheet du VCNL4000) ?

J'ai juste besoin de détecter la présence, pour tout ça il y a aucun problème avec un seul capteur tout fonctionne mais je trouve pas comment mettre les deux en parallèles :/

Si tu ne disposes pas d'un Arduino avec 2 bus I2C ce n'est pas possible.

À moins d'employer une lib I2C : http://playground.arduino.cc/Main/SoftwareI2CLibrary qui permet une communication I2C en employant des broches d'E/S numériques

Alternative : des capteurs de distances qui sortent une valeur numérique comme les pololu : http://www.pololu.com/product/1132

J'ai une arduino UNO SMD.

Donc un seul I2C

Alors malheuresement les professeurs on déja acheté les deux capteurs et on ne peut plus les changer. J’ai donc téléchargé ta bibliothèque, j’ai réussi à l’installer mais je n’arrive pas à la faire marcher :confused:
j’ai l’impression que les deux bibliotèques rentre en conflit et au final il me mette l’eurreur :

In file included from VCNL4000.ino:1:
\\SERVEUR01\PERIESM\Travail\Arduino\libraries\SoftI2CMaster/SoftI2CMaster.h: In function 'void i2c_wait_scl_high()':
\\SERVEUR01\PERIESM\Travail\Arduino\libraries\SoftI2CMaster/SoftI2CMaster.h:208: error: 'SCL_PORT' was not declared in this scope
\\SERVEUR01\PERIESM\Travail\Arduino\libraries\SoftI2CMaster/SoftI2CMaster.h:208: error: 'SCL_PIN' was not declared in this scope
\\SERVEUR01\PERIESM\Travail\Arduino\libraries\SoftI2CMaster/SoftI2CMaster.h: In function 'boolean i2c_init()':
\\SERVEUR01\PERIESM\Travail\Arduino\libraries\SoftI2CMaster/SoftI2CMaster.h:262: error: 'SCL_PORT' was not declared in this scope
\\SERVEUR01\PERIESM\Travail\Arduino\libraries\SoftI2CMaster/SoftI2CMaster.h:262: error: 'SCL_PIN' was not declared in this scope
\\SERVEUR01\PERIESM\Travail\Arduino\libraries\SoftI2CMaster/SoftI2CMaster.h:264: error: 'SDA_PORT' was not declared in this scope
\\SERVEUR01\PERIESM\Travail\Arduino\libraries\SoftI2CMaster/SoftI2CMaster.h:264: error: 'SDA_PIN' was not declared in this scope
\\SERVEUR01\PERIESM\Travail\Arduino\libraries\SoftI2CMaster/SoftI2CMaster.h: In function 'bool i2c_start(uint8_t)':
\\SERVEUR01\PERIESM\Travail\Arduino\libraries\SoftI2CMaster/SoftI2CMaster.h:282: error: 'SDA_PORT' was not declared in this scope
\\SERVEUR01\PERIESM\Travail\Arduino\libraries\SoftI2CMaster/SoftI2CMaster.h:282: error: 'SDA_PIN' was not declared in this scope
\\SERVEUR01\PERIESM\Travail\Arduino\libraries\SoftI2CMaster/SoftI2CMaster.h:283: error: 'SCL_PORT' was not declared in this scope
\\SERVEUR01\PERIESM\Travail\Arduino\libraries\SoftI2CMaster/SoftI2CMaster.h:283: error: 'SCL_PIN' was not declared in this scope
\\SERVEUR01\PERIESM\Travail\Arduino\libraries\SoftI2CMaster/SoftI2CMaster.h: In function 'bool i2c_rep_start(uint8_t)':
\\SERVEUR01\PERIESM\Travail\Arduino\libraries\SoftI2CMaster/SoftI2CMaster.h:307: error: 'SCL_PORT' was not declared in this scope
\\SERVEUR01\PERIESM\Travail\Arduino\libraries\SoftI2CMaster/SoftI2CMaster.h:307: error: 'SCL_PIN' was not declared in this scope
\\SERVEUR01\PERIESM\Travail\Arduino\libraries\SoftI2CMaster/SoftI2CMaster.h:308: error: 'SDA_PORT' was not declared in this scope
\\SERVEUR01\PERIESM\Travail\Arduino\libraries\SoftI2CMaster/SoftI2CMaster.h:308: error: 'SDA_PIN' was not declared in this scope
\\SERVEUR01\PERIESM\Travail\Arduino\libraries\SoftI2CMaster/SoftI2CMaster.h: In function 'void i2c_start_wait(uint8_t)':
\\SERVEUR01\PERIESM\Travail\Arduino\libraries\SoftI2CMaster/SoftI2CMaster.h:335: error: 'SDA_PORT' was not declared in this scope
\\SERVEUR01\PERIESM\Travail\Arduino\libraries\SoftI2CMaster/SoftI2CMaster.h:335: error: 'SDA_PIN' was not declared in this scope
\\SERVEUR01\PERIESM\Travail\Arduino\libraries\SoftI2CMaster/SoftI2CMaster.h:336: error: 'SCL_PORT' was not declared in this scope
\\SERVEUR01\PERIESM\Travail\Arduino\libraries\SoftI2CMaster/SoftI2CMaster.h:336: error: 'SCL_PIN' was not declared in this scope
\\SERVEUR01\PERIESM\Travail\Arduino\libraries\SoftI2CMaster/SoftI2CMaster.h: In function 'void i2c_stop()':
\\SERVEUR01\PERIESM\Travail\Arduino\libraries\SoftI2CMaster/SoftI2CMaster.h:355: error: 'SCL_PORT' was not declared in this scope
\\SERVEUR01\PERIESM\Travail\Arduino\libraries\SoftI2CMaster/SoftI2CMaster.h:355: error: 'SCL_PIN' was not declared in this scope
\\SERVEUR01\PERIESM\Travail\Arduino\libraries\SoftI2CMaster/SoftI2CMaster.h:356: error: 'SDA_PORT' was not declared in this scope
\\SERVEUR01\PERIESM\Travail\Arduino\libraries\SoftI2CMaster/SoftI2CMaster.h:356: error: 'SDA_PIN' was not declared in this scope
\\SERVEUR01\PERIESM\Travail\Arduino\libraries\SoftI2CMaster/SoftI2CMaster.h: In function 'bool i2c_write(uint8_t)':
\\SERVEUR01\PERIESM\Travail\Arduino\libraries\SoftI2CMaster/SoftI2CMaster.h:431: error: 'SCL_PORT' was not declared in this scope
\\SERVEUR01\PERIESM\Travail\Arduino\libraries\SoftI2CMaster/SoftI2CMaster.h:431: error: 'SCL_PIN' was not declared in this scope
\\SERVEUR01\PERIESM\Travail\Arduino\libraries\SoftI2CMaster/SoftI2CMaster.h:432: error: 'SDA_PORT' was not declared in this scope
\\SERVEUR01\PERIESM\Travail\Arduino\libraries\SoftI2CMaster/SoftI2CMaster.h:432: error: 'SDA_PIN' was not declared in this scope
\\SERVEUR01\PERIESM\Travail\Arduino\libraries\SoftI2CMaster/SoftI2CMaster.h: In function 'uint8_t i2c_read(bool)':
\\SERVEUR01\PERIESM\Travail\Arduino\libraries\SoftI2CMaster/SoftI2CMaster.h:500: error: 'SCL_PORT' was not declared in this scope
\\SERVEUR01\PERIESM\Travail\Arduino\libraries\SoftI2CMaster/SoftI2CMaster.h:500: error: 'SCL_PIN' was not declared in this scope
\\SERVEUR01\PERIESM\Travail\Arduino\libraries\SoftI2CMaster/SoftI2CMaster.h:501: error: 'SDA_PORT' was not declared in this scope
\\SERVEUR01\PERIESM\Travail\Arduino\libraries\SoftI2CMaster/SoftI2CMaster.h:501: error: 'SDA_PIN' was not declared in this scope

Tu n’as pas lu la doc de la librairie

Mickael82: Alors malheuresement les professeurs on déja acheté les deux capteurs et on ne peut plus les changer.

Et ils justifient comment cette tres mauvaise preconisation ? Meme si la recherche vient de toi, il etait simple de voir qu'il y avait un probleme de mise en multiplicité, et de dire stop "pas bon ! " ils envisagent maintenant comment de t'aider pour ne pas te penaliser ?

Il y a (peut etre :grin:) des solutions eventuelles pour rattraper l'erreur de choix, mais ça devient de l'usine à gaz.

Integre déjà le code pour un seul capteur, expose ici ce que tu aura reussi , apres ...

C'est un prof de BTS qui m'aide car un est prof de méca et l'autre pense que le minitel c'est l'avenir..

Et tous les groupes ont à peut près le même problème :/

Donc dans ce lien : http://playground.arduino.cc/Main/SoftwareI2CLibrary

section Importing the library

Tu trouveras la réponse à ton problème de compilation

Si j'ai bien compris le problème vient de la manipulation des commandes du port ?

Ton problème vient de l'absence des #define requis avant l'inclusion de la lib

Ah ok j'ai mis l'include au dessus des define ça peut etre ça le problème ?

Oui