Pedro Campos
/
SERVOS_V0_3
test
main.cpp
- Committer:
- dapi08
- Date:
- 2020-04-20
- Revision:
- 1:da6afd392792
- Parent:
- 0:cf516d904427
- Child:
- 2:82fdfeec5799
File content as of revision 1:da6afd392792:
#include "mbed.h" #include "EthernetInterface.h" #define IP "192.168.1.227" #define GATEWAY "192.168.1.1" #define MASK "255.255.255.0" // Network interface EthernetInterface net; // CANALES DE COMUNICACION Serial pc(SERIAL_TX, SERIAL_RX, 115200); Serial serGPS(PC_10, PC_11, 9600); Serial serSERVO(PC_12, PD_2, 115200); Serial serRS485(PD_5, PD_6, 115200); // SALIDAS PARA LEDS DigitalOut led1(LED1, 0); //LED1 DigitalOut led2(LED2, 0); DigitalOut led3(LED3, 0); // SALIDAS DE CONTROL COMUNICACIONES DigitalOut RS485_DIR(PE_3, 0); //DIR RS485 a RX DigitalOut RS485_OE(PF_7, 0); //OE RS485 a tri-state // SALIDAS PARA CONTROL DEL SERVO DigitalOut control_PWR_servo(PF_9, 1); // Alimentacion del inverter para 220V del servo DigitalOut SERVO_ON(PG_1, 0); // Salida de control ON del servo (J7-2) DigitalOut SERVO_CLR_COUNT(PG_0, 0); // Salida de control CLR_COUNT del servo (J7-1) DigitalOut SERVO_ALARM_CLR(PF_0, 0); // Salida de control ALARM_CLR del servo (J7-4) DigitalOut SERVO_CONTROL_MODE(PC_6, 0); // Salida de control CONTROL_MODE del servo (J7-3) DigitalOut SERVO_INC_POS(PB_10, 0); // Salida de control INC_POS del servo (J1-2) DigitalOut SERVO_DEC_POS(PB_11, 0); // Salida de control DEC_POS del servo (J1-3) DigitalOut SERVO_AUX_OUT(PA_15, 0); // Salida de control AUX_OUT del servo (J7-10) // ENTRADAS DE ESTADO DEL SERVO DigitalIn SERVO_RDY_IN(PF_13); //Entrada desde SERVO_RDY, 1=activa; DigitalIn SERVO_AL_IN(PE_9); //Entrada desde SERVO_AL, 1=activa; DigitalIn SERVO_POS_IN(PE_11); //Entrada desde SERVO_POS, 1=activa; DigitalIn SERVO_TORQ_L_IN(PF_14); //Entrada desde SERVO_TORQ_L, 1=activa; DigitalIn SERVO_Z_SPEED_IN(PE_13); //Entrada desde SERVO_Z_SPEED, 1=activa; DigitalIn SRV_D_VEL(PF_2); //Entrada desde SERVO signo nivel de velocidad 1=positivo DigitalIn SRV_D_TRQ(PF_1); //Entrada desde SERVO signo nivel de torque 1=positivo // SALIDAS PWM PwmOut SRV_C_TRQ_P(PD_13); // Salida PWM para control del torque POSITIVO del SERVO PwmOut SRV_C_TRQ_N(PA_0); // Salida PWM para control del torque NEGATIVO del SERVO // ENTRADAS ANALOGICAS AnalogIn SRV_VEL(PA_3); // Entrada analogica de VELOCIDAD del servo AnalogIn SRV_TRQ(PC_0); // Entrada analogica de TORQUE del servo // ENTRADAS GENERALES DigitalIn pulsador(PC_13); //Pulsador de usuario, 1=pulsado; long tiempo_ms = 0; long tiempo = 0; float velocidad = 0.0; float torque = 0.0; Timer timer; Ticker flipper; void flip() { led2 = !led2; led3 = !led3; } // Time protocol implementation : Address: time.nist.gov UDPPort: 37 typedef struct { uint32_t secs; // Transmit Time-stamp seconds. }ntp_packet; ///////////////////////////////////////////////////////// // PROCESA RECEPCION DESDE GPS void procesa_recepcion(void){ // Procesa recepcion GPS /* while (serGPS.readable()) { char c = serGPS.getc(); pc.putc(c); } while (serSERVO.readable()) { char c = serSERVO.getc(); pc.putc(c); } */ } ///////////////////////////////////////////////////////// // PROCESA RECEPCION DESDE SERIAL SERVO void onSerialServo(void){ // Procesa recepcion SERVO while (serSERVO.readable()) { char c = serSERVO.getc(); pc.putc(c); } } ///////////////////////////////////////////////////////// // PROCESA RECEPCION DESDE SERIAL RS485 void onSerialRS485(void){ // Procesa recepcion RS485 while (serRS485.readable()) { char c = serRS485.getc(); pc.putc(c); } } int main() { // Bring up the ethernet interface pc.printf("PROGRAMA CONTROL SERVO V0.1\r\n"); pc.printf("PRUEBAS DE COMUNICACION POR UDP\r\n"); net.disconnect(); int j = net.set_network(IP,MASK,GATEWAY); printf("set IP status: %i \r\n",j); if(0 != net.connect()) { printf("Error connecting\r\n"); return -1; } // Show the network address const char *ip = net.get_ip_address(); printf("IP address is: %s\r\n", ip ? ip : "No IP"); UDPSocket sock(&net); SocketAddress sockAddr; timer.start(); led2 = 1; led3 = 0; flipper.attach(&flip, 1.0); // the address of the function to be attached (flip) and the interval (2 seconds) wait(0.5); serSERVO.attach(&onSerialServo); // Interrupcion de serial Servo serRS485.attach(&onSerialRS485); // Interrupcion de serial RS485 (MANDOS) RS485_OE = 1; // habilita conversor 3.3V a 5V para RS485 SRV_C_TRQ_P.period(0.001f); // 1 kHz or 1 ms SRV_C_TRQ_N.period(0.001f); // 1 kHz or 1 ms SRV_C_TRQ_P=0; SRV_C_TRQ_N=0; // uint8_t i=0; while(1){ if(timer.read_us()>=250){ procesa_recepcion(); // Procesa recepcion GPS tiempo++; timer.reset(); if(tiempo%4000==0){ // Envia cada segundo // serSERVO.printf("PRUEBA DE COMUNICACION CON EL SERVO\r\n"); RS485_DIR = 1; // pone en TX wait(0.1); serRS485.printf("PRUEBA DE COMUNICACION POR RS485\r\n"); wait(0.1); RS485_DIR = 0; // pone en RX // 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()); pc.printf("velocidad:%3.3f torque:%3.3f\r\n", velocidad, torque); } if(tiempo%40 == 0){ velocidad = SRV_VEL.read(); // 1.0=VCC torque = SRV_TRQ.read(); SRV_C_TRQ_P.pulsewidth(velocidad*0.001f); SRV_C_TRQ_N.pulsewidth(torque*0.001f); } } led1 = ((tiempo/4000)%2 == 0)?1:0; SERVO_INC_POS = led2; SERVO_DEC_POS = led3; SERVO_ON = led1; // Salida de control ON del servo (J7-2) SERVO_CLR_COUNT = led2; // Salida de control CLR_COUNT del servo (J7-1) SERVO_ALARM_CLR = led3; // Salida de control ALARM_CLR del servo (J7-4) SERVO_CONTROL_MODE = led1; // Salida de control CONTROL_MODE del servo (J7-3) SERVO_AUX_OUT = led2; // Salida de control AUX_OUT del servo (J7-10) // control_PWR_servo = (pulsador.read() == 1)?0:1; control_PWR_servo = 0; // encendido if(tiempo >= 40000){ tiempo = 0; char out_buffer[] = "time"; char out_buffer_2[50]; int nc=0; if(0 > sock.sendto("time.nist.gov", 37, out_buffer, sizeof(out_buffer))) { printf("Error sending data\r\n"); return -1; } ntp_packet in_data; int n = sock.recvfrom(&sockAddr, &in_data, sizeof(ntp_packet)); in_data.secs = ntohl( in_data.secs ) - 2208988800; // 1900-1970 printf("\r\n\r\nTime Received %lu seconds since 1/01/1900 00:00 GMT\r\n", (uint32_t)in_data.secs); nc = sprintf(out_buffer_2, "%s", ctime(( const time_t* )&in_data.secs) ); printf("Time = %s\r\n", out_buffer_2); printf("Time Server Address: %s Port: %d\r\n\r\n", sockAddr.get_ip_address(), sockAddr.get_port()); if(0 > sock.sendto("192.168.1.37", 6000, out_buffer_2, nc)) { printf("\r\nError sending data 2\r\n\r\n"); return -1; } } // Thread::wait(10000); } // Close the socket and bring down the network interface sock.close(); net.disconnect(); return 0; }