Taller de Arduino. Experimentando con Arduino MKR 1010

- -
- 100%
- +
Arduino MKRFOX1200 es una potente placa que combina la funcionalidad del Arduino Zero y la conectividad de Sigfox. Es la solución ideal para crear dispositivos de IoT de forma fácil y sencilla. La placa incluye 2 años de suscripción gratuita a Sigfox (con un máximo de 140 mensajes al día) y acceso gratuito a Spot’it, un servicio de geolocalización para ubicar la placa sin GPS extra. El Arduino MKRFOX1200 se ha diseñado para ofrecer una solución eficiente y de bajo coste para realizar proyectos con la conectividad Sigfox. Se basa en un potente microcontrolador Atmel SAMD21 y un módulo Sigfox ATA8520. Se puede alimentar con 2 pilas AA de 1.5 V, con baterías AAA o con una alimentación externa de 5 V. A diferencia de otras placas Arduino y Genuino, el MKRFOX1200 funciona con 3.3 V. El máximo voltaje aplicable a los pines I/O es de 3.3 V. Si se aplican voltajes superiores a 3.3 V a cualquiera de los pines se puede dañar la placa y anular la garantía. El plan de datos de Sigfox incluido se activa automáticamente al enviar el cuarto mensaje en la red. Se pueden enviar hasta 140 mensajes por día durante un año. La placa necesita una antena GSM 868 MHz (no incluida por defecto) para poder funcionar correctamente. Se recomienda un modelo que incluya el conector UFL.
Características de Arduino MKRFOX1200
* Microcontrolador: SAMD21 Cortex-M0+ 32bit low power ARM MCU
* Alimentación (USB/VIN): 5 V
* Baterías soportadas: 2× AA o AAA
* Voltaje de operación: 3.3 V
* Pines digitales I/O: 8
* Pines PWM: 12 (0, 1, 2, 3, 4, 5, 6, 7, 8, 10, A3 o 18 -, A4 o 19)
* UART 1
* SPI 1
* I2C 1
* Entradas analógicas: 7 (ADC 8/10/12 bits)
* Salidas analógicas: 1 (DAC 10 bits)
* Interrupciones externas: 8 (0, 1, 4, 5, 6, 7, 8, A1 o 16, A2 o 17)
* Corriente DC por pin: 7 mA
* Memoria Flash: 256 kB
* Memoria SRAM: 32 kB
* No dispone de EEPROM
* Reloj RTC: 32.768 kHz (RTC), Micro: 48 MHz
* LED_BUILTIN 6
* Full-Speed USB Device and embedded Host
* LED_BUILTIN 6
* Antenna: 2 dB
* Frecuencia: 868 MHz
* Apto para Europa (Consultar cobertura actual en página de Sigfox)
* Largo: 67.64 mm
* Ancho: 25 mm
* Peso: 32 g
El pineado completo se muestra en la figura 1.25.

Arduino MKR1300 WIFI
MKR WAN 1300 es una placa potente que combina la funcionalidad de la conectividad MKR ZERO y LoRa/LoRaWAN TM. Es la solución ideal para los fabricantes que desean diseñar proyectos de IoT con una experiencia previa mínima en redes que tengan un dispositivo de bajo consumo.
Arduino MKR WAN 1300 ha sido diseñado para ofrecer una solución práctica y rentable para los fabricantes que buscan agregar conectividad LoRa a sus proyectos con una experiencia previa mínima en redes. Se basa en el Atmel SAMD21 y un módulo Murata CMWX1ZZABZ LoRa (figura 1.26).

