Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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);
}
}
