miércoles, 7 de enero de 2015

Control de Servo con mando RF e Interrupciones

Comenzamos el año con una práctica sencilla ya que tengo un pequeño proyecto en mente y esto son los primeros pasos para poder desarrollarlo.
En este caso haremos lo siguiente, mediante un mando RF y un Arduino Nano controlaremos un Servo. Se que es bastante mas sencillo que el control por voz del servo, pero la idea es aprovechar el mando para poder mover el servo a nuestro gusto.
Explicamos el funcionamiento:
Al pulsar un botón del mando se envía  por RF una secuencia codificada que será recibida en el Receptor el cual habilitará una de sus salidas. Contamos con 4 canales de los cuales conectaremos dos a nuestro Arduino NANO.
¿Que pines vamos a usar? Pues aprovecharemos las interrupciones externas de Arduino, para que en el momento que se active una u otra el servo pueda  girar en dos sentidos, estableciendo en el sketch el ángulo de giro que queramos.

Mando y Receptor RF


Aquí tenemos el mando y el receptor que como ya he comentado en alguna ocasión lo podemos encontrar en ebay, aliexpress o similiar por 2€ o menos. La frecuencia de transmision son 315Mhz y un rango de unos 50-100 metros según el fabricante(exteriores).

El Servo


El servo que vamos a emplear es un microservo de 9 gramos que opera a una tensión de 3v-6v.
Cuenta con 3 hilos como podemos ver en la foto. VCC(rojo), GND(marron) y SIGNAL(naranja Conectaremos a pin 9).
Vamos a alimentar el servo de forma externa, mediante un adaptador, ya que al tomar la alimentación directamente de Arduino NANO, no le da suficiente intensidad provocando ruidos y un mal funcionamiento. 

Esquemático

Después de explicar un poco las partes y lo que vamos a hacer  podemos ver el esquemático de como nos quedaría la parte del receptor.
Repasamos que las salidas del receptor RF D0 y D1 las uniremos a los pines digitales 2 y 3 de nuestro Arduino que corresponden a las interrupciones externas.
Y el cable Signal  del servo al pin digital 9 de Arduino que le usaremos como PWM.
Por último recordar que no se nos olvide unificar las masas de Arduino y de la fuente externa.




El Sketch

Para interactuar con el Servomotor utilizaremos la librería Servo.h, la cual nos permite controlar hasta 8 objetos de una forma muy sencilla.
¿Como vamos a controlar el servo? 
Utilizaremos las interrupciones externas de Arduino mediante la función AttachInterrupt, para que en el momento que haya un cambio de estado en las salidas del módulo receptor (D0 y D1) movamos el servomotor en un sentido u otro en tramos de 45º.
En la siguiente tabla podemos ver las interrupciones que tienen nuestros Arduinos asociados a los correspondientes pines digitales. 

Por si alguno no lo sabe una interrupción es un evento que hace que el microcontrolador cambie el curso del programa, es decir en el momento que se produce ese evento nuestro micro deja lo que estaba haciendo(si estaba en el bucle loop por ejemp) y ejecuta de forma prioritaria la función de la interrupción. En este caso cuando habilitamos las interrupciones, en el momento que detecta un cambio de flanco en los pines 2 o 3 pasa a ejecutar la función de la interrupción correspondiente.
En este caso estamos usando un Arduino Nano el cual tiene dos interrupciones externas int.0(pin2) e int.1(pin3).

Podemos establecer 4 modo de funcionamiento de la interrupción.
LOW -- siempre que el pin este en LOW
CHANGE -- cuando el pin cambia de estado
RISING -- cuando el pin cambia de estado Low to High
FALLING -- cuando el pin cambia de estado High to Low


Yo he usado el modo RISING quedando configurada la función attachInterrupt de la siguiente forma:

attachInterrupt(0, inter0, RISING);
-- 0 corresponde a la interrupción que habilitamos.
-- inter0 es el nombre con el que hemos llamado a la función de esa interrupcion 0.
-- RISING el modo de funcionamiento para que en momento que cambie de Low to High.


Por último os dejo el Sketch de ejemplo, recordemos que el servo si no lo hemos modificado su funcionamiento mecánico gira de 0 a 180º, por tanto si partimos de 90 grados como centro y vamos sumando grados, en el momento que llegue a 180 grados, estaremos en su máximo. Pero eso ya depende cada uno el uso que le quiera dar y como quiera modificar el Sketch!!


#include <Servo.h>   // incluimos la librería Servo.h

Servo myservoM;  // creamos un objeto para controlar el servo, podemos crear hasta un máximo de 8 //objetos servo
int pos = 90, valor=90;    // Variables donde guardaremos la posicion del servo, establecemos 90 para //que el servo arranque centrado
void setup() 
{  
  Serial.begin(9600);
  myservoM.attach(9);  // Asociamos el pin 9(PWM) al objeto creado
  attachInterrupt(0, inter0, RISING);//En Arduino Nano la interrupcion 0 corresponde al pin 2
  attachInterrupt(1, inter1, RISING);//En Arduino Nano la interrupcion 0 corresponde al pin 3

void loop() 
{ }

void  inter0 ()   
  { 
    valor=(valor+45);   //de esta forma indicamos al servo que sume 45º en cada pulsacion
    pos=valor;    
    myservoM.write(pos);   // decimos al servo que se desplace a la posición de la variable 'pos' en º
    //delay(15);                       // espera 15ms para el servo opcional
    Serial.print("Posicion Servo:");
    Serial.print(pos);
    Serial.println(" grados");
  }
  
  void  inter1 ()   
  { 
    valor=(valor-45);      // indicamos al servo que reste 45º en cada pulsación
    pos=valor;
    myservoM.write(pos);  // decimos al servo que se desplace a la posición de la variable 'pos' en º           //delay(15);                       
    Serial.print("Posicion Servo:");
    Serial.print(pos);
    Serial.println(" grados");
  }




Aquí vemos el ejemplo de funcionamiento haciendo desplazamientos de 90º.

13 comentarios:

  1. Buen día Jose, gracias por tu publicación, muy interesante.
    Tengo una pregunta respecto a la tarjeta receptora; ella tiene los pines de Vcc y GND, a cuantos voltios se puede conectar?. Otra pregunta; tiene un pin llamado VT, qué función tiene este pin?
    Te agradezco si me orientas al respecto, mi correo es gma5_2005@yahoo.com

    ResponderEliminar
    Respuestas
    1. Buenas, si no me equivoco vcc te vale a 5V, y el pin VT es la validación. Ese mando tiene un código de verificación (El código es 2260 2262), si le llega un código diferente la verificación te lo comunica.

      Aquí viene explicado todo: http://www.prometec.net/control-remoto-rf/

      Eliminar
  2. Cordial saludo, amigo acerca del ejemplo del video es exactamente igual o es similar al del esquematico? lo digo por que el del video parece ser mas complejo creo que alxanzo q ver un pptenciometro.

    ResponderEliminar
    Respuestas
    1. Hola Luis,
      es tal y como lo ves en el esquemático. Lo que ves a la izquierda es es un modulo de alimentación para dar tensión a la protoboard, pero no tiene mas electrónica.
      Un saludo

      Eliminar
  3. NO ME RECONOCE LA INTERRUPCION 1 Y CON LA 0, SOLO GIRA MIENTRAS ESTA OPRIMIDA.ME ´PODRIAS AYUDAR?

    ResponderEliminar
  4. tengo una duda.. como alimentas o alimentarias con fuente externa o sea no por usb el arduino nano?

    ResponderEliminar
  5. que tal amigo, hay mandera de hacer esto sin untilizar un arduino nano

    ResponderEliminar
  6. Exelente amigo me gustaría que del centro partiera con cada pulso a izquierda y derecha por que estoy en un prototipo de una cabeza y me gustaría mucho con del centro no se moviera sólo con los pulsos me puedes ayúdarme mil gracias saludos

    ResponderEliminar
  7. HOLA ME PODRIAN ALLUDAR PARA HACERLO CON 4 SERVOS , AL APRETAR EL BOTON A Q UNO SE MUEVA A 90 GRADOS, APRETAR EL B OTRO SERVO A 90 GRADOS Y ASI CON TODOS;

    ResponderEliminar
    Respuestas
    1. Hola Mago Jesús,
      ¿Que Arduino estás utilizando? Porque yo aquí utilicé un Nano y el código esta hecho para emplear las dos interrupciones que tiene.
      Si necesitas los 4 botones tendrías que reestructurar el código, haciendo una lectura de entrada digital por cada salida del módulo RF. Es decir tendrías que conectar también D2 y D3 a las entradas del Arduino. Lo más sencillo que puedes hacer es usar IF por cada digitalread
      Dentro de cada If, haces la escritura de los 90 grados para cada servo que hayas añadido. Cualquier cosa me dices. Un saludo!!

      Eliminar
  8. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  9. Hola como estas disculpa tengo una consulta como se puede hacer lo mismo pero cada vez q presiones un pulsador regrese al punto centro en este caso seria a 90 grados lo que quiero decir como se puede hacer la función de dirección de un carro a control remoto ayuda con eso por favor

    ResponderEliminar