Archivo de la categoría: Curso Iniciación 2018

Entender Arduino

Arduino no solo es una placa azul muy popular con la que hacer semáforos, encender leds o usado en las impresoras 3D. Arduino va mucho más allá y vamos a verlo en este capítulo.

Primer Arduino:

Ya hemos visto anteriormente qué es Arduino: https://aprendiendoarduino.wordpress.com/2018/04/02/que-es-arduino-7/

A modo de resumen los tres componentes de Arduino son:

Arduino = HW + SW + Comunidad

Arduino simplifica el trabajo con microcontroladores y ofrece las siguientes ventajas: barato, multiplataforma, entorno de programación sencillo, software libre y extensible mediante librerías en C++, hardware libre y extensible.

Al trabajar con Arduino, se manejan conceptos de diferentes tecnologías que a priori no tienen nada que ver entre ellos pero que los unifica: electronica digital y analogica, electricidad, programación, microcontroladores, tratamiento de señales, protocolos de comunicación, arquitectura de procesadores, mecánica, motores, diseño de placas electrónicas etc…

Diez razones para usar Arduino: http://www.modulo0tutoriales.com/10-razones-para-usar-arduino/

Mitos sobre Arduino que todo el mundo cree y no son verdad: https://www.baldengineer.com/5-arduino-myths.html

HW Arduino

El HW de Arduino es básicamente una placa con un microcontrolador. Un microcontrolador (abreviado µC, UC o MCU) es un circuito integrado programable, capaz de ejecutar las órdenes grabadas en su memoria. Está compuesto de varios bloques funcionales, los cuales cumplen una tarea específica. Un microcontrolador incluye en su interior las tres principales unidades funcionales de una computadora: unidad central de procesamiento, memoria y periféricos de entrada/salida.

Características de un Microcontrolador:

  • Velocidad del reloj u oscilador
  • Tamaño de palabra
  • Memoria: SRAM, Flash, EEPROM, ROM, etc..
  • I/O Digitales
  • Entradas Analógicas
  • Salidas analógicas (PWM)
  • DAC (Digital to Analog Converter)
  • ADC (Analog to Digital Converter)
  • Buses
  • UART
  • Otras comunicaciones.

El hardware de Arduino usa microcontroladores generalmente Atmel AVR. Los microcontroladores más usados en las plataformas Arduino son el Atmega168, Atmega328, Atmega1280, ATmega8 por su sencillez, pero se está ampliando a microcontroladores Atmel con arquitectura ARM como el Atmel SAMD21 o los ST STM32, y también Intel.

Arduino dispone de una amplia variedad de placas y shields para usar dependiendo de nuestras necesidades.

Placas Arduino: https://aprendiendoarduino.wordpress.com/2017/06/19/placas-arduino-2/

Un shield es una placa compatible que se puede colocar en la parte superior de los arduinos y permite extender las capacidades del arduino.

Shields Arduino: https://aprendiendoarduino.wordpress.com/2017/06/20/shields-arduino-3/

HW Compatible Arduino

Además del HW oficial de Arduino tenemos infinidad de placas compatibles con Arduino.

Dentro del HW compatible con Arduino podemos distinguir tres tipos:

Listados de placas Arduino y compatibles:

Dentro del entorno Arduino, podemos encontrar placas basadas en el microcontrolador ESP8266 con wifi integrado y pila de protocolos TCP/IP que no sigue el factor de forma de Arduino. De este microcontrolador han salido muchas placas como las wemos https://www.wemos.cc/

Resultado de imagen de wemos.jpg

Placas de otros fabricantes de microcontroladores como Microchip o Mediatek con sus modelos ChipKit o LinkIt.

Documentación de la placa linkit one:

SW Arduino

El software de Arduino es un IDE, entorno de desarrollo integrado (siglas en inglés de Integrated Development Environment). Es un programa informático compuesto por un conjunto de herramientas de programación.

El IDE de Arduino es un entorno de programación que ha sido empaquetado como un programa de aplicación; es decir, consiste en un editor de código, un compilador, un depurador y un constructor de interfaz gráfica (GUI). Además incorpora las herramientas para cargar el programa ya compilado en la memoria flash del hardware.

Es destacable desde la aparición de la versión 1.6.2 la incorporación de la gestión de librerías y la gestión de placas muy mejoradas respecto a la versión anterior y los avisos de actualización de versiones de librerías y cores.

Todos lo cambios en la versiones pueden verse en: https://www.arduino.cc/en/Main/ReleaseNotes

Código fuente del IDE de Arduino está disponible en: https://github.com/arduino/Arduino/  y las instrucciones para construir el IDE desde código fuente pueden verse en: https://github.com/arduino/Arduino/wiki/Building-Arduino

Podemos también ver los problemas/bugs detectados de la versión actual y hacer un seguimiento de ellos: https://github.com/arduino/Arduino/issues y en http://forum.arduino.cc/index.php?board=2.0

En principio el IDE de arduino solo tenía soporte para las placas Arduino y los clones o forks con los mismos microcontroladores que los Arduinos oficiales. Desde la versión 1.6.2 del IDE de arduino.cc y gracias al gestor de placas, podemos añadir soporte a otros microcontroladores y placas al IDE de Arduino, como al ESP8266.

Listado de URLs para soporte de tarjetas no oficiales: https://github.com/arduino/Arduino/wiki/Unofficial-list-of-3rd-party-boards-support-urls

Arduino.cc tiene disponible un IDE on-line dentro del entorno Arduino Create https://create.arduino.cc/ que es una plataforma on-line integrada que permite escribir código, acceder a contenido, configurar placas y compartir proyectos, muy enfocado al Internet de las Cosas (IoT).

También existen otros IDEs alternativos como Atmel Studio http://www.atmel.com/Microsite/atmel-studio/ para microntroladores Atmel.

El software hecho para Arduino con el IDE es portable, es decir, el mismo firmware que hemos hecho para un Arduino/Microcontrolador, sirve para otras placas Arduino u otras placas compatibles Arduino como el ESP8266.

Comunidad Arduino

Un factor del éxito de Arduino ha sido la comunidad que está apoyando este proyecto y que día a día publica nuevo contenido, divulga y responde a las dudas.

En Internet hay disponible todo tipo de cursos, tutoriales, herramientas de consulta, proyectos, etc… que ayudan a que se pueda usar Arduino con facilidad.

El primer sitio donde empezar para trabajar con Arduino es http://www.arduino.cc/ y el segundo sitio el playground de Arduino http://playground.arduino.cc/

Arduino playground es un wiki donde todos los usuarios de Arduino pueden contribuir. Es el lugar donde publicar y compartir código, diagrama de circuitos, tutoriales, trucos, cursos, etc.. y sobretodo el lugar donde buscar cuando tengamos dudas, un problema, una librería adecuada para nuestro proyecto, etc… Esa la base de datos de conocimiento por excelencia de Arduino.

Arduino playground: http://playground.arduino.cc/

Algunos apartados importantes en playground.

Otro lugar donde la comunidad colabora, se puede buscar información y preguntar las dudas que tengamos, es el foro Arduino: http://forum.arduino.cc/.

También existen lugares no oficiales de Arduino donde resolver nuestras dudas:

Arduino en las redes sociales:

Otro lugar de encuentro de la comunidad son diversos portales donde se publican proyectos con Arduino:

Por último, también hay espacios locales para la comunidad, son los llamados hacklabs hackerspace, makerspace, etc.. que aunque hay ciertas diferencias entre unos y otros, se trata de un sitio físico donde gente con intereses en ciencia, nuevas tecnologías, y artes digitales o electrónicas se puede conocer, socializar y colaborar. Puede ser visto como un laboratorio de comunidad abierta, un espacio donde gente de diversos trasfondos puede unirse. Pone al alcance de aficionados y estudiantes de diferentes niveles la infraestructura y ambiente necesarios para desarrollar sus proyectos tecnológicos.

Hacklab: https://es.wikipedia.org/wiki/Hacklab

Mejores prácticas Hackerspaces: https://elplatt.com/new-hackerspace-design-patterns

Listado de Hackerspaces: https://hackerspaces.org/wiki/List_of_ALL_Hacker_Spaces

También hay otro espacio local algo diferente que son los fablabs: es un espacio de producción de objetos físicos a escala personal o local que agrupa máquinas controladas por ordenadores.

Fablab: https://es.wikipedia.org/wiki/Fab_lab

Qué es un fablab: http://fab.cba.mit.edu/about/charter/

Este podcast explica las diferencias entre estos espacios: http://make.cesargarciasaez.com/2016/02/01/la-hora-maker-010-fablabs-makespaces-hackerspaces-y-hacklabs/

Movimiento maker: https://en.wikipedia.org/wiki/Maker_culture

Más información sobre la comunidad, makerspaces y fablabs, ver los artículos:

Filosofía Arduino

Por último para entender bien lo que es Arduino, es recomendable ver el documental de Arduino de unos 30 minutos de duración. Arduino the Documentary: http://blog.arduino.cc/2011/01/07/arduino-the-documentary-now-online/

IoT Manifesto: https://create.arduino.cc/iot/manifesto/

We believe that the best way to grow this environment is to develop open source platforms and protocols to propose as an alternative to the myriad of proprietary hardware and software platforms each one of the big players are developing.
We believe in creating tools that make these technologies understandable to the most diverse set of people as possible, this is the only way to make sure innovation benefits most of humanity.
We propose that connected devices should be: Open, Sustainable and Fair.

We foresee a world with billions of connected smart objects. These smart objects will be composed and orchestrated, thus making the Internet of Things a reality. The IoT will be the eyes, noses, arms, legs, hands of a new, extended, cyber body. The nervous system of such a body will be the Internet, allowing the interaction with a distributed intelligence made of hardware processors and human minds, behaviors, software procedures, and services, shared in the Cloud.

Anuncios

Ejemplos Arduino con Arrays y Strings

Efectos con leds mejorado

El ejemplo anterior de los LEDs con el efecto del coche fantástico puede hacerse de una forma más eficiente con el uso de los arrays y la estructura de control for. Además hacer otros efectos de luces o cambios en el realizado es mucho más sencillo usando arrays.

Hacer el efecto del coche fantástico usando arrays y la estructura de control for.

Pistas:

int pinArray[] = {2, 3, 4, 5, 6};

for (int i = 0; i > 6; i++) {
    digitalWrite(pinArray[i], HIGH);
    delay(timer);
    digitalWrite(pinArray[i], LOW);
    delay(timer);
  }

O simplificado:

for (int i = 2; i < 6; i++) {
    digitalWrite(i, HIGH);
    delay(timer);
    digitalWrite(i, LOW);
    delay(timer);
  }

Tutorial: https://www.arduino.cc/en/Tutorial/KnightRider

Estructura de control for: https://www.arduino.cc/en/Reference/For

Esquema de conexión:

Solución: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio09-CocheFantasticoMejorado

Control Velocidad del Efecto de Leds

Añadir el cambio de velocidad dentro del código al leer de un potenciómetro de forma que no haya que esperar a un ciclo de loop para cambiar la velocidad: “timer = analogRead(A0);”

Esquema de conexión:

O usando un LDR para el control de velocidad:

Solución: quitar los comentarios de https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio09-CocheFantasticoMejorado

Probar a hacer otros efectos como: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio48-Efectos_Led

Arrays

Leer las entradas analógicas de la A0 a la A5 y almacenar en un array para mostrarlo cada 5 segundos. Hacer lo mismo con las entradas digitales de la 2 a la 7.

Solución: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio49-Arrays

Leer Strings por Puerto Serie

Aprender a manejar cadenas de caracteres es muy importante, a lo largo del curso se va a usar muy a menudo para comunicaciones y para interaccionar con el usuario.

Tutoriales para aprender a usar los Strings:

Hacer un programa donde al iniciar Arduino pregunta que introduzca un string cualquiera y lo mando a Arduino por puerto serie usando el monitor serie. Luego lo almacena en una variable y muestra lo leído por el puerto serie.

No olvidar poner en el setup() la inicialización del puerto serie: Serial.begin(9600);

Para leer por el puerto serie usar este código:

String cadena_leida;

while (Serial.available() == 0){
    //No hago nada
  }
  do{
    caracter_leido = Serial.read();
    cadena_leida += caracter_leido;
    delay(5);
  }  while (Serial.available() > 0);

La función Serial.available() me devuelve el número de bytes (caracteres) disponibles para leer del puerto serie. Estos son datos que han llegado al puerto serie de Arduino y se almacenan en el buffer de lectura de la UART. Más información: https://www.arduino.cc/en/Serial/Available

Serial.read() lee un caracter del puerto serie y los quita del buffer. Más información: https://www.arduino.cc/en/Serial/Read

NOTA para entender lo que está haciendo el programa poner la constante DEBUG a valor 1

Solución: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio10-LeerStringSerie

Encender LED por Puerto Serie

Modificar el ejemplo anterior para que encienda el led de Arduino (pin 13) cuando mande la cadena “enciende” y lo apague cuando mande la cadena “apaga”.

Esquema de conexión:

Para comparar el texto introducido se proponen dos opciones, probar con ambas:

if (leido.startsWith("enciende"))

if (leido == "enciende")

Solución: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio11-EncenderLedSerie

NOTA: Al igual que leemos y analizamos un valor con lo recibido por el puerto serie, la forma de trabajar si la comunicación es por ethernet, wifi, bluetooth, XBee, etc… es la misma, Arduino está escuchando por el puerto de comunicación y cuando recibe una petición válida ejecuta una acción. Los módulos de comunicación hablan con el microcontrolador a través los puertos serie (UART), I2C o SPI, cuyo funcionamiento es similar a lo visto en estas dos últimas prácticas.

Ejemplos Arduino con Estructuras de Control

Alarma Umbral

Partiendo del sketch https://www.arduino.cc/en/Tutorial/ifStatementConditional modificarlo para que en lugar de encender un led cuando supere el valor de umbral, simular un envío de un mensaje de alarma mediante Serial.println() cada vez que haya una alarma y se supere el umbral (solo cuando lo sobrepase la primera vez, no de forma continua) y otro mensaje de recuperación cada vez el valor este por debajo del umbral (solo cuando baje la primera vez, no de forma continua).

Esquema de conexión:

Ejecutar el sketch https://www.arduino.cc/en/Tutorial/ifStatementConditional y comprobar su funcionamiento.

El siguiente paso es añadir un texto de alarma y recuperación cuando se supere y cuando esté por debajo. Una vez comprobado que manda continuamente el texto, pensar cómo modificar el sketch para que lo mande solo cuando se supera la primera vez o cuando vuelve al estado normal la primera vez. Esto también sirve para para usar el digitalWrite una vez en lugar de hacerlo continuamente.

Diagrama de flujo:

Solución: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio07-Detectar_Alarma

Solución Visualino:

Ver en el serial plotter la representación gráfica de lo que está ocurriendo.

  • rojo: umbral
  • verde: estado alarma
  • azul: lectura del potenciómetro

Si comentamos la zona de “print values” veremos que solo se imprime por pantalla “alarma” y “alarma recuperada” cuando se pasa por el umbral, pero no continuamente.

Histéresis

Comprobar el efecto del programa cuando estamos justo en el umbral donde tendremos continuas alarmas y recuperaciones. Para solucionar esto añadir histéresis.

Diagrama de flujo:

Solución: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio08-Detectar_Alarma_Histeresis

Solución Visualino:

Cambio de comportamiento con un umbral medio de 400 y una histéresis de 50. Ver como cambia el umbral al pasar de estado de alarma a recuperado y viceversa.

Hacer este mismo ejemplo con la sonda de temperatura TMP36 https://www.arduino.cc/documents/datasheets/TEMP-TMP35_36_37.pdf con y sin histéresis.

Esquema de conexión:

Más ejemplos en: https://www.arduino.cc/en/Tutorial/BuiltInExamples

Operadores

Un operador es un elemento de programa que se aplica a uno o varios operandos en una expresión o instrucción. Un operador, es un símbolo que indica al compilador que se lleve a cabo ciertas manipulaciones matemáticas o lógicas.

Los operadores son símbolos que representan una operación como las básicas de suma, resta, multiplicación y división, (+, -, *, /) existen las booleanas (true y false) para las operaciones de comparación como AND, O, NOT, o las de comparación ==, !=, =, que son muy utilizados en las instrucciones de tipo if.

Aritméticos

Los operadores aritméticos que se incluyen en el entorno de programación son suma, resta, multiplicación, división, módulo y asignación. Estos devuelven la suma, diferencia, producto, cociente o resto (respectivamente) de dos operandos.

La operación se efectúa teniendo en cuenta el tipo de datos que hemos definido para los operandos (int, double, float, etc..), por lo que, por ejemplo, si definimos 9 y 4 como enteros “int”, 9 / 4 devuelve de resultado 2 en lugar de 2,25 ya que el 9 y 4 se valores de tipo entero “int” (enteros) y no se reconocen los decimales con este tipo de datos.

Esto también significa que la operación puede sufrir un desbordamiento si el resultado es más grande que lo que puede ser almacenada en el tipo de datos. Recordemos el alcance de los tipos de datos numéricos explicado anteriormente.

Si los operandos son de diferente tipo, para el cálculo del resultado se utilizará el tipo más grande de los operandos en juego. Por ejemplo, si uno de los números (operandos) es del tipo float y otra de tipo integer, para el cálculo se utilizará el método de float es decir el método de coma flotante y el resultado será un float..

Elegir el tamaño de las variables de tal manera que sea lo suficientemente grande como para que los resultados sean lo precisos que deseamos. Para las operaciones que requieran decimales utilizar variables tipo float, pero hay que ser conscientes de que las operaciones con este tipo de variables son más lentas a la hora de realizarse el cómputo.

En Visualino podemos encontrar los operadores aritméticos en el apartado “Math”

Compuestos

Las operadores compuestos combinan una operación aritmética con una variable asignada. Estas son comúnmente utilizadas en los bucles tal como se describe más adelante. Estas asignaciones compuestas pueden ser:

En Visualino no hay operadores compuestos.

Comparación

Operadores de comparación. Las comparaciones de una variable o constante con otra se utilizan con frecuencia en las estructuras condicionales del tipo if, while, etc.. para testear si una condición es verdadera.

En Visualino los operadores de comparación están en el apartado de “Logic”

Booleanos

Los operadores lógicos o booleanos son usualmente una forma de comparar dos expresiones y devuelve un VERDADERO o FALSO dependiendo del operador. Existen tres operadores lógicos, AND (&&), OR (||) y NOT (!), que a menudo se utilizan en estamentos de tipo if.

En Visualino los operadores booleanos están en el apartado de “Logic”

Curiosa forma de explicar las operaciones lógicas mediante un vídeo: http://es.gizmodo.com/las-funciones-de-los-circuitos-brillantemente-explicad-1570812992

Otras funciones disponibles en el core de Arduino

Conclusión

Un resumen de los operadores en C /C++ y más información:

Efectos con LEDs

Ya sabemos como hacer parpadear un led, podemos hacer efectos con leds, encendiendose y apagandose en una secuencia concreta para hacer efectos y comprender la programación de Arduino.

Coche Fantástico Simple

Hacer el efecto de las luces del coche fantástico con 5 leds conectados a los pines 2, 3, 4, 5 y 6.

Esquema de conexión:

Recordar poner la resistencia adecuada a cada led. Ley de ohm: V = I * R, si el voltaje es de 5 V y queremos que al LED sólo le lleguen entre 5 mA (0.005 A) y 20 mA (0.02 A), entonces usar una resistencia entre 250 y 1000 ohms.

Código de colores de las resistencias.

Como primera aproximación se puede ejecutar en cada loop el encendido y apagado de cada led esperando un tiempo entre cada encendido y apagado. Para hacer debug, sacar por puerto serie el estado de cada led. Es una extensión del programa blink pero para varios leds.

Solución Visualino:

Solución: Ejercicio06-CocheFantasticoSimple: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio06-CocheFantasticoSimple

Control Velocidad del Efecto de Leds

Con el mismo montaje anterior, añadir un potenciómetro para controlar la velocidad del efecto de los leds.

Añadir en el código al inicio del loop() la línea “timer = analogRead(A0);” para que la velocidad de los leds sea la leida de la entrada analógica de un potenciómetro. Descomentar la línea del código usado en el paso anterior.

Conexión del potenciómetro:

Diagrama

Solución Visualino:

Solución: Ejercicio06-CocheFantasticoSimple: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio06-CocheFantasticoSimple

Leer este tutorial y ver solo la primera solución: http://www.arduino.cc/en/Tutorial/KnightRider, las otras soluciones la veremos justo después de ver arrays y nos servirá para entender mejor su uso.

Otros Efectos

Probar a cambiar el código para hacer otros efectos cambiando el código.

Probar este efecto: https://github.com/jecrespo/Aprendiendo-Arduino/blob/master/Ejercicio48-Efectos_Led/Ejercicio48-Efectos_Led.ino