Sei sulla pagina 1di 12

ARDUINO Fundamentos (Foundations) Esta pgina alberga explicaciones de algunos de los elementos del hardware y softw are de Arduino

y los los conceptos que hay tras ellos. CONCEPTOS BASICOS Primer Sketch En la gua de inicio (Windows, Mac OS X, Linux), subiste un sketch que hace parpad ear un LED. En este tutorial, aprenderas como funciona cada parte de ese sketch. Sketch Un sketch es el nombre que usa Arduino para un programa. Es la unidad de codigo que se sube y ejecuta en la placa Arduino. Comentarios Las primeras lineas del sketch Blink son un comentario: /* * Blink * * The basic Arduino example. Turns on an LED on for one second, * then off for one second, and so on... We use pin 13 because, * depending on your Arduino board, it has either a built-in LED * or a built-in resistor so that you need only an LED. * * http://www.arduino.cc/en/Tutorial/Blink */ Todo lo que se encuentra entre /* y */ es ignorado por Arduino cuando ejecuta el sketch (el * al comienzo de cada linea esta ahi solo para que el comentario se vea bien, no es requerido). Esta ah para la gente que lee el cdigo: para explicar lo que hace el programa, como funciona, o por que esta escrito de tal manera. Es muy buena practica poner comentarios en tus sketches, y mantener estos actualiz ados cuando modiques el cdigo. Esto ayuda a otras personas a aprender de tu codig o y modificar el mismo. Existe otro estilo para comentarios cortos, de una sola linea. Estos comienzan c on // y continuan hasta el final de la linea. Por ejemplo en la linea: int ledPin = 13; // LED connected to digital pin 13 el mensaje "LED connected to digital pin 13" es un comentario. Variables Una variable es un lugar donde se almacena un dato. Posee un nombre, un tipo y u n valor. Por ejemplo, la linea del sketch Blink anterior declara una variable co n el nombre ledPin, de tipo int, y con el valor inicial 13. Esta siendo utilizad a para indicar que pin de Arduino se conecta al LED. Cada vez que el nombre ledP in aparece en el codigo, su valor sera utilizado. En este caso, la persona que e scribio el codigo podria no haberse molestado en definir la variable ledPin y ut ilizar simplemente 13 en todas las partes en que debiese especificar el numero d el pin. La ventaja de utilizar una variable es que se hace mucho ms fcil mover el LED a un pin diferente: solo necesitas editar la linea en que se asigna el valor inicial a la variable. Con frecuencia, el valor de una variable cambiara a medida que se ejecuta el ske tch. Por ejemplo, podras almacenar en una variable el valor ledo desde un input. H ay ms informacin en el tutorial de variables. Funciones Una funcin (tambin conocida como procedimiento o sub-rutina) es un pedazo de cdigo que puede ser utilizado desde cualquier otro punto del sketch. Por ejemplo, aqu e sta la definicin de la funcin setup() en el ejemplo Blink: void setup() { pinMode(ledPin, OUTPUT); // sets the digital pin as output }

