Marcelo Costanzo Miranda
/
COntrole_nextion_F103
Controle de traçao com interface nextion
main.cpp@0:7dfaf751d942, 2018-05-16 (annotated)
- Committer:
- Marcelocostanzo
- Date:
- Wed May 16 19:49:21 2018 +0000
- Revision:
- 0:7dfaf751d942
funcioanndo
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Marcelocostanzo | 0:7dfaf751d942 | 1 | #include "mbed.h" |
Marcelocostanzo | 0:7dfaf751d942 | 2 | #include "reScale.h" |
Marcelocostanzo | 0:7dfaf751d942 | 3 | |
Marcelocostanzo | 0:7dfaf751d942 | 4 | #define tole_min 10 //tolerancia minima em km/h de destracionamento |
Marcelocostanzo | 0:7dfaf751d942 | 5 | #define tole_max 60 //tolerancia maxima em km/h de destracionamento |
Marcelocostanzo | 0:7dfaf751d942 | 6 | #define ndentes 60 //numero de dentes do sensor |
Marcelocostanzo | 0:7dfaf751d942 | 7 | |
Marcelocostanzo | 0:7dfaf751d942 | 8 | InterruptIn motora(D2); |
Marcelocostanzo | 0:7dfaf751d942 | 9 | InterruptIn movida(D3); |
Marcelocostanzo | 0:7dfaf751d942 | 10 | |
Marcelocostanzo | 0:7dfaf751d942 | 11 | DigitalOut ign(LED2); |
Marcelocostanzo | 0:7dfaf751d942 | 12 | |
Marcelocostanzo | 0:7dfaf751d942 | 13 | PwmOut boost(D9); |
Marcelocostanzo | 0:7dfaf751d942 | 14 | |
Marcelocostanzo | 0:7dfaf751d942 | 15 | Timer t1; |
Marcelocostanzo | 0:7dfaf751d942 | 16 | Timer t2; |
Marcelocostanzo | 0:7dfaf751d942 | 17 | Ticker flipper; |
Marcelocostanzo | 0:7dfaf751d942 | 18 | |
Marcelocostanzo | 0:7dfaf751d942 | 19 | //Serial pc(USBTX, USBRX); // tx, rx |
Marcelocostanzo | 0:7dfaf751d942 | 20 | Serial device(PC_10, PC_11); // tx, rx |
Marcelocostanzo | 0:7dfaf751d942 | 21 | |
Marcelocostanzo | 0:7dfaf751d942 | 22 | reScale deltapwm(tole_min,tole_max,0.0,1.0); //para escalar o destracionamento em pwm para solenoide da turbina |
Marcelocostanzo | 0:7dfaf751d942 | 23 | reScale velogauge1(45,260,0,1.0); |
Marcelocostanzo | 0:7dfaf751d942 | 24 | reScale velogauge2(tole_min,tole_max,0.0,1.0); |
Marcelocostanzo | 0:7dfaf751d942 | 25 | |
Marcelocostanzo | 0:7dfaf751d942 | 26 | //ORGANIZAR AS VARIAVEIS, GLOBAIS PARA POSSIVEIS LOCAIS |
Marcelocostanzo | 0:7dfaf751d942 | 27 | //----------variaveis globais------------------------------------------------- |
Marcelocostanzo | 0:7dfaf751d942 | 28 | float t_motora=0, t_movida=0, pneu_largura,pneu_perfil,pneu_aro, pwmturbo=0, t_movidabkp, t_motorabkp; |
Marcelocostanzo | 0:7dfaf751d942 | 29 | float perimetro_movida, perimetro_motora, raio_dinamico, delta=0, vel_movida=0, vel_motora=0; |
Marcelocostanzo | 0:7dfaf751d942 | 30 | char command[17], i=0, X = 255; |
Marcelocostanzo | 0:7dfaf751d942 | 31 | uint16_t val1, val16, val256, val4096, veluint; |
Marcelocostanzo | 0:7dfaf751d942 | 32 | bool flag=0, flagbff; |
Marcelocostanzo | 0:7dfaf751d942 | 33 | |
Marcelocostanzo | 0:7dfaf751d942 | 34 | |
Marcelocostanzo | 0:7dfaf751d942 | 35 | void livre()//rotina de input capture para a roda movida |
Marcelocostanzo | 0:7dfaf751d942 | 36 | { |
Marcelocostanzo | 0:7dfaf751d942 | 37 | t2.stop(); |
Marcelocostanzo | 0:7dfaf751d942 | 38 | t_movida = t2.read_us(); |
Marcelocostanzo | 0:7dfaf751d942 | 39 | t2.reset(); |
Marcelocostanzo | 0:7dfaf751d942 | 40 | t2.start(); |
Marcelocostanzo | 0:7dfaf751d942 | 41 | } |
Marcelocostanzo | 0:7dfaf751d942 | 42 | |
Marcelocostanzo | 0:7dfaf751d942 | 43 | void tracao() //rotina de input capture para a roda motora |
Marcelocostanzo | 0:7dfaf751d942 | 44 | { |
Marcelocostanzo | 0:7dfaf751d942 | 45 | t1.stop(); |
Marcelocostanzo | 0:7dfaf751d942 | 46 | t_motora = t1.read_us(); |
Marcelocostanzo | 0:7dfaf751d942 | 47 | t1.reset(); |
Marcelocostanzo | 0:7dfaf751d942 | 48 | t1.start(); |
Marcelocostanzo | 0:7dfaf751d942 | 49 | } |
Marcelocostanzo | 0:7dfaf751d942 | 50 | |
Marcelocostanzo | 0:7dfaf751d942 | 51 | void flip() //time para envio das infos pela serial |
Marcelocostanzo | 0:7dfaf751d942 | 52 | { |
Marcelocostanzo | 0:7dfaf751d942 | 53 | flag=!flag; |
Marcelocostanzo | 0:7dfaf751d942 | 54 | } |
Marcelocostanzo | 0:7dfaf751d942 | 55 | |
Marcelocostanzo | 0:7dfaf751d942 | 56 | void flushSerialBuffer(void) //rotina para limpar o buffer da serial |
Marcelocostanzo | 0:7dfaf751d942 | 57 | { |
Marcelocostanzo | 0:7dfaf751d942 | 58 | char char1 = 0; |
Marcelocostanzo | 0:7dfaf751d942 | 59 | while (device.readable()) |
Marcelocostanzo | 0:7dfaf751d942 | 60 | { |
Marcelocostanzo | 0:7dfaf751d942 | 61 | char1 = device.getc(); |
Marcelocostanzo | 0:7dfaf751d942 | 62 | } return; |
Marcelocostanzo | 0:7dfaf751d942 | 63 | } |
Marcelocostanzo | 0:7dfaf751d942 | 64 | |
Marcelocostanzo | 0:7dfaf751d942 | 65 | int main() |
Marcelocostanzo | 0:7dfaf751d942 | 66 | { |
Marcelocostanzo | 0:7dfaf751d942 | 67 | device.baud(115200); |
Marcelocostanzo | 0:7dfaf751d942 | 68 | wait(1.0); |
Marcelocostanzo | 0:7dfaf751d942 | 69 | |
Marcelocostanzo | 0:7dfaf751d942 | 70 | flushSerialBuffer(); |
Marcelocostanzo | 0:7dfaf751d942 | 71 | |
Marcelocostanzo | 0:7dfaf751d942 | 72 | motora.fall(&tracao); //habilita a interrupt de borda de descida para a roda motora |
Marcelocostanzo | 0:7dfaf751d942 | 73 | movida.fall(&livre); //habilita a interrupt de borda de descida para a roda movida |
Marcelocostanzo | 0:7dfaf751d942 | 74 | flipper.attach(&flip, 0.1); //habilita a interrupt que ocorre a 10Hz para envio das infos |
Marcelocostanzo | 0:7dfaf751d942 | 75 | |
Marcelocostanzo | 0:7dfaf751d942 | 76 | boost.period(0.05f); //set da frequencia do pwm para 20Hz |
Marcelocostanzo | 0:7dfaf751d942 | 77 | |
Marcelocostanzo | 0:7dfaf751d942 | 78 | while(1) |
Marcelocostanzo | 0:7dfaf751d942 | 79 | { |
Marcelocostanzo | 0:7dfaf751d942 | 80 | if(device.readable()) //verifica se há algo no buffer da serial |
Marcelocostanzo | 0:7dfaf751d942 | 81 | { |
Marcelocostanzo | 0:7dfaf751d942 | 82 | flipper.detach(); //desabilita o envio das infos |
Marcelocostanzo | 0:7dfaf751d942 | 83 | ign = !ign; //troca o estado do led, fins de depuração |
Marcelocostanzo | 0:7dfaf751d942 | 84 | for(i=0;i<17;i++) //le os 17 caracteres na serial |
Marcelocostanzo | 0:7dfaf751d942 | 85 | { |
Marcelocostanzo | 0:7dfaf751d942 | 86 | command[i]=device.getc(); |
Marcelocostanzo | 0:7dfaf751d942 | 87 | } |
Marcelocostanzo | 0:7dfaf751d942 | 88 | |
Marcelocostanzo | 0:7dfaf751d942 | 89 | if(command[1]==0x03) //caso a pagina 3 seja lida, motora |
Marcelocostanzo | 0:7dfaf751d942 | 90 | { |
Marcelocostanzo | 0:7dfaf751d942 | 91 | val1 = command[6]<<8; |
Marcelocostanzo | 0:7dfaf751d942 | 92 | val16 = command[5]; |
Marcelocostanzo | 0:7dfaf751d942 | 93 | pneu_largura = val1 + val16;//calcula a largura do pneu |
Marcelocostanzo | 0:7dfaf751d942 | 94 | |
Marcelocostanzo | 0:7dfaf751d942 | 95 | val1 = command[10]<<8; |
Marcelocostanzo | 0:7dfaf751d942 | 96 | val16 = command[9]; |
Marcelocostanzo | 0:7dfaf751d942 | 97 | pneu_perfil = val1 + val16;//calcula o perfil do pneu |
Marcelocostanzo | 0:7dfaf751d942 | 98 | |
Marcelocostanzo | 0:7dfaf751d942 | 99 | val1 = command[14]<<8; |
Marcelocostanzo | 0:7dfaf751d942 | 100 | val16 = command[13]; |
Marcelocostanzo | 0:7dfaf751d942 | 101 | pneu_aro = val1 + val16;//calcula o aro do pneu |
Marcelocostanzo | 0:7dfaf751d942 | 102 | |
Marcelocostanzo | 0:7dfaf751d942 | 103 | //a seguir calcula o perimetro em metros da roda motora |
Marcelocostanzo | 0:7dfaf751d942 | 104 | pneu_perfil = pneu_perfil / 100; |
Marcelocostanzo | 0:7dfaf751d942 | 105 | raio_dinamico = pneu_largura * pneu_perfil; |
Marcelocostanzo | 0:7dfaf751d942 | 106 | pneu_aro = pneu_aro * 25.4; |
Marcelocostanzo | 0:7dfaf751d942 | 107 | raio_dinamico = raio_dinamico + pneu_aro; |
Marcelocostanzo | 0:7dfaf751d942 | 108 | perimetro_motora = raio_dinamico * 3.14; //resultado em milimetros |
Marcelocostanzo | 0:7dfaf751d942 | 109 | perimetro_motora = perimetro_motora / 1000; //converter em metros |
Marcelocostanzo | 0:7dfaf751d942 | 110 | } |
Marcelocostanzo | 0:7dfaf751d942 | 111 | |
Marcelocostanzo | 0:7dfaf751d942 | 112 | if(command[1]==0x04)//caso a pagina 3 seja lida, movida |
Marcelocostanzo | 0:7dfaf751d942 | 113 | { |
Marcelocostanzo | 0:7dfaf751d942 | 114 | val1 = command[6]<<8; |
Marcelocostanzo | 0:7dfaf751d942 | 115 | val16 = command[5]; |
Marcelocostanzo | 0:7dfaf751d942 | 116 | pneu_largura = val1 + val16;//calcula a largura do pneu |
Marcelocostanzo | 0:7dfaf751d942 | 117 | |
Marcelocostanzo | 0:7dfaf751d942 | 118 | val1 = command[10]<<8; |
Marcelocostanzo | 0:7dfaf751d942 | 119 | val16 = command[9]; |
Marcelocostanzo | 0:7dfaf751d942 | 120 | pneu_perfil = val1 + val16;//calcula o perfil do pneu |
Marcelocostanzo | 0:7dfaf751d942 | 121 | |
Marcelocostanzo | 0:7dfaf751d942 | 122 | val1 = command[14]<<8; |
Marcelocostanzo | 0:7dfaf751d942 | 123 | val16 = command[13]; |
Marcelocostanzo | 0:7dfaf751d942 | 124 | pneu_aro = val1 + val16;//calcula o aro do pneu |
Marcelocostanzo | 0:7dfaf751d942 | 125 | |
Marcelocostanzo | 0:7dfaf751d942 | 126 | //a seguir calcula o perimetro em metros da roda movida |
Marcelocostanzo | 0:7dfaf751d942 | 127 | pneu_perfil = pneu_perfil / 100; |
Marcelocostanzo | 0:7dfaf751d942 | 128 | raio_dinamico = pneu_largura * pneu_perfil; |
Marcelocostanzo | 0:7dfaf751d942 | 129 | pneu_aro = pneu_aro * 25.4; |
Marcelocostanzo | 0:7dfaf751d942 | 130 | raio_dinamico = raio_dinamico + pneu_aro; |
Marcelocostanzo | 0:7dfaf751d942 | 131 | perimetro_movida = raio_dinamico * 3.14; //resultado em milimetros |
Marcelocostanzo | 0:7dfaf751d942 | 132 | perimetro_movida = perimetro_movida / 1000; //converter em metros |
Marcelocostanzo | 0:7dfaf751d942 | 133 | } |
Marcelocostanzo | 0:7dfaf751d942 | 134 | flipper.attach(&flip, 0.1); //habilita o envio das infos |
Marcelocostanzo | 0:7dfaf751d942 | 135 | } |
Marcelocostanzo | 0:7dfaf751d942 | 136 | |
Marcelocostanzo | 0:7dfaf751d942 | 137 | //para garantir que ao parar de receber pulsos, a tela não fique mostrando a ultima velocidade |
Marcelocostanzo | 0:7dfaf751d942 | 138 | if(t_motora > 350000) |
Marcelocostanzo | 0:7dfaf751d942 | 139 | t_motora = 0; |
Marcelocostanzo | 0:7dfaf751d942 | 140 | |
Marcelocostanzo | 0:7dfaf751d942 | 141 | //para garantir que ao parar de receber pulsos, a tela não fique mostrando a ultima velocidade |
Marcelocostanzo | 0:7dfaf751d942 | 142 | if(t_movida > 350000) |
Marcelocostanzo | 0:7dfaf751d942 | 143 | t_movida = 0; |
Marcelocostanzo | 0:7dfaf751d942 | 144 | |
Marcelocostanzo | 0:7dfaf751d942 | 145 | //calcula a velocidade da roda motora |
Marcelocostanzo | 0:7dfaf751d942 | 146 | t_motorabkp = t_motora; |
Marcelocostanzo | 0:7dfaf751d942 | 147 | t_motorabkp = t_motorabkp * ndentes; |
Marcelocostanzo | 0:7dfaf751d942 | 148 | t_motorabkp = t_motorabkp / 1000000; |
Marcelocostanzo | 0:7dfaf751d942 | 149 | vel_motora = perimetro_motora / t_motorabkp; |
Marcelocostanzo | 0:7dfaf751d942 | 150 | vel_motora = vel_motora * 3.6;// m/s para km/h |
Marcelocostanzo | 0:7dfaf751d942 | 151 | |
Marcelocostanzo | 0:7dfaf751d942 | 152 | //calcula a velocidade da roda movida |
Marcelocostanzo | 0:7dfaf751d942 | 153 | t_movidabkp = t_movida; |
Marcelocostanzo | 0:7dfaf751d942 | 154 | t_movidabkp = t_movidabkp * ndentes; |
Marcelocostanzo | 0:7dfaf751d942 | 155 | t_movidabkp = t_movidabkp / 1000000; |
Marcelocostanzo | 0:7dfaf751d942 | 156 | vel_movida = perimetro_movida / t_movidabkp; |
Marcelocostanzo | 0:7dfaf751d942 | 157 | vel_movida = vel_movida * 3.6;// m/s para km/h |
Marcelocostanzo | 0:7dfaf751d942 | 158 | |
Marcelocostanzo | 0:7dfaf751d942 | 159 | |
Marcelocostanzo | 0:7dfaf751d942 | 160 | delta = vel_motora - vel_movida;// calcula o quanto o veiculo esta destracionando |
Marcelocostanzo | 0:7dfaf751d942 | 161 | |
Marcelocostanzo | 0:7dfaf751d942 | 162 | if(delta<=0) //garante que não exista valores negativos de destracionamento |
Marcelocostanzo | 0:7dfaf751d942 | 163 | { |
Marcelocostanzo | 0:7dfaf751d942 | 164 | delta=0; |
Marcelocostanzo | 0:7dfaf751d942 | 165 | } |
Marcelocostanzo | 0:7dfaf751d942 | 166 | |
Marcelocostanzo | 0:7dfaf751d942 | 167 | pwmturbo = deltapwm.from(delta); //escala o valor de destracionamento para o pwm da solenoide |
Marcelocostanzo | 0:7dfaf751d942 | 168 | |
Marcelocostanzo | 0:7dfaf751d942 | 169 | if(pwmturbo<=0) //garante que não exista valores negativos de pwm |
Marcelocostanzo | 0:7dfaf751d942 | 170 | { |
Marcelocostanzo | 0:7dfaf751d942 | 171 | pwmturbo = 0; |
Marcelocostanzo | 0:7dfaf751d942 | 172 | } |
Marcelocostanzo | 0:7dfaf751d942 | 173 | |
Marcelocostanzo | 0:7dfaf751d942 | 174 | boost.write(pwmturbo); //set do duty cycle 0.0 - 1.0, valor float |
Marcelocostanzo | 0:7dfaf751d942 | 175 | pwmturbo = pwmturbo * 100; //apos o uso da variavel, converto em porcentagem para exibir no display |
Marcelocostanzo | 0:7dfaf751d942 | 176 | |
Marcelocostanzo | 0:7dfaf751d942 | 177 | if(flag==1) //caso tenha passado 100mS, envia as infos |
Marcelocostanzo | 0:7dfaf751d942 | 178 | { |
Marcelocostanzo | 0:7dfaf751d942 | 179 | if(pwmturbo>=1)//troca a cor do icone no display para vermelho |
Marcelocostanzo | 0:7dfaf751d942 | 180 | { |
Marcelocostanzo | 0:7dfaf751d942 | 181 | device.printf("vis p0,1"); |
Marcelocostanzo | 0:7dfaf751d942 | 182 | device.printf("%c%c%c",X,X,X); |
Marcelocostanzo | 0:7dfaf751d942 | 183 | } |
Marcelocostanzo | 0:7dfaf751d942 | 184 | else //troca a cor do icone no display para verde |
Marcelocostanzo | 0:7dfaf751d942 | 185 | { |
Marcelocostanzo | 0:7dfaf751d942 | 186 | device.printf("vis p1,1"); |
Marcelocostanzo | 0:7dfaf751d942 | 187 | device.printf("%c%c%c",X,X,X); |
Marcelocostanzo | 0:7dfaf751d942 | 188 | } |
Marcelocostanzo | 0:7dfaf751d942 | 189 | device.printf("n0.val=%.f",vel_movida); |
Marcelocostanzo | 0:7dfaf751d942 | 190 | device.printf("%c%c%c",X,X,X); |
Marcelocostanzo | 0:7dfaf751d942 | 191 | device.printf("n1.val=%.f",delta); |
Marcelocostanzo | 0:7dfaf751d942 | 192 | device.printf("%c%c%c",X,X,X); |
Marcelocostanzo | 0:7dfaf751d942 | 193 | device.printf("n8.val=%.f",pwmturbo); |
Marcelocostanzo | 0:7dfaf751d942 | 194 | device.printf("%c%c%c",X,X,X); //caracter para fim de info, necessario para o display receber a info |
Marcelocostanzo | 0:7dfaf751d942 | 195 | flag=0; |
Marcelocostanzo | 0:7dfaf751d942 | 196 | } |
Marcelocostanzo | 0:7dfaf751d942 | 197 | } |
Marcelocostanzo | 0:7dfaf751d942 | 198 | } |