Creación de un boceto para Blink de un LED

Introducción

En la Introducción al proyecto MPIDE, se utilizó un ejemplo de sketch de Blink que hacía parpadear uno de los LED (diodos emisores de luz). El LED que parpadeaba en la tarjeta Uno32 se representa en la Fig. 1. Aunque la Fig. 1 muestra un Uno32, el código que se escribió para este proyecto se puede utilizar igualmente bien con otras tarjetas chipKIT ™ como el UC32 y Max32. Una tarjeta chipKIT interactúa con el mundo exterior a través de sus conectores conocidos como pines. Para este proyecto, vamos a parpadear un LED que está vinculado a uno de estos pines. De este modo, mediante el control de si el pin conectado al LED es alto o bajo, podemos controlar si se ilumina o no el LED.

En este proyecto, el objetivo es escribir y comprender un sketch que parpadeará el mismo LED como el sketch de Blink. También se familiarizara con MPIDE. Antes de comenzar, debe tener en cuenta que las tarjetas chipKIT son dispositivos digitales. Si usted no sabe lo que distingue a los dispositivos digitales y señales digitales de los análogos, por favor lea material del siguiente link.

Parpadeo LED1

Antes de comenzar, usted debería:

  • Trabajar a través de la introducción al proyecto MPIDE.
  • Entender cómo descargar un Sketch de MPIDE a una tarjeta chipKIT.
  • Entender la diferencia entre las señales digitales y análogas.

Después de que haya terminado este tutorial, usted podrá:

  • Entender la sintaxis básica de C.
  • Entender lo que es un pin.
  • Comprender los requisitos mínimos de un sketch.
  • Estar familiarizado con algunas de las funciones comunes que se utilizan para interactuar con la tarjeta chipKIT, como pinMode () y delay ().
  • Sepa cómo #define se puede utilizar para crear constantes con nombre.
  • Sepa cómo acceder al material de referencia chipKIT.
  • Ser capaz de parpadear un LED a ritmos diferentes.

Fundamentos de Programación

El lenguaje que utiliza MPIDE se basa en el lenguaje de programación C++ (C++  o también llamado “C-plus-plus”). C++ fue desarrollado a partir del lenguaje C, que se remonta a la década de 1960. C++ subsume C, lo que significa que todo lo que puedes hacer en C, puedes hacerlo también con estamentos equivalentes en C++. Sin embargo, lo contrario no es cierto. Si usted no está familiarizado con C o C ++, debe leer algún material introductorio a este tema.

En C++, cada programa debe tener una función llamada main (). Sin embargo, a diferencia de C++, en MPIDE usted no escribe un main() porque uno ya se ha escrito para ti. De hecho, no sólo tienes uno escrito para ti, tampoco tienes acceso a él. En su lugar, debe escribir dos funciones: setup () y loop (). Cuando escribimos el nombre de una función, el nombre será seguido por un conjunto de paréntesis. Como se verá, cuando se “llama” o invoca una función en sus sketches, el nombre de la función debe ir seguido de paréntesis (que puede o no incluir algo). Así, en el texto, utilizamos paréntesis para enfatizar que estamos hablando de una función.
La función setup () se ejecuta una vez al inicio de la ejecución de su sketch (cuando el sketch primero comienza a correr). Las declaraciones en esta función se utilizan normalmente para realizar operaciones de establecimiento de “una sola vez”, como especificar qué pines se deben utilizar para la entrada o salida o especificar la velocidad de comunicación entre la tarjeta chipKIT y el computador.

Parpadeo LED2

En contraste, la función loop () se llama repetidamente. Al decir “repetidamente”, queremos decir que después de todos los estamentos en la función se han ejecutado y la función regresa, la función se llama inmediatamente de nuevo. Este ciclo se repite hasta que la tarjeta pierde poder o hasta que se reprograma. El flujo de ejecución de un sketch se ilustra en la Fig. 2. Cada caja rectangular representa una función. Después de que se han ejecutado todos los estamentos en la función setup (), el flujo de ejecución se mueve a la función loop (). Después de que se han ejecutado todos los estamentos en esta función, se ejecutan de nuevo. Como pronto verás, las funciones pueden ser “llamados” de dentro de otras funciones. Así, por ejemplo, cualquier número de funciones puede ser llamado desde dentro de la función loop () y por lo tanto estas funciones se ejecutará cada vez que loop () se ejecuta.

Sin duda, usted ha notado que ciertas palabras o trozos de código han sido subrayadas usando diferentes colores. Este resaltado se hace dentro MPIDE para ayudar a indicar la forma en que se utiliza el término en particular. Por ejemplo, el azul que se utiliza para HIGH y LOW indica que estos son “constantes” cuyos valores no se pueden cambiar. El resaltado utilizado dentro MPIDE se utiliza en todo el texto de estos proyectos también. (Aunque los detalles del resaltado son algo fuera del alcance de nuestros intereses actuales, en términos generales, el azul se utiliza para “constantes definidas”, el rojo se utiliza para las palabras clave en el lenguaje C ++, naranja se utiliza para diversas funciones, y púrpura es utilizado para “objetos” [que no se consideran en este proyecto].)

Paso 1: Escribir la función setup ()

