Google+ Room Technology: Friendly ARM
Mostrando entradas con la etiqueta Friendly ARM. Mostrar todas las entradas
Mostrando entradas con la etiqueta Friendly ARM. 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, 27 de febrero de 2013

ANDROID 2.1 en el Mini2440


En un post anterior les mostré los pasos para instalar Android 1.5 Cupcake en el Mini2440 y ademas los pasos para modificar el kernel para adaptar los controladores para una pantalla  tipo W35. Ahora teniendo estos conocimientos previos     el presente post lo hago con el fin de de mostrarles como como seria la instalación y correspondiente modificación del kernel  para una versión superior de Android: Eclair. Ademas de como poder mejorar la velocidad de la interactividad con el sistema operativo ya que Cupcake era para ser sincero y en mi opinión personal menos atractivo, muy limitado en cuanto a sus prestaciones y el desarrollo de aplicaciones estaría muy limitada.

¿Que necesitaremos?
  • Una PC con el SO Ubuntu, si es otra distribución Linux  les recomiendo adaptar los comandos para su SO. Si disponen de Windows les recomiendo usen una maquina virtual. 
  • Descargar Putty que esta disponible tanto para Linux como para Windows. Este software nos permitirá iniciar una sesión para acceder remotamente al dispositivo después de la instalación.
  • Y por supuesto descargar los archivos correspondientes que están disponibles en estos links: Link1 y Link2.
  • Para poder continuar sin contratiempos les recomiendo para los que todavía no lo han hecho revisar este post. De aquí en adelante asumiré que ya revisaron el post. 
  • Tener instalado el IDE Geany.
  • Disponer del API Ncurses.
  • Configurar el compilador cruzado del ARM.
  • Disponer del sistema YAFFS
¿Cual es el primer paso?
  • Creamos una carpeta donde descomprimiremos el Kernel_Android_2_1 y accedemos a esta carpeta descomprimida.
  • En el terminal (como root y al haber accedido a la carpeta correspondiente) escribimos esto:
$geany arch/arm/mach-s3c2440/mach-smdk2440.c 

  • Nos trasladamos a la linea 156-167 y modificamos el archivo de esta manera:

Antes


Después
  • Todavía queda modificar otro archivo para ello en el terminal ingresamos esto:  $geany drivers/input/touchscreen/s3c2410_ts.c  y de la misma manera también modificamos el archivo en las lineas 99-100 .


Antes


Después
  • Ahora solo ingresamos los siguientes comandos:
                  $cp config_mini2440 .config
                  $make menuconfig
  • Salimos de la interfaz que se nos presenta eligiendo 'EXIT'.
  • Después escribimos: $make zImage
  • La construcción de la imagen tardara de 10 a 15 minutos.
  • Una vez compilado, el núcleo kernel estará en /arch/arm/boot/ con el nombre zImage.
¿Cual es el segundo paso?
  • Creamos una carpeta donde descomprimiremos el otro archivo descargado: Fs_Android_2_1.tgz
  • En esta carpeta esta un archivo llamado 'default.prop', el cual lo abriremos y haremos los siguientes cambios.

Antes


Después
  • Por ultimo creamos la imagen con la herramienta YAFFS2 para ello descomprimimos el archivo  descargado anteriormente y elijemos el correspondiente a nuestro Mini2440 (en mi caso de 128Mb). El archivo final estará en la carpeta misma. 
  • $./mkyaffs2image-128M fs/ mini2440W35_android.img

  • Una vez hecho esto solo instalamos el SO en el ARM y nos disponemos a configurar el sistema para hacerlo un poco mas rápido. Cabe mencionar que cuando iniciamos por primera vez el SO tardara un tiempo considerable. 
  • Para acceder al dispositivo necesitaremos hacerlo por medio de comunicación serial entra la PC y el Mini2440 a una velocidad de 115200bps tal como lo muestra la siguiente imagen atravez de Putty. 

Una vez hecho esto ingresamos los comandos como si estuviéramos trabajando en Linux.


                  $cd /system/app

Luego borramos todos las aplicaciones presentes aqui, pero solo dejamos las siguientes:

-LatinIME.apk
-Launcher.apk
-PackageInstaller.apk
-Settings.apk
-SettingsProvider.apk
-UserDictionaryProvider.apk

De esta manera borramos los archivos:
                   $rm -rf nombreaplicacion.apk 

Nuestro SO esta listo, ahora solo lo reiniciamos y tendremos nuestra Android 2.1 mas funcional.

viernes, 11 de enero de 2013

Mini2440: SO WINDOWS CE


Ahora solo nos falta un ultimo SO montar en el Mini2440 y aquí les mostrare como hacerlo con WINCE. Como sabemos Microsoft abarca casi todas las PC y como no imaginarse que no tendría su pequeño aporte a los sistemas móviles. Para ello desarrollo  Windows Embedded Compact lanzado por allá en el año de 1996 para sistemas embebidos con arquitecturas Intel x86 y compatibles, procesadores MIPS (RISC) y ARM. La ultima versión disponible es la WinCE 7.
La versión que dispondremos sera la 6, esta versión es la que vamos a instalar en el Mini2440, para ello como ya lo había mencionado en otros momentos sera necesario usar una PC que disponga XP para no tener problemas con los controladores.
El ejecutable DNW también sera de ayuda.
Los archivos de configuración del sistema serán necesarios obviamente.
El clable USB-SERIAL y el USB entran nuevamente como ayuda.
El método de instalación es casi similar a lo que usamos con Linux, por lo tanto seria bueno que revisen ese post antes de comenzar con este solo para recordar y avanzar mas rápido.


