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

Conceptos Básicos de Comunicaciones

La telemática es una disciplina científica y tecnológica, originada por la convergencia entre las tecnologías de las telecomunicaciones y de la informática.

Algunas de las aplicaciones de la telemática podrían ser cualquiera de las siguientes:

  • Cualquier tipo de comunicación a través de internet (como por ejemplo el acceso a páginas web o el envío de correos electrónicos) es posible gracias al uso de las tecnologías desarrolladas en este ámbito.
  • El uso de las mensajerías instantáneas está directamente relacionado con la telemática, ya que esta materia se encarga en parte de controlar ese intercambio de mensajes entre dos entidades distintas.
  • Los sistemas GPS (Global Positioning System).

Más información: http://es.wikipedia.org/wiki/Telem%C3%A1tica

Protocolos de comunicación

Un protocolo de comunicación es un conjunto de normas que están obligadas a cumplir todos las máquinas y programas que intervienen en una comunicación de datos entre ordenadores, o cualquier otro dispositivo sin las cuales la comunicación resultaría caótica y por tanto imposible.

En nuestro caso vamos a ver Arduino como el elemento para comunicar cualquier elemento físico con otro mediante una red interna o Internet usando diversos protocolos estándar. Arduino es capaz de implementar estos protocolos mediante programación o usando librerías.

