Google+ Room Technology: SERIAL PORT
Mostrando entradas con la etiqueta SERIAL PORT. Mostrar todas las entradas
Mostrando entradas con la etiqueta SERIAL PORT. Mostrar todas las entradas

martes, 25 de junio de 2013

Mini2440: Aplicación de comunicación Serial usando QtCretor.

Unas de las principales razones por las que los sistemas embebidos son usados con mayor frecuencia es la posibilidad de usar interfaces de comunicación que les permitan interactuar con diferentes dispositivos. La interfaz mas usada en el mundo de la electrónica es la famosa comunicación serial. En el Mini2440 tenemos a nuestra disposición 4 puertos seriales: 1 RS-232 y 3 TTL. 

Ubicación de los puertos en el Mini2440. 

Durante mucho tiempo trate de usar el puerto serial en el Mini2440. En Windows CE usar el Serial Port   no es muy problemático pero es todo lo contrario en Linux QTopia. Después de varios intentos, la mayoría largos y fallidos, pude realizar una aplicación de Tx y Rx de datos entre el Mini2440 y la PC.  No me considero en lo mas mínimo experto en programación así que cualquier metida de pata de antemano disculpas.

¿De que va la aplicación?

La aplicación es simple: Transmisión/Recepción de datos (específicamente cadenas de texto) entre el Mini2440 y una computadora. Aquí una imagen de la aplicación:

Windows Form de la Aplicación del Mini2440. 

Tendremos tres botones: Para abrir el Puerto Serial, para cerrar el Puerto Serial y para escribir una cadena de caracteres en el Puerto Serial hacia la computadora
Un TextEdit multilínea donde se imprimirá los datos recibidos desde la computadora en el Mini2440. 

¿Que Necesito?
  • El Mini2440 debe estar ya preparado para correr aplicaciones hechas en Qt Creator, si no es así te recomiendo que leas este post.
  • Tener Qt Creator configurado con el compilador cruzado del Mini2440, si no es así te recomiendo leer este post.
  • Un cable USB-SERIAL para la computadora.
  • Los pines de los puertos seriales de ambos dispositivos deben de estar de la siguiente manera: TX con RX, RX con TX y ambas GND juntas. 
Consideraciones Generales importantes
  1. Tienes que tener un cierto grado de conocimiento de C++, no te pido que seas un máster en programación, solo los conocimientos suficientes.
  2. El uso del Puerto Serial no debe ser nada nuevo para ti, es decir debes saber que es el BaudRate, Bit de paridad, Bit de parada, RS-232, etc. 
  3. Haber hecho por lo menos una aplicación para el Mini2440 y comprobar su funcionamiento en el Mini2440. 
  4. Este post no lo considero una Guía paso a paso, por favor como mencione anteriormente debes manejarte fluidamente en Qt Creator. 

Descargar Librerías. 

En C++ las librerías son colecciones de clases y funciones escritas en un lenguaje que el núcleo del SO pueda entender.  Para realizar la comunicación serial para el Mini2440 se hace el uso de librerías que me permitan usar de manera eficiente el puerto físico. En el Internet hay muchas librerías para tal fin, yo use una en particular que para mi aplicación en especifico me ayudo de manera satisfactoria. 
Tomar en cuenta que esta no es la mejor librería que pueda haber, pero en esta aplicación trabaja perfectamente.  Descargar: Link

Creando la Aplicación: Incluyendo librerías en el Proyecto. 

Una vez descargadas las librerías descomprimimos los archivos y los copiamos a todos dentro de la carpeta raíz donde esta el proyecto creado en Qt Creator. Los archivos .h son los headers (encabezados) y los archivos .cpp son los sources (fuentes).

Estas librerías las tendremos que agregar al proyecto para ello vamos hacer lo siguiente: Hacemos clic derecho sobre la carpeta del proyecto y elijemos "Agregar archivos existentes".

Hacemos Clic derecho y elijemos "Agregar Archivos existentes.  


Los archivos en total son 8: PortListener.cpp, PortListener.h, posix_qextserialport.cpp, qextserialenumerator.h, qextserialenumerator_unix.cpp, qextserialport.cpp, qextserialport.h y qextserialport_global.h. Todos ellos los añadimos al proyecto.  