-Primeramente ejecutamos el DNW y configuramos la comunicación Serial  en CONFIGURATION>>OPTIONS. Ahí escojemos el puerto correspondiente al cable USB-SERIAL , la velocidad de 115200bps y la dirección del USB DOWNLOAD 0x30000000. Después conectamos el USB SERIAL de esta manera: SERIAL PORT>>CONNECT.

-Después configuramos el switch de boot al estado NOR, y encendemos el Mini2440. Si todo se hizo correctamente una imagen similar a esta deberá aparecer (darse cuenta de la barra de superior del programa).


-Lo primero a realizar sera formatear las espacios de memoria en las que se va a montar WinCE. Para ello presionamos f . Deberá salirnos una ventana como la siguiente.


-Ahora es necesario configurar el archivo Supervivi de 64MB 0 128MB, según cual corresponda a nuestro ARM. Elegimos  v y después USB-PORT>>TRANSMIT/RESTORE, abrimos el supervivi y tendrá que salir una ventana similar a esta.


-Ahora necesitaremos el archivo booteable para WinCE, presionamos n y así mismo vamos a USB-POR>>TRANSMIT/RESTORE y elijemos el correspondiente a nuestra LCD, en mi caso la W35.




-Ahora viene una una parte interesante: configurar un logo de inicio de pantalla de tipo de  extensión 'bmp' . Podemos elegir el que nos agrade siempre y cuando cumpla con las dimensiones de la pantalla LCD, en mi caso vamos a utilizar el por default. Presionamos l y transferimos el archivo por el puerto USB.





-Por ultimo el archivo .bin "nk_XX.bin" correspondiente a nuestra pantalla LCD, presionamos w y transferimos el archivo.




-Va tardar un poco para instalar el SO, una vez listo el sistema automáticamente de inicializara en el Mini2440, pero para no tener problemas lo apagamos y ponemos el switch de boot al modo NAND y de nuevo lo encendemos y ahora si estaremos listos para usar WinCE en el Mini2440. 

Es posible que la pantalla no responda del todo bien lo que recomiendo es usar un Mouse USB y con el recalibrar la pantalla (el SO dispone de una herramienta instalada por default para ello), en el Mini2440 estando el entorno del escritorio vamos al icono de Inicio :"Start>>Settings>>Control Panel>>Stylus" se nos abre una ventana y elegimos la pestaña Calibration, dentro de aqui hacemos clic en "Recalibrate" y seguimos los pasos que se nos mostrara.

Ahora como ya estamos en la posibilidad de montar los 3 sistemas operativos en el Mini2440, faltara como diseñar programas para ejecutarlos en esa plataforma. Como adelanto para Linux disponemos del QT CREATOR, para Android del IDE ECLIPSE y para WinCE de Visual Studio.
Es posible que realice un vídeo con los diferentes SO trabajando en el MINI2440 para tener un poco mas de referencia sobre este asombroso ARM. En la próxima entrega tratare de hacer un pequeño programa para probarlo en Mini2440.

viernes, 30 de noviembre de 2012

Primeros pasos con el ARM Mini2440

En estos días he conseguido un nuevo juguete tecnológico: el Mini2440 (ver la figura con la descripción). La primera impresión que tuve fue que parece una PC en tamaño reducido pues para ser un poco mas precisos con la verdad se trata de un sistema embebido. Tiene todas las funcionalidades de una computadora simple esto es: USB, puerto Serial, tarjeta SD, FAST-ETHERNET, pantalla LCD, entrada y salida para audio y lo mas interesante interfaces de para Conversión A/D, PWM e I2C.



ARM Mini2440

Siendo mas específicos esta basando en un microprocesador SAMSUNG S3C2440, por lo tanto opera gobernado por un Sistema Operativo (SO). A continuación se explica con detalle las especificaciones de este dispositivo:

  • CPU Samsung S3C22440A a 400MHz
  • RAM de 64MB tipo SDRAM de 32 bits de Bus de datos a 100MHz
  • FLASH MEMORY : 256 MB tipo NAND y 2MB tipo NOR para la BIOS.
  • LCD de 320x240 (3.5 pulgadas) tipo Resistiva.
  • Tarjeta de red FAST-ETHERNET
  • 3 Puertos seriales
  • 1 Puerto USB y otro Esclavo tipo B
  • 1 Interfaz para tarjeta SD
  • Salida de audio stereo de 3.5mm y una interfaz para micrófono.
  • Conversor A/D
  • Bus I2C
  • 34 Puertos tipo GPIO
  • Reloj en tiempo Real (RTC)
  • SO soportados: LINUX, WINDOWS y ANDROID.

Dándonos cuenta en las especificaciones disponemos de una arquitectura robusta en cuanto a Hardware, quizás el único inconveniente es la pantalla de tipo resistiva la cual no nos dará una sensación de interactividad muy fluida. Todo esto gobernado bajos dos SO poderosos: LINUX y ANDROID.

¿Pero que podemos lograr con todo esto?
La respuesta es simple: Lo que tu imaginación y trabajo diario estén dispuesto a dar. Suena un poco infantil pero es la verdad, tenemos a disposición una gran herramienta para desarrollar una infinidad de aplicaciones. Para llegar a ello debemos solo poner empeño pues entraremos al gran mundo de la programación aplicada a sistemas embebidos que nos ayudara a llevar a cabo con mas simpleza nuestros objetivos y no nos asustemos si nunca hemos programado pues las herramientas y las fuentes de consulta son infinitas.

Para el siguiente blog tengo pensado cargar la imagen del SO LINUX en el MINI2440 explicado paso a paso, para los demás SO como WINDOWS y ANDROID también haré algo similar para al final llegar a desarrollar aplicaciones en cada una de las plataformas.

Aquí les dejo un pack de imágenes del dispositivo que dispongo, perdón por las imágenes pero no me considero un gran fotógrafo.