Por ejemplo, podemos usar Arduino para conectar un sistema de riego y una estación meteorológica o con una plataforma de terceros (https://opendata.aemet.es/centrodedescargas/inicio) a través de Internet usando protocolos estándar.

Los protocolos de comunicación permiten el flujo información entre equipos distintos con diferentes características pero que hablan el mismo lenguaje (protocolo) que lo tienen implementado internamente o usan una pasarela intermedia, por ejemplo, dos ordenadores conectados en la misma red pero con protocolos diferentes no podrían comunicarse jamás, para ello, es necesario que ambas «hablen» el mismo idioma. El protocolo TCP/IP fue creado para las comunicaciones en Internet. Para que cualquier ordenador o dispositivo que se conecte a Internet es necesario que tenga instalado este protocolo de comunicación, ya sea mediante una tarjeta de red o WiFi.

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

Capas OSI

En el campo de las redes informáticas, los protocolos se pueden dividir en varias categorías. Una de las clasificaciones más estudiadas es la OSI.

Según la clasificación OSI, la comunicación de varios dispositivos se puede estudiar dividiéndola en 7 niveles, que son expuestos desde su nivel más alto hasta el más bajo:

Nivel Nombre Categoría
Capa 7 Nivel de aplicación Aplicación
Capa 6 Nivel de presentación
Capa 5 Nivel de sesión
Capa 4 Nivel de transporte
Capa 3 Nivel de red Transporte de datos
Capa 2 Nivel de enlace de datos
Capa 1 Nivel físico

Pinchando en cada capa hay una explicación detallada de cada una.

  • Capa física: Es la que se encarga de la topología de la red y de las conexiones globales de la computadora hacia la red, tanto en lo que se refiere al medio físico como a la forma en la que se transmite la información.
    Más información: http://es.wikipedia.org/wiki/Capa_f%C3%ADsica
  • Capa de enlace de datos: Esta capa se ocupa del direccionamiento físico, del acceso al medio, de la detección de errores, de la distribución ordenada de tramas y del control del flujo. Es uno de los aspectos más importantes a revisar en el momento de conectar dos ordenadores, ya que está entre la capa 1 y 3 como parte esencial para la creación de sus protocolos básicos, para regular la forma de la conexión entre ordenadores determinando el paso de tramas. (trama = unidad de medida de la información en esta capa, que no es más que la segmentación de los datos trasladándose por medio de paquetes)
    Más información: http://es.wikipedia.org/wiki/Capa_de_enlace_de_datos
  • Capa de red: Se encarga de identificar el enrutamiento existente entre una o más redes. Las unidades de información se denominan paquetes, y se pueden clasificar en protocolos enrutables y protocolos de enrutamiento. El objetivo de la capa de red es hacer que los datos lleguen desde el origen al destino, aún cuando ambos no estén conectados directamente. Los dispositivos que facilitan tal tarea se denominan encaminadores o enrutadores, aunque es más frecuente encontrarlo con el nombre en inglés routers.
    Más información: http://es.wikipedia.org/wiki/Capa_de_red
  • Capa de transporte: Capa encargada de efectuar el transporte de los datos (que se encuentran dentro del paquete) de la máquina origen a la de destino, independizándolo del tipo de red física que esté utilizando. En el caso del protocolo TCP/IP, la PDU de la capa 4 se llama Segmento o Datagrama, dependiendo de si corresponde a TCP o UDP. Sus protocolos son TCP y UDP; el primero orientado a conexión y el otro sin conexión. Trabajan, por lo tanto, con puertos lógicos y junto con la capa red dan forma a los conocidos como Sockets IP:Puerto (191.16.200.54:80).
    Más información: http://es.wikipedia.org/wiki/Capa_de_transporte
    Listado de puertos TCP/UDP: http://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml
  • Capa de sesión: Esta capa es la que se encarga de mantener y controlar el enlace establecido entre dos dispositivos que están transmitiendo datos de cualquier índole. Por lo tanto, el servicio provisto por esta capa es la capacidad de asegurar que, dada una sesión establecida entre dos máquinas, la misma se pueda usar para las operaciones definidas de principio a fin, reanudándose en caso de interrupción. En muchos casos, los servicios de la capa de sesión son parcial o totalmente prescindibles.
    Más información: http://es.wikipedia.org/wiki/Capa_de_sesi%C3%B3n
  • Capa de presentación: El objetivo es encargarse de la representación de la información, de manera que aunque distintos equipos puedan tener diferentes representaciones internas de caracteres los datos lleguen de manera reconocible. Esta capa cumple tres funciones principales. Estas funciones son las siguientes: Formateo de datos, Cifrado de datos y Compresión de datos.
    Más información: http://es.wikipedia.org/wiki/Capa_de_presentaci%C3%B3n
  • Capa de aplicación: Ofrece a las aplicaciones la posibilidad de acceder a los servicios de las demás capas y define los protocolos que utilizan las aplicaciones para intercambiar datos, como correo electrónico (Post Office Protocol y SMTP), gestores de bases de datos y servidor de ficheros (FTP), por UDP pueden viajar (DNS y Routing Information Protocol). Hay tantos protocolos como aplicaciones distintas y puesto que continuamente se desarrollan nuevas aplicaciones el número de protocolos crece sin parar.
    Cabe aclarar que el usuario normalmente no interactúa directamente con el nivel de aplicación. Suele interactuar con programas que a su vez interactúan con el nivel de aplicación pero ocultando la complejidad subyacente. En el caso de Arduino se utilizan unas librerías que implementan el protocolo y ofrecen una serie de métodos que son usando de forma sencilla en el sketch para realizar la comunicación.
    Más información: http://es.wikipedia.org/wiki/Capa_de_aplicaci%C3%B3n

Pila OSI:

Estas imágenes explican claramente lo que ocurre al pasar de capa a capa antes de mandar los bits por el medio físico.

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

Por ejemplo modbus es un protocolo de capa 7 y en su parte física usa el protocolo RS-485 que engloba las capas 1 y 2 y define la características físicas de la comunicación como el voltaje de las señales enviadas.

Uso de Motores con Arduino

Motor DC Básico

Mover un motor DC variando la velocidad y sentido mediante un potenciómetro.

Basado en http://diymakers.es/control-velocidad-y-sentido-de-motor-dc/

Esquema de conexión.

Señales mandadas desde Arduino:

Solución: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio25-MotorDC_Basico

Ver las señales reales con un osciloscopio en los pines 9 y 10 y en la alimentación del motor.

Motor DC Avanzado

Mover un motor DC de 9V usando un integrado L293D (Quadruple Half-H driver). Para controlar la velocidad del motor se usará un potenciómetro conectado al pin A0. Además se usarán dos botones, uno conectado al pin digital 4 para controlar el sentido de giro del motor y otro conectado al pin digital 5 que controlará el encendido y apagado del motor. Con cada pulsación encendemos y apagamos el motor o usamos una dirección de giro u otra con el otro botón.

NOTA: en este caso para controlar la velocidad del motor se usa el pin enable del L293D en lugar de los dos pines de control y envía una señal PWM proporcional al valor leído del potenciómetro.

Datasheet: https://www.arduino.cc/documents/datasheets/H-bridge_motor_driver.PDF

Montaje:

Solución: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio26-MotorDC_Avanzado

Mover Servo

Controlar la posición de un servo con un potenciómetro.

Esquema de conexión:

Esquemático:

Tutorial: http://arduino.cc/en/Tutorial/Knob

Solución: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio27-Servo

Barrido con Servo

Programar un barrido continuo del 0 a 180º en un servo. Activar y desactivar el barrido con una pulsación de un botón. p.e. activación de un limpiaparabrisas. Hacer tres velocidades de barrido, cada pulsación sube de velocidad y la cuarta lo para.

Tutorial: http://arduino.cc/en/Tutorial/Sweep

Solución: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio28-Barrido_Servo

Servo Serial

Controlar la posición del servo como en el ejercicio “Mover servo” pero en lugar de hacerlo con un potenciómetro, hacerlo desde el puerto serie mandando el ángulo al que debe ir. Desde el monitor serie pregunta la posición y se manda un valor entre 0 y 180.

De la misma forma que controlamos desde el puerto serie, se puede extender a controlar el servo desde una aplicación en un ordenador o desde una página web.

Esquema de conexión:

Solución: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio29-Servo_Serial

Mover un Servo con un Acelerómetro

Una IMU (Inertial Measurement Unit) es un dispositivo capaz de medir la fuerza (aceleración) y la velocidad. Generalmente consta de un Acelerómetro y un Giroscopio. Por lo tanto una IMU no mide ángulos, por lo menos no directamente, requiere algunos cálculos.

Un dispositivo I2C muy interesante es el MPU-6050 que nos sirve para probar e introducirnos en el mundo de los giroscopios y acelerómetros.

Para esta práctica vamos a utilizar una Breakout board bastante típica llamada GY-521, que incluye la IMU MPU-6050 y un regulador de tensión, con lo que podemos alimentar a tanto 3.3V como a 5V.

El siguiente diagrama muestra la orientación de los ejes de sensibilidad y la polaridad de rotación.

El acelerómetro mide la aceleración. La aceleración puede expresarse en 3 ejes: X, Y y Z, las tres dimensiones del espacio. Por ejemplo, si mueves la IMU hacia arriba, el eje Z marcará un cierto valor. Si es hacia delante, marcará el eje X, etc. La gravedad de la Tierra tiene una aceleración de aprox. 9.8 m/s², perpendicular al suelo como es lógico. Así pues, la IMU también detecta la aceleración de la gravedad terrestre. Gracias a la gravedad terrestre se pueden usar las lecturas del acelerómetro para saber cuál es el ángulo de inclinación respecto al eje X o eje Y.

Supongamos que la IMU esté perfectamente alineada con el suelo. Entonces, como puedes ver en la imagen, el eje Z marcará 9.8, y los otros dos ejes marcarán 0. Ahora supongamos que giramos la IMU 90 grados. Ahora es el eje X el que está perpendicular al suelo, por lo tanto marcará la aceleración de la gravedad.

Si sabemos que la gravedad es 9.8 m/s², y sabemos qué medida dan los tres ejes del acelerómetro, por trigonometría es posible calcular el ángulo de inclinación de la IMU. Una buena fórmula para calcular el ángulo es:

Dado que el ángulo se calcula a partir de la gravedad, no es posible calcular el ángulo Z (giro sobre si mismo) con esta fórmula ni con ninguna otra. Para hacerlo se necesita otro componente: el magnetómetro, que es un tipo de brújula digital. El MPU-6050 no lleva, y por tanto nunca podrá calcular con precisión el ángulo Z. Sin embargo, para la gran mayoría de aplicaciones sólo se necesitan los ejes X e Y.

Esquema de conexión IMU:

Esquema conexión servo:

Mover el servo en función del ángulo en el eje x obtenido de la IMU.

Solución: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio30-Servo_IMU

Motor Paso a Paso

Mover un motor paso a paso modelo 28BYJ-48 con su adaptador basado en el chip ULN2003A.

El 28BYJ-48 tiene un paso de 5.625 grados (64 pasos por vuelta). El reductor interno tiene una relación de 1/64. Combinados, la precisión total es de 4096 pasos por vuelta, equivalente a un paso de 0.088º, que es una precisión muy elevada.

Es un motor paso a paso unipolar con las siguientes características:

  • Tensión nominal de entre 5V y 12 V.
  • 4 Fases.
  • Resistencia 50 Ω.
  • Par motor de 34 Newton / metro más o menos 0,34 Kg por cm.
  • Consumo de unos 55 mA.
  • 64 pasos por vuelta (con medios pasos).
  • Reductora de 1 / 64.

Datasheet: http://robocraft.ru/files/datasheet/28BYJ-48.pdf

Vamos a usar la secuencia de medios pasos. Con esta secuencia conseguimos una precisión de la mitad del paso. El par desarrollado varía ya que en algunos pasos activamos dos bobinas y en otras solo una, pero a la vez el giro se encuentra más “guiado”, por lo que en general ambos efectos se compensan y el funcionamiento es bueno, salvo en aplicaciones donde estemos muy al límite del par máximo.

Expresando la secuencia en forma de tabla resulta:

Medio-paso A B A’ B’
1 ON OFF OFF OFF
2 ON ON OFF OFF
3 OFF ON OFF OFF
4 OFF ON ON OFF
5 OFF OFF ON OFF
6 OFF OFF ON ON
7 OFF OFF OFF ON
8 ON OFF OFF ON

Modo de medio paso: secuencia de señal de control 8 pasos (recomendada) 5.625 grados por paso / 64 pasos por una revolución del eje del motor interno. Relación de transmisión 64. Total 64 x 64 = 4096 pasos.

Modo de paso completo: secuencia de señal de control de 4 pasos 11.25 grados por paso / 32 pasos por una revolución de la interna eje de motor. Relación de transmisión 64. Total 64 x 32 = 2048 pasos.

Esquema de conexión:

Conexiones de la placa de driver:

Ejercicio basado en http://www.prometec.net/motor-28byj-48/

Otros tutoriales:

Solución: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio31-Stepper

La otra manera de programar un motor 28BYJ-48 es utilizar la librería Steper que viene incluida con el entorno de desarrollo oficial de Arduino. Esta librería nos facilita el uso de este tipo de motores y viene adaptada para motores bipolares. En este caso la librería stepper usa el modo de paso completo en lugar del medio paso. En este caso el nº de pasos por vuelta es 2048.

Llevando esta secuencia de encendido a una tabla, que posteriormente usaremos para el código, la secuencia quedaría de la siguiente forma:

Paso A B A’ B’
1 ON OFF OFF OFF
2 OFF ON OFF OFF
3 OFF OFF ON OFF
4 OFF OFF OFF ON

Código para mover el motor:

 
 
#include <Stepper.h>
#define STEPS 2048
 
Stepper stepper(STEPS, 8, 9, 10, 11);

void setup() {
  stepper.setSpeed(10);
}
 
void loop() {
  stepper.step(2048);
}

Motores Arduino

Como ya se ha visto anteriormente, un pin de Arduino solo puede tener valores de 0 y 5 voltios y dar hasta 40 mA de corriente. Esto es insuficiente para mover casi cualquier motor del tipo que sea, por lo tanto si queremos que Arduino maneje un motor, deberemos usar un driver.

Un motor driver es un amplificador de corriente cuya función es tomar una pequeña señal de control de baja corriente y convertirla en una señal de alta corriente que pueda alimentar el motor. Hay muchos tipos de motor drivers en función del motor a manejar, máximo voltaje, máxima corriente de salida, etc…

Más información: http://www.futureelectronics.com/en/drivers/motor-driver.aspx

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, es decir, basta con invertir la polaridad de la pila o batería.

Para controlar un motor DC desde Arduino, tendremos que usar un driver de motores para proporcionar más corriente al motor ya que las salidas del Arduino sólo dan hasta 40mA y más voltaje porque este tipo de motores suelen ser de 6V o más. El driver debemos alimentarlo con una fuente de alimentación externa con el voltaje y corriente eléctrica suficiente para mover el motor..

Más información:

Driver L293D

El L293D es un integrado para controlar motores DC que usa doble puente en H. Es un sistema para controlar el sentido de giro de un motor DC usando cuatro transistores y también para variar la velocidad del motor.  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. Estas especificaciones nos indican el tipo de motores que podremos usar con este driver.

Nosotros usaremos la parte de la izquierda (los diodos externos hay que ponerlos para evitar las corrientes inducidas del motor si usamos el modelo L293 y están incluidos en el integrado si usamos el L293D). Como se aprecia en la imagen, los pins 3 y 6 son las salidas y se conectan a los bornes del motor. Y los pines 2 y 7 son las entradas donde conectaremos las salidas del Arduino. Dependiendo del valor aplicado entre los pines 2 y 7 el motor girará en un sentido o en otro.

IMPORTANTE: si se utiliza el driver L293, hay que poner 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, lo que se hace “más sencillo” y “económico” su uso. También es cierto que L293 al no llevar los diodos integrados nos permite escoger los que mejor se adapten a nuestras cargas o necesidades.

Para controlar la velocidad del motor se usa la técnica de PWM. Sabemos que hay que atacar los pines 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:

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

Ejemplo del playground de Arduino: http://playground.arduino.cc/Main/DirectionalMotorControlWithAL293D

Driver L298

Otro driver de motor muy utilizado es el L298 (datasheet) que es el utilizado por el Arduino motor shield. Este driver es similar en funcionamiento al anterior pero posee un sensor de corriente muy útil y puede manejar corrientes más grandes que el L293D.

Arduino motor shield: https://www.arduino.cc/en/Main/ArduinoMotorShieldR3

Montaje:

Diagrama:

Esquema de conexión:

L298N Breakout Board (Esta breakout board es muy sencilla y bien documentada):

Specification:

  • chipset: L298N
  • Driving power supply voltage Vs: +5V  to +46V
  • Peak current of driving power supply Io: 2A
  • Vss: +5V to +7V
  • Current of logic power supply: 0 – 36mA
  • PWM control signal range:
    • Low level: -0.3V < Vin < 1.5V
    • High level: 2.3V < Vin< Vss
  • Enable signal range:
    • Low level: -0.3V
    • High level: 2.3V < Vin< Vss
  • Maximum power consumption: 25W
  • Working temperature: -25C to 130C
  • Regulador de tensión para los 5V.

Esquemático:

Diferencias entre el L293 y el L298:

  • L293 es un quadruple half-H driver y el L298 es un dual full-H driver
  • El L293 al tener 4 canales permite manejar motores paso a paso de 4 hilos y el L298 solo tiene dos canales perfecto para manejar dos motores DC. En el L293 las cuatro líneas de entrada/salida son independientes.
  • La corriente de salida por canal en el L293 es de 1A, mientras que en el L298 es de 2A, por ese motivo el L298 puede llevar un disipador.
  • Los diodos protectores del L293D deben ponerse externamente en el L293 y L298

Video brushed DC motors https://www.baldengineer.com/videos/brushed-dc-motor-video-tutorial

Buen tutorial de uso de Arduino con L298: http://www.electrontools.com/Home/WP/2016/05/06/puente-h-con-driver-l298/

Arduino Motor Shield

El Arduino motor shield está basado en el L298 que es un dual full-bridge diseñado para cargas inductivas como relés, solenoides y motores DC o paso a paso. Me permite manejar dos motores DC controlando las velocidad y dirección de cada motor de forma independiente. También permite medir la corriente absorbida por cada motor entre otras características. La corriente máxima que puede manejar con 2A por canal y el voltaje máximo de suministro es de 50V.

Esquemático: https://www.arduino.cc/en/uploads/Main/arduino_MotorShield_Rev3-schematic.pdf

El L298 necesita dos alimentaciones, una para la parte de control (5V) y otra para los motores (12V). La de los motores en tu caso la coge del Vin al que conectas la fuente conmutada de 12V.

Los pines de alimentación en el Arduino motor shield son:

  • Vin en la borna de conexiones, es la entrada de alimentación a los motores conectados al shield. Una fuente de alimentación externa conectada a esta borna también alimenta a la placa Arduino sobre la que va montada el shield. Cortando el jumper “Vin Connect” se elimina esta alimentación a Arduino.
  • GND es la masa de los motores que va unida a la masa del Arduino.

Este shield dispone de dos canales llamados A y B y cada uno usa 4 de los pines de Arduino para manejar o monitorizar el motor. En total se usan 8 pines. Se pueden usar los canales separados para manejar dos motores DC o combinarlos para manejar un motor paso a paso bipolar.

Los pines son:

Function pins per Ch. A pins per Ch. B
Direction D12 D13
PWM D3 D11
Brake D9 D8
Current Sensing A0 A1

Si no se necesita el freno y el sensor de corriente, es posible deshabilitar estas características cortando los correspondientes jumpers en la parte trasera del shield. Los pines de freno al ponerlos a HIGH frenan el motor en lugar de dejarlos correr libremente al cortar la alimentación.

Mediante la función analogRead()  es posible leer la corriente en los pines de current sensing  como una entrada analógica normal. Está calibrado para medir 3.3V para la corriente máxima de 2A.

Esquema: https://www.arduino.cc/en/uploads/Main/arduino_MotorShield_Rev3-schematic.pdf

Más información: https://www.arduino.cc/en/Main/ArduinoMotorShieldR3

Ejemplos de uso:

Motor DC Brushless

Un motor DC sin escobillas o motor brushless es un motor eléctrico que no emplea escobillas para realizar el cambio de polaridad en el rotor. Los motores eléctricos solían tener un colector de delgas o un par de anillos rozantes. Estos sistemas, que producen rozamiento, disminuyen el rendimiento, desprenden calor y ruido, requieren mucho mantenimiento y pueden producir partículas de carbón que manchan el motor de un polvo que, además, puede ser conductor.

Los primeros motores sin escobillas fueron los motores de corriente alterna asíncronos. Hoy en día, gracias a la electrónica, se muestran muy ventajosos, ya que son más baratos de fabricar, pesan menos y requieren menos mantenimiento, pero su control era mucho más complejo. Esta complejidad prácticamente se ha eliminado con los controles electrónicos.

Más información:

Para cotrolar los motores brushless necesitaremos un ESC (Electronic Speed Control) https://en.wikipedia.org/wiki/Electronic_speed_control

El inversor debe convertir la corriente continua de la batería o fuente de alimentación en alterna de una frecuencia determinada. Algunas aplicaciones serían los coches y aviones con radiocontrol, que funciona con pilas.

Los motores brushless se usan habitualmente en los drones y son trifásicos con un variador para controlar de forma muy exacta la velocidad del motor.

Más información: https://learn.adafruit.com/adafruit-motor-selection-guide/brushless-dc-motor-control  

Servomotor

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.

Algunos servos servos pueden alimentarse directamente desde Arduino sin necesidad de un driver, lo que supone una ventaja. En caso de usar varios servos con un mismo Arduino, este no podrá alimentarlos y habrá que usar una fuente de alimentación externa.

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 de los servos 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.

En Arduino la frecuencia por defecto de PWM es de 500 Hz, pero con la librería servo conseguimos una señal PWM con la frecuencia y duty cycle adecuada.

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

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

Más información de servos: http://platea.pntic.mec.es/vgonzale/cyr_0204/ctrl_rob/robotica/sistema/motores_servo.htm

IMPORTANTE: La librería servo soporta hasta 12 servos en la mayoría de los Arduinos, pero deshabilita el uso de PWM en los pines 9 y 10 puesto que hace uso del timer que controla esas señales. En el caso del mega hay otras restricciones.

Más información:

Todos los servos tienen 3 cables de conexión uno para alimentación DC (normalmente 5-6V), otro para masa y el tercero para la señal.

Los tamaños de los servos son:

Características de los servos:

  • Torque: determina la máxima fuerza rotacional que puede aplicar el servo, se mide en kg.cm. Cambia a mínimo y máximo voltaje
  • Voltaje: mínimo y máximo
  • Corriente: con carga y sin carga.
  • Velocidad: la medida del tiempo que tarda en rotar un cierto número de grados, se mide en sec/60º. Es diferente a mínimo y máximo voltaje.

Tipos de servos, en función de cómo es procesada la señal:

  • Analógico: aplica señales de voltaje on off  para controlar la velocidad. El voltaje es constante. La frecuencia está estandarizada a 50 ciclos por segundo.
  • Digital: tiene un microprocesador dentro que analiza la señal y la procesa en pulsos de voltaje de alta frecuencia hasta 300 pulsos por segundo. Los pulsos serán más cortos en tiempo. Con esto se consigue una mayor velocidad y un torque constante. Estos servos tienen un tiempo de respuesta mayor y una mejor capacidad de retención. Estos servos tiene la desventaja de un mayor consumo eléctrico.

Más información sobre servos analógicos y digitales: http://www.futabarc.com/servos/digitalservos.pdf

La mayoría de los servos estándar y low cost, usan un motor DC estándar de 3 polos. Hay servos con motores de 5 polos que hace que el servo sea más rápido en aceleración y mayor torque en el arranque. Pero también hay servos:

  • Coreless: el núcleo de acero es sustituido por un bobinado ligero.
  • Brushless. Son más eficiente y dan más fuerza, además de una vida útil mayor.

El consumo eléctrico de un servo depende de la carga y el modelo del servo. Un servo analógico estándar consume entre 250-700mA. Por lo tanto si alimentamos varios servos desde el pin de 5V de Arduino es posible que nos sea posible moverlos por la limitación en amperios de Arduino, esa limitación viene del regulador de tensión que alimenta el bus de 5V de Arduino. Por ejemplo en el caso de Arduino UNO el regulador es el NCP1117ST50T3G que como puede verse en su datasheet http://www.onsemi.com/pub_link/Collateral/NCP1117-D.PDF puede dar hasta 1 amperio, aunque soporta picos mayores.

Algunos servos comerciales y características:

Ranuras de los servos: https://www.servocity.com/servo-spline-info

Tabla de selección de servos: https://www.ia.omron.com/data_pdf/guide/14/servo_selection_tg_e_1_1_3-13(further_info).pdf

Controladores para servos

Un servo puede controlarse directamente con un Arduino para generar la señal de control que hemos visto anteriormente.

También es posible adquirir controladores de servo y especialmente con capacidad de radiocontrol o para manejar muchos canales.

Controladores servo de pololu: https://www.pololu.com/category/12/rc-servo-controllers

Torobot controlador de 32 canales para servos:

Servo de rotación continua

Un servo de rotación continua es un motor cuyo circuito electrónico nos permite controlar la dirección de giro. A diferencia del servos anteriormente mencionados, no se detiene en una posición, sino que gira continuamente. Son muy utilizados en robótica y en muchas aplicaciones electrónicas, como en lectores de DVD.

En un servo de rotación continua, la función write() configura la velocidad del servo en lugar del ángulo de posición. En este caso 0 es máxima velocidad en giro contrario al sentido horario, 180 es máxima velocidad en sentido horario y 90 motor parado.

Trucar un servo a rotación continua: http://www.ardumania.es/trucar-servo-a-rotacion-continua/

Servos de rotación continua comerciales:

Tutorial sencillo de BQ: http://diwo.bq.com/muevete-el-servo-de-rotacion-continua/

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.

Elementos de un motor paso a paso:

En la construcción de un motor paso a paso el estator puede tener 4, 8, etc… polos y los imanes permanentes del rotor pueden tener múltiples polos. En función del número de ellos serán los pasos que conforman una vuelta del motor paso a paso.

Funcionamiento:

Los motores paso a paso se dividen en dos grandes grupos: bipolar y unipolar. Muy buena comparativa de motores paso a paso unipolares o bipolares: https://www.330ohms.com/blogs/blog/85507012-motores-a-pasos-unipolares-o-bipolares

La mayoría de los motores que encontraremos son bipolares puesto que son más baratos, con mayor torque y más pequeños. La desventaja es que el control es más complicado.

Motores paso a paso de Pololu: https://www.pololu.com/category/87/stepper-motors

Más información sobre los motores paso a paso:

Motor Paso a Paso vs Servo

Los motores paso a paso son más lentos, su rotación es más 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.

Los motores paso a paso son adecuados para las impresoras 3D y dispositivos similares en los que la posición es fundamental.

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 para aplicaciones con velocidades bajas los motores paso a paso 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 alta velocidad, alta aceleración o aplicaciones críticas, el bucle cerrado de los servos es importante. Esto ocurre por ejemplo cuando se trabaja con accesorios caros en los que los fallos no son aceptables.

Guía para comprar motores paso a paso: https://www.staticboards.es/blog/motores-paso-paso/

Guía de selección de motores: https://learn.adafruit.com/adafruit-motor-selection-guide/types-of-motors

Web con muchos motores: https://www.servocity.com/

NOTA: En caso de que tengamos un motor DC y queramos hacer un control de posición, podemos añadirle un encoder y si queremos más par es posible añadir una reductora. Ejemplo de un motor CC con reductora y encoder como alternativa a steppers y servos: https://www.servocity.com/html/26_rpm_planetary_gearmotor_w__.html#.VpfFM_nhDct

Drivers Motores Paso a Paso

Los motores bipolares son más baratos pero 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).