Después de iniciar MPIDE, usted comenzará este proyecto mediante la creación de la función setup (). La función setup () no devuelve nada, por lo que su tipo de retorno es nulo. Además, la función setup () no tiene entradas, por lo que nada debe ir entre los paréntesis que siguen el nombre de la función. Por lo tanto, una plantilla para la función de configuración () en la que el cuerpo está vacía es simplemente:

voidsetup()
{ 
  // Body of function goes here.
}

Dentro de la función setup (), que va a utilizar el pinMode () para decirle a la tarjeta que desea utilizar un pin de una manera determinada. Esta función toma dos parámetros de entrada, llamados argumentos, que corresponde a un pin (hay que especificar el número de PIN) y el modo para ese pin. El modo es de entrada o salida. Cuando se ajusta a INPUT, podemos “leer” las señales del pin. A la inversa, cuando el modo está en OUTPUT, podemos “escribir”  al pin. Tenga en cuenta que la única salida que podemos escribir es high o low. Cuando escribimos uno de estos valores (utilizando una función que describiremos más adelante), que establece el estado del pin. Si escribimos HIGH, el pin se mantendrá a un voltaje “high” de 3.3V. Por otro lado, si escribimos LOW, el pin se mantiene a un voltaje “low” de 0V. Estos voltajes se mantienen hasta un valor diferente se escribe en el pin.

En las tarjetas chipKIT, uno de los LED está ligado al pin 13. Cuando el pin 13 es high, se ilumina este LED. Cuando el pin 13 es low, este LED está apagado. Queremos configurar el pin 13 para la salida, para que efectivamente pueda “escribir” al LED. Por lo tanto tenemos que tener el siguiente estamento en el cuerpo de la función setup():

pinMode(13, OUTPUT);

Dentro MPIDE, salida y entrada son constantes. Escondido de nosotros es el hecho de que tienen valores numéricos que no se pueden cambiar mientras se ejecuta el programa. En lugar de utilizar estas constantes con nombre, podríamos utilizar los valores numéricos subyacentes directamente en nuestro programa. Sin embargo, mediante el uso de estas constantes con nombre, el código es más descriptivo, es decir, más legible y auto-documentado. El uso de constantes con nombre de esta manera se considera buen estilo de programación.

Tenga en cuenta que estamos utilizando el valor numérico 13 en nuestro programa y que podría ser difícil para una persona que lee el código saber lo que este número en particular representa o significa.

La combinación del estamento pinMode () con la plantilla de la función de configuración (), la función completa es como sigue:

voidsetup()
{
  pinMode(13, OUTPUT);
}

Asegúrese de que ha introducido esta función en MPIDE como aparece aquí. Sin embargo, usted es, por supuesto, libre de agregar comentarios como mejor le parezca. Además, puesto que la cantidad de espacios en blanco que se incluye en un sketch no afecta a lo que hace en última instancia, podría incluir o excluir espacios en blanco. Sin embargo, se considera un buen estilo de programación dejar un espacio en el cuerpo de la función, como se muestra en la línea 3.

Usted puede haber notado que el sketch que estamos escribiendo es ligeramente diferente del sketch de Blink proporcionado como un ejemplo con MPIDE. El boceto ejemplo utiliza una etiqueta predefinida, es decir, una constante con nombre (PIN_LED1), para el pin asociado con el LED. Aunque no contamos con esa definición aquí, es una buena idea para que usted pueda estar familiarizado con la forma en que se nombran constantes se crean. Esto se logra con una directiva de preprocesador, específicamente una declaración #define.

Paso 2: Escribir la función loop ()

Ahora que ha terminado de escribir la función setup (), puede centrarse en la creación de la función loop () que la tarjeta ejecutará en varias ocasiones (después de la primera ejecución de la función setup () una vez). Para lograr el blink de LED, tendrá dos funciones más. La primera es digitalWrite () y el segundo es de delay (). La función digitalWrite () requiere dos argumentos. El primer argumento es el pin a la que usted está escribiendo, y el segundo argumento es el estado del pin, que es alto o bajo. Así, la llamada a la función que establece el pin 13 a HIGH debería tener este aspecto:

digitalWrite(13, HIGH);

Similarmente, al poner el pin 13 en LOW, debería tener este aspecto:

digitalWrite(13, LOW);

La función de delay () tiene un solo argumento, que especifica la cantidad de demora en milisegundos. Por “demora” nos referimos a que la tarjeta simplemente no hace nada por la cantidad de tiempo especificado. Hay mil milisegundos en un segundo. Por lo tanto, para obtener un retraso de un segundo, usted escribiría:

delay(1000);

Ahora podemos combinar estas funciones en el cuerpo de la función loop () de tal manera que el LED conectado al pin 13 parpadee a un intervalo de dos segundos (es decir, que está encendido un segundo, y luego se apaga durante un segundo):

voidloop()
{
  digitalWrite(13, HIGH); // Turn on the LED.
  delay(1000);            // LED remains on for 1 second.
  digitalWrite(13, LOW);  // Turn off the LED.
  delay(1000);            // LED remains off for 1 second.
}

Paso 3: Poner todo junto

En este punto tenemos todo el código necesario para obtener un LED parpadeante. El siguiente es el sketch completo que ya está listo para ser subido a su tarjeta chipKIT:

Parpadeo LED3