Scan Mines

Dependencies:   NeoStrip mbed

Fork of MX28-Scan3D_DB03-IRQ by Denis Brousse

Committer:
wumzi
Date:
Wed Jun 03 15:32:35 2015 +0000
Revision:
5:a81d551cfffa
Parent:
4:ca5bdb807fa1
Modif pour tenter de setter vitesse

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 5:a81d551cfffa 30 #define ID_SERVO_VERTICAL 10 // MX-106R
wumzi 5:a81d551cfffa 31 #define ID_SERVO_HORIZONTALE 1 // 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
wumzi 5:a81d551cfffa 71 //---------------------------------------------------------------------------------------------
wumzi 5:a81d551cfffa 72 // Set Motor gain
wumzi 5:a81d551cfffa 73
dbrousse 0:129e8567ddbd 74 //------------------------------------------------------------------------------------------------
dbrousse 0:129e8567ddbd 75 // Envoi de la trame de pilotage a un servomoteur MX-28
dbrousse 0:129e8567ddbd 76 void write (char id, char longueurTrame, char instruction, char param1 = NULL, char param2 = NULL, char param3 = NULL, char param4 = NULL)
dbrousse 0:129e8567ddbd 77 {
dbrousse 0:129e8567ddbd 78 char Cks;
dbrousse 0:129e8567ddbd 79
dbrousse 0:129e8567ddbd 80 Cks = ~( id + longueurTrame + instruction + param1 + param2 + param3 + param4); //calcul du checkSum
dbrousse 0:129e8567ddbd 81 //serialPc.printf("Cks : %d\n", Cks);
dbrousse 0:129e8567ddbd 82 dir = 1;
dbrousse 0:129e8567ddbd 83 uartMX28.putc(0xFF);
dbrousse 0:129e8567ddbd 84 uartMX28.putc(0xFF);
dbrousse 0:129e8567ddbd 85 uartMX28.putc(id);
dbrousse 0:129e8567ddbd 86 uartMX28.putc(longueurTrame);
dbrousse 0:129e8567ddbd 87 uartMX28.putc(instruction);
dbrousse 0:129e8567ddbd 88 if (longueurTrame >= 3) {
dbrousse 0:129e8567ddbd 89 uartMX28.putc(param1);
dbrousse 0:129e8567ddbd 90 }
dbrousse 0:129e8567ddbd 91 if (longueurTrame >= 4) {
dbrousse 0:129e8567ddbd 92 uartMX28.putc(param2);
dbrousse 0:129e8567ddbd 93 }
dbrousse 0:129e8567ddbd 94 if (longueurTrame >= 5) {
dbrousse 0:129e8567ddbd 95 uartMX28.putc(param3);
dbrousse 0:129e8567ddbd 96 }
dbrousse 0:129e8567ddbd 97 if (longueurTrame >= 6) {
dbrousse 0:129e8567ddbd 98 uartMX28.putc(param4);
dbrousse 0:129e8567ddbd 99 }
dbrousse 0:129e8567ddbd 100 uartMX28.putc(Cks);
dbrousse 0:129e8567ddbd 101
dbrousse 0:129e8567ddbd 102 wait_us(MX28_WAIT_AFTER_WRITE); // Attendre l'envoie complet de la trame.
dbrousse 0:129e8567ddbd 103 dir = 0;
dbrousse 0:129e8567ddbd 104 }
dbrousse 0:129e8567ddbd 105
wumzi 5:a81d551cfffa 106 void setMotorGainSpeed(){
wumzi 5:a81d551cfffa 107 char min = 1;
wumzi 5:a81d551cfffa 108 char max = 2;
wumzi 5:a81d551cfffa 109 write(ID_SERVO_VERTICAL, 5, MX28_WRITE_DATA, MX28_MOVING_SPEED_L, min, max);
wumzi 5:a81d551cfffa 110 write(ID_SERVO_HORIZONTALE, 5, MX28_WRITE_DATA, MX28_MOVING_SPEED_L, min, max);
wumzi 5:a81d551cfffa 111
wumzi 5:a81d551cfffa 112 serialPc.printf("gains set\n");
wumzi 5:a81d551cfffa 113 }
wumzi 5:a81d551cfffa 114
wumzi 5:a81d551cfffa 115
dbrousse 0:129e8567ddbd 116 // Set goal position of engine
dbrousse 0:129e8567ddbd 117 void setPosition(char id, int goal)
dbrousse 0:129e8567ddbd 118 {
dbrousse 0:129e8567ddbd 119 char goal_h = goal >> 8;
dbrousse 0:129e8567ddbd 120 char goal_l = goal;
dbrousse 0:129e8567ddbd 121 //serialPc.printf("Goal set : %d %d %d\n", goal, goal_h, goal_l);
dbrousse 0:129e8567ddbd 122 write(id, 5, MX28_WRITE_DATA, MX28_GOAL_POSITION_L, goal_l, goal_h);
dbrousse 0:129e8567ddbd 123 }
dbrousse 0:129e8567ddbd 124
dbrousse 0:129e8567ddbd 125 //---------------------------------------------------------------------------------------------
dbrousse 2:43daa01ba06d 126 // Lire position d'un servomoteur MX-28 ou MX-106
dbrousse 2:43daa01ba06d 127 int lirePositionServo(char idServo) {
dbrousse 2:43daa01ba06d 128 //Vider le buffer de réception uartMX28
dbrousse 2:43daa01ba06d 129 while(uartMX28.readable()) {
dbrousse 2:43daa01ba06d 130 uartMX28.getc();
dbrousse 2:43daa01ba06d 131 }
dbrousse 2:43daa01ba06d 132 write(idServo, 4, MX28_READ_DATA, MX28_PRESENT_POSITION_L,2);
dbrousse 2:43daa01ba06d 133 char octetRecuMX[8];
dbrousse 2:43daa01ba06d 134 char i=0;
dbrousse 2:43daa01ba06d 135 int tempoReception=0;
dbrousse 2:43daa01ba06d 136 while((tempoReception < 1000000)&&(i<8)) {
dbrousse 2:43daa01ba06d 137 if(uartMX28.readable()) {
dbrousse 2:43daa01ba06d 138 octetRecuMX[i] = uartMX28.getc();
dbrousse 2:43daa01ba06d 139 i++;
dbrousse 2:43daa01ba06d 140 }
dbrousse 2:43daa01ba06d 141 tempoReception++;
dbrousse 2:43daa01ba06d 142 }
dbrousse 2:43daa01ba06d 143 int valeurLue = octetRecuMX[6] * 256 + octetRecuMX[5];
dbrousse 2:43daa01ba06d 144 return valeurLue;
dbrousse 2:43daa01ba06d 145 }
dbrousse 2:43daa01ba06d 146
dbrousse 2:43daa01ba06d 147 //---------------------------------------------------------------------------------------------
dbrousse 0:129e8567ddbd 148 // fonction écriture Bit code 1 et 0 pour matrice Led Neopixels
dbrousse 0:129e8567ddbd 149 void writeBitCode1(int numMatriceLed)
dbrousse 0:129e8567ddbd 150 {
dbrousse 0:129e8567ddbd 151 if(numMatriceLed==2){panelLed2=1;}
dbrousse 0:129e8567ddbd 152 else{panelLed3=1;}
dbrousse 0:129e8567ddbd 153 for(int i=0;i<37;i++) {int x = i*i*i; x=x*x;} // pour T1H=700ns
dbrousse 0:129e8567ddbd 154 if(numMatriceLed==2){panelLed2=0;}
dbrousse 0:129e8567ddbd 155 else{panelLed3=0;}
dbrousse 0:129e8567ddbd 156 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 157 }
dbrousse 0:129e8567ddbd 158 void writeBitCode0(int numMatriceLed)
dbrousse 0:129e8567ddbd 159 {
dbrousse 0:129e8567ddbd 160 if(numMatriceLed==2){panelLed2=1;}
dbrousse 0:129e8567ddbd 161 else{panelLed3=1;}
dbrousse 0:129e8567ddbd 162 for(int i=0;i<15;i++) {int x = i*i*i; x=x*x;} // pour T0H=350ns
dbrousse 0:129e8567ddbd 163 if(numMatriceLed==2){panelLed2=0;}
dbrousse 0:129e8567ddbd 164 else{panelLed3=0;}
dbrousse 0:129e8567ddbd 165 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 166 }
dbrousse 0:129e8567ddbd 167 //---------------------------------------------------------------------------------------------
dbrousse 0:129e8567ddbd 168 // fonction écriture matrice Led Neopixels
dbrousse 0:129e8567ddbd 169 void writeMatriceLed(int numMatriceLed, int N, int valRouge, int valVerte, int valBleu)
dbrousse 0:129e8567ddbd 170 {
dbrousse 0:129e8567ddbd 171 int valeurCouleurVRB = valVerte*65536+valRouge*256+valBleu;
dbrousse 0:129e8567ddbd 172 for(int i=0;i<N;i++) {
dbrousse 0:129e8567ddbd 173 int mask_1sur24Bits = 0x800000;
dbrousse 0:129e8567ddbd 174 for(int j=0;j<24;j++) {
dbrousse 0:129e8567ddbd 175 if(valeurCouleurVRB & mask_1sur24Bits) {
dbrousse 0:129e8567ddbd 176 writeBitCode1(numMatriceLed);
dbrousse 0:129e8567ddbd 177 }
dbrousse 0:129e8567ddbd 178 else {
dbrousse 0:129e8567ddbd 179 writeBitCode0(numMatriceLed);
dbrousse 0:129e8567ddbd 180 }
dbrousse 0:129e8567ddbd 181 mask_1sur24Bits = mask_1sur24Bits >> 1;
dbrousse 0:129e8567ddbd 182 }
dbrousse 0:129e8567ddbd 183 }
dbrousse 0:129e8567ddbd 184 }
dbrousse 3:a3074e835b35 185 // Mesure de la luminosité avec moyenne sur NBRE_ACK
dbrousse 3:a3074e835b35 186 int mesureDeLux() {
dbrousse 3:a3074e835b35 187 float sommeMesure=0;
dbrousse 3:a3074e835b35 188 int valL;
dbrousse 3:a3074e835b35 189 for(int i=0; i<NBRE_ACK;i++) {
dbrousse 3:a3074e835b35 190 sommeMesure += mesLux;
dbrousse 3:a3074e835b35 191 }
dbrousse 3:a3074e835b35 192 valL = ((sommeMesure*3.3*1000)/NBRE_ACK); // mesure en mV
dbrousse 3:a3074e835b35 193 return valL;
dbrousse 3:a3074e835b35 194 }
dbrousse 3:a3074e835b35 195 short mesureAcc(char sub) {
dbrousse 3:a3074e835b35 196 char dataLu[2];
dbrousse 3:a3074e835b35 197 short valAcc=0;
dbrousse 3:a3074e835b35 198 int sommeValAcc=0;
dbrousse 3:a3074e835b35 199 for(int i=0; i<NBRE_ACQ_ACC;i++) {
dbrousse 3:a3074e835b35 200 dataLu[0]=sub; // OUT_X_L_A ou Y ou Z, registre acc X,Y,Z
dbrousse 3:a3074e835b35 201 i2cLsm303D.write(addrLsm303D, dataLu, 1);
dbrousse 3:a3074e835b35 202 i2cLsm303D.read(addrLsm303D, dataLu, 1);
dbrousse 3:a3074e835b35 203 valAcc = dataLu[0];
dbrousse 3:a3074e835b35 204 dataLu[0]=sub+1; // OUT_X_H_A registre acc X
dbrousse 3:a3074e835b35 205 i2cLsm303D.write(addrLsm303D, dataLu, 1);
dbrousse 3:a3074e835b35 206 i2cLsm303D.read(addrLsm303D, dataLu, 1);
dbrousse 3:a3074e835b35 207 valAcc |= dataLu[0]<<8;
dbrousse 3:a3074e835b35 208 sommeValAcc += valAcc;
dbrousse 3:a3074e835b35 209 }
dbrousse 3:a3074e835b35 210 valAcc = sommeValAcc/NBRE_ACQ_ACC;
dbrousse 3:a3074e835b35 211 int val = int (valAcc*2000)/32768;
dbrousse 3:a3074e835b35 212 valAcc = val; //prendre la partie entière
dbrousse 3:a3074e835b35 213 return valAcc;
dbrousse 3:a3074e835b35 214 }
dbrousse 0:129e8567ddbd 215
dbrousse 0:129e8567ddbd 216 //---------------------------------------------------------------------------------------------
dbrousse 0:129e8567ddbd 217 // fonction appelée par interruption si réception sur serialPc
dbrousse 0:129e8567ddbd 218 void receptionPc()
dbrousse 0:129e8567ddbd 219 {
dbrousse 0:129e8567ddbd 220 led04 =1;
dbrousse 0:129e8567ddbd 221 octetRecu = serialPc.getc();
dbrousse 0:129e8567ddbd 222 if(octetRecu == '$') {
dbrousse 0:129e8567ddbd 223 numeroOctetRecu = 0;
dbrousse 0:129e8567ddbd 224 memset(&bufferRec[0], 0, sizeof(bufferRec));
dbrousse 0:129e8567ddbd 225 } else {
dbrousse 0:129e8567ddbd 226 bufferRec[numeroOctetRecu-1] = octetRecu;
dbrousse 0:129e8567ddbd 227 ///Debug serialPc.printf("%c",octetRecu); ////////
dbrousse 0:129e8567ddbd 228 }
dbrousse 0:129e8567ddbd 229 if(octetRecu == '/') {
dbrousse 0:129e8567ddbd 230 if ((bufferRec[0] == '0')&&(numeroOctetRecu == 8)) { // si c'est une commande de position MX28+MX106
dbrousse 0:129e8567ddbd 231 int b = bufferRec[1] - 0x30;
dbrousse 0:129e8567ddbd 232 int c = bufferRec[2] - 0x30;
dbrousse 0:129e8567ddbd 233 int d = bufferRec[3] - 0x30;
dbrousse 0:129e8567ddbd 234 int e = bufferRec[4] - 0x30;
dbrousse 0:129e8567ddbd 235 int f = bufferRec[5] - 0x30;
dbrousse 0:129e8567ddbd 236 int g = bufferRec[6] - 0x30;
dbrousse 0:129e8567ddbd 237 int anglePositionVerticale = (b * 100) + (c * 10) + d;
dbrousse 0:129e8567ddbd 238 int valeurPositionVerticale = anglePositionVerticale * 4095 / 360;
dbrousse 0:129e8567ddbd 239 setPosition(ID_SERVO_VERTICAL, valeurPositionVerticale);
dbrousse 0:129e8567ddbd 240 int anglePositionHorizontale = (e * 100) + (f * 10) + g;
dbrousse 0:129e8567ddbd 241 int valeurPositionHorizontale = anglePositionHorizontale * 4095 / 360;
dbrousse 3:a3074e835b35 242 wait_us(3200); // Attendre fin de la trame de réponse du Servo Vertical
dbrousse 1:538b13cb6699 243 setPosition(ID_SERVO_HORIZONTALE, valeurPositionHorizontale);
dbrousse 0:129e8567ddbd 244 //Pour Debug
dbrousse 1:538b13cb6699 245 //serialPc.printf("idServ = %d \tvaleurPosition = %d\n",ID_SERVO_VERTICAL, valeurPositionVerticale);
dbrousse 1:538b13cb6699 246 //serialPc.printf("idServ = %d \tvaleurPosition = %d\n",ID_SERVO_HORIZONTALE, valeurPositionHorizontale);
dbrousse 2:43daa01ba06d 247
dbrousse 2:43daa01ba06d 248 //--Solution simple pour retourner la position mais sans tester "positions demandéess=atteintes"
dbrousse 2:43daa01ba06d 249 // test positions atteintes à faire
wumzi 5:a81d551cfffa 250 wait(1); //pour laisser le temps au moteur de se déplacer,
wumzi 5:a81d551cfffa 251
wumzi 5:a81d551cfffa 252 int incr = 0;
wumzi 5:a81d551cfffa 253
wumzi 5:a81d551cfffa 254 int valeurLue = lirePositionServo(ID_SERVO_VERTICAL);
wumzi 5:a81d551cfffa 255 int valeurAngleVertCentiemeDegres = (valeurLue * 100) * 360/4096;
wumzi 5:a81d551cfffa 256 wait(0.2);
wumzi 5:a81d551cfffa 257 valeurLue = lirePositionServo(ID_SERVO_HORIZONTALE);
wumzi 5:a81d551cfffa 258 int valeurAngleHorizontaleCentiemeDegres = (valeurLue * 100) * 360/4096;
wumzi 5:a81d551cfffa 259
wumzi 5:a81d551cfffa 260 /*while ((abs(valeurAngleVertCentiemeDegres - anglePositionVerticale * 100) > 100
wumzi 5:a81d551cfffa 261 || abs(valeurAngleHorizontaleCentiemeDegres - anglePositionHorizontale * 100) > 100)
wumzi 5:a81d551cfffa 262 && incr < 60)
wumzi 5:a81d551cfffa 263 {
wumzi 5:a81d551cfffa 264 wait(1);
wumzi 5:a81d551cfffa 265 int valeurLue = lirePositionServo(ID_SERVO_VERTICAL);
wumzi 5:a81d551cfffa 266 valeurAngleVertCentiemeDegres = (valeurLue * 100) * 360/4096;
wumzi 5:a81d551cfffa 267 wait(0.2);
wumzi 5:a81d551cfffa 268 valeurLue = lirePositionServo(ID_SERVO_HORIZONTALE);
wumzi 5:a81d551cfffa 269 valeurAngleHorizontaleCentiemeDegres = (valeurLue * 100) * 360/4096;
wumzi 5:a81d551cfffa 270 incr++;
wumzi 5:a81d551cfffa 271
wumzi 5:a81d551cfffa 272 //pc.printf(" Goal = %d ; Current = %d", goalHoriz, currentPositionHoriz);
wumzi 5:a81d551cfffa 273 }*/
wumzi 5:a81d551cfffa 274
dbrousse 2:43daa01ba06d 275 bufferRec[0] = '1'; //pour retourner la mesure de la position
dbrousse 2:43daa01ba06d 276 numeroOctetRecu = 2; //pour retourner la mesure de la position
dbrousse 0:129e8567ddbd 277 }
dbrousse 0:129e8567ddbd 278 if ((bufferRec[0] == '1')&&(numeroOctetRecu == 2)) { // si demande de lecture de la position
dbrousse 0:129e8567ddbd 279 led03 = 1; // indic
dbrousse 2:43daa01ba06d 280 int valeurLue = lirePositionServo(ID_SERVO_VERTICAL);
dbrousse 1:538b13cb6699 281 int valeurAngleVertCentiemeDegres = (valeurLue * 100) * 360/4096;
dbrousse 1:538b13cb6699 282 wait(0.2);
dbrousse 2:43daa01ba06d 283 valeurLue = lirePositionServo(ID_SERVO_HORIZONTALE);
dbrousse 1:538b13cb6699 284 int valeurAngleHorizontaleCentiemeDegres = (valeurLue * 100) * 360/4096;
wumzi 5:a81d551cfffa 285
wumzi 5:a81d551cfffa 286
dbrousse 2:43daa01ba06d 287 serialPc.printf("$OK_moteurs_%0#5d_%0#5d/\n",valeurAngleVertCentiemeDegres, valeurAngleHorizontaleCentiemeDegres);
dbrousse 1:538b13cb6699 288
dbrousse 0:129e8567ddbd 289 led03 = 0; //
dbrousse 0:129e8567ddbd 290 }
dbrousse 0:129e8567ddbd 291 if ((bufferRec[0] == '2')&&(numeroOctetRecu == 3)) { // si c'est une commande Laser
dbrousse 0:129e8567ddbd 292 if (bufferRec[1] == '1') {
dbrousse 0:129e8567ddbd 293 //Laser on
dbrousse 0:129e8567ddbd 294 led02 = 1; // indic commande Laser on
dbrousse 0:129e8567ddbd 295 laser = 1;
dbrousse 2:43daa01ba06d 296 serialPc.printf("$OK_laser_1/\n");
dbrousse 0:129e8567ddbd 297 } else {
dbrousse 0:129e8567ddbd 298 //Laser off
dbrousse 0:129e8567ddbd 299 led02 = 0; // indic commande Laser off
dbrousse 0:129e8567ddbd 300 laser = 0;
dbrousse 2:43daa01ba06d 301 serialPc.printf("$OK_laser_0/\n");
dbrousse 0:129e8567ddbd 302 }
dbrousse 0:129e8567ddbd 303 }
dbrousse 0:129e8567ddbd 304 if ((bufferRec[0] == '3')&&(numeroOctetRecu == 11)) { // si commande panneau led supérieur
dbrousse 0:129e8567ddbd 305 led03 = 1; // indic commande panneau led supérieur
dbrousse 0:129e8567ddbd 306 // A terminer
dbrousse 0:129e8567ddbd 307 int b = bufferRec[1] - 0x30;
dbrousse 0:129e8567ddbd 308 int c = bufferRec[2] - 0x30;
dbrousse 0:129e8567ddbd 309 int d = bufferRec[3] - 0x30;
dbrousse 0:129e8567ddbd 310 int e = bufferRec[4] - 0x30;
dbrousse 0:129e8567ddbd 311 int f = bufferRec[5] - 0x30;
dbrousse 0:129e8567ddbd 312 int g = bufferRec[6] - 0x30;
dbrousse 0:129e8567ddbd 313 int h = bufferRec[7] - 0x30;
dbrousse 0:129e8567ddbd 314 int i = bufferRec[8] - 0x30;
dbrousse 0:129e8567ddbd 315 int j = bufferRec[9] - 0x30;
dbrousse 0:129e8567ddbd 316 int colorLed1 = (b*100+c*10+d)*65536+(e*100+f*10+g)*256+(h*100+i*10+j);
dbrousse 0:129e8567ddbd 317 panelLed1.clear();
dbrousse 0:129e8567ddbd 318 for(int n=0;n<N1;n++) {
dbrousse 0:129e8567ddbd 319 panelLed1.setPixel(n,colorLed1);
dbrousse 0:129e8567ddbd 320 }
dbrousse 0:129e8567ddbd 321 panelLed1.write();
dbrousse 0:129e8567ddbd 322
dbrousse 0:129e8567ddbd 323 wait(0.2);
dbrousse 2:43daa01ba06d 324 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 325 led03 = 0; // indic commande panneau led supérieur
dbrousse 0:129e8567ddbd 326 }
dbrousse 0:129e8567ddbd 327 if ((bufferRec[0] == '4')&&(numeroOctetRecu == 11)) { // si commande panneau led latéral 1
dbrousse 0:129e8567ddbd 328 led03 = 1; // indic commande panneau led
dbrousse 0:129e8567ddbd 329 int b = bufferRec[1] - 0x30;
dbrousse 0:129e8567ddbd 330 int c = bufferRec[2] - 0x30;
dbrousse 0:129e8567ddbd 331 int d = bufferRec[3] - 0x30;
dbrousse 0:129e8567ddbd 332 int e = bufferRec[4] - 0x30;
dbrousse 0:129e8567ddbd 333 int f = bufferRec[5] - 0x30;
dbrousse 0:129e8567ddbd 334 int g = bufferRec[6] - 0x30;
dbrousse 0:129e8567ddbd 335 int h = bufferRec[7] - 0x30;
dbrousse 0:129e8567ddbd 336 int i = bufferRec[8] - 0x30;
dbrousse 0:129e8567ddbd 337 int j = bufferRec[9] - 0x30;
dbrousse 0:129e8567ddbd 338 int valeurRouge = (b*100+c*10+d);
dbrousse 0:129e8567ddbd 339 int valeurVerte = (e*100+f*10+g);
dbrousse 0:129e8567ddbd 340 int valeurBleu = (h*100+i*10+j);
dbrousse 0:129e8567ddbd 341 writeMatriceLed(2,N2,valeurRouge, valeurVerte, valeurBleu);
dbrousse 0:129e8567ddbd 342 wait(0.2);
dbrousse 2:43daa01ba06d 343 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 344 led03 = 0; // indic commande panneau led
dbrousse 0:129e8567ddbd 345 }
dbrousse 0:129e8567ddbd 346 if ((bufferRec[0] == '5')&&(numeroOctetRecu == 11)) { // si commande panneau led latéral 2
dbrousse 0:129e8567ddbd 347 led03 = 1; // indic commande panneau led
dbrousse 0:129e8567ddbd 348 int b = bufferRec[1] - 0x30;
dbrousse 0:129e8567ddbd 349 int c = bufferRec[2] - 0x30;
dbrousse 0:129e8567ddbd 350 int d = bufferRec[3] - 0x30;
dbrousse 0:129e8567ddbd 351 int e = bufferRec[4] - 0x30;
dbrousse 0:129e8567ddbd 352 int f = bufferRec[5] - 0x30;
dbrousse 0:129e8567ddbd 353 int g = bufferRec[6] - 0x30;
dbrousse 0:129e8567ddbd 354 int h = bufferRec[7] - 0x30;
dbrousse 0:129e8567ddbd 355 int i = bufferRec[8] - 0x30;
dbrousse 0:129e8567ddbd 356 int j = bufferRec[9] - 0x30;
dbrousse 0:129e8567ddbd 357 int valeurRouge = (b*100+c*10+d);
dbrousse 0:129e8567ddbd 358 int valeurVerte = (e*100+f*10+g);
dbrousse 0:129e8567ddbd 359 int valeurBleu = (h*100+i*10+j);
dbrousse 0:129e8567ddbd 360 writeMatriceLed(3,N3,valeurRouge, valeurVerte, valeurBleu);
dbrousse 0:129e8567ddbd 361 wait(0.2);
dbrousse 2:43daa01ba06d 362 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 363 led03 = 0; // indic commande panneau led
dbrousse 0:129e8567ddbd 364 }
dbrousse 0:129e8567ddbd 365 if ((bufferRec[0] == '6')&&(numeroOctetRecu == 2)) { // si c'est une demande mesure accéléromètre
dbrousse 2:43daa01ba06d 366 //LECTURE ET ENVOI des mesures d'accélérations
dbrousse 0:129e8567ddbd 367 // A Faire
dbrousse 3:a3074e835b35 368 serialPc.printf("AccX = %+-0#5d AccY = %+-0#5d AccZ = %+-0#5d\n",valeurAccX,valeurAccY,valeurAccZ);
dbrousse 0:129e8567ddbd 369 }
dbrousse 3:a3074e835b35 370 if ((bufferRec[0] == '7')&&(numeroOctetRecu == 2)) { // si c'est une demande mesure luminosité
dbrousse 3:a3074e835b35 371
dbrousse 3:a3074e835b35 372 serialPc.printf("$OK_lumiere_%0#4d/\n",valeurLux);
dbrousse 3:a3074e835b35 373 }
dbrousse 0:129e8567ddbd 374 numeroOctetRecu = 0;
dbrousse 0:129e8567ddbd 375 } else {
dbrousse 0:129e8567ddbd 376 numeroOctetRecu++;
dbrousse 0:129e8567ddbd 377 }
dbrousse 0:129e8567ddbd 378 led04 =0;
dbrousse 0:129e8567ddbd 379 }
dbrousse 0:129e8567ddbd 380
dbrousse 0:129e8567ddbd 381 int main()
dbrousse 0:129e8567ddbd 382 {
dbrousse 0:129e8567ddbd 383 uartMX28.baud(57142); // débit standard pour les MX-28 et -106
dbrousse 0:129e8567ddbd 384 serialPc.baud(115200);
dbrousse 0:129e8567ddbd 385 serialPc.attach(&receptionPc); // defini la fonction interruption
dbrousse 0:129e8567ddbd 386 panelLed1.setBrightness(1); // par défaut à 50%
dbrousse 1:538b13cb6699 387 //serialPc.printf("Entrer une commande\n");
dbrousse 0:129e8567ddbd 388 led01 = 1;
dbrousse 0:129e8567ddbd 389 // Clear buffer
dbrousse 0:129e8567ddbd 390 memset(&bufferRec[0], 0, sizeof(bufferRec));
dbrousse 0:129e8567ddbd 391
dbrousse 3:a3074e835b35 392 // Config Accelerometre
dbrousse 3:a3074e835b35 393 char dataLu[2];
dbrousse 3:a3074e835b35 394 dataLu[0]=0x20; // Registre CTRL1
dbrousse 3:a3074e835b35 395 dataLu[1]=0x67; // Accelero ON et data rate = 100Hz
dbrousse 3:a3074e835b35 396 i2cLsm303D.write(addrLsm303D, dataLu, 2);
dbrousse 3:a3074e835b35 397 dataLu[0]=0x26; // Registre CTRL7
dbrousse 3:a3074e835b35 398 dataLu[1]=0x82; // Accelero ON et data rate = 100Hz
dbrousse 3:a3074e835b35 399 i2cLsm303D.write(addrLsm303D, dataLu, 2);
dbrousse 3:a3074e835b35 400
wumzi 5:a81d551cfffa 401 // Gain moteurs
wumzi 5:a81d551cfffa 402 setMotorGainSpeed();
wumzi 5:a81d551cfffa 403
dbrousse 0:129e8567ddbd 404 while(1) {
dbrousse 0:129e8567ddbd 405 led01 = 0;
dbrousse 0:129e8567ddbd 406 wait(0.1);
dbrousse 0:129e8567ddbd 407 led01 = 1;
dbrousse 0:129e8567ddbd 408 wait(0.1);
dbrousse 3:a3074e835b35 409 valeurLux = mesureDeLux(); //mesure cyclique de luminosité
dbrousse 3:a3074e835b35 410 valeurAccX = mesureAcc(0x28);
dbrousse 3:a3074e835b35 411 valeurAccY = mesureAcc(0x2A);
dbrousse 3:a3074e835b35 412 valeurAccZ = mesureAcc(0x2C);
dbrousse 0:129e8567ddbd 413 }
dbrousse 0:129e8567ddbd 414 }