También es posible usar el L298 para controlar un motor paso a paso.

Motor bipolar:

Señal que mandamos para controlar un paso a paso (4 pasos):

En pasos de 90 grados, como se magnetiza cada núcleo:

Más información: http://www.hteck.ca/electronics/stepper-motor-drv/sm-driver.html

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

Con esta librería mandamos los pasos mediante programación en lugar de hacerlo con una señal del microcontrolador.

Step wire 1 wire 2 wire 3 wire 4
1 High low high low
2 low high high low
3 low high low high
4 high low low high

Más información y código en:

Para los motores paso a paso podemos usar las mismas shields que para los motores DC:

Para el caso de un motor unipolar es más sencillo el control y no es necesario un L293D sino que es suficiente con unos transistores o unos pares darlington.

Motor unipolar 28BYJ-48 controlado con un chip ULN2003A que es un array de transistores Darlington, que soporta hasta 500 mA.

Esquema de conexión usando 4 pines del microcontrolador:

Drivers Pololu

Los drivers de motores paso a paso más famosos son los Pololu, en concreto los A4988 y DRV8825.

Drivers de Pololu: https://www.pololu.com/category/120/stepper-motor-drivers, estos drivers son los más usado en impresoras 3D y máquinas CNC.

Drivers de un motor paso a paso:

