miércoles, 8 de junio de 2016

Monedero electrónico con display LCD 1602


Hoy os traigo un sencillísimo monedero electrónico, que dotaremos de un display LCD 1602 con comunicación I2C,  para que a través de este, Arduino nos muestre el número de créditos o monedas que vamos insertando a través de la ranura que el monedero electrónico tiene. Tomaremos como moneda de referencia la de 50 céntimos de Euro, aunque podría ser cualquier otra, por lo que si insertamos cualquier moneda diferente, esta será rechazada por el monedero electrónico y por lo tanto no se tendrá en cuenta un nuevo crédito. Además este pequeño sistema está dotado de un pulsador, mediante el cual, seremos capaces de bajar un crédito del contador de créditos que muestra el display LCD 1602, cada vez que lo pulsemos.

Monedero Electrónico

Una de las grandes ventajas de este monedero electrónico, es que rechaza las monedas falsas, monedas dobladas y arandelas, además de tener gran precisión cuando tiene que diferenciar dos monedas de tamaño muy similar pero de diferente denominación. Requiere de una fuente de alimentación regulada de 12VDC para su funcionamiento, es decir, para que su circuitería interna y el solenoide estén correctamente alimentados (Pines +12VDC y GND). El monedero nos entregará un pulso eléctrico de unos 2-3VDC a través de su pin “COIN”, cada vez que insertemos una moneda correcta en su interior, y será el encargado de habilitar la interrupción INT0 (pin digital 2) en nuestro Arduino. Este monedero también está dotado de un pin de salida denominado “COUNTER” que se encarga de enviar un pulso, que pueda ser leído por un contador electrónico externo, cada vez que insertamos la moneda correcta, aunque en este POST no lo vamos a utilizar. Mediante el interruptor NC/NO podemos seleccionar en qué niveles lógicos va a trabajar el pulso de salida del monedero, es decir, o estado normalmente abierto (NO) o normalmente cerrado (NC).  Si seleccionamos NO el monedero cuando está en espera se mantiene todo el tiempo entregando un voltaje en su salida (ALTO). Al momento que recibe una moneda correcta, el monedero corta el voltaje momentáneamente (BAJO) y vuelve a su estado NO en el que entrega voltaje (ALTO). De lo contrario si seleccionamos NC el monedero cuando está en espera, se encuentra en estado cerrado (BAJO) y no entrega ningún voltaje o pulso. Al momento de recibir una moneda correcta, entrega un pulso (ALTO) y luego vuelve a su estado NC, en el que no entrega ningún voltaje (BAJO).


Alimentación, salidas e interruptor de niveles lógicos

Este monedero puede ser configurado instantáneamente para aceptar prácticamente cualquier denominación de moneda al tiempo que rechaza todas los demás. La configuración para la aceptación de las monedas se establece mediante la inserción de una denominación de la moneda en un espacio llamado “CUNA”, que es donde yo he insertado la moneda de 50 céntimos de Euro.

Cuna del monedero electrónico

También, mediante otro interruptor, podemos seleccionar  la velocidad correcta de aceptación de la moneda, en definitiva, la velocidad del pulso de salida (pin COIN). Esta velocidad de pulso se encuentra entre los 100 milisegundos (SLOW/ velocidad lenta / pulso largo), 50 milisegundos (MEDIUM / velocidad media / pulso medio) y 30 milisegundos (FAST / velocidad rápida / Pulso corto). En lo personal siempre trabajo con 100 milisegundos (SLOW), ya que tras varias pruebas es la velocidad más correcta para trabajar con nuestro Arduino.

Interruptor para las velocidades del pulso

Con el potenciómetro de la parte superior del monedero, se ajusta la tolerancia de aceptación de monedas, para una aceptación más o menos estricta (STRICT / más estricta o SLACK / menos estricta).
Potenciómetro de aceptación de monedas

