Pedro Campos
/
SERVOS_V0_3
test
main.cpp@2:82fdfeec5799, 2020-05-27 (annotated)
- Committer:
- dapi08
- Date:
- Wed May 27 07:50:09 2020 +0000
- Revision:
- 2:82fdfeec5799
- Parent:
- 1:da6afd392792
- Child:
- 3:55227f9877e0
Sincroniza RTC con GPS;
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 | 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 | 2:82fdfeec5799 | 127 | volatile bool f_rs485_busy = false; // comunicacion ocupada |
dapi08 | 2:82fdfeec5799 | 128 | |
dapi08 | 2:82fdfeec5799 | 129 | // TIMERS |
dapi08 | 2:82fdfeec5799 | 130 | Timer timer; |
dapi08 | 2:82fdfeec5799 | 131 | Ticker millis; // Interrupcion para cuenta de milisegundos |
dapi08 | 2:82fdfeec5799 | 132 | Ticker tick250us; // Interrupcion de 250us para com rs485 |
dapi08 | 2:82fdfeec5799 | 133 | |
dapi08 | 2:82fdfeec5799 | 134 | |
dapi08 | 2:82fdfeec5799 | 135 | |
dapi08 | 2:82fdfeec5799 | 136 | |
dapi08 | 2:82fdfeec5799 | 137 | |
dapi08 | 2:82fdfeec5799 | 138 | |
dapi08 | 2:82fdfeec5799 | 139 | |
dapi08 | 2:82fdfeec5799 | 140 | |
dapi08 | 2:82fdfeec5799 | 141 | // RUTINAS |
dapi08 | 2:82fdfeec5799 | 142 | |
dapi08 | 2:82fdfeec5799 | 143 | // CUENTA MILISEGUNDOS DESDE RESET |
dapi08 | 2:82fdfeec5799 | 144 | void cuenta_ms() { |
dapi08 | 2:82fdfeec5799 | 145 | tiempo_ms++; |
dapi08 | 2:82fdfeec5799 | 146 | posicion_servo(); // AJUSTA POSICION SERVO SI ES NECESARIO |
dapi08 | 2:82fdfeec5799 | 147 | f_ms = true; // se pone en cada interrupcion de ms |
dapi08 | 1:da6afd392792 | 148 | } |
dapi08 | 1:da6afd392792 | 149 | |
dapi08 | 1:da6afd392792 | 150 | |
dapi08 | 1:da6afd392792 | 151 | |
dapi08 | 1:da6afd392792 | 152 | |
dapi08 | 1:da6afd392792 | 153 | /* |
dapi08 | 1:da6afd392792 | 154 | ///////////////////////////////////////////////////////// |
dapi08 | 1:da6afd392792 | 155 | // PROCESA RECEPCION DESDE SERIAL SERVO |
dapi08 | 1:da6afd392792 | 156 | void onSerialServo(void){ // Procesa recepcion SERVO |
dapi08 | 1:da6afd392792 | 157 | |
dapi08 | 1:da6afd392792 | 158 | while (serSERVO.readable()) { |
dapi08 | 1:da6afd392792 | 159 | char c = serSERVO.getc(); |
dapi08 | 2:82fdfeec5799 | 160 | // pc.putc(c); |
dapi08 | 2:82fdfeec5799 | 161 | } |
dapi08 | 2:82fdfeec5799 | 162 | } |
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 | #define FACTOR_INC_RUMBO_BABOR 0.015 |
dapi08 | 2:82fdfeec5799 | 170 | #define FACTOR_INC_RUMBO_ESTRIBOR 0.015 |
dapi08 | 2:82fdfeec5799 | 171 | |
dapi08 | 2:82fdfeec5799 | 172 | // PARA SIMULACION |
dapi08 | 2:82fdfeec5799 | 173 | // Pocesa rumbo_GPS, llamada cada 250ms |
dapi08 | 2:82fdfeec5799 | 174 | void procesa_rumbo_GPS(void){ |
dapi08 | 2:82fdfeec5799 | 175 | |
dapi08 | 2:82fdfeec5799 | 176 | datos_servo.rumbo -= datos_servo.timon_babor * FACTOR_INC_RUMBO_BABOR; |
dapi08 | 2:82fdfeec5799 | 177 | datos_servo.rumbo += datos_servo.timon_estribor * FACTOR_INC_RUMBO_ESTRIBOR; |
dapi08 | 2:82fdfeec5799 | 178 | // datos_servo.rumbo = flimit_decimales(datos_servo.rumbo, 2); |
dapi08 | 2:82fdfeec5799 | 179 | if(datos_servo.rumbo>360.0){ |
dapi08 | 2:82fdfeec5799 | 180 | datos_servo.rumbo -= 360.0; |
dapi08 | 2:82fdfeec5799 | 181 | } |
dapi08 | 2:82fdfeec5799 | 182 | else if(datos_servo.rumbo<0.0){ |
dapi08 | 2:82fdfeec5799 | 183 | datos_servo.rumbo += 360.0; |
dapi08 | 1:da6afd392792 | 184 | } |
dapi08 | 1:da6afd392792 | 185 | } |
dapi08 | 1:da6afd392792 | 186 | |
dapi08 | 1:da6afd392792 | 187 | |
dapi08 | 1:da6afd392792 | 188 | |
dapi08 | 1:da6afd392792 | 189 | ///////////////////////////////////////////////////////// |
dapi08 | 2:82fdfeec5799 | 190 | // PROGRAMA PRINCIPAL |
dapi08 | 2:82fdfeec5799 | 191 | int main() { |
dapi08 | 2:82fdfeec5799 | 192 | int nc=0; |
dapi08 | 2:82fdfeec5799 | 193 | char out_buffer_2[50]; |
dapi08 | 2:82fdfeec5799 | 194 | static int posicion_mando_old = 0; |
dapi08 | 1:da6afd392792 | 195 | |
dapi08 | 1:da6afd392792 | 196 | |
deepikabhavnani | 0:cf516d904427 | 197 | // Bring up the ethernet interface |
dapi08 | 2:82fdfeec5799 | 198 | pc.printf("\r\n\r\n"); |
dapi08 | 2:82fdfeec5799 | 199 | pc.printf("RESET\r\n\r\n"); |
dapi08 | 1:da6afd392792 | 200 | pc.printf("PROGRAMA CONTROL SERVO V0.1\r\n"); |
dapi08 | 1:da6afd392792 | 201 | pc.printf("PRUEBAS DE COMUNICACION POR UDP\r\n"); |
dapi08 | 1:da6afd392792 | 202 | |
dapi08 | 2:82fdfeec5799 | 203 | // Open Ethernet connection |
dapi08 | 2:82fdfeec5799 | 204 | int c=0; |
dapi08 | 2:82fdfeec5799 | 205 | do{ |
dapi08 | 2:82fdfeec5799 | 206 | net.disconnect(); |
dapi08 | 2:82fdfeec5799 | 207 | wait(2.0); // espera de 1s |
dapi08 | 2:82fdfeec5799 | 208 | int j = net.set_network(IP, MASK, GATEWAY); |
dapi08 | 2:82fdfeec5799 | 209 | printf("set IP status: %i\r\n", j); |
dapi08 | 1:da6afd392792 | 210 | |
dapi08 | 2:82fdfeec5799 | 211 | c=net.connect(); |
dapi08 | 2:82fdfeec5799 | 212 | if(0 != c) { |
dapi08 | 2:82fdfeec5799 | 213 | printf("Error connecting\r\n"); |
dapi08 | 2:82fdfeec5799 | 214 | // return -1; |
dapi08 | 2:82fdfeec5799 | 215 | } |
dapi08 | 2:82fdfeec5799 | 216 | }while(c != 0); |
deepikabhavnani | 0:cf516d904427 | 217 | |
deepikabhavnani | 0:cf516d904427 | 218 | // Show the network address |
deepikabhavnani | 0:cf516d904427 | 219 | const char *ip = net.get_ip_address(); |
dapi08 | 1:da6afd392792 | 220 | printf("IP address is: %s\r\n", ip ? ip : "No IP"); |
dapi08 | 2:82fdfeec5799 | 221 | |
dapi08 | 2:82fdfeec5799 | 222 | Thread t; // can pass in the stack size here if you run out of memory |
dapi08 | 2:82fdfeec5799 | 223 | t.start(&udp_main); |
dapi08 | 2:82fdfeec5799 | 224 | |
dapi08 | 2:82fdfeec5799 | 225 | |
dapi08 | 2:82fdfeec5799 | 226 | // Inicializa datos_servo ESTRUCTURA DE VARIABLES DE ESTADO DEL SERVO DE DIRECCION |
dapi08 | 2:82fdfeec5799 | 227 | datos_servo.n_servo = SEL0.read(); |
dapi08 | 2:82fdfeec5799 | 228 | datos_servo.estado = 0; |
dapi08 | 2:82fdfeec5799 | 229 | datos_servo.latitud = 0.0; |
dapi08 | 2:82fdfeec5799 | 230 | datos_servo.longitud = 0.0; |
dapi08 | 2:82fdfeec5799 | 231 | datos_servo.fecha_hora = 0; |
dapi08 | 2:82fdfeec5799 | 232 | datos_servo.velocidad = 0.0; // MNPH |
dapi08 | 2:82fdfeec5799 | 233 | datos_servo.rumbo = 0.0; |
dapi08 | 2:82fdfeec5799 | 234 | datos_servo.ch_radio = 0; |
dapi08 | 2:82fdfeec5799 | 235 | datos_servo.trim_timon_bab = 0; |
dapi08 | 2:82fdfeec5799 | 236 | datos_servo.trim_trans_bab = 6; |
dapi08 | 2:82fdfeec5799 | 237 | datos_servo.trim_timon_estr = 0; |
dapi08 | 2:82fdfeec5799 | 238 | datos_servo.trim_trans_estr = 6; |
dapi08 | 2:82fdfeec5799 | 239 | datos_servo.timon_babor = 0; // %de timon babor bajado, para 100% 5s, 1% = 50ms |
dapi08 | 2:82fdfeec5799 | 240 | datos_servo.timon_estribor = 0; // %de timon estribor bajado, para 100% 5s |
dapi08 | 2:82fdfeec5799 | 241 | datos_servo.rumbo_fijado = 0.0; // Rumbo fijado al pulsar botón para RUMBO FIJO |
dapi08 | 2:82fdfeec5799 | 242 | datos_servo.rumbo_piloto_auto = 0.0; // Rumbo fijado por piloto automático |
dapi08 | 2:82fdfeec5799 | 243 | |
dapi08 | 2:82fdfeec5799 | 244 | // Set handler to be called when UDP socket event occurrs. |
dapi08 | 2:82fdfeec5799 | 245 | // sock.attach(&onUDPSocketEvent); |
dapi08 | 1:da6afd392792 | 246 | |
dapi08 | 1:da6afd392792 | 247 | timer.start(); |
dapi08 | 2:82fdfeec5799 | 248 | millis.attach(&cuenta_ms, 0.001); // the address of the function to be attached (cuenta_ms) and the interval (1 miliseconds) |
dapi08 | 2:82fdfeec5799 | 249 | tick250us.attach(&int250us, 0.0001); // Interrupcion de 250us para comunicaciones por RS485 con mando |
dapi08 | 2:82fdfeec5799 | 250 | led1 = led2 = led3 =1; |
dapi08 | 1:da6afd392792 | 251 | wait(0.5); |
dapi08 | 2:82fdfeec5799 | 252 | led1 = led2 = led3 =0; |
dapi08 | 2:82fdfeec5799 | 253 | |
dapi08 | 2:82fdfeec5799 | 254 | // serSERVO.attach(&onSerialServo); // Interrupcion de serial Servo |
dapi08 | 2:82fdfeec5799 | 255 | // serRS485.attach(&onSerialRxRS485, RxIrq); // Interrupcion de RX serial RS485 (MANDOS) |
dapi08 | 2:82fdfeec5799 | 256 | // serRS485.attach(&onSerialTxRS485, Serial::TxIrq); // Interrupcion de TX serial RS485 (MANDOS) |
dapi08 | 2:82fdfeec5799 | 257 | |
dapi08 | 2:82fdfeec5799 | 258 | serGPS.attach(&onSerialGPS); // Interrupcion de serial GPS |
dapi08 | 1:da6afd392792 | 259 | |
dapi08 | 1:da6afd392792 | 260 | RS485_OE = 1; // habilita conversor 3.3V a 5V para RS485 |
dapi08 | 1:da6afd392792 | 261 | |
dapi08 | 2:82fdfeec5799 | 262 | /* |
dapi08 | 1:da6afd392792 | 263 | SRV_C_TRQ_P.period(0.001f); // 1 kHz or 1 ms |
dapi08 | 1:da6afd392792 | 264 | SRV_C_TRQ_N.period(0.001f); // 1 kHz or 1 ms |
dapi08 | 1:da6afd392792 | 265 | SRV_C_TRQ_P=0; |
dapi08 | 1:da6afd392792 | 266 | SRV_C_TRQ_N=0; |
dapi08 | 2:82fdfeec5799 | 267 | */ |
dapi08 | 2:82fdfeec5799 | 268 | |
dapi08 | 2:82fdfeec5799 | 269 | SERVO_ON = 1; // Pone servo en ON |
dapi08 | 2:82fdfeec5799 | 270 | |
dapi08 | 2:82fdfeec5799 | 271 | // uint8_t i=0; |
dapi08 | 2:82fdfeec5799 | 272 | |
dapi08 | 2:82fdfeec5799 | 273 | // SetDateTime(2020, 4, 25, 10, 00, 0); // Actualiza hora del RTC |
dapi08 | 2:82fdfeec5799 | 274 | // ShowDateTime(); |
deepikabhavnani | 0:cf516d904427 | 275 | |
dapi08 | 1:da6afd392792 | 276 | while(1){ |
dapi08 | 1:da6afd392792 | 277 | |
dapi08 | 2:82fdfeec5799 | 278 | while(f_ms!=true); // espera interrupcion de 1 ms |
dapi08 | 2:82fdfeec5799 | 279 | f_ms = false; |
dapi08 | 2:82fdfeec5799 | 280 | |
dapi08 | 2:82fdfeec5799 | 281 | procesaGPS(); // Comprueba trama pendiente de GPS y la procesa |
dapi08 | 1:da6afd392792 | 282 | |
dapi08 | 2:82fdfeec5799 | 283 | if(datos_servo.estado == DIR_MASTER || datos_servo.estado == DIR_REPOSO) |
dapi08 | 2:82fdfeec5799 | 284 | datos_servo.posicion_mando = desviacion_servo; |
dapi08 | 2:82fdfeec5799 | 285 | else |
dapi08 | 2:82fdfeec5799 | 286 | datos_servo.posicion_mando = pos_objetivo_servo; // PARA PILOTO AUTOMATICO |
dapi08 | 2:82fdfeec5799 | 287 | |
dapi08 | 2:82fdfeec5799 | 288 | if(datos_servo.posicion_mando != posicion_mando_old){ // Si cambia la posicion del mando envia trama |
dapi08 | 2:82fdfeec5799 | 289 | if(abs(desviacion_servo) >= 50 && datos_servo.estado == DIR_REPOSO && estado_otro_servo == DIR_REPOSO){ |
dapi08 | 2:82fdfeec5799 | 290 | datos_servo.estado = DIR_MASTER; |
dapi08 | 1:da6afd392792 | 291 | } |
dapi08 | 2:82fdfeec5799 | 292 | |
dapi08 | 2:82fdfeec5799 | 293 | if(datos_servo.estado == DIR_MASTER || datos_servo.estado == DIR_RUMBO || datos_servo.estado == DIR_PILOTO) |
dapi08 | 2:82fdfeec5799 | 294 | envia_posicion_mando(datos_servo.posicion_mando); |
dapi08 | 2:82fdfeec5799 | 295 | posicion_mando_old = datos_servo.posicion_mando; |
dapi08 | 2:82fdfeec5799 | 296 | } |
dapi08 | 2:82fdfeec5799 | 297 | |
dapi08 | 2:82fdfeec5799 | 298 | // PROCESA CADA SEGUNDO |
dapi08 | 2:82fdfeec5799 | 299 | if(((tiempo_ms+500)%1000)==0){ // Envia cada segundo |
dapi08 | 2:82fdfeec5799 | 300 | |
dapi08 | 2:82fdfeec5799 | 301 | // getTime(); |
dapi08 | 2:82fdfeec5799 | 302 | |
dapi08 | 2:82fdfeec5799 | 303 | // SetDateTime(2020, 4, 25, 10, 00, 0); // Actualiza hora del RTC |
dapi08 | 2:82fdfeec5799 | 304 | // ShowDateTime(); |
dapi08 | 2:82fdfeec5799 | 305 | // pc.printf("tiempo_ms:%d\r\n", tiempo_ms); |
dapi08 | 2:82fdfeec5799 | 306 | |
dapi08 | 2:82fdfeec5799 | 307 | // 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 | 308 | // 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 | 309 | |
dapi08 | 2:82fdfeec5799 | 310 | // procesa_servo(); // lee estado del servo, procesa torque y actualiza |
dapi08 | 2:82fdfeec5799 | 311 | // envia_posicion_mando(datos_servo.posicion_mando); |
dapi08 | 2:82fdfeec5799 | 312 | |
dapi08 | 2:82fdfeec5799 | 313 | // 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 | 314 | } |
dapi08 | 1:da6afd392792 | 315 | |
dapi08 | 2:82fdfeec5799 | 316 | /* |
dapi08 | 2:82fdfeec5799 | 317 | //PROCESO CADA 10ms |
dapi08 | 2:82fdfeec5799 | 318 | if((tiempo_ms%10) == 0){ |
dapi08 | 2:82fdfeec5799 | 319 | ana_velocidad = SRV_VEL.read(); // 1.0=VCC, lee entradas analogicas |
dapi08 | 2:82fdfeec5799 | 320 | ana_torque = SRV_TRQ.read(); |
dapi08 | 2:82fdfeec5799 | 321 | SRV_C_TRQ_P.pulsewidth(ana_velocidad*0.001f); // Ajusta PWM de salida DAC |
dapi08 | 2:82fdfeec5799 | 322 | SRV_C_TRQ_N.pulsewidth(ana_torque*0.001f); |
dapi08 | 2:82fdfeec5799 | 323 | } |
dapi08 | 2:82fdfeec5799 | 324 | */ |
dapi08 | 2:82fdfeec5799 | 325 | //PROCESO CADA 100ms |
dapi08 | 2:82fdfeec5799 | 326 | if((tiempo_ms%100) == 0){ |
dapi08 | 2:82fdfeec5799 | 327 | // procesa_rumbo_GPS(); // SIMULA RUMBO SEGUN TIMON PARA GPS |
dapi08 | 2:82fdfeec5799 | 328 | // procesa_posicion_timones(); // Pocesa activación y posición timones, llamada cada 100ms |
dapi08 | 2:82fdfeec5799 | 329 | } |
dapi08 | 1:da6afd392792 | 330 | |
dapi08 | 2:82fdfeec5799 | 331 | //PROCESO CADA 250ms |
dapi08 | 2:82fdfeec5799 | 332 | if((tiempo_ms%250) == 0){ |
dapi08 | 2:82fdfeec5799 | 333 | procesa_servo(); // lee estado del servo, procesa torque y actualiza |
dapi08 | 2:82fdfeec5799 | 334 | procesa_posicion_timones(); // Pocesa activación y posición timones, llamada cada 250ms |
dapi08 | 2:82fdfeec5799 | 335 | actualiza_timones(); // ACTUALIZA TIMONES |
dapi08 | 2:82fdfeec5799 | 336 | procesa_rumbo_GPS(); // SIMULA RUMBO SEGUN TIMON PARA GPS |
dapi08 | 2:82fdfeec5799 | 337 | envia_estado_mando(); // cada 250ms |
dapi08 | 2:82fdfeec5799 | 338 | } |
dapi08 | 1:da6afd392792 | 339 | |
dapi08 | 1:da6afd392792 | 340 | |
dapi08 | 1:da6afd392792 | 341 | // control_PWR_servo = (pulsador.read() == 1)?0:1; |
dapi08 | 1:da6afd392792 | 342 | control_PWR_servo = 0; // encendido |
dapi08 | 2:82fdfeec5799 | 343 | |
dapi08 | 2:82fdfeec5799 | 344 | // PROCESO CADA 10 SEGUNDOS |
dapi08 | 2:82fdfeec5799 | 345 | if((tiempo_ms%10000)==0){ |
dapi08 | 1:da6afd392792 | 346 | |
dapi08 | 2:82fdfeec5799 | 347 | /* |
dapi08 | 2:82fdfeec5799 | 348 | if(pos_objetivo_servo == 0){ |
dapi08 | 2:82fdfeec5799 | 349 | pos_objetivo_servo = 200; |
dapi08 | 2:82fdfeec5799 | 350 | escribe_parametro_servo(0, 13, TORQUE_MAXIMO); |
dapi08 | 2:82fdfeec5799 | 351 | } |
dapi08 | 2:82fdfeec5799 | 352 | else if(pos_objetivo_servo == 200){ |
dapi08 | 2:82fdfeec5799 | 353 | pos_objetivo_servo = -200; |
dapi08 | 2:82fdfeec5799 | 354 | escribe_parametro_servo(0, 13, TORQUE_MAXIMO); |
dapi08 | 2:82fdfeec5799 | 355 | } |
dapi08 | 2:82fdfeec5799 | 356 | else if(pos_objetivo_servo == -200){ |
dapi08 | 2:82fdfeec5799 | 357 | pos_objetivo_servo = 0; |
dapi08 | 2:82fdfeec5799 | 358 | escribe_parametro_servo(0, 13, TORQUE_MINIMO); |
dapi08 | 2:82fdfeec5799 | 359 | } |
dapi08 | 2:82fdfeec5799 | 360 | // printf("\r\n\r\npos_objetivo_servo=%d\r\n\r\n",pos_objetivo_servo); |
dapi08 | 2:82fdfeec5799 | 361 | */ |
dapi08 | 1:da6afd392792 | 362 | } |
dapi08 | 1:da6afd392792 | 363 | |
dapi08 | 1:da6afd392792 | 364 | // Thread::wait(10000); |
dapi08 | 1:da6afd392792 | 365 | } |
dapi08 | 1:da6afd392792 | 366 | |
deepikabhavnani | 0:cf516d904427 | 367 | return 0; |
dapi08 | 1:da6afd392792 | 368 | } |