Pedro Campos
/
SERVOS_V0_3
test
main.cpp@5:420cb56093d3, 2020-06-19 (annotated)
- 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?
User | Revision | Line number | New 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 | } |