Scan Mines

Dependencies:   NeoStrip mbed

Fork of MX28-Scan3D_DB03-IRQ by Denis Brousse

Committer:
wumzi
Date:
Mon Jun 01 16:08:53 2015 +0000
Revision:
4:ca5bdb807fa1
Parent:
3:a3074e835b35
Child:
5:a81d551cfffa
Change id moteurs;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dbrousse 0:129e8567ddbd 1 /************************************
dbrousse 3:a3074e835b35 2 * DB le 28/05/2015 MX28-Scan3D_DB05-IRQ
dbrousse 3:a3074e835b35 3 * Mesure de luminosité avec adafruit GA1A12S202 : Ok
dbrousse 3:a3074e835b35 4 * Codage Accelerometre
dbrousse 2:43daa01ba06d 5 * Programme final conforme au protocole de communication
dbrousse 2:43daa01ba06d 6 * Reste à faire : - lecture accéléromètre
dbrousse 2:43daa01ba06d 7 * - vérification de positions atteintes par servomoteurs
dbrousse 2:43daa01ba06d 8 *
dbrousse 2:43daa01ba06d 9 * Pilotage MX-106 (SERVO_VERTICAL) et MX-28 (SERVO_HORIZONTALE)
dbrousse 2:43daa01ba06d 10 * avec liaison série : Trame Scan3D
dbrousse 0:129e8567ddbd 11 * &abcdefghij/ début $, fin /, longueur variable
dbrousse 0:129e8567ddbd 12 * Réception Série par IRQ
dbrousse 0:129e8567ddbd 13 * Piloter les positions des 2 servomoteurs V et H
dbrousse 0:129e8567ddbd 14 * Débit = 57142bit/s
dbrousse 0:129e8567ddbd 15 *
dbrousse 2:43daa01ba06d 16 * Matrice Led Neopixels
dbrousse 0:129e8567ddbd 17 * Une seule instance possible avec la classe NeoStrip :
dbrousse 0:129e8567ddbd 18 * Problème, pour nous il faut 3 voies : panelLed1, panelLed2 et panelLed3 !
dbrousse 0:129e8567ddbd 19 * les 2 autres voies "faite à la main" avec les fonctions :
dbrousse 0:129e8567ddbd 20 * - void writeBitCode1(numMatriceLed) et void writeBitCode0(numMatriceLed)
dbrousse 0:129e8567ddbd 21 * - void writeMatriceLed(int numMatriceLed, int N, int valRouge, int valVerte, int valBleu)
dbrousse 0:129e8567ddbd 22 *
dbrousse 0:129e8567ddbd 23 * Cible : Carte mbed_S3DHQ_2015
dbrousse 0:129e8567ddbd 24 *************************************/
dbrousse 0:129e8567ddbd 25
dbrousse 0:129e8567ddbd 26 #include "mbed.h"
dbrousse 0:129e8567ddbd 27 #include "MX-28_DefConstantes.h"
dbrousse 0:129e8567ddbd 28 #include "NeoStrip.h"
dbrousse 0:129e8567ddbd 29
wumzi 4:ca5bdb807fa1 30 #define ID_SERVO_VERTICAL 0x0A // MX-106R
wumzi 4:ca5bdb807fa1 31 #define ID_SERVO_HORIZONTALE 0x01 // MX-28R
dbrousse 0:129e8567ddbd 32
dbrousse 0:129e8567ddbd 33 #define N1 64 // Nombre de pixels(Led) du panneau Led 1
dbrousse 2:43daa01ba06d 34 #define N2 128 // Nombre de pixels(Led) du panneau Led 2
dbrousse 2:43daa01ba06d 35 #define N3 128 // Nombre de pixels(Led) du panneau Led 3
dbrousse 0:129e8567ddbd 36
dbrousse 3:a3074e835b35 37 #define NBRE_ACK 256 // nombre d'acquisition pour la moyenne sur mesure luminosité
dbrousse 3:a3074e835b35 38 #define NBRE_ACQ_ACC 100 // nombre d'acquisition pour la moyenne sur mesure accceleration
dbrousse 3:a3074e835b35 39
dbrousse 0:129e8567ddbd 40 DigitalOut led01(LED1);
dbrousse 0:129e8567ddbd 41 DigitalOut led02(LED2);
dbrousse 0:129e8567ddbd 42 DigitalOut led03(LED3);
dbrousse 0:129e8567ddbd 43 DigitalOut led04(LED4);
dbrousse 0:129e8567ddbd 44
dbrousse 0:129e8567ddbd 45 DigitalOut dir(p17);
dbrousse 0:129e8567ddbd 46 DigitalOut laser(p5);
dbrousse 0:129e8567ddbd 47 DigitalOut panelLed2(p7);
dbrousse 0:129e8567ddbd 48 DigitalOut panelLed3(p8);
dbrousse 3:a3074e835b35 49 AnalogIn mesLux(p20); // Entrée pour mesure de luminosité
dbrousse 0:129e8567ddbd 50
dbrousse 3:a3074e835b35 51 int valeurLux;
dbrousse 3:a3074e835b35 52 short valeurAccX;
dbrousse 3:a3074e835b35 53 short valeurAccY;
dbrousse 3:a3074e835b35 54 short valeurAccZ;
dbrousse 0:129e8567ddbd 55 unsigned char numeroOctetRecu=0;
dbrousse 0:129e8567ddbd 56 char octetRecu; //premier octet reçu
dbrousse 0:129e8567ddbd 57 char bufferRec[12]; // buffer de réception serialPc
dbrousse 0:129e8567ddbd 58
dbrousse 0:129e8567ddbd 59 Serial serialPc(USBTX, USBRX); // tx, rx, écarté car driver incompatible avec LabVIEW
dbrousse 0:129e8567ddbd 60 //Serial serialPc(p28, p27); // tx, rx (c'est l'uart2 du LPC1768)
dbrousse 1:538b13cb6699 61 Serial uartMX28(p13, p14); // tx, rx pour MX28 (uart1 du LPC1768)
dbrousse 1:538b13cb6699 62 //Serial uartMX28(p28, p27); // tx, rx pour MX28 (uart1 du LPC1768)
dbrousse 0:129e8567ddbd 63
dbrousse 0:129e8567ddbd 64 NeoStrip panelLed1(p6, N1); // creation de l'objet panelLed1 cde par p6, N1 Led
dbrousse 0:129e8567ddbd 65 //NeoStrip panelLed2(p7, N2); // creation de l'objet panelLed2 cde par p7, N2 Led
dbrousse 0:129e8567ddbd 66 //NeoStrip panelLed3(p8, N3); // creation de l'objet panelLed3 cde par p8, N3 Led
dbrousse 0:129e8567ddbd 67
dbrousse 3:a3074e835b35 68 I2C i2cLsm303D(p9, p10); // Création objet et affectation SDA1, SCL1 pour l'accéléromètre LSM303D
dbrousse 3:a3074e835b35 69 const int addrLsm303D = 0x3C; // adresse du LSM303D avec SDO/SA0=0
dbrousse 3:a3074e835b35 70
dbrousse 0:129e8567ddbd 71 //------------------------------------------------------------------------------------------------
dbrousse 0:129e8567ddbd 72 // Envoi de la trame de pilotage a un servomoteur MX-28
dbrousse 0:129e8567ddbd 73 void write (char id, char longueurTrame, char instruction, char param1 = NULL, char param2 = NULL, char param3 = NULL, char param4 = NULL)
dbrousse 0:129e8567ddbd 74 {
dbrousse 0:129e8567ddbd 75 char Cks;
dbrousse 0:129e8567ddbd 76
dbrousse 0:129e8567ddbd 77 Cks = ~( id + longueurTrame + instruction + param1 + param2 + param3 + param4); //calcul du checkSum
dbrousse 0:129e8567ddbd 78 //serialPc.printf("Cks : %d\n", Cks);
dbrousse 0:129e8567ddbd 79 dir = 1;
dbrousse 0:129e8567ddbd 80 uartMX28.putc(0xFF);
dbrousse 0:129e8567ddbd 81 uartMX28.putc(0xFF);
dbrousse 0:129e8567ddbd 82 uartMX28.putc(id);
dbrousse 0:129e8567ddbd 83 uartMX28.putc(longueurTrame);
dbrousse 0:129e8567ddbd 84 uartMX28.putc(instruction);
dbrousse 0:129e8567ddbd 85 if (longueurTrame >= 3) {
dbrousse 0:129e8567ddbd 86 uartMX28.putc(param1);
dbrousse 0:129e8567ddbd 87 }
dbrousse 0:129e8567ddbd 88 if (longueurTrame >= 4) {
dbrousse 0:129e8567ddbd 89 uartMX28.putc(param2);
dbrousse 0:129e8567ddbd 90 }
dbrousse 0:129e8567ddbd 91 if (longueurTrame >= 5) {
dbrousse 0:129e8567ddbd 92 uartMX28.putc(param3);
dbrousse 0:129e8567ddbd 93 }
dbrousse 0:129e8567ddbd 94 if (longueurTrame >= 6) {
dbrousse 0:129e8567ddbd 95 uartMX28.putc(param4);
dbrousse 0:129e8567ddbd 96 }
dbrousse 0:129e8567ddbd 97 uartMX28.putc(Cks);
dbrousse 0:129e8567ddbd 98
dbrousse 0:129e8567ddbd 99 wait_us(MX28_WAIT_AFTER_WRITE); // Attendre l'envoie complet de la trame.
dbrousse 0:129e8567ddbd 100 dir = 0;
dbrousse 0:129e8567ddbd 101 }
dbrousse 0:129e8567ddbd 102
dbrousse 0:129e8567ddbd 103 // Set goal position of engine
dbrousse 0:129e8567ddbd 104 void setPosition(char id, int goal)
dbrousse 0:129e8567ddbd 105 {
dbrousse 0:129e8567ddbd 106 char goal_h = goal >> 8;
dbrousse 0:129e8567ddbd 107 char goal_l = goal;
dbrousse 0:129e8567ddbd 108 //serialPc.printf("Goal set : %d %d %d\n", goal, goal_h, goal_l);
dbrousse 0:129e8567ddbd 109 write(id, 5, MX28_WRITE_DATA, MX28_GOAL_POSITION_L, goal_l, goal_h);
dbrousse 0:129e8567ddbd 110 }
dbrousse 0:129e8567ddbd 111
dbrousse 0:129e8567ddbd 112 //---------------------------------------------------------------------------------------------
dbrousse 2:43daa01ba06d 113 // Lire position d'un servomoteur MX-28 ou MX-106
dbrousse 2:43daa01ba06d 114 int lirePositionServo(char idServo) {
dbrousse 2:43daa01ba06d 115 //Vider le buffer de réception uartMX28
dbrousse 2:43daa01ba06d 116 while(uartMX28.readable()) {
dbrousse 2:43daa01ba06d 117 uartMX28.getc();
dbrousse 2:43daa01ba06d 118 }
dbrousse 2:43daa01ba06d 119 write(idServo, 4, MX28_READ_DATA, MX28_PRESENT_POSITION_L,2);
dbrousse 2:43daa01ba06d 120 char octetRecuMX[8];
dbrousse 2:43daa01ba06d 121 char i=0;
dbrousse 2:43daa01ba06d 122 int tempoReception=0;
dbrousse 2:43daa01ba06d 123 while((tempoReception < 1000000)&&(i<8)) {
dbrousse 2:43daa01ba06d 124 if(uartMX28.readable()) {
dbrousse 2:43daa01ba06d 125 octetRecuMX[i] = uartMX28.getc();
dbrousse 2:43daa01ba06d 126 i++;
dbrousse 2:43daa01ba06d 127 }
dbrousse 2:43daa01ba06d 128 tempoReception++;
dbrousse 2:43daa01ba06d 129 }
dbrousse 2:43daa01ba06d 130 int valeurLue = octetRecuMX[6] * 256 + octetRecuMX[5];
dbrousse 2:43daa01ba06d 131 return valeurLue;
dbrousse 2:43daa01ba06d 132 }
dbrousse 2:43daa01ba06d 133
dbrousse 2:43daa01ba06d 134 //---------------------------------------------------------------------------------------------
dbrousse 0:129e8567ddbd 135 // fonction écriture Bit code 1 et 0 pour matrice Led Neopixels
dbrousse 0:129e8567ddbd 136 void writeBitCode1(int numMatriceLed)
dbrousse 0:129e8567ddbd 137 {
dbrousse 0:129e8567ddbd 138 if(numMatriceLed==2){panelLed2=1;}
dbrousse 0:129e8567ddbd 139 else{panelLed3=1;}
dbrousse 0:129e8567ddbd 140 for(int i=0;i<37;i++) {int x = i*i*i; x=x*x;} // pour T1H=700ns
dbrousse 0:129e8567ddbd 141 if(numMatriceLed==2){panelLed2=0;}
dbrousse 0:129e8567ddbd 142 else{panelLed3=0;}
dbrousse 0:129e8567ddbd 143 for(int i=0;i<16;i++) {int x = i*i*i; x=x*x;} // pour T1L= 450ns + 150ns pour exe fonction
dbrousse 0:129e8567ddbd 144 }
dbrousse 0:129e8567ddbd 145 void writeBitCode0(int numMatriceLed)
dbrousse 0:129e8567ddbd 146 {
dbrousse 0:129e8567ddbd 147 if(numMatriceLed==2){panelLed2=1;}
dbrousse 0:129e8567ddbd 148 else{panelLed3=1;}
dbrousse 0:129e8567ddbd 149 for(int i=0;i<15;i++) {int x = i*i*i; x=x*x;} // pour T0H=350ns
dbrousse 0:129e8567ddbd 150 if(numMatriceLed==2){panelLed2=0;}
dbrousse 0:129e8567ddbd 151 else{panelLed3=0;}
dbrousse 0:129e8567ddbd 152 for(int i=0;i<32;i++) {int x = i*i*i; x=x*x;} // pour T0L=650ns+150ns pour exe fonction
dbrousse 0:129e8567ddbd 153 }
dbrousse 0:129e8567ddbd 154 //---------------------------------------------------------------------------------------------
dbrousse 0:129e8567ddbd 155 // fonction écriture matrice Led Neopixels
dbrousse 0:129e8567ddbd 156 void writeMatriceLed(int numMatriceLed, int N, int valRouge, int valVerte, int valBleu)
dbrousse 0:129e8567ddbd 157 {
dbrousse 0:129e8567ddbd 158 int valeurCouleurVRB = valVerte*65536+valRouge*256+valBleu;
dbrousse 0:129e8567ddbd 159 for(int i=0;i<N;i++) {
dbrousse 0:129e8567ddbd 160 int mask_1sur24Bits = 0x800000;
dbrousse 0:129e8567ddbd 161 for(int j=0;j<24;j++) {
dbrousse 0:129e8567ddbd 162 if(valeurCouleurVRB & mask_1sur24Bits) {
dbrousse 0:129e8567ddbd 163 writeBitCode1(numMatriceLed);
dbrousse 0:129e8567ddbd 164 }
dbrousse 0:129e8567ddbd 165 else {
dbrousse 0:129e8567ddbd 166 writeBitCode0(numMatriceLed);
dbrousse 0:129e8567ddbd 167 }
dbrousse 0:129e8567ddbd 168 mask_1sur24Bits = mask_1sur24Bits >> 1;
dbrousse 0:129e8567ddbd 169 }
dbrousse 0:129e8567ddbd 170 }
dbrousse 0:129e8567ddbd 171 }
dbrousse 3:a3074e835b35 172 // Mesure de la luminosité avec moyenne sur NBRE_ACK
dbrousse 3:a3074e835b35 173 int mesureDeLux() {
dbrousse 3:a3074e835b35 174 float sommeMesure=0;
dbrousse 3:a3074e835b35 175 int valL;
dbrousse 3:a3074e835b35 176 for(int i=0; i<NBRE_ACK;i++) {
dbrousse 3:a3074e835b35 177 sommeMesure += mesLux;
dbrousse 3:a3074e835b35 178 }
dbrousse 3:a3074e835b35 179 valL = ((sommeMesure*3.3*1000)/NBRE_ACK); // mesure en mV
dbrousse 3:a3074e835b35 180 return valL;
dbrousse 3:a3074e835b35 181 }
dbrousse 3:a3074e835b35 182 short mesureAcc(char sub) {
dbrousse 3:a3074e835b35 183 char dataLu[2];
dbrousse 3:a3074e835b35 184 short valAcc=0;
dbrousse 3:a3074e835b35 185 int sommeValAcc=0;
dbrousse 3:a3074e835b35 186 for(int i=0; i<NBRE_ACQ_ACC;i++) {
dbrousse 3:a3074e835b35 187 dataLu[0]=sub; // OUT_X_L_A ou Y ou Z, registre acc X,Y,Z
dbrousse 3:a3074e835b35 188 i2cLsm303D.write(addrLsm303D, dataLu, 1);
dbrousse 3:a3074e835b35 189 i2cLsm303D.read(addrLsm303D, dataLu, 1);
dbrousse 3:a3074e835b35 190 valAcc = dataLu[0];
dbrousse 3:a3074e835b35 191 dataLu[0]=sub+1; // OUT_X_H_A registre acc X
dbrousse 3:a3074e835b35 192 i2cLsm303D.write(addrLsm303D, dataLu, 1);
dbrousse 3:a3074e835b35 193 i2cLsm303D.read(addrLsm303D, dataLu, 1);
dbrousse 3:a3074e835b35 194 valAcc |= dataLu[0]<<8;
dbrousse 3:a3074e835b35 195 sommeValAcc += valAcc;
dbrousse 3:a3074e835b35 196 }
dbrousse 3:a3074e835b35 197 valAcc = sommeValAcc/NBRE_ACQ_ACC;
dbrousse 3:a3074e835b35 198 int val = int (valAcc*2000)/32768;
dbrousse 3:a3074e835b35 199 valAcc = val; //prendre la partie entière
dbrousse 3:a3074e835b35 200 return valAcc;
dbrousse 3:a3074e835b35 201 }
dbrousse 0:129e8567ddbd 202
dbrousse 0:129e8567ddbd 203 //---------------------------------------------------------------------------------------------
dbrousse 0:129e8567ddbd 204 // fonction appelée par interruption si réception sur serialPc
dbrousse 0:129e8567ddbd 205 void receptionPc()
dbrousse 0:129e8567ddbd 206 {
dbrousse 0:129e8567ddbd 207 led04 =1;
dbrousse 0:129e8567ddbd 208 octetRecu = serialPc.getc();
dbrousse 0:129e8567ddbd 209 if(octetRecu == '$') {
dbrousse 0:129e8567ddbd 210 numeroOctetRecu = 0;
dbrousse 0:129e8567ddbd 211 memset(&bufferRec[0], 0, sizeof(bufferRec));
dbrousse 0:129e8567ddbd 212 } else {
dbrousse 0:129e8567ddbd 213 bufferRec[numeroOctetRecu-1] = octetRecu;
dbrousse 0:129e8567ddbd 214 ///Debug serialPc.printf("%c",octetRecu); ////////
dbrousse 0:129e8567ddbd 215 }
dbrousse 0:129e8567ddbd 216 if(octetRecu == '/') {
dbrousse 0:129e8567ddbd 217 if ((bufferRec[0] == '0')&&(numeroOctetRecu == 8)) { // si c'est une commande de position MX28+MX106
dbrousse 0:129e8567ddbd 218 int b = bufferRec[1] - 0x30;
dbrousse 0:129e8567ddbd 219 int c = bufferRec[2] - 0x30;
dbrousse 0:129e8567ddbd 220 int d = bufferRec[3] - 0x30;
dbrousse 0:129e8567ddbd 221 int e = bufferRec[4] - 0x30;
dbrousse 0:129e8567ddbd 222 int f = bufferRec[5] - 0x30;
dbrousse 0:129e8567ddbd 223 int g = bufferRec[6] - 0x30;
dbrousse 0:129e8567ddbd 224 int anglePositionVerticale = (b * 100) + (c * 10) + d;
dbrousse 0:129e8567ddbd 225 int valeurPositionVerticale = anglePositionVerticale * 4095 / 360;
dbrousse 0:129e8567ddbd 226 setPosition(ID_SERVO_VERTICAL, valeurPositionVerticale);
dbrousse 0:129e8567ddbd 227 int anglePositionHorizontale = (e * 100) + (f * 10) + g;
dbrousse 0:129e8567ddbd 228 int valeurPositionHorizontale = anglePositionHorizontale * 4095 / 360;
dbrousse 3:a3074e835b35 229 wait_us(3200); // Attendre fin de la trame de réponse du Servo Vertical
dbrousse 1:538b13cb6699 230 setPosition(ID_SERVO_HORIZONTALE, valeurPositionHorizontale);
dbrousse 0:129e8567ddbd 231 //Pour Debug
dbrousse 1:538b13cb6699 232 //serialPc.printf("idServ = %d \tvaleurPosition = %d\n",ID_SERVO_VERTICAL, valeurPositionVerticale);
dbrousse 1:538b13cb6699 233 //serialPc.printf("idServ = %d \tvaleurPosition = %d\n",ID_SERVO_HORIZONTALE, valeurPositionHorizontale);
dbrousse 2:43daa01ba06d 234
dbrousse 2:43daa01ba06d 235 //--Solution simple pour retourner la position mais sans tester "positions demandéess=atteintes"
dbrousse 2:43daa01ba06d 236 // test positions atteintes à faire
dbrousse 2:43daa01ba06d 237 wait(2); //pour laisser le temps au moteur de se déplacer,
dbrousse 2:43daa01ba06d 238 bufferRec[0] = '1'; //pour retourner la mesure de la position
dbrousse 2:43daa01ba06d 239 numeroOctetRecu = 2; //pour retourner la mesure de la position
dbrousse 0:129e8567ddbd 240 }
dbrousse 0:129e8567ddbd 241 if ((bufferRec[0] == '1')&&(numeroOctetRecu == 2)) { // si demande de lecture de la position
dbrousse 0:129e8567ddbd 242 led03 = 1; // indic
dbrousse 2:43daa01ba06d 243 int valeurLue = lirePositionServo(ID_SERVO_VERTICAL);
dbrousse 1:538b13cb6699 244 int valeurAngleVertCentiemeDegres = (valeurLue * 100) * 360/4096;
dbrousse 1:538b13cb6699 245 wait(0.2);
dbrousse 2:43daa01ba06d 246 valeurLue = lirePositionServo(ID_SERVO_HORIZONTALE);
dbrousse 1:538b13cb6699 247 int valeurAngleHorizontaleCentiemeDegres = (valeurLue * 100) * 360/4096;
dbrousse 2:43daa01ba06d 248
dbrousse 2:43daa01ba06d 249 serialPc.printf("$OK_moteurs_%0#5d_%0#5d/\n",valeurAngleVertCentiemeDegres, valeurAngleHorizontaleCentiemeDegres);
dbrousse 1:538b13cb6699 250
dbrousse 0:129e8567ddbd 251 led03 = 0; //
dbrousse 0:129e8567ddbd 252 }
dbrousse 0:129e8567ddbd 253 if ((bufferRec[0] == '2')&&(numeroOctetRecu == 3)) { // si c'est une commande Laser
dbrousse 0:129e8567ddbd 254 if (bufferRec[1] == '1') {
dbrousse 0:129e8567ddbd 255 //Laser on
dbrousse 0:129e8567ddbd 256 led02 = 1; // indic commande Laser on
dbrousse 0:129e8567ddbd 257 laser = 1;
dbrousse 2:43daa01ba06d 258 serialPc.printf("$OK_laser_1/\n");
dbrousse 0:129e8567ddbd 259 } else {
dbrousse 0:129e8567ddbd 260 //Laser off
dbrousse 0:129e8567ddbd 261 led02 = 0; // indic commande Laser off
dbrousse 0:129e8567ddbd 262 laser = 0;
dbrousse 2:43daa01ba06d 263 serialPc.printf("$OK_laser_0/\n");
dbrousse 0:129e8567ddbd 264 }
dbrousse 0:129e8567ddbd 265 }
dbrousse 0:129e8567ddbd 266 if ((bufferRec[0] == '3')&&(numeroOctetRecu == 11)) { // si commande panneau led supérieur
dbrousse 0:129e8567ddbd 267 led03 = 1; // indic commande panneau led supérieur
dbrousse 0:129e8567ddbd 268 // A terminer
dbrousse 0:129e8567ddbd 269 int b = bufferRec[1] - 0x30;
dbrousse 0:129e8567ddbd 270 int c = bufferRec[2] - 0x30;
dbrousse 0:129e8567ddbd 271 int d = bufferRec[3] - 0x30;
dbrousse 0:129e8567ddbd 272 int e = bufferRec[4] - 0x30;
dbrousse 0:129e8567ddbd 273 int f = bufferRec[5] - 0x30;
dbrousse 0:129e8567ddbd 274 int g = bufferRec[6] - 0x30;
dbrousse 0:129e8567ddbd 275 int h = bufferRec[7] - 0x30;
dbrousse 0:129e8567ddbd 276 int i = bufferRec[8] - 0x30;
dbrousse 0:129e8567ddbd 277 int j = bufferRec[9] - 0x30;
dbrousse 0:129e8567ddbd 278 int colorLed1 = (b*100+c*10+d)*65536+(e*100+f*10+g)*256+(h*100+i*10+j);
dbrousse 0:129e8567ddbd 279 panelLed1.clear();
dbrousse 0:129e8567ddbd 280 for(int n=0;n<N1;n++) {
dbrousse 0:129e8567ddbd 281 panelLed1.setPixel(n,colorLed1);
dbrousse 0:129e8567ddbd 282 }
dbrousse 0:129e8567ddbd 283 panelLed1.write();
dbrousse 0:129e8567ddbd 284
dbrousse 0:129e8567ddbd 285 wait(0.2);
dbrousse 2:43daa01ba06d 286 serialPc.printf("$OK_panneau_1_%c%c%c_%c%c%c_%c%c%c/\n",bufferRec[1],bufferRec[2],bufferRec[3],bufferRec[4],bufferRec[5],bufferRec[6],bufferRec[7],bufferRec[8],bufferRec[9]);
dbrousse 0:129e8567ddbd 287 led03 = 0; // indic commande panneau led supérieur
dbrousse 0:129e8567ddbd 288 }
dbrousse 0:129e8567ddbd 289 if ((bufferRec[0] == '4')&&(numeroOctetRecu == 11)) { // si commande panneau led latéral 1
dbrousse 0:129e8567ddbd 290 led03 = 1; // indic commande panneau led
dbrousse 0:129e8567ddbd 291 int b = bufferRec[1] - 0x30;
dbrousse 0:129e8567ddbd 292 int c = bufferRec[2] - 0x30;
dbrousse 0:129e8567ddbd 293 int d = bufferRec[3] - 0x30;
dbrousse 0:129e8567ddbd 294 int e = bufferRec[4] - 0x30;
dbrousse 0:129e8567ddbd 295 int f = bufferRec[5] - 0x30;
dbrousse 0:129e8567ddbd 296 int g = bufferRec[6] - 0x30;
dbrousse 0:129e8567ddbd 297 int h = bufferRec[7] - 0x30;
dbrousse 0:129e8567ddbd 298 int i = bufferRec[8] - 0x30;
dbrousse 0:129e8567ddbd 299 int j = bufferRec[9] - 0x30;
dbrousse 0:129e8567ddbd 300 int valeurRouge = (b*100+c*10+d);
dbrousse 0:129e8567ddbd 301 int valeurVerte = (e*100+f*10+g);
dbrousse 0:129e8567ddbd 302 int valeurBleu = (h*100+i*10+j);
dbrousse 0:129e8567ddbd 303 writeMatriceLed(2,N2,valeurRouge, valeurVerte, valeurBleu);
dbrousse 0:129e8567ddbd 304 wait(0.2);
dbrousse 2:43daa01ba06d 305 serialPc.printf("$OK_panneau_2_%c%c%c_%c%c%c_%c%c%c/\n",bufferRec[1],bufferRec[2],bufferRec[3],bufferRec[4],bufferRec[5],bufferRec[6],bufferRec[7],bufferRec[8],bufferRec[9]);
dbrousse 0:129e8567ddbd 306 led03 = 0; // indic commande panneau led
dbrousse 0:129e8567ddbd 307 }
dbrousse 0:129e8567ddbd 308 if ((bufferRec[0] == '5')&&(numeroOctetRecu == 11)) { // si commande panneau led latéral 2
dbrousse 0:129e8567ddbd 309 led03 = 1; // indic commande panneau led
dbrousse 0:129e8567ddbd 310 int b = bufferRec[1] - 0x30;
dbrousse 0:129e8567ddbd 311 int c = bufferRec[2] - 0x30;
dbrousse 0:129e8567ddbd 312 int d = bufferRec[3] - 0x30;
dbrousse 0:129e8567ddbd 313 int e = bufferRec[4] - 0x30;
dbrousse 0:129e8567ddbd 314 int f = bufferRec[5] - 0x30;
dbrousse 0:129e8567ddbd 315 int g = bufferRec[6] - 0x30;
dbrousse 0:129e8567ddbd 316 int h = bufferRec[7] - 0x30;
dbrousse 0:129e8567ddbd 317 int i = bufferRec[8] - 0x30;
dbrousse 0:129e8567ddbd 318 int j = bufferRec[9] - 0x30;
dbrousse 0:129e8567ddbd 319 int valeurRouge = (b*100+c*10+d);
dbrousse 0:129e8567ddbd 320 int valeurVerte = (e*100+f*10+g);
dbrousse 0:129e8567ddbd 321 int valeurBleu = (h*100+i*10+j);
dbrousse 0:129e8567ddbd 322 writeMatriceLed(3,N3,valeurRouge, valeurVerte, valeurBleu);
dbrousse 0:129e8567ddbd 323 wait(0.2);
dbrousse 2:43daa01ba06d 324 serialPc.printf("$OK_panneau_3_%c%c%c_%c%c%c_%c%c%c/\n",bufferRec[1],bufferRec[2],bufferRec[3],bufferRec[4],bufferRec[5],bufferRec[6],bufferRec[7],bufferRec[8],bufferRec[9]);
dbrousse 0:129e8567ddbd 325 led03 = 0; // indic commande panneau led
dbrousse 0:129e8567ddbd 326 }
dbrousse 0:129e8567ddbd 327 if ((bufferRec[0] == '6')&&(numeroOctetRecu == 2)) { // si c'est une demande mesure accéléromètre
dbrousse 2:43daa01ba06d 328 //LECTURE ET ENVOI des mesures d'accélérations
dbrousse 0:129e8567ddbd 329 // A Faire
dbrousse 3:a3074e835b35 330 serialPc.printf("AccX = %+-0#5d AccY = %+-0#5d AccZ = %+-0#5d\n",valeurAccX,valeurAccY,valeurAccZ);
dbrousse 0:129e8567ddbd 331 }
dbrousse 3:a3074e835b35 332 if ((bufferRec[0] == '7')&&(numeroOctetRecu == 2)) { // si c'est une demande mesure luminosité
dbrousse 3:a3074e835b35 333
dbrousse 3:a3074e835b35 334 serialPc.printf("$OK_lumiere_%0#4d/\n",valeurLux);
dbrousse 3:a3074e835b35 335 }
dbrousse 0:129e8567ddbd 336 numeroOctetRecu = 0;
dbrousse 0:129e8567ddbd 337 } else {
dbrousse 0:129e8567ddbd 338 numeroOctetRecu++;
dbrousse 0:129e8567ddbd 339 }
dbrousse 0:129e8567ddbd 340 led04 =0;
dbrousse 0:129e8567ddbd 341 }
dbrousse 0:129e8567ddbd 342
dbrousse 0:129e8567ddbd 343 int main()
dbrousse 0:129e8567ddbd 344 {
dbrousse 0:129e8567ddbd 345 uartMX28.baud(57142); // débit standard pour les MX-28 et -106
dbrousse 0:129e8567ddbd 346 serialPc.baud(115200);
dbrousse 0:129e8567ddbd 347 serialPc.attach(&receptionPc); // defini la fonction interruption
dbrousse 0:129e8567ddbd 348 panelLed1.setBrightness(1); // par défaut à 50%
dbrousse 1:538b13cb6699 349 //serialPc.printf("Entrer une commande\n");
dbrousse 0:129e8567ddbd 350 led01 = 1;
dbrousse 0:129e8567ddbd 351 // Clear buffer
dbrousse 0:129e8567ddbd 352 memset(&bufferRec[0], 0, sizeof(bufferRec));
dbrousse 0:129e8567ddbd 353
dbrousse 3:a3074e835b35 354 // Config Accelerometre
dbrousse 3:a3074e835b35 355 char dataLu[2];
dbrousse 3:a3074e835b35 356 dataLu[0]=0x20; // Registre CTRL1
dbrousse 3:a3074e835b35 357 dataLu[1]=0x67; // Accelero ON et data rate = 100Hz
dbrousse 3:a3074e835b35 358 i2cLsm303D.write(addrLsm303D, dataLu, 2);
dbrousse 3:a3074e835b35 359 dataLu[0]=0x26; // Registre CTRL7
dbrousse 3:a3074e835b35 360 dataLu[1]=0x82; // Accelero ON et data rate = 100Hz
dbrousse 3:a3074e835b35 361 i2cLsm303D.write(addrLsm303D, dataLu, 2);
dbrousse 3:a3074e835b35 362
dbrousse 0:129e8567ddbd 363 while(1) {
dbrousse 0:129e8567ddbd 364 led01 = 0;
dbrousse 0:129e8567ddbd 365 wait(0.1);
dbrousse 0:129e8567ddbd 366 led01 = 1;
dbrousse 0:129e8567ddbd 367 wait(0.1);
dbrousse 3:a3074e835b35 368 valeurLux = mesureDeLux(); //mesure cyclique de luminosité
dbrousse 3:a3074e835b35 369 valeurAccX = mesureAcc(0x28);
dbrousse 3:a3074e835b35 370 valeurAccY = mesureAcc(0x2A);
dbrousse 3:a3074e835b35 371 valeurAccZ = mesureAcc(0x2C);
dbrousse 0:129e8567ddbd 372 }
dbrousse 0:129e8567ddbd 373 }