Archivo del sitio

Escudo de Ethernet W5100 – III

En este caso el control lo realizaré a través de una aplicación creada con “App Inventor”.

Como solo es un ejemplo he decidido realizar la implementación de tres salida digitales y dos entradas analógicas, simulando la temperatura de dos estancias de una casa.

La programación es muy fácil, para las salidas digítales, se trata de realizar un “Get” con uno de estos códigos:

  • OnXXX para encender la estancia
  • OffXXX para apagar la estancia

Módulo de Control de un Led con AppInventos.

Para las entradas analógicas simuladas, se implementa un “Web” dentro de la aplicación y se referencia a la dirección del servidor web (192.168.1.177).

Esquema de los LED

Circuito teórico

Circuito Práctico.

Programa Arduino

AppInventos

Aspecto Simulado

Captura de Pantalla desde un móvil

Archivo aia de AppInventor.

Casa_Domotica_I.aia

App de la Aplicación.

Casa_Domotica_I.apk

Códigos Fuente  Arduino

Ethetnet_AppInventor.ino

Vídeo resumen:

Anuncios

Polímetro 2

Basándome en la entrada anterior, he construido una simulación de lo que podría ser un polímetro.

Las características son la siguientes:

Intensidad entro 0 y 5 A

Tensión entre 0 y 5 V

Resistencia, lo he dejado para un posterior cálculo, aunque basándose en la ley de Ohm la implementación es muy sencilla.

Desarrollo en Arduino.