El funcionamiento del programa es muy simple, es decir, vamos a utilizar la interrupción 0 de Arduino (INT 0), que es la que se va a producir a través del pin digital 2 de Arduino, al que le hemos conectado la señal “COIN” del monedero electrónico, por lo tanto, cada vez que se detecte en el monedero una moneda de 50 céntimos de Euro, este manda una señal de nivel alto (HIGH) a Arduino, para que se produzca la interrupción del sistema y se ejecute la Rutina de Servicio a la Interrupción (ISR) que es donde tenemos programado que se incremente en una unidad la cantidad de créditos. Por otro lado si presionamos el pulsador con conexión PULL-DOWN, es decir, cambia de nivel bajo (LOW) a alto (HIGH) cada vez que lo pulsemos (aunque a estas alturas ya hemos trabajado multitud de veces con este recurso) para disminuir en una unidad el número de créditos. Como el programa está refrescando constantemente los valores del display LCD 1602, en todo momento tendremos un valor actualizado de los créditos con los que contamos. Por último cabe decir que el display LCD 1602 le hemos conectado a nuestro Arduino a través de comunicación I2C, soldándole a sus pines el módulo LCM 1602 I2C V1 como ya hemos visto también en POST anteriores.



Lista de Materiales:


·         Arduino UNO Rev.3.

·         Cable USB tipo A-B.

·         Monedero electrónico simple (marca SG).

·         Módulo LCM 1602 I2C V1.

·         Display 16x2 LCD 1602.

·         Pulsador.

·         Resistencia de 10KΩ.

·         Fuente de alimentación regulada de 12VDC.

·         Monedas de EURO de diferente denominación.

·         Protoboard.

·         Cables de conexión.



Código del programa:



Video:

jueves, 2 de junio de 2016

Balanza digital de hasta 20Kg con celda de carga y transmisor HX711


En el POST de hoy vamos a trabajar con una celda de carga de 20Kg,  un transmisor de celda de carga HX711, un display LCD 1602, frecuentemente utilizado a lo largo de todo el BLOG y por último una estructura que fabricaremos en “DM”, que no es más que un tipo de aglomerado de madera muy resistente, para crear una precisa y práctica balanza digital capaz de pesar elementos de hasta 20Kg. Para comenzar este proyecto es muy interesante conocer que es y para que se utiliza la celda de carga,  además de ver por qué es necesario utilizar un transmisor de celda de carga HX711 para comunicar la celda de carga con nuestro Arduino y que mediante el mismo podamos interpretar las señales eléctricas recibidas para mostrar a través del LCD 1602 el peso real de los elementos que nos interesen.
Una celda de carga es un transductor utilizado para convertir una fuerza en una señal eléctrica. Esta conversión empieza a partir de un dispositivo mecánico, es decir, la fuerza que se desea medir, deforma la galga extensiométrica y por medio de medidores de deformación, que son pequeños patrones de resistencias utilizados como indicadores de tensión, obtenemos una señal eléctrica con la cual podemos obtener el valor de la fuerza. Los medidores están unidos a la viga que se deforma cuando se aplica peso, a su vez, deformando el indicador de tensión. Cuando se deforma el medidor de deformación la resistencia eléctrica cambia en proporción a la carga. Esto se logra por medio de un puente de Wheastone, el cual se utiliza para medir  resistencias desconocidas mediante el equilibrio de “brazos” del puente. Estos están construidos por cuatro resistencias que forman un circuito cerrado. En el caso de las celdas de carga las resistencias son los medidores de deformación. La celda de carga es ideal para poder medir variaciones sobre presión en una superficie o como simple transductor para medir un peso de algún elemento en contacto con el dispositivo, como es en nuestro caso. En este POST utilizaremos una celda de carga de 20Kg que es el valor máximo que podrá pesar nuestra balanza digital.

Celda de carga de 20Kg

El transmisor de celda de carga HX711 es una interface entre la celda de carga y nuestro Arduino, permitiendo poder leer el peso de manera sencilla. Internamente se encarga de la lectura del puente de Wheastone formado por los medidores de deformación de la celda de carga, convirtiendo la lectura analógica en digital con su conversor A/D interno de 24 bits. La comunicación con nuestro Arduino se realiza a través de los pines SCK (Reloj) y DT (Datos) que el transmisor de celda de carga HX711 tiene como SALIDAS. 

Transmisor de celda de carga HX711


Por otra parte las ENTRADAS del transmisor de celda de carga HX711 van cableadas a la celda de carga de la siguiente manera:


       -          Pin E+ del transmisor HX711 à Cable Rojo de la celda de carga de 20Kg.
