Tutoriales
 

Creando nuestro robot móvil

8.- Programación

 

8.1.- Programación PC (Visual C++)

La programación en Visual C++ la hemos dividido en diferentes puntos esenciales para la plataforma móvil: Joystick DirectXInput, comunicación Virtual COM Port (VCP), visualización y grabación de video mediante VideoOCX y por último interface mediante eventos internos y temporizaciones.

Antes de nada tendremos que configurar nuestro proyecto, para ello instalaremos diferentes librerias en nuestro ordenador.

Las primeras librerías que debemos instalar son equellas que nos permiten controlar un joystick o gamepad para el manejo manual de la plataforma móvil. Para la correcta instalación de las librerías DirectX SDK deberemos seguir los puntos del siguiente enlace.

Instalación librerias DirectX SDK en Visual C++

Las siguientes librerías a instalar son las necesarias para la visualización del video. Utilizaremos unas librerías comerciales, que nos permiten una versión de evaluación de un periodo de 30 días, estas librerías se llaman VideoOCX y son de muy fácil instalación. Podéis descargar el ejecutable en el siguiente enlace.

VideoOCX 1.61

Al ejecutar la aplicación aparecerá un wizard que nos permitirá seleccionar el idioma y la ruta de instalación.

 


Captura Wizard VideoOCX

 

Una vez correctemente instalado, al ejecutar Microsoft Visual C++ aparecerá el icono de la aplicación en el diálogo de "Controls", tal y como se muestra a continuación. De no aparecer dicho icono significará que VideoOCX no ha sido correctamente instalado.

 


Icono VideoOCX

 

VideoOCX instalará también una serie de ejemplos muy ilustrativos tanto para Visual C++ como para Visual Basic que nos permitirá hacer nuestras aplicaciones de visualización y grabación de video e imágenes de forma sencilla y rápida.

 

8.1.1 DirectX Input

Podemos ver un amplio estudio de las DirectX Input en el siguiente enlace.

DirectX Input para Visual C++

 

8.1.2 PortCOM

PortCOM, es una clase para el manejo de puertos serie COM. Tiene unos métodos como Init, Close, Send, Recive, etc. Todos los métodos necesarios para realizar la comunicación a través de dichos puertos de nuetro ordenador de forma sencilla.

Para ello incluiremos en nuestro proyecto las librerías de PortCOM:

#include "PortCOM.h"

Más tarde crearemos un objeto llamado COM1 de tipo PortCOM, que tendrá todas las propiedades y métodos de la clase PortCOM.

PortCOM COM1;

Podeís bajaros dicha clase para realizar vuestros propios proyectos.

Clase PortCOM

 

8.1.3 Eventos

Existen varios eventos en nuestro proyecto, como pulsar el botón Iniciar, Enviar, etc...

Como ejemplo ilustrativo tenemos "Enviar" un texto al LCD, el cual tiene el siguiente código.

 

void CPrueba1Dlg::OnButtonEnviar()
{

            // TODO: Add your control notification handler code here
           
            CString strEnviar="";
            int longitudStringEnviar;
            char enviar[34]="";
            int i;

            m_Enviar.GetWindowText(strEnviar);
            longitudStringEnviar = strEnviar.GetLength();

            if(longitudStringEnviar>32)
            {
                        enviar[0]='E'; enviar[1]='R'; enviar[2]='R'; enviar[3]='O';  enviar[4]='R';
                        for(i=5;i<32;i++)
                        {
                                   enviar[i]=' ';
                        }

                        enviar[33]=0X0D;
                        enviar[34]=NULL;

                        int err1 = com1.Send(34,enviar);                                  
            }

            if(longitudStringEnviar<33)
            {                      
                        for(i=0;i<longitudStringEnviar;i++)
                        {
                                   enviar[i]=strEnviar[i];
                        }

                        for(i=longitudStringEnviar;i<33;i++)
                        {
                                   enviar[i]=' ';
                        }

                        enviar[33]=0X0D;
                        enviar[34]=NULL;
                        int err1 = com1.Send(34,enviar);
            }

            UpdateData(FALSE);

}

 

