![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Scan Mines
Fork of MX28-Scan3D_DB03-IRQ by
Diff: main.cpp
- Revision:
- 3:a3074e835b35
- Parent:
- 2:43daa01ba06d
- Child:
- 4:ca5bdb807fa1
--- a/main.cpp Tue May 19 21:03:01 2015 +0000 +++ b/main.cpp Sun May 31 20:31:13 2015 +0000 @@ -1,5 +1,7 @@ /************************************ -* DB le 19/05/2015 MX28-Scan3D_DB04-IRQ +* DB le 28/05/2015 MX28-Scan3D_DB05-IRQ +* Mesure de luminosité avec adafruit GA1A12S202 : Ok +* Codage Accelerometre * Programme final conforme au protocole de communication * Reste à faire : - lecture accéléromètre * - vérification de positions atteintes par servomoteurs @@ -32,6 +34,9 @@ #define N2 128 // Nombre de pixels(Led) du panneau Led 2 #define N3 128 // Nombre de pixels(Led) du panneau Led 3 +#define NBRE_ACK 256 // nombre d'acquisition pour la moyenne sur mesure luminosité +#define NBRE_ACQ_ACC 100 // nombre d'acquisition pour la moyenne sur mesure accceleration + DigitalOut led01(LED1); DigitalOut led02(LED2); DigitalOut led03(LED3); @@ -41,7 +46,12 @@ DigitalOut laser(p5); DigitalOut panelLed2(p7); DigitalOut panelLed3(p8); +AnalogIn mesLux(p20); // Entrée pour mesure de luminosité +int valeurLux; +short valeurAccX; +short valeurAccY; +short valeurAccZ; unsigned char numeroOctetRecu=0; char octetRecu; //premier octet reçu char bufferRec[12]; // buffer de réception serialPc @@ -55,6 +65,9 @@ //NeoStrip panelLed2(p7, N2); // creation de l'objet panelLed2 cde par p7, N2 Led //NeoStrip panelLed3(p8, N3); // creation de l'objet panelLed3 cde par p8, N3 Led +I2C i2cLsm303D(p9, p10); // Création objet et affectation SDA1, SCL1 pour l'accéléromètre LSM303D +const int addrLsm303D = 0x3C; // adresse du LSM303D avec SDO/SA0=0 + //------------------------------------------------------------------------------------------------ // Envoi de la trame de pilotage a un servomoteur MX-28 void write (char id, char longueurTrame, char instruction, char param1 = NULL, char param2 = NULL, char param3 = NULL, char param4 = NULL) @@ -156,7 +169,36 @@ } } } - +// Mesure de la luminosité avec moyenne sur NBRE_ACK +int mesureDeLux() { + float sommeMesure=0; + int valL; + for(int i=0; i<NBRE_ACK;i++) { + sommeMesure += mesLux; + } + valL = ((sommeMesure*3.3*1000)/NBRE_ACK); // mesure en mV + return valL; +} +short mesureAcc(char sub) { + char dataLu[2]; + short valAcc=0; + int sommeValAcc=0; + for(int i=0; i<NBRE_ACQ_ACC;i++) { + dataLu[0]=sub; // OUT_X_L_A ou Y ou Z, registre acc X,Y,Z + i2cLsm303D.write(addrLsm303D, dataLu, 1); + i2cLsm303D.read(addrLsm303D, dataLu, 1); + valAcc = dataLu[0]; + dataLu[0]=sub+1; // OUT_X_H_A registre acc X + i2cLsm303D.write(addrLsm303D, dataLu, 1); + i2cLsm303D.read(addrLsm303D, dataLu, 1); + valAcc |= dataLu[0]<<8; + sommeValAcc += valAcc; + } + valAcc = sommeValAcc/NBRE_ACQ_ACC; + int val = int (valAcc*2000)/32768; + valAcc = val; //prendre la partie entière + return valAcc; +} //--------------------------------------------------------------------------------------------- // fonction appelée par interruption si réception sur serialPc @@ -184,7 +226,7 @@ setPosition(ID_SERVO_VERTICAL, valeurPositionVerticale); int anglePositionHorizontale = (e * 100) + (f * 10) + g; int valeurPositionHorizontale = anglePositionHorizontale * 4095 / 360; - wait_us(2000); // Attendre fin de la trame de réponse du Servo Vertical + wait_us(3200); // Attendre fin de la trame de réponse du Servo Vertical setPosition(ID_SERVO_HORIZONTALE, valeurPositionHorizontale); //Pour Debug //serialPc.printf("idServ = %d \tvaleurPosition = %d\n",ID_SERVO_VERTICAL, valeurPositionVerticale); @@ -285,8 +327,12 @@ if ((bufferRec[0] == '6')&&(numeroOctetRecu == 2)) { // si c'est une demande mesure accéléromètre //LECTURE ET ENVOI des mesures d'accélérations // A Faire + serialPc.printf("AccX = %+-0#5d AccY = %+-0#5d AccZ = %+-0#5d\n",valeurAccX,valeurAccY,valeurAccZ); } - + if ((bufferRec[0] == '7')&&(numeroOctetRecu == 2)) { // si c'est une demande mesure luminosité + + serialPc.printf("$OK_lumiere_%0#4d/\n",valeurLux); + } numeroOctetRecu = 0; } else { numeroOctetRecu++; @@ -305,10 +351,23 @@ // Clear buffer memset(&bufferRec[0], 0, sizeof(bufferRec)); + // Config Accelerometre + char dataLu[2]; + dataLu[0]=0x20; // Registre CTRL1 + dataLu[1]=0x67; // Accelero ON et data rate = 100Hz + i2cLsm303D.write(addrLsm303D, dataLu, 2); + dataLu[0]=0x26; // Registre CTRL7 + dataLu[1]=0x82; // Accelero ON et data rate = 100Hz + i2cLsm303D.write(addrLsm303D, dataLu, 2); + while(1) { led01 = 0; wait(0.1); led01 = 1; wait(0.1); + valeurLux = mesureDeLux(); //mesure cyclique de luminosité + valeurAccX = mesureAcc(0x28); + valeurAccY = mesureAcc(0x2A); + valeurAccZ = mesureAcc(0x2C); } }