La primera linea nos entrega informacin sobre la funcin, como su nombre, "setup". El texto que hay antes y despues del nombre especifica el tipo de devolucin y los parametros de la funcin: estos seran explicados ms adelante. El codigo entre { y } es conocido como cuerpo de la funcin: lo que la funcin realiza. Puedes llamar a una funcin que ha sido previamente definida (ya sea en tu sketch o como parte del lenguaje Arduino). Por ejemplo, la linea pinMode(ledPin, OUTPUT ); llama la funcin pinMode(), pasandole sus dos parametros: ledPin yOUTPUT. Estos parametros son utilizados por la funcin pinMode para decidir que pin y modo util izar. pinMode(), digitalWrite(), y delay() La funcin pinMode() configura un pin como entrada o salida. Para utilizarla, le p asas el numero del pin que vas a configurar y la constante INPUT o OUTPUT. Cuand o est configurada como input, un pin puede detectar el estado de un sensor, como un pulzador; esto se discute en un tutorial ms adelante?. Como salida, este puede manejar un actuador, como un LED. La funcin digitalWrite() enva un valor a un pin. Por ejemplo, la linea: digitalWrite(ledPin, HIGH); modifica ledPin (pin 13) como HIGH, o 5 volts. Enviando LOW a un pin lo conecta a tierra, o 0 volts. delay() hace a Arduino esperar por el numero especificado de milisegundos antes de continuar con la siguiente linea. Hay 1000 milisegundos en un segundo, por lo que la linea: delay(1000); crea un retraso de un segundo. setup() y loop() Existen dos funciones especiales que son parte de cada sketch de Arduino: setup( ) y loop(). setup() es llamado una vez, cuando comienza el sketch. Es un buen lu gar para realizar tareas de configuracin, como definir los pins o inicializar bib liotecas. La funcin loop() se llama una y otra vez y es el corazn de la mayoria de los sketches. Necesitas incluir ambas funciones en tu sketch, aun cuando no las necesites para nada. MICROCONTROLADORES PINES DIGITALES Los pines del Arduino pueden configurarse como entradas o salidas. Este document o explica el funcionamiento de los pines en esos modos. Si bien el ttulo de este documento se refiere a los pines digitales, es importante sealar que la gran mayo ra de los pines analgicos de Arduino (Atmega), pueden configurarse y utilizarse, e xactamente de la misma manera que los pines digitales. Propiedades de los Pines Configurados como Entrada (INPUT) Los pines de Arduino (Atmega) por defecto son de entrada, por lo que no es neces ario configuraros explcitamente como entradas con pinMode(). Se dice que los pine s configurados como entradas estn en estado de alta impedancia. Una forma de expl icar esto es que los terminales de entrada hacen demandas extremadamente pequeas en el circuito que estn muestreando, se dice que equivale a una resistencia en se rie de 100 megaohmio frente al pin. Esto significa que se necesita muy poca corr iente para pasar el pin de entrada de un estado a otro, y puede hacer posible el uso de los pines para tareas como la utilizacin de un sensor capacitivo al tacto , la lectura de un LED como un fotodiodo, o la lectura de un sensor analgico con un esquema como el RCTime. Esto tambin significa sin embargo, que los terminales de entrada sin conectar nad a a ellos, o con los cables conectados a ellos sin estar conectados a otros circ uitos, reflejarn cambios aparentemente aleatorios en el estado de pin, recogiendo el ruido elctrico del entorno, o el acoplamiento capacitivo del estado de un pin prximo.

Resistencias Pullup A menudo es til para colocar un pin de entrada en un estado conocido si no hay un estado de entrada. Puede hacerse aadiendo una resistencia pull-up (a +5 V), o un a resistencia pull-down (resistencia a tierra) en la entrada, 10K suele ser un v alor muy comn. Tambin hay resistencias pullup de 20K conveniente integradas en el chip Atmega a las que se puede acceder desde el software. Estos resistencias pull-up incorpora das son accedidas de la siguiente manera. pinMode(pin, INPUT); // pone el pin como entrada digitalWrite(pin, HIGH); // activa la resistencia pullup Ten en cuenta que las resistencias pull-up proporcionan suficiente corriente par a dar una luz tenue con un LED conectado a un pin que se ha configurado como ent rada. Si el LED de un proyecto parece estar funcionando pero muy tenuemente, es posible que sea esto lo que est pasando, y el programador ha olvidado usar pinMod e() para ajustar los pines como salidas. Tambin debes tener en cuenta que las resistencias pull-up son controladas por los mismos registros (posiciones de memoria interna del chip) que controlan si un p in est alto (HIGH) o bajo (LOW). Por consiguiente, un pin que se configura para t ener las resistencias pullup activadas cuando esta configurado como entrada, deb e tener el pin a alto (HIGH) si el pin es cambiado como salida (OUTPUT) con pinM ode(). Esto funciona en la otra direccin tambin, y un pin de salida que queda en u n estado alto tendr las resistencias pull-up activas, si cambia a entrada (INPUT) con pinMode(). NOTA: El pin Digital 13 es ms difcil de usar que otros pines digitales porque tien e un LED y una resistencia asociada soldados a la placa en la mayora de las placa s. Si activa la resistencia pull-up 20k del interior, se pondra en alrededor de 1,7 V en lugar de los 5V que se esperan debido a que el LED integrado y la resis tencia en serie bajan el nivel del voltaje, lo que se traduce en que siempre ret ornar bajo (LOW). Si ests obligado a usar el pin 13 como entrada digital, utiliza una resistencia pulldown externa. Propedades de los Pines Configurados com salida (OUTPUT ) Los pines configurados como salida (OUTPUT) con pinMode() se dice que estn en un estado de baja impedancia. Esto significa que puede proporcionar una cantidad su stancial de corriente a otros circuitos. Los pines del Atmega pueden proporciona r corriente positiva o proporcionar corriente negativa de hasta 40 mA (miliamper ios) a otros dispositivos o circuitos. Esta es suficiente corriente para la bril lante luz de un LED (no te olvides de la resistencia en serie), o para utilizar muchos sensores por ejemplo, pero no es corriente suficiente para utilizar la ma yora de rels, solenoides o motores. Los cortocircuitos en los pines de Arduino, o intentos de extraer mucha corrient e de ellos, pueden daar o destruir los transistores de salida en el pin, o daar co mpletamente el chip Atmega. A menudo, esto se traducir en un pin del microcontrol ador "muerto", pero el resto del chip seguir funcionando adecuadamente. Por esta razn es buena idea conectar los pines de salida a otros dispositivos con resisten cias de 470 o 1k, limitando la corriente mxima que desde los pines es requerida pa ra una aplicacin particular. PINES DE ENTRADA ANALOGICOS Una descripcin de las entradas analgicas del chip de Arduino (Atmega8, Atmega168, Atmega328, or Atmega1280). Conversor A/D El controlador Atmega que usa Arduino lleva incluido un conversor analgico-digita l (A/D) de 6 canales. Tiene una resolucin de 10 bits, retornando enteros desde 0 a 1023. Mientras que el uso principal de estos pines por los usuarios de Arduino es para la lectura de sensores analgicos, estos pines tienen tambien toda la fun cionalidad de los pines de entrada-salida de propsito general (GPIO) (al igual qu e los pines 0 - 13). Consecuentemente, si un usuario necesita ms pines de propsito general de entrada-s