En una primera instancia recogemos el texto que el usuario a puesto en el editbox del lcd, guardando dicho texto en una variable de tipo String llamado strEnviar.

 

            m_Enviar.GetWindowText(strEnviar);          

 

Si la longitud de dicho String es mayor que 33 caracteres, enviamos al LCD la cadena "ERROR", ya que nuestro lcd sólo imprime en pantalla 33 caracteres. Para enviar la palabra "ERROR", asignaremos a la variable de tipo array de char llamada enviar la palabra "ERROR".

 

enviar[0]='E'; enviar[1]='R'; enviar[2]='R'; enviar[3]='O';  enviar[4]='R';
for(i=5;i<32;i++)
{
     enviar[i]=' ';
}
enviar[33]=0X0D;
enviar[34]=NULL;

 

Para ello rellenaremos el array con espacios en blanco ya que sino el lcd no se formatea y quedaría basura de la palabra anterior. Por último rellenaremos el array de char con un retorno de carro y un null para terminar el array.

Por último enviaremos dicha variable a través del COM mediante el objeto COM1, de la siguiente forma.

 

int err1 = com1.Send(34,enviar);

 

Donde se enviará la variable enviar, donde 34 es la longitud de chars de la variable a enviar.

De forma similar se enviará la cadena puesta en el editbox si la longitud es mejor que 33 caracteres.

 

if(longitudStringEnviar<33)
{
   for(i=0;i<longitudStringEnviar;i++)
   {
          enviar[i]=strEnviar[i];
   }

    for(i=longitudStringEnviar;i<33;i++)
   {
           enviar[i]=' ';
    }

    enviar[33]=0X0D;
    enviar[34]=NULL;
    int err1 = com1.Send(34,enviar);
}

 

 

8.1.4 Timer

El timer es un evento que se generará cada cierto tiempo, dicho tiempo lo seleccionamos nosotros mismos, en nuestro caso el temporizador nos sirve para enviar la posición del GamePad al robot. Este timer pregunta al GamePad la posición de los controles analógicos cada 100ms y los envia al robot mediante la sentencia Send del ejemplo anterior.

También tenemos otro Timer, éste se encarga de enviar una señal al PIC, para que este último envie al PC las conversiones A/D de los encoders y guardar dichos valores en un fichero de texto llamado CAD.txt.

Creo que con esta breve explicacion del código de programación del PC, es el inicio para entender todo el código del progroma.

Aquí os dejo las funciones más importantes del código para que les echeis un vistazo de forma rápida.

Código programación plataforma móvil e interface

Si teneis dudas o simplemente quereis dejar vustros comentario, recordad que podéis visitar el foro de Muchotrasto.

 

 

8.2.- Programación PIC (CCS)

Realizaremos una pequeña explicación del código del PIC en pseudocódigo para que sea más sencillo de entender el código en general.

 

while (TRUE)
   {
         if(kbhit(PC))
         {
            gets(string_buffer,PC);//Recogemos la cadena de texto enviada por el PC
            if((string_buffer[0]!='9')&&(string_buffer[0]!='8'))
            {
              //Enviaremos la cadena recibida al LCD
            }
            if(string_buffer[0]=='8')
            {
              //Pediremos al PIC la CAD de los encoder y lo enviaremos el PC
            }
                   
           if(string_buffer[0]=='9')
            {
              //Configuraremos el PWM del PIC para enviarselo a los motores
            }
      }
}

 

Como podeís ver el código del PIC hace una clara referencia al protocolo de transmisión que nos hemos inventado para la comunicación PC<-> PIC que hemos explicado en el punto 6.2.1.- Protocolo de comunicaciones

Descargate el código del PIC en CCS original y completo aquí.

CCS Plataforma móvil e interface

 

 

8.3.- Download

Código Visual C++ sin Debug

Código Visual C++ con Debug

Clase PortCOM para el manejo del puerto serie

Código completo PIC CCS (.hex incluido)

Manual código plataforma móvil e interface

VideoOCX

 
 



Inicio | Foro | FAQ | MapaWeb | BuscadorWeb