Electronica / Mbed OS Proyecto2

Dependencies:   Adafruit_GFX

Committer:
aitor01
Date:
Thu Dec 16 15:01:29 2021 +0000
Revision:
4:7f4d81ed3984
Parent:
3:3fbadf6c492f
Child:
5:faf450e9aab0
Reduce velocidad en la vuelta del avance

Who changed what in which revision?

UserRevisionLine numberNew contents of line
agat 0:e3755f5769fe 1 #include "mbed.h"
agat 0:e3755f5769fe 2 #include "math.h"
agat 2:fd3b989cedcd 3 #include "Adafruit_SSD1306.h"
agat 2:fd3b989cedcd 4
agat 0:e3755f5769fe 5 //#include "hcsr04.h"
agat 2:fd3b989cedcd 6 class I2CPreInit : public I2C
agat 2:fd3b989cedcd 7 {
agat 2:fd3b989cedcd 8 public:
agat 2:fd3b989cedcd 9 I2CPreInit(PinName sda, PinName scl) : I2C(sda, scl)
agat 2:fd3b989cedcd 10 {
agat 2:fd3b989cedcd 11 frequency(100000);
agat 2:fd3b989cedcd 12 start();
agat 2:fd3b989cedcd 13 };
agat 2:fd3b989cedcd 14 };
agat 2:fd3b989cedcd 15
agat 2:fd3b989cedcd 16 I2CPreInit gI2C(PB_9,PB_8);
agat 2:fd3b989cedcd 17
agat 2:fd3b989cedcd 18 // an SPI sub-class that provides a constructed default
agat 2:fd3b989cedcd 19
agat 2:fd3b989cedcd 20 Adafruit_SSD1306_I2c gOled(gI2C,NC,0x78,64,128);
agat 0:e3755f5769fe 21 Serial pc(USBTX, USBRX); // tx, rx
agat 0:e3755f5769fe 22 Ticker tickerMideDistancia;
aitor01 1:1d515eb7abf3 23 Ticker visualTemp;
agat 0:e3755f5769fe 24 unsigned distancia=1000;
agat 0:e3755f5769fe 25
aitor01 1:1d515eb7abf3 26 AnalogIn senal(A0);
agat 0:e3755f5769fe 27 DigitalIn final1(D9);
agat 0:e3755f5769fe 28 DigitalIn final2(D10);
agat 0:e3755f5769fe 29 DigitalOut step(D2);
agat 0:e3755f5769fe 30 DigitalOut dir(A4);
agat 0:e3755f5769fe 31 DigitalOut enableMotor(D11);
agat 0:e3755f5769fe 32 DigitalIn boton_inicial(D3);
aitor01 3:3fbadf6c492f 33 DigitalIn boton_emergencia(D7);
aitor01 1:1d515eb7abf3 34 DigitalOut dirAMotor(D4);//M121
aitor01 1:1d515eb7abf3 35 PwmOut dirBMotor(D5);//M121
aitor01 1:1d515eb7abf3 36 DigitalOut rele(D6);//Rcal
aitor01 3:3fbadf6c492f 37 InterruptIn encoderA(A2);
aitor01 1:1d515eb7abf3 38
aitor01 1:1d515eb7abf3 39 Timer t;
aitor01 3:3fbadf6c492f 40 Timer bot;
aitor01 4:7f4d81ed3984 41 Timer timerVel;
aitor01 3:3fbadf6c492f 42 //Ticker tickerVel;
aitor01 4:7f4d81ed3984 43 float velocidad=0;
aitor01 1:1d515eb7abf3 44
aitor01 1:1d515eb7abf3 45 float temperatura;
aitor01 3:3fbadf6c492f 46 int contador=0;
aitor01 4:7f4d81ed3984 47 float velocidad_relativa=0.0;
aitor01 3:3fbadf6c492f 48 //int target=75; Para el control de velocidad
aitor01 1:1d515eb7abf3 49
aitor01 3:3fbadf6c492f 50 void encoderAIrq()// contador de vueltas
aitor01 3:3fbadf6c492f 51 {
aitor01 3:3fbadf6c492f 52 contador++;
aitor01 3:3fbadf6c492f 53 }
aitor01 3:3fbadf6c492f 54
aitor01 3:3fbadf6c492f 55 enum estados {reset, apagado, motorpalante,atras, estatico, emergencia };
agat 0:e3755f5769fe 56 estados estado;
agat 0:e3755f5769fe 57
agat 0:e3755f5769fe 58 //HCSR04 usensor(D7,D8); //(PinName TrigPin,PinName EchoPin):
agat 0:e3755f5769fe 59 void paso(int d)
agat 0:e3755f5769fe 60 {
agat 0:e3755f5769fe 61 dir=d;
agat 0:e3755f5769fe 62 step=1;
agat 0:e3755f5769fe 63 wait_us(100);
agat 0:e3755f5769fe 64 step=0;
agat 0:e3755f5769fe 65 wait_us(900);
agat 0:e3755f5769fe 66 }
aitor01 4:7f4d81ed3984 67 void estadoreset()// estado de seguridad, si el taladro esta situado en un sitio que no sea uno de los 2 finales de carrera, retrocederá hasta el principio dejandolo en el estado de apagado.
agat 0:e3755f5769fe 68 {
agat 0:e3755f5769fe 69 if (final1!=1) {
aitor01 1:1d515eb7abf3 70 enableMotor=1;
agat 0:e3755f5769fe 71 paso(0);
aitor01 4:7f4d81ed3984 72 } else if (final1 ==1) {// Una vez pisa el final de carrera 1 habilita un mensaje en pantalla dando el valor de la temperatura del motor del taladro y la velocidad del mismo en RPM.
aitor01 3:3fbadf6c492f 73 gOled.clearDisplay();
aitor01 3:3fbadf6c492f 74 gOled.printf("La temperatura es de %.4f\n",temperatura);
aitor01 4:7f4d81ed3984 75 gOled.printf("La velocidad en rpm es de %.4f\r\n",velocidad);
aitor01 3:3fbadf6c492f 76 gOled.display();
aitor01 3:3fbadf6c492f 77 gOled.setTextCursor(0,0);
agat 0:e3755f5769fe 78 estado = apagado;
agat 0:e3755f5769fe 79 enableMotor =0;
agat 0:e3755f5769fe 80 }
agat 0:e3755f5769fe 81 }
aitor01 4:7f4d81ed3984 82 void estadoapagado()// Estado "inicial" en el que pulsando el boton de inicio comenzará su avance para iniciar la perforación.
agat 0:e3755f5769fe 83 {
aitor01 3:3fbadf6c492f 84 dirBMotor =0;
aitor01 3:3fbadf6c492f 85
agat 0:e3755f5769fe 86 if (boton_inicial==1) {
agat 0:e3755f5769fe 87 enableMotor=1;
aitor01 3:3fbadf6c492f 88 t.reset();
aitor01 1:1d515eb7abf3 89 estado= motorpalante;
agat 0:e3755f5769fe 90 }
agat 0:e3755f5769fe 91 }
aitor01 4:7f4d81ed3984 92 void estadomotorpalante()// estado que hace funcionar el avance, el motor taladra a la vez que perfora.
aitor01 1:1d515eb7abf3 93 {
aitor01 4:7f4d81ed3984 94 if (boton_emergencia==1 || temperatura>80) {//es el boton de emergencia y de temperatura, en caso de pulsar la seta de emergencia y que la temperatura supere el valor de 80º, se parará automaticamente.
aitor01 3:3fbadf6c492f 95 estado=emergencia;
aitor01 3:3fbadf6c492f 96 }
aitor01 1:1d515eb7abf3 97 if (boton_inicial==0&&final2==0) {
aitor01 1:1d515eb7abf3 98 paso(1);
aitor01 3:3fbadf6c492f 99 dirBMotor=1;
aitor01 1:1d515eb7abf3 100 rele =1;
aitor01 1:1d515eb7abf3 101 } else if (final2==1) {
aitor01 1:1d515eb7abf3 102 int tiempo=t.read();
agat 2:fd3b989cedcd 103 //pc.printf("La temperatura es de %.4f\n",temperatura);
agat 2:fd3b989cedcd 104 gOled.clearDisplay();
agat 2:fd3b989cedcd 105 gOled.printf("La temperatura es de %.4f\n",temperatura);
aitor01 4:7f4d81ed3984 106 gOled.printf("La velocidad en rpm es de %f\r\n",velocidad);
agat 2:fd3b989cedcd 107 gOled.display();
agat 2:fd3b989cedcd 108 gOled.setTextCursor(0,0);
aitor01 3:3fbadf6c492f 109
aitor01 3:3fbadf6c492f 110 // pc.printf("El tiempo transcurrido es de %d\n",tiempo);
agat 2:fd3b989cedcd 111 //pc.printf("La temperatura es de %.4f\n",temperatura);
aitor01 1:1d515eb7abf3 112 //dirAMotor=0;
aitor01 1:1d515eb7abf3 113 wait(2.0);
aitor01 1:1d515eb7abf3 114 //enableMotor=0;
aitor01 1:1d515eb7abf3 115 //rele=0;
agat 2:fd3b989cedcd 116 //if (final2==1) {
aitor01 3:3fbadf6c492f 117 estado=atras;
agat 2:fd3b989cedcd 118 //}
aitor01 1:1d515eb7abf3 119 //Print en pantalla con el Oled.
aitor01 3:3fbadf6c492f 120 } else if (final2!=1 && boton_inicial==1 && final1!=1) {
aitor01 3:3fbadf6c492f 121 enableMotor=0;
aitor01 3:3fbadf6c492f 122 rele=0;
aitor01 3:3fbadf6c492f 123 dirBMotor=1;//Esto hay que cambiarlo
aitor01 3:3fbadf6c492f 124 estado= estatico;
aitor01 3:3fbadf6c492f 125 bot.reset();
aitor01 1:1d515eb7abf3 126 }
agat 0:e3755f5769fe 127 }
agat 0:e3755f5769fe 128
aitor01 1:1d515eb7abf3 129 void estadoatras()
aitor01 1:1d515eb7abf3 130 {
aitor01 4:7f4d81ed3984 131 if (boton_emergencia==1 || temperatura>80) {//es el boton de emergencia y de temperatura, en caso de pulsar la seta de emergencia y que la temperatura supere el valor de 80º, se parará automaticamente.
aitor01 3:3fbadf6c492f 132 estado=emergencia;
aitor01 3:3fbadf6c492f 133 }
aitor01 4:7f4d81ed3984 134 if (final2!=1 && boton_inicial==1 && final1!=1) {// si se pulsa el boton de inicio, el avance dejara de funcionar pero el motor seguirá funcionando
aitor01 1:1d515eb7abf3 135 enableMotor=0;
aitor01 1:1d515eb7abf3 136 rele=0;
aitor01 4:7f4d81ed3984 137 dirBMotor=1;
aitor01 3:3fbadf6c492f 138 bot.reset();
aitor01 1:1d515eb7abf3 139 estado= estatico;
aitor01 4:7f4d81ed3984 140 } else if (final1 ==1) {//si pisa el final de carrera 1, el motor irá hacia delante dirección final carrera 2
aitor01 1:1d515eb7abf3 141 estado = motorpalante;
aitor01 1:1d515eb7abf3 142 } else {
aitor01 4:7f4d81ed3984 143 paso(0);//Va hacia la otra dirección
aitor01 1:1d515eb7abf3 144 }
aitor01 3:3fbadf6c492f 145
aitor01 1:1d515eb7abf3 146 }
aitor01 3:3fbadf6c492f 147 void estadoestatico()
aitor01 3:3fbadf6c492f 148 {
aitor01 4:7f4d81ed3984 149 if (boton_emergencia==1 || temperatura>80) {//es el boton de emergencia y de temperatura, en caso de pulsar la seta de emergencia y que la temperatura supere el valor de 80º, se parará automaticamente.
aitor01 3:3fbadf6c492f 150 estado=emergencia;
aitor01 3:3fbadf6c492f 151 }
aitor01 3:3fbadf6c492f 152 if (boton_inicial ==0 ) {
aitor01 3:3fbadf6c492f 153 wait(0.5);
aitor01 3:3fbadf6c492f 154 //estado = apagado;
agat 0:e3755f5769fe 155
aitor01 3:3fbadf6c492f 156 } else if (boton_inicial==1 && bot>1) {
aitor01 3:3fbadf6c492f 157 dirBMotor=0;
aitor01 3:3fbadf6c492f 158 estado = reset;
aitor01 3:3fbadf6c492f 159 }
aitor01 3:3fbadf6c492f 160 }
agat 2:fd3b989cedcd 161 void muestraTemp()
agat 2:fd3b989cedcd 162 {
aitor01 1:1d515eb7abf3 163 pc.printf("La temperatura es de %.4f\n",temperatura);
agat 2:fd3b989cedcd 164 gOled.clearDisplay();
agat 2:fd3b989cedcd 165 gOled.printf("La temperatura es de %.4f\n",temperatura);
aitor01 4:7f4d81ed3984 166 gOled.printf("%f\r\n",velocidad);
agat 2:fd3b989cedcd 167 gOled.display();
agat 2:fd3b989cedcd 168 gOled.setTextCursor(0,0);
agat 2:fd3b989cedcd 169 }
agat 0:e3755f5769fe 170
agat 2:fd3b989cedcd 171 void medir()
agat 2:fd3b989cedcd 172 {
aitor01 1:1d515eb7abf3 173 float tension=senal.read()*3.3;
aitor01 1:1d515eb7abf3 174 float Rt= 100e3*((3.3-tension)/tension);
aitor01 1:1d515eb7abf3 175 temperatura = (3950/(log(Rt/100e3)+(3950/298)))-273.1;
agat 2:fd3b989cedcd 176 }
aitor01 3:3fbadf6c492f 177
aitor01 4:7f4d81ed3984 178 void funcionVel(float tiempo)
aitor01 3:3fbadf6c492f 179 {
aitor01 4:7f4d81ed3984 180 velocidad = contador*60/tiempo;//esto es en rpm haciendo *60seg para pasar a min.
aitor01 4:7f4d81ed3984 181 contador = 0;
aitor01 4:7f4d81ed3984 182 velocidad_relativa = temperatura*(96000/80);
aitor01 4:7f4d81ed3984 183 //diferencia_velocidad = velocidad - velocidad_relativa;
aitor01 4:7f4d81ed3984 184 if(velocidad_relativa-velocidad>0) {
aitor01 3:3fbadf6c492f 185 dirBMotor=dirBMotor+0.01;
aitor01 4:7f4d81ed3984 186 } else {
aitor01 3:3fbadf6c492f 187 dirBMotor=dirBMotor-0.01;
aitor01 4:7f4d81ed3984 188 }
aitor01 3:3fbadf6c492f 189 }
aitor01 3:3fbadf6c492f 190
aitor01 3:3fbadf6c492f 191 void estadoemergencia()
aitor01 3:3fbadf6c492f 192 {
aitor01 4:7f4d81ed3984 193 rele=0;
aitor01 4:7f4d81ed3984 194 paso(0);
aitor01 3:3fbadf6c492f 195 estado = apagado;
aitor01 3:3fbadf6c492f 196 }
aitor01 3:3fbadf6c492f 197
agat 0:e3755f5769fe 198 int main()
agat 0:e3755f5769fe 199 {
agat 0:e3755f5769fe 200 pc.baud(115200);
agat 2:fd3b989cedcd 201 gOled.begin();
agat 2:fd3b989cedcd 202 gOled.clearDisplay();
aitor01 4:7f4d81ed3984 203 gOled.printf("Hola, bienvenid@ a la simulacion de un equipo de perforacion rotatoria\n");
agat 2:fd3b989cedcd 204 gOled.display();
agat 2:fd3b989cedcd 205 gOled.setTextCursor(0,0);
aitor01 1:1d515eb7abf3 206 //visualTemp.attach(&muestraTemp,1.0);
agat 0:e3755f5769fe 207 //tickerMideDistancia.attach(&mideDistancia, 0.5);
agat 0:e3755f5769fe 208 estado=reset;
agat 0:e3755f5769fe 209 step=1;
agat 0:e3755f5769fe 210 enableMotor =1;
agat 0:e3755f5769fe 211 pc.printf("Estado cerrada\n");
aitor01 1:1d515eb7abf3 212 t.start();
aitor01 3:3fbadf6c492f 213 bot.start();
aitor01 3:3fbadf6c492f 214 encoderA.rise(&encoderAIrq); // attach the address of the flip function to the rising edge
aitor01 3:3fbadf6c492f 215 // tickerVel.attach(&funcionVel,0.1);
aitor01 3:3fbadf6c492f 216 dirAMotor=0;
aitor01 3:3fbadf6c492f 217 //dirBMotor=0.5;
aitor01 4:7f4d81ed3984 218 timerVel.start();
agat 0:e3755f5769fe 219 while(1) {
agat 2:fd3b989cedcd 220 medir();
aitor01 4:7f4d81ed3984 221 if(timerVel.read()>0.1) {
aitor01 4:7f4d81ed3984 222 funcionVel(timerVel.read());
aitor01 4:7f4d81ed3984 223 timerVel.reset();
aitor01 4:7f4d81ed3984 224 }
agat 0:e3755f5769fe 225 //distancia=usensor.get_dist_cm();
agat 0:e3755f5769fe 226 switch ( estado ) {
agat 2:fd3b989cedcd 227
agat 0:e3755f5769fe 228 case reset:
agat 0:e3755f5769fe 229 estadoreset();
aitor01 1:1d515eb7abf3 230 pc.printf("Estado reset\n");
agat 0:e3755f5769fe 231 break;
agat 0:e3755f5769fe 232 case apagado:
agat 0:e3755f5769fe 233 estadoapagado();
aitor01 1:1d515eb7abf3 234 pc.printf("Estado apagado\n");
agat 0:e3755f5769fe 235 break;
aitor01 1:1d515eb7abf3 236 case motorpalante:
aitor01 1:1d515eb7abf3 237 estadomotorpalante();
aitor01 1:1d515eb7abf3 238 pc.printf("Estado alante\n");
agat 0:e3755f5769fe 239 break;
aitor01 1:1d515eb7abf3 240 case atras:
aitor01 1:1d515eb7abf3 241 estadoatras();
aitor01 1:1d515eb7abf3 242 pc.printf("Estado atras\n");
aitor01 1:1d515eb7abf3 243 break;
aitor01 1:1d515eb7abf3 244 case estatico:
aitor01 1:1d515eb7abf3 245 pc.printf("Estado estatico\n");
aitor01 3:3fbadf6c492f 246 estadoestatico();
agat 0:e3755f5769fe 247 break;
aitor01 3:3fbadf6c492f 248 case emergencia:
aitor01 3:3fbadf6c492f 249 pc.printf("Estado emergencia\n");
aitor01 3:3fbadf6c492f 250 estadoemergencia();
aitor01 3:3fbadf6c492f 251 break;
agat 0:e3755f5769fe 252 }
agat 0:e3755f5769fe 253 }
agat 0:e3755f5769fe 254 }