En el caso del A4998 cuenta con dos filas de 8 pines a cada lado. Por un lado tiene los pines para controlar la parte digital, y por el otro tiene la parte dedicada a la corriente de los motores. Incluye un potenciómetro para regular la corriente máxima que circula por las bobinas del motor.

En la parte digital tenemos los siguientes pines:

ENABLE Permite que el driver pueda enviar corriente al motor
MS1 Configuración de los micropasos
MS2 Configuración de los micropasos
MS3 Configuración de los micropasos
RESET Normalmente conectado a Sleep para que el driver funcione
SLEEP Normalmente conectado a Reset para que el driver funcione
STEP El arduino manda un pulso para que el motor avance un paso
DIR Indicamos la dirección de giro del motor que queremos

En la parte de potencia tenemos estos pines:

VMOT Alimentación de los motores (entre 8V y 35V)
GND Ground de la parte de motores
2B Bobina 2
2A Bobina 2
1A Bobina 1
1B Bobina 1
VDD Alimentación de la parte digital (5V)
GND Ground de la parte digital

Esquema de conexión A4998:

Los drivers basados en el Texas Instruments DRV8825 se usa en aplicaciones para más fuerza en los motores. Este es el chip más popular entre los usuarios más avanzados de CNC y de Impresoras 3D.

