C++

Feliz Día, #programadores

programadorComo todos bien sabemos (bueno y el que no lo sabe, pues como que se va enterando XD), el día 13 de setiembre celebramos el día del programador, gracias a una iniciativa de Valentin Balt … y como no podía ser de otra manera, esta celebración tiene su explicación informática:

El día 13 de septiembre es el día 256 de un año normal, y para los programadores, esto va más allá de un simple número porque se trata de una potencia de dos (2^8) y el número de valores que se pueden representar en un byte.

Pues bien, con este post queremos desearle un ¡¡FELIZ DIA!! a todos aquellos quienes día a día sentimos esa pasión por resolver problemas y encontrar soluciones que requieren de un pensamiento abstracto y lógico. Seguir leyendo …

Bibliotecas en C++

Cuando uno empieza a programar, la forma de modularización del nuestro código es bien pobre; es mas!, tanto así que hasta a veces metemos todo en el main. Luego que superamos la fase de meter todo el main, comenzamos a modularizar mediantes funciones, las cuales las ubicamos dentro del mismo archivo. Hasta aquí ya sabemos programar; y pues ya no aparecen los errores en tiempo de compilación, pero nos falta algo aun para hacer proyectos mas grandes, ese algo, es aprender a usar y crear bibliotecas o librerías.

En C++ y en algunos otros lenguajes de programación, se pueden crear 2 tipos de bibliotecas: dinámicas y estáticas. En Windows, las primeras toman la extensión *.dll y las segundas *.lib o *.a. En linux cambia la extensión de estas por *.so y *.a, respectivamente. Si quieren saber mas sobre el uso de bibliotecas en linux, pueden pasarse por el site de chuidiang.com (sitio que, cuando empecé a programar, me sacó de muchos apuros).

Ahora, para comprender un poco mas de las bibliotecas hay que comprender un poco como funciona el proceso de hacer un programa en un lenguaje de programación compilado, desde su codificación hasta su ejecución. Repasando un poco de teoría, hay que saber que cuando creamos un fichero fuente, este al compilar crea ficheros objeto con extensión .o u .obj. Haciendo un paréntesis, quisiera decir que cuando comencé en la programación me malacostumbré a que con un boton “Build all” o “Make all”, me tuviera todo el proyecto listo para ejecutar y distribuir. Es por eso, que antes de usar cualquier IDE –creo yo- hay que conocer que sucede al hacer clic sobre estos botones. Como habia dicho lineas atras, al trabajar con un lenguaje compilado, al compilar se crean ficheros objeto y NO ejecutables. Los ejecutables son creados recien por el linker, el cual junta todos los ficheros objeto -que no es mas que codigo de maquina- para poder crear un ejecutable. Si alguna vez han programado en lenguaje ensamblador, se podran dar cuenta que el proceso es parecido, solo que en lugar del compilador, esta el ensamblador(MASM, TASM, NASM, etc.). Como dijo mi profesor del curso de arquitectura de computadoras, ya con los ficheros objeto tenemos una pista para poder comunicar varios lenguajes de programación, pero ese es otro tema. Por ultimo, también está el no menos importante “librarian”, que es el que se encarga de extraer los ficheros objeto de las bibliotecas, para que así el linker pueda crear el fichero ejecutable apropiadamente.

Todo esto es un poco de teoría de los lenguajes de programación, que la verdad es un poco aburrido, A MENOS QUE lo pongamos en practica. Quizás la mayoría de nosotros al querer usar una librería en C++, tenemos que buscar un pequeño tutorial de como instalarlo si estamos usando Dev C++ o si usamos Codeblocks, Visual C++, etc. Pero, como les decía antes, esto va contra mi pensamiento de hacer clic sobre botones que me esconden su funcionalidad. Debido a esto, cogeremos uno de estos IDE, pero NO USAREMOS EL IDE, sino SOLAMENTE EL COMPILADOR CON EL QUE VIENE. En este caso usaremos el Codeblocks, el cual viene con el G++(compilador de C++ de GNU) y además usaremos el API OpenGL y GLUT.

El API OPENGL ya viene incluido en los últimos sistemas operativos; y como toda api, tiene sus bibliotecas estáticas y dinámicas, solo hay que saber cuales son necesarias. En este caso para nuestro ejemplo necesitamos opengl, glu y glut. Entonces, como estamos en windows debemos buscar las librerías estáticas y dinámicas y los headers con los mismos nombres. Generalmente, las librerías dinámicas llevan el mismo nombre y terminan en 32, si nuestro windows es de 32 bits y las librerías estáticas comienzan con libNOMBREDELALIBRERIA32.a, como mi computadora es de 32 bits, encontré los siguientes archivos:

  • libopengl32.a
  • libglu32.a
  • libglut32.lib

