Podcast: Descargar (18.0MB)

Hoy veremos la API de Arduino, el conjunto de funciones, rutinas y subrutinas que nos facilitan la programación en el entorno de Arduino. Estas se dividen en grandes bloques según su funcionalidad, entradas y salidas digitales, entradas y salidas analógicas, entradas y salidas avanzadas, tiempo, matemáticas, trigonometría, interrupciones y comunicación.
Si queréis seguir estando al día en todo lo que vamos publicando en nuestra web podéis suscribiros a la lista de distribución. Para contactar con nosotros lo podéis hacer a través del formulario de contacto y nos podéis seguir en Twitter y Facebook.
Lo primero que tenemos que tener claro antes de entrar de lleno a la API de Arduino es saber qué es una API(Application Programming Interface) o en español Interfaz de Programación de Aplicaciones. Una API es una herramienta que puede ser utilizada por otro software de manera independiente. Esta herramienta se presenta, normalmente, en forma de biblioteca y contiene un conjunto de subrutinas, funciones, procedimientos y métodos a los que podemos invocar, dotando a nuestra aplicación de funcionalidades extra. Un ejemplo claro, para que os hagáis una idea, es la API de Google Maps que nos permite acceder, personalizar y trabajar con Google Maps dentro de nuestras aplicaciones ya sean nativas o aplicaciones web. Arduino tiene su propia API que expone funciones de subrutinas ya programadas y que nos facilitarán el trabajo a la hora de desarrollar nuestro proyecto.
Ahora vamos a ir viendo las funciones principales de la API he iremos explicando como podemos utilizarlas dentro de nuestro proyecto.
Entradas y salidas digitales
- pinMode(numeropin, modo): configura un pin para que se comporte como una entrada (INPUT) o salida (OUTPUT) o una entrada con resistencia pull-up (INPUT_PULLUP). Cuando el pin está en modo INPUT, se suele denominar modo alta impedancia, permite la escucha a través de él. Para utilizar un pin en este modo hay que tener en cuenta que debemos colocar una resistencia pull-up o pull-down para evitar los falsos positivos y negativos debidos al ruido inherente a los circuitos eléctricos. En el modo OUPUT, modo baja impedancia, se aplica un voltaje dependiendo de su estado LOW (0V) y HIGH (5v). Por último el modo INPUT_PULLUP se comporta de la misma manera que el modo INPUT. La diferencia es que en este caso activa la resistencia interna pull-up que tiene la placa.
- digitalRead(numeropin): esta función lee el estado de un pin. Este valor puede ser HIGH o LOW. Dependerá del voltaje podrá coger un valor u otro. Para el rango de 0V a 1.5V el estado será LOW, para el rango 3.3V a 5V el estado será HIGH.
- digitalWrite(numeropin, valor): como su nombre indica nos permite asignar el valor HIGH o LOW al pin que le hayamos dicho. Dependiendo de como hayamos configurado ese pin con pinMode funcionará de una manera o de otra. Si hemos configurado el pin como OUTPUT asignaremos un voltaje de 5V (3.3V) para el estado HIGH y 0V para el estado LOW. Si por el contrario lo hemos configurado como INPUT al asignar un valor HIGH a la entrada estaremos habilitando la resistencia pull-up del pin y al asignar LOW dejará de funcionar dicha resistencia.
Entradas y salidas analógicas
- analogReference(tipo): esta sentencia configura la referencia de voltaje que se usa en las entradas analógicas es decir, recordamos que en las entradas analógicas solo podíamos detectar 1024 valores posibles , el valor que pongamos aquí será el valor correspondiente al 1023. Supongamos que tenemos un rango de 0V a 5V. Esto implica que la resolución que estamos aplicando es 5V / 1024 que equivale a lecturas de 0.0049V (4.9 mV). Si cambiamos la referencia y ponemos un valor menor como por ejemplo 2V la resolución cambia y ahora sería 2V / 1024 que equivale a lecturas de 0.00195V (1.95mV). Puede tomar 3 valores diferentes. DEFAULT, tomará como referencia el voltaje por defecto que será 5V o 3.3V según el voltaje al que funcione la placa. INTERNAL, es una referencia de voltaje interna de 1.1V en los microcontroladores ATmega168 o ATmega328 y de 2.56V en los ATmega8. Un ejemplo claro es cambiar la resolución con la que queremos leer una entrada analógica para centrarnos en la franja que nos interese y poder tener más resolución. EXTERNAL definida por AREF.
- analogRead(numeropin): lee el valor del pin especificado en la sentencia. Este valor irá de 0 a 1023 dependiendo del voltaje que tengamos a la entrada. Pongamos un ejemplo. Si hemos establecido el valor de referencia analógico como DEFAULT indica que tendremos un valor máximo de voltaje de 5V. Si en la entrada del pin que estamos leyendo tenemos 5V, analogRead nos devolverá 1023, el valor máximo que puede tomar.
- analogWrite(numeropin, valor): escribe un valor analógico en las salidas digitales catalogadas como PWM (3, 5, 6, 10, 11 en Arduino UNO). Recordar que este tipo de salidas se comportan como una salida analógica generando un pulso cuadrado como ya vimos en el capítulo de entradas y salidas. Su valor será entre 0 (siempre apagado) y 255 (siempre encendido).
Entradas y salidas avanzadas
- tone(): esta función genera una onda cuadrada con un ciclo de trabajo del 50%. Se utiliza para reproducir sonidos. Se ejecutará hasta que encuentre la sentencia noTone().
- noTone(): como se ha comentado ya, para la onda cuadrada generada con tone().
Tiempo
- millis(): nos dará el tiempo en milisegundos desde que el Arduino comenzó a ejecutar el programa que está cargado en la placa. Ojo con este valor ya que nos puede provocar un overflow y se reiniciará a cero. Esto ocurre pasados 50 días.
- micros(): igual que millis pero con microsegundos, mucha más precisión 1 ms = 1.000 µs. El overflow (reiniciar a cero) se produce pasado 70 minutos. La resolución dependerá del tipo de Arduino, 4 µs para procesadores de 16 MHz y y 8 µs para 8 MHz.
- delay(milisegundos): para la ejecución de un programa una cantidad de milisegundos. Por ejemplo si queremos que un led esté iluminado una cantidad de tiempo determinado.
- delayMicroseconds(microsegundos): igual que delay pero con microsegundos.
Matemáticas
- min(var1, var2): devuelve el valor máximo entre dos valores (var1 y var2).
- max(var1, var2): devuelve el valor mínimo entre dos valores (var1 y var2).
- abs(valor): devuelve el valor absoluto del valor. Por ejemplo, si pasamos a esta función 5 o -5 obtendremos el mismo valor, 5.
- constrain(valor, menor, mayor): restringe un número para estar dentro de un rango. En el ejemplo valor valdrá eso si está entre menor y mayor y valdrá menor si está por debajo de este valor y mayor si está por encima de este valor.
- map(valor, desdeBajo, desdeAlto, aBajo, aAlto): permite saber cual es el valor que tendría una variable en un nuevo rango. Los parámetros que se pasan son el valor original en el rango desdeBajo hasta desdeAlto y el nuevo rango de valores aBajo hasta aAlto. Para que quede más claro podemos verlo con un ejemplo. Imaginaros que tenemos una lectura de 525 en un pin analógico. Recordar que el rango de las entradas y salidas analógicas va desde 0 a 1023. Ahora este mismo valor lo queremos aplicar a una salida digital PWM. El rango en estas salidas va desde 0 a 255. Así que en nuestro código pondremos lo siguiente map(525,0,1023,0,255) y esto nos devolverá el nuevo valor que será 130, así de sencillo. Muy útil si queremos centrarnos en un rango menos amplio para dar más precisión a nuestros cálculos.
- pow(base, exponente): calcula el valor de un número elevado a una potencia. Se suele utilizar para elevar un número a una fracción, muy útil para generar curvas exponenciales.
- sqrt(valor): calcula la raíz cuadrada de un número (valor).
Trigonometría
- sin(ang): calcula el seno de un ángulo dado (ang) en radianes.
- cos(ang): calcula el coseno de un ángulo dado (ang) en radianes.
- tan(ang): calcula la tangente de un ángulo dado (ang) en radianes.
Interrupciones
- attachInterrupt(interrupcion, ISR, modo): con esta sentencia estamos indicando que función debemos llamar cuando se produce una interrupción por los pines que permiten dicha interrupción. Recordemos que con Arduino UNO los pines digitales 2 y 3 permiten esta funcionalidad. En el caso de este tipo de Arduinos, el parámetro interrupción tomará como valores 0 para detectar las interrupciones del pin 2 y 1 para detectar las del pin 3. ISR (Interrupt Service Routine) es el nombre de la función a la que se debe llamar y el modo nos indica en que evento se debe llamar. Hay cuatro posibles valores:
- LOW: se llama a la función ISR cuando el pin está en estado LOW.
- CHANGE: se llama a la función ISR cuando el pin cambia de valor de LOW a HIGH o de HIGH a LOW.
- RISING: se llama a la función cuando el pin cambia de estado de LOW a HIGH.
- FALLING: se llama a la función cuando el pin cambia de estado de HIGH a LOW.
- noInterrupts(): con esta sentencia estamos diciendo al Arduino que las interrupciones no están habilitadas. Por defecto Arduino las habilita así que si no queremos utilizarlas tendremos que poner esta sentencia. Para volver a habilitar las interrupciones bastará con ejecutar la función attachInterrupt(…).
Comunicación
- Serial: se usa para comunicar la placa de Arduino con un ordenador u otros dispositivos. La comunicación se hace a través del puerto serie ya que todas las placas tienen al menos un puerto de este tipo. Esta comunicación se hace a través de los pines 0 (RX) y 1 (TX) así como por el USB para comunicar con el ordenador. Veamos unos ejemplos para utilizar la comunicación Serial.
- Serial.begin(baud): con esta sentencia se inicia la comunicación serie. El parámetro baud nos dice los bits por segundo lo típico son 9600.
- Serial.availabe(): nos da el número de caracteres (bytes) disponibles para la lectura del puerto serie. Estos datos son almacenados en un buffer de 64 bytes. Su uso más común es para comprobar si tenemos datos que leer.
- Serial.read(): lee los datos del puerto serie.
- Serial.write(): escribe en el puerto serie. Con esta sentencia se escriben los datos binarios. Hay otras funciones que permiten escribir caracteres.
- Serial.print(): escribe los datos en el puerto serial en forma de caracteres legibles para un ser humano.
- Serial.prinln(): es igual que Serial.print() pero con la diferencia que escribe un retorno de carro al final de la secuencia de caracteres.
Te dejamos a continuación enlaces a los recursos de los que hablamos en el capítulo:
Recurso del día
Hoy os hablamos de un emulador de Arduino de código abierto, Emulare. Su objetivo es proporcionar una interfaz para construir simulaciones electrónicas para el desarrollo de software embebido. Permite arrastrar y soltar componentes en un diagrama y conectar los pines con cables y así poder emular de una manera más eficiente. Está centrado en la familia de microcontroladores ATMega. Es una herramienta muy útil para nuestros proyectos con Arduino.
Muchas gracias a todos por los comentarios y valoraciones que nos hacéis en iVoox, iTunes y en Spreaker, nos dan mucho ánimo para seguir con este proyecto.