alida, y no se est usando ningn pin analgico, estos pines pueden usarse como GPIO. Mapeo de Pins Los pines de Arduino correspondientes a los pines analgicos son desde el 14 al 19 . Observa que esto son pines de Arduino y no corresponden con los nmeros de los p ines fsicos del chip Atmega. Los pines analgicos, pueden usarse de manera idntica q ue los digitales, as que por ejemplo, podras ver un cdigo como este para configurar un pin analgico,y establecerlo a HIGH: pinMode(14, OUTPUT); digitalWrite(14, HIGH); Resistencias Pullup Los pines analgicos tambin tienen resistencias pullup, las cuales funcionan igual que en los pines digitales. Se activan cuando usamos instrucciones como la sigui ente digitalWrite(14, HIGH); // activa la resistencia pullup en el pin analgico 0 Mientras el pin es una entrada (input). Ten en cuenta que si, por descuido, activamos una resistencia pullup, mientras u samos algunos sensores, los valores obtenidos por analogRead() se vern afectados. La mayora de los usuarios usarn las resistencias pullup cuando usen un pin analgic o como digital. Detalles y Observaciones El comando analogRead no funcionar adecuadamente si el pin analgico se estableci co mo salida,as que si es tu caso, vuelve a aestablecerlo como entrada antes de usar analogRead. De igual manera si el pin , siendo de salida,se estableci a HIGH, la resistencia pullup permanecera activa, aunque volvamos a establecerla como entr ada. La hoja de datos de ATmega nos previene acerca de la conmutacin (de analgico a dig ital) de los pines analgicos en las proximidades de una lectura (analogRead) en o tros pines analgicos. Esto puede producir ruidos y fluctuaciones en el sistema an algico. Puede ser til, despus de manipular pines analgicos (en modo digital), aadir u na pequea parada (delay) antes de usar analogRead() en otros pines analgicos. PWM El ejemplo "Fading" demuestra el uso de una salida analgica (PWM) para atenuar y aumentar la luminosidad de un LED. Lo tienes disponible en la opcin "File->Sketch book->Examples->Analog" del men del software de Arduino. La Modulacin por Ancho de Pulso (PWM = Pulse Width Modulation) es una tecnica par a simular una salida analgica con una salida digital. El control digital se usa p ara crear una onda cuadrada, una seal que conmuta constantemente entre encendido y apagado. Este patron de encendido-apagado puede simular voltajes entre 0 (siem pre apagado) y 5 voltios (siempre encendido) simplemente variando la proporcin de tiempo entre encendido y apagado. A la duracin del tiempo de encendido (ON) se l e llama Ancho de Pulso (pulse width). Para variar el valor analgico cambiamos, o modulamos, ese ancho de pulso. Si repetimos este patrn de encendido-apagado lo su ficientemente rapido por ejemplo con un LED el resultado es como si la seal varia ra entre 0 y 5 voltios controlando el brillo del LED. En el grafico de abajo las lineas verdes representan un periodo regular. Esta du racin o periodo es la inversa de la frecuencia del PWM. En otras palabras, con la Arduino la frecuencia PWM es bastante proxima a 500Hz lo que equivale a periodo s de 2 milisegundos cada uno. La llamada a la funcin analogWrite() debe ser en la escala desde 0 a 255, siendo 255 el 100% de ciclo (siempre encendido), el valor 127 ser el 50% del ciclo (la mitad del tiempo encendido), etc. Una vez cargado y ejecutado el ejemplo mueve la arduino de un lado a otro, lo qu e ves es esencialmente un mapeado del tiempo a lo largo del espacio. A nuestros ojos el movimiento difumina cada parpadeo del LED en una linea. A medida que la luminosidad del LED se incrementa o atenua esas pequeas lineas crecen o se reduce n. Ahora estas viendo el ancho de pulso (pulse width). MEMORIA