El diseño incluye la capacidad de alimentar la placa con dos baterías AA o AAA de 1.5 V o 5 V externos. El cambio de una fuente a otra se hace automáticamente. Una buena potencia de cómputo de 32 bits similar a la placa MKR ZERO, el rico conjunto habitual de interfaces de E/S, comunicación LoRa de baja potencia y la facilidad de uso del software Arduino (IDE) para el desarrollo y la programación de códigos. Todas estas características hacen de esta placa la opción preferida para los proyectos emergentes impulsados por batería de IoT en un factor de forma compacta. El puerto USB se puede utilizar para suministrar alimentación (5 V) a la placa. Arduino MKR WAN 1300 puede funcionar con o sin las baterías conectadas y tiene un consumo de energía limitado.
Características de Arduino MKR WAN 1300
MicrocontroladorSAMD21 Cortex-M0 + MCU de bajo consumo de 32 bitsMódulo de radioCMWX1ZZABZ (hoja de datos)Fuente de alimentación de la placa (USB/VIN)5 VBaterías compatibles (*)2 × AA o AAAVoltaje de funcionamiento del circuito3.3 VPernos digitales de E/S8PWM pines12 (0, 1, 2, 3, 4, 5, 6, 7, 8, 10, A3 - o 18 -, A4 - o 19)UART1SPI1I2C1Clavijas de entrada analógica7 (ADC 8/10/12 bits)Pernos de salida analógica1 (DAC 10 bits)Interrupciones externas8 (0, 1, 4, 5, 6, 7, 8, A1 -o 16-, A2 - o 17)Corriente DC por pin de E/S7 mAMemoria flash256 kBSRAM32 kBEEPROMnoVelocidad de reloj32.768 kHz (RTC), 48 MHzLED_BUILTIN6Dispositivo USB de velocidad completa y host integradoPoder de la antena2 dBFrecuencia de carga433/868/915 MHzRegión de trabajoEU/USLongitud67.64 mmAnchura25 mmPeso32 gArduino MKR GSM 1400
Arduino MKR GSM 1400: conectividad global 3G GSM con el potente módulo ATSAMD21 de Microchip ATSAMD21 y u-blox SARA-U201. El consumo de energía ultra bajo y el elemento criptográfico seguro combinados con el módulo SARA-U201 lo hacen ideal para la conexión de automóviles, transporte y ciudades inteligentes.

Arduino MKR GSM 1400 (figura 1.27) se ha diseñado para ofrecer una solución práctica y rentable para los fabricantes que buscan agregar conectividad GSM global a sus proyectos con una experiencia previa mínima en redes. Se basa en el Atmel SAMD21 y un módulo GSM SARA-U201. El diseño incluye la capacidad de alimentar la placa con una batería Li-Po o una fuente de alimentación externa de 5 V. El cambio de una fuente a otra se hace automáticamente. Una buena potencia de cómputo de 32 bits similar a la placa Zero, el amplio conjunto habitual de interfaces de E/S, la comunicación GSM global y la facilidad de uso del software Arduino (IDE) para el desarrollo y la programación de códigos. Todas estas características hacen de esta placa la opción preferida para los proyectos emergentes impulsados por batería de IoT en un factor de forma compacta. El puerto USB se puede utilizar para suministrar alimentación (5 V) a la placa.
Características de Arduino MKR GSM 1400
MicrocontroladorSAMD21 Cortex-M0 + MCU de bajo consumo de 32 bitsFuente de alimentación de la placa (USB/VIN)5 VBatería soportada (*)3.7 V Li-PoVoltaje de funcionamiento del circuito3.3 VPernos digitales de E/S8PWM pines12 (0, 1, 2, 3, 4, 5, 6, 7, 8, 10, A3 - o 18 -, A4 - o 19)UART1SPI1I2C1Clavijas de entrada analógica7 (ADC 8/10/12 bits)Pernos de salida analógica1 (DAC 10 bits)Interrupciones externas8 (0, 1, 4, 5, 6, 7, 8, A1 -o 16-, A2 - o 17)Corriente DC por pin de E/S7 mAMemoria flash256 kBSRAM32 kBEEPROMNoVelocidad de reloj32.768 kHz (RTC), 48 MHzLED_BUILTIN6Dispositivo USB de velocidad completa y host integradoPoder de la antena2 dBFrecuencia de cargaGSM 850 MHz, E-GSM 1900 MHz, DCS 1800 MHz, PCS 1900 MHzRegión de trabajoGlobalLongitud67.64 mmAnchura25 mmPeso32 gTamaño de SIMMicroArduino MKR ZERO
El MKR ZERO tiene un conector SD incorporado con interfaces SPI dedicadas (SPI1) que le permite jugar con archivos de audio sin hardware adicional e incluye dos bibliotecas para su utilización:
* Biblioteca de sonidos de Arduino : una forma sencilla de reproducir y analizar datos de audio utilizando Arduino en tableros basados en SAM D21.
* Biblioteca I2S : para usar el protocolo I2S en placas basadas en SAMD21. I2S (Inter-IC Sound) es un estándar de interfaz de bus serie eléctrico para conectar dispositivos de audio digital.
El MKR ZERO le ofrece la potencia de un Cero en el formato más pequeño establecido por el factor de forma MKR. La placa MKR ZERO actúa como una gran herramienta educativa para aprender sobre el desarrollo de aplicaciones de 32 bits. Tiene un conector SD incorporado con interfaces SPI dedicadas (SPI1) que permite jugar con archivos de audio sin hardware adicional. La placa está alimentada por la MCU SAMD21 de Atmel, que cuenta con un núcleo ARM Cortex® M0 + de 32 bits (figura1.28).

Características del Arduino MKR ZERO
MicrocontroladorSAMD21 Cortex-M0 + MCU de bajo consumo de 32 bitsFuente de alimentación de la placa (USB/VIN)5 VBatería soportada (*)Li-Po de una celda, 3.7 V, 700 mAh mínimoCorriente DC para 3.3 V pin600 mACorriente DC para 5 V pin600 mAVoltaje de funcionamiento del circuito3.3 VPernos digitales de E/S22PWM pines12 (0, 1, 2, 3, 4, 5, 6, 7, 8, 10, A3 - o 18 -, A4 - o 19)UART1SPI1I2C1Clavijas de entrada analógica7 (ADC 8/10/12 bits)Pernos de salida analógica1 (DAC 10 bits)Interrupciones externas8 (0, 1, 4, 5, 6, 7, 8, A1 -o 16-, A2 - o 17)Corriente DC por pin de E/S7 mAMemoria flash256 kBMemoria Flash para Bootloader8 kBSRAM32 kBEEPROMnoVelocidad de reloj32.768 kHz (RTC), 48 MHzLED_BUILTIN32Dispositivo USB de velocidad completa y host integradoCAPÍTULO 2
El lenguaje de programación de Arduino
En este segundo capítulo se abordará la tarea de comprender los aspectos básicos del lenguaje de programación de Arduino y se entrará detalladamente en el funcionamiento de las instrucciones básicas para programarlo. En esta sección aprenderá a elaborar secuencias de órdenes para enviar a Arduino MKR y que actúe como usted le ordene. A este tipo de acción se le llama “programar”.
2.1 Introducción al concepto de programación
Buscando una similitud o parecido entre Arduino y el ordenador; programar es el proceso de diseñar, escribir, probar, depurar y mantener el código fuente de programas. El código fuente se escribe en un lenguaje de programación. El propósito de la programación es crear programas que presenten un comportamiento deseado. Para crear un programa que el ordenador o Arduino interpreten y ejecuten las instrucciones escritas para ellos debe usarse un lenguaje de programación. En sus inicios, los ordenadores interpretaban solo instrucciones en un lenguaje específico del más bajo nivel, conocido como código máquina, siendo excesivamente complicado para programar. De hecho, consiste en cadenas de números 1 y 0 (sistema binario). Para facilitar el trabajo de programación, los primeros técnicos que trabajaban en esa área decidieron reemplazar las instrucciones, secuencias de unos y ceros, por palabras o letras provenientes del inglés, codificándolas y creando un lenguaje de mayor nivel que se conoce como Assembly o lenguaje ensamblador. Por ejemplo: para sumar se usa la letra A de la palabra inglesa add (sumar). En realidad, escribir en lenguaje ensamblador es básicamente lo mismo que hacerlo en lenguaje máquina, pero las letras y palabras son bastante más fáciles de recordar y entender que secuencias de números binarios.
A medida que creció la complejidad de las tareas que realizaban los ordenadores, se hizo necesario disponer de un método sencillo para programar. Entonces, se crearon los lenguajes de alto nivel. Mientras que una tarea tan trivial como multiplicar dos números puede necesitar un conjunto de instrucciones en lenguaje ensamblador, en un lenguaje de alto nivel bastará con solo una.
Un lenguaje de programación es un idioma artificial diseñado para expresar operaciones que pueden ser llevadas a cabo por máquinas como los ordenadores o, como en este caso, Arduino MKR. Puede usarse para crear programas que controlen el comportamiento físico y lógico de una máquina, para expresar algoritmos con precisión, o como modo de comunicación humana. Está formado por un conjunto de símbolos y reglas sintácticas y semánticas que definen su estructura y el significado de sus elementos y expresiones. Al proceso por el cual se escribe, se prueba, se depura, se compila y se mantiene el código fuente de un programa informático se le denomina programación.
El lenguaje de máquina es el sistema de códigos directamente interpretable por un circuito microprogramable, como el microprocesador de un ordenador o el microcontrolador que lleva dentro Arduino MKR. Este lenguaje está compuesto por un conjunto de instrucciones que determinan acciones que serán tomadas por la máquina. Estas instrucciones normalmente se ejecutan en secuencia, con eventuales cambios de flujo causados por el propio programa o eventos externos. El lenguaje máquina trabaja con dos niveles de voltaje. Dichos niveles se simbolizan con el cero (0) y el uno (1), por eso el lenguaje de máquina solo utiliza dichos signos. En cambio, el lenguaje ensamblador es un lenguaje de programación de bajo nivel para los ordenadores, microcontroladores y otros circuitos integrados programables. Implementa una representación simbólica de los códigos de máquina. Esta representación es usualmente definida por el fabricante de hardware. Está basada en códigos mnemotécnicos que simbolizan los pasos de procesamiento (las instrucciones). Un lenguaje ensamblador es, por lo tanto, específico a cierta arquitectura de ordenador física (o virtual). Esto está en contraste con la mayoría de los lenguajes de programación de alto nivel que idealmente son portables. En la cúspide de esta pirámide reina los lenguajes de programación de alto nivel que se caracterizan por expresar los algoritmos de una manera muy cercana al lenguaje humano. Para los lenguajes de alto nivel se requiere de ciertos conocimientos de programación necesarios para escribir las secuencias de instrucciones lógicas. Los lenguajes de alto nivel se crearon para que el usuario común pudiese solucionar un problema de procesamiento de datos de una manera más fácil y rápida.
Cuando se disponga a realizar un programa en lenguaje de alto nivel como C, lo primero que tendrá que hacer es diseñar un algoritmo gráfico de la tarea que vaya a emprender. Por ejemplo, si retoma el primer programa o práctica de parpadeo de un led que se explicó en el capítulo anterior, podría dibujar un algoritmo parecido al que se muestra en la figura 2.1. Está representando una secuencia de pasos que deberá ejecutar más tarde MKR. En primer lugar, aparece un bloque llamado Cabecera que contendrá todos los comentarios relativos al propósito del programa, autor, fecha, lugar donde se ideó, etc. Después dispone de un bloque que hace referencia a la configuración de Arduino, es decir, en este caso definir que la patilla 6 de la placa se comporte como salida, ya que a esta va conectada el led. Después ha de entrar en varios bloques que realizan las tareas de encender un led, esperar un tiempo, apagarlo, esperar otro tiempo y volver al principio, es decir, encenderlo de nuevo.
De una forma visual se representa lo que desea hacer. De esta manera sencilla es posible corregir o depurar cómodamente los pasos de su proyecto.
Además, cualquiera que le eche un vistazo al gráfico se dará cuenta rápidamente de lo que intenta hacer.
Más adelante se traducirán estas acciones escritas dentro de los bloques en instrucciones o sentencias del lenguaje de programación de Arduino MKR. Al principio, lo importante es tener claros los pasos que debe seguir. No es cuestión de escribir código de programación sin tener un objetivo en mente. Se trata de programar, pero con un lenguaje muy cercano a su forma natural de entender las cosas.
En todo caso, programará en un lenguaje de ultra alto nivel. Es de vital importancia construir este tipo de bocetos, esquemas, gráficos, organigramas o como desee llamarlo, siempre que aborde un proyecto nuevo con Arduino.
A continuación, se describe cómo traducir todo esto al lenguaje propio de Arduino. Pero antes, hay que examinar la estructura básica de que consta un programa en Arduino y los elementos con los que jugar.

