Pedro Campos
/
SERVOS_V0_3
test
Diff: main.cpp
- Revision:
- 1:da6afd392792
- Parent:
- 0:cf516d904427
- Child:
- 2:82fdfeec5799
--- a/main.cpp Mon Oct 23 21:26:36 2017 +0000 +++ b/main.cpp Mon Apr 20 11:42:55 2020 +0000 @@ -1,48 +1,245 @@ #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 - printf("UDP Socket example\n"); + 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\n"); + printf("Error connecting\r\n"); return -1; } // Show the network address const char *ip = net.get_ip_address(); - printf("IP address is: %s\n", ip ? ip : "No IP"); + printf("IP address is: %s\r\n", ip ? ip : "No IP"); UDPSocket sock(&net); SocketAddress sockAddr; - - char out_buffer[] = "time"; - if(0 > sock.sendto("time.nist.gov", 37, out_buffer, sizeof(out_buffer))) { - printf("Error sending data\n"); - return -1; - } + + 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; + - 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("Time Received %lu seconds since 1/01/1900 00:00 GMT\n", - (uint32_t)in_data.secs); - printf("Time = %s", ctime(( const time_t* )&in_data.secs)); +// 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()); - printf("Time Server Address: %s Port: %d\n\r", - 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; -} \ No newline at end of file +}