-          Pin E- del transmisor HX711 à Cable Negro de la celda de carga de 20Kg.
-          Pin A- del transmisor HX711 à Cable Blanco de la celda de carga de 20Kg.
-          Pin A+ del transmisor HX711 à Cable Verde de la celda de carga de 20Kg.


Como se ha mencionado con anterioridad, toda la estructura de la balanza digital está fabricada en “DM”, que es un aglomerado elaborado con fibras de madera aglutinadas con resinas sintéticas mediante fuerte presión y calor, en seco, hasta alcanzar una densidad media, ideal para resistir grandes esfuerzos con un espesor reducido. Cabe decir que las uniones realizadas entre las tablas de DM o entre la celda de carga y las tablas de DM se realizan mediante tirafondos de 3mm de diámetro en diferentes longitudes y cabeza plana, además de aplicar adhesivo de contacto de secado rápido en todas las superficies a unir. Como se puede observar en la siguiente imagen, la celda de carga está dotada de una parte hueca (parte central de la celda de carga), que tiene que quedar en suspensión para su correcto funcionamiento, además hay que tener en cuenta que el sentido de la flecha indica la dirección de la fuerza o peso a aplicar a la hora de instalar la celda de carga dentro de la estructura de DM.

Despiece y montaje de la estructura de la balanza digital


Para programar correctamente nuestro Arduino y poder visualizar el peso real de los elementos que nos interesen a través del LCD 1602, lo primero que tenemos que hacer es cargar el programa llamado “Balanza_digital_calibrado.ino” para calibrar la balanza digital, que consiste básicamente en hallar el valor de la escala que se usará, es decir, hallar el factor de conversión para convertir el valor de lectura en un valor con unidades de peso. La escala es diferente para cada celda y cambia de acuerdo a la forma de instalar, al peso máximo o modelo de celda de carga, incluso así se trate del mismo modelo de celdas no necesariamente tienen el mismo valor de escala. Primero necesitamos conseguir un objeto con un peso conocido, en otras palabras, debemos saber el peso real del objeto que vamos a poner sobre la balanza digital. Se recomienda que el peso conocido sea cercano al valor máximo del rango de trabajo de la celda de carga. En nuestro caso usaremos un peso de 8Kg pues nuestra celda es de 20Kg, y por mi casa no he encontrado un peso conocido mayor.


Después de poner el peso en la balanza, a través del monitor serial se mostraran las lecturas del peso, son lecturas sin escalar, por lo que les deben aparecer números grandes. Muy importante es que el programa comience a funcionar sin el peso colocado en la balanza digital, pues al inicio de programa se calcula la tara. Posteriormente tendremos que abrir el monitor serie del IDE de Arduino, esperaremos a que el programa reste la tara, para finalmente poner el objeto de 8Kg (o el peso conocido más cercano a 20Kg que encontremos por casa) y así obtener una serie de valores a través del monitor serie.
  
Monitor serie

Con uno o el promedio de estos valores, que en mi caso he utilizado el valor 858000 para redondear, calculamos el valor de la escala que utilizaremos con la siguiente formula:


Fórmula para el cálculo de la ESCALA

Con este dato ya obtenido pasamos a programar el sketch que vamos a utilizar para pesar llamado “Balanza_digital_final.ino”, únicamente tendremos que sustituir la cantidad entre paréntesis de la línea de código  balanza.set_scale(107250) por el valor que hayamos obtenido nosotros, para que la balanza digital nos pese correctamente. Una vez modificado el valor, validaremos y cargaremos el programa en nuestro Arduino. Una vez que se esté ejecutando el programa en nuestro Arduino debemos de esperar unos instantes hasta que se quite la tara, para que posteriormente aparezca a través del LCD 1602 el peso de cualquier elemento que pongamos sobre la balanza digital, siempre y cuando este no exceda de los 20Kg.
Para realizar los dos programas anteriormente mencionados nos ayudaremos de las funciones ya programadas y definidas para trabajar con el transmisor de celda de carga HX711, que vienen incluidas dentro de la librería #include”HX711.h” que os podréis descargar desde uno de los primeros POST de este BLOG. A continuación os muestro una descripción de las principales funciones con las que se trabaja:
·         HX711(byte PinData, byte PinClock): Es el constructor del objeto HX711, se puede trabajar con cualquiera de los pines.
·         void tare(byte n): Establece el peso actual como el peso de tara, n indica el número de lecturas que se realizan para obtener la tara, por defecto n=10;
·         void set_scale(float scale): Establece el valor de la escala, que es el factor de conversión para convertir valor de lectura en un valor con unidades de peso. Por defecto es scale = 1;
·         long read(): Espera hasta que el dispositivo esté listo y devuelve la lectura del ADC del HX711.
·         long read_average(byte n): Realiza n veces la lectura del ADC y devuelve el promedio.
·         double get_value(byte n): Devuelve el valor actual restando el peso de tara. Equivalente a (read_average() - OFFSET) . Si se especifica un valor de n, devuelve el promedio de n lecturas.
·         float get_units(byte n): Devuelve el valor actual restado del peso de tara y dividido por la escala. Es equivalente a (get_value()/SCALE). Si se especifica un valor de n, devuelve el promedio de n lecturas.