Como OPENGL y GLU ya vienen con el compilador y/o el sistema operativo, no es necesario especificarle al compilador donde están las librerías dinámicas, ni los headers; ya que el compilador al instalarse, siempre setea la variable de entorno PATH y pone ahi las rutas. Si quieren probar usando solo el compilador y el linker, prueben, debería funcionarles normal, solo que habría que indicarle al compilador donde estan los .dll y los headers de opengl y glu.

Para glut, si hay q bajarse la librería completa, es decir: headers, librerias estaticas y dinámicas y luego decirle al compilador donde las puede encontrar para que al momento de linkear, pueda crear el ejecutable sin problemas.

Finalmente, todo esto que he escrito, lo pondremos en practica, como les dije antes, usando el compilador gcc. Para esto, solo hay q saber que parámetros hay q darle al compilador. En este caso sería:

g++ -omain main.c -I”D:\My OPENGL\Ejemplo-BIEN\PruebaOpengl-Notepad” -L”D:\My OPENGL\Ejemplo-BIEN\PruebaOpengl-Notepad” -lopengl32 -lglu32 –lglut32

donde –I indica donde encontrar los headers, –L donde buscar las librerías y –l, es la llamada al linker para que cree el ejecutable incluyendo los ficheros objeto que se encuentran en “opengl32, glu32 y glut32”, los cuales van a ser manipulados por el librarian.

Olvidaba que hay que tener en cuenta que el archivo g++.exe esta en la carpeta /bin de Codeblocks y que para que podamos llamarlo directamente hay que agregar dicha ruta al path, manualmente o en todo caso poner toda la ruta del archivo, ejemplo:

“C:\Archivos de programa\CodeBlocks\MinGW\bin\g++.exe” -omain main.c -I”D:\My OPENGL\Ejemplo-BIEN\PruebaOpengl-Notepad” -L”D:\My OPENGL\Ejemplo-BIEN\PruebaOpengl-Notepad” -lopengl32 -lglu32 –lglut32

Para no aburrirlos mas, pondré un ejemplo de programa de opengl que me pasaron en un minicurso de opengl que lleve en el congreso pasado de la UPAO. Lo principal es que pueden editar este código desde el bloc de notas y compilarlo desde línea de comandos (en este caso use un .bat).

Aquí pueden bajar el ejemplo:

Ejemplo OPENGL con bloc de notas

Hasta otro post =).

Controlar puerto paralelo desde java

Controlar el puerto paralelo es bastante sencillo con algunas funciones que ya tienen predefinidos algunos compiladores de C++. Por ejemplo, turbo c++ trae outport() e inport() para acceder a diversas direcciones de puerto.

Lo que hice esta vez, fue simplemente linkear dichas funciones a java mediante el JNI (Java Native Interface). A continuación les adjuntaré el jar con la pequeña biblioteca que hice y también algunos ejemplos simples probados con un led, cualquier consulta ponerla aquí abajito =D.

Olvidaba algo importante para cuando el proyecto tenga mas de 1 clase y/o paquetes (sino no es necesario), que para que corran los programas sin ningún inconveniente se debe poner el método: Port.loadLibrary() en la primera línea del main de su programa (incluso pueden agregarlo en “agregar biblioteca” de netbeans) y claro poner los dlls visibles para los .class de su programa puedan encontrarlos. El dll que creé fue el Port.dll que esta en el jar y el otro es clbr18.dll que es propio del compilador que use que fue OpenWatcom. Claro todo esta en la carpeta “Examples” del rar que pondré aquí abajo =D.

NOTA: Otra opcion es poner los dlls Port.dll y clbr18.dll dentro de la carpeta bin de su JDK, que en mi caso es el siguiente: C:\Archivos de programa\Java\jdk1.6.0_16\bin. Aparte tambien hay muchas mas opciones para setear el java.library.path, solo estoy nombrando las -que a mi parecer- son mas comodas.

Libreria JAR + DLLs (para agregar a proyectos de Netbeans)

Libreria Jar+ Source Code + Ejemplos

Solo ejemplos

Manejo de motores pap bipolares: EM-257, EM-258

El manejo de motores paso a paso unipolares es bastante sencillo, sin embargo para mi que no ando metido mucho con el hardware, me costo un poco de trabajo entender esto. Como explique en un post anterior, solo hay q darle 4 pasos, y si se quiere invertir el giro, solo se tiene que invertir el orden de los pasos.

Los motores pap bipolares poseen 4 terminales y cada uno de ellos va conectado a una salida del C.I. L293B, como mostraré en la siguiente imagen que la copié de x-robotics, la única diferencia para el EM-257 es que el terminal B, va al OUT3 y el terminal C al OUT2:

Estos motores los voy a controlar mediante el puerto paralelo, el cual controla que salidas deben activarse para que el motor gire de forma horaria y anti-horaria, según se requieran. Como se menciono anteriormente un motor paso a paso posee ciertas combinaciones o pasos que determinaran el movimiento del motor, en nuestro caso, al usarse un motor paso a paso bipolar de 4 terminales, éste posee 4 pasos, los cuales se describirán a continuación:

Seguir leyendo …

Queriendo hacer un brazo robótico (I)

Para demostrar lo que voy aprendiendo en mis cursos, a mí me gusta expresarlo en los proyectos. No soy de esas personas que se esmeren por sacar un 20 en un examen –aunque debería- ya que siento que un examen es como en el momento de patear penales, uno puede meter el gol como no, pero eso no significa que eres el mejor o el peor jugador, o en este caso, estudiante.

Esto trajo sus recompensas, sobre todo el ciclo pasado; ya que dos proyectos que anduve haciendo en vacaciones me salvaron la vida de dos cursos. Últimamente había dejado estos proyectos debido a razones ya expresadas en un post anterior. Sin embargo, hoy me dieron ganas de seguir y pues me puse manos a la obra y decidí ir posteando a ver cómo me va, esto también me servirá a no dejar el proyecto a medias, ya que tendré este post recordándome lo que aun me falta por hacer.

En fin, la meta es hacer un brazo robótico. La base del funcionamiento de este proyecto son los motores. Para este caso estoy siendo mas o menos un chatarrero, ya que me puse a desarmar impresoras y algunas lectoras de CD para sacarles sus motores, en este caso los motores que saqué son motores PAP (Paso a Paso). Se llaman motores PAP porque su funcionamiento esta dado por pasos, un paso vendría a ser una secuencia de 1′s y 0′s que se le da a los terminales del motor para que este funcione, estos pasos deben ir con cierto retardo a modo de pulso de reloj, por lo que si no se está usando la PC, he visto que también es válido usar el integrado TIMER 555.

Para mi caso usé la PC, más específicamente, el puerto paralelo de la PC. Desde ahí controlo el giro horario y anti horario del motor PAP, el cual estado dado por 4 pasos:

Paso 1 = 0101 = 5
Paso 2 = 1001 = 9
Paso 3 = 1001 = 10
Paso 4 = 0110 = 6

Los cuales son enviados en forma de bits desde el registro de datos del puerto paralelo (378H, en las pc’s compatibles). Para esto y para ahorrarme la fatiga, use C++ y Java, enlazándolos mediante el JNI y su biblioteca. En esta ocasión, les mostrare como estoy probando el motor de una lectora de cd’s que compre en takorita por 5 lukas xD. El motor que verán moviéndose lo usare para una parte del codo, ya que es pequeño, para el resto del robot usare motores de impresora como el siguiente:

Ahora, como ya dije, pondré el video del funcionamiento del motor de una lectora de CD’s. Ah! me olvidaba, para todo esto se tiene que usar el integrado L293B, que es un puente H, mejor dicho es un puente H de transistores o visto de otra forma, 4 compuertas de 3 estados. Bueno, aquí les dejo el video.

Y aqui otro video de cuando le puse cartones para ver como se movia xD…

Taking a C++ OOP online-course

Two months ago, my dad told me to suscribe on the ACM, because, as he said,  it would be very useful while studying my career(computer science). Now I am an ACM Student Member; however, I didn’t know how to use it nor how to take advantage of all the benefits that the ACM bring to its members. Well, the first time I entered my ACM internet account, I notice its website was not so friendly and I didn’t know what to do or where to start, I mean, what I’m use to find useful is when I see parts of source code or well described algorithms.

C++

After one month, I finally learned how to use my account(al least how to get more benefits from it). This happened when I found one of several emails sent to my gmail account. They were about 10 to 15 messages, that I hadn’t read. I could have ignored it, as always, but I saw a message that seems to be very interesting. I really don’t remember what was the title of the subject, I just remember the word “course”, so I decided to read that message. Seguir leyendo …

Sobre punteros en C y C++

C y C++

Yo empecé a programar en java; bueno en realidad en visual basic(pero es algo que quiero olvidar) y por eso es obvio que tuviera algunos problemitas con los punteros al pasar a C.

Bueno, segun yo, ya los habia entendido; sin embargo, no fue así, ya que empecé a tener algunas dudas. En fin, segun la definicion de punteros, estos son variables que hacen referencia a una direccion de memoria, pues si es así, entonces yo supuse que si creaba 3 punteros de enteros seguidos, estos apuntarian a direcciones de memoria contiguas.

Seguir leyendo …