Aprender Arduino, prototipado y programación avanzada con 100 ejercicios. Rubén Beiroa Mosquera

Чтение книги онлайн.

Читать онлайн книгу Aprender Arduino, prototipado y programación avanzada con 100 ejercicios - Rubén Beiroa Mosquera страница 11

Серия:
Издательство:
Aprender Arduino, prototipado y programación avanzada con 100 ejercicios - Rubén Beiroa Mosquera

Скачать книгу

señal PWM con la instrucción <<Timer1.initialize()>> (lo que realmente hacemos es configurar el periodo, pero la frecuencia es la inversa de este) y, con la instrucción <<Timer1.pwm(,)>>, indicamos el pin y el periodo de trabajo de la señal. En el caso del Arduino UNO, esto funcionaría en los pines 9 y 10 image.

      •Para programar los Timers 2 y 3, necesitamos las librerías MsTimer2 y TimerThree, respectivamente.

      La libería MsTimer2 solo permite 3 acciones:

      •Configuración del tiempo para la interrupción <<MsTimer2::set()>>.

      •Activar interrupción <<MsTimer2::start()>>.

      •Desactivar interrupción <<MsTimer2::stop()>>.

      •En el siguiente caso image se usarán estas tres instrucciones para que un led parpadee 10 veces cada medio segundo.

      En cuanto a la libería TimerThree, tenemos las mismas acciones que en la librería TimerOne image:

      •Pero, según la documentación de Arduino, esta librería solo funcionaría para el caso en el que trabajemos con el Arduino Mega (http://playground.arduino.cc/Code/Timer1).

      Con esta última librería, acabamos de ver todo lo referente a las interrupciones temporales; con la utilización de interrupciones, podemos mejorar el rendimiento de nuestros programas y hacer que funcionen como si de un sistema multitarea se tratase.

image image image image image

       013

      Interrupción del puerto serie

      En el caso de utilizar, por ejemplo, la comunicación serie, tenemos algo parecido a una interrupción asociada a la recepción de datos. No es exactamente una interrupción porque, si recordamos, una interrupción detiene la ejecución normal del programa y ejecuta la función asociada a la interrupción.

      En el caso de la interrupción del puerto serie, esto no sucede; lo que realmente ocurre es que el programa comprobará, cada vez que finalice el bucle void loop, si hay datos en el buffer de entrada del puerto serie y, si es así, se ejecuta una función:

      •Existen unas funciones predefinidas para este tipo de uso, que son las funciones <<serialE-vent()>>.

      •En el caso de que un Arduino tenga varios puertos, como es el Arduino Mega, cada puerto tiene su propia «interrupción», diferenciándose por la referencia del puerto serialEvent1(), serialE-vent2()…

      •En el siguiente caso image, podemos comprobar el funcionamiento de la «interrupción» del puerto serie.

      •Esta función viene a sustituir el if (serial.available()) image, consiguiendo así simplificar el programa, pero con el inconveniente de que solo se comprueba el puerto serie al finalizar el bucle void loop().

      •Esto último podemos probarlo con dos simples casos:

      •En el primero image se introduce un delay de cinco segundos en el bucle void loop para, así, comprobar que, aunque enviemos un mensaje por el monitor serie, mientras no finalice la temporización, no se comprobará si hay datos para posteriormente devolverlos.

      •En el segundo image, programamos un bucle infinito dentro del void loop, haciendo así que nunca se llegue a finalizar este, con lo que, por muchos mensajes que enviemos, ninguno de ellos será devuelto.

      Visto todo esto, la conclusión sería que podemos programar una función para la recepción de datos por el puerto serie que nos permite liberar código del bucle principal.

      Pero, en un Arduino, no hay únicamente un tipo de comunicación; en los siguientes capítulos trabajaremos con las comunicaciones I2C y SPI y aí veremos que también tienen funciones para la recepción de datos.

      Antes de estudiar estas comunicaciones, profundizaremos en el lenguaje de programación de la comunicación serie. Son muchos los módulos que utilizan esta comunicación; para establecer una comunicación eficiente, será imprescindible un buen dominio del lenguaje de programación.

      Aunque los módulos ya adaptados para Arduino seguro que tienen sus propias librerías con las que conseguimos establecer de forma fácil una comunicación, existen muchos otros dispositivos que no tendrán una librería para Arduino y es ahí donde será necesario conocer ciertas peculiaridades de la comunicación serie.

image image image image

       014

      Comunicación serie Serial.flush, Serial.availableForWrite

      Serial.flush():

      Al usar «print», «println» o «write», la transmisión de datos se realiza de forma asíncrona. Esto quiere decir que se ejecuta la siguiente instrucción sin asegurarse de que se empiece el envío de datos.

      Esta cuestión se soluciona si, después de cualquiera de las tres instrucciones anteriores (print, println o write), escribimos <<Serial.flush()>>. Esta instrucción no devuelve nada, pero bloquea el programa hasta que el buffer de salida se haya vaciado, lo que significa que se han enviado todos los datos:

      1.Para comprobar esto, probamos a enviar un mensaje y capturar el tiempo que tarda en ejecutarse el programa.

      2.El tiempo que tardaría el programa en escribir el mensaje en el buffer de salida serían de 220 microsegundos image, pero solo se han escrito en el buffer; no se han enviado.

      3.Ahora haremos lo mismo pero añadiendo la instrucción <<Serial.flush()>>.

      4.En

Скачать книгу