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 } }
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
renco53
el error está en la forma que se agrega la libreria yo lo hice desde sketch agragar libreria y asi me resulto bien (tenia el mismo problema)
fidel
Gracias, lo probaré, un saludo. fidel.
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
Pingback: Tema 3 – Conceptos básicos de microcontroladores y electrónica (3) | Aprendiendo Arduino
luis
para controlar 6 servos con ese sensor IR como le ago??
Matias
Lo que podrías hacer es emplear los nros del 1 al 6 y hacer 2 lecturas de IR, la primera para leer el nro de servo, y la segunda para leer el comando.
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.
Barbol
Hola, yo tengo la misma duda, ¿alguien sabe cómo?
jagonzalezariza
Estupenda la información. Felicidades.. Como podríamos controlar dos servomotores con el mismo mando?
Muchas gracias
Pingback: Motores | Aprendiendo Arduino
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.
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.
Pingback: Motores Arduino | Aprendiendo Arduino
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)
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
antonio
A mi me pasaba lo mismo, lo solucione cambiando la conexión GND, lo conecte al GND de los pines digitales.
Juan David Montañez Ramirez
Hola que tal, como seria para hacerlo pero solo con un sensor infrarojo?