martes, 16 de diciembre de 2014

Enviar señales Unix con Qt

En esta entrada haremos un ejemplo ultra sencillo de un programa gráfico que envía señales Unix cuando se pulsan sus botones.



Cuando pulsamos un botón se ejecuta la función kill con el pid indicado y la señal que corresponde al botón


void MainWindow::on_boton_SIGTERM_clicked()
{
    kill(ui->lineEdit_PID->text().toInt(),SIGTERM);

}


Puedes descargar el proyecto desde aqui

viernes, 8 de agosto de 2014

Realtek 8185L con Linux Fedora 20

Me he comprado un tarjeta wifi extremadamente barata.
El detalle es que no funciona en mi Fedora 20 x86_64.

La marca es advantek y Tiene un chip Realtek 8185L.





Para solucionarlo basta con instalar el paquete dkms-rtl818x.


32 bits: 
http://rpm.pbone.net/index.php3/stat/4/idpl/12064525/dir/redhat_el_5/com/dkms-rtl818x-1.0.1b-1.nodist.rf.noarch.rpm.html


64bits:
http://rpm.pbone.net/index.php3/stat/4/idpl/12086822/dir/redhat_el_5/com/dkms-rtl818x-1.0.1b-1.nodist.rf.noarch.rpm.html

Luego que lo descargues lo instalas:

yum install ./dkms-rtl818x-1.0.1b-1.nodist.rf.noarch.rpm

luego reinicias y listo

esta solución deberia funcionar para toda la serie 818x (8185 , 8587 etc)

lunes, 21 de abril de 2014

Instalar Oracle JDK 8 en Fedora 20 / 19

Primero descargamos de la pag oficial la versión .rpm dependiendo de la arquitectura de su SO. 
En este tuto usaremos la x64. Para saber la arquitectura de su SO ejecute : uname -r


Ahora nos movemos en la terminal al lugar donde está el .rpm y ejecutamos

rpm -Uvh jre-8*-x64.rpm



Luego buscamos el nombre del directorio del oracle jdk y ejecutamos la siguiente:

alternatives --install /usr/bin/java java /usr/java/jdk1.8.0_05/bin/java 2

Note que el nombre del directorio del jdk puede variar dependiendo de su versión. En este caso el nombre es jdk1.8.0_05


Por último ejecutamos y seleccionamos la opción 2

alternatives --config java


y listo. Ya deberias tener configurado el JDK

domingo, 16 de marzo de 2014

Generar diagramas ER para postgresql con SchemaSpy

Antes de empezar primero debemos tener instalado graphviz y java (opendjk o el de oracle).


Para instalar graphviz en ubuntu o debian prueba con: sudo apt-get install graphviz

1- Luego de tener java y graphviz instalado entonces nos descargamhos este fichero ya preparado que tiene el driver de postgres 9.3 para java y el programa que genera los diagramas (SchemaSpy).

Si tienes una versión distinta de postgres entonces debes descargar el driver adecuado desde este sitio y substituir dicho fichero .jar por driver.jar



2- Lo descomprimimos en un directorio y ejecutamos en el:

java -jar schemaSpy -t pgsql -cp ./driver.jar -db NOMBREDB -host HOST -port PUERTO -u USUARIO -p CONTRASEÑA -o DESTINO -schemas "public,something,else"

Donde:
 ./driver.jar: Es el nombre del driver de JDBC para postgres

NOMBREDB: Es el nombre de la base de datos

HOST: Es el host de la base de datos

* PUERTO: Es el puerto de la BD

USUARIO: Es el usuario de la BD

* CONTRASEÑA: El pass de la BD

* DESTINO: Es donde queremos ubicar los ficheros que se van a generar (diagramas, etc)

Por ejemplo:


java -jar schemaSpy -t pgsql -cp ./driver.jar -db 'tienda_virtual' -host 'localhost' -port '5432' -u 'postgres' -p '1234' -o destino -schemas "public,something,else"


Debería arrojar algo como esto:






En la carpeta de destino estará la documentación generada.



Un gráfico generado:




miércoles, 8 de enero de 2014