Fantastica guía de drivers https://www.staticboards.es/blog/drv8825-vs-a4988/

Tiene dos ventajas fundamentales sobre el chip de Allegro A4988.

  • Es más potente. Permite una corriente de pico de 2.5A.
  • Con la misma configuración de jumpers, permite 32 micropasos, que da un movimiento más fluido.

Esquema de conexión DRV8825:

Cuando configuramos una impresora 3D o una máquina CNC, tenemos que recordar los DRV8825 tiene 32 micropasos, y el a4988 tiene 16 micropasos. El DRV8825 funciona con 45V y el A4988 sólo 35V. El DRV8825 puede manejar 1.5A sin necesidad de un disipador adicional. El A4988 sólo llega a los 1.2A

Los tiempos de las señales son ligeramente distintos. Los DRV8825 necesitan un tiempo mínimo de pulso de 1.9µs y el A4988 de 1µs. Esto puede afectar a la velocidad máxima a la que puedes mover el driver, ya que tienes que esperar a que el driver detecte el pulso el doble de tiempo.

Estos drivers permiten pasar más o menos corriente a tu motor. No todos los motores están preparados para soportar la misma cantidad de corriente circulando por las bobinas. Si circula demasiada corriente los motores se van a sobrecalentar.

Unos drivers calibrados mantienen los motores a una temperatura adecuada. Para calibrarlos hay que comprobar que motor estamos usando y la corriente que admite, luego y con un polímetro ajustar el potenciómetro a la corriente adecuada.

