Tema 3 – Conceptos básicos de microcontroladores y electrónica (3)

Entradas y salidas analóginas, PWM

Señal eléctrica analógica es aquella en la que los valores de la tensión o voltaje varían constantemente y pueden tomar cualquier valor. En el caso de la corriente alterna, la señal analógica incrementa su valor con signo eléctrico positivo (+) durante medio ciclo y disminuye a continuación con signo eléctrico negativo (–) en el medio ciclo siguiente.

Un sistema de control (como un microcontrolador) no tiene capacidad alguna para trabajar con señales analógicas, de modo que necesita convertirlas en señales digitales para poder trabajar con ellas.

La señal digital obtenida de una analógica tiene dos propiedades fundamentales:

En el caso de un arduino Uno, el valor de 0 voltios analógico es expresado en digital como B0000000000 (0) y el valor de 5V analógico es expresado en digital como B1111111111 (1023).

Por lo tanto todo valor analógico intermedio es expresado con un valor entre 0 y 1023, es decir, sumo 1 en binario cada 4,883 mV.

Arduino Uno tiene una resolución de 10 bits, es decir, unos valores entre 0 y 1023.

Arduino Due tiene una resolución de 12 bits, es decir, unos valores entre 0 y 4095.

Diferencia entre señales analógicas y digitales:

PWM

Como hemos dicho Arduino Uno solo tiene entradas analógicas que gracias a los conversores analógico digital puede entender ese valor el microcontrolador, pero no tiene salidas analógicas puras y para solucionar esto, usa la técnica de PWM.

Las Salidas PWM (Pulse Width Modulation) permiten generar salidas analógicas desde pines digitales. Arduino Uno no posee salidas analógicas puras.

El arduino due, posee dos salidas analógicas puras mediante dos conversores digital a analógico. Estos pines pueden usarse para crear salidas de audio usando la librería correspondiente.

La modulación por ancho de pulsos (también conocida como PWM, siglas en inglés de pulse-width modulation) de una señal o fuente de energía es una técnica en la que se modifica el ciclo de trabajo de una señal periódica (una senoidal o una cuadrada, por ejemplo), ya sea para transmitir información a través de un canal de comunicaciones o para controlar la cantidad de energía que se envía a una carga.

El ciclo de trabajo de una señal periódica es el ancho relativo de su parte positiva en relación con el período. duty cycle = (tiempo que la salida está a uno o HIGH)/ (periodo de la función)

En este ejemplo se ve como simular con PWM una onda sinusoidal analógica.

En Arduino la frecuencia de PWM es de 500Hz.

En la actualidad existen muchos circuitos integrados en los que se implementa la modulación PWM, por ejemplo para lograr circuitos funcionales que puedan controlar fuentes conmutadas, controles de motores, controles de elementos termoeléctricos, choppers para sensores en ambientes ruidosos y algunas otras aplicaciones.

Definición en la web de Arduino: http://arduino.cc/en/Tutorial/PWM

No confundir PWM con la funcion tone() que es utilizada para generar una onda cuadrada de ciclo de trabajo 50%, con el fin de emitir sonidos audibles.

Más información de tone() en:

https://code.google.com/p/rogue-code/wiki/ToneLibraryDocumentation

 

Conversor analógico digital (ADC)

Un microcontrolador solo entiende señales digitales (1’s y 0’s), por lo tanto para poder leer señales analógicas necesitamos los convertidores Analógico a Digital (ADC).

Como funciona un conversor analógico a digital:

http://es.wikipedia.org/wiki/Conversi%C3%B3n_anal%C3%B3gica-digital

http://en.wikipedia.org/wiki/Analog-to-digital_converter

Conversor digital  analógico (DAC)

Definición: http://en.wikipedia.org/wiki/Digital-to-analog_converter

Al contrario que las señales analógicas, las señales digitales se pueden almacenar y transmitir sin degradación. Los DAC se usan para los altavoces, amplificadores para producir sonido. Ejemplo de la transmisión de la voz por la líneas telefónicas.

En arduino los pines analógicos se definen y tienen las propiedades siguientes: http://arduino.cc/en/Tutorial/AnalogInputPins

En arduino para tratar las entradas y salidas digitales usamos las siguientes funciones:

Otras funciones interesantes con entradas/salidas analóicas:

Ejercicio: Leer un voltaje analógico y sacarlo por consola.

Solución: Ejercicio11-Analog

Ejercicios Avanzados: Ejercicios 3 y 4 del libro.

Las entradas digitales y analógicas (especialmente estas) son un recurso escaso en los microntroladores, para poder multiplicar esas entradas/salidas, podemos hacer uso de los multiplexores.

Los multiplexores son circuitos combinacionales con varias entradas y una única salida de datos, están dotados de entradas de control capaces de seleccionar una, y sólo una, de las entradas de datos para permitir su transmisión desde la entrada seleccionada hacia dicha salida.


Esta es una técnica muy utilizada para multiplicar las señales, con arduino podemos usar varios shield para multiplexar las señales.

Muxshield: https://www.sparkfun.com/products/11723

Para ver las funciones de la librería de este shield para Arduino se pueden ver en la página 5: http://dlnmh9ip6v2uc.cloudfront.net/datasheets/Dev/Arduino/Shields/Mux_Shield_II_User_Guide.pdf

Permite hasta 48 pines de Arduino. Usa el TI 74HC4067 para la funcionalidad de multiplexación de 16 canales y TI 74HC595 para los registros de cambio (registro de desplazamiento de tres estados). Tiene múltiples modos: entrada y salida digital y entrada analógica

Descargar la librería de arduino y ver los fichero: Arduino Library

Ejercicio:

Solución: Ejercicio12-Smoothing

Sensores

Un sensor es un dispositivo capaz de detectar magnitudes físicas o químicas, llamadas variables de instrumentación, y transformarlas en variables eléctricas. Las variables de instrumentación pueden ser por ejemplo: temperatura, intensidad lumínica, distancia, aceleración, inclinación, desplazamiento, presión, fuerza, torsión, humedad, movimiento, pH, etc. Una magnitud eléctrica puede ser una resistencia eléctrica (como en una RTD), una capacidad eléctrica (como en un sensor de humedad), una tensión eléctrica (como en un termopar), una corriente eléctrica (como en un fototransistor), etc.

Sensores de temperatura, humedad, presión, caudal, etc…

Los sensores se pueden clasificar en función de los datos de salida en:

  • Digitales
  • Analógicos

Y dentro de los sensores digitales, estos nos pueden dar una señal digital simple con dos estados como una salida de contacto libre de tensión o una salida en bus.

Un ejemplo de sensor analógico sería el ACS714:

Datasheet: http://www.allegromicro.com/~/Media/Files/Datasheets/ACS714-Datasheet.ashx

Como medir corriente: http://playground.arduino.cc/Main/CurrentSensing

Características de un sensor: http://es.wikipedia.org/wiki/Sensor#Caracter.C3.ADsticas_de_un_sensor

Tipos de sensores: http://es.wikipedia.org/wiki/Sensor#Tipos_de_sensores

A la hora de elegir un sensor, debemos leer detenidamente las características y elegir uno que sea compatible con nuestro sistema (tensión y voltaje) y que sea sencillo de usar o nos facilite una librería sencilla y potente.

Catálogo de sensores:

Otro tipo de sensores, comunicación por bus.

Un bus (o canal) es un sistema digital que transfiere datos entre los componentes de una dispositivo electrónico o entre varios. Está formado por cables o pistas en un circuito impreso, dispositivos como resistencias y condensadores además de circuitos integrados.

La tendencia en los últimos años hacia el uso de buses seriales como el USB, Firewire para comunicaciones con periféricos, reemplazando los buses paralelos, incluyendo el caso del microprocesador con el chipset en la placa base, a pesar de que el bus serial posee una lógica compleja (requiriendo mayor poder de cómputo que el bus paralelo) se produce a cambio de velocidades y eficacias mayores.

 

Si quieres saber más: http://es.wikipedia.org/wiki/Bus_(inform%C3%A1tica)

Existen muchos tipos de buses de comunicaciones, algunos de ellos los implementa arduino mediante el controladores HW intergrados en la MCU (I2C) o mediante una librería (one wire) y en otros casos es necesario un hardware adicional para adaptar la señal con un transceiver y manejar el protocolo con un controlador, por ejemplo can bus o modbus.

Los sensores DHT11 o DHT22 que vimos anteriormente,  son unos pequeños dispositivos que nos permiten medir la temperatura y la humedad. A diferencia de otros sensores, éstos los tendremos que conectar a pines digitales, ya que la señal de salida es digital. Llevan un pequeño microcontrolador interno para hacer el tratamiento de señal. Estos sensores han sido calibrados en laboratorios, presentan una gran fiabilidad.

Ambos sensores funcionan con ciclos de operación de duración determinada. En determinados casos de aplicaciones los tiempos de lectura de los sensores puede ser determinante a la hora de elegirlo.

Parámetro DHT11 DHT22
Alimentación 3Vdc ≤ Vcc ≤ 5Vdc 3.3Vdc ≤ Vcc ≤ 6Vdc
Señal de Salida Digital Digital
Rango de medida Temperatura De 0 a 50 °C De -40°C a 80 °C
Precisión Temperatura ±2 °C <±0.5 °C
Resolución Temperatura 0.1°C 0.1°C
Rango de medida Humedad De 20% a 90% RH De 0 a 100% RH
Precisión Humedad 4% RH 2% RH
Resolución Humedad 1%RH 0.1%RH
Tiempo de sensado 1s 2s
Tamaño 12 x 15.5 x 5.5mm 14 x 18 x 5.5mm

Veamos en profundidad la sonda DHT22.

http://www.seeedstudio.com/wiki/Grove_-_Temperature_and_Humidity_Sensor_Pro

Datasheet:

Este esquema explica como funciona este sensor, ver la biblioteca y buscar cómo implementa este protocolo de comunicación.

Práctica: Descarga la librería de uso y obtén las funciones de las que disponemos.

Práctica: Como usarías este sensor con el muxshield?

Otra sonda de temperatura pero que usa un bus de comunicación, lo que nos permite leer muchas sondas con una sola i/o digital:

Sonda: http://www.seeedstudio.com/depot/One-Wire-Temperature-Sensor-p-1235.html

Sensor: http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf

Librería: http://playground.arduino.cc/Learning/OneWire

Última version de la librería: http://www.pjrc.com/teensy/td_libs_OneWire.html

one-wire: http://en.wikipedia.org/wiki/1-Wire

one-wire: http://www.maximintegrated.com/en/app-notes/index.mvp/id/148

Actuadores y periféricos de salida

Un actuador es un dispositivo capaz de transformar energía hidráulica, neumática o eléctrica en la activación de un proceso con la finalidad de generar un efecto sobre elemento externo. Este recibe la orden de un regulador, controlador o en nuestro caso un arduino y en función a ella genera la orden para activar un elemento final de control como, por ejemplo, una válvula.

Existen varios tipos de actuadores como son:

  • Electrónicos
  • Hidráulicos
  • Neumáticos
  • Eléctricos
  • Motores
  • Bombas

Para cada actuador, necesitamos un “driver” o manejador para poder mandar órdenes desde Arduino.

  • Recordad que los pines de Arduino solo pueden manejar un máximo de 40mA y recomendable usar 20mA de forma continua.
  • Recordar que Arduino solo puede manejar un total de 200 mA de salida. Es decir que la corriente máxima que admite Vcc y GND son 200 mA.

Este enlace explica mucho mejor los las limitaciones de corriente en los pines de Arduino:

http://playground.arduino.cc/Main/ArduinoPinCurrentLimitations

Otro tipo de actuadores son los relés. Para manejar un relé necesitamos un driver, puesto que con los 40mA posiblemente no sea suficiente para activar la bobina del relé.

Un relay driver es un circuito electrónico que usa un transistor para activar la bobina del relé de forma que con una pequeña corriente activamos el circuito que alimenta al relé desde una fuente externa.

Los Relay Shield ya tienen integrados los relés y los drives, lo que nos facilita el trabajo, incluso algunas shields incluyen su librería:

http://www.seeedstudio.com/wiki/Relay_Shield

O también una placa con dos relés y su driver con posibilidad de alimentarlos externamente:

http://www.geeetech.com/wiki/index.php/2-Channel_Relay_module

También existen integrados como el ULN2803A que nos permiten controlar reles, se trata de un array o conjunto de 8 pares darlington que soportan 500mA y 50V. Sirve para conectar la carga a masa.

http://www.ti.com/lit/ds/symlink/uln2803a.pdf

Si tuviéramos que controlar elementos con más potencia como bombillas, deberemos usar contactores a los que atacaremos con los relés.

Motores

  • Motor DC. Un motor de corriente continua convierte la energía eléctrica en mecánica. Se compone de dos partes: el estator y el rotor. El estator es la parte mecánica del motor donde están los polos del imán. El rotor es la parte móvil del motor con devanado y un núcleo, al que llega la corriente a través de las escobillas. Si queremos cambiar el sentido de giro del rotor, tenemos que cambiar el sentido de la corriente que le proporcionamos al rotor, basta con invertir la polaridad de la pila o batería.
    Para controlar un motor DC desde Arduino, tendremos que usar un driver para motores para proporcionarle más corriente al motor ya que las salidas del Arduino sólo dan 40mA. De esta manera, con el driver podemos alimentar el motor con una fuente de alimentación externa.

El L293D es un integrado para controlar motores DC que usa el sistema puente en H. Es un sistema para controlar el sentido de giro de un motor DC usando cuatro transistores.  En la imagen vemos que los transistores se comportan como interruptores y dependiendo que transistores conducen y cuáles no cambia la polarización del motor, y con esto el sentido de giro.

El L293D tiene dos puentes H y proporciona 600mA al motor y soporta un voltaje entre 4,5V y 36V tal y cómo pone en el datasheet: http://www.ti.com/lit/ds/symlink/l293d.pdf

Nosotros usaremos la parte de la izquierda (los diodos externos hay que ponerlos para evitar las corrientes inducidas del motor). Cómo se aprecia en la imagen, los pins 3 y 6 son las salidas y se conectan a los bornes del motor. Y los pins 2 y 7 son las entradas donde conectaremos las salidas del Arduino. Dependiendo que valor ponemos entre los pins 2 y 7 el motor girará en un sentido o en otro.

Es muy IMPORTANTE que si optais o necesitais utilizar el driver L293, utiliceis diodos para evitar dañar el integrado con las corrientes parásitas generadas por los propios solenoides de las cargas. No obstante el modelo L293D no los necesita, ya que, los lleva incorporados el propio integrado, con lo que se hace “más sencillo” y “económico” su uso. También es cierto que L293 al no llevarlos integrados nos permite escoger los que mejor se adapten a nuestras cargas o necesidades.

Para controlar la velocidad del motor vamos a usar PWM. Sabemos que hay que atacar los pins 2 y 7 del L293D desde dos salidas del Arduino. En estas dos salidas habrá un PWM a cada una. Pero tenemos que invertir un PWM. ¿Qué quiere decir invertir? Pues que cuando en un PWM tengamos un pulso a un valor alto, en el otro PWM el mismo pulso sea valor bajo. En la imagen lo entenderemos de una manera más gráfica.

Montaje.

Fuente, más información y código en: http://diymakers.es/control-velocidad-y-sentido-de-motor-dc/

  •  Un servomotor (o también llamado servo) es similar a un motor de corriente continua pero con la capacidad de posicionarse en una posición determinada y permanecer fija en esta. Normalmente el ángulo es de 0 a 180 grados, y se alimentan a 5 voltios mínimo.

Un servomotor está formado por un motor de corriente continua, una caja reductora, un juego de engranajes, un potenciómetro y un circuito de control. Puede aguantar cierto peso a través del par o torque del servo indicado en sus características. Normalmente se indica con Kg/cm, que quiere decir los kilos que aguanta a 1 cm de distancia.

Para controlar un servo, se usa el PWM.  La mayoría trabaja en una frecuencia de 50 Hz (20ms). Cuando se manda un pulso, la anchura de este determina la posición angular del servo. La anchura varía según el servomotor pero normalmente es entre 0,5ms a 2,5ms.

El Arduino utiliza la librería <Servo.h> para controlar los servos y usa las siguientes funciones:

Fuente, más información y códigio en: http://diymakers.es/controlar-servomotor-con-mando-ir/

Más información: http://en.wikipedia.org/wiki/Servomotor

  • Motor paso a paso. Un motor paso a paso (también llamado stepper) es un dispositivo electromagnético que convierte impulsos eléctricos en movimientos mecánicos de rotación. La principal característica de estos motores es que se mueven un paso por cada impulso que reciben. Normalmente los pasos pueden ser de 1,8º a 90º por paso, dependiendo del motor. Son motores con mucha precisión, que permiten quedar fijos en una posición (como un servomotor) y también son capaces de girar libremente en un sentido u otro (como un motor DC).

Cuando circula corriente por una o más bobinas del estator se crea un campo magnético creando los polos Norte-Sur. Luego el rotor se equilibrará magnéticamente orientando sus polos Norte-Sur hacia los polos Sur-Norte del estator. Cuando el estator vuelva a cambiar la orientación de sus polos a través de un nuevo impulso recibido hacia sus bobinas, el rotor volverá a moverse para equilibrarse magnéticamente. Si se mantiene esta situación, obtendremos un movimiento giratorio permanente del eje. El ángulo de paso depende de la relación entre el nombre de polos magnéticos del estator y el nombre de polos magnéticos del rotor.

Los motores bipolares son más complejos de controlar ya que el flujo de corriente tiene que cambiar de dirección a través de las bobinas con una secuencia determinada. Para esto debemos conectar cada una de las dos bobinas en un puente en H (H-Bridge). Para esto, utilizaremos el integrado L293 que contiene dos H-Bridge (datasheet).

Para controlar motores paso a paso con Arduino, utilizaremos la librería <Stepper.h>:

Fuente, más información y código en: http://diymakers.es/mover-motores-paso-paso-con-arduino/

http://es.wikipedia.org/wiki/Motor_paso_a_paso

Este tipo de motor es mas lento, su rotación es precisa, es de fácil configuración y control , además mientras que los servos requieren un mecanismo de retroalimentación y circuitos de soporte para accionamiento de posicionamiento, un motor paso a paso tiene control de posición a través de su naturaleza de rotación por incrementos fraccionales.

Adecuado para las impresoras 3D y dispositivos similares en los que la posición es fundamental.

  • Otros motores, como los de alterna monofásicos que podemos controlar su encendido, apagado y sentido de giro con un relé o un contactor y los trifásicos que habrá que usar un arrancador para controlar su encendido y apagado y un variador para controlar la velocidad.

Disponemos de shields para controlar múltiples motores, ya sean DC, servos o paso a paso.

A la hora de seleccionar un motor, hay varios factores que deben evaluarse antes de decidir qué tipo utilizar. Estos factores incluyen velocidad, par, bucle abierto o cerrado, resolución, precio y mantenimiento.

La velocidad es uno de los criterios más importantes a tener en cuenta al elegir entre servo y motor paso a paso. Hay una relación inversa entre velocidad y par en los motores por pasos. Cuando la velocidad se incrementa, el par decrece. Los motores servo tienen un par constante hasta la velocidad nominal. Como criterio general, por encima de 1000 rpm, debe seleccionarse servo. Si la velocidad está por debajo de 500 rpm, los motores por pasos son una buena elección porque producen un par más alto que el servomotor de tamaño equivalente. Los servomotores tienen la capacidad de producir un par pico en cortos periodos de tiempo que es hasta 8 veces su par nominal continuo. Esto es particularmente útil cuando la resistencia del movimiento no es constante. Los motores por pasos no tienen esta capacidad.

En algunos casos que requieren la alta velocidad, alta aceleración o aplicaciones críticas, el bucle cerrado es importante. Esto ocurre por ejemplo cuando se trabaja con accesorios caros en los que los fallos no son aceptables.

Actuadores

Relés

http://www.trossenrobotics.com/c/data-i-o-Relay-switching-boards.aspx

Por último tenemos otros dispositivos que usan las salidas digitales, que podemos denominarlos periféricos:

  • Pantalal LCD
  • displays numéricos
  • pantallas táctiles
  • impresoras
  • zumbadores
  • pulsadores/interruptores
  • indicadores luminosos
  • etc..

Displays:

Como funciona un display LCD: http://ww1.microchip.com/downloads/cn/AppNotes/cn011075.pdf

Aprender a usar un display LCD:

Y mucho más…

https://www.sparkfun.com/categories/20

Ejercicio: Ejercicio13-sogatira.ino, con 2 botones y 5 leds hacer un juego que gane el que más veces pulse el botón en un tiempo y los leds se muevan en función del que más pulse. Simular el juego en http://123d.circuits.io/

Soluciónhttp://123d.circuits.io/circuits/463198-juego-sogatira

Práctica: Que sensores o actuadores necesitáis para vuestro proyecto? Planteadlo y buscamos como trabajar e interactuar con ellos con nuestro Arduino.