test

Committer:
dapi08
Date:
Fri Jun 19 10:47:30 2020 +0000
Revision:
5:420cb56093d3
Parent:
4:7564d0ffd595
Child:
6:c21017e969af
Funcionamiento basico

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dapi08 2:82fdfeec5799 1 #include "declaraciones.h"
deepikabhavnani 0:cf516d904427 2 #include "EthernetInterface.h"
dapi08 2:82fdfeec5799 3 #include "gps.h"
dapi08 1:da6afd392792 4
dapi08 2:82fdfeec5799 5 #define IP "192.168.1.247"
dapi08 1:da6afd392792 6 #define GATEWAY "192.168.1.1"
dapi08 1:da6afd392792 7 #define MASK "255.255.255.0"
dapi08 1:da6afd392792 8
deepikabhavnani 0:cf516d904427 9
deepikabhavnani 0:cf516d904427 10 // Network interface
deepikabhavnani 0:cf516d904427 11 EthernetInterface net;
dapi08 1:da6afd392792 12
dapi08 2:82fdfeec5799 13
dapi08 2:82fdfeec5799 14 //GPS gps(PC_10, PC_11, PF_8);
dapi08 2:82fdfeec5799 15
dapi08 1:da6afd392792 16 // CANALES DE COMUNICACION
dapi08 1:da6afd392792 17 Serial pc(SERIAL_TX, SERIAL_RX, 115200);
dapi08 1:da6afd392792 18 Serial serGPS(PC_10, PC_11, 9600);
dapi08 2:82fdfeec5799 19 RawSerial serSERVO(PC_12, PD_2, 115200);
dapi08 1:da6afd392792 20 Serial serRS485(PD_5, PD_6, 115200);
dapi08 1:da6afd392792 21
dapi08 1:da6afd392792 22 // SALIDAS PARA LEDS
dapi08 1:da6afd392792 23 DigitalOut led1(LED1, 0); //LED1
dapi08 1:da6afd392792 24 DigitalOut led2(LED2, 0);
dapi08 1:da6afd392792 25 DigitalOut led3(LED3, 0);
dapi08 1:da6afd392792 26
dapi08 1:da6afd392792 27 // SALIDAS DE CONTROL COMUNICACIONES
dapi08 2:82fdfeec5799 28 DigitalOut RS485_DIR(PE_3, 0); //DIR RS485 a RX
dapi08 2:82fdfeec5799 29 DigitalOut RS485_OE(PF_7, 0); //OE RS485 a tri-state
dapi08 1:da6afd392792 30
dapi08 1:da6afd392792 31 // SALIDAS PARA CONTROL DEL SERVO
dapi08 1:da6afd392792 32 DigitalOut control_PWR_servo(PF_9, 1); // Alimentacion del inverter para 220V del servo
dapi08 1:da6afd392792 33 DigitalOut SERVO_ON(PG_1, 0); // Salida de control ON del servo (J7-2)
dapi08 1:da6afd392792 34 DigitalOut SERVO_CLR_COUNT(PG_0, 0); // Salida de control CLR_COUNT del servo (J7-1)
dapi08 1:da6afd392792 35 DigitalOut SERVO_ALARM_CLR(PF_0, 0); // Salida de control ALARM_CLR del servo (J7-4)
dapi08 1:da6afd392792 36 DigitalOut SERVO_CONTROL_MODE(PC_6, 0); // Salida de control CONTROL_MODE del servo (J7-3)
dapi08 1:da6afd392792 37 DigitalOut SERVO_INC_POS(PB_10, 0); // Salida de control INC_POS del servo (J1-2)
dapi08 1:da6afd392792 38 DigitalOut SERVO_DEC_POS(PB_11, 0); // Salida de control DEC_POS del servo (J1-3)
dapi08 1:da6afd392792 39 DigitalOut SERVO_AUX_OUT(PA_15, 0); // Salida de control AUX_OUT del servo (J7-10)
dapi08 1:da6afd392792 40
dapi08 1:da6afd392792 41 // ENTRADAS DE ESTADO DEL SERVO
dapi08 1:da6afd392792 42 DigitalIn SERVO_RDY_IN(PF_13); //Entrada desde SERVO_RDY, 1=activa;
dapi08 1:da6afd392792 43 DigitalIn SERVO_AL_IN(PE_9); //Entrada desde SERVO_AL, 1=activa;
dapi08 1:da6afd392792 44 DigitalIn SERVO_POS_IN(PE_11); //Entrada desde SERVO_POS, 1=activa;
dapi08 1:da6afd392792 45 DigitalIn SERVO_TORQ_L_IN(PF_14); //Entrada desde SERVO_TORQ_L, 1=activa;
dapi08 1:da6afd392792 46 DigitalIn SERVO_Z_SPEED_IN(PE_13); //Entrada desde SERVO_Z_SPEED, 1=activa;
dapi08 1:da6afd392792 47 DigitalIn SRV_D_VEL(PF_2); //Entrada desde SERVO signo nivel de velocidad 1=positivo
dapi08 1:da6afd392792 48 DigitalIn SRV_D_TRQ(PF_1); //Entrada desde SERVO signo nivel de torque 1=positivo
dapi08 1:da6afd392792 49
dapi08 2:82fdfeec5799 50 // ENTRADAS DEL SELECTOR
dapi08 2:82fdfeec5799 51 DigitalIn SEL0(PC_8); //Selector 1 = BABOR/ESTRIBOR, ON(0)=BABOR OFF(1)=ESTRIBOR
dapi08 2:82fdfeec5799 52 DigitalIn SEL1(PC_9); //Selector 2
dapi08 2:82fdfeec5799 53 DigitalIn SEL2(PG_2); //Selector 3
dapi08 2:82fdfeec5799 54 DigitalIn SEL3(PG_3); //Selector 4
dapi08 2:82fdfeec5799 55
dapi08 1:da6afd392792 56 // SALIDAS PWM
dapi08 1:da6afd392792 57 PwmOut SRV_C_TRQ_P(PD_13); // Salida PWM para control del torque POSITIVO del SERVO
dapi08 1:da6afd392792 58 PwmOut SRV_C_TRQ_N(PA_0); // Salida PWM para control del torque NEGATIVO del SERVO
dapi08 1:da6afd392792 59
dapi08 1:da6afd392792 60 // ENTRADAS ANALOGICAS
dapi08 1:da6afd392792 61 AnalogIn SRV_VEL(PA_3); // Entrada analogica de VELOCIDAD del servo
dapi08 1:da6afd392792 62 AnalogIn SRV_TRQ(PC_0); // Entrada analogica de TORQUE del servo
dapi08 1:da6afd392792 63
dapi08 1:da6afd392792 64
dapi08 1:da6afd392792 65 // ENTRADAS GENERALES
dapi08 1:da6afd392792 66 DigitalIn pulsador(PC_13); //Pulsador de usuario, 1=pulsado;
dapi08 1:da6afd392792 67
dapi08 1:da6afd392792 68
dapi08 1:da6afd392792 69
dapi08 2:82fdfeec5799 70 // VARIABLES DE SISTEMA
dapi08 2:82fdfeec5799 71 volatile unsigned long tiempo_ms = 0;
dapi08 2:82fdfeec5799 72 volatile bool f_ms = false; // se pone en cada interrupcion de ms
dapi08 4:7564d0ffd595 73 int babor_estribor = 0; // si 0=control servo babor, si 1=control servo estribor
dapi08 1:da6afd392792 74
dapi08 1:da6afd392792 75
dapi08 2:82fdfeec5799 76 long t_ult_recepcion; // guarda tiempo ultima recepción
dapi08 5:420cb56093d3 77 //byte nMando; // numero de mando 0=babor 1=estribor
dapi08 2:82fdfeec5799 78 int servo; // servo recibido en ultima comunicacion
dapi08 2:82fdfeec5799 79 volatile float latitud;
dapi08 2:82fdfeec5799 80 volatile float longitud;
dapi08 2:82fdfeec5799 81 volatile long fecha_hora;
dapi08 2:82fdfeec5799 82 volatile int n_satelites;
dapi08 2:82fdfeec5799 83 volatile float HDOP;
dapi08 2:82fdfeec5799 84 volatile int rumbo;
dapi08 2:82fdfeec5799 85 volatile int velocidad; // MNPH
dapi08 2:82fdfeec5799 86 volatile int timon_babor;
dapi08 2:82fdfeec5799 87 volatile int timon_estribor;
dapi08 2:82fdfeec5799 88 volatile enEstadoDireccion estado_direccion;
dapi08 2:82fdfeec5799 89 volatile byte EstadoAnteriorServo; //Guarda estado anterior del servo para salir de piloto-automatico o rumbo
dapi08 2:82fdfeec5799 90 volatile byte estado_otro_servo; // Estado del otro servo
dapi08 5:420cb56093d3 91 volatile int posicion_otro_servo; // Posicion del otro servo
dapi08 5:420cb56093d3 92 volatile float rumbo_otro_servo; // Rumbo del otro servo
dapi08 2:82fdfeec5799 93 volatile int retardoActualizacion; // para no visualizar estado durante este tiempo en ms
dapi08 2:82fdfeec5799 94 volatile bool act_display; // flag para actualizar display
dapi08 2:82fdfeec5799 95 volatile bool trama_estado_valida;
dapi08 2:82fdfeec5799 96 volatile bool trama_posicion_valida;
dapi08 1:da6afd392792 97
dapi08 4:7564d0ffd595 98
dapi08 2:82fdfeec5799 99 // VARIABLE CONTROL SERVO
dapi08 2:82fdfeec5799 100 enEstadoServo estado_servo;
dapi08 2:82fdfeec5799 101 int16_t velocidad_servo;
dapi08 2:82fdfeec5799 102 int16_t torque_servo;
dapi08 2:82fdfeec5799 103 long desviacion_servo;
dapi08 2:82fdfeec5799 104 volatile int pos_actual_servo = 0;
dapi08 2:82fdfeec5799 105 volatile int pos_objetivo_servo = 0;
dapi08 2:82fdfeec5799 106 volatile unsigned long tempo_espera = 0;
dapi08 2:82fdfeec5799 107
dapi08 2:82fdfeec5799 108 int torque_max; // torque máximo calculado
dapi08 2:82fdfeec5799 109 int out_torque = TORQUE_MINIMO; // nivel de torque de TORQUE_MINIMO a TORQUE_MAXIMO
dapi08 2:82fdfeec5799 110
dapi08 2:82fdfeec5799 111 int cons_timon_babor = 0; // consigna % de timon babor bajado
dapi08 2:82fdfeec5799 112 int cons_timon_estribor = 0; // consigna % de timon estribor bajado
dapi08 2:82fdfeec5799 113
dapi08 2:82fdfeec5799 114 float diferencia_rumbo = 0.0; // Diferencia al Rumbo deseado
dapi08 1:da6afd392792 115
dapi08 2:82fdfeec5799 116 st_datos_servo datos_servo; // ESTRUCTURA DE VARIABLES DE ESTADO DEL SERVO DE DIRECCION
dapi08 2:82fdfeec5799 117 st_datos_GPS datos_GPS; // ESTRUCTURA DE DATOS DE ESTADO DEL GPS
dapi08 2:82fdfeec5799 118
dapi08 2:82fdfeec5799 119
dapi08 4:7564d0ffd595 120
dapi08 2:82fdfeec5799 121 // VARIABLES CONFIGURACION DESDE ORDENADOR
dapi08 2:82fdfeec5799 122 int cfg_hora = 7200; // Suma dos horas a UTC
dapi08 2:82fdfeec5799 123
dapi08 2:82fdfeec5799 124
dapi08 2:82fdfeec5799 125 // VARIABLES GENERALES
dapi08 2:82fdfeec5799 126 float ana_velocidad = 0.0;
dapi08 2:82fdfeec5799 127 float ana_torque = 0.0;
dapi08 2:82fdfeec5799 128 bool newtime = false;
dapi08 2:82fdfeec5799 129 ntp_packet in_data; // para recibir fecha y hora del servidor
dapi08 2:82fdfeec5799 130
dapi08 2:82fdfeec5799 131 // VARIABLES DE COMUNICACION RS485
dapi08 3:55227f9877e0 132 volatile bool f_rs485_busy = false; // comunicacion ocupada
dapi08 3:55227f9877e0 133 volatile bool recibidoEstadoServo = false; //Si ha recibido estado del otro servo se pone a true para sincronizacion
dapi08 3:55227f9877e0 134
dapi08 4:7564d0ffd595 135 // VARIABLES RECIBIDAS DESDE MANDO
dapi08 4:7564d0ffd595 136 int estado_mando = 0;
dapi08 4:7564d0ffd595 137 byte pulsadores = 0; // Estado pulsadores del mando
dapi08 4:7564d0ffd595 138
dapi08 4:7564d0ffd595 139 byte estado_old = DIR_REPOSO; // ultimo estado enviado
dapi08 4:7564d0ffd595 140
dapi08 2:82fdfeec5799 141
dapi08 2:82fdfeec5799 142 // TIMERS
dapi08 2:82fdfeec5799 143 Timer timer;
dapi08 4:7564d0ffd595 144 Ticker tick_millis; // Interrupcion para cuenta de milisegundos
dapi08 3:55227f9877e0 145 Ticker tickRS485us; // Interrupcion de 100us para com rs485
dapi08 3:55227f9877e0 146 Timer timerRS485; // Timer para sincronizacion por rs485 de los mandos
dapi08 2:82fdfeec5799 147
dapi08 2:82fdfeec5799 148
dapi08 2:82fdfeec5799 149
dapi08 2:82fdfeec5799 150
dapi08 2:82fdfeec5799 151
dapi08 2:82fdfeec5799 152
dapi08 2:82fdfeec5799 153 // RUTINAS
dapi08 2:82fdfeec5799 154
dapi08 2:82fdfeec5799 155 // CUENTA MILISEGUNDOS DESDE RESET
dapi08 2:82fdfeec5799 156 void cuenta_ms() {
dapi08 2:82fdfeec5799 157 tiempo_ms++;
dapi08 2:82fdfeec5799 158 posicion_servo(); // AJUSTA POSICION SERVO SI ES NECESARIO
dapi08 2:82fdfeec5799 159 f_ms = true; // se pone en cada interrupcion de ms
dapi08 1:da6afd392792 160 }
dapi08 1:da6afd392792 161
dapi08 1:da6afd392792 162
dapi08 4:7564d0ffd595 163 // devuelve cuenta de tiempo en ms
dapi08 4:7564d0ffd595 164 unsigned long millis(void){ // devuelve cuenta de tiempo en ms
dapi08 4:7564d0ffd595 165 return tiempo_ms;
dapi08 4:7564d0ffd595 166 }
dapi08 4:7564d0ffd595 167
dapi08 4:7564d0ffd595 168
dapi08 1:da6afd392792 169
dapi08 1:da6afd392792 170
dapi08 1:da6afd392792 171 /*
dapi08 1:da6afd392792 172 /////////////////////////////////////////////////////////
dapi08 1:da6afd392792 173 // PROCESA RECEPCION DESDE SERIAL SERVO
dapi08 1:da6afd392792 174 void onSerialServo(void){ // Procesa recepcion SERVO
dapi08 1:da6afd392792 175
dapi08 1:da6afd392792 176 while (serSERVO.readable()) {
dapi08 1:da6afd392792 177 char c = serSERVO.getc();
dapi08 2:82fdfeec5799 178 // pc.putc(c);
dapi08 2:82fdfeec5799 179 }
dapi08 2:82fdfeec5799 180 }
dapi08 2:82fdfeec5799 181 */
dapi08 2:82fdfeec5799 182
dapi08 2:82fdfeec5799 183
dapi08 2:82fdfeec5799 184
dapi08 2:82fdfeec5799 185
dapi08 2:82fdfeec5799 186
dapi08 2:82fdfeec5799 187 #define FACTOR_INC_RUMBO_BABOR 0.015
dapi08 2:82fdfeec5799 188 #define FACTOR_INC_RUMBO_ESTRIBOR 0.015
dapi08 2:82fdfeec5799 189
dapi08 2:82fdfeec5799 190 // PARA SIMULACION
dapi08 2:82fdfeec5799 191 // Pocesa rumbo_GPS, llamada cada 250ms
dapi08 2:82fdfeec5799 192 void procesa_rumbo_GPS(void){
dapi08 2:82fdfeec5799 193
dapi08 2:82fdfeec5799 194 datos_servo.rumbo -= datos_servo.timon_babor * FACTOR_INC_RUMBO_BABOR;
dapi08 2:82fdfeec5799 195 datos_servo.rumbo += datos_servo.timon_estribor * FACTOR_INC_RUMBO_ESTRIBOR;
dapi08 2:82fdfeec5799 196 // datos_servo.rumbo = flimit_decimales(datos_servo.rumbo, 2);
dapi08 2:82fdfeec5799 197 if(datos_servo.rumbo>360.0){
dapi08 2:82fdfeec5799 198 datos_servo.rumbo -= 360.0;
dapi08 2:82fdfeec5799 199 }
dapi08 2:82fdfeec5799 200 else if(datos_servo.rumbo<0.0){
dapi08 2:82fdfeec5799 201 datos_servo.rumbo += 360.0;
dapi08 1:da6afd392792 202 }
dapi08 1:da6afd392792 203 }
dapi08 1:da6afd392792 204
dapi08 1:da6afd392792 205
dapi08 1:da6afd392792 206
dapi08 1:da6afd392792 207 /////////////////////////////////////////////////////////
dapi08 2:82fdfeec5799 208 // PROGRAMA PRINCIPAL
dapi08 2:82fdfeec5799 209 int main() {
dapi08 2:82fdfeec5799 210 int nc=0;
dapi08 2:82fdfeec5799 211 char out_buffer_2[50];
dapi08 2:82fdfeec5799 212 static int posicion_mando_old = 0;
dapi08 1:da6afd392792 213
dapi08 1:da6afd392792 214
deepikabhavnani 0:cf516d904427 215 // Bring up the ethernet interface
dapi08 2:82fdfeec5799 216 pc.printf("\r\n\r\n");
dapi08 2:82fdfeec5799 217 pc.printf("RESET\r\n\r\n");
dapi08 1:da6afd392792 218 pc.printf("PROGRAMA CONTROL SERVO V0.1\r\n");
dapi08 3:55227f9877e0 219 pc.printf("CONTROL DE SERVO DE ");
dapi08 4:7564d0ffd595 220 babor_estribor = SEL0.read();
dapi08 4:7564d0ffd595 221 if(babor_estribor == 0) // Si es servo de babor = 0
dapi08 3:55227f9877e0 222 pc.printf("BABOR\r\n");
dapi08 3:55227f9877e0 223 else
dapi08 3:55227f9877e0 224 pc.printf("ESTRIBOR\r\n");
dapi08 3:55227f9877e0 225
dapi08 3:55227f9877e0 226
dapi08 1:da6afd392792 227
dapi08 2:82fdfeec5799 228 // Open Ethernet connection
dapi08 2:82fdfeec5799 229 int c=0;
dapi08 2:82fdfeec5799 230 do{
dapi08 2:82fdfeec5799 231 net.disconnect();
dapi08 2:82fdfeec5799 232 wait(2.0); // espera de 1s
dapi08 2:82fdfeec5799 233 int j = net.set_network(IP, MASK, GATEWAY);
dapi08 2:82fdfeec5799 234 printf("set IP status: %i\r\n", j);
dapi08 1:da6afd392792 235
dapi08 2:82fdfeec5799 236 c=net.connect();
dapi08 2:82fdfeec5799 237 if(0 != c) {
dapi08 2:82fdfeec5799 238 printf("Error connecting\r\n");
dapi08 2:82fdfeec5799 239 // return -1;
dapi08 2:82fdfeec5799 240 }
dapi08 2:82fdfeec5799 241 }while(c != 0);
deepikabhavnani 0:cf516d904427 242
deepikabhavnani 0:cf516d904427 243 // Show the network address
deepikabhavnani 0:cf516d904427 244 const char *ip = net.get_ip_address();
dapi08 1:da6afd392792 245 printf("IP address is: %s\r\n", ip ? ip : "No IP");
dapi08 2:82fdfeec5799 246
dapi08 2:82fdfeec5799 247 Thread t; // can pass in the stack size here if you run out of memory
dapi08 2:82fdfeec5799 248 t.start(&udp_main);
dapi08 2:82fdfeec5799 249
dapi08 2:82fdfeec5799 250
dapi08 2:82fdfeec5799 251 // Inicializa datos_servo ESTRUCTURA DE VARIABLES DE ESTADO DEL SERVO DE DIRECCION
dapi08 4:7564d0ffd595 252 datos_servo.n_servo = babor_estribor;
dapi08 2:82fdfeec5799 253 datos_servo.estado = 0;
dapi08 2:82fdfeec5799 254 datos_servo.latitud = 0.0;
dapi08 2:82fdfeec5799 255 datos_servo.longitud = 0.0;
dapi08 2:82fdfeec5799 256 datos_servo.fecha_hora = 0;
dapi08 2:82fdfeec5799 257 datos_servo.velocidad = 0.0; // MNPH
dapi08 2:82fdfeec5799 258 datos_servo.rumbo = 0.0;
dapi08 2:82fdfeec5799 259 datos_servo.ch_radio = 0;
dapi08 2:82fdfeec5799 260 datos_servo.trim_timon_bab = 0;
dapi08 2:82fdfeec5799 261 datos_servo.trim_trans_bab = 6;
dapi08 2:82fdfeec5799 262 datos_servo.trim_timon_estr = 0;
dapi08 2:82fdfeec5799 263 datos_servo.trim_trans_estr = 6;
dapi08 2:82fdfeec5799 264 datos_servo.timon_babor = 0; // %de timon babor bajado, para 100% 5s, 1% = 50ms
dapi08 2:82fdfeec5799 265 datos_servo.timon_estribor = 0; // %de timon estribor bajado, para 100% 5s
dapi08 2:82fdfeec5799 266 datos_servo.rumbo_fijado = 0.0; // Rumbo fijado al pulsar botón para RUMBO FIJO
dapi08 2:82fdfeec5799 267 datos_servo.rumbo_piloto_auto = 0.0; // Rumbo fijado por piloto automático
dapi08 2:82fdfeec5799 268
dapi08 2:82fdfeec5799 269 // Set handler to be called when UDP socket event occurrs.
dapi08 2:82fdfeec5799 270 // sock.attach(&onUDPSocketEvent);
dapi08 1:da6afd392792 271
dapi08 1:da6afd392792 272 timer.start();
dapi08 4:7564d0ffd595 273 tick_millis.attach(&cuenta_ms, 0.001); // the address of the function to be attached (cuenta_ms) and the interval (1 miliseconds)
dapi08 3:55227f9877e0 274 tickRS485us.attach(&SerialTxRS485, 0.0001); // Interrupcion de 100us para comunicaciones por RS485 con mando
dapi08 3:55227f9877e0 275 timerRS485.start(); // Timer para sincronizacion desde recepcion del otro control servo
dapi08 3:55227f9877e0 276
dapi08 2:82fdfeec5799 277 led1 = led2 = led3 =1;
dapi08 1:da6afd392792 278 wait(0.5);
dapi08 2:82fdfeec5799 279 led1 = led2 = led3 =0;
dapi08 2:82fdfeec5799 280
dapi08 2:82fdfeec5799 281 // serSERVO.attach(&onSerialServo); // Interrupcion de serial Servo
dapi08 4:7564d0ffd595 282 serRS485.attach(&onSerialRxRS485, Serial::RxIrq); // Interrupcion de RX serial RS485 (MANDOS)
dapi08 2:82fdfeec5799 283 // serRS485.attach(&onSerialTxRS485, Serial::TxIrq); // Interrupcion de TX serial RS485 (MANDOS)
dapi08 2:82fdfeec5799 284
dapi08 2:82fdfeec5799 285 serGPS.attach(&onSerialGPS); // Interrupcion de serial GPS
dapi08 1:da6afd392792 286
dapi08 1:da6afd392792 287 RS485_OE = 1; // habilita conversor 3.3V a 5V para RS485
dapi08 1:da6afd392792 288
dapi08 2:82fdfeec5799 289 /*
dapi08 1:da6afd392792 290 SRV_C_TRQ_P.period(0.001f); // 1 kHz or 1 ms
dapi08 1:da6afd392792 291 SRV_C_TRQ_N.period(0.001f); // 1 kHz or 1 ms
dapi08 1:da6afd392792 292 SRV_C_TRQ_P=0;
dapi08 1:da6afd392792 293 SRV_C_TRQ_N=0;
dapi08 2:82fdfeec5799 294 */
dapi08 2:82fdfeec5799 295
dapi08 2:82fdfeec5799 296 SERVO_ON = 1; // Pone servo en ON
dapi08 2:82fdfeec5799 297
dapi08 2:82fdfeec5799 298 // uint8_t i=0;
dapi08 2:82fdfeec5799 299
dapi08 2:82fdfeec5799 300 // SetDateTime(2020, 4, 25, 10, 00, 0); // Actualiza hora del RTC
dapi08 2:82fdfeec5799 301 // ShowDateTime();
deepikabhavnani 0:cf516d904427 302
dapi08 1:da6afd392792 303 while(1){
dapi08 1:da6afd392792 304
dapi08 2:82fdfeec5799 305 while(f_ms!=true); // espera interrupcion de 1 ms
dapi08 2:82fdfeec5799 306 f_ms = false;
dapi08 2:82fdfeec5799 307
dapi08 2:82fdfeec5799 308 procesaGPS(); // Comprueba trama pendiente de GPS y la procesa
dapi08 1:da6afd392792 309
dapi08 2:82fdfeec5799 310 if(datos_servo.estado == DIR_MASTER || datos_servo.estado == DIR_REPOSO)
dapi08 2:82fdfeec5799 311 datos_servo.posicion_mando = desviacion_servo;
dapi08 2:82fdfeec5799 312 else
dapi08 2:82fdfeec5799 313 datos_servo.posicion_mando = pos_objetivo_servo; // PARA PILOTO AUTOMATICO
dapi08 2:82fdfeec5799 314
dapi08 2:82fdfeec5799 315 if(datos_servo.posicion_mando != posicion_mando_old){ // Si cambia la posicion del mando envia trama
dapi08 2:82fdfeec5799 316 if(abs(desviacion_servo) >= 50 && datos_servo.estado == DIR_REPOSO && estado_otro_servo == DIR_REPOSO){
dapi08 2:82fdfeec5799 317 datos_servo.estado = DIR_MASTER;
dapi08 1:da6afd392792 318 }
dapi08 2:82fdfeec5799 319
dapi08 2:82fdfeec5799 320 if(datos_servo.estado == DIR_MASTER || datos_servo.estado == DIR_RUMBO || datos_servo.estado == DIR_PILOTO)
dapi08 2:82fdfeec5799 321 envia_posicion_mando(datos_servo.posicion_mando);
dapi08 2:82fdfeec5799 322 posicion_mando_old = datos_servo.posicion_mando;
dapi08 2:82fdfeec5799 323 }
dapi08 2:82fdfeec5799 324
dapi08 2:82fdfeec5799 325 // PROCESA CADA SEGUNDO
dapi08 2:82fdfeec5799 326 if(((tiempo_ms+500)%1000)==0){ // Envia cada segundo
dapi08 2:82fdfeec5799 327
dapi08 2:82fdfeec5799 328 // getTime();
dapi08 2:82fdfeec5799 329
dapi08 2:82fdfeec5799 330 // SetDateTime(2020, 4, 25, 10, 00, 0); // Actualiza hora del RTC
dapi08 2:82fdfeec5799 331 // ShowDateTime();
dapi08 2:82fdfeec5799 332 // pc.printf("tiempo_ms:%d\r\n", tiempo_ms);
dapi08 2:82fdfeec5799 333
dapi08 2:82fdfeec5799 334 // pc.printf("RDY:%u AL:%u POS:%u TORQ_L:%u Z_SPEED:%u \r\n", SERVO_RDY_IN.read(), SERVO_AL_IN.read(), SERVO_POS_IN.read(), SERVO_TORQ_L_IN.read(), SERVO_Z_SPEED_IN.read());
dapi08 2:82fdfeec5799 335 // pc.printf("velocidad:%3.3f torque:%3.3f fix:%d satelites:%s\r\n", ana_velocidad, ana_torque, gps.have_fix, gps.NmeaGpsData.NmeaSatelliteTracked);
dapi08 2:82fdfeec5799 336
dapi08 2:82fdfeec5799 337 // procesa_servo(); // lee estado del servo, procesa torque y actualiza
dapi08 2:82fdfeec5799 338 // envia_posicion_mando(datos_servo.posicion_mando);
dapi08 2:82fdfeec5799 339
dapi08 4:7564d0ffd595 340 // printf("tiempo_ms=%d pos_objetivo_servo=%d SEL0=%d ESTADO=%d\r\n", tiempo_ms, pos_objetivo_servo, babor_estribor, datos_servo.estado);
dapi08 2:82fdfeec5799 341 }
dapi08 1:da6afd392792 342
dapi08 2:82fdfeec5799 343 /*
dapi08 2:82fdfeec5799 344 //PROCESO CADA 10ms
dapi08 2:82fdfeec5799 345 if((tiempo_ms%10) == 0){
dapi08 2:82fdfeec5799 346 ana_velocidad = SRV_VEL.read(); // 1.0=VCC, lee entradas analogicas
dapi08 2:82fdfeec5799 347 ana_torque = SRV_TRQ.read();
dapi08 2:82fdfeec5799 348 SRV_C_TRQ_P.pulsewidth(ana_velocidad*0.001f); // Ajusta PWM de salida DAC
dapi08 2:82fdfeec5799 349 SRV_C_TRQ_N.pulsewidth(ana_torque*0.001f);
dapi08 2:82fdfeec5799 350 }
dapi08 2:82fdfeec5799 351 */
dapi08 2:82fdfeec5799 352 //PROCESO CADA 100ms
dapi08 2:82fdfeec5799 353 if((tiempo_ms%100) == 0){
dapi08 2:82fdfeec5799 354 // procesa_rumbo_GPS(); // SIMULA RUMBO SEGUN TIMON PARA GPS
dapi08 2:82fdfeec5799 355 // procesa_posicion_timones(); // Pocesa activación y posición timones, llamada cada 100ms
dapi08 2:82fdfeec5799 356 }
dapi08 1:da6afd392792 357
dapi08 2:82fdfeec5799 358 //PROCESO CADA 250ms
dapi08 2:82fdfeec5799 359 if((tiempo_ms%250) == 0){
dapi08 2:82fdfeec5799 360 procesa_servo(); // lee estado del servo, procesa torque y actualiza
dapi08 4:7564d0ffd595 361 procesa_estado(); // PROCESA CAMBIO DE ESTADO
dapi08 4:7564d0ffd595 362 procesa_piloto_automatico(); // procesa piloto automático
dapi08 2:82fdfeec5799 363 procesa_posicion_timones(); // Pocesa activación y posición timones, llamada cada 250ms
dapi08 2:82fdfeec5799 364 actualiza_timones(); // ACTUALIZA TIMONES
dapi08 2:82fdfeec5799 365 procesa_rumbo_GPS(); // SIMULA RUMBO SEGUN TIMON PARA GPS
dapi08 5:420cb56093d3 366 sincroniza_servos(); // SINCRONIZA LOS DOS SERVOS SEGUN SU ESTADO
dapi08 2:82fdfeec5799 367 }
dapi08 1:da6afd392792 368
dapi08 3:55227f9877e0 369 if(recibidoEstadoServo==true){ //Si ha recibido estado del otro servo está a true para sincronizacion
dapi08 5:420cb56093d3 370 if(timerRS485.read_ms()>=120){
dapi08 3:55227f9877e0 371 envia_estado_mando();
dapi08 3:55227f9877e0 372 recibidoEstadoServo = false;
dapi08 3:55227f9877e0 373 timerRS485.reset();
dapi08 3:55227f9877e0 374 }
dapi08 3:55227f9877e0 375 }
dapi08 3:55227f9877e0 376 else{
dapi08 4:7564d0ffd595 377 int espera = (babor_estribor==0)? 240 :260;
dapi08 3:55227f9877e0 378 if(timerRS485.read_ms()>=espera){ // Si es servo de babor = 240ms, estribor = 260ms, evita colision
dapi08 3:55227f9877e0 379 envia_estado_mando();
dapi08 5:420cb56093d3 380 recibidoEstadoServo = false;
dapi08 3:55227f9877e0 381 timerRS485.reset();
dapi08 3:55227f9877e0 382 }
dapi08 3:55227f9877e0 383 }
dapi08 3:55227f9877e0 384
dapi08 1:da6afd392792 385 // control_PWR_servo = (pulsador.read() == 1)?0:1;
dapi08 1:da6afd392792 386 control_PWR_servo = 0; // encendido
dapi08 2:82fdfeec5799 387
dapi08 2:82fdfeec5799 388 // PROCESO CADA 10 SEGUNDOS
dapi08 2:82fdfeec5799 389 if((tiempo_ms%10000)==0){
dapi08 1:da6afd392792 390
dapi08 2:82fdfeec5799 391 /*
dapi08 2:82fdfeec5799 392 if(pos_objetivo_servo == 0){
dapi08 2:82fdfeec5799 393 pos_objetivo_servo = 200;
dapi08 2:82fdfeec5799 394 escribe_parametro_servo(0, 13, TORQUE_MAXIMO);
dapi08 2:82fdfeec5799 395 }
dapi08 2:82fdfeec5799 396 else if(pos_objetivo_servo == 200){
dapi08 2:82fdfeec5799 397 pos_objetivo_servo = -200;
dapi08 2:82fdfeec5799 398 escribe_parametro_servo(0, 13, TORQUE_MAXIMO);
dapi08 2:82fdfeec5799 399 }
dapi08 2:82fdfeec5799 400 else if(pos_objetivo_servo == -200){
dapi08 2:82fdfeec5799 401 pos_objetivo_servo = 0;
dapi08 2:82fdfeec5799 402 escribe_parametro_servo(0, 13, TORQUE_MINIMO);
dapi08 2:82fdfeec5799 403 }
dapi08 2:82fdfeec5799 404 // printf("\r\n\r\npos_objetivo_servo=%d\r\n\r\n",pos_objetivo_servo);
dapi08 2:82fdfeec5799 405 */
dapi08 1:da6afd392792 406 }
dapi08 1:da6afd392792 407
dapi08 1:da6afd392792 408 // Thread::wait(10000);
dapi08 1:da6afd392792 409 }
dapi08 1:da6afd392792 410
deepikabhavnani 0:cf516d904427 411 return 0;
dapi08 1:da6afd392792 412 }