#include "TM4C123GH6PM.h" #include #include #include #include #include #define aX 0x3B #define gX 0x43 uint8_t ax1, ax2, ay1, ay2, az1, az2, te1, te2, gx1, gx2, gy1, gy2, gz1, gz2, mx1, mx2, my1, my2, mz1, mz2, p1, p2, p3, t1, t2 , t3; int codigo = 0, cont, cont2 = 0; uint16_t data[30]; float out; char gps[100]; void MPUsetup(); void HMCsetup(); void BMPsetup(); void tycosetup(); void transmissor(); void receptor(); void delay(unsigned long tempo) //Função delay cujo argumento encontra-se em milisegundos { unsigned long cont, constante; for(cont = 0; cont < tempo; cont++) { constante = 16000; while(constante > 0) { constante--; } } } int main() { i2cstart(400,16); delay(100); UART0_init(); UART1_init(); nrfstart('t'); HMCsetup(); MPUsetup(); delay(200); tycosetup(); while(1) { transmissor(); if(cont2 == 0) { GPIOF->DATA &= (~0x04); GPIOF->DATA |= 0x02; cont2 = 1; } else { GPIOF->DATA &= (~0x02); GPIOF->DATA |= 0x04; cont2 = 0; } //UART1_ReadString(gps,100); //delay(1000); //UART0_PrintString(gps); } } void HMCsetup() { i2cwrite(0x3C, 0x00, 0x03); //(endereço do escravo, Dado, START e RUN) i2cwrite(0x3C, 0x70, 0x05); //amostragem de 15Hz i2cwrite(0x3C,0x01, 0x03); //(endereço do escravo, Dado, START e RUN) i2cwrite(0x3C,0xA0, 0x05); //+-0.88Ga i2cwrite(0x3C,0x02, 0x03); //(endereço do escravo, Dado, START e RUN) i2cwrite(0x3C,0x00, 0x05); //modo de operação continua delay(10); } void MPUsetup() { i2cwrite(0xD0, 0x6B, 0x03); //(endereço do escravo, Dado, START e RUN) i2cwrite(0xD0, 0x00, 0x05); //clock interno, desabilita modo sleep delay(10); i2cwrite(0xD0, 0x1C, 0x03); //(endereço do escravo, Dado, START e RUN) i2cwrite(0xD0, 0x18, 0x05); //fundo de escala do acelerometro = 16g, self test desabilitado i2cwrite(0xD0, 0x1B, 0x03); //(endereço do escravo, Dado, START e RUN) i2cwrite(0xD0, 0x08, 0x05); //fundo de escala do giroscopio = 500°/s, self test desabilitado delay(10); } void BMPsetup() { i2cwrite(0xEA, 0xF4, 0x03); //(endereço do escravo, Dado, START e RUN) i2cwrite(0xEA, 0x27, 0x05); //modo de operação normal, sem oversampling i2cwrite(0xEA,0xF5, 0x03); //(endereço do escravo, Dado, START e RUN) i2cwrite(0xEA,0x22, 0x05); //amostragem de 15Hz, filter off, SPI desativado delay(10); } void tycosetup() { //UART1_PrintString("$PSRF101,,,,,,,,4*1C"); //UART1_PrintString("$PSRF104,-23,-51,,,,,,4*07\r\n"); UART1_PrintString("$PSRF100,4800,8,1,0*0C\r\n"); UART1_PrintString("$PSRF102,4800,8,1,0*12\r\n"); UART1_PrintString("$PSRF103,00,01,00,01*25\r\n"); } void transmissor() { i2cwrite(0xD0, 0x3B, 0x07); //Acessa o registrador ACELX-OUT //leitura do acelemetro ax1 = i2cread(0xD1, 0x0B); //(endereço do escravo, (START, ACK e RUN)) ax2 = i2cread(0xD1, 0x09); //(endereço do escravo, (ACK e RUN)) ay1 = i2cread(0xD1, 0x09); //(endereço do escravo, (ACK e RUN)) ay2 = i2cread(0xD1, 0x09); //(endereço do escravo, (ACK e RUN)) az1 = i2cread(0xD1, 0x09); //(endereço do escravo, (ACK e RUN)) az2 = i2cread(0xD1, 0x09); //(endereço do escravo, (STOP e RUN)) //leitura de temperatura te1 = i2cread(0xD1, 0x09); //(endereço do escravo, (START, ACK e RUN)) te2 = i2cread(0xD1, 0x09); //(endereço do escravo, (ACK e RUN)) //leitura do giroscopio gx1 = i2cread(0xD1, 0x09); //(endereço do escravo, (START, ACK e RUN)) gx2 = i2cread(0xD1, 0x09); //(endereço do escravo, (ACK e RUN)) gy1 = i2cread(0xD1, 0x09); //(endereço do escravo, (ACK e RUN)) gy2 = i2cread(0xD1, 0x09); //(endereço do escravo, (ACK e RUN)) gz1 = i2cread(0xD1, 0x09); //(endereço do escravo, (ACK e RUN)) gz2 = i2cread(0xD1, 0x05); //(endereço do escravo, (STOP e RUN)) //leitura do magnetometro i2cwrite(0x3C, 0x03, 0x07); //(endereço do escravo, Dado, (STOP, START e RUN)) mx1 = i2cread(0x3D, 0x0B); //(endereço do escravo, (START, ACK e RUN)) mx2 = i2cread(0x3D, 0x09); //(endereço do escravo, (ACK e RUN)) mz1 = i2cread(0x3D, 0x09); //(endereço do escravo, (ACK e RUN)) mz2 = i2cread(0x3D, 0x09); //(endereço do escravo, (ACK e RUN)) my1 = i2cread(0x3D, 0x09); //(endereço do escravo, (ACK e RUN)) my2 = i2cread(0x3D, 0x05); //(endereço do escravo, (STOP e RUN)) //leitura do barometro i2cwrite(0xEB, 0xF7, 0x07); //(endereço do escravo, Dado, (STOP, START e RUN)) p1 = i2cread(0xEB, 0x0B); //(endereço do escravo, (START, ACK e RUN)) p2 = i2cread(0xEB, 0x09); //(endereço do escravo, (ACK e RUN)) p3 = i2cread(0xEB, 0x09); //(endereço do escravo, (ACK e RUN)) t1 = i2cread(0xEB, 0x09); //(endereço do escravo, (ACK e RUN)) t2 = i2cread(0xEB, 0x09); //(endereço do escravo, (ACK e RUN)) t3 = i2cread(0xEB, 0x05); //(endereço do escravo, (STOP e RUN)) transmitt(0x12); delay(20); transmitt(0x23); delay(20); transmitt(0x4F); delay(20); transmitt(0x01); //acelerometro eixo X delay(200); transmitt(ax1); //acelerometro eixo X MSB delay(200); transmitt(ax2); //acelerometro eixo X LSB delay(200); transmitt(0x02); //acelerometro eixo Y delay(20); transmitt(ay1); //acelerometro eixo Y MSB delay(20); transmitt(ay2); //acelerometro eixo Y LSB delay(200); transmitt(0x03); //acelerometro eixo Z delay(20); transmitt(az1); //acelerometro eixo Z MSB delay(20); transmitt(az2); //acelerometro eixo Z LSB delay(200); transmitt(0x04); //temperatura delay(20); transmitt(te1); //temperatura MSB delay(20); transmitt(te2); //temperatura LSB delay(200); transmitt(0x05); //giroscopio eixo X delay(20); transmitt(gx1); //giroscopio eixo X MSB delay(20); transmitt(gx2); //giroscopio eixo X LSB delay(200); transmitt(0x06); //giroscopio eixo Y delay(20); transmitt(gy1); //giroscopio eixo Y MSB delay(20); transmitt(gy2); //giroscopio eixo Y LSB delay(200); transmitt(0x07); //giroscopio eixo Z delay(20); transmitt(gz1); //giroscopio eixo Z MSB delay(20); transmitt(gz2); //giroscopio eixo Z LSB delay(200); transmitt(0x08); //giroscopio eixo Z delay(20); transmitt(mx1); //giroscopio eixo Z MSB delay(20); transmitt(mx2); //giroscopio eixo Z LSB delay(200); transmitt(0x09); //giroscopio eixo Z delay(20); transmitt(my1); //giroscopio eixo Z MSB delay(20); transmitt(my2); //giroscopio eixo Z LSB delay(200); transmitt(0x0A); //giroscopio eixo Z delay(20); transmitt(mz1); //giroscopio eixo Z MSB delay(20); transmitt(mz2); //giroscopio eixo Z LSB delay(200); transmitt(0x0B); //pressão delay(20); transmitt(p1); //pressão MSB delay(20); transmitt(p2); //pressão LSB transmitt(0x0C); //temperatura delay(20); transmitt(t1); //temperatura MSB delay(20); transmitt(t2); //temperatura LSB } void receptor() { codigo = 0; codigo = receive(); if(codigo == 0X12) { while(receive() != 0X23); while(receive() != 0X4F); cont = 0; while(cont < 30) { codigo = receive(); if(codigo != -1) { data[cont] = codigo; cont++; } } for(cont = 0; cont < 30; cont++) { UART0_PrintDec(data[cont]); linha(); } UART0_PrintString("Aceleração eixo X: "); out = ((((data[1]<<8)&(0x7F00)) + (data[2] & 0x00FF)) - ((data[1]<<8)&(0x8000)))*0.00488281; UART0_PrintFloat(out,5); linha(); UART0_PrintString("Aceleração eixo Y: "); out = ((((data[4]<<8)&(0x7F00)) + (data[5] & 0x00FF)) - ((data[4]<<8)&(0x8000)))*0.00488281; UART0_PrintFloat(out,5); linha(); UART0_PrintString("Aceleração eixo Z: "); out = ((((data[7]<<8)&(0x7F00)) + (data[8] & 0x00FF)) - ((data[7]<<8)&(0x8000)))*0.00488281; UART0_PrintFloat(out,5); linha(); UART0_PrintString("Temperatura: "); out = ((((data[10]<<8)&(0x7F00)) + (data[11] & 0x00FF)) - ((data[10]<<8)&(0x8000)))/340 + 36.53; UART0_PrintFloat(out,5); linha(); UART0_PrintString("rotacao eixo X: "); out = ((((data[13]<<8)&(0x7F00)) + (data[14] & 0x00FF)) - ((data[13]<<8)&(0x8000)))*0.015259; UART0_PrintFloat(out,5); linha(); UART0_PrintString("rotacao eixo Y: "); out = ((((data[16]<<8)&(0x7F00)) + (data[17] & 0x00FF)) - ((data[16]<<8)&(0x8000)))*0.015259; UART0_PrintFloat(out,5); linha(); UART0_PrintString("rotacao eixo Z: "); out = ((((data[19]<<8)&(0x7F00)) + (data[20] & 0x00FF)) - ((data[19]<<8)&(0x8000)))*0.015259; UART0_PrintFloat(out,5); linha(); UART0_PrintString("magnetometro eixo X: "); out = ((((data[22]<<8)&(0x7F00)) + (data[23] & 0x00FF)) - ((data[22]<<8)&(0x8000)))*2.56; UART0_PrintFloat(out,5); linha(); UART0_PrintString("magnetometro eixo Y: "); out = ((((data[25]<<8)&(0x7F00)) + (data[26] & 0x00FF)) - ((data[25]<<8)&(0x8000)))*2.56; UART0_PrintFloat(out,5); linha(); UART0_PrintString("magnetometro eixo Z: "); out = ((((data[28]<<8)&(0x7F00)) + (data[29] & 0x00FF)) - ((data[28]<<8)&(0x8000)))*2.56; UART0_PrintFloat(out,5); linha(); UART0_PrintString("OK"); linha(); linha(); } }