Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: Adafruit_GFX
main.cpp@4:7f4d81ed3984, 2021-12-16 (annotated)
- 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?
| User | Revision | Line number | New 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 | } |