Você está na página 1de 10

Leccin 22: Creacin de libreras

En varias de las lecciones de este curso hemos utilizado una serie de funciones auxiliares que
nos facilitaron la utilizacin de temporizadores, bsculas set-reset, control de un motor, etc.
Aunque estas funciones que hemos utilizado repetidamente, por ejemplo las funciones iniTemp()
y chkTemp(), siempre contienen el mismo cdigo, nos hemos visto obligados a escribirlas una y
otra vez en cada nuevo programa que construamos.
Por supuesto, que podemos utilizar las facilidades que nos brindan los procesadores de textos
actuales para copiar y pegar el cdigo de unos proyectos a otros. Pero, tendramos que
acordarnos en qu proyecto las usamos para ir a su cdigo y realizar el proceso de copia. Y, a
medida que va pasando el tiempo, esta tarea puede terminar siendo una labor de bsqueda
pesada y difcil.
En general, todos los programadores acaban utilizando una serie de funciones de forma bastante
repetitiva en todos sus proyectos. Por eso surge el concepto de librera (en algunos pases
tambin se le conoce con el nombre de biblioteca). Una librera es un fichero (o una serie de
ellos) que contiene una serie de funciones que pueden ser enlazadas y utilizadas por nuestro
proyecto.
Nuestro entorno de desarrollo ya viene con una gran cantidad de libreras disponibles para
utilizar en nuestros proyectos. Algunas ya las hemos ido utilizando a lo largo de este curso. Sin
embargo en esta leccin queremos dar un paso ms all que la mera utilizacin de libreras de
terceras personas. Nuestro objetivo es aprender a construir nuestra propia librera con una serie
de funciones bsicas y a utilizarlas en uno de nuestros proyectos. Por supuesto que cada usuario
podr incluir ms funciones o eliminar aquellas que l no considere tiles para adaptar la librera
a sus necesidades particulares.
En primer lugar, tenemos que tener en cuenta una cosa importante para facilitar la utilizacin de
nuestras libreras en nuevos proyectos. El lugar donde coloquemos nuestra librera nos facilitar
su uso desde nuestro entorno de desarrollo. En concreto, el sistema de desarrollo de ARDUINO
busca, por defecto, todas las libreras que se encuentran en el directorio 'libraries' de la carpeta
donde tengamos instalado el entorno ARDUINO. En nuestro caso (windows 7 64bits) la carpeta se
encuentra en la siguiente ruta:

Y contiene las siguientes libreras:

Como es lgico, en cada ordenador encontraremos una lista diferente segn el nmero de
libreras de terceros que hayamos instalado.
Nosotros, vamos a crear una librera llamada Hubor. Si el usuario quiere cambiar el nombre de su
librera por uno que se adece ms a sus gustos, slo tiene que seguir todos los pasos de esta
leccin cambiando 'Hubor' por el nombre elegido en todos ellos. Lo importante es que
mantengamos la coherencia a lo largo de todo el proceso para que su utilizacin sea intuitiva y
sencilla.
La primera tarea consiste en crear un directorio de nombre 'Hubor' en la mencionada carpeta de
libreras. Dentro de esta carpeta que acabamos de crear tenemos que escribir dos ficheros de
texto. Uno de ellos lo llamaremos 'Hubor.cpp' y el otro 'Hubor.h'. Por ahora estn vacos, pero
ms tarde iremos aadiendo los cdigos necesarios. El primero contendr el cdigo en lenguaje
'c' de nuestras funciones. El segundo es un fichero de cabecera con informacin para el
compilador (normalmente, una declaracin directa de clases, subrutinas, variables, u otros
identificadores) para el uso de la librera.
El cdigo completo del archivo Hubor.cpp se puede descargar desde este enlace: Fichero
Hubor.cpp. Este fichero contiene el cdigo de las siguientes funciones: iniTemp(), chkTemp(),
flancoSub(), flancoBaj(), bascula_r(), bascula_s(), pulso(), pulso_mem(), parpadeo(), retraso() y
ctrlMotor(). En el cdigo, delante de cada funcin, figura una pequea explicacin del
funcionamiento de cada una de ellas y de la forma de utilizarla dentro de nuestro cdigo. A
efectos de esta leccin, vamos a concentrarnos en el comienzo del archivo con el cdigo de las

dos primeras funciones, de sobra conocidas para quien siga este curso puesto que las hemos
utilizado en varias lecciones. El resto de las funciones siguen un procedimiento de construccin
similar.

Es importante observar que nuestro fichero, despus de los comentarios con la informacin de la
librera, contiene dos sentencias #include. Cuando utilizamos una sentencia include, le estamos
indicando al compilador que incluya en ese punto el archivo correspondiente y lo compile con el
resto de los ficheros fuente que forman nuestro programa. Puesto que slo le indicamos el
nombre del archivo, el compilador entiende que lo tiene que buscar en el mismo directorio donde
se encuentra el archivo que lo est llamando (en nuestro caso la carpeta Hubor que acabamos
de crear y que es dnde est situado el archivo Hubor.ccp) o en alguno de los directorios
definidos por el compilador como lugares de bsqueda por defecto.
Por lo tanto, con estas dos sentencias #include estamos diciendo al compilador que incluya en
este punto los ficheros 'Hubor.h' y 'Arduino.h'. el primero es el fichero de cabecera que acabamos
de crear para nuestra librera y el segundo contiene una serie de definiciones utilizadas de forma
estndar por el entorno de programacin ARDUINO. En realidad, estas definiciones incluidas en el
fichero 'Arduino.h' las hemos estado utilizando en todos nuestros proyectos hasta ahora. Cuando
creamos un programa en ARDUINO, el compilador enlaza a este fichero por defecto de forma
automtica para nosotros. Pero cuando construmos una librera no lo hace y, por ese motivo, se
lo tenemos que indicar expresamente.
El resto del fichero es el cdigo de todas las funciones, tal y como lo hubiermos utilizado en
cualquiera de nuestros proyectos.
A continuacin vamos a escribir el cdigo del fichero de cabecera 'Hubor.h'. Lo podemos
descargar desde el siguiente enlace: Fichero Hubor.h. Como ya dijimos antes, contiene las
definiciones para ayudar al compilador a utilizar la librera.

