Controlar servomotor con mando IR

CONTROLAR SERVOMOTOR CON MANDO IR

(23/12/13)

En este tutorial vamos a controlar un servomotor a través de un mando infrarrojo con Arduino. También veremos que es un servomotor y que es el protocolo NEC.

Material

-Arduino Uno Rev 3

-Servomotor

-Sensor receptor IR

-1 Condensador de 4,7uF

-1 Resistencia de 100 ohmios

-Fuente de alimentación

Servomotor

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 quilos que aguanta a 1 cm de distancia.

Para controlar un servo, se usa el PWM (véase 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:

-attach(): Para asociar un pin del Arduino al terminal de posición del servo.

-write(): Determina la posición angular con un valor entre 0 y 180.

-read(): Lee la posición angular actual del servo.

Receptor IR

Para este proyecto necesitamos un receptor de infrarrojos. En cualquier televisión o decodificador de TV se puede encontrar uno (normalmente de la clase TSOP). Son unos receptores de señal infrarrojos con un pre-amplificador de señal, que pueden alimentarse entre 2,5V a 5,5V y capaces de recibir señales a 38kHz, que es la frecuencia que usa el protocolo NEC. Su salida se conecta directamente a la entrada del Arduino.

Protocolo NEC

El protocolo NEC es un protocolo de infrarrojos que usan todos los mandos de TV universales.

Consta de 32 bits (4 Bytes): 8 de dirección, 8 de dirección invertido, 8 de comando y 8 de comando invertido.

El protocolo NEC envía ráfagas de pulsos de 562,5us de duración a una frecuencia de 38KHz.

-Para enviar un 1 envía dos pulsos separados a 2,25ms.

-Para enviar un 0 envía dos pulsos separados a 1,12ms.

Al pulsar una tecla de un mando de infrarrojos tenemos el siguiente señal:

-Una rafaga de pulsos de 9ms, para establecer una cierta ganancia respecto el señal anterior.

-Un espacio de 4,5ms.

-La dirección (8 bits).

-El inverso lógico de la dirección (8 bits).

-El comando (8 bits).

-El inverso lógico del comando (8 bits).

-Un pulso de 562,5us para indicar el final de la transmisión.

Lectura de señales

Para este tutorial controlaremos la posición angular de un servomotor usando las siguientes teclas de este mando de infrarrojos.

Ahora que ya sabemos que es el protocolo NEC, necesitamos leer la señal de dichas teclas de nuestro mando infrarrojo. Para esto conectaremos la salida del receptor infrarrojos a un osciloscopio. Pero, ¿y si no tenemos ningún osciloscopio a mano?  Tranquilos, hay un pequeño truco. Utilizaremos la entrada de micrófono de la tarjeta de sonido del PC y el programa Audacity (link descarga).

Como la entrada de micrófono de la tarjeta del PC acepta un máxima de 1V, y el sensor IR saca un máximo de 5V, pondremos un potenciómetro de 100K a la salida de este para reducir el voltaje. Cogemos un cable de microfóno con conector minijack, pelamos los cables de un de los RCA y conectamos el positivo al cursor del potenciómetro y la masa a GND.

Una vez conectado, solo tenemos que abrir el programa Audacity, pulsar el boton GRABAR, pulsar la tecla del mando infrarrojo y pulsamos PARAR del programa. Luego, hacemos zoom dónde está el señal, nos vamos arriba a EFECTO, AMPLIFICAR y ACEPTAR. Y de esta manera obtenemos para su lectura el señal infrarrojo del protocolo NEC.

Otra manera de descubrir la señal de las teclas es con el Arduino usando la librería <IRremote.h> (descargar librería). Conectamos la salida del receptor IR al pin 11 del Arduino. Cargamos el ejemplo IRrecvDemo el cual nos muestra a través del Monitor Serial los códigos correspondientes a la tecla que hayamos pulsado en formato hexadecimal. Si hemos leído el código de la anterior manera y queremos comprobar si coinciden con la lectura del Arduino, tenemos que cambiar el formato de la variable a binario como se muestra en la siguiente imagen:

Una vez sabemos los códigos de las teclas del mando que vamos a usar, nos ponemos manos a la obra con el montaje y el programa.

Montaje

-Ajuntar las masas del Arduino y de la fuente de alimentación.

-Poner una resistencia de 100 ohmios en serie a la alimentación del Arduino y un condensador  de 4,7uF a masa para filtrar y mejorar la alimentación del sensor IR.

Programa

En el programa de Arduino usaremos la librería <Servo.h> para poder controlar el servomotor y la librería <IRremote.h> que se encargará de recibir el señal IR. También usaremos la comunicación serie para monitorizar a través del Monitor Serial la posición angular.

/*
  www.diymakers.es
  by A.García
  Controlar servomotor con mando IR
  Tutorial en: http://diymakers.es/controlar-servomotor-con-mando-ir/
*/

#include <Servo.h> //Importamos la librería para controlar servomotores
#include <IRremote.h> //Importamos la librería IRremote para recibir el señal IR

Servo servomotor; //Nombre del servomotor

int RECV_PIN = 11; //Pin del receptor IR
IRrecv irrecv(RECV_PIN);

decode_results results; //Variable del código NEC

int posicion; //Variable para determinar la posición angular del servo

void setup()
{
  Serial.begin(9600); //Inicializamos comunicación serie
  irrecv.enableIRIn(); //Inicializamos el receptor IR
  servomotor.attach(3); //Asociamos el servomotor al pin 3 del Arduino
  posicion=90; //Ponemos el servo a 90º al iniciar el programa
}

void loop()
{
  if (irrecv.decode(&results)) //Si el receptor IR recibe una señal, entra dentro de la función
  {
    switch(results.value) //Después de obtener el código NEC almacenada en la
                          //variable "results.value", es comparada con los códigos de nuestras teclas
    {
      case 0b11000010011010111111000001000100: //Código NEC de una tecla. Tiene que empezar con "0b" para que el Arduino
                                               //sepa que es binario
      posicion=90; //Posición del servo a 90º
      Serial.print("Posicion angular = "); //Visualización de la posición angular
      Serial.print(posicion);
      Serial.println("");
      break;

      case 0b1010011100000000001111011101000:
      posicion=0;//Posición del servo a 0º
      Serial.print("Posicion angular = ");
      Serial.print(posicion);
      Serial.println("");
      break;

      case 0b1110101100011001001110110000010:
      posicion=180;//Posición del servo a 180º
      Serial.print("Posicion angular = ");
      Serial.print(posicion);
      Serial.println("");
      break;

      case 0b11000100111010111100100101000:
      posicion=posicion+5;//Posición del servo a +5º
      if(posicion>180){posicion=180;} //Por si seguimos pulsando la tecla cuando la posición angular esta a 180º
                                     //para que no de un valor superior a este.
      Serial.print("Posicion angular = ");
      Serial.print(posicion);
      Serial.println("");
      break;

      case 0b1011111000100101110100011000100:
      posicion=posicion-5;//Posición del servo a -5º
      if(posicion<0){posicion=0;}//Por si pulsamos la tecla cuando la posición angular esta a 0º
                                 //para que no de un valor inferior a este.
      Serial.print("Posicion angular = ");
      Serial.print(posicion);
      Serial.println("");
      break;

    }
    servomotor.write(posicion); //El servo se posiciona a la posición angular que determina la variable "posicion"

    irrecv.resume(); //Preparado para recibir la siguiente señal IR

  }

}

16 thoughts on “Controlar servomotor con mando IR

  • Avatar

    fidel oses azanza

    Buenas tardes, he querido probar vuestro programa «IRrecvDemo» , y al compilar me da este error:
    Arduino: 1.5.7 (Mac OS X), Placa:»Arduino Mega or Mega 2560, ATmega2560 (Mega 2560)»

    /Applications/Arduino 1.5.app/Contents/Java/libraries/RobotIRremote/src/IRremoteTools.cpp:5:16: error: ‘TKD2’ was not declared in this scope
    int RECV_PIN = TKD2; // the pin the IR receiver is connected to
    ^

    This report would have more information with
    «Show verbose output during compilation»
    enabled in File > Preferences.
    Muchas gracias, por atenderme. fidel

    Reply
  • Avatar

    eduardo

    hola que tal he checado el programa y sale este error
    IRrecord_Paco.pde:3:19: fatal error: servo.h: No such file or directory
    compilation terminated.
    Error de compilación
    de antemano muchas gracias si resolvieras mi duda gracias

    Reply
  • Pingback: Tema 3 – Conceptos básicos de microcontroladores y electrónica (3) | Aprendiendo Arduino

  • Avatar

    willy

    hola, en este proyecto usamos un control ir. pregunta. …??? sera pasible convertir la entrada del microfono en emisor ir y enviar por el los codigos ir, de la misma manera que se hizo al convertirlo en receptor ir. gracias es muy bueno tu trabajo.

    Reply
  • Pingback: Motores | Aprendiendo Arduino

  • Avatar

    Yillmer

    Me aparece este error:
    C:\Program Files (x86)\Arduino\libraries\RobotIRremote\src\IRremoteTools.cpp:5:16: error: ‘TKD2’ was not declared in this scope

    int RECV_PIN = TKD2; // the pin the IR receiver is connected to

    Se encontraron múltiples librerías para «IRremote.h»
    Usado: C:\Program Files (x86)\Arduino\libraries\RobotIRremote
    No usado: C:\Users\General\Documents\Arduino\libraries\Arduino-IRremote-master
    exit status 1
    Error compilación en tarjeta Arduino/Genuino Uno.

    Reply
    • Avatar

      Edgar Ricardo

      Hola Yillmer, si aún te interesa… lei del sitio de donde se instala la librería (https://github.com/shirriff/Arduino-IRremote) que la librería IRremote (la de este proyecto) y la RobotIRremote (que estas usando o tienes vinculada al proyecto) no son compatibles así que hay que desistalar la última para poder usar la primera en este proyecto.

      Reply
  • Pingback: Motores Arduino | Aprendiendo Arduino

  • Avatar

    Rafa

    La verdad es que si intento utilizar el programa o uno muy similar me generan conflictos el IR y la libreria de Servo, hace que el servo vibre de una forma un tanto extraña y no se el porque. Alguien puede decirme porque el servo vibra? (se escuchan ruidos y tiembla)

    Reply
  • Avatar

    Rey Lozano

    Hola colegas solicito una ayuda él programa solo con él terminal seria . digo xq cuando lo desconecto él USB del arduino no hace ninguna función

    Reply

Deja un comentario