Lista de Materiales:


·         Arduino UNO Rev.3.

·         Cable USB tipo A-B.

·         Celda de carga de 20Kg.

·         Transmisor de celda de carga HX711.

·         Módulo LCM 1602 I2C V1.

·         Display 16x2 LCD 1602.

·         Estructura de la balanza digital:
o   Tablas de DM:
§  1 de 150x200mm, 1 de 60x75mm y 1 de 60x60mm.
o   Tirafondos de cabeza plana:
§  4 de 3x20mm, 2 de 3x25mm y 2 de 3x35mm.
o   Adhesivo de contacto de secado rápido.

·         Protoboard.

·         Cables de conexión.



Código del programa:

·         Balanza_digital_calibrado:




·         Balanza_digital_final:




Video:

miércoles, 18 de mayo de 2016

Comunicación RS-485 simplex entre dos Arduinos con módulos MAX485


Hoy os voy a mostrar cómo trabajar con uno de los estándares de comunicación en bus de la capa física del Modelo OSI denominado RS-485, muy utilizado en las comunicaciones industriales debido a su robustez, fácil implementación y buenas prestaciones. Está definido como un sistema de bus diferencial multipunto, es ideal para transmitir a altas velocidades sobre largas distancias (35 Mbit/s hasta 10 metros y 100 kbit/s en 1200 metros) y a través de canales ruidosos, ya que el par trenzado reduce los ruidos que se inducen en la línea de transmisión, admitiendo 32, 128 o 254 estaciones en un solo par.  La transmisión diferencial permite alcanzar mayor distancia con una notable inmunidad al ruido, siempre que el bus de comunicación conserve las características de bus balanceado dando la posibilidad de una configuración multipunto. La norma RS-485 indica que cada uno de sus nodos se conecta a la línea de transmisión formando una cadena conocida como topología en Bus. Cada elemento o nodo de la red (transmisor o driver y receptor) se conecta a la línea de transmisión mediante unos cables de enlace cortos. Por sus características físicas, este tipo de topología es el más sencillo que se puede implementar. La interface con la topología tipo Bus puede ser diseñada para una comunicación unidireccional (simplex), dual simultanea (full-duplex) o dual no simultánea (half-duplex).

Ejemplo de comunicación industrial con protocolo RS-485

El módulo MAX485 RS485-TTL tiene acceso a todos los pines del MAX485 que incorpora y contiene todos los componentes adicionales, tales como resistencias o condensadores, necesarios para su correcto funcionamiento y control. Los pines A y B se pueden conectar también desde la bornera. Este módulo nos permite establecer una interfaz RS-485 a Serie TTL para trabajar con los pines RX y TX de Arduino como si de una simple comunicación serie se tratara pero respetando el protocolo de comunicación RS-485. Las salidas A y B son por donde se envían los datos, B es la negación de A, es decir, se envían los mismos datos pero en la línea B están negados, de esta forma se pueden restar ambas señales y eliminar el ruido y quedarnos solo con la señal de datos. El encargado de esta transmisión diferencial es el  integrado MAX485.

Módulo MAX485 RS485-TTL

En este POST vamos a comunicar dos Arduinos de manera unidireccional (simplex) a través de módulos MAX485 RS485-TTL, por lo que en este caso un Arduino se comporta solo como transmisor y el otro solo como receptor, a nivel de programación es como si estuviéramos trabajando con una comunicación serial, pero en un solo sentido (uno envía y el otro solo recibe datos). El modulo conectado al Arduino transmisor solo va a trabajar como transmisor, es decir,  se tienen que conectar a +5V los pines RE y DE para que el modulo sepa que las salida A y B se van a comportar como salida de datos.  Desde el Arduino transmisor se envía el valor mapeado del potenciómetro (de 0 a 254), dependiendo de la posición en la que se encuentre su mando de control, desde el pin TX de Arduino hacia el pin DI (Data Input) del módulo y este  transmitirá los datos por los pines A y B hacia el módulo del Arduino Receptor. El módulo conectado al Arduino receptor solamente va a trabajar como receptor y para ello debemos de conectar los pines RE y DE del módulo a GND, y los datos recibidos por A y B estarán presentes en el pin RO (Receiver Output) del módulo, por lo que conectando el pin RO del módulo al RX de nuestro Arduino receptor podemos leer el dato recibido y en función de su valor (entre 0 y 254) brillará un LED, que tenemos conectado a una salida digital PWM de Arduino, con una intensidad concreta, desde permanecer apagado hasta conseguir un brillo máximo del LED cuando movemos el mando del potenciómetro del Arduino transmisor de un límite mecánico al otro. Solo dos cables (salidas A y B de los módulos MAX485 RS485-TTL) unirán a los Arduinos, pero teniendo en cuenta que si la distancia es larga se recomienda usar cable trenzado para eliminar interferencias como el ruido. Se han habilitado a través de la librería   nuevas conexiones serie TX (pin 3) y RX (pin 2) dentro de los programas que cargaremos a los dos Arduinos para poder dejar libres las conexiones TX (pin 1) y RX (pin 0) que trae configuradas el Arduino por defecto para comunicarse a través del puerto serie, puesto que son utilizadas a la hora de cargar los programas y de comunicarse con el monitor serie del IDE de Arduino, produciendo ciertas incompatibilidades al comunicarse con el módulo MAX485 RS485-TTL. Para una mayor información os recomiendo revisar los comentarios realizados dentro de cada uno de los programas.



Lista de Materiales:


·         2 Arduinos UNO Rev.3.

·         Cable USB tipo A-B.

·         2 Módulos MAX485 RS485-TTL.

·         Potenciómetro lineal de 10KΩ.

·         Resistencia de 220Ω.

·         LED de 3mm de cualquier color (válido de 5mm también).

·         Batería de 12VDC (DC 12300).

·         Batería de 9VDC con clip para Jack de 3,5mm macho.

·         2 Protoboards.

·         Cables de conexión.



Código del programa:

·         Transmisor_simplex_RS485:





·         Receptor_simplex_RS485:



Video:

martes, 3 de mayo de 2016

Detector de metal con sensor de proximidad inductivo PNP y un zumbador


En el POST de hoy vamos a trabajar con el sensor de proximidad inductivo PNP LJ12A3-4-Z/BY, capaz de detectar todos los metales que sean de tipo ferroso, que son aquellos que en su composición tienen principalmente hierro, como el acero (mezcla de hierro  con un poco de carbono ) o el hierro puro. Este tipo de sensores de proximidad es muy utilizado en la industria para contar objetos metálicos o para conocer su posición en un determinado momento, mejorando así la velocidad de los procesos industriales sin que tenga que intervenir ningún operario.

Sensor de proximidad inductivo PNP LJ12A3-4-Z/BY

El funcionamiento de este sensor es muy simple, es decir, en presencia de metales ferrosos la corriente que circula por el hilo conductor, va a  generar un campo magnético alrededor del mismo conmutando la salida del sensor. Como la salida del sensor es normalmente abierta (NO) siempre se encontrará a NIVEL BAJO hasta que conmute cambiando a NIVEL ALTO (salida PNP, si fuese NPN trabajaría al revés, es decir, pasaría de NIVEL ALTO a NIVEL BAJO en la conmutación), que es cuando se activará el zumbador que tenemos conectado a nuestro Arduino. A continuación os muestro las principales características de este sensor.

Principales características del sensor LJ12A3-4-Z/BY


Lista de Materiales:

·         Arduino UNO Rev.3.

·         Cable USB tipo A-B.

·         Sensor inductivo de proximidad PNP (LJ12A3-4-Z/BY).

·         Zumbador piezoeléctrico (Buzzer).

·         Protoboard.

·         Cables de conexión.


Código del programa:



Video: