arduinoblocks - Free Book
Free Book
Juan José López Almendros
Colaborador oficial:
https://shop.innovadidactic.com/es/
Distribuidor oficial de componentes:
1.2 Plataforma arduinoblocks
2.1 Conceptos básicos de electrónica
2.4 Arduino: Leonardo y ProMicro
3.3.4.1 Bluetooth HID (ESP32 / ESP32 STEAMakers)
3.3.7 Pantalla LCD (4-Bits)
3.3.13 Reloj de tiempo real (RTC DS3231)
3.3.24 Conectividad ESP8266 / ESP32 / ESP32 STEAMakers
ANEXO I: Bloques incompatibles con bloqueos de tiempo.
ANEXO II: Arduino UNO R3 pinout
ANEXO III: Enlaces de interés y bibliografía:
La plataforma arduinoblocks permite iniciarnos en el mundo de la electrónica, robótica y el mundo “maker” de una forma sencilla e intuitiva.
La motivación de desarrollar la plataforma arduinoblocks y escribir este libro nace de mi trabajo como docente con alumnos de entre 12 y 18 años, sin previos conocimientos de programación, que quieren adentrarse en el mundo Arduino partiendo de una nociones básicas de electricidad y electrónica.
arduinoblocks es la herramienta perfecta para niños, jóvenes y no tan jóvenes que quieren iniciarse en el mundo Arduino de una forma divertida e intuitiva.
Aprender a programar con bloques, aunque parece un juego, es una forma totalmente válida de obtener los conceptos básicos de programación que posteriormente se podrán aplicar a cualquier otro lenguaje de programación, ya sea visual o escrito. Programando con bloques nos olvidamos principalmente de los fallos de sintaxis pero tenemos que aprender de igual forma conceptos básicos como secuenciación, bucles, variables, condiciones, funciones, etc. Desarrollamos la capacidad de abstracción de un problema para convertirlo en una secuencia de comandos, o bloques, que resolverán el problema, es decir, aprenderemos a pensar como un programador.
Por experiencia, creo que el aprendizaje con un sistema visual suele ser menos estresante y permite obtener resultados mucho más rápido, obteniendo una experiencia mucho menos fustrante para el programador novel. Y en muchos casos, se utiliza esta iniciación como trampolín para dar el salto a una programación avanzada mediante código escrito obteniendo muchas más éxito.
Arduino es un proyecto de hardware libre que ideó una plataforma completa de hardware y software compuesta por placas de desarrollo que integran un microcontrolador y un entorno de desarrollo IDE. La idea surgió para facilitar el uso de la electrónica en proyectos multidisciplinarios.
El hardware consiste en una placa de circuito impreso con un microcontrolador, normalmente Atmel AVR, y puertos digitales/analógicos de entrada/salida donde conectar sensores y/o actuadores.
La primera placa Arduino fue introducida en 2005, ofreciendo un bajo costo y facilidad para uso de novatos y profesionales.
Puedes consultar más información sobre la historia y el entorno Arduino en wikipedia:
https://es.wikipedia.org/wiki/Arduino
Arduino 2006 | Arduino 2016 |
Existen múltiples placas Arduino con diferentes características y distintos microcontroladores.
El más utilizado y estándar es el Arduino UNO, sin embargo en algunos casos podemos necesitar otra placa Arduino para adaptarnos al tipo de proyecto a realizar.
https://www.arduino.cc/en/Main/Boards
Algunas de las placas Arduino más utilizadas:
Arduino UNO Es el modelo más estándar y el más utilizado. | |
Arduino MEGA Mayor potencia, más recursos hardware y más memoria | |
Arduino Nano Similar potencia que el Arduino UNO pero de menor tamaño | |
NodeMCU Placa basada en el microcontrolador ESP8266 programable en entorno Arduino | |
ESP32 STEAMakers Placa basada en el microcontrolador ESP32 Wifi, Bluetooth, microSD, sensores integrados, conexión modular, etc. |
Dentro de nuestros proyectos, la placa Arduino será el “cerebro” que gestiona toda la información recogida desde los sensores, toma decisiones y actúa sobre los elementos de control conectados.
Según las necesidades del proyecto deberemos elegir la placa Arduino más apropiada. arduinoblocks soporta multitud de placas y robots basados en Arduino: Arduino UNO, Nano y MEGA, Leonardo, ProMicro, EasyPlug, Otto DIY, KeyBot, 3dBot,...
Por otro lado el “framework Arduino” se ha adaptado a otros microcontroladores de bajo costo y muy potentes como esl el caso del “ESP8266”, en concreto podremos programas las placas de desarrollo basadas en este chip: NodeMCU y WeMos D1 / mini..
Una de las características de Arduino, es su “bootloader” que permite grabar el programa dentro del microcontrolador directamente desde la conexión USB del ordenador.
El tamaño de memoria Flash para el programa de un Arduino UNO es de 32KB de los cuales debemos restar el tamaño del “bootloader” pregrabado (0.5KB en Arduino UNO y 2KB en Arduino NANO)
arduinoblocks es una plataforma donde podemos programar nuestra placa Arduino de forma visual sin necesidad de conocer el lenguaje C++/Processing que utiliza Arduino IDE.
arduinoblocks se basa en el framework Blockly de Google y la programación se realiza con bloques al estilo AppInventor o Scratch. No tenemos que escribir líneas de código y no nos permitirá unir bloques incompatibles evitando así posibles errores de sintaxis.
La plataforma arduinoblocks genera, compila y sube el programa a la placa Arduino por medio de la conexión USB. Una vez subido el programa, la placa Arduino no necesitará de la conexión al PC para funcionar pudiendo alimentarla con baterías o una fuente de alimentación para que funcione de forma autónoma.
arduinoblocks actualmente funciona con todos los navegadores de última generación: Mozilla Firefox, Google Chrome, Opera, Safari, etc. (recomandado Firefox y Chrome)
Registrándonos como usuarios de la plataforma arduinoblocks podemos aprovechar todas estas posibilidades:
En el formulario de registro debemos completar nuestros datos, y usar un correo electrónico válido donde recibirremos un correo de confirmación para activar la
A continuación revisa tu bandeja de entrada del correo electrónico y recibirás un correo con un enlace para confirmar y activar tu cuenta de usuario. A partir de ese momento puede iniciar sesión y crear tus proyectos dentro de tu cuenta de arduinoblocks.
Si eres profesor y quieres crear cuentas para tus alumnos o centro educativo sin utilizar el correo electrónico de los alumnos, puedes crear “cuentas gestionadas”.
Lo primero que debemos hacer es crar una organización. Puede ser el nombre de nuestro centro, academia, etc.
Podemos añadir a otros profesores a partir de su cuenta (con el correo electrónico) para que sean colaboradores dentro de la organización y también puedan gestionar alumnos.
Cada usuario gestionado tendrá un nombre y para iniciar sesión el nombre de usuario será:
nombre.organización
Los usuarios administradores de la organización podrán:
-Crear nuevos usuarios, editar y eliminar usuarios gestionados
-Cambiar la clave de los usuarios (no pueden ver la actual, pero sí cambiarla)
-Crear proyectos como profesor para estos alumnos
-Eliminar la organización y todos los usuarios
Los usuarios gestionados dentro de la organización podrán:
-Crear proyectos personales (sin archivos adjuntos)
-Unirse a proyectos de profesor, siempre que el profesor sea administrador de la organización.
-Cambiar su propia clave
-Exportar un proyecto a archivo (si tienen una cuenta de usuario normal, de esta forma pueden exportar e importar proyectos entre cuentas)
En caso de un proyecto personal o como profesor debemos seleccionar en el siguiente paso la placa Arduino a utilizar:
Se debe indicar un nombre descriptivo corto y una descripción más detallada.
En la sección componentes podemos indicar los componentes utilizados en el proyecto:
Las principales secciones del área de programación son:
Herramientas: | Área de programa: | Opciones: |
Bloque de inicialización Bloque de bucle del programa principal | Subir el programa a la placa Arduino conectada: Mostrar la consola serie: Puerto de conexión de la placa Arduino: |
Para añadir bloques al programa arrastramos desde la barra de herramientas al área de programa, insertando dentro del bloque de inicialización o de bucle.
Los bloques que estén fuera del bloque de inicialización o del bloque del bucle del programa principal serán ignorados a la hora de generar el programa (excepto los bloques de funciones o bloques especiales como interrupciones y otros eventos).
arduinoblocks genera el código de Arduino a partir de los bloques. El programa se puede compilar y subir directamente a la placa Arduino gracias a la aplicación arduinoblocks-Connector (disponible para descargar desde la web), sin embargo si deseamos ver o descargar el código podemos realizarlo desde el área de bloques.
Código generado por arduinoblocks | Código en Arduino IDE |
Si descargamos o copiamos el código generado por arduinoblocks en Arduino IDE podemos necesitar algunas librerías no incluidas con Arduino IDE. Para ello debemos descargarla y añadirlas a la plataforma Arduino IDE para una correcta compilación del programa, o utilizar la opción descargar .zip para Arduino IDE lo que nos facilitará un archivo comprimido con el código de nuestro programa y todas las librerías necesarias incluidas en la misma carpeta.
http://www.arduinoblocks.com/web/help/libraries
La opción más rápida y sencilla es la compilación y programación directa desde el propio navegador junto a la aplicación arduinoblocks-Connector:
http://www.arduinobocks.com/web/site/abconnector
Señalando la opción “público” podemos hacer que nuestro proyecto esté disponible públicamente para que otros usuarios busquen nuestro proyecto (sin poder editarlo) y pueden importar una copia a su propia cuenta.
Ejemplo: enlace público para compartir nuestro proyecto:
Al indicar nuestro proyecto como “público” aparecerá en la lista búsqueda de proyectos compartidos para todos los usuarios de arduinoblocks.
Tipos de proyectos entre los que se puede cambiar de placa:
I
IMPORTANTE: El cambio es irreversible en muchos casos,
por lo que se aconseja hacer una copia del proyecto antes del cambio.
|
Cualquier bloque que no esté dentro del bloque de inicialización o de bucle y no forme parte de una función (ver apartado 3.2.6) será ignorado a la hora de generar el código.
Ejemplo: Al iniciar se establece la variable a 0. Se envía y se incrementa cada segundo indefinidamente:
Ejemplo: Al iniciar (o reset) se envía un mensaje por el puerto serie. El led conectado al pin 13 se ilumina, espera 500ms, se apaga y espera otros 500ms (este ciclo ser repetirá indefinidamente).
Importante: El “bootloader” de Arduino normalmente tiene configurada la opción de resetear el microcontrolador cuando se inicia una conexión serie, por tanto si conectamos con la consola serie del PC hay que tener en cuenta que se reiniciará el programa y se ejecutará el bloque “inicializar
La configuración se realiza arrastrando los modificadores del bloque de la parte izquierda a la parte derecha:
En las mejoras del editor (noviembre 2021) algunos bloques permiten la configuración más sencilla con simples botones de + y -
https://shop.innovadidactic.com
Restaurar escala y centrar. | |
Ampliar o reducir escala (zoom). | |
Arrastrando bloques sobre la papelera podemos eliminarlos fácilmente. | |
Ajustar el zoom para visualizar todos los bloques | |
Captura de pantalla de los bloques (exportar en formato PNG) |
Filtro para buscar por tipos de proyectos:
arduinoblocks-Connector es una aplicación nativa que hace de puente entre la plataforma on-line arduinoblocks y el hardware Arduino.
La aplicación arduinoblocks-Connector se encarga de recibir el código generado por arduinoblocks, compilarlo y subirlo a la placa Arduino, sin esta aplicación arduinoblocks funciona pero no puede subir el programa a la placa Arduino pues el navegador web no dispone de posibilidad de realizar estas funciones por sí sólo.
arduinoblocks-Connector está disponible para los principales sistemas operativos. Accede al área de descargas de arduinoblocks.com para obtener la última versión y más información sobre el proceso de instalación y configuración.
http://www.arduinoblocks.com/web/site/abconnector
Windows, Linux (debian/ubuntu), macOS, RaspberryPi, ChromeOS
Ejemplo: ventana de la aplicación arduinoblocks-Connector en Windows y en Linux
arduinoblocks-Connector ejecutándose bajo Windows |
arduinoblocks-Connector debe ejecutarse en el equipo donde está conectado Arduino físicamente (por conexión USB). La configuración normal es instalar arduinoblocks-Connector en el mismo equipo donde se trabaja con arduinoblocks.
Podemos configurar la plataforma arduinoblocks para conectarse con la aplicación arduinoblocks-Connector en otro equipo.
Ejemplo: Arduino conectado por USB a una RaspberryPi con arduinoblocks-Connector instalado. La programación sería realizada desde una Tablet Android. El programa se compila y sube a la placa Arduino de forma remota a través de la red local.
Para programar remotamente un Arduino conectado a un ordenador en red con la aplicación arduinoblocks-Connector, debemos modificar el Host con la dirección IP del equipo en la red al que está conectado la placa Arduino (en lugar de localhost).
Ventana de configuración al arduinoblocks-Connector,
por defecto en el mismo equipo (localhost):
La parte hardware del proyecto Arduino está formada por el conjunto de placas Arduino disponibles en el mercado o que tú mismo te puedes fabricar (Arduino es un proyecto totalmente abierto)
Además de la placa Arduino para cualquier proyecto robótico o de automatización debemos añadir un conjunto de sensores y actuadores para realizar las funciones necesarias.
Las conexiones entre sensores, actuadores y Arduino se pueden realizar mediante la ayuda de una placa de prototipos, de forma modular, o incluso con kits de conexión fácil (EasyPlug).
arduinoblocks no restringe al uso de ningún hardware en concreto, aunque con fines educativos y para facilitar el uso recomendamos el uso de componentes modulares o de fácil conexión para los más pequeños.
arduinoblocks toma como referencia en sistemas modulares y fácil conexión los kits del fabricante Keyestudio por su calidad y facilidad, aunque se pueden utilizar otros fabricantes e incluso fabricarte tus propios sensores y actuadores a partir de los elementos electrónicos.
Placa prototipos / Breadboard | Modular |
EasyPlug |
Ejemplo: Algunos Kits de Arduino modular y EasyPlug
Modular: http://shop.innovadidactic.com/index.php?id_category=87&controller=category
EasyPlug: http://shop.innovadidactic.com/index.php?id_category=86&controller=category
En caso de utilizar un sistema modular (por lo general es lo más recomendable para la mayoría de casos y entornos educativos), tendremos que conectar distintos sensores y actuadores a la placa Arduino por lo que tendremos que seguir usando en algunos casos la placa de prototipos para “ramificar” algunos pines como por ejemplo la alimentación de 5v o 3.3v o los pines de GND.
Como alternativa a la placa de prototipos para el conexionado modular tenemos varias opciones:
La placa sensor shield agrupa los pines G (GND) , V (5v) , S (Señal del pin correspondiente)
Por tanto si ampliamos, por ejemplo para el pin 7, tendriamos los pines:
Internamente todos los pines G (GND) y V (5v) están interconectados entre ellos.
Ejemplo del detalle de las conexiones “extras” para los pines D3 y A0.
Internamente todos los pines G (GND) y V (5v) están interconectados entre ellos.
Ejemplo de conexiones modulares en la placa ESP32 STEAMakers:
Para cada pin tenemos las señales G (GND) , V (5v) y S (señal)
Hub I2C integrado x5 con señales GND,V,SDA,SCL
Nomeclatura doble (Arduino + ESP32) :
Comparativa de conexionado con Arduino UNO (Led y sensor DHT11)
Ejemplo: Módulo sensor de luz LDR | Ejemplo: hub i2c para ramificación i2c |
Kits Arduino modulares:
http://shop.innovadidactic.com/index.php?id_product=665&controller=product
http://shop.innovadidactic.com/index.php?id_product=578&controller=product
Se trata de una versión de Arduino personalizada con conectores RJ en vez de pines. Facilita la conexión y con la ayuda de colores evita equivocacioens. Un opción ideal para los más pequeños.
Al crear un nuevo proyecto en arduinoblocks podemos indicar el tipo de proyecto “EasyPlug”:
A la hora de iniciar un proyecto de robótica debemos tener claras algunas nociones de electricidad y electrónica básicas. El propósito de este libro no es aprender estos conceptos sobre electrónica, por lo tanto se asumen unos conocimientos previos básicos de electricidad y electrónica.
Vamos a hacer un breve repaso de los conceptos más importantes que debemos conocer:
La corriente eléctrica se define como el movimiento de los electrones a través de un conductor, según el tipo de desplazamiento se define como corriente continua o alterna.
En la corriente alterna los electrones cambian de dirección de movimiento 50 veces por segundo (en redes eléctricas como la de España de 50Hz, en otros países puede ser 60Hz). El movimiento descrito por los electrones es sinusoidal.
En la corriente continua los electrones se desplazan siempre en la misma dirección. Arduino funciona con corriente continua.
C.A. | C.C. |
Las principales magnitudes físicas que debemos conocer son:
Voltaje o tensión eléctrica: Energía acumulada por unidad de carga que hace que las cargas circulen por el circuito (genera una corriente). Se mide en voltios (V)
Intensidad: número de electrones que atraviesan la sección de un conductor por unidad de tiempo. Se mide en amperios (A)
Resistencia: mide la oposición que ofrece un material al paso de corriente eléctrica. Se mide en Ohmios (Ω)
Potencia: es la energía consumida o desprendida por un elemento en un momento determinado. Se mide en Watios (W) P = V · I
Ley de Ohm: Es una sencilla fórmula matemática que relaciona estas tres magnitudes básicas entre sí.
Circuito eléctrico: Conjunto de elementos unidos de tal forma que permiten el paso de corriente eléctrica para conseguir algún efecto (luz, calor, movimiento, etc.)
La placa Arduino necesita energía para funcionar, existen varias formas de alimentar la placa Arduino:
-A través del conector USB: cuando conectamos al ordenador para programarlo o utilizando un “power bank” con conexión USB por ejemplo.
-A través del conector de alimentación externa: La fuente de alimentación conectada debe ofrecer un voltaje DC de 7 a 12v. Internamente la placa Arduino UNO regula la tensión a 5v.
-A través de los pines 5v o Vin: A través del pin 5v podemos alimentar con una fuente de alimentación de 5v, o a través del pin Vin podemos alimentar de igual forma que con el conector externo con un voltaje de entre 7 a 12v, pues se ajutará a 5v con el regulador interno.
En el caso de alimentar desde USB o a través del conector externo, por los pines 3.3v , 5v, GND y Vin obtenemos la alimentación para circuitos auxiliares, sensores, shields, etc.:
• 3.3v proporciona una tensión de 3.3v y una corriente máxima de 50mA
• 5v proporciona una tensión de 5v y una corriente máxima de 300mA
• GND es el nivel 0v de referencia
• Vin proporciona la tensión de alimentación conectada al conector de alimentación (sin regular, igual a la tensión de la fuente de alimentación conectada)
Normalmente alimentaremos la placa Arduino a través del USB durante su programación desde el PC. Si la placa Arduino va a funcionar de forma autónoma sin interactuar con el PC podemos alimentarla desde una fuente de alimentación o con una batería a través del conector Jack (aplicar de 7 a 12v).
Ejemplo: Conexión recomendada de la tensión de alimentación a la placa de prototipos
Placa de prototipos o “breadboad”: https://es.wikipedia.org/wiki/Placa_de_pruebas
Arduino UNO es la placa Arduino más utilizada de todas las versiones existentes, Arduino Nano es muy similar a Arduino UNO en características pero en un formato más pequeño. Aqui se pueden ver dos modelos de la placa Arduino UNO y Arduino Nano:
http://shop.innovadidactic.com/index.php?id_product=690&controller=product
Especificaciones técnicas:
Microcontrolador | ATmega328P |
Alimentación | 5V |
Alimentación (recomendada) | 7-12V |
Alimentación (límite) | 6-20V |
Número de pines E/S | 14 (6 con salida PWM) |
Número de pines PWM | 6 |
Número de pines analógicos | 6 |
Corriente pines E/S | 20 mA |
Corriente pin de 3.3V | 50 mA |
Memoria Flash | 32 KB (ATmega328P) |
SRAM | 2 KB (ATmega328P) |
EEPROM | 1 KB (ATmega328P) |
Velocidad de reloj | 16 MHz |
Largo | 68.6 mm |
Ancho | 53.4 mm |
Peso | 25 g |
El tamaño de la memoria para programa de la placa Arduino UNO es de 32 KBytes.
La placa Arduino UNO dispone de múltiples pines de conexión en formato de conector hembra:
Los pines están agrupados por función o tipo:
IOREF | Indica la tensión de trabajo de las E/S de este modelo de placa. (Arduino UNO IOREF = 5V) |
RESET | Permite reiniciar la placa a través de este pin |
3.3V | Suministra 3.3v |
5V | Suministra 5v |
GND | Tierra o 0V (negativo) |
Vin | Obtiene el voltaje aplicado por la fuente de alimentación con la que se está alimentando. También permite alimentar la placa por este pin, aplicando tensión de entrada (7-12v) |
Pin digital configurado como entrada: | Tensión aplicada externamente al pin: 0v…1,5v = OFF / 0 / desactivado 3v…5v = ON / 1 / activado |
Pin digital configurado como salida: | Tensión suministrada por el pin: OFF / 0 / desactivado = 0v ON / 1 / activado = 5v |
Pines: 0, 1 | Estos dos pines se pueden utilizar como entradas / salidas digitales. arduinoblocks no utiliza los pines 0,1 como pines de E/S. Los reserva para la conexión serie y la programación desde el PC. |
Pines: 2…13 | Pines digitales de uso general. Podemos utilizarlos como entrada o salida. Según utilicemos un actuador o un sensor arduinoblocks configurará automáticamente el pin como entrada o salida según sea necesario. |
Pines A0…5 | Los pines de entrada analógicos también se pueden usar como pines de E/S digitales convencionales. |
Pines: 3,5,6,9,10,11 | Dentro de los pines digitales estos pines permiten utilizar como salida digital PWM (modulación en ancho de pulso) para simular una salida pseudo-analógica. |
Ejemplo: Gráficas del funcionamiento del PWM:
10 bits = 1024 valores (0 … 1023)
Pines: A0…A5 | 6 Entradas analógicas (resolución 10 bits: 0…1023) |
Pin 0 | RX: a través de este pin se reciben datos hacia Arduino |
Pin 1 | TX: a través de este pin se envían datos desde Arduino |
Los pines 0,1 conectan con el puerto serie implementado en el hardware Arduino. En caso de necesidad se podrán implementar otras conexiones serie a través de otros pines digitales emulando el puerto serie con librerías software (por ejemplo para la conexión con el módulo Bluetooth HC-06 explicado más adelante)
https://www.arduino.cc/en/Reference/SoftwareSerial
(más información sobre la conexión serie: Apartado 2.6.1)
Pin A4 / SDA | Línea de datos del bus I2C |
Pin A5 / SCL | Línea de reloj del bus I2C |
(más información sobre el bus I2C: Apartado 2.6.2)
Pin 12 / MISO | Master In Slave Out |
Pin 11 / MOSI | Master Out Slave In |
Pin 13 / SCK | Serial Clock |
Pin 10 / SS | Slave Select |
(más información sobre bus SPI: Apartado 2.6.3)
Una de las ventajas de la placa Arduino es que incorpora un programa pregrabado en el microcontrolador. Este programa conocido como “bootloader” o cargador de arranque permite desde el principio reprogramar el microcontrolador de Arduino a través de su puerto USB sin necesidad de un programador externo ni el uso del sistema ICSP (In Circuit Serial Programming) utilizado en otros sistemas.
Otra ventaja evidente del sistema Arduino es el entorno de programación “Arduino IDE” sencillo ofrecido de forma totalmente libre y que facilita enormemente la programación de este tipo de microcontroladores para inexpertos.
La clave del éxito de la plataforma Arduino es que es una plataforma totalmente abierta y existe una gran comunidad de colaboradores y desarrolladores. Un ejemplo de las aportaciones de la comunidad Arduino son las conocidas como “shields”, que son módulos de extensión apilables para Arduino con las que podemos añadir rápidamente funcionalidades a la placa Arduino.
Ejemplos de “Shields” para Arduino UNO:
Shield Ethernet | Shield Relés | Joystick y botones |
Shield Educativa TDR STEAM innovadidactic | Shield GPS | Motor shield 1 |
http://shop.innovadidactic.com/index.php?id_category=93&controller=category
Los modelos Arduino Nano y ProMicro son similares en características y tamaño a los modelos UNO y Nano respectivamente, la principal diferencia es que la comunicación USB para la programación y la comunicación con el PC está integrada en el mismo controlador. Gracias a esta característica estos modelos de Arduino además pueden emular el comportamiento de un dispostivio USB tipo HID (Human Interface Device), es decir, ser detectados por el PC y comportarse como un teclado o un ratón.
De esta forma es sencillo implementar periféricos HID para el control del PC o como forma de intercambiar información. Por ejemplo podemos implementar dispostivos para controlar el puntero del ratón y las pulsaciones de los botones o implementar un controlador de juegos enviando los códigos de teclas pulsadas como si de un teclado se tratara.
Más información sobre los bloques de programación de teclado y ratón
http://shop.innovadidactic.com/index.php?id_product=728&controller=product
Arduino Mega implementa un número considerablemente mayor de pines de E/S tanto digitales como analógicos, además de varios puertos serie implementados por hardware (a parte del que se utiliza para comunicación USB y programación). Por otro lado tiene una mayor cantidad de memoria RAM y memoria FLASH para almacenar el programa.
Debemos elegir este tipo de Arduino cuando nuestro proyecto vaya a necesitar un número de entradas/salidas superior al Arduino UNO o en casos de realizar programas grandes donde la memoria de Arduino UNO pueda ser un problema. Otro aspecto importante a tener en cuenta es la posibilidad de utilizar varias conexiones serie (puertos serie) implementados por hardware en el propio microcontrolador. Mienstras que los Arduinos de gama inferior tienen un único puerto serie (compartido con la comunicación USB), Arduino MEGA tiene 4 puertos serie hardware.
http://shop.innovadidactic.com/index.php?id_product=848&controller=product
El microcontrolador ESP8266 es un microcontrolador de bajo coste con características tan interensantes como el WiFi integrado, una velocidad de reloj y una tamaño de memoria mucho mayores que los modelos de Arduino. El chip ESP8266 se utiliza como base para algunas placas de desarrollo como NodeMCU o WeMos (versión normal o mini). La comunidad Arduino desarrolló un “framework” compatible con Arduino para permitir progamar las placas basadas en el micrcontrolador ESP8266 de una forma similar a Arduino, de esta forma la mayoría de librerías se han podido reutilizar o adaptar fácilmente.
Una de las características en las que se diferencian de Arduino principalmente es que trabajan con un voltaje de 3.3v en vez de 5v, por lo que hay que llevar cuidado con ésto y en algún caso será necesario utilizar adaptadores de tensión 3.3v - 5v
Tienda: http://shop.innovadidactic.com/index.php?id_product=859&controller=product
El microcontrolador ESP32 se puede considerar una alternativa al ESP8266 del mismo fabricante. Por práctimante el mismo precio tendremos un microcontrolador de alto rendimiento, con una gran versatilidad en todos sus pines (todos permiten uitlizarse como E/S, salidas PWM, entradas analógicas,...) Y lo más importante es que implementa tanto comunicación Bluetooth como WiFi en el chip sin necesidad de ningún hardware extra.
Procesador: | CPU: microprocesador de 32-bit Xtensa LX6 de doble núcleo (o de un solo núcleo), operando a 160 o 240 MHz y rindiendo hasta 600 DMIPS |
Memoria: | 520 KiB SRAM |
Conectividad inalámbrica: |
|
Puertos serie: | x3 UART |
I2C: | x2 |
ADC 12 bits: | x12 |
DAC 8 bits: | x8 |
SPI: | x4 |
Salidas PWM: | x16 |
ESP32 Placa de desarrollo de keyestudio:
Shield recomendada para facilitar la conexión al ESP32:
arduinoblocks junto a Innovadidactic y Keyestudio han desarrollado la placa ESP32 STEAMakers, una placa basada en el potente microcontrolador ESP32 con sensores integrados para la medición del consumo energético, una ranura para tarjeta microSD, y un formato Arduino con conexiones modulares para facilitar la conexión de sensores, actuadores y periféricos. Es una placa pensada especialmente para el mundo docente y maker que permite facilitar el uso del potente ESP32 sin necesidad de protoboard y simplificando el cableado. Además arduinoblocks ofrece un tipo de proyecto específico que nos permite aprovechar al máximo las funcionalidades de esta placa.
Videos con información y ejemplos de ESP32 STEAMakers:
https://www.youtube.com/watch?list=PL1pKD-Bz2QBAgfy580m8OaQ2Z60v6DOhC&v=MQjIEI7I4ik
Un sensor es un objeto capaz de detectar magnitudes físicas o químicas y transformarlas en variables eléctricas.
Los sensores o periféricos de entrada nos permiten obtener información del mundo real para utilizarla desde el programa de Arduino.
La interfaz de conexión de un sensor con Arduino lo podemos clasificar en tres tipos: digital, analógico o datos.
Ejemplo: un pulsador es un tipo de sensor sencillo que sólo nos da dos estados, “pulsado o no pulsado”. Conectado a la placa Arduino debe generar 0v en reposo y 5v al pulsarlo. De esta forma desde el programa de Arduino podremos leer el estado del botón.
Ejemplo: conexión de un sensor digital (pulsador):
Ejemplo: Conexión de un sensor digital de movimiento (PIR):
Ejemplo: Conexión de un sensor potenciómetro al pin de entrada analógico A0:
(versión modular) | Cuando el potenciómetro está en un extremo el voltaje aplicado al pin de Arduino es 5v, en el otro extremo es de 0v. Durante el recorrido, gracias a la variación de resistencia del potenciómetro, se aplica el valor de voltaje proporcional a la posición del potenciómetro entre 0 y 5 voltios. |
Ejemplo: Conexión de una resistencia NTC (variable según la temperatura): | |
(versión modular) |
Sensor de acelerómetros con conexión I2C | Sensor DHT11: temperatura y humedad con protocolo de comunicación propio |
Ejemplo: Trama de datos recibida desde el sensor DHT11
Algunos módulos de sensores utilizados con Arduino:
Pulsador | Potenciómetro deslizante | Sensor de distancia |
Sensor de temperatura NTC | Sensor magnético | Sensor de luz LDR |
Sensor DHT-11 de temperatura y humedad | Sensor humedad suelo | Encoder |
Acelerómetro | Sensor de sonido | Receptor IR |
Un actuador es un dispositivo capaz de transformar la energía eléctrica en la activación de un proceso con la finalidad de generar un efecto sobre elementos externos.
Un actuador o periférico de salida permite actuar sobre el mundo real desde el programa de Arduino.
Algunos módulos de actuadores utilizados con Arduino:
Módulo relé: | Servomotor: | Módulo led: |
Módulo led RGB: | Módulo zumbador: | Pantalla LCD: |
Motor paso a paso: | Motor DC: | Reproductor MP3: |
http://shop.innovadidactic.com/index.php?id_category=87&controller=category
La placa Arduino permite múltiples vías de comunicación con el exterior, por un lado disponemos del bus I2C o del SPI pensado para periféricos externos o sensores mientras que como vía de comunicación principal para la programación o monitorización tenemos la conocida como conexión serie (puerto serie) a través del conector USB.
El microcontrolador Atmel de Arduino dispone de un controlador de comunicación serie (UART) integrado. La comunicación se realiza de forma bidireccional, utilizando un pin para transmitir los datos y otro para recibir.
Es muy importante tener en cuenta que este puerto serie es el que se utiliza para “subir” el firmware y reprogramar la placa Arduino desde un ordenador (bootloader).
Las primeras placas Arduino disponían de un conector de puerto serie tipo DB9 de 9 pines utilizado antiguamente para este tipo de conexiones. Hoy en día se utiliza un chip de conversión serie a USB que permite emular en el equipo un puerto serie estándar.
Durante el uso normal podemos utilizarlo como vía de comunicación sencilla entre el microcontrolador y el un PC.
Arduino UNO sólo dispone de un puerto serie hardware aunque podemos emular más puertos serie vía software. La conexión serie es utilizada por algunos periféricos o sensores para interactuar con Arduino:
Shield GPS (comunicación serie) | Módulo Bluetooth HC-06 (comunicación serie) |
Para poder desde un ordenador visualizar los datos recibidos vía puerto serie debemos utilizar una aplicación de tipo “terminal” o “consola” serie:
Realterm - consola serie para Windows:
Arduino IDE - serial monitor:
arduinoblocks – consola serie
(Se necesita instalar la aplicación arduinoblocks-Connector)
A la hora de establecer una conexión serie los dos extremos que intervienen en la conexión (en este caso Arduino y el PC) deben establecer el mismo valor en la velocidad de la conexión.
Velocidad en baudios por defecto: 9600 bits por segundo
Otras velocidades utilizadas: 4800, 19200, 38400, 57600, 115200,
SerialPlotter
Otra funcionalidad relacionada con la comunicación serie es el “Serial Plotter” que nos permite enviar información desde Arduino al PC y visualizarla en forma de gráfica en tiempo real. Además el “Serial Plotter” implementa un sencillo datalogger con el que podemos ir grabando los datos para exportarlos posteriormente en formato CSV (Excel, Calc,...)
Ejemplo de uso del serial plotter:
La función de datalogger (registro de datos) la podemos activar desde el panel superior derecho y veremos un icono de un comecocos “comiendo” datos mientras estamos recopilando los datos para su posterior exportación:
Si superamos el número de datos máximo especificado, se sobreescribirán los datos más antiguos. Cuando paremos la recogida de datos podremos descargar los archivo de datos CSV, uno por cada serie de datos recogida (un archivo por cada variable que representemos en la gráfica)
Ejemplo de procesamiento de los datos exportados en CSV en una aplicación externa (LibreOffice Calc):
El bus I2C (I²C o TWI) es un bus de datos seire desarrollado por Philips.
Se utiliza principalmente internamente para la comunicación entre diferentes partes de un circuito, por ejemplo, entre un controlador y circuitos periféricos integrados.
Atmel introdujo por motivos de licencia la designación TWI (Two-Wired-Interface) actualmente utilizada por algunos otros fabricantes. Desde el punto de vista técnico, TWI e I2C son idénticos.
El I2C está diseñado como un bus maestro-esclavo. La transferencia de datos es siempre inicializada por un maestro; el esclavo reacciona. Es posible tener varios maestros (Multimaster-Mode). En el modo multimaestro pueden comunicar dos maestros entre ellos mismos, de modo que uno de ellos trabaja como esclavo. El arbitraje (control de acceso en el bus) se rige por las especificaciones, de este modo los maestros pueden ir turnándose.
La dirección de I2C estándar es el primer byte enviado por el maestro, aunque los primeros 7 bits representan la dirección y el octavo bit (R/W-Bit) es el que comunica al esclavo si debe recibir datos del maestro (low/bajo) o enviar datos al maestro (high/alto). Por lo tanto, I2C utiliza un espacio de direccionamiento de 7 bits, lo cual permite hasta 112 nodos en un bus (16 de las 128 direcciones posibles están reservadas para fines especiales).
Cada uno de los circuitos integrados con capacidad de soportar un I2C tiene una dirección predeterminada por el fabricante, de la cual los últimos tres bits (subdirección) pueden ser fijados por tres pines de control. En este caso, pueden funcionar en un I2C hasta 8 circuitos integrados. Si no es así, los circuitos integrales (que precisan ser idénticos) deben ser controlados por varios buses I2C separados.
Pantalla LCD con módulo de conexión I2C | |
La conexión I2C en Arduino UNO se realiza en los pines:
SDA: Pin A4 / SCL: Pin A5
Ejemplo: conexión de módulo I2C para control de pantalla LCD:
El Bus SPI (del inglés Serial Peripheral Interface) es un estándar de comunicaciones, usado principalmente para la transferencia de información entre circuitos integrados en equipos electrónicos. El bus de interfaz de periféricos serie o bus SPI es un estándar para controlar casi cualquier dispositivo electrónico digital que acepte un flujo de bits serie regulado por un reloj (comunicación sincrónica).
Incluye una línea de reloj, dato entrante, dato saliente y un pin de Chip Select, que conecta o desconecta la operación del dispositivo con el que uno desea comunicarse. De esta forma, este estándar permite multiplexar las líneas de reloj.
La sincronización y la transmisión de datos se realiza por medio de 4 señales:
Algunos periféricos SPI:
Tarjeta micro SD | Lector RFID | Ethernet shield |
La conexión SPI en Arduino UNO se realiza en los pines:
MOSI: Pin 11
MISO: Pin 12
SCLK: Pin 13
SS/CS: Depende de la programación, puede usarse cualquier pin.
Ejemplo: conexión de módulo para tarjetas SD (el pin SS está conectado al pin 4):
La conexión Ethernet nos permite la conexión a la red (normalmente para acceder a internet) a través de un cable Ethernet, conectado a nuestro routero o switch. Esta conexión se caracteriza por usar el conector RJ45 y es una forma sencilla de conectar nuestro Arduino a la red.
Para añadir la conectividad lo más sencillo es usar una Shield Ethernet w5100.
http://shop.innovadidactic.com/index.php?id_product=679&controller=product
Arduino UNO + Shield Ethernet | Arduino Mega + Shield Ethernet |
Para más información consultar el uso de los bloques MQTT para intercambio de información a través de conexiones IP con conexión Ethernet o WiFi.
Otra forma de conectar a la red por la que podemos optar con Arduino es mediante una conexión inalámbrica WiFi. Sin embargo las shields WiFi a parte de tener un precio bastante alto (comparado con el precio habitual de los componentes Arduino) la mayoría han sido descatalogadas en favor de placas con WiFi integrado.
Una opción sencilla y económica para la conexión de cualquier modelo Arduino a internet a través de WiFi es usar un ESP-01 (placa basada en el chip ESP8266) como periférico WiFi a través de una conexión serie, es decir, usando dos pines (RX,TX).
El periférico ESP-01 necesita un sencillo adaptador para ajustar los niveles de voltaje en la comunicación:
Módulo ESP-01 con adaptador: |
http://shop.innovadidactic.com/index.php?id_product=866&controller=product |
El módulo ESP-01 comunica con protocolo serie y por defecto trabaja a una velocidad de 115200 bps, por lo que sólo funcionaría correctamente conectándolo a un puerto serie hardware de Arduino (en otros pines se usaría una comunicación serie emulada por software a un máximo de velocidad de 57600 bps).
Por tanto a velocidad de 115200 bps , en Arduino UNO solo podemos usar el periférico ESP-01 en los pines:
Arduino - Pin 0 (RX) -> | ESP-01 - Pin TX |
Arduino - Pin 1 (TX) -> | ESP-01 - Pin RX |
IMPORTANTE: a la hora de programar la placa Arduino a través del USB debemos desconectar (al menos la alimentación) del periférico ESP-01 porque interferirá en el proceso de programación que utiliza también los pines 0,1
En Arduino Mega, disponemos de varios puertos serie hardware por lo que podemos dejar libre los pines 0,1 para no interferir en la progrmación USB, y utilizar cualquiera de los otros puertos implementados en la placa.
Puertos serie en Arduino MEGA:
Pin RX | Pin TX | |
Serial 0 (compartido con USB): | 0 | 1 |
Serial 1 | 19 | 20 |
Serial 2 | 17 | 16 |
Serial 3 | 15 | 14 |
En las placas basadas en ESP8266, como el NodeMCU o WeMos, no necesitamos añadir ningún periférico extra para la conexión pues el propio microcontrolador implementa la conexión WiFi.
De igual forma que con la conexión Ethernet, la conexión a la red por cable o WiFi nos permite utilizar los bloques MQTT para intercambiar información a través de la red o internet.
Si utilizamos dispositivos con WiFi integrado (ESP8266 o ESP32) no tendremos que configurar ningún módulo externo para utilizar la conectividad WiFi desde los bloques MQTT o Blynk:
NodeMCU (ESP8266) con WiFi incorporado:
ESP32 con WiFi incorporado:
Conectividad WiFi + Bluetooth integrada en ESP32 STEAMakers
El microcontrolador ESP32 incorpora WiFi y Bluetooth sin necesidad de ningún módulo extra. Además la conexión Bluetooth permite el protocolo HID para simular un ratón o teclado Bluetooth.
El protocolo WiFi-Mesh permite comunicar placas ESP32 STEAMakers entre ella de forma descentralizada y sin necesidad de un punto de acceso WiFi previo.
Una vez tenemos definido el hardware necesario para un proyecto el siguiente paso es programar el microcontrolador de la placa Arduino para que realice las tares necesarias para el funcionamiento deseado.
La programación de la placa Arduino se realiza normalmente en lenguaje C++ desde el entorno Arduino IDE. Para programar debemos conocer primero este lenguaje, lo cual supone mucho tiempo del que muchas veces no disponemos.
En los últimos años han aparecido entornos mucho más sencillos e intuitivos para desarrollar aplicaciones que nos permiten introducirnos de forma práctica y sencilla en el mundo de la programación. Es el caso de Scratch, un entorno de desarrollo de videojuegos multiplataforma, y AppInventor, un entorno de desarrollo de aplicaciones para dispositivos móviles Android.
arduinoblocks, al igual, es un entorno online que nos permite programar Arduino (sin necesidad de conocer el lenguaje de programación C++) de forma visual al estilo de programación de bloques.
arduinoblocks implementa bloques generales comunes a cualquier entorno de programación y por otro lado bloques específicos para Arduino donde podemos acceder a leer/escribir datos de los pines de entrada/salida, acceder a información de sensores conectados, manejar actuadores, periféricos como la pantalla LCD y muchas funcionalidades más.
Programa de ejemplo generado automáticamente en modo “prueba”
Un algoritmo es un conjunto prescrito de instrucciones o reglas bien definidas, ordenadas y finitas que permite realizar una actividad mediante pasos sucesivos que no generen dudas a quien deba realizar dicha actividad.
A la hora de programar en cualquier lenguaje de programación lo primero que tenemos que hacer es plantear el algoritmo que queremos desarrollar y posteriormente implementarlo en el lenguaje de programación elegido.
A pesar de que la programación por bloques es muy intuitiva y visual, siempre es recomendable plantear el algoritmo antes de empezar un proyecto.
Ejemplos de diagramas de flujo para definir un algoritmo: | |
La definición previa del algoritmo nos permitirá agilizar el proceso de creación del programa.
Simbología básica para la definición gráfica de un algoritmo:
Los bloques de uso general nos permiten implementar funciones comunes en cualquier entorno o sistema programable. Esto incluye funciones lógicas, matemáticas, condiciones, bucles, funciones de texto, etc.
Con estos bloques tenemos acceso a las funciones lógicas necesarias para implementar en nuestro programa de Arduino.
Las funciones lógicas trabajan con valores o expresiones de “verdadero” o “falso”
Ejemplo de comparaciones:
|
Ejemplo: Comparción numérica “mayor o igual que”
|
|
Ejemplo: condición lógica “y” (AND)
Ejemplo: negación de un detector para saber cuando “no” hay movimiento
|
Las estructuras de control nos permiten realizar bucles e iteraciones.
Ejemplo: |
Ejemplo: | |
Ejemplo:
Ejemplo: | |
Para las variables arduinoblocks utiliza el tipo de dato “double” cuando traduce el programa a lenguaje C++. En caso de hacer la conversión se trata como un “cast” a un tipo de datos “long” o “unsigned long”
Trata el valor como tipo entero | |
Trata el valor como tipo entero sin signo |
| ||||||||||||
Ejemplo: | ||||||||||||
Aumenta la variable en +1 variable = variable + 1 | |
Disminuye la variable en -1 variable = variable – 1 | |
Aumenta la variable en +1.5 variable = variable + 1.5 |
Ejemplo: -Sensor de temperatura: 10ºC … 50ºC -Arduino lectura analógica: 0 … 1023 Necesitamos convertir del rango 0-1023 leído al rango 10ºC-50ºC: |
Ejemplo: |
Ejemplo: |
Ejemplo: |
Ejemplo: uso de varios bloques de operaciones matemáticas: |
Ejemplo de uso de “es NaN”:
Las funciones de texto son especialmente útiles con la utilización en el puerto serie (consola), y otros periféricos como pantallas LCD. Permiten trabajar con variables de tipo texto o con textos prefijados.
|
Ejemplo:
Ejemplo: enviar por la consola el valor de una variable como texto
formateado con 6 y 1 decimales respectivamente:
Ejemplo:
Ejemplo de uso de bloques de texto: |
Ejemplo: comparación de texto y variables de tipo texto
Ejemplo:
Ejemplo:
Ejemplo:
Ejemplo:
Tabla ASCII de los caracteres imprimibles:
Ejemplo: unir varios datos de variables en formato CSV
Una variable es un hueco en la memoria donde el programa puede almacenar valores numéricos. El sistema nos permiten asignarles un nombre simbólico como por ejemplo “temperatura exterior”, “velocidad”, “posición servo 1”,”estado”,… para facilitar su uso.
Hay tres tipos de variables en arduinoblocks: numéricas, booleanas y de texto.
Ejemplo: | |
Ejemplo: | |
Ejemplo:
Ejemplo:
Ejemplo:
Ejemplo:
Las listas de datos nos permiten almacenar un listado de valores y acceder a ellos por su posición en la lista. Las listas pueden ser de tipo numéricas o de texto.
Podemos crear una lista asignándole un nombre a la lista y asignándole valores iniciales.
Ejemplo:
Para saber el número de elementos que tenemos en una lista podemos usar el bloque:
En una lista podemos obtener el valor de una posición (desde la 0 hasta el número de elementos -1 en la lista) con el bloque, por ejemplo si tenemos 10 elementos podremos acceder a ellos desde el 0 al 9:
O cambiar el valor de un elemento indicando su posición y el nuevo valor:
Ejemplo:
Posicionamiento de un motor (servo) en distintas posiciones (grados) prefijados en una lista.
Podemos crear una lista asignándole un nombre a la lista y asignándole valores iniciales.
Ejemplo:
Para saber el número de elementos que tenemos en una lista podemos usar el bloque:
En una lista podemos obtener el valor de una posición (desde la 1 hasta el número de elementos en la lista) con el bloque:
O cambiar el valor de un elemento indicando su posición y el nuevo valor:
Ejemplo: Mostrar saludos en distintos idiomas a partir de una lista
Las funciones permiten agrupar bloques de código. Esto es útil cuando un bloque de código se repite en varias partes del programa y así evitamos escribirlo varias veces o cuando queremos dividir el código de nuestro programa en bloques funcionales para realizar un programa más entendible.
Función sin valor de retorno. La función ejecuta los bloques de su interior y vuelve al punto de llamada. | |
Función con valor de retorno. La función ejecuta los bloques de su interior y devuelve un resultado. |
Llamada a una función sin valor de retorno. | |
Llamada a una función con valor de retorno. | |
Llamada a una función sin valor de retorno y con 2 parámetros |
Ejemplo: Función para calcular el área de un triángulo
Definición: |
Llamada: |
Ejemplo: Función para enviar información por la consola
Definición: |
Llamada: |
Ejemplo: Función para calcular la longitud de una circunferencia
Ejemplo: División en partes funcionales de un programa real.
Definición: |
Llamada desde el bucle principal del programa: |
En el siguiente apartado veremos los bloques relacionados con funciones propias de la placa Arduino. Estos bloques nos permitirán acceder a funcionalidades del propio microcontrolador y otros estarán orientados a sensores, actuadores o periféricos que podemos conectar a la placa Arduino para desarrollar nuestros proyectos.
Las funciones de entrada/salida genéricas nos permiten leer o escribir en los pines digitales y analógicos de la placa Arduino descritos en el apartado 2.3.
Ejemplo:
(Si se activa, la salida suministrará 5v en caso contrario 0v)
Ejemplo:
Versión equivalente:
El conversor interno DAC (Digital Analog Converter) es de 10 bits por lo que los valores leídos de una entrada analógica van de 0 a 1023
10 bits = 2 ^ 10 = 1024 posibles valores
Voltaje en la entrada analógica | Valor leído |
0 voltios | 0 |
2.5 voltios | 512 |
5 voltios | 1023 |
Ejemplo:
Ejemplo: pin 3 al 25%, pin 5 al 50% , pin 6 al 100% |
Los bloques dentro de una interrupción externa no deben utilizar mucho tiempo del microcontrolador, deben realizar tareas sencilla y no bloquear durante mucho tiempo (en ningún caso usar bloques “esperar” , …)
Placa de expansión de salidas PWM:
Las funciones de tiempo o retardo nos permiten realizar pausas y obtener información sobre el tiempo transcurrido dentro del microcontrolador.
Milisegundos | |
Microsegundos | |
Ejemplo: Led 1 segundo encendido, 1 segundo apagado… | |
Milisegundos | |
Microsegundos |
Ejemplo : Ejecutar la Tarea1 cada 3 segundos y la Tarea2 cada 7 segundos sin bloquear la ejecución del programa:
Ejemplo: al activar la entrada del pin 6 se finaliza la ejecución. |
Ejemplo: Funcionamiento equivalente (esperar por siempre): |
IMPORTANTE: Este bloque NO bloquea la ejecución del programa
Ejemplo: Ejecuta los bloques en su interior si el tiempo transcurrido desde la última ejecución es mayor o igual a 1000 ms
Programa equivalente:
Cuando necesitemos realizar distintas tareas periódicas y que parezca que se ejecuten paralelamente sin bloquearse unas a otras utilizaremos este tipo de bloque “ejecutar cada”.
Si en el programa utilizamos bloques como por ejemplo el GPS (Apdo. 3.3.12) obligatoriamente debemos evitar los bloques de “esperar” si queremos que el programa funcione correctamente. Consultar Anexo I para ver los bloques incompatibles con bloques tipo “esperar”
Ejemplo: tareas simultáneas con distintos periodos de ejecución
La precisión de la ejecución de tareas de esta forma depende del tiempo que emplea cada tarea, si una tarea “tarda” mucho bloqueará y “retrasará” al resto. Para un funcionamiento correcto cada tarea debe ejecutarse en el menor tiempo posible y no usar nunca bloques de tipo esperar o realizar bucles de indeterminada duración que puedan quedarse en ejecución por tiempo indefinido.
Ejemplos de lo que NO se debería hacer dentro de las tareas: | |
Ejemplo: Juego en el que tenemo que pulsar un botón periódicamente sin dejar que pase nunca más de 10s entre pulsaciones, en caso contrario se ilumina un led indicando que hemos perdido
arduinoblocks nos permite utilizar una capa para implementar un sistema multitarea avanzado basado en FreeRTOS. Este sistema permite crear tareas que se ejecutarán de forma paralela (virtualmente). En microcontroladores modestos como el Arduino UNO, Nano o incluso MEGA la multitarea con FreeRTOS es bastante limitada y consume gran parte de los recursos de nuestro Arduino, en caso de necesitar de un sistema multitarea más potente podemos optar por usarlo en placas basadas en ESP8266 o ESP32 con mucha más potencia y recursos (especialmente el ESP32 con doble núcleo y gran potencia de procesamiento y memoria interna)
Los sistemas software de multitarea utilizan un planificador (scheduler) que se encarga de repartir el tiempo de procesamiento entre las distintas tareas, de forma que a cada una le toca un tiempo de microcontrolador para ejecutar un poquito de su parte de programa.
Esquema con 3 tareas que se van alternando, y en apariencia parece que las 3 se ejecutan a la vez, en este caso el tiempo de procesador se divide igual para cada tarea:
Los planificadores de multitarea permiten además asignar a cada tarea una prioridad, para así darle preferencia a las tareas más críticas o que necesitan más tiempo de procesamiento. Si creamos muchas tareas con “alta” prioridad puede que afectemos a las demás dejando poco tiempo de procesamiento para ellas…
Esquema de varias tareas con distintas prioridades, variando así su tiempo de microprocesador asignado:
Cada tarea tiene su propio espacio de memoria, por lo que crear demasiadas tareas también puede dejarnos el procesador sin memoria. Si la memoria asignada a las tareas tampoco es suficiente para almacenar los datos se podría reiniciar de forma inesperada el Arduino, o funcionar incorrectamente… como siempre, hay que ser consciente de los limitados recursos de los que disponemos.
Con esta introducción teórica a la multitarea, debemos hacernso otra pregunta… ¿Qué pasa si una tarea accede a un recurso o variable, y el sistema multitarea le da el control a otra tarea y por tanto ese proceso falla o quizás otra tarea acceda al mismo recurso y se solapen?
Para ese problema de convivencia entre tareas se inventaron los “semáforos”, en concreto el que más nos interesa es el semáforo “mutex” o de exclusión mutua, que permite que bloqueemos el sistema multitarea, hagamos lo que tengamos que hacer crítico, y luego liberemos el control. Por supuesto estas tareas críticas deben ser lo más cortas y atómicas posibles: una escritura crítica en una variable, un envío de un dato, una actualización de una pantalla LCD,... siempre cosas simples. Los semáforos debemos usarlos en casos que tengamos claro que se pueden crear conflictos, pues su abuso puede hacer que el sistema multitarea empiece a fallar.
Esquema de acceso a un mismo recurso por parte de 2 tareas diferentes:
Y por último, pero no menos importante ¿Qué pasa con los bloques tipo “esperar” que estaban tan prohibidos en la programación de Arduino cuando queríamos simular una multitarea antes de tener estos bloques? Pues seguimos teníendoles bastante tirria. Aunque en teoría podríamos usarlos, un bloque esperar hace pensar al microcontrolador que está haciendo algo útil, cuando en realidad no es así, por lo que el sistema multitarea querrá asignarle tiempo de procesamiento a la tarea, aunque sea para eso… ¡para no hacer nada!
Tenemos una solución, tenemos un nuevo bloque de esperar “task friendly” que en lugar de esperar sin hacer nada le dice al sistema: ¡voy a estar un rato sin hacer nada, permite ejecutar otras tareas mientras y luego vuelves! ….Mucho más “friendly”, claro que sí.
Bloques
Con toda esta información pasamos a ver los bloques disponibles para poner todo ésto en marcha y después algunos ejemplos:
Permite crear una nueva tarea con su bloque de “inicializar” y su “bucle” al igual que la tarea original de Arduino. Debemos asignar una prioridad a cada tarea, por defecto dejaría todas a “baja” y luego iría ajustando si hace falta. Para gestionar mejor las prioridades, es recomendable en algunos casos no utilizar el “inicializar” y “bucle” propio de Arduino que suele tener preferencia sobre todas estas tareas y es más dificil de equilibrar las prioridades. | |
El bloque esperar óptimo para tareas, pues deja funcionar al resto de tareas de forma más óptima mientras se espera en ésta. Este bloque tiene menos precisión que el bloque “esperar” original, si necesitamos hacer esperas muy precisas (o de menos de 20 ms) debemos usar el “esperar” tradicional. Pero nos servirá en la mayoría de casos. | |
Si tenemos que hacer alguna acción crítica que no queremos que sea interrumpida internamente por el planificador del sistema multitarea podemos poner este bloque y dentro los bloques críticos. (no utilizar si no es estrictamente necesario) | |
Cada tarea tiene su propio espacio de memoria reservado, esta es la cantidad por defecto para las tareas (192 bytes), si necesitamos ajustarla podemos utilizar este bloque en el “inicializar” principal y se ajustará para todas las tareas. Un mal ajuste puede provocar reinicios del microcontrolador o mal funcionamiento. | |
Ejemplo: si no quiero usar el bucle principal: | Las tareas en principio, igual que el bucle de Arduino, están pensadas para ejecutarse de forma indefinida, si en un caso una tarea deja de ser necesaria la forma de terminarla es con este bloque que parará la ejecución y liberará la memoria de la tarea en la que se ejecuta. Si implementamos todo nuestro programa en tareas y no usamos la tarea “principal” de Arduino, es decir el “bucle” principal, podemos eliminar esa tarea autocreada y así quedarnos sólo con el resto. |
Ejemplo 1: Parpadear varios leds a distintas velocidades
Ejemplo 2: Parpadear led + Mover servo
Ejemplo 3: Melodía RTTTL + Pantalla LCD + Sensor de luz LDR
Tarea 1: Muestra el valor de la LDR en la LCD y el nombre de la canción que suena.
Tarea 2: Va reproduciendo distintas canciones y actualiza el nombre en la variable.
La comunicación vía puerto serie es muy utilizada. Es una vía de comunicación bidireccional sencilla que nos permite enviar información desde Arduino que visualizaremos en la consola o al contrario, enviar información desde la consola que recibiremos en el Arduino.
En muchas ocasiones simplemente se utiliza como una forma de depurar o mostrar información para saber si nuestro programa dentro del microcontrolador de Arduino está funcionando bien, en otros casos se puede utilizar de una forma más compleja sirviendo de vía de comunicación con aplicaciones en un PC, con periféricos como un GPS o comunicando con otros sistemas o por qué no, con otra placa Arduino.
En arduinoblocks tenemos acceso a la consola via web (con arduinoblocks-Connector instalado) aunque podemos utilizar si lo preferimos cualquier aplicación de consola o terminal serie compatible con nuestro sistema.
La funcionalidad de “Serial Plotter” nos permite graficar y registrar datos de forma muy visual y sencilla:
Ejemplo: |
Ejemplo: |
Ejemplo: Enviar byte con valor 64 | |
Ejemplo: Si hay datos pendientes de leer activar el pin 13 |
Ejemplo: Devolver como “eco” lo mismo que se ha recibido |
Ejemplo: |
Ejemplo: Mostrar texto recibido por serie en una pantalla LCD |
Ejemplo: Activar el pin correspondiente al byte recibido
Al pulsar “Enviar” en la consola serie, se envía a Arduino: “1” + código de salto de línea (\n) En este caso si no está activada la casilla “hasta salto de línea” leeremos el valor enviado “1” y luego un “0” (por error de intentar interpretar el salto de línea como un número) |
Ejemplo: Recibe un número enviado como texto desde la consola. Interpreta el número. Si es “1” activa el pin 13 , si es “2” apaga el pin 13:
Ejemplo: recibir datos y devolverlos (eco) mediante el evento serie:
El formato interno de los datos entre Arduino y el Serial Plotter tienen el formato:
variable = valor (+ salto de línea)
Ejemplo: Envío de datos de temperatura y humedad cada 1s
Visualización de los datos en el Serial Plotter:
Ejemplo: registro de datos con el datalogger y descarga del archivo CSV:
La comunicación con el módulo Bluetooth HC-06 es exactamente igual que la del puerto serie, de hecho lo que hace el módulo Bluetooth es encapsular toda la información serie a través de una conexión serie virtual a través de un perfil Bluetooth de emulación de puerto serie.
Podemos simular una conexión serie con un dispositivo móvil (con Bluetooth compatible con el perfil de puerto serie), un PC u otro módulo Bluetooth similar en otro dispositivo.
Arduino UNO sólo posee un puerto serie implementado en su hardware, para no utilizar el módulo Bluetooth en los pines 0 y 1 (correspondientes al puerto serie hardware) e interferir con la comunicación serie o la programación del dispositivo (como hacen otros entornos) los bloques de Bluetooth implementan un puerto serie software que funciona exactamente igual pudiendo configurarse en cualquier otro pin digital tanto para RX (recibir) como para TX (transmitir).
Ejemplo de conexión del módulo Bluetooth HC-06 | BlueTerm Android |
En el caso del microcontrolador ESP32 con bluetooth integrado, simplemente debemos indicar el nombre del dispositivo Bluetooth para iniciar la comunicación:
Ejemplo: Envío de una variable contador a través de Bluetooth
Ejemplo: Recepción de un valor por para establecer la intensidad de un led
Ejemplo: pasarela serie <-> Bluetooth
En las placas basadas en microcontroladores ESP32 tenemos la opción de convertir nuestro dispositivo en un teclado o ratón bluetooth (dispositivo HID: Human Inteface Device).
De esta forma podemos emparejar nuestra placa con cualquier móvil, tablet, PC o dispositivo compatible con Bleutooth HID y enviar simulaciones de pulsaciones de teclas o de movimientos del ratón, lo que nos permite crear interfaces para juegos, interfaces de control personalizados y adaptados o enviar directamente datos de sensores como si los estuviéramos tecleando en el dispositivo.
En el mercado existen infinidad de sensores y módulos para Arduino, aunque con los bloques genéricos descritos en el apartado 3.3.1 (entrada/salida) podemos leer la información de la mayoría de sensores digitales y analógicos arduinoblocks implementa bloques específicos para los sensores más comunes del mercado. Estos bloques a veces se limitan a leer la información digital o analógica, según el tipo de sensor, y en otros casos realizan una adaptación de los datos leídos para ajustarlos a la realidad (por ejemplo al leer un sensor de temperatura adapta la lectura a grados centígrados con un cálculo interno).
arduinoblocks incorpora bloques para la mayoría de sensores modulares que podemos encontrar en el mercado, algunos muy populares como los sensores de Keyestudio y similares.
arduinoblocks es una plataforma online en continua evolución por lo que seguramente desde la edición de este libro ya incorporará nuevos sensores con nuevas funcionalidades.
Tipo: Analógico | Pin: A0-A5 | Valor: 0-100 (%) / 0..1023 |
Ejemplo: Sensor potenciómetro conectado al pin analógico A0 para ajustar una variable de temperatura a un valor entre 5 y 30 grados.
Tipo: Digital | Pin: 2-13/A0-A5 | Valor: 0/1 (F/V, Off/On) |
Dependiendo de la conexión que hagamos del pulsador, o en caso de utilizar módulos de pulsador de diferentes fabricantes, la lógica de funcionamiento del pulsador puede ser diferente:
Conexión: sin presionar “off” / presionado: “on” | Conexión: sin presionar “on” / presionado: “off” | ||||
Alguno módulos de pulsador internamente trabajan de forma inversa por su conexión interna. En ese caso el pulsador siempre está dado una señal “On” y cuando lo pulsamos genera la señal “Off”. En ese caso podemos invertir la condición para detectar cuando está pulsado.
Ejemplo: encender un led cuando el pulsador está presionado y apagar si no lo está
Ejemplo con funcionamiento similar al anterior:
Al igual que en el anterior, si por la conexión interna del pulsador la señal lógica funciona al revés (“on” en reposo y “off” al pulsar) podemos indicar que trabajo con lógica invertida:
Tipo: Digital | Pin: 2-13/A0-A5 | Valor: 0/1 (F/V, Off/On) |
Ejemplo: Encendido del led del pin 13 al detectar movimiento.
Sensor PIR conectado al pin 6:
Tipo: Datos Pin: 2-13/A0-A5
Valor: Temperatura: 0-50ºC ±2ºC / Humedad: 20-90% ±5%
Ejemplo: Mostrar por la consola cada 5 segundos el valor de temperatura y humedad. Sensor conectado al pin 10.
Tipo: Datos Pin: 2-13/A0-A5
Valor: Temperatura: -40º - 125ºC ±0.5ºC / Humedad: 0-100% ±2%
Tipo: Analógico | Pin: A0-A5 | Valor: 0-100 (%) / 0..1023 |
Ejemplo: Encendido de un led cuando el nivel de luz es inferior al 25%
Tipo: Analógico | Pin: A0-A5 | Valor: -40…125ºC |
Ejemplo: Mostrar temperatura por la consola serie cada 5 segundos.
Sensor conectado al pin A3:
Tipo: Datos
Pin Trigger (emisión): 2-13/A0-A5
Pin Echo (recepción): 2-13/A0-A5
Valor: 2 – 400 cm
Ejemplo: Activación del led en el pin 13 cuando se detecta un objeto entre 10 y 80 cm de distancia |
Protocolos detectados: RC5, RC6, NEC, SONY, PANASONIC,JVC, SAMSUNG, WHYNTER, AIWA, LG, SANYO, MITSUBISHI, DENON.
Tipo: Datos Pin: 2-13/A0-A5
Valor: cadena de texto con el código en formato hexadecimal:
El valor devuelto por el bloque de recepción será una cadena de texto con valor vacío en caso de no detectar ningún código, y el valor del código en formato de texto hexadecimal en caso de detectar un código correcto.
Almacenamos el código en una variable de tipo texto:
Si utilizamos mandos genéricos RC5 como el modelo de Keyestudio, podemos usar el bloque para comparar los códigos recibidos y así identificar fácilmente cada tecla:
v1 = versión mando con teclas azules de keyestudio
v2 = versión mando con teclas grises de keyestudio
Ejemplo: Detectar y mostrar códigos por la consolas
En la consola obtendremos el valor de la cadena de texto en formato hexadecimal para cualquier mando a distancia compatible:
Ejemplo: Detectar valores de un mando de keystudio (v1=teclas azules, v2=teclas grises)
VERSIÓN OBSOLETA (valor numérico):
Tipo: Datos Pin: 2-13/A0-A5
Valor: código recibido / 0 = ningún código detectado.
Dependiendo el tipo de mando recibiremos unos códigos con valores de un tamaño u otro. Algunos mandos utilizan códigos de 32 bits, al almacenar el valor del código recibido en una variable de arduinoblocks se convierte a un valor decimal de 32 bits con signo y eso puede producir una alteración en el valor mostrado (número decimales extraños).
Para evitar este problema debemos tratar el valor como un valor entero sin signo de 32 bits añadiendo el bloque “Número entero sin signo” visto en el apartado de bloques matemáticos (3.2.3).
Ejemplo: Mostrar por consola el código recibido:
Si utilizamos mandos genéricos RC5 como el modelo de Keyestudio, podemos acceder a los códigos directamente con el bloque correspondiente:
Ejemplo: Detectar teclas “izquierda” y “derecha” de un mando a distancia
El encoder no tiene ninguna posición predefinida y no tiene límite de giro en ningún sentido. Automáticamente mantiene un valor interno con la posición virtual según los pasos en un sentido u otro, empezando siempre en 0.
Tipo: Datos Pin: Clk (A): 2 / Dt (A): 3
Valor: posición virtual del encoder (variable interna)
Obtener la posición “virtual” actual del encoder: | |
Fijar el valor de posición “virtual” a un valor. | |
| |
Ejemplo: Esperar hasta que el encoder recorra 5 saltos (clicks) hacia la derecha.
Tipo: Analógico Pin: A0-A5
Valor: 0-100 (%) / 0..1023
Ejemplo: Mostrar en la consola la posición X e Y: |
Tipo: Digital | Pin: 2-13/A0-A5 | Valor: 0/1 (F/V, Off/On) |
Tipo: Analógico | Pin: A0-A5/A0-A5 | Valor: 0-100 (%) / 0..1023 |
Ejemplo - detector de nivel de sonido alto. Sensor en pin A0 | ||
Tipo: Digital | Pin: 2-13/A0-A5 | Valor: 0/1 (F/V, Off/On) |
Tipo: Digital | Pin: 2-13/A0-A5 | Valor: 0/1 (F/V, Off/On) |
Tipo: Analógico | Pin: A0-A5/A0-A5 | Valor: 0-100 (%) / 0..1023 |
Ejemplo: Activación del led conectado al pin 13 en caso de detectar un nivel de humedad inferior al 20%. Sensor conectado en el pin A3
Tipo: Analógico | Pin: A0-A5 | Valor: 0-100 (%) / 0..1023 |
Tipo: Digital | Pin: 2-13/A0-A5 | Valor: 0/1 (F/V, Off/On) |
Tipo: Digital | Pin: 2-13/A0-A5 | Valor: 0/1 (F/V, Off/On) |
Tipo: Digital | Pin: 2-13/A0-A5 | Valor: 0/1 (F/V, Off/On) |
Tipo: Digital | Pin: 2-13/A0-A5 | Valor: 0/1 (F/V, Off/On) |
Tipo: Analógico | Pin: A0-A5/A0-A5 | Valor: 0-100 (%) / 0..1023 |
Tipo: Analógico | Pin: 0-A5/A0-A5 | Valor: 0-100 (%) / 0..1023 |
MQ-2 | Metano, butano, GLP, humo |
MQ-3 | Alcohol, Etanol, humo |
MQ-4 | Metano, gas natural comprimido (GNP) |
MQ-5 | Gas natural, GLP |
MQ-6 | Butano, GLP |
MQ-7 | Monóxido de carbono |
MQ-8 | Hidrógeno |
MQ-9 | Monóxido de carbono, gases inflamables |
MQ-135 | Benceno, alcohol, humo, calidad del aire |
MQ-131 | Ozono |
MQ-136 | Ácido sulfhídrico |
MQ-137 | Amoniaco |
MQ-138 | Benceno, tolueno, alcohol, acetona, propano, formaldeido, hidrógeno |
Tipo: Analógico | Pin: A0-A5 | Valor: 0-100 (%) / 0..1023 |
Tipo: Analógico | Pin: A0-A5 | Valor: 0-100 (%) / 0..1023 |
Tipo: Analógico | Pin: A0-A5 | Valor: -55…150ºC |
Internamente con cálculos trigonométricos se pueden obtener los ángulos de rotación en X (Roll) y en Y (Pitch). Sin embargo para calcular la rotación en Z (Yaw) debemos utilizar otro tipo de acelerómetros que se complementan con un giroscopio.
Tipo: Analógico | Pin: A0-A5 | Valor: -3G … 3G |
Ejemplo: Mostrar los valores de aceleración por consola serie
Tipo: Datos I2C | Pin: A4(SDA) / A5 (SCL) | Valor: m/s2, º , 0...1023 |
Tipo: Datos I2C | Pin: A4(SDA) / A5 (SCL) |
Adaptador/Conector para facilitar la conexión del Wii Nunchuck a los pines Arduino |
Tipo: Datos | Pin: Digital + Analógico | Valor: densidad |
Ejemplo de conexión:
Tipo: Datos | Pin: Digital + Analógico | Valor: NO2 / CO |
Tipo: Datos I2C | Pin: A4(SDA) / A5 (SCL) | Valor: RGB / HSV |
Ejemplo: obtener los valores R.G,B del color detectado
Ejemplo: detectar algunos colores
Tipo: Datos I2C | Pin: A4(SDA) / A5 (SCL) | Valor: presión (mb) |
Tipo: Datos 1-wire | Pin: Digital | Valor: Temperatura ºC |
Tipo: Datos I2C | Pin: A4(SDA) / A5 (SCL) | Valor: CO2 (ppm) |
Ejemplo: detección de varios gestos básicos
Uso de otros sensores:
arduinoblocks implementa los sensores vistos anteriormente para simplificar el uso. En algunos casos procesa los datos leídos para obtener un valor (por ejemplo el sensor de temperatura NTC o LM35) y en otros casos “normaliza” el valor a un rango de % (0 a 100) para simplificar su uso.
En algunos casos puede que necesitemos leer el valor del sensor directamente para obtener una mayor precisión o simplemente porque el sensor no está implementado en arduinoblocks y necesitamos usar los bloques de entrada/salida genéricos para obtener datos del sensor digital o analógico.
Ejemplo 1: Lectura del valor de luz con LDR para obtener más precisión.
Sensor de luz: valor del sensor en % (de 0 a 100) | Valor del sensor directamente de la entrada analógica (valor de 0 a 1023) |
Ejemplo 2: sensor de presión analógico.
Este sensor modificar su resistencia en función de la presión que se ejerce sobre él y por tanto conectado a una entrada analógica variará el voltaje leído en ella. La fuerza aplicada se traduce en un valor analógico leído de 0 a 1023. En estos casos debemos consultar las especificaciones del fabricante para interpretar el dato obtenido.
Tipo: Digital | Pin: 2-13 | Valor: 0/1 (F/V, Off/On) |
Ejemplo: Parpadeo de un led cada segundo. Led conectado al pin 5:
Tipo: PWM | Pin: 3,5,6,9,10,11 | Valor: 0-255 |
Ejemplo: Aumento progresivo de la intensidad del led:
Tipo: PWM Pin R/G/B: 3,5,6,9,10,11 Valor: Color |
Ejemplo de conexión de un led RGB cátodo (-) común | Ejemplo de conexión de un módulo led RGB ánodo (+) común, |
Cada color se activa mediante un valor de 0 (mínimo) a 255 (máximo), en caso de especificar el tipo “ánodo común” el valor se invertirá internamente automáticamente ( 255 - valor especificado).
Tipo: Digital | Pin: 2-13 | Valor: 0/1 (F/V, Off/On) |
Ejemplo: Activación/desactivación de un relé cada 5 segundos:
Tipo: Digital | Pin: 2-13 | Hz: frecuencia del tono / Ms: duración en mseg. |
Mediante el bloque de tonos predefinidos podemos indicar las notas musicales en lugar de tener que indicar el valor de la frecuancia de forma numérica.
Ejemplo: reproducir tono desde 1000 hz hasta 5000 hz en pasos de 100hz
con una duración de 50ms para cada tono
Ejemplo: Tonos de medio segundo. Zumbador conectado al pin 3:
El formato RTTTL es un formato creado por Nokia para las primeras melodías de los teléfonos móviles. Existen sitios webs donde descargar estas melodías.
Ejemplo: melodía Pac-Man en formato RTTTL
pacman:d=4,o=5,b=112:32b,32p,32b6,32p,32f#6,32p,32d#6,32p,32b6,32f#6,16p,16d#6,16p,32c6,32p,32c7,32p,32g6,32p,32e6,32p,32c7,32g6,16p,16e6,16p,32b,32p,32b6,32p,32f#6,32p,32d#6,32p,32b6,32f#6,16p,16d#6,16p,32d#6,32e6,32f6,32p,32f6,32f#6,32g6,32p,32g6,32g#6,32a6,32p,32b.
Información sobre el formato RTTTL:
https://en.wikipedia.org/wiki/Ring_Tone_Transfer_Language
Descarga de melodías RTTTL:
http://arcadetones.emuunlim.com/
El bloque de melodías RTTTL predefinidas permite reproducir algunas melodías de forma sencilla.
Tipo: Digital | Pin: 3 | Protocolo y código IR a enviar |
Ejemplo: enviar el código de Sony para encender/apagar la TV
Código: 0xA90 (decimal: 2704)
Para obtener la información de un mando IR cualquiera y decodificar el protocolo, número de bits y código de cada tecla podemos seguir este tutorial (tutorial con código avanzado en Arduino IDE)
https://learn.adafruit.com/using-an-infrared-library/hardware-needed
Uso de otros actuadores:
Al igual que con los sensores, puede que tengamos actuadores digitales o analógicos no implementados en arduinoblocks o que queramos controlar de una forma diferente a como lo hacen los bloques. Para ello podemos utilizar directamente los bloques de entrada/salida genéricos.
Ejemplo 1: Control de un led RGB con salidas analógicas PWM:
Con el bloque específico: |
Con los bloques genéricos (Naranja => Rojo = 204, Verde=153, Azul=51) |
Ejemplo 2: Control de un relé con salida digital
Con bloque específico: |
Con bloque genérico |
Ejemplo 3: Control de un led con salida digital
Con bloque específico: |
Con bloque genérico |
Uno de los periféricos más utilizados y versátil que podemos conectar a Arduino es una pantalla LCD (display) para mostrar información e interactuar con el usuario.
La pantalla LCD más sencilla y utilizada es el de tipo alfanumérico de 2 líneas y 16 caracteres por línea, o de 4 líneas y 20 caracteres por línea
LCD 2x16 | LCD 4x20 |
arduinoblocks nos permite conectar una pantalla de dos forma diferentes:
Necesitamos 4 bits para datos y dos señales de control En (Enable) y Rs (Register select). La conexión RW la conectamos fija a GND. Además se debe añadir una resistencia ajustable o un potenciómetro para regular el contraste de la pantalla.
Esta conexión es bastante compleja y utiliza muchos pines, es muy recomendable utilizar la pantalla con conexión i2c.
-Iniciar con conexión de 4 bits:
Sistema de filas y columnas en una pantalla LCD de 2x16: |
Mediante click derecho y la opción ayuda se abre el editor de símbolos |
El bloque definir símbolo normalmente irá dentro del bloque “inicializar” de Arduino.
Ejemplo: definir un símbolo con una cara sonriente
e imprimirlo en el centro de la primar fila de la pantalla LCD
Copiamos el código del mapa de bits:
B00000,B00000,B00000,B01010,B00000,B10001,B01110,B00000
Y usamos el bloque imprimir símbolo indicando el símbolo (1 al 8) y la posición:
En arduinoblocks se implementa un nuevo sistema de pantallas LCD basada en conectividad I2C que permite conectar hasta 8 pantallas al mismo bus I2C y utilizarlas de forma independiente y simultanea. Esta opción es totalmente recomendable en contra de la conexión del bus de 4-bits.
Conexión por bus de comunicaciones I2C:
Es la forma más sencilla, necesitamos una pantalla con interfaz I2C o un módulo adaptador que realiza todo el trabajo.
SDA = Arduino Pin A4 SCL = Arduino Pin A5 |
Permite conectar y controlar hasta 8 pantallas en el mismo bus I2C:
Las pantallas OLED (leds orgánicos) son muy comunes en la actualidad, y las podemos incluir en nuestros proyectos con Arduino de una forma bastante sencilla.
La pantalla más habitual para Arduino y la soportada por arduinoblocks es la pantalla monocromo de 0.96″ (pequeña pero matona!) con conexión i2c.
Este tipo de pantalla tiene un tamaño de 128×64 píxeles (Ancho x Alto).
http://shop.innovadidactic.com/index.php?id_product=751&controller=product
Editor de mapa de bits:
Ejemplo: procesar una imagen con el editor de mapa de bits
y mostrarla en la pantalla OLED
Ajuste de parámetros en el editor de bitmaps:
Copiar los datos obtenidos:
Programa de ejemplo con los datos anteriores para mostrar la imagen:
Resultado:
+Información sobre gráficos y animaciones en pantallas OLED:
http://arduinoblocks.didactronica.com/2019/05/graficos-y-animaciones-en-pantallas/
Origen: X1, Y1
Destino: X2,Y2
Origen: X1, Y1
Ancho: W
Alto: H
Podemos seleccionar si queremos que el rectángulo esté relleno o sólo se dibuje el borde.
Centro: X,Y
Radio: R
Podemos seleccionar si queremos que el círculo esté relleno o sólo se dibuje el contorno.
La memoria EEPROM es un memoria interna del microcontrolador de Arduino que nos permite guardar información. Tiene la propiedad de no ser volátil, por lo que la información permanece guardada en ella aunque quitemos la alimentación eléctrica.
Esta memoria es perfecta para almacenar información de configuración de la aplicación o valores de estado que se necesiten recuperar después de un corte de la alimentación eléctrica.
El microcontrolador de la placa Arduino UNO tiene 1024 bytes de memoria EEPROM, sin embargo en arduinoblocks cada variable usada internamente utiliza 4 bytes por lo que a la hora de almacenar o recuperar una variable de la memoria EEPROM sólo podemos almacenar en 256 posiciones (256 x 4 = 1024 bytes).
Direccionamiento Arduino: 0-1023
| Direccionamiento arduinoblocks: 0-255
|
Ejemplo: Lee la temperatura cada minuto y guarda la temperatura máxima en la memoria EEPROM para reservarla aunque cortemos la alimentación:
IMPORTANTE:
La memoria EEPROM suele venir inicializada a 0xFF
por lo que para un uso correcto deberíamos ponerla a 0 en algunos casos:
Desde la placa Arduino es fácil controlar varios tipos de motores.
Las salidas de la placa Arduino no proporcionan suficiente corriente para controlar un motor de corriente continua (Arduino proporciona unos 50mA y un motor puede consumir unos 1000mA) por lo que necesitaremos realizar un pequeño circuito con un transistor para controlar una corriente mucho mayor.
Utilizaremos un transistor NPN en modo corte/saturación que permitirá, como un interruptor, el paso de una intensidad de corriente mucho más alta desde un fuente de alimentación auxiliar.
Esquema de conexión: | Montaje en placa de prototipos |
La pila de 9v genera la corriente necesaria para mover el motor. A través del pin 3 generamos la señal que activa el transistor y permite el paso de corriente de la pila. Si utilizamos la salida como PWM podremos controlar la velocidad del motor (si se escribe un valor bajo, menos de 100 aproximadamente, el motor no girará por no aplicarle la suficiente energía)
Activar giro del motor: | Activar giro controlando velocidad |
Ejemplo: Aumento progresivo de la velocidad
Si necesitamos controlar además el sentido de giro de motor debemos utilizar un “puente en H” que nos permite invertir la polaridad en el motor. Lo más fácil es utilizar un driver integrado como el chip L293D o un módulo para Arduino que integre todos los componentes.
Esquema de un puente en H para controlar la dirección de giro de un motor | Módulo típico con configuración en puente H para control de motores de C.C. |
Estos módulos suelen integrar el control para dos motores. Los pines de un módulo de control de motores en puente en H suele tener estas conexiones:
IN1, IN2 | Controla el sentido de giro del motor 1
| ||||||
IN3, IN4 | Controla el sentido de giro del motor 2
| ||||||
EN1 | Habilita el motor 1 (control de velocidad del motor 1 con PWM) | ||||||
EN2 | Habilita el motor 2 (control de velocidad del motor 2 con PWM) |
Pines 4,5 (IN1, IN2): control de giro Pin 6 (EN1): control velocidad PWM | Giro cada 5s en un sentido con distinta velocidad |
Ejemplo: control de 2 motores C.C. con módulo L298N y alimentación externa
Los servomotores son motores DC a los que se les ha añadido una reductora y una electrónica de control PID que permite controlar el motor situándolo en una posición muy precisa. El servomotor está intentando siempre situarse en la posición indicada, de forma que si se le fuerza o impide ir hasta la posición indicada intentará moverse a la posición indicada continuamente.
Los servomotores pueden situarse en una posición entre 0º y 300º aproximadamente según el modelo. Un servomotor no permite el giro libre a no ser que se modifique con ese propósito.
El control de la posición de un servomotor se realiza mediante PWM por lo que necesitamos conectarlo a una salida digital de tipo PWM.
En arduinoblocks tenemos un bloque que nos permite controlar fácilmente un servomotor indicándole la posición en grados donde queremos que se sitúe y el retardo en milisegundos para darle tiempo a que se mueva hasta la posición indicada.
Ejemplo: movimiento de un servomotor conectado al pin 5:
Ejemplo: Mover el servo de 0 a 300 grados de 10 en 10 grados
Existe un tipo especial de servomotor que permite la rotación continua. En algunos casos se trata de servomotores “trucados” de forma que se modifican para permitir la rotación continua quitando los topes mecánicos y se sustituye el potenciómetro por un divisor de tensión con dos resistencia iguales (en algunos casos no se ponen resistencias y se bloquea el potenciómetro para que no gire dejándolo justo en su punto central).
En cualquier caso también podemos comprar un servomotor de rotación continua listo para funcionar sin tener que hacer bricolaje.
El control de un servomotor de rotación continua se realiza de igual manera, pero su reacción es diferente.
0º | Giro en un sentido (máxima velocidad) | |
90º | Parado | |
180º | Giro en sentido contrario (máxima velocidad) |
Si utilizamos valores cercanos a 90º el motor girará a una velocidad más lenta en cada uno de los sentidos.
80º | Giro en un sentido (velocidad lenta) | |
100º | Giro en sentido contrario (velocidad lenta) |
Ejemplo: robot propulsado por dos servos de rotación continua