Está basado en la entrada anterior (https://ardubasic.wordpress.com/2016/10/01/midiendo-intensidad/) y lo que hace es sacar la media de las medidas que realiza el sensor. Anteriormente el sensor debe estar calibrado.

codigo_medida

Desarrollo en Visual Basic

Está basado en la entrada (https://ardubasic.wordpress.com/2013/11/04/comunicacion-con-visual-basic/) . Lo que he realizado es una mejora del diseño y la introducción de un sensor medidor de intensidad. He aumentado a tres las lecturas y el registro de los datos utilizando lo explicado en la entrada ( https://ardubasic.wordpress.com/2015/11/01/exportando-a-excel-los-valores/ ).

Obtener datos

obtener_datos_arduino

Se realiza una escritura del carácter ASCII 10 para que el Arduino mande los datos. Leyéndolos la aplicación a continuación.

Representar en la Pantalla de Medida

representar_en_pantalla

Dependiendo de la escala y el parámetro que hemos seleccionado, realiza la representación en pantalla.

Representación Gráfica.

representar_graficamente

Se realizan los cálculos para que la representación se realice entre unos puntos definidos.

Configuración del SerialPort.

serialport

En el cuadro verde, señalo el puerto de comunicación de la aplicación con Arduino.

En el cuadro azul, señalo el parámetro “DtrEnable” que debe ser True para el Arduino Leonardo, si no se realiza así, hay problemas en la comunicación, envía datos pero no recibe. Si es otra placa distinta esta última consideración, no se tiene que tener en cuenta.

Código Arduino

codigo_arduino

Circuito Teórico

polimetro_2_bb

Fotos

tension

Midiendo tensión y registrando los datos

intensidad

Midiendo Intensidad y registrando los datos

Código Fuente  Arduino Completo

Polímetro_2.ino

Proyecto VB 2015

Polímetro_Arduino.zip

Vídeo resumen:

 

 

 

Midiendo Intensidad

En esta entrada realizaremos medidas de intensidad a través del sensor  ACS712 – 5A, dicho sensor internamente trabaja con un sensor de “Efecto Hall” que detecta el campo magnético que se produce por inducción de la corriente que circula por la línea que se está midiendo y nos entrega un voltaje proporcional a la corriente.

Edwin Hall(1855-1938) descubrió que si por una fina lámina de oro circula una corriente y se le aplica un campo magnético elevado perpendicular al movimiento de las cargas, aparece una separación de cargas que da lugar a un campo eléctrico en el interior de la lámina, perpendicular al movimiento de las cargas y al campo magnético aplicado, a este campo eléctrico se le denomina “Voltaje Hall”

   voltaje_hall

En el mercado podemos encontrar el ACS712 para diferentes rangos de intensidad:

rango_asc712

El sensor necesita alimentación de +5v y este nos entrega un valor de +2.5 voltios más una tensión proporcional a la intensidad que circula por él, con una relación lineal entre la salida de voltaje del sensor y la corriente. Dicha relación es una línea recta donde la pendiente es la sensibilidad y la intersección en el eje Y es 2.5 voltios. La ecuación de la recta seria la siguiente:

Tensión de Salida del Sensor = Sensibilidad * Intensidad que Circula + 2.5

de donde se despeja que:

Intensidad=(Tensión de Salida del Sensor -2.5)/Sensibilida

Circuito ACS712

esquema_acs712

Sensor

sensor_acs712-5a

Calibración del punto intensidad cero sin carga.

Para realizar el calibrado inicial del punto cero (sin carga) realizaremos un programa que en ausencia de intensidad debería de dar una salida de 2.5 v.

Para evitar ruido, realiza 1.000 medidas y luego realizo la media.

codigo_calibrando

 

Pero como se puede observar el valor es ligeramente superior 2.503 v

calibrado_sensor

Calibrando la sensibilidad del Sensor.

Como hemos dicho anteriormente el sensor responde a una ecuación de la resta con una pendiente que es el valor de la sensibilidad, pues bien calculando dos valores, seremos capaces de calcular la pendiente de la recta con la formula siguiente:

Sensibilidad del sensor = (V1-V0)/(I1-I0)

Para realizar el ensayo coloco una carga de aproximadamente 230 mA y realiza una nueva medida con el programa anterior, obteniendo los siguientes resultados:

calibrado_sensor_carga_230ma

Con estos valores calculamos la pendiente.

Sensibilidad del sensor = (2.530-2.503)/(230-0)=0.117

Sensibilidad=0.117 V/A

Realizando Mediciones

Circuito teórico

medir-intensidad_bb

Circuito Práctico.

vista_general

Medida del Polímetro

polimetro

Medida del Sensor

midiendo_sensor

No se varia mucho de lo que hemos medido con el polímetro, aunque para ser sinceros, para obtener unos resultados aceptables hay que realizar una calibración cada vez que realicemos la medida.

Código del Programa de Medida

codigo_midiendo

Códigos Fuente  Arduino Completo

Calibrando_sensor.ino

Midiendo_Intensidad.ino

Vídeo resumen:

 

 

 

Midiendo Sensores

He decidido dotar al ArduRover de tres entradas analógicas para poder medir y representar sensores externo que se conecten a él.

Es una evolución de la anterior entrada. En esta ocasión, doto al programa de un panel de configuración, para que se pueda personalizar las medidas que se realicen.

Configuración

Como podemos ver se puede configurar el nombre del sensor a representar, el valor de aviso(por si queremos que al llegar a un valor dado nos avise), si se representa o no, el valor máximo en la escala y un último valor que ajustará los valores recibidos a una escala real de medición.

Si conectásemos el sensor siguiente, el valor de conversión sería -> 0.4882

lm35.png

Continuamos con la posibilidad de almacenar los valores en una hoja de Excel, para su posterior análisis.

La programación con VB es casi idéntica al realizado en la entrada “Conociendo el Estado de los Sensores” y el posterior “ Exportando a Excel los valores”  con unos pequeños ajustes para parametrizar las medidas.

Una mejora que puede dar muy buen resultado es realizar una media de diez mediciones antes de enviar el valor desde Arduino a la aplicación, con esta minimizamos parte de los errores por ruido.

Esquema Práctico del Sensor LM35:

Medir_Temperaturas_Sensor

Esquema Práctico de las Entradas Analógicas:

Esquema_Practico

Lista de Piezas

Dibujo de la Pieza Nombre Nº Piezas
Hembra Soporte Hembra 1
Macho Soporte Macho 1
Pasamuros Porta Soporte 2

 

Extracto del Programa Arduino:

codigo_Arduino

 

 

Fotos:

Arriba_01

Vista SuperiorArriba_02

Detalle con sensores

frontal_01

Primer plano

VB_01

Visión General del Programa

Configuración

Detalle del Panel de Configuración

Código Fuente  Arduino Completo

Midiendo.ino

Proyecto VB 2015

Sensores de Entrada.zip

Vídeo resumen:

 

 

 

 

 

 

Exportando a Excel los valores

Esta entrada es una evolución de la anterior y por ello voy a ser un poco más conciso de lo habitual, considerando que ya habéis leído la anterior( Conociendo el Estado de los Sensores)

Lo novedoso es que sobre una misma gráfica pueden ser representados más de un valor y que los valores los almaceno en una tabla que luego la exporto a Excel.

Este proyecto está diseñado para aquellos casos donde sea necesario dejar una sonda y medir su estado a lo largo del tiempo con un máximo de medidas de 590 datos. Con el control del tiempo entre medidas podemos calcular los datos necesario o sabiendo los datos calcular el tiempo entre medidas

Declaración de Variables

Declaracion_de_Variables

Procedimiento obtener los datos

Obtener_Datos

Botón de inicio/fin de la obtención de datos

Medir

Botón de inicio de la exportación de los datos a Excel

Grabar_Datos_01

Procedimientos de exportación a Excel

Grabar_Datos_02

Fotos

Instantánea - 4

Pantallazo del Programa

Frente

Sensores LDR

Código Fuente  Arduino Completo

Comunicando.ino

Proyecto VB 2015

ArduRover-Excel.zip

Ficha del Proyecto:

Exportar_a_Excel_Ficha_41

Vídeo resumen:

 

 

Conociendo el Estado de los Sensores

Llevaba mucho tiempo queriendo realizar una entrada con programación en VB, al actualizarme a VB 2015 me ha parecido un buen momento para realizarlo.

Os dejo esta entrada donde realizo un programa que capta los datos de todos los sensores que hasta ahora tengo en el Rover y los representa de distintas maneras.

Los módulos son paramétricos y pueden ser exportados a casi cualquier proyecto.

Creo que al realizar una programación modular, queda bastante claro como lo he realizado, no obstante más abajo he puesto todo el proyecto para que podáis descargarlo. Si algo no queda claro( que seguro que hay), contármelo y si puedo os ayudaré.

Abrir Puerto de Comunicación

Abrir_Puerto_Comunicacion

Procedimiento de Obtención de Datos de los Sensores

Procedimiento_ObtenerDatos

Procedimiento de Representación de Datos Tipo Vúmetro

Procedimiento_Medidor_Vumetro

Procedimiento de Representación de Datos Tipo Analógico

Procedimiento_Medidor_Analogico

Modulo de Representación Gráfica de Datos

Procedimiento_Grafica

Procedimiento de Representación de Datos Tipo On/Off

Procedimiento_Medidor_Sensores

Extracto del Programa Arduino:

Codigo_Arduino

Fotos:

Pantalla_02

Ejemplo de Instantánea de Pantalla

Pantalla_01

Otro Ejemplo de Instantánea de Pantalla

Código Fuente  Arduino Completo

Comunicando.ino

Proyecto VB 2015

ComunicacionArduino.zip

Ficha del Proyecto:

Comunicación_Visual Basic_Ficha_40

Vídeo resumen:

ArduRover IV (Distancia)

Medir Distancias con el HC-SR04

La implementación de esta parte del proyecto es una continuación del proyecto anterior (ArduRover III Luz).

HC-SR04

Se trata de seguir incorporando funcionalidades al Rover, en este caso he incorporado un medidor de distancias del tipo HC-SR04 por ultrasonidos. Para saber más sobre como funciona este medidor, consultar la entrada “Medir Distancias” .

7805

He implementado una fuente de voltaje + 5Vcc con el circuito integrado 7805. La alimentación de entrada la suministra las baterías del Rover y la salida la utilizaré para la alimentación del servo y futuros circuitos de + 5 Vcc con un cierto medio-bajo amperaje.

Las características principales son las siguientes:

  • Entrada …………………………………  7 a 20 Vcc
  • Salida ……………………………………. 4.8 a 5.2
  • Intensidad de Salida………………. 500 mA

He introducido un servo y he colocado el HC-SR04 encima con la visión futura de poder mover el sensor y realizar medidas en diferentes direcciones. Para este fin he utilizado un servo que tenía por ahí y lo he reciclado.

La conexiones del servo las he mirado en una tabla que construí con la información que encontré en Internet.

Terminales_Servos

He modificado el Screen de programa, el módulo de “Clock”  y he implementado un bloque más.

SCREEN

Screen_Distancia

Como se puede observar he incluido un botón para especificar de manera manual cuando queremos que realices las mediciones. También he habilitado un lugar para que represente la medida en centímetros que existe entre la delantera del Rover y el obstáculo. En el fututo será empleado para evitar obstáculos y medir distancias de escape de un laberinto con dificultad media-baja.

Bloque del Evento Clock de Medidas

Modulo_Reloj_Medida

 El bloque se ejecuta coda 500 ms y se ha ampliado con respecto al anterior en lo siguiente:

Se realiza la lectura de los datos provenientes del Arduino y se guarda en la variable “DatoRecibido”

Mediante las funciones de troceado y medición de cadenas se le asigna a cada etiqueta el valor del sensor medido de la siguiente forma:

Medimos la longitud de la cadena leída y si es mayor que 11, realizamos el troceado. Con esto nos evitamos que los datos provenientes del Arduino no están completos. Troceamos la cadena en tres partes, la primera comenzando en la primera letra y terminando al encontrar una “,”. La segunda desde esta hasta el signo “+”, y la tercera desde esta última hasta el signo “-“.

En caso de no estar conectados rellenamos los valores con “XXX”

Bloque del Evento Pulsar el Botón Medir

Modulo_Medida

El módulo se parece mucho al de la conexión/desconexión de la luz que ya habíamos programado, la diferencia es que este en vez de manipular una luz, realiza la habilitación del reloj (TimerEnabled).

Esquema Teórico Parcial:

ArduRover_Distancias

Esquema Práctico:

Placa_1_ArduRover_4_bb

Código del Programa:

Codigo_ArduRover_Distancias

Fotos:

2Vista de Perfil

7

Vista Lateral

Planta

Vista en Planta

Detalle

Detalle Lateral

Frente

Detalle Frontal

Tablet

Aplicación en el Tablet

Código fuente

ArduRover_Traccion_Bluetooth_Luz_Distancia.ino

APP de Proyecto:

App_ArduRover_IV.apk

Ficha del Proyecto:

ArduRover_IV_Ficha_31

Vídeo resumen:

ArduRover III (Luz)

Encender una Luz y Realizar Medidas de Luminosidad.

La implementación de esta parte del proyecto es una continuación del proyecto anterior (ArduRover II Bluetooth).

Se trata de seguir incorporando funcionalidades al Rover, en este caso he incorporado una luz delantera y la medición de la luz ambiente con dos LDR incorporadas en la delantera del Rover.

He modificado el Screen de programa y he implementado dos bloques más.

SCREEN

Screen_1.2

Bloque del Evento Clock

Bloque_Clock

El bloque se ejecuta coda segundo y realiza lo siguiente:

Comprueba si está conectado y si es así

Envía una “M” por Bluetooth.

Recoge los datos suministrado por el Arduino (He tenido que realizarlo dos veces, por que con una solo captaba parte de los datos enviados. Seguiré investigando)

Si no está conectado, no realiza nada

Bloque del Evento Pulsar el Botón Luces

Boton_Luces

Creo una variable global que dice como se encuentra la luz.

El Bloque se ejecuta cada vez que pulsamos el botón de la Luz, y realiza lo siguiente:

Comprueba si está conectado y si es así

Comprueba si la variable global es “true” y si es así

Envía  “LOOF” por Bluetooth.

Establece la variable global a “false”

Pone la etiqueta del botón de luz en “OOF”

Si la variable global es “false”

Envía  “LON” por Bluetooth.

Establece la variable global a “true”

Pone la etiqueta del botón de luz en “ON”

Si no está conectado, informa de que no puede realizar la operación dada por encontrase desconectado.

Esquema Teórico Parcial:

Esquema_Practico_LDR

 

Esquema Práctico:

Placa_1_ArduRover_3_bb

Código del Programa:

Codigo_ArduRover_1.2

Fotos:

Vista_Lateral

Vista de perfil

Superior

Vista Superior

Tablet

Funcionamiento en una Tablet

Detalle_de_Conexion

Detalle de las conexiones

Código fuente:

ArduRover_Traccion_Bluetooth_Luz.ino

APP de Proyecto:

ArduRover_IV.apk

Ficha del Proyecto:

ArduRover_III_Ficha_30

Vídeo resumen:

Medir Temperaturas

analogReference

Descripción

Configura el voltaje de referencia usado por la entrada analógica. La función analogRead() devolverá un valor de 1023 para aquella tensión de entrada que sea igual a la tensión de referencia.

 Las opciones son:

      DEFAULT: Es el valor de referencia analógico que viene por defecto que de 5 voltios en placas Arduino de y de 3.3 voltios en placas Arduino que funcionen con 3.3 voltios.

      INTERNAL: Es una referencia de tensión interna de 1.1 voltios en el ATmega168 o ATmega328 y de 2.56 voltios en el ATmega8.

      EXTERNAL: Se usará una tensión de referencia externa que tendrá que ser conectada al pin AREF.

Precaución

Es recomendable que cuando se use la referencia de tensión externa se conecte al pin AREF una resistencia, esto evitará posibles daños internos en el ATmega, si la configuración de la referencia analógica es incompatible con el montaje físico que se ha llevado a cabo.

Para saber más -> http://arduino.cc/es/Reference/AnalogReference#.Uxjmf2eYahs

 

El LM35 es un sensor de temperatura común del tipo TO-92, con una precisión calibrada de 1ºC. Su rango de medición abarca desde -55°C hasta 150°C. La salida es lineal y cada grado centígrado equivale a 10mV.

 Sus características más relevantes son:

      Está calibrado directamente en grados Celsius.

      La tensión de salida es proporcional a la temperatura.

      Tiene una precisión garantizada de 0.5°C a 25°C.Encapsulado_LM35

      Tensión de alimentación entre 4 Vcc y 30 Vcc.

      Baja impedancia de salida.

      Baja corriente de alimentación (60uA).

      Bajo coste (1.5 euros).

 

Algunos esquemas de utilización:

Circuitos_LM35

El LM35 sólo produce tensiones de 0-1 V, como la tensión de referencia del ADC es de 5V, sucede que perdemos el 80% de la gama posible. Si cambia Aref a 1.1 V, obtendrá casi la mayor resolución posible.

La ecuación que vamos a utilizar es la siguiente:

Temperatura Medída = Valor Leído / 9.31

Si dividimos 1.1 V entre 1024, cada paso en la lectura analógica es igual a aproximadamente 0.001074V = 1,0742 mV. Si 10mV es igual a 1 grado Celsius, 10 / 1,0742 = ~ 9,31. Así, para cada cambio de 9,31 en la lectura analógica, hay un grado de cambio de temperatura.

Para cambiar Aref a 1.1 V, se utiliza el comando  “analogReference (INTERNO)

Esto no quiere decir que tengamos una precisión elevada, pues Aref no será exactamente 1.1 V  y el LM 35 tiene una precisión de menor de 0.5 grados. Sin embargo, si que tenemos una resolución más alta. Con esto el rango de temperatura del LM35 está limitado a 0 a 110 grados Celsius.

Una cosa más, si realizamos una serie de medidas y realizamos la media aritmética, obtendremos un valor más adecuado y evitaremos medidas con ruidos.

Nota importante. Si cambiamos la referencia analógica con analogReference(), esto afecta a todas las entradas analógicas de la placa. Si quiero combinar medidas con la referencia de 1,1 y 5V en el mismo programa, tendré que llamar a la función analogReference() antes de cambiar el tipo de medida en el programa

Esquema Eléctrico:

Medir_Temperatura_Esquema

Esquema Práctico:

Medir_Temperaturas_bb

Código del Programa:

Medir_Temperaturas_Codigo

Fotos:

Vista_1

Vista Posterior

Vista_2

Vista Anterior

Instantánea - 2

Código fuente:

Medir_temperatura_II.ino

Ficha del Proyecto:

Medir_Temperaturas_Ficha_23

Vídeo resumen: