Espacio Drone | Comunidad de Pilotos de Drones con FPV en España – ArdroneSpain Espacio Drone

Problemas puerto serie AR Drone 1.0

Inicio Foros Foro AR.Drone Problemas puerto serie AR Drone 1.0

Viendo 4 entradas - de la 1 a la 4 (de un total de 4)
  • Autor
    Entradas
  • #6145
    Frijolito
    Participante
    Mensajes: 2

    Hola a todos, después de mil intentos y 3 semanas intentando solucionar el problema sin éxito, recurro a este foro para ver si alguien puede solucionarme mi problema.

    El tema es que quiero incorporarle un GPS a mi drone, el cual va conectado al puerto serie del mismo. Antes de instalar el GPS me bajé el «Realterm» para comprobar que la comunicación serie entre drone y PC (que al final será drone-GPS) funciona correctamente.

    El problema es que desde el drone, sí que puedo enviar mensajes a la consola de Realterm, pero a la inversa no consigo leer nada, que es lo que necesito, leer datos en el drone procedentes del GPS.
    He intentado todo, probando desde el firmware 1.3.3 hasta el 1.11.5, os adjunto el código del programa en C que estoy utilizando para la lectura/escritura en el puerto serie.

    No sabéis cuánto agradecería que alguien diera con la solución de esto!

    PD: La conexión del cable serie con el puerto del drone está bien hecha, la he comprobado varias veces (RX -> TX ; TX -> RX), estoy trabajando con un baud rate de 115200(el que viene por defecto del drone), también he probado a leer directamente el puerto serie sin utilizar el programa en C adjunto -> cat /dev/ttyPA0 y nada de nada…

    #include <string.h>
    #include <fcntl.h>
    #include <errno.h>
    #include <stdint.h>
    #include <termios.h>
    #include <stdio.h>
    #include <unistd.h>
    #include <math.h>
    
    #define serial_port "/dev/ttyPA0"
    
    #define salir				"salir"
    #define enviar				"enviar"
    #define recibir				"recibir"
    
    int open_serial(void) {
    
    	int socket_serial;
    	struct termios t_serial;
    
    	bzero(&t_serial, sizeof(t_serial)); // limpiamos el struct de entrada
    
    	//abrimos el puerto como luectura y escritura, como no controlador (Cnt+C) y no bloqueante.
    
    	//socket_serial = open(serial_port, O_RDWR | O_NOCTTY);
    
    	socket_serial = open(serial_port, O_RDWR | O_NOCTTY | O_NONBLOCK);
    
    	if (socket_serial < 0) {
    		fprintf(stderr, "No se puede abrir el puerto: %s - %s\n", serial_port,
    				strerror(errno));
    		_exit(-1);
    	}
    
    	if (socket_serial > 0) {
    		printf("Puerto abierto en: %s\n", serial_port);
    	}
    
    	//Configuramos el puerto serie--------------------------------------
    
    	//tcgetattr(socket_serial, &t_serial);
    	//cfsetispeed(&t_serial, B115200);
    	//cfsetospeed(&t_serial, B115200);
    
    	//t_serial.c_cflag |= B115200 | CBAUDEX | CS8 | CSTOPB | CLOCAL | CREAD;
    	t_serial.c_cflag |= B115200 | CBAUDEX | CS8 | CLOCAL | CREAD;
    	t_serial.c_iflag |= IGNPAR; //sin bit de paridad
    	t_serial.c_oflag = 0; //salida en bruto
    	t_serial.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
    
    	// caracteres de control
    
    	//t_serial.c_cc[VTIME] = 0;
    	t_serial.c_cc[VMIN] = 5;
    
    	//limpiamos el socket y cargamos la configuracion
    	tcflush(socket_serial, TCIOFLUSH);
    	tcsetattr(socket_serial, TCSANOW, &t_serial);
    
    	/*tcsetattr(socket_serial, TCSAFLUSH, &t_serial);
    	*/
    	return socket_serial;
    }
    
    void write_serial(int socket, char *mensaje) {
    
    	int msg = 0;
    
    	msg = write(socket, mensaje, strlen(mensaje));
    	if (msg <= 0)
    		printf("fallo de escritura \n");
    
    }
    
    void read_serial(int socket, char *data) {
    
    	int msg = 0;
    
    	msg = read(socket, data, 5);
    	data[msg] = '';
    
    	if (msg < 0) {
    		perror("read");
    	}
    
    }
    
    int main() {
    
    	int serial_socket;
    	char mensaje[5];
    	int dato_size;
    	char dato[5];
    	char action[30];
    
    	serial_socket = open_serial();
    
    	while (1) {
    
    		printf("enviar, recibir o salir? \n");
    		scanf("%s", action);
    
    		if (strcmp(action, salir) == 0) {
    			break;
    		}
    
    		if (strcmp(action, enviar) == 0) {
    
    			printf("Escribe el mensaje: ");
    			scanf("%s", mensaje);
    
    			write_serial(serial_socket, mensaje);
    		}
    
    		if (strcmp(action, recibir) == 0) {
    
    			read_serial(serial_socket, dato);
    
    			printf("leido: %s\n", dato);
    
    		}
    
    		if (strcmp(dato, salir) == 0) {
    			break;
    		}
    	}
    	printf("bye bye\n");
    
    	return 0;
    }
    

    #6151
    Aníbal
    Superadministrador
    Mensajes: 4774

    No puedes leer datos del GPS por que el firmware del ardrone no incorpora los drivers del GPS, el problema esta en el propio firmware. No se sí podrás compilar lo necesario para hacerlo funcionar, pero debe ser complicado.

    #6153
    Frijolito
    Participante
    Mensajes: 2

    No puedes leer datos del GPS por que el firmware del ardrone no incorpora los drivers del GPS, el problema esta en el propio firmware. No se sí podrás compilar lo necesario para hacerlo funcionar, pero debe ser complicado.

    Dejando el GPS a parte, tampoco hay manera de enviar desde el PC ningún mensaje al drone vía puerto serie? Como he dicho antes, desde el drone al PC sí que puedo enviarle mensajes, pero a la inversa no.

    #6154
    Aníbal
    Superadministrador
    Mensajes: 4774

    No tengo un ardrone 1.0 y no tengo experiencia en este tipo de conexiones, pero puedes hechar un vistazo a este link a ver si te sirve, http://www.robotappstore.com/Knowledge-Base/2-How-to-Use-a-RealTerm-Terminal/16.html

    Y sobre el tema del GPS aquí otro link http://intellidrone.org/?p=23

    No se sí te servirá de algo.

Viendo 4 entradas - de la 1 a la 4 (de un total de 4)
  • Debes estar registrado para responder a este debate.