Una vez hecho esto darse cuenta como los archivos se agruparon.   

El archivo .pro también tiene que tener las siguientes modificaciones.   

Le damos al proyecto un Rebuild All y después un "Ejecutar" (por el momento no cambiamos al compilador del Mini2440). No tendría que haber problemas en este punto. 


Creando la Aplicación: Slots, variables, controles, etc. 

Le damos las siguientes dimensiones al mainwindow.iu (Height>>249;Width>>392).
Añadimos los tres botones y el EditText. Hay que declarar los slots privados correspondiente a cada uno de los botones.

En el mainwindow.cpp añadimos lo siguiente:

private:
    Ui::MainWindow *ui;
    QextSerialPort *port; //esta añadiremos, asignación de un nombre para hacer uso de las características del puerto serial. 


Ademas debemos incluir las librerías del Serial Port  de la siguiente manera:

#include "qextserialport.h" //esto va en el mainwindow.h
#include <qextserialenumerator.h>//esto va en el mainwindow.cpp
#include "qextserialport.h"            //esto va en el mainwindow.cpp

En el mainwindow.cpp debemos declarar el nombre del Serial Port que sera usado:

#define port_name "/dev/ttySAC0" //nombre del puerto del Mini2440 (COM1)

El código del botón para abrir el Puerto Serial se vería así:

void MainWindow::clic_open_port()
{
    this->port = new QextSerialPort(port_name, QextSerialPort::EventDriven);
    port->flush();
    port->setBaudRate(BAUD115200);//115200 de BAUDRATE
    port->setFlowControl(FLOW_OFF);//Sin Control de Flujo
    port->setParity(PAR_NONE);//Sin Paridad
    port->setDataBits(DATA_8);//8 bits de datos
    port->setStopBits(STOP_1);//1 bit de parada

    if (port->open(QIODevice::ReadWrite) == true)
    {
        connect(port,SIGNAL(readyRead()),this,SLOT(onReadyRead()));
        ui->button_close_port->setEnabled(true);
        ui->button_write_data->setEnabled(true);
        ui->button_open_port->setEnabled(false);
    }
    else
    {
        QMessageBox::information(this, "ERROR DE SISTEMA", "Se intenta abrir un puerto inexistente");
    }
}

El código del botón para cerrar el Puerto Serial:

void MainWindow::clic_close_port()
{
    port->close();//cerramos el puerto
    ui->button_close_port->setEnabled(false);
    ui->button_write_data->setEnabled(false);
    ui->button_open_port->setEnabled(true);
}

El código del botón para escribir en el Serial Port una cadena de caracteres ya definida seria este:

void MainWindow::clic_write_port()/
{
    port->write("Hola Mini2440. ");
}

En el caso de la recepción de los datos debemos enlazar el Signal correspondiente con un Slot, primero declaramos un Slot privado en el mainwindow.h.

private slots:
    void clic_open_port();//slot correspondiente al boton open_port
    void clic_close_port();//slot correspondiente al boton close_port
    void clic_write_port();//slot correspondiente al boton write_port
    void onReadyRead();//slot correspondiente al evento de RX de bits del puerto

Seguido desarrollamos el código correspondiente al slot:

void MainWindow::onReadyRead()
{
    SleeperThread::msleep(20);
    QByteArray bytes=port->readAll();
    ui->textEdit->append(bytes);
}

Algo adicional es poder deshabilitar los botones "CLOSE PORT" y "WRITE DATA" si primero no se abrió el Serial Port de manera correcta. El código estaría dentro del método de inicialización del formulario:

    ui->button_close_port->setEnabled(false);
    ui->button_write_data->setEnabled(false);

Esto es todo lo necesario para poder ejecutar la aplicación, si tienen algún error durante la compilación o ejecución traten de revisar de nuevo el post.  Una vez compilada la aplicación en la PC es hora de hacer lo mismo pero con el compilador del Mini2440, recuerda que debe devolverte el famoso 255 para asegurarnos que todo esta bien. Copiamos al ejecutable a una SD o memoria USB , la pasamos al Mini2440 (a través de comandos, recomiendo usar el programa PUTTY) y ejecutamos la aplicación.  

Si el código les da problemas les dejare dos links con los proyectos de Qt Creator. En ellos estará la aplicación desarrollada tanto para PC como para el Mini2440, estas aplicaciones están trabajando perfectamente y no he tenido problemas.
Descargar: Link1 Link2

Para finalizar en la PC tienen que tener un programa que les permita usar en Puerto Serial para enviar cadena de caracteres y poder recibir de la misma manera caracteres. 

Espero que esta nuevo post les sirva (a mi este aplicación me saco de grandes apuros). No es una aplicación que lo tiene de todo y no solucionara todos los problemas que tengan, pero las librerías están disponibles, solo hay que tener la suficiente visión para aprovecharla al 100%.  Traten de experimentar es mi única recomendación. Modifiquen el código, añadan mas código, eliminen código tal vez que este inservible y  de esta manera estaran aprendiendo a usar el Serial Port. 
¡Suerte en sus proyectos!



miércoles, 5 de diciembre de 2012

Mini2440: SO Linux Instalación

Como ya les había mencionado antes este ARM soporta tres SO diferentes: LINUX, ANDROID y WINDOWS. Por ello en este espacio les mostrare como instalar específicamente Linux con todos los pasos  que yo seguí y los problemas que pueden surgir y como los solucione.

LINUX:
Linux es un SO operativo potente, seguro y gratuito que vio la luz por allá en los inicios de la década de los 90. El kernel que soporta el Mini2440 y que  vamos a utilizar es el 2.6.32.2. Como se sabe el kernel es considerado el corazón del SO que esta encargado de que el software y hardware trabajen juntos de manera armoniosa. 
Ahora la distribución de Linux que usaremos en el Mini2440 sera QTOPIA  2.2.0  (ahora llamado QT EXTENDED). Este SO es una plataforma de aplicaciones para dispositivos como móviles, PDA's, Pockets PC , etc. Desarrollada por TROLLTECH bajo licencia tipo GPL (libre).

Vista del menú de Linux Qtopia.

Ahora si teniendo una idea de con que vamos a tratar estamos listos para portar el SO Qtopia en el Mini2440. Necesitaremos:
        -Un cable serial (en este caso un USB-SERIAL).
        -Una extensión de cable serial de conector tipo  Hembra-Hembra.
        -Un cable USB.
        -Y lógicamente el Mini2440 conectado a  su respectiva fuente de Voltaje.



Lo que si les recomiendo y esto basado en mi propia experiencia es que utilicemos una PC que tenga WINDOWS XP, pues el controlador del cable USB para el Mini2440  solo es compatible para XP, es verdad que es posible utilizar una maquina virtual pero a mi me surgió el siguiente problema: Estaba utilizando VMware pero tenia problemas con la utilización de los puertos USB cuando estaba corriendo XP (tengo una portátil con WINDOWS 7 ), en ocasiones los puertos los reconocía XP y en otras WINDOWS 7 y todo era una caos completo, trate con todas las soluciones posibles que encontraba en Internet pero ninguna dio resultado por lo que opte usar una PC con XP.

Para los controladores del cable USB-SERIAL para XP: Descargar AQUI.
Para los controladores del USB para el Mini2440 para XP Descargar AQUI. También se lo puede descargar de la pagina oficial http://www.friendlyarm.net en la sección de Descargas.

Instalamos los controladores y ahora necesitaremos estos archivos:
         -DNW for XP: Programa para la transferencia de ficheros del PC  al Mini2440.
        -Hay un archivo especial que no es el mismo para todo los Mini2440, hablo del Supervivi. Para identificar cual tenemos solo damos un vistazo al  chip de la memoria NAND que esta cerca de la tarjeta SD y según su serie identificamos el Supervivi correspondiente:



K9F1208 > 64 MB NAND Flash
K9F1G08 > 128 MB NAND Flash
K9F2G08 > 256 MB NAND Flash
K9F8G08 > 1024 MB NAND Flash