2.2 Cuerpo de un programa en Arduino
Un programa diseñado para ejecutarse en Arduino se conoce como sketch, que podríamos traducir como “boceto” o “borrador”. Un sketch siempre tiene la misma estructura general y consta de dos estructuras: setup() y loop(). Estas constituyen el cuerpo general e imprescindible de un programa. Esto quiere decir, ni más ni menos que cuando cree un programa o sketch nuevo desde el IDE de Arduino, nos van a aparecer siempre, y por defecto, estas dos estructuras en nuestra plantilla vacía.
2.2.1 Estructuras
En primer lugar, tenemos la estructura setup(). Lo que se escriba entre las llaves que acompañan a su nombre se ejecuta una única vez siempre que se encienda o resetee la placa. El bloque o estructura setup() contendrá toda la configuración hardware de Arduino, es decir, cómo quiere que funcionen determinados pines de MKR como entrada o como salida. A medida que conozca sus posibilidades aumentará el tamaño de la configuración de este bloque.
En segundo lugar, todo programa en Arduino tiene que poseer también la estructura loop(). Todo lo que se escriba dentro de las llaves que acompañan a su nombre, se ejecutará constantemente hasta que se apague o resetee la máquina. El bloque o estructura loop() incluirá su programa propiamente dicho y este se ejecutará ininterrumpidamente y en bucle.
En resumen, la primera estructura engloba la propia configuración hardware de Arduino y la segunda estructura define su propio programa o las acciones que desea realizar continuamente:

Por otra parte, Arduino se programa en el lenguaje de alto nivel C/C++. Generalmente, posee los siguientes componentes para elaborar el sketch o programa:
* Variables
* Operadores matemáticos, lógicos y booleanos
* Estructuras de control (condicionales y ciclos)
* Funciones
A continuación, se describen someramente los elementos que componen un programa típico en Arduino. No es mi intención aburrirles con una larga, teórica y tediosa exposición de toda la sintaxis y referencia del lenguaje de programación de Arduino. El planteamiento que le propongo es conocer lo mínimo para empezar a programar y, a medida que lo necesite, abordar cada uno de los nuevos tipos de variables, operadores, funciones o características nuevas de este lenguaje. Creo que es la mejor manera de aprender, sin que programar se vuelva una tarea demasiado ardua y memorística. Es el método que habitualmente empleo en mis clases de electrónica. Los nuevos componentes electrónicos aparecen a medida que se plantean nuevos proyectos, retos o ideas. La idea principal es: “Si no lo necesito para qué voy a conocerlo”. Si no fuera por este método estoy seguro de que la mitad de mis alumnos hubieran abandonado al mes de empezar el curso. De hecho, una de las ventajas de aprender a programar Arduino es que se conoce un lenguaje de alto nivel como es C/ C++, que servirá, sin duda, si decide abordar en un futuro otras plataformas hardware. Un amigo que estudió la carrera de ingeniería informática se quejaba siempre que, en primero, cuando recibía clases de Pascal (otro lenguaje de programación de alto nivel) los resultados de la ejecución de sus programas solo los veía en la pantalla del ordenador. Usted tiene la ventaja de que, al trabajar con hardware y software a la vez, puede observar los resultados malos o buenos sobre un diseño real en Arduino con leds, motores, sensores, etc., lo que lo convierte en adictivo y lúdico.
2.2.2 Variables
Una variable es una manera de nombrar y almacenar un valor numérico para su uso posterior en el programa. Como su nombre indica, las variables son números o caracteres que se pueden variar continuamente en contra de lo que ocurre con las constantes, cuyo valor nunca cambia. Todas las variables tienen que declararse antes de que puedan utilizarse. Para declarar una variable se comienza por definir su tipo, asignándoles siempre un nombre y, opcionalmente, un valor inicial. Esto solo debe hacerse una vez en un programa, pero su valor se puede cambiar en cualquier momento. Una variable puede ser declarada en cualquier lugar del programa y, en función de donde se lleve a cabo su definición, se determinará en qué partes del programa se podrá hacer uso de ella.
Una variable puede ser declarada al inicio del programa, a nivel local dentro de las funciones y a veces dentro de un bloque. En función del lugar de declaración de la variable así se determinará su ámbito de aplicación y la capacidad de ciertas partes de un programa para hacer uso de ella. Una variable global es aquella que puede ser vista y utilizada por cualquier función y sentencia de un programa. Esta variable se declara al comienzo del programa, antes de la estructura setup(). Una variable local es aquella que se define dentro de una función o como parte de un bucle. Solo es visible y solo puede utilizarse dentro de la función en la que se declaró. El ámbito de utilización de las variables se entenderá mejor cuando conozca un poco mejor los fundamentos de la programación.
Existen diferentes tipos de variables en concordancia con el tipo de dato que almacenen. Las variables que utilizará más a menudo en sus programas son:
* Tipo entero: int
* Tipo carácter: char
* Tipo booleano: Boolean
El tipo entero denominado “int” almacena valores numéricos de 16 bits sin decimales comprendidos en el rango 32,767 a -32,768. La siguiente sentencia define una variable de tipo entero con el nombre Ventrada. Además, le asigna un valor inicial y numérico de 200.
int Ventrada = 200; // declara una variable de tipo entero.
El tipo carácter llamado “char” de un tamaño de 1 byte que almacena valores tipo carácter. Es decir, que solo puede contener un carácter tipo ASCII. La siguiente sentencia define una variable de tipo carácter con el nombre Ventrada y, además, le asigna un valor inicial con la letra ´a´.
char Ventrada = ’a’; // declara una variable de tipo carácter.
El tipo booleano (Boolean) solo puede contener dos valores: TRUE (verdadero) o FALSE (falso). De esta manera, cada una de estas condiciones ocupa 1 byte de memoria. La siguiente sentencia define una variable de tipo booleano con el nombre Ventrada y, además, le asigna un valor inicial verdadero o TRUE.
boolean Ventrada = true; // declara una variable de tipo booleano.
En cuanto al tipo matriz (array), a diferencia del tipo de variables vistas anteriormente que solo podían almacenar un valor único a la vez, los arrays son un caso especial de variables que pueden almacenar un conjunto de valores, y modificar solo uno, o algunos, o incluso todos los valores contenidos en el mismo en cualquier momento y según nuestra conveniencia. También sería posible evitar el uso de arrays y en vez de ello crear “muchas” variables con distintos nombres. Sin embargo, esto no resultará cómodo de utilizar. La traducción de array es literalmente “colección”, ya que se utiliza para “juntar” varios objetos de un mismo tipo. En otras materias, como matemáticas, se conoce con el nombre de matriz y, generalmente, se usan las de 2 dimensiones, por su facilidad para representarlas en un plano, ya que tienen ancho y alto. Cada elemento de la matriz se identifica por un par de números que indican la fila y la columna en que se ubica el elemento. También podría tener una matriz de 3 dimensiones (cubo). En ese caso, cada elemento de la matriz se identificará con 3 valores ordenados (que indicarán la posición relativa del elemento dentro de la matriz), por ejemplo: el elemento A(1,8,76) habría que encontrarlo dentro de la matriz A, en la fila 1, columna 8, “nivel” o “capa” 76.



