Arduino (IoT): Simple Tutorial LED

Arduino Honduras Santiapps Marcio Valenzuela

Tutorial LED

La idea es sencilla.  Usaremos código de computadora y un micro controlador (mcu) para controlar el flujo de electricidad.  En este tutorial aprenderemos como controlar el flujo de electricidad hacia una LED desde una micro controller board.

Requisitos:

  1. Computadora (mac)
  2. Arduino MEGA (u otra variante Arduino) o incluso Arduino clone, Edison, Raspberry…  Este tutorial en particular usa una Arduino MEGA.
  3. LED
  4. Breadboard
  5. Arduino IDE (https://www.arduino.cc/en/Main/Software)

(Si solo quieren ir a ver como se conecta todo, vayan al MARCADOR)

Terminología

Breadboard es un tablero de filas y columnas de agujeros.  Esta matriz de agujeros se usa para interconectar componentes electricos sin usar soldadura.

Arduino MEGA es una micro controller board, mcu.  Hay muchas otras pero básicamente escribimos código para decirle al mcu como administrar la electricidad.  El código dice cuando, cuanta y adonde enviar la electricidad.

Arduino Honduras Santiapps Marcio Valenzuela
Arduino LED setup

La LED es la luz en la bolsa del centro.

La cosa rara en la derecha es un resistor.  Básicamente cuando se quiere regular el flujo de electricidad en un circuito se usa un resistor.  En este caso necesitamos asegurarnos que no mucha electricidad fluya ya que podría quemar la LED porque son componentes bien sensibles.

Antes de iniciar entendamos como se arma un proyecto Arduino.  Básicamente funciona así:

  1. La computadora se usa para escribir y subir el codigo al mcu y al mismo tiempo para suplir electricidad a ella.
  2. Las conexiones eléctricas se hacen entre la mcu y los componentes a controlar.

Veamos la mcu:

Arduino Honduras Santiapps Marcio Valenzuela
Arduino MEGA

El puerto metálico en la izquierda superior es para el cable USB.  Este es el interfaz entre la computadora y la board (MEGA).  Este puerto se usa para subir el código a la MEGA y proveerla de electricidad.

Adicionalmente, cuando un proyecto esta listo para hacerlo móvil, ya no es necesario que opere conectado a la computadora.  Es decir, la MEGA y sus componentes pueden seguir operando ya que las instrucciones están en la MEGA.  Sin embargo siempre es necesario suplir electricidad a la MEGA y sus componentes.  Para esto se usa el puerto tambor negro en la esquina inferior izquierda.  Aquí se puede conectar battery packs para suplir energía al proyecto móvil.

Si se fijan hay varios pines alrededor de las orillas de la MEGA.  Estos son los pines por donde la MEGA puede enviar electricidad a los componentes.  En este caso la MEGA cuenta con:

– 16 pines análogos (A0-A15)

– 54 pines digitales (de los cuales algunos están dedicados a comunicación y otros son PWM

Este proyecto es muy pequeño para una MEGA pero mi UNO esta ocupada con un proyecto mas complejo.

Entonces la idea seria, recibir electricidad de la USB, pasarla al pin donde este conectado el LED y mandar instrucciones para controlar ese pin.

(A)  Podríamos conectar todo así:

Arduino Honduras Santiapps Marcio Valenzuela
Conexión LED

pero hay 2 problemas: (1) que no podríamos controlar la cantidad de electricidad que fluye al LED y (2) la conexión de la LED seria inadecuada y podría aflojarse.

(B)  Típicamente se usa una conexión con cables sin-soldar como estos:

Arduino Honduras Santiapps Marcio Valenzuela
Conexión con cables sin-soldar

pero en este caso particular que necesitamos otro componente en el circuito (el resistor), se complicaría agregarlo.  Es por eso que usamos las breadboards:

Arduino Honduras Santiapps Marcio Valenzuela
Breadboard

(C)  Una breadboard típicamente tiene columnas principales, donde reciben electricidad.  Aquí están marcadas con un + para positivo y un – para negativo. Es decir que estas columnas deben recibir la electricidad de la MEGA.

En esta imagen la fila positiva provee una conexión + a través del cable naranja.  Aquí esta conectado a la fila 16.  Es decir que la fila 16, lo cual incluye columnas:

16-a, 16-b, 16-c, 16-d y 16-e

esta conectados al polo positivo del circuito.

Así mismo el polo negativo sale a través del cable amarillo hacia la fila 14, lo cual incluye las columnas:

14-a, 14-b, 14-c, 14-d y 14-e

Esto significa que podríamos hacer algo asi:

Arduino Honduras Santiapps Marcio Valenzuela
Breadboard

Ojo, la pata mas larga del LED es la +.  En este caso la estariamos conectando a la fila 16 donde esta el polo positivo (cable naranja).  Y la pata – en el polo negativo alimentado por el cable amarillo.  Sin embargo dijimos que en el caso particular de un LED, es necesario incorporar un resistor.  El uso de la breadboard nos facilita esto:

Arduino Honduras Santiapps Marcio Valenzuela
Resistor

Esta conexión se representa con un diagrama que puedes generar con un programa gratuito llamado Fritzing (http://fritzing.org/).  Un diagrama generado se mira así:

Arduino LED Santiapps Marcio Valenzuela
Arduino Fritzing

Aquí ya aparece la MEGA conectada a la breadboard.  Como pueden ver, sacamos corriente del pin etiquetado 5V (+) y se cierra el circuito con el pin etiquetado GND (-).  Esta board (MEGA) y la mayoría de los componentes para estos proyectos usan 5V.  Algo importante aquí es que el momento que conectamos estos componentes en esta forma, al conectar la MEGA a la computadora via USB, la corriente fluye de la computadora a la MEGA y directo a la LED porque usamos el pin 5V, el cual siempre da corriente.  La idea es precisamente usar otro pin, que no siempre da corriente, y poder controlar el flujo de la corriente a ese pin.  Si revisan la imagen original, queríamos que ese fuera el pin 12.  Asi que en nuestro caso, el diagrama se mirara asi:

Arduino

MARCADOR

Repasando que vamos a hacer:

  1. El polo positivo entra de la MEGA por el cable naranja y se conecta a la fila 16, la cual alimenta la pata larga (+) de la LED.
  2. El polo negativo entra de la MEGA por el cable amarillo y se conecta a la fila 14 via el resistor (controlando el flujo) y luego a la pata corta (-) de la LED.

Les podría parecer raro que el resistor este en la pata negativa.  Solemos creer que la electricidad fluye de + a -.  De hecho no importa en este caso porque el circuito se cierra y la electricidad comienza a fluir.  El resistor controla ese flujo sin importar en que dirección.  (Y de hecho la electricidad fluye de – a +).

Ok, estamos listos para ver el código que controlara el flujo de la MEGA a la breadboard:

// Conectamos la LED al pin
int led=12;
// Este método corre una vez, al inicio únicamente
void setup(){
// Asignamos el pin 12 de tipo OUTPUT para mandarle corriente
pinMode(led,OUTPUT);
}
// Este metodo corre infinitamente, repetitivamente, varias veces x segundo, asi que cuidado lo que pongan aquí porque puede atascar todo
void loop(){
digitalWrite(led,HIGH);//Mandamos corriente al pin 12
delay(1000);// esperamos 1 segundo (1,000 milisegundos)
digitalWrite(led,LOW);//Quitamos la corriente al pin 12
delay(1000);// esperamos otro segundo
}   // y el ciclo se repite

Sencillo no?  Esto hará que la LED se encienda y apague cada segundo.  Ahora solo resta hacer las conexiones, conectar el cable USB a la computadora y a la MEGA y subir el código.  Aqui un video del proyecto final:

El proyecto final se mira así:

Arduino LED
Arduino LED

También se puede usar una LED que trae la MEGA incorporada.  El único cambio al código es que se usar el pin 13 ya que la LED que viene incorporada en la MEGA esta conectada internamente al pin 13 y de hecho trae incorporado también el resistor.  Ese proyecto se puede ver aquí:

Es todo!  Parece insignificante pero la base es importante.  Porque?  Pues los dejo con estas ideas:

  • Esa LED podría ser un motor o un cerrojo o una valvula de flujo
  • En lugar de repetir el ciclo cada segundo, podríamos controlar el flujo en cada ciclo agregando una condición, ie: Si un botón esta oprimido, o un sensor ( de luz, sonido, calidad de aire, temperatura, huella digital, código ingresado etc) cumplen con las condiciones requeridas para enviar esa corriente.
  • O que pasa si, en lugar de solo enviar corriente, mandamos o leemos datos?  A internet?  A un celular?  A un BT, NFC etc…

Allí es donde se pone interesante.  Nos vemos en el proximo donde controlaremos la LED usando botones y potenciometros y aprenderemos a leer electricidad, no solo escribirla!

Arduino IoT: Tutorial Simple Programar ATtiny85

Arduino Honduras Santiapps Marcio Valenzuela

Tutorial Simple Programar ATtiny85

 

En algun momento llegaremos a querer reducir el tamaño de nuestros proyectos por ejemplo para “wearables”, proyectos usados como vestimenta por la gente.

Aqui aprovechamos a programar la ATtiny85 via una Arduino UNO R3, aunque es posible obtener programadores standalone.

Esta es la ATTiny85 comparada con la ATmel y la Arduino UNO R3:

Arduino IoT: Tutorial Programming ATtiny85 via Arduino UNO R3 ArduinoISP by Santiapps Marcio Valenzuela
Arduino IoT: Tutorial Programming ATtiny85 via Arduino UNO R3 ArduinoISP

Como podemos ver, no solo en tamaño sino que en componentes, la ATtiny85 tendrá la ventaja de consumo energético ademas de espacio.

Primero, tenemos que actualizar nuestro Arduino IDE para poder interface con una ATtiny85.  Esto lo hacemos en Preferences y Boards Manager:

https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json

Segundo, debemos cargar el sketch de ArduinoISP en el Sketchbook del Arduino IDE a la Arduino UNO R3 que vamos a usar como ISP.

Board: UNO > ATTiny85 (Clock 1, 8 o 16MHz)

Progr: AVRISPMkII > Arduino as ISP

Tercero, debemos hacer las conexiones entre la UNO R3 y la ATtiny85:

Arduino IoT: Tutorial Programming ATtiny85 via Arduino UNO R3 ArduinoISP by Santiapps Marcio Valenzuela
Arduino IoT: Tutorial Programming ATtiny85 via Arduino UNO R3 ArduinoISP

Cuarto, vamos a cargar el sketch de Blink al ATtiny85 pero haciendo la siguiente modificación al codigo, cambiamos el pin 13 por el pin 0 porque la ATtiny85 no tiene tantos pines:

int ledpin = 0;
void setup() {
pinMode(ledpin, OUTPUT);
}
void loop() {
digitalWrite(ledpin, HIGH); 
delay(2500); 
digitalWrite(ledpin, LOW); 
delay(2500); 
}

Ahora cargamos el sketch Blink-modificado a la ATtiny85 modificando los parámetros de board y puerto para acceder a la tiny via la UNO.

Finalmente podemos ver los resultados:

OJO

Arduino IoT: Tutorial Programming ATtiny85 via Arduino UNO R3 ArduinoISP by Santiapps Marcio Valenzuela
Arduino IoT: Tutorial Programming ATtiny85 via Arduino UNO R3 ArduinoISP

Arduino IoT: RTD PT 100 Sensores Industriales Parte II

Arduino IoT Arduino (IoT): Simple Tutorial de Infrarojo (IR) Receptor/Transmisor by Santiapps Marcio Valenzuela
Arduino IoT Arduino (IoT): Simple Tutorial de Infrarojo (IR) Receptor/Transmisor

Arduino (IoT): RTD PT 100 Sensores Industriales Parte II

 

Arduino IoT: RTD PT-100 Sensores Industriales by Santiapps Marcio Valenzuela
Arduino IoT: RTD PT-100 Sensores Industriales

En el tutorial anterior vimos como obtener resultados de un sensor industrial, PT100.  3 puntos importantes a recalcar:

  1. PT100 es un sensor muy sensible.  De hecho PT100 viene de “Pt” el símbolo para platino, que es un elemento usado por su confiabilidad.  Su resistencia varia de manera constante y confiable a lo largo de un gran rango de temperaturas.  Es esta resistencia la que medimos para obtener nuestros datos.
  2. La resistencia del circuito esta ligada al Voltage pero los voltajes son muy sensibles a ruido y podríamos confundir ruido de las lineas de transmisión con mediciones reales.  Por tanto usamos la corriente que es mucho mas estable y también esta relacionada a la R y V, según V=IR.  Para medir la corriente usamos un transmisor 4/20mA current loop.  Este aparato mide corriente y esa corriente es la que usamos para calcular la resistencia y convertirla a temperatura.
  3. Uno de los puntos mas importantes de cualquier medición es que las mediciones son instantáneas.  Es decir, se toman en un instante y muchas cosas pueden pasar entre un instante y otro.  Esto da como resultado varianzas que deben ser eliminadas.  Para ello es importante tomar varias muestras y obtener un promedio.  Existen cómputos estadísticos mas sofisticados que se pueden emplear para eliminar ruido y valores extremos pero por ahora veremos el mas sencillo, el promedio.

Realmente lo que debemos hacer es tomar varias muestras a lo largo del tiempo, almacenarlas y tomar un promedio de ellas. En programación podemos almacenar un gran grupo de datos en una estructura llamada arreglos, o arrays.  En Arduino definimos un array asi:

float analogVals[numReadings];

Aqui decimos que el array de nombre analogVals sera te valores tipo float y tendrá un cierto numero de elementos o items según la cantidad numReadings.

//Array vars
const unsigned int numReadings = 100;
float analogVals[numReadings];
unsigned int i = 0;

Aqui definimos el valor de numReadings en 100 y creamos un valor contador “i” iniciando con valor 0.  Este lo usaremos para incrementarlo cada vez que agreguemos un nuevo valor de temperatura al array y lo compararemos contra el numReadings de 100.  Al llegar a 100 valores, tomaremos el promedio.

analogVals[i] = f1;
if (i>=numReadings) {
//2. get average and go to test logic
float theAvgIs = average(analogVals,i);
//3. call logic
logicAction(theAvgIs);
i=0; //reset
} else {
i++;
}

Dentro del loop, almacenamos el valor del sensor, f1 y lo almacenamos en la primera posición del array analogVals[0] porque i empieza en 0.

Luego hacemos una prueba, si “i” ya llego a ser mayor o igual a 100, promediamos, de otra manera, solo le sumamos 1 a i, usando i++, y ahora i = 1 y volvemos al loop para tomar otra medicion.

Eventualmente cada vez que tomemos una medición y le sumemos 1 a i, i llegara a 100.  En ese momento ya hemos almacenado 100 valores en nuestro array y podemos hacer cálculos.

float average (float * array, int len){
float sum = 0L ;
for (int i = 0 ; i < len ; i++)
sum += array [i] ;
return ((float) sum) / len ;
}

En ese entonces llamamos esta función pasándole el array completo y su numero de elementos.  Esta función suma los valores del arreglo y los va almacenando en la variable sum.  Al final divide ese total entre len, el valor de items en el array para darnos un promedio y lo regresa al loop.

Regresando al loop ponemos ese valor en theAvgIs y lo pasamos a la función siguiente para tomar una decision sobre la lectura:

void logicAction(float thisIsIt){
if (thisIsIt > 20.0){
//its hot
Serial.println(“done…>20”);
Serial.println(thisIsIt);
} else {
//its cold
Serial.println(“done…<20”);
Serial.println(thisIsIt);
}
}

Aqui vemos que si el valor pasado es > a 20, esta caliente y si es menor a 20 esta frío.  En ese caso tomaríamos la accion en base a cada posibilidad, como cerrar válvulas, incrementar calor de la caldera etc.

Al final los resultados son:

Arduino IoT: RTD PT-100 Sensores Industriales by Santiapps Marcio Valenzuela
Arduino IoT: RTD PT-100 Sensores Industriales

Como podemos observar,  al calentar el sensor arriba de 20, la respuesta cambia y podríamos tomar las acciones necesarias.

Recordemos que hay otras mejoras; por ejemplo aquí esperamos a volver a llenar el array con 100 valores nuevos para obtener un nuevo promedio y poder comparar con lo deseado y tomar acciones.  Esperar 100 mediciones es bastante tiempo.  Podríamos ir llenando valores nuevos para reemplazar los mas viejos en el array, y tomar otro promedio al tener 10 nuevos y 90 viejos.  Así el promedio se actualizaría mas seguido y podríamos tomar mejores decisiones.