El supervivi-64M es para 64MB NAND y el supervivi-128M es para 128MB / 256MB / 1GB NAND. El link descarga para estos archivos esta AQUI.

        -Ahora el kernel de Linux: Con este archivo hay que tener cuidado pues este depende enormemente del tipo de pantalla LCD que disponemos (ya explicare por que, mas tarde en este mismo blog) en mi caso yo dispongo de un LCD W35, recomiendo investigar cual disponen ustedes. En mi caso fue fácil pues la descripción estaba presente en la misma LCD ojala que con uds. sea lo mismo. Igualmente aquí les dejo los archivos para los varios tipos de pantalla LCD en los que esta disponible el Mini2440 (Descargar AQUI).

        -La imagen del SO QTOPIA Descargar AQUI.

Conectamos los cables SERIAL y USB de la PC al Mini2440, para el cable serial se recomienda la extensión para que los conectores se correspondan sin problemas.Una vez conseguido estos archivos ejecutamos el DNW (recomiendo extraerlo del zip).



Nos vamos a CONFIGURATION>OPTIONS y elegimos el puerto serial correspondiente, un Baud Rate=115200 y un Address del USB=0x30000000.



Elegimos SERIAL PORT>CONNECT si todo esta bien aparecerá en la barra de la ventana lo siguiente :[COM3,115200] .



 Seteamos en NOR el switch para el modo del boot, esto mientras esta en OFF el switch de energía (para encontrar el switch por favor revisar la imagen siguiente).



Encendemos el Mini2440 poniendo en ON el switch de energia. En el modo NOR el LCD esta apagado, pero en la barra de estado del DNW si todo esta bien aparecerá [USB:OK].Ademas se desplegara un menú con opciones, en algunas ocasiones este menú no se despliega pero no hay problema mientras la barra de estado muestre lo dicho anteriormente todo estará bien.



Ahora nos tocara formatear la memoria  NAND FLASH donde esta el boot inicial para ello presionamos x. Deberá aparecer los siguiente:



Después presionamos v para subir al Mini2440 el archivo Supervivi. Después de esto nos vamos a USB Port>Transmit y elegimos el supevivi correspondiente en este caso para mi dispositivo supervivi-128M. En algunas ocasiones en el cuadro de dialogo no aparece el archivo que necesitamos, para solucionarlo solo seleccionamos ALL FILES en donde dice TYPE.







Ahora le toca el turno al kernel, presionamos k , inmediatamente USB Port>Transmit y elegimos el archivo imagen correspondiente a la pantalla que tenemos, en mi caso personal el zImageW35



¿Que pasa si eligo una que no corresponde a mi LCD? La respuesta es simple: El DNW no te dará ningún error (al menos eso es lo que se sucedió en mi ARM) y parecería que todo estuviera bien, pero cuando finalicemos y encendamos el Mini2440 la pantalla presentara errores en mi caso me presento solo hasta la mitad la interfaz gráfica esto por que el kernel esta compilado con otra tipo de resolución para la pantalla LCD.

En la ultima parte cargamos la imagen del SO QTOPIA, presionamos y. De la misma manera USB Port>Transmit y elejimos la imagen.




Hasta que finalice tardara un considerable tiempo. Después apagamos el Mini2440 y regresamos el switch de BOOT a NAND para que arranque desde ese sector de memoria, y encendemos nuevamente el Mini2440 con nuestro sistema operativo QTOPIA.

Para las configuraciones iniciales (nos pedirá calibrar la pantalla táctil, configurar la Zona Horaria, fecha, etc.) y en general para utilizar la pantalla LCD de manera efectiva sugiero utilizar un lápiz óptico. El Idioma esta en Chino, pero no nos preocupemos solo hay que abrir una aplicación de diccionario que es visible por que el icono son dos banderas: China y Británica, y elegir el idioma Ingles y listo.

Bueno hemos finalizado esta nueva entrega de como portar Linux en el Mini2440, espero que le sea de ayuda y en el siguiente blog tratare de hablar sobre como portar ANDROID, durante toda  la realización de este blog he estado en la tarea de portar ANDROID pero el problema que se me ha presentado es la pantalla que tengo (LCD W35)  que no encuentro el zImage correspondiente para ANDROID, cuando lo solucione estaré listo para la hacerles saber como lo hice.