Scan Mines

Dependencies:   NeoStrip mbed

Fork of MX28-Scan3D_DB03-IRQ by Denis Brousse

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);
     }
 }