Existen 3 fuentes de memoria en el microcontrolador utilizado por la placa Ardui no (ATmega168): Memoria Flash (espacio del programa), donde Arduino almacena el sketch. SRAM (static random access memory, memoria estatica de acceso aleatorio) donde l os sketches almacena y manipulan variables al ejecutarse. EEPROM es un espacio de memoria que puede ser utilizada por los programadores pa ra almacenar informacin de largo plazo. La memoria Flash y EEPROM son no-volatiles (la informacin se mantiene en ellas lu ego de cortar la alimentacin). SRAM es volatl y se perdera al reiniciar la unidad. El chip ATmega168 cuenta con las siguientes cantidades de memoria: Flash 16k bytes (de los que 2k son utilizados por el bootloader) SRAM 1024 bytes EEPROM 512 bytes Ten en cuenta que no hay mucha SRAM disponible. Es fcil utilizarla toda al tener muchas cadenas (strings) en tu programa. Por ejemplo, una declaracin como: char message[] = "Ah, qu hermoso..., qu hermoso." pone 32 bytes en la SRAM (cada caracter utiliza un byte). Esto pude no parecer m ucho, pero no toma mucho ms llegar hasta 1024, especialmente si tienes largas can tidades de texto que enviar a una pantalla, o una tabla de datos muy grande, por ejemplo. Si se te acaba la SRAM, tu programa fallara de manera improvista; parecera subir a la placa de manera correcta, pero no se ejecutara, o se ejecutara de manera e xtraa. Para comprobar si esto es lo que sucede, puedes intentar comentado o acort ando las cadenas de texto u otras estructuras de datos en tu sketch (sin alterar el cdigo). Si entonces este funciona correctamente, es probable que el problema haya sido la SRAM llena. Hay unas pocas cosas que puedes hacer para solucionar e ste problema: Si tu sketch se comunica con una aplicacin corriendo en un ordenador, puedes inte ntar trasladar datos o calculos al ordenador, reduciendo la carga en el Arduino. Si tienes tablas de referencia o otros arreglos de gran tamao, utiliza el tipo de datos mas pequeo que puedas para almacenar estos datos; por ejemplo, un int utli za 2 bytes, mientras que un byte utiliza solo uno (pero puede almacenar un rango menor de datos). Si no necesitas modificar las cadenas o datos mientras el sketch se ejecuta, pue des almacenarlos en la memoria Flah (de programa) en vez de la SRAM; para esto, utiliza el keyword PROGMEM If you don't need to modify the strings or data while your sketch is running, yo u can store them in flash (program) memory instead of SRAM; to do this, use the PROGMEM keyword. Para utilizar la EEPROM, consulta la biblioteca EEPROM. TECNICA DE PROGRAMACION VARIABLES Una variable es una ubicacin para almacenar una porcin de informacin. Tiene un nomb re, un valor y un tipo. Por ejemplo, esta sentencia (llamado una declaracin): int pin = 13; crea una variable cuyo nombre es pin, whose value is 13, y su tipo es int. Mas t arde en el programa, puedes hacer referencia a esta variable por su nombre, mome nto en el que puedes acceder a su valor y utilizarlo. Por ejemplo, en esta sente ncia: pinMode(pin, OUTPUT); es el valor de pin (13) el que ser pasado a la funcinpinMode(). En este caso, real mente no necesitas usar una variable, esta sentencia funcionara igual de bien: pinMode(13, OUTPUT); La ventaja de una variable en este caso es que solo necesitas especificar el nmer o del pin una nica vez, pero puedes usarlo montones de veces. As, si mas tarde dec ides cambiar el pin 13 por el 12, solo tienes que cambiarlo en un punto del cdigo

. Adems puedes usar un nombre descriptivo que tenga que ver con el uso que vas a dar a la variable (ej. un programa para controlar un LED RGB (Rojo, Verde y Azul ) podra tener variables llamada PinRojo, PinVerde y PinAzul). Una variable tiene otras ventajas sobre un valor como un nmero. La ms importante, puedes cambiar el valor de una variable mediante un asignador (representado por el signo igual). Por ejemplo: pin = 12; cambiar el valor de la variable a 12. Observa que no se especifica el tipo de la variable: este no cambia con la asignacin. Es decir, el nombre de la variable est permanentemente asociado a un tipo; slo esto cambia valor. [1] Ten en cuenta que tienes que declarar una variable antes de asignarle un valor. Si se incluye la i nstruccin anterior en un programa sin la previa declaracin anterior, obtendras un mensaje del estilo: "error: pin was not declared in this scope" ("Error: pin no ha sido declarado en este mbito"). Cuando se asigna una variable a otra, ests haciendo una copia de su valor y almac enando dicha copia en la ubicacin de memoria asociada a la otra variable. Cambian do una no tiene efecto en la otra. Por ejemplo, despus de: int pin = 13; int pin2 = pin; pin = 12; slo pin tiene el valor 12; pin2 tiene todava 12. Y ahora qu, puede que te preguntes que significa la palabra "scope" (alcance) en e se mensaje de error anterior? Se refiere a la parte de tu programa en el que se puede usar la variable. Esto se determina por el lugar donde se declara. Por eje mplo, si quieres poder utilizar una variable en cualquier parte de tu programa, puedes declararla en la parte superior de tu cdigo. Esto se llama variable global , aqu tienes un ejemplo: int pin = 13; void setup() { pinMode(pin, OUTPUT); } void loop() { digitalWrite(pin, HIGH); } Como puedes ver, pin se usa tanto en la funcin setup() como en loop(). Ambas func iones hacen referencia a la misma variable, por lo que un cambio en una afectar a l valor que tendr en la otra, como en: int pin = 13; void setup() { pin = 12; pinMode(pin, OUTPUT); } void loop() { digitalWrite(pin, HIGH); } Aqu, a la funcin digitalWrite() llamada desde loop() se le pasa el valor 12, ya qu e es el valor que se le asigna a la variable en la funcin setup(). Si tienes que utilizar una variable en una sola funcin, puedes declararla en la m isma, en cuyo caso el mbito (scope) de utilizacin se limita a esa funcin. Por ejemp lo: void setup() {

int pin = 13; pinMode(pin, OUTPUT); digitalWrite(pin, HIGH); } En este caso, la variable pin slo podr ser usada dentro de la funcin setup(). Si tr atas de hacer algo como esto: void loop() { digitalWrite(pin, LOW); // incorrecto: pin no tiene mbito aqu. } obtendrs el mismo mensaje que antes: "error: 'pin' was not declared in this scope " ("error: 'pin' no se declar en este mbito"). Es decir, a pesar de que has declar ado pin en algn sitio en tu programa, est tratando de utilizarlo en alguna parte f uera de su mbito de aplicacin. Te puedes preguntar por qu no hacemos todas las variables globales? Despus de todo, si no s dnde puedo necesitar una variable, por qu limitar su alcance a una sola fun cin? La respuesta puede que sea ms fcil de averiguar lo que te parece. Si una varia ble es global, su valor podra cambiarse en cualquier parte del cdigo, lo que signi fica que necesita entender la totalidad del programa para saber qu va a pasar con la variable. Por ejemplo, si la variable tiene un valor que no esperabas, puede ser mucho ms fcil de averiguar de donde viene el valor si la variable tiene un al cance limitado. [block scope] [size of variables] [1] En algunos lenguages de programacin, como Python, los tipos se asocian con va lores, no a los nombres de variables, y se pueden asignar valores de cualquier t ipo a una variable. Esto se conoce como tipos dinmicos (dynamic typing). FUNCIONES

Segmentar el cdigo en funciones permite al programador crear piezas modulares de cdigo que realizan una tarea definida y vuelven a la zona del programa en la que fueron llamadas. El caso tpico para crear un funcin es cuando uno necesita realiza r la misma accin mltiples veces dentro de un mismo programa. Para programadores acostumbrados a utilizar BASIC las funciones en Arduino permi ten (y extienden) la utilidad de usar subrutinas (GOSUB en BASIC). La estandarizacin de fragmentos de cdigo en funciones tiene diversas ventajas: Las funciones ayudan al programador a ser organizado. Adems ayudan a conceptualiz ar el programa. Las funciones codifican una accin en un lugar, as que slo deben ser depuradas de e rores una vez. Reducen las posibilidades de error en modificaciones, si el cdigo debe ser cambia do. Las funciones hacen el sketch mas pequeo y mas compacto por que las secciones de cdigo se reutilizan varias veces. Hacen mas fcil la reutilizacin de cdigo en otros programas por hacerlo mas modular y, como efecto paralelo, usando funciones se obtiene un cdigo mas legible. Hay dos funciones necesarias en un sketch de Arduino: setup() y loop(). El resto de funciones debe ser definido fuera de las llaves de estas dos funciones. Como ejemplo vamos a crear una funcin muy simple que multiplica dos nmeros. Ejemplo Al "invocar" a nuestra pequea funcin le pasamos parametros del tipo de dato que el la espera. void loop{ int i = 2; int j = 3; int k; k = myMultiplyFunction(i, j); // k ahora contiene 6

} Nuestra funcin necesita ser declarada fuera de cualquier otra funcin, por ello "my MultiplyFunction()" puede ir antes o despues de la funcin "loop()". El sketch completo podra ser algo como esto: void setup(){ Serial.begin(9600); } void loop{ int i = 2; int j = 3; int k; k = myMultiplyFunction(i, j); // k ahora contiene 6 Serial.println(k); delay(500); } int myMultiplyFunction(int x, int y){ int result; result = x * y; return result; } Otro ejemplo: Esta funcin leer un sensor cinco veces con analogRead() y calcular la media de las cinco lecturas. Escala los datos a 8 bits (0-255), los invierte y devuelve el re sultado invertido. int ReadSens_and_Condition(){ int i; int sval; for (i = 0; i < 5; i++){ sval = sval + analogRead(0); } sval = sval = sval = return sval / 5; sval / 4; 255 - sval; sval; // // // // // sensor en pin analgico 0

media escala a 8 bits (0 - 255) invierte el resultado devuelve el resultado

} Para llamar a nuestra funcin solo tenemos que asignarla a una variable. int sens; sens = ReadSens_and_Condition(); LIBRERIAS Este documento explica cmo crear una librera para Arduino. Se inicia con un progra ma de cdigo Morse y explica cmo convertir sus funciones en una librera. Esto permit e que otras personas usen el cdigo que has escrito y puedan actualizarlo facilmen te a medida que mejora la librera. Comenzamos con un programa de cdigo Morse: int pin = 13; void setup() { pinMode(pin, OUTPUT); } void loop() { punto(); punto(); punto();

raya(); raya(); raya(); punto(); punto(); punto(); delay(3000); } void punto() { digitalWrite(pin, HIGH); delay(250); digitalWrite(pin, LOW); delay(250); } void raya() { digitalWrite(pin, HIGH); delay(1000); digitalWrite(pin, LOW); delay(250); } Si ejecuta este programa, se representar el cdigo de SOS (llamada de auxilio) en e l pin 13. El programa tiene unas pocas partes que tendremos que poner en nuestra librera. E n primer lugar, tenemos las funciones punto() y raya() que hacen el parpadeo. En segundo lugar, tenemos la variable ledPin que indica el pin a utilizar. Por ltim o, est la llamada a pinMod () que inicializa el pin como salida. Vamos a empezar a convertir el programa en una librera! Para una librera necesita al menos dos arcivos: un archivo de cabecera (w / con e xtensin. H) y el cdigo fuente (w / extensin. cpp). El archivo de cabecera contiene definiciones para la librera: bsicamente un listado de todo lo que hay dentro, mie ntras que el archivo del cdigo fuente tiene el cdigo real. Vamos a llamar a nuestr a librera "Morse", por lo que nuestro archivo de cabecera ser Morse.h. Echemos un vistazo a lo que contiene. Puede parecer un poco extrao al principio, pero tendr ms sentido una vez que vea el cdigo fuente que lo acompaa. El archivo de cabecera consiste bsicamente en una clase con una lnea para cada fun cin de la librera, junto con las variables que se van a usar: class Morse { public: Morse(int pin); void punto(); void raya(); private: int _pin; }; Una clase es simplemente una coleccin de funciones y variables agrupadas en un mi smo lugar. Estas funciones y variables pueden ser pblicas, lo que significa que l as podrn usar las personas que estn utilizando la librera, o privada, lo que signif ica que slo se puede acceder a ellas desde la propia clase. Cada clase tiene una funcin especial conocida como constructor, que se utiliza para crear una instanci a de la clase (o sea, un objeto). El constructor tiene el mismo nombre que la cl ase, y no devuelve nada. Se necesitan un par cosas ms en el archivo de encabezado. Una de ellas es una ins truccin # include que da acceso a los tipos estndar y las constantes del lenguaje Arduino (esto se agrega automticamente a los programas normales, pero no a las li breras). Se parece a esto (y se coloca antes de la definicin de la clase mostrada anteriormente): 1. Include "WProgram.h" Por ltimo, es comn aadir las siguientes lineas de cdigo : 1. Ifndef Morse_h 2. Define Morse_h // La declaracin # include y el cdigo van aqu ... 1. endif Bsicamente, esto evita problemas si alguien accidentalmente usa dos veces el #inc lude con la librera que estamos construyendo, evitando que se declaren las variab

les y funciones ms de una vez. Por ltimo, se suele poner un comentario en la parte superior de la librera con su nombre, una breve descripcin de lo que hace, quin lo escribi, la fecha y el tipo de licencia. Echemos un vistazo a la cabecera completa: /* Morse.h - Library for flashing Morse code. Created by David A. Mellis, November 2, 2007. Released into the public domain. / 1. ifndef Morse_h 2. define Morse_h 3. include "WProgram.h" class Morse { public: Morse(int pin); void punto(); void raya(); private: int _pin; }; 1. endif Vamos a repasar las distintas partes del cdigo fuente de Morse.cpp. Lo primero son un par de # include. Con esto el resto del cdigo tendr acceso a las funciones estndar de Arduino, y a las definiciones definidas en Morse.h: 1. Include "WProgram.h" 2. Include "Morse.h" A continuacin viene el constructor. Una vez ms, en el constructor se establece lo que debe ocurrir cuando alguien crea una instancia de la clase. En este caso, el usuario especifica el pin que le gustara utilizar. Configuramos el pin como sali da en una variable privada para su uso en las otras funciones: MORSE:: Morse (pin int) ( pinMode (pin, OUTPUT); _pin = pin; ) Hay un par de cosas extraas en este cdigo. La primera es el Morse:: antes del nomb re de la funcin. Esto indica que la funcin es parte de la clase Morse. Vers esto en otras funciones de la clase. Lo segundo es el subrayado en el nombre de nuestra variable privada, _pin. Esta variable puede tener cualquier nombre, siempre y c uando coincida con la definicin que figura en el archivo de encabezado. Agregar u n subrayado al inicio del nombre es una convencin comn para dejar claro que las va riables son privadas, y tambin para diferenciarlas del argumento de la funcin (el pin en este caso). Despus viene el cdigo del programa que estamos convirtiendo en una librera (por fin! ). Se ve ms o menos lo mismo, salvo Morse:: delante de los nombres de las funcion es, y en lugar de _pin pin: void Morse::punto() { digitalWrite(_pin, HIGH); delay(250); digitalWrite(_pin, LOW); delay(250); } void Morse::raya() { digitalWrite(_pin, HIGH); delay(1000); digitalWrite(_pin, LOW); delay(250); } Por ltimo, es tpico incluir un comentario en la parte superior del cdigo fuente. Va mos a ver el cdigo: /* Morse.cpp - Library for flashing Morse code. Created by David A. Mellis, November 2, 2007.

Released into the public domain. / 1. include "WProgram.h" 2. include "Morse.h" Morse::Morse(int pin) { pinMode(pin, OUTPUT); _pin = pin; } void Morse::punto() { digitalWrite(_pin, HIGH); delay(250); digitalWrite(_pin, LOW); delay(250); } void Morse::raya() { digitalWrite(_pin, HIGH); delay(1000); digitalWrite(_pin, LOW); delay(250); } Y eso es todo lo que necesita (hay algunas otras cosas opcionales, pero hablarem os de eso ms adelante). Vamos a ver cmo usar la librera. En primer lugar, hay que crear el directorio Morse dentro del subdirectorio de l ibreras . Copia o mueve los archivos Morse.h y Morse.cpp a ese directorio. Ahora ejecuta el IDE de Arduino. Si vas al men Sketch > Import Library deberas ver el un a opcin Morse. La librera ser compilada con los programas que la utilizan. Si no ap arece la librera, asegrate de que los nombres de los archivos terminan realmente t en .cpp y .h (y no en .pde o .txt, por ejemplo). Vamos a ver cmo podemos modificar nuestro programa de SOS para hacer uso de la nu eva librera: 1. include <Morse.h> Morse morse(13); void setup() { } void loop() { morse.punto(); morse.punto(); morse.punto(); morse.raya(); morse.raya(); morse.raya(); morse.punto(); morse.punto(); morse.punto(); delay(3000); } Hay algunas diferencias con el programa original (aparte del hecho de que parte del cdigo se ha trasladado a la librera). En primer lugar, hemos aadido una declaracin # include al principio del programa. Esto hace que la librera Morse est disponible para el programa y que se enve a la p laca de Arduino. Cuando ya no necesite una librera en un programa, debe eliminar la sentencia # include para ahorrar espacio. En segundo lugar, creamos una instancia de la clase Morse llamada morse: Morse morse(13); Cuando esta lnea se ejecute ( esto sucede incluso antes de que se ejecute la func in setup () ), se llamar al constructor de la clase Morse, y se le pasar un parmetro (en este caso, el valor 13). Tenga en cuenta que nuestro setup() est vaco, esto se debe a que la llamada a pinM ode () se produce dentro de la librera (cuando se construye la instancia). Por ltimo, para llamar a las funciones punto() y raya(), tenemos que precederlas del prefijo morse (que es el nombre de la instancia que hemos creado). Podramos t ener varias instancias de la clase Morse, cada una con su propio PIN almacenado en la variable privada _pin de esa instancia. Al llamar a una funcin se indica qu e instancia de la clase se debe utilizar. Es decir, si tuviramos: Morse morse (13); Morse morse2 (12); la llamada a morse2.dot (), hace que la salida sea por el pin 12. Si pruebas el nuevo programa, probablemente te dars cuenta de que el IDE de Ardui

no no reconoce las funciones de la librera y no resalta el cdigo. Por desgracia, p or ahora el software de Arduino no puede averiguar lo que hay definido en la lib rera (aunque sera una buena caracterstica a tener en cuenta), as que tienes que ayud arle un poco. Para ello, crea un archivo llamado keywords.txt en el directorio d e Morse.. Que debe tener este aspecto: Morse KEYWORD1 raya KEYWORD2 punto KEYWORD2 Cada lnea tiene el nombre de la palabra clave, seguido de un tabulador (no espaci os), seguido por el tipo de palabra clave. Las clases deben ser del tipo KEYWORD 1 y se muestran de color naranja; las funciones deben ser del tipo KEYWORD2 y se rn de color marrn. Tendr que reiniciar el entorno Arduino para conseguir que recono zca las nuevas palabras clave. Es conveniente acompaar las libreras con algn programa de ejemplo que haga uso las mismas. Para ello, cree un directorio examples dentro del directorio Morse. A co ntinuacin, copie el directorio que contiene el programa de ejemplo que escribimos arriba (lo llamaremos SOS) en el directorio de ejemplos. (Puedes encontrar el p rograma de ejemplo con la opcin Sketch > Show Sketch Folder) Si reinicias el ento rno Arduino (esta es la ltima vez, lo prometo) vers la opcin Library-Morse dentro d e File > Sketchbook > Examples que contiene su ejemplo. Es posible que quieras a gregar algunos comentarios para explicar mejor cmo usar la librera. Si quieres echa un vistazo a la librera completa (con palabras clave y el ejemplo ), puede descargarlo: Morse.zip. Eso es todo por ahora, pero probablemente voy a escribir una coleccin de tutorial es avanzados pronto. Mientras tanto, si tienes cualquier problema o sugerencia, por favor escribe en el foro de desarrollo de software.

Potrebbero piacerti anche