Programando en Lenguaje C, Una Visión Compilable



Aprender a programar en Lenguaje C es un arte que lleva su tiempo, requiere esfuerzo y dedicación, expongo aquí un material que escribí en archivos de formato *.CPP tomando en cuenta los dos tipos de programadores.

   a) Los que les gusta el código para experimentar
   b) Los que les gusta tener documentación a la mano para poder comprender

Es un TEMARIO totalmente COMPILABLE que comprende 15 capítulos, en el cual encontraran código y explicaciones sencillas.



Repositorios


Nota

-  Si sólo estas interesado en ojear un tema, dando click en el archivo bastara para revisar la información comodamente.

-   Para descargarlo sólo hace falta dar click en "Download ZIP", esté botón se encuentra en la parte central derecha.


Índice:

    1.   Introducción
    2.   Operadores
    3.   Ciclos Repetitivos
    4.   Estructuras Condicionales
    5.   Funciones y Procedimientos
    6.   Arreglos (Memoria Estática)
    7.   Manejo de Cadenas <string.h>
    8.   Apuntadores
    9.   Memoria Dinámica
 10.I   Listas Enlazadas
 10.II  Listas Enlazadas Avanzadas
   11.  Recursividad
   12.  Árboles Binarios
   13.  Manejo de Archivos de Texto y Binarios
 14.I   Hilos o Procesos Ligeros [Linux]
 14.II  Hilos o Procesos Ligeros [Windows]
   15.  Sockets TCP/IP, UDP/IP, (Servidor y Cliente) [Linux]

lunes, 30 de diciembre de 2013

Imprimir matrices y formas en C/C++ con Dev-C++ y WinBGIm

Primero debes configurar Dev-C++ para trabjar con WinBGIm. Para ello debes

1 - Descargar graphics.h y pegarlo en el directorio "include" de Dev-C++.
     Por defecto es C:\Dev-Cpp\include




2- Descargar libbgia y pegarlo en el directorio "lib" 
Por defecto es C:\Dev-Cpp\lib


3- Entrar en Herramientas / Opciones del Compilador

4- En el text area del linker copiar lo siguiente:
-lbgi
-lgdi32
-lcomdlg32
-luuid
-loleaut32
-lole32



Aceptas y ya debe estar configurado.

Ahora un pequeño ejemplo de impresión una matriz columna por columna. Cosa que no se puede hacer con printf que imprime fila por fila


#include <graphics.h>

int main( )
{
    // Inicia un cuadro de 400x300 caracteres
    initwindow(400, 400, "Ejemplo Matriz");
    
    int n=10; // Cantidad de columnas de la matriz
    int m=10; // Cantidad de filas de la matriz
    char matriz[n][m];    
    memset((void*)matriz,48,sizeof(char)*m*n); // Limpa la zona de memoria 
    char  caracter_puntual[2]={0,'\n'}; // Caracter específico de la matriz
        
    for (int x=0; x < n ; ++x )
    {       
            // Imprime la columna
            for (int y=0; y < m ; ++y )
            {
                caracter_puntual[0]=matriz[x][y];
                // Imprime el valor x,y de la matriz
                outtextxy(x*20,y*20,caracter_puntual);
            }            
            delay(200);
            
    }    
    getchar();    
    return 0;
}



Otro ejemplo. Impirmiendo un circulo:

#include <graphics.h>

int main( ){    initwindow(400, 300, "First Sample");    circle(100, 50, 40);    while (!kbhit( ))    {        delay(200);    }    return 0;}




Otro Ejemplo: Imprimiendo letras con colores:

#include <winbgim.h>

void waitForLeftMouseClick();

int main()
{
    initwindow(700,300); 
    settextstyle(0,0,2);
    setcolor(RED);
    outtextxy(100,100,"WELCOME TO CÓDIGO INFORMÁTICO");
    setcolor(GREEN);
    outtextxy(280,130,"INFO - UNT");

    // while(!kbhit()); // wait for user to press a key
    waitForLeftMouseClick(); 

    closegraph();        //close graphics window
    return 0;
}

