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.