martes, 25 de febrero de 2014

Utilización mando infrarrojos III: Control servomotor

En esta ocasión, pasaremos a controlar un servomotor con nuestro mando y sensor de infrarrojos. Además, incorporaremos de forma auxiliar dos LEDs para conseguir un mayor atractivo al proyecto.


Ver Utilización mando infrarrojos I: Lectura código y ejemplo para una introducción y entender la lectura de los códigos del mando.



Primero, realizaremos el circuito, teniendo en cuenta los componentes a utilizar:

  • LED azul, junto con su resistencia de 220Ω
  • LED verde, junto con su resistencia de 220Ω
  • Servomotor
  • Sensor de infrarrojos junto con una resistencia de 220Ω
  • Breadboard
  • Cables


(un poco engorroso el dibujo, pero no hemos encontrado otra posibilidad. Si se trabaja paso por paso no es complicado)

En cuanto al sketch, es el siguiente:


#include <WProgram.h>
#include <NECIRrcv.h> //Librería del protocolo NEC
#include <Servo.h> // Librería del servo
#define IRPIN 8 // Pin del receptor IR
#define verde 13
#define azul 12

NECIRrcv ir(IRPIN);

/*INFORMACION LECTURAS
power = 3125149440;  //Código correspondiente al boton POWER del mando a distancia
uno = 4077715200; //Código correspondiente al botón 1 del mando a distancia
dos = 3877175040; //Código correspondiente al botón 2 del mando a distancia
tres = 2707357440; //Código correspondiente al botón 3 del mando a distancia
mas = 4127850240;
menos = 3927310080;
*/

Servo servo;

void setup()
{
  servo.attach (6);
  pinMode (verde, OUTPUT);
  pinMode (azul, OUTPUT);
  //Serial.begin(9600); //Iniciamos comunicación serie
  ir.begin(); //Iniciamos la recepción IR
  
}

void loop()
{
  unsigned long ircode; //Variable que contendrá el código decimal del botón pulsado
  while (ir.available()) 
  {
    ircode = ir.read(); //Leemos el código del botón pulsado
    
     switch (ircode){
       
       case 3125149440: //power
       digitalWrite (verde, LOW);
       digitalWrite (azul, LOW);
       servo.write (90);
       break;
       
       case 4077715200: // uno
       digitalWrite (verde, LOW);
       digitalWrite (azul, LOW);
       servo.write (60);
       delay (500);
       servo.write (120);
       delay (500);
       servo.write (60);
       delay (500);
       servo.write (120);
       break;
       
       case 3877175040: // dos
       digitalWrite (verde, HIGH);
       digitalWrite (azul, HIGH);
       servo.write (90);
       break;
       
       case 2707357440:  // tres
       digitalWrite (azul,LOW);
       digitalWrite (verde, LOW);
       delay(500);
       digitalWrite (verde, HIGH);
       delay(500);
       digitalWrite (verde, LOW);
       delay(500);
       digitalWrite (verde, HIGH);
       delay(500);
       digitalWrite (verde, LOW);
       delay(500);
       digitalWrite (verde, HIGH);
       delay(500);
       digitalWrite (verde, LOW);
       delay(500);
       digitalWrite (verde, HIGH);
       delay(500);
       digitalWrite (verde, LOW);
       break;
       
       case 4127850240: // más
       digitalWrite (verde, LOW);
       digitalWrite (azul, HIGH);
       servo.write (170);
       break;
       
       case 3927310080: // menos
       digitalWrite (verde, HIGH);
       digitalWrite (azul, LOW);
       servo.write (15);
       break; 
    
      default: //cualquier botón pulsado
      digitalWrite (azul, LOW);
      digitalWrite (verde, LOW);   
     }
  }
}


En cuanto a la declaración y uso de los LEDs, es recomendable echarle un vistazo a Diodo LED. Introducción y ejemplos, mientras que para el servomotor consultar Servomotor. Introducción y ejemplos.

Observamos el bloque switch. Un bloque switch es una forma más compacta de escribir un "if else". Está compuesto por secciones ("case") y, opcionalmente se utiliza una sección "default". Si al comprobar el valor que se encuentra dentro del paréntesis, éste coincide con uno de los case, se ejecutarán las instrucciones del interior del mismo, finalizando dichas instrucciones con un "break". El "default" se ejecutará cuando no coincida con ningún "case". Éste se colocará en última instancia y solo podrá haber uno.
Hay que tener en cuenta que el valor que se comprueba en el "case" debe ser  de valor entero (en el caso de la programación para Arduino, aunque en otros lenguajes de programación sí que es posible comparar otro tipo de datos).
Además, si se ejecuta un "case" (el primero que aparezca escrito en el sketch), no es posible que se ejecute otro "case", aunque cumpla la condición.


Finalmente, el resultado obtenido se muestra en el siguiente vídeo:




Y esto es todo. No dudéis en comentar y en preguntar cualquier duda.
Gracias por la atención.

I.