test

Committer:
dapi08
Date:
Wed May 27 09:41:53 2020 +0000
Revision:
3:55227f9877e0
Parent:
2:82fdfeec5799
Child:
4:7564d0ffd595
Sincronizacion de comunicacion con mandos y otros controladores

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 1:da6afd392792 73
dapi08 1:da6afd392792 74
dapi08 2:82fdfeec5799 75 long t_ult_recepcion; // guarda tiempo ultima recepción
dapi08 2:82fdfeec5799 76 byte nMando; // numero de mando 0=babor 1=estribor
dapi08 2:82fdfeec5799 77 int servo; // servo recibido en ultima comunicacion
dapi08 2:82fdfeec5799 78 volatile float latitud;
dapi08 2:82fdfeec5799 79 volatile float longitud;
dapi08 2:82fdfeec5799 80 volatile long fecha_hora;
dapi08 2:82fdfeec5799 81 volatile int n_satelites;
dapi08 2:82fdfeec5799 82 volatile float HDOP;
dapi08 2:82fdfeec5799 83 volatile int rumbo;
dapi08 2:82fdfeec5799 84 volatile int velocidad; // MNPH
dapi08 2:82fdfeec5799 85 volatile int timon_babor;
dapi08 2:82fdfeec5799 86 volatile int timon_estribor;
dapi08 2:82fdfeec5799 87 volatile enEstadoDireccion estado_direccion;
dapi08 2:82fdfeec5799 88 volatile byte EstadoAnteriorServo; //Guarda estado anterior del servo para salir de piloto-automatico o rumbo
dapi08 2:82fdfeec5799 89 volatile byte estado_otro_servo; // Estado del otro servo
dapi08 2:82fdfeec5799 90 volatile int retardoActualizacion; // para no visualizar estado durante este tiempo en ms
dapi08 2:82fdfeec5799 91 volatile bool act_display; // flag para actualizar display
dapi08 2:82fdfeec5799 92 volatile bool trama_estado_valida;
dapi08 2:82fdfeec5799 93 volatile bool trama_posicion_valida;
dapi08 1:da6afd392792 94
dapi08 2:82fdfeec5799 95 // VARIABLE CONTROL SERVO
dapi08 2:82fdfeec5799 96 enEstadoServo estado_servo;
dapi08 2:82fdfeec5799 97 int16_t velocidad_servo;
dapi08 2:82fdfeec5799 98 int16_t torque_servo;
dapi08 2:82fdfeec5799 99 long desviacion_servo;
dapi08 2:82fdfeec5799 100 volatile int pos_actual_servo = 0;
dapi08 2:82fdfeec5799 101 volatile int pos_objetivo_servo = 0;
dapi08 2:82fdfeec5799 102 volatile unsigned long tempo_espera = 0;
dapi08 2:82fdfeec5799 103
dapi08 2:82fdfeec5799 104 int torque_max; // torque máximo calculado
dapi08 2:82fdfeec5799 105 int out_torque = TORQUE_MINIMO; // nivel de torque de TORQUE_MINIMO a TORQUE_MAXIMO
dapi08 2:82fdfeec5799 106
dapi08 2:82fdfeec5799 107 int cons_timon_babor = 0; // consigna % de timon babor bajado
dapi08 2:82fdfeec5799 108 int cons_timon_estribor = 0; // consigna % de timon estribor bajado
dapi08 2:82fdfeec5799 109
dapi08 2:82fdfeec5799 110 float diferencia_rumbo = 0.0; // Diferencia al Rumbo deseado
dapi08 1:da6afd392792 111
dapi08 2:82fdfeec5799 112 st_datos_servo datos_servo; // ESTRUCTURA DE VARIABLES DE ESTADO DEL SERVO DE DIRECCION
dapi08 2:82fdfeec5799 113 st_datos_GPS datos_GPS; // ESTRUCTURA DE DATOS DE ESTADO DEL GPS
dapi08 2:82fdfeec5799 114
dapi08 2:82fdfeec5799 115
dapi08 2:82fdfeec5799 116 // VARIABLES CONFIGURACION DESDE ORDENADOR
dapi08 2:82fdfeec5799 117 int cfg_hora = 7200; // Suma dos horas a UTC
dapi08 2:82fdfeec5799 118
dapi08 2:82fdfeec5799 119
dapi08 2:82fdfeec5799 120 // VARIABLES GENERALES
dapi08 2:82fdfeec5799 121 float ana_velocidad = 0.0;
dapi08 2:82fdfeec5799 122 float ana_torque = 0.0;
dapi08 2:82fdfeec5799 123 bool newtime = false;
dapi08 2:82fdfeec5799 124 ntp_packet in_data; // para recibir fecha y hora del servidor
dapi08 2:82fdfeec5799 125
dapi08 2:82fdfeec5799 126 // VARIABLES DE COMUNICACION RS485
dapi08 3:55227f9877e0 127 volatile bool f_rs485_busy = false; // comunicacion ocupada
dapi08 3:55227f9877e0 128 volatile bool recibidoEstadoServo = false; //Si ha recibido estado del otro servo se pone a true para sincronizacion
dapi08 3:55227f9877e0 129
dapi08 2:82fdfeec5799 130
dapi08 2:82fdfeec5799 131 // TIMERS
dapi08 2:82fdfeec5799 132 Timer timer;
dapi08 2:82fdfeec5799 133 Ticker millis; // Interrupcion para cuenta de milisegundos
dapi08 3:55227f9877e0 134 Ticker tickRS485us; // Interrupcion de 100us para com rs485
dapi08 3:55227f9877e0 135 Timer timerRS485; // Timer para sincronizacion por rs485 de los mandos
dapi08 2:82fdfeec5799 136
dapi08 2:82fdfeec5799 137
dapi08 2:82fdfeec5799 138
dapi08 2:82fdfeec5799 139
dapi08 2:82fdfeec5799 140
dapi08 2:82fdfeec5799 141
dapi08 2:82fdfeec5799 142
dapi08 2:82fdfeec5799 143 // RUTINAS
dapi08 2:82fdfeec5799 144
dapi08 2:82fdfeec5799 145 // CUENTA MILISEGUNDOS DESDE RESET
dapi08 2:82fdfeec5799 146 void cuenta_ms() {
dapi08 2:82fdfeec5799 147 tiempo_ms++;
dapi08 2:82fdfeec5799 148 posicion_servo(); // AJUSTA POSICION SERVO SI ES NECESARIO
dapi08 2:82fdfeec5799 149 f_ms = true; // se pone en cada interrupcion de ms
dapi08 1:da6afd392792 150 }
dapi08 1:da6afd392792 151
dapi08 1:da6afd392792 152
dapi08 1:da6afd392792 153
dapi08 1:da6afd392792 154
dapi08 1:da6afd392792 155 /*
dapi08 1:da6afd392792 156 /////////////////////////////////////////////////////////
dapi08 1:da6afd392792 157 // PROCESA RECEPCION DESDE SERIAL SERVO
dapi08 1:da6afd392792 158 void onSerialServo(void){ // Procesa recepcion SERVO
dapi08 1:da6afd392792 159
dapi08 1:da6afd392792 160 while (serSERVO.readable()) {
dapi08 1:da6afd392792 161 char c = serSERVO.getc();
dapi08 2:82fdfeec5799 162 // pc.putc(c);
dapi08 2:82fdfeec5799 163 }
dapi08 2:82fdfeec5799 164 }
dapi08 2:82fdfeec5799 165 */
dapi08 2:82fdfeec5799 166
dapi08 2:82fdfeec5799 167
dapi08 2:82fdfeec5799 168
dapi08 2:82fdfeec5799 169
dapi08 2:82fdfeec5799 170
dapi08 2:82fdfeec5799 171 #define FACTOR_INC_RUMBO_BABOR 0.015
dapi08 2:82fdfeec5799 172 #define FACTOR_INC_RUMBO_ESTRIBOR 0.015
dapi08 2:82fdfeec5799 173
dapi08 2:82fdfeec5799 174 // PARA SIMULACION
dapi08 2:82fdfeec5799 175 // Pocesa rumbo_GPS, llamada cada 250ms
dapi08 2:82fdfeec5799 176 void procesa_rumbo_GPS(void){
dapi08 2:82fdfeec5799 177
dapi08 2:82fdfeec5799 178 datos_servo.rumbo -= datos_servo.timon_babor * FACTOR_INC_RUMBO_BABOR;
dapi08 2:82fdfeec5799 179 datos_servo.rumbo += datos_servo.timon_estribor * FACTOR_INC_RUMBO_ESTRIBOR;
dapi08 2:82fdfeec5799 180 // datos_servo.rumbo = flimit_decimales(datos_servo.rumbo, 2);
dapi08 2:82fdfeec5799 181 if(datos_servo.rumbo>360.0){
dapi08 2:82fdfeec5799 182 datos_servo.rumbo -= 360.0;
dapi08 2:82fdfeec5799 183 }
dapi08 2:82fdfeec5799 184 else if(datos_servo.rumbo<0.0){
dapi08 2:82fdfeec5799 185 datos_servo.rumbo += 360.0;
dapi08 1:da6afd392792 186 }
dapi08 1:da6afd392792 187 }
dapi08 1:da6afd392792 188
dapi08 1:da6afd392792 189
dapi08 1:da6afd392792 190
dapi08 1:da6afd392792 191 /////////////////////////////////////////////////////////
dapi08 2:82fdfeec5799 192 // PROGRAMA PRINCIPAL
dapi08 2:82fdfeec5799 193 int main() {
dapi08 2:82fdfeec5799 194 int nc=0;
dapi08 2:82fdfeec5799 195 char out_buffer_2[50];
dapi08 2:82fdfeec5799 196 static int posicion_mando_old = 0;
dapi08 1:da6afd392792 197
dapi08 1:da6afd392792 198
deepikabhavnani 0:cf516d904427 199 // Bring up the ethernet interface
dapi08 2:82fdfeec5799 200 pc.printf("\r\n\r\n");
dapi08 2:82fdfeec5799 201 pc.printf("RESET\r\n\r\n");
dapi08 1:da6afd392792 202 pc.printf("PROGRAMA CONTROL SERVO V0.1\r\n");
dapi08 3:55227f9877e0 203 pc.printf("CONTROL DE SERVO DE ");
dapi08 3:55227f9877e0 204 if(SEL0.read()==0) // Si es servo de babor = 0
dapi08 3:55227f9877e0 205 pc.printf("BABOR\r\n");
dapi08 3:55227f9877e0 206 else
dapi08 3:55227f9877e0 207 pc.printf("ESTRIBOR\r\n");
dapi08 3:55227f9877e0 208
dapi08 3:55227f9877e0 209
dapi08 1:da6afd392792 210
dapi08 2:82fdfeec5799 211 // Open Ethernet connection
dapi08 2:82fdfeec5799 212 int c=0;
dapi08 2:82fdfeec5799 213 do{
dapi08 2:82fdfeec5799 214 net.disconnect();
dapi08 2:82fdfeec5799 215 wait(2.0); // espera de 1s
dapi08 2:82fdfeec5799 216 int j = net.set_network(IP, MASK, GATEWAY);
dapi08 2:82fdfeec5799 217 printf("set IP status: %i\r\n", j);
dapi08 1:da6afd392792 218
dapi08 2:82fdfeec5799 219 c=net.connect();
dapi08 2:82fdfeec5799 220 if(0 != c) {
dapi08 2:82fdfeec5799 221 printf("Error connecting\r\n");
dapi08 2:82fdfeec5799 222 // return -1;
dapi08 2:82fdfeec5799 223 }
dapi08 2:82fdfeec5799 224 }while(c != 0);
deepikabhavnani 0:cf516d904427 225
deepikabhavnani 0:cf516d904427 226 // Show the network address
deepikabhavnani 0:cf516d904427 227 const char *ip = net.get_ip_address();
dapi08 1:da6afd392792 228 printf("IP address is: %s\r\n", ip ? ip : "No IP");
dapi08 2:82fdfeec5799 229
dapi08 2:82fdfeec5799 230 Thread t; // can pass in the stack size here if you run out of memory
dapi08 2:82fdfeec5799 231 t.start(&udp_main);
dapi08 2:82fdfeec5799 232
dapi08 2:82fdfeec5799 233
dapi08 2:82fdfeec5799 234 // Inicializa datos_servo ESTRUCTURA DE VARIABLES DE ESTADO DEL SERVO DE DIRECCION
dapi08 2:82fdfeec5799 235 datos_servo.n_servo = SEL0.read();
dapi08 2:82fdfeec5799 236 datos_servo.estado = 0;
dapi08 2:82fdfeec5799 237 datos_servo.latitud = 0.0;
dapi08 2:82fdfeec5799 238 datos_servo.longitud = 0.0;
dapi08 2:82fdfeec5799 239 datos_servo.fecha_hora = 0;
dapi08 2:82fdfeec5799 240 datos_servo.velocidad = 0.0; // MNPH
dapi08 2:82fdfeec5799 241 datos_servo.rumbo = 0.0;
dapi08 2:82fdfeec5799 242 datos_servo.ch_radio = 0;
dapi08 2:82fdfeec5799 243 datos_servo.trim_timon_bab = 0;
dapi08 2:82fdfeec5799 244 datos_servo.trim_trans_bab = 6;
dapi08 2:82fdfeec5799 245 datos_servo.trim_timon_estr = 0;
dapi08 2:82fdfeec5799 246 datos_servo.trim_trans_estr = 6;
dapi08 2:82fdfeec5799 247 datos_servo.timon_babor = 0; // %de timon babor bajado, para 100% 5s, 1% = 50ms
dapi08 2:82fdfeec5799 248 datos_servo.timon_estribor = 0; // %de timon estribor bajado, para 100% 5s
dapi08 2:82fdfeec5799 249 datos_servo.rumbo_fijado = 0.0; // Rumbo fijado al pulsar botón para RUMBO FIJO
dapi08 2:82fdfeec5799 250 datos_servo.rumbo_piloto_auto = 0.0; // Rumbo fijado por piloto automático
dapi08 2:82fdfeec5799 251
dapi08 2:82fdfeec5799 252 // Set handler to be called when UDP socket event occurrs.
dapi08 2:82fdfeec5799 253 // sock.attach(&onUDPSocketEvent);
dapi08 1:da6afd392792 254
dapi08 1:da6afd392792 255 timer.start();
dapi08 3:55227f9877e0 256 millis.attach(&cuenta_ms, 0.001); // the address of the function to be attached (cuenta_ms) and the interval (1 miliseconds)
dapi08 3:55227f9877e0 257 tickRS485us.attach(&SerialTxRS485, 0.0001); // Interrupcion de 100us para comunicaciones por RS485 con mando
dapi08 3:55227f9877e0 258 timerRS485.start(); // Timer para sincronizacion desde recepcion del otro control servo
dapi08 3:55227f9877e0 259
dapi08 2:82fdfeec5799 260 led1 = led2 = led3 =1;
dapi08 1:da6afd392792 261 wait(0.5);
dapi08 2:82fdfeec5799 262 led1 = led2 = led3 =0;
dapi08 2:82fdfeec5799 263
dapi08 2:82fdfeec5799 264 // serSERVO.attach(&onSerialServo); // Interrupcion de serial Servo
dapi08 2:82fdfeec5799 265 // serRS485.attach(&onSerialRxRS485, RxIrq); // Interrupcion de RX serial RS485 (MANDOS)
dapi08 2:82fdfeec5799 266 // serRS485.attach(&onSerialTxRS485, Serial::TxIrq); // Interrupcion de TX serial RS485 (MANDOS)
dapi08 2:82fdfeec5799 267
dapi08 2:82fdfeec5799 268 serGPS.attach(&onSerialGPS); // Interrupcion de serial GPS
dapi08 1:da6afd392792 269
dapi08 1:da6afd392792 270 RS485_OE = 1; // habilita conversor 3.3V a 5V para RS485
dapi08 1:da6afd392792 271
dapi08 2:82fdfeec5799 272 /*
dapi08 1:da6afd392792 273 SRV_C_TRQ_P.period(0.001f); // 1 kHz or 1 ms
dapi08 1:da6afd392792 274 SRV_C_TRQ_N.period(0.001f); // 1 kHz or 1 ms
dapi08 1:da6afd392792 275 SRV_C_TRQ_P=0;
dapi08 1:da6afd392792 276 SRV_C_TRQ_N=0;
dapi08 2:82fdfeec5799 277 */
dapi08 2:82fdfeec5799 278
dapi08 2:82fdfeec5799 279 SERVO_ON = 1; // Pone servo en ON
dapi08 2:82fdfeec5799 280
dapi08 2:82fdfeec5799 281 // uint8_t i=0;
dapi08 2:82fdfeec5799 282
dapi08 2:82fdfeec5799 283 // SetDateTime(2020, 4, 25, 10, 00, 0); // Actualiza hora del RTC
dapi08 2:82fdfeec5799 284 // ShowDateTime();
deepikabhavnani 0:cf516d904427 285
dapi08 1:da6afd392792 286 while(1){
dapi08 1:da6afd392792 287
dapi08 2:82fdfeec5799 288 while(f_ms!=true); // espera interrupcion de 1 ms
dapi08 2:82fdfeec5799 289 f_ms = false;
dapi08 2:82fdfeec5799 290
dapi08 2:82fdfeec5799 291 procesaGPS(); // Comprueba trama pendiente de GPS y la procesa
dapi08 1:da6afd392792 292
dapi08 2:82fdfeec5799 293 if(datos_servo.estado == DIR_MASTER || datos_servo.estado == DIR_REPOSO)
dapi08 2:82fdfeec5799 294 datos_servo.posicion_mando = desviacion_servo;
dapi08 2:82fdfeec5799 295 else
dapi08 2:82fdfeec5799 296 datos_servo.posicion_mando = pos_objetivo_servo; // PARA PILOTO AUTOMATICO
dapi08 2:82fdfeec5799 297
dapi08 2:82fdfeec5799 298 if(datos_servo.posicion_mando != posicion_mando_old){ // Si cambia la posicion del mando envia trama
dapi08 2:82fdfeec5799 299 if(abs(desviacion_servo) >= 50 && datos_servo.estado == DIR_REPOSO && estado_otro_servo == DIR_REPOSO){
dapi08 2:82fdfeec5799 300 datos_servo.estado = DIR_MASTER;
dapi08 1:da6afd392792 301 }
dapi08 2:82fdfeec5799 302
dapi08 2:82fdfeec5799 303 if(datos_servo.estado == DIR_MASTER || datos_servo.estado == DIR_RUMBO || datos_servo.estado == DIR_PILOTO)
dapi08 2:82fdfeec5799 304 envia_posicion_mando(datos_servo.posicion_mando);
dapi08 2:82fdfeec5799 305 posicion_mando_old = datos_servo.posicion_mando;
dapi08 2:82fdfeec5799 306 }
dapi08 2:82fdfeec5799 307
dapi08 2:82fdfeec5799 308 // PROCESA CADA SEGUNDO
dapi08 2:82fdfeec5799 309 if(((tiempo_ms+500)%1000)==0){ // Envia cada segundo
dapi08 2:82fdfeec5799 310
dapi08 2:82fdfeec5799 311 // getTime();
dapi08 2:82fdfeec5799 312
dapi08 2:82fdfeec5799 313 // SetDateTime(2020, 4, 25, 10, 00, 0); // Actualiza hora del RTC
dapi08 2:82fdfeec5799 314 // ShowDateTime();
dapi08 2:82fdfeec5799 315 // pc.printf("tiempo_ms:%d\r\n", tiempo_ms);
dapi08 2:82fdfeec5799 316
dapi08 2:82fdfeec5799 317 // 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 318 // 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 319
dapi08 2:82fdfeec5799 320 // procesa_servo(); // lee estado del servo, procesa torque y actualiza
dapi08 2:82fdfeec5799 321 // envia_posicion_mando(datos_servo.posicion_mando);
dapi08 2:82fdfeec5799 322
dapi08 2:82fdfeec5799 323 // printf("tiempo_ms=%d pos_objetivo_servo=%d SEL0=%d ESTADO=%d\r\n", tiempo_ms, pos_objetivo_servo, SEL0.read(), datos_servo.estado);
dapi08 2:82fdfeec5799 324 }
dapi08 1:da6afd392792 325
dapi08 2:82fdfeec5799 326 /*
dapi08 2:82fdfeec5799 327 //PROCESO CADA 10ms
dapi08 2:82fdfeec5799 328 if((tiempo_ms%10) == 0){
dapi08 2:82fdfeec5799 329 ana_velocidad = SRV_VEL.read(); // 1.0=VCC, lee entradas analogicas
dapi08 2:82fdfeec5799 330 ana_torque = SRV_TRQ.read();
dapi08 2:82fdfeec5799 331 SRV_C_TRQ_P.pulsewidth(ana_velocidad*0.001f); // Ajusta PWM de salida DAC
dapi08 2:82fdfeec5799 332 SRV_C_TRQ_N.pulsewidth(ana_torque*0.001f);
dapi08 2:82fdfeec5799 333 }
dapi08 2:82fdfeec5799 334 */
dapi08 2:82fdfeec5799 335 //PROCESO CADA 100ms
dapi08 2:82fdfeec5799 336 if((tiempo_ms%100) == 0){
dapi08 2:82fdfeec5799 337 // procesa_rumbo_GPS(); // SIMULA RUMBO SEGUN TIMON PARA GPS
dapi08 2:82fdfeec5799 338 // procesa_posicion_timones(); // Pocesa activación y posición timones, llamada cada 100ms
dapi08 2:82fdfeec5799 339 }
dapi08 1:da6afd392792 340
dapi08 2:82fdfeec5799 341 //PROCESO CADA 250ms
dapi08 2:82fdfeec5799 342 if((tiempo_ms%250) == 0){
dapi08 2:82fdfeec5799 343 procesa_servo(); // lee estado del servo, procesa torque y actualiza
dapi08 2:82fdfeec5799 344 procesa_posicion_timones(); // Pocesa activación y posición timones, llamada cada 250ms
dapi08 2:82fdfeec5799 345 actualiza_timones(); // ACTUALIZA TIMONES
dapi08 2:82fdfeec5799 346 procesa_rumbo_GPS(); // SIMULA RUMBO SEGUN TIMON PARA GPS
dapi08 2:82fdfeec5799 347 }
dapi08 1:da6afd392792 348
dapi08 3:55227f9877e0 349 if(recibidoEstadoServo==true){ //Si ha recibido estado del otro servo está a true para sincronizacion
dapi08 3:55227f9877e0 350 if(timerRS485.read_ms()>=110){
dapi08 3:55227f9877e0 351 envia_estado_mando();
dapi08 3:55227f9877e0 352 recibidoEstadoServo = false;
dapi08 3:55227f9877e0 353 timerRS485.reset();
dapi08 3:55227f9877e0 354 }
dapi08 3:55227f9877e0 355 }
dapi08 3:55227f9877e0 356 else{
dapi08 3:55227f9877e0 357 int espera = (SEL0.read()==0)? 240 :260;
dapi08 3:55227f9877e0 358 if(timerRS485.read_ms()>=espera){ // Si es servo de babor = 240ms, estribor = 260ms, evita colision
dapi08 3:55227f9877e0 359 envia_estado_mando();
dapi08 3:55227f9877e0 360 timerRS485.reset();
dapi08 3:55227f9877e0 361 }
dapi08 3:55227f9877e0 362 }
dapi08 3:55227f9877e0 363
dapi08 1:da6afd392792 364 // control_PWR_servo = (pulsador.read() == 1)?0:1;
dapi08 1:da6afd392792 365 control_PWR_servo = 0; // encendido
dapi08 2:82fdfeec5799 366
dapi08 2:82fdfeec5799 367 // PROCESO CADA 10 SEGUNDOS
dapi08 2:82fdfeec5799 368 if((tiempo_ms%10000)==0){
dapi08 1:da6afd392792 369
dapi08 2:82fdfeec5799 370 /*
dapi08 2:82fdfeec5799 371 if(pos_objetivo_servo == 0){
dapi08 2:82fdfeec5799 372 pos_objetivo_servo = 200;
dapi08 2:82fdfeec5799 373 escribe_parametro_servo(0, 13, TORQUE_MAXIMO);
dapi08 2:82fdfeec5799 374 }
dapi08 2:82fdfeec5799 375 else if(pos_objetivo_servo == 200){
dapi08 2:82fdfeec5799 376 pos_objetivo_servo = -200;
dapi08 2:82fdfeec5799 377 escribe_parametro_servo(0, 13, TORQUE_MAXIMO);
dapi08 2:82fdfeec5799 378 }
dapi08 2:82fdfeec5799 379 else if(pos_objetivo_servo == -200){
dapi08 2:82fdfeec5799 380 pos_objetivo_servo = 0;
dapi08 2:82fdfeec5799 381 escribe_parametro_servo(0, 13, TORQUE_MINIMO);
dapi08 2:82fdfeec5799 382 }
dapi08 2:82fdfeec5799 383 // printf("\r\n\r\npos_objetivo_servo=%d\r\n\r\n",pos_objetivo_servo);
dapi08 2:82fdfeec5799 384 */
dapi08 1:da6afd392792 385 }
dapi08 1:da6afd392792 386
dapi08 1:da6afd392792 387 // Thread::wait(10000);
dapi08 1:da6afd392792 388 }
dapi08 1:da6afd392792 389
deepikabhavnani 0:cf516d904427 390 return 0;
dapi08 1:da6afd392792 391 }