En la lnea 15 utilizamos una sentencia #include como la que acabamos de ver en el fichero
Hubor.cpp para incluir el fichero con las definiciones estndar utilizadas por el entorno ARDUINO.
En las lneas 17 a 19 definimos los operadores lgicos para su utilizacin en nuestro cdigo.
En la linea 21 declaramos la estructura MotorDatosControl que ya vimos en la Leccin 19 y que
se utiliza en la funcin ctrlMotor() para intercambiar datos.
Y, por ltimo, de las lneas 35 a la 45 se incluyen los prototipos de todas las funciones includas
en la librera. Un prototipo es una declaracin de una funcin que se lleva a cabo con dos
propsitos principales: evitar conversiones errneas de valores (al definir el tipo de dato que
utilizamos para cada parmetro pasado a la funcin y el tipo de dato que devuelve la propia
funcin) y evitar errores en el nmero de argumentos pasados a la funcin.

Y ya tenemos todo listo para utilizar nuestra librera 'Hubor.h' en cualquier nuevo proyecto.
Vamos a crear el siguiente montaje:

Donde utilizaremos nuestro Arduino con cuatro entradas (tres pulsadores y un interruptor) y siete
salidas para gobernar otros tantos leds.
El cdigo de nuestro programa ser el siguiente:

Observe que la manera de poder utilizar todas las funciones almacenadas en nuestra librera no
puede ser ms sencilla. Slo con utilizar en la lnea 10 la sentencia #include correspondiente ya
las tenemos todas disponibles.
El resto de cdigo ya no tiene que tener secretos a esta altura del curso. Primero definimos las
variables de trabajo que vamos a utilizar. Luego la configuracion de los piines que vamos a usar
como entradas y salidas en la funcin setup(). Por ltimo el cdigo de trabajo que se repetir de
forma cclica en la funcin loop().
En la primera parte leemos los valores de las entradas. En la segunda, utilizamos las diferentes
funciones de la librera. En la tercera, escribimos las salidas. Y en la cuarta y ltima parte,
usamos las funciones de tiempo chkTemp() e iniTemp() para enviar informacin cada segundo al
exterior. Como en este caso no utilizamos las comunicaciones, hemos utilizado este espacio para
cambiar de valor una variable llamada flag1 que utilizamos para encender y apagar cada
segundo el led includo en la placa base de ARDUINO y conectado al pin IO13.
Si ejecutamos nuestro proyecto podemos ver como funciona cada una de las funciones de la
librera. En este punto hay que hacer una salvedad importante. Para que Proteus vuelva a leer
todas las libreras disponibles en el directorio 'libreries' de la carpeta 'Arduino' en lugar de
compilar nuestro proyecto como siempre con la opcin 'construir proyecto', necesitaremos

utilizar la opcin 'reconstruir el proyecto'. Una vez hecho esto la primera vez, ya podemos utilizar
la opcin 'construir proyecto' como siempre.

Veamos con detalle el uso de las funciones:

flancoSub() detecta el flanco de subida al pulsar el botn arranque1. Ese pulso de subida lo
utilizamos para alimentar el set de la funcin bascula_r() y por lo tanto se activa la salida1.
Cuando actuemos sobre el interruptor parada1 que utilizamos para alimentar el reset de la
funcin bascula_r se desactiva la salida1.
flancoBaj() detecta el flanco de bajada al pulsar el botn arranque2. Ese pulso al cesar la seal lo
utilizamos para alimentar el set de la funcin bascula_s() y por lo tanto se activa la salida2.
Cuando actuemos sobre el interruptor parada1 que utilizamos para alimentar el reset de la
funcin bascula_s se desactiva la salidas.
La diferencia entre bascula_r() y bascula_s() es la dominancia del set o el reset en caso de que
ambas seales lleguen al mismo tiempo. Podemos comprobar su funcionamiento diferente
ejercitando con este ejemplo.

pulso() genera un pulso de duracin igual a 5000mseg cuando se recibe la seal del pulsador
arranque2 y lo muestra en la salida3.
pulso_mem() genera un pulso de duracin igual a 5000mseg cuando se recibe la seal del
pulsador arranque2 y lo muestra en la salida4.
La diferencia entre pulso() y pulso_mem() es que la primera interrumpe la salida si cesa la seal
de entrada mientras que la segunda memoriza la orden de entrada y la sigue generando
despus de cesar el disparador. Para interrumpir el pulso antes de alcanzar el tiempo podemos
utilizar el parmetro reset de la funcin (en este caso parada1).
parpadeo() genera una intermitencia sobre la salida5 mientras est activa la entrada arranque3.
Por ltimo, retraso() activa la salida6 1500mseg despus de que se produzca la entrada3. Si la
entrada cesa antes de que pasen los 1500mseg no se llegar a generar la salida6.
Por supuesto, que el lector ya est en condiciones de construir la librera con las funciones que l
desee. Adems podr ir incorporando con el tiempo nuevas funciones acumulando trabajo para
el futuro.
Esperamos que esta leccion haya resultado interesante y que la utilizacin de libreras sea una
prctica habitual en los prximos proyectos.

Você também pode gostar