void waitForLeftMouseClick()
{
    clearmouseclick(WM_LBUTTONDOWN);
    const int DELAY = 50; 
    int x, y;
    while (!ismouseclick(WM_LBUTTONDOWN))
        delay(DELAY);
    getmouseclick(WM_LBUTTONDOWN, x, y);
}

La documentación oficial está en esta pagina:

http://www.cs.colorado.edu/~main/bgi/

martes, 29 de octubre de 2013

Control del Robot Velocista

El control del robot, es una combinación de la aplicación del control Proporcional Integral Derivativo (PID) y el uso oportuno de la capacidad de frenar que nos brinda el Driver TB6612FNG.

Antes de continuar con la publicación del código, esbocemos algunos conceptos importantes para el control de robots velocistas.

1. ¿Qué es el Control PID?

Un PID es un mecanismo de control por realimentación que calcula la desviación o error entre un valor medido y el valor que se quiere obtener, para aplicar una acción correctora que ajuste el proceso. (http://es.wikipedia.org/wiki/Proporcional_integral_derivativo)

La explicación del uso de sus parámetros se basa en:
  • Proporcional: La proporcional tiene que ver con el error directo, es la respuesta que se tiene que entregar de manera inmediata.
  • Integral: La integral tiene como propósito el disminuir y eliminar el error en estado estacionario provocado por el modo proporcional.
  • Derivativo: La función de la acción derivativa es mantener el error al mínimo corrigiendo proporcionalmente con la misma velocidad que se produce, de esta manera evita que el error se incremente.


2. ¿Y como se aplica esté en robots velocistas?

La mayaría de los robots velocistas usan tracción diferencial, es decir varían la velocidad de alguna de las dos ruedas para conseguir un giro hacia un determinado lado, de allí la importancia del uso del Control PID, esté nos permite obtener un valor apropiado para asignarle al PWM de los motores según el estado del robot sobre la línea, aplicando un correctivo necesario en su dirección de desplazamiento para que esté no se salga de la línea.

Para velocistas la "Integral" de este control no se utiliza porque tiene que ver con errores acumulativos ocasionados por estados estacionarios, es decir cuando el robot esta totalmente detenido o en movimiento con velocidad constante. Debido a que a lo largo de la trayectoria en su recorrido por la pista se esta acelerando y desacelerando, el robot experimenta cambios dinámicos que imposibilitan el uso de este parámetro haciéndolo tender a 0. (es decir no lo usaremos).

Nota: En muchos caso se le llama Control PD


3. Frenos y su Importancia

Los frenos son sin duda alguna muy importantes cuando se trata de obtener un mayor control en los robots velocistas, nos permiten tener una segunda opción cuando nos salimos del rango de visión que nos muestran los sensores infrarrojos (estos eventos tienen mucha probabilidad de ocurrir en curvas obtusas o de 90°, haciendo de verdad muy difícil el control sin la opción de los frenos).

Cuando se aplican, es necesario tomar en cuenta que debemos hacerlo dándole dirección a la inercia que ocasiona el frenado hacia la toma correcta de la curva, para ello debemos frenar la rueda interna y liberar la rueda externa.

Nota: El frenado del robot Lenin, se hace de manera acumulativa usando una espera de un microsegundo, liberándose una vez que vuelve a la línea.

Recomiendo la publicación de Robot Zero en el año 2012
(http://webdelcire.com/wordpress/archives/1330)

La libreria QTRSensors.h la puede descargar de este lugar.

NOTA: Este código puede no funcionar en tu robot velocista. Recuerda que debes modificar los pines de dirección, sensores, etc.  También los valores de P, D y la potencia aplicada a los motores varían según el peso y su distribución, el centro de masa, la potencia de los motores, el largo y ancho, la distancia entre las ruedas, el alto de los ejes, la vibración generada por los motores, la rigidez de la parte delantera (cabeceo de los sensores). Incluso debes modificar estos valores dependiendo del tipo de pista en el que corra el robot.

El código funcional lo pueden conseguir por acá:  
https://github.com/abrahamjoc/robot-lenin