Con estos drivers el Arduino manada los pulsos al driver pero con el L293D o el L298N el pulso lo genero en la programación de Arduino con la librería Stepper.h.

Disponemos de la librería https://github.com/laurb9/StepperDriver de Arduino para manejar motores paso a paso con estos drivers de Pololu. Tiene un código más depurado y puedes configurar la velocidad de motor en RPM y los microsteps.

Más información de estos drivers: https://www.luisllamas.es/motores-paso-paso-arduino-driver-a4988-drv8825/

Ejemplo de uso de DRV8825 con Arduino sin librería: http://www.geeetech.com/wiki/index.php/DRV8825_Motor_Driver_Board

Tutoriales:

Microstepping

La técnica de microstep permite multiplicar hasta por 32 el número de pasos de un motor paso a paso, haciendo que tenga un movimiento más suave. Consiste en no usar la corriente completa en cada bobina cada pulso, sino aplicar un porcentaje de la corriente simulando una onda senoidal que se aplica a las bobinas del motor.

Los  motores paso a paso más habituales tienen 200 pasos por vuelta, por lo tanto cada paso es de 1,8º.

Cuando usamos los full steps la salida del driver al motor es una onda cuadrada y produce movimientos bruscos. Cuando mayor es el microstepping, la salida del driver más se parece a una onda senoidal y el motor se mueve de una forma más suave. Al aumentar los micro steps, el torque disminuye, de forma que si aumentamos mucho los pasos intermedios llega un punto que el motor no puede mover la carga. Normalmente microstepping de 1/4, 1/8 o 1/16 son adecuados para obtener un movimiento suave.

El microstepping nos dice cuantos micro steps necesitamos para hacer un paso completo, por ejemplo un microstepping de 1/4 significa que se dan 4 micropasos para hacer un paso completo de 1,8º y una vuelta son 800 micropasos.

Ver video https://www.youtube.com/watch?v=bkqoKWP4Oy4 que explica como funciona un motor paso a paso y como controlarlo. A partir del minuto 5 habla de microstepping.

En el caso de los drivers de pololu los microsteps se configuran mediante 3 pines. En el caso del A4988 la tabla de configuración es:

Más información sobre microstepping:

Ejemplo Sensor de Temperatura

Sensor Temperatura

Leer la sonda de temperatura TMP36 y en función de unas condiciones de temperatura encender 3 LEDS. Encender el primero al alcanzar 22 grados, el segundo a los 24 y el tercero a los 26. También que muestre por pantalla la temperatura leída por el puerto serie en Celsius si lee una C por el puerto serie o en Fahrenheit si lee una F, en cualquier otro caso que muestre el texto: “¿En que formato quieres que muestre la temperatura?”

Hacer que se pueda ver por el serial plotter la gráfica de la temperatura, imprimiendo el valor cada 5 segundos con la librería mstimer2.

Datasheet sonda: https://www.arduino.cc/en/uploads/Main/TemperatureSensor.pdf

Esquema conexión (no conectar el módulo bluetooth):

Solución: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio23-Temperatura  

Histeréis

Ver el efecto de parpadeo al no poner histéresis. Añadir una histéresis de 1 grado en cada salto de temperatura para iluminar el led.

Histeresis: https://es.wikipedia.org/wiki/Hist%C3%A9resis

Diagrama de Estados:

Solución: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio24-Temperatura_Histeresis

Sensores Arduino

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 o un sensor capacitivo), una tensión eléctrica (como en un termopar), una corriente eléctrica (como en un fototransistor), etc.

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

  • Digitales
  • Analógicos

Dependiendo del tipo de sensor, deberemos conectarlo a una entrada digital o analógica.

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 digital. En caso que el sensor use comunicación por bus, deberemos usar algunos de los buses que implementa Arduino o usar hardware adicional que nos proporcione un interfaz entre el Arduino y el bus.

Un ejemplo de sensor analógico sería el ACS714, es un sensor de efecto hall que mide las corrientes eléctricas que pasan a través del chip y devuelve un valor en voltaje proporcional a la corriente que circula por el sensor:

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

Como medir corriente con Arduino y un sensor ACS714: http://playground.arduino.cc/Main/CurrentSensing

Tutorial de uso del sensor ACS714: http://www.instructables.com/id/How-to-Measure-AC-Current-using-Hall-Effect-Sensor/?ALLSTEPS

Características de  los sensores

  • Rango de medida: dominio en la magnitud medida en el que puede aplicarse el sensor.
  • Precisión: es el error de medida máximo esperado.
  • Offset o desviación de cero: valor de la variable de salida cuando la variable de entrada es nula. Si el rango de medida no llega a valores nulos de la variable de entrada, habitualmente se establece otro punto de referencia para definir el offset.
  • Linealidad o correlación lineal.
  • Sensibilidad de un sensor: suponiendo que es de entrada a salida y la variación de la magnitud de entrada.
  • Resolución: mínima variación de la magnitud de entrada que puede detectarse a la salida.
  • Rapidez de respuesta: puede ser un tiempo fijo o depender de cuánto varíe la magnitud a medir. Depende de la capacidad del sistema para seguir las variaciones de la magnitud de entrada.
  • Derivas: son otras magnitudes, aparte de la medida como magnitud de entrada, que influyen en la variable de salida. Por ejemplo, pueden ser condiciones ambientales, como la humedad, la temperatura u otras como el envejecimiento (oxidación, desgaste, etc.) del sensor.
  • Repetitividad: error esperado al repetir varias veces la misma medida.

Más información: http://es.wikipedia.org/wiki/Sensor#Caracter.C3.ADsticas_de_un_sensor

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

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

Catálogo de sensores:

Sensores con 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, etc… para comunicaciones con periféricos, reemplazando los buses paralelos, 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.

Arduino dispone de buses serie I2C y SPI para comunicarse con dispositivos sin necesidad de HW adicional

Bus RS485:

Más información en: http://es.wikipedia.org/wiki/Bus_(inform%C3%A1tica)

Existen muchos tipos de buses de comunicaciones, algunos de ellos los implementa arduino mediante controladores HW integrados en la MCU (I2C) o mediante una librería como one wire. 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.

Sondas DHT11 y DHT22

Los sensores DHT11 o DHT22 que son ampliamente usados con Arduino, son unos pequeños dispositivos que nos permiten medir la temperatura y la humedad. A pesar que estas medidas son analógicas, estos sensores los tendremos que conectar a pines digitales, ya que la señal de salida es digital a un bus punto a punto. Llevan un pequeño microcontrolador interno para hacer el tratamiento de señal. Estos sensores han sido calibrados en laboratorios, presentan una gran fiabilidad.

Estos 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

Más información sobre la sonda DHT22: http://www.seeedstudio.com/wiki/Grove_-_Temperature_and_Humidity_Sensor_Pro

Datasheet de sondas DHT22:

Este esquema explica como funciona este sensor y el protocolo de comunicación. La librería implementa el protocolo y facilita el uso de la sonda con Arduino.

Vemos como para un mismo sensor tenemos diferentes librerías con funciones y uso diferente en cada una de ellas. Cada uno de los distribuidores de estas sondas ha creado su propia librería.

Sonda DHT18B20

Otra sonda de temperatura muy usada con Arduino es la DS18B20, esta usa un bus de comunicación multipunto llamado one wire, 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

Datasheet 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

Protocolo one-wire: