S?guenos en Facebook
S?guenos en Twitter
S?guenos en Instagram
Crazy Design
Alicante
ROBÓTICA EDUCATIVA      •      IMPRESIÓN 3D      •      DISEÑO      •      WEB      •      TIENDA DE ELECTRÓNICA
Mi Carrito
    Total: 0€
    CONTROLAR SERVO CON JOYSTICK PS2
    ¿Quieres comprar las piezas de este tutorial para experimentar en casa? Pulsando en lo botones de abajo se añadiran los productos del tutorial automaticamente a tu carrito. Pulsa sobre el botón Añadir Todo si quieres que se añadan todas las piezas necesarias para este tutorial incluido protoboard, cables dupont y placa (Arduino, Raspberry Pi, MicroBit, ESP...) o pulsa sobre Añadir solo sensores para añadir todas las piezas menos las protoboard, cables dupont y placa (Arduino, Raspberry Pi, MicroBit, ESP...).



    ¿ Qué es un Joystick y para qué sirve?


    El joystick es uno de los dispositivos de entrada más usado dentro de los proyecto de robótica para el control de movimientos. Es muy similar al usado en los joystick de los videojuegos. Internamente está compuesto por dos potenciómetros distanciados entre ellos 90 grados (uno que controla el movimiento de arriba-abajo y otro que controla en movimiento de izquierda-derecha) conectados los dos a un palo corto con resortes que lo mantiene centrado. Estos módulos llevan también un botón de pulsado central que se activa al presionar hacia abajo el joystick.


    Moviendo el joystick internamente producimos que la salida de este varíe entre 0-5V dependiendo de su dirección. En el caso de estar conectado a un arduino conseguimos que nos de una lectura de 0 a 1023 dependiendo de la posición en la que esté.






    ¿ Qué es un Servo y para qué sirve?


    Un servo es un accionador muy usado dentro del campo de la electrónica. A diferencia de los motores DC en los que simplemente controlamos la velocidad de giro, en un servo indicamos el ángulo al que queremos que se posicione y es el servo el que se encarga de posicionar a ese ángulo gracias a la electrónica interna que este incorpora. Por ello con fáciles de programar y de controlar por lo que son ideales para proyectos en los que necesitamos controlar la posición, como en: brazo robótico, robots con patas, añadir movimiento de escaneo a sensores,....


    Normalmente los servos vendidos para proyectos de electrónica Arduino, Raspberry Pi, ... disponen de un rango de movimiento de entre 0 - 180º, es decir, no son capaces de dar una vuelta por completo ya que llevan un tope interno que les limita el movimiento. La tensión de alimentación que admiten, dependiendo el modelo, suele estar entre 4.8V a 7.2V siendo el valor más adecuado 6V (con tensiones inferiores el motor tiene menos fuerza y velocidad, con tensiones superiores oscilan mucho y los hace poco precisos).


    En cuanto a su mecanismo interno llevan montados internamente un reductor de engranajes, lo que les proporciona un alto par y un alto grado de precisión, pero debido a este las velocidades de giro son pequeñas. Internamente están constituidos por un motor de corriente continua, acoplado a un reductor y la electrónica necesaria para controlar la posición (encoder o potenciómetro generalmente). La comunicación de la posición deseada se realiza mediante la transmisión de un señal pulsada con periodo de 20ms. El ancho del pulso determina la posición del servo. La relación del ancho de pulso y ángulo depende del modelo del motor.


    En general, en todos los modelos:


      • Un pulso entre 500-1000 us corresponde con 0º
        • Un pulso de 1500 ms corresponde con 90º (punto neutro)
          • Un pulso entre 2000-2500us corresponde con 180º


          Por tanto, variando la señal en microsegundos podemos disponer de una precisión teórica de 0.18-0.36º, siempre que la mecánica del servo acompañe.



          Esquema de montaje


          El montaje de este tipo de dispositivos es sencillo. En primer lugar tenemos que alimentarlo conectando el pin VCC a un pin 5V y el GND a un pin GND del arduino.


          Para las medidas analógicas en ambios ejes conectaremos la salida Vrx (extrae la lectura del potenciómetro en el eje X) y Vry (que extrae la lectura del potenciometro del eje Y) a dos entradas analógicas de Arduino.


          Por último, si también queremos la señal digital del pulsador, conectaremos la salida SW a una entrada digital de nuestro Arduino. En este caso, vamos a usar las resistencias internas Pull-Up, por lo que no será necesario el uso de resistencias adicionales.


          En los servos conectaremos los cables rojos al carril de +5V de la protoboard, el cable marrón a la toma GND(-) de la protoboard y el cable amarillo, uno a la entrada digital 3 y otro a la entrada digital 5.




          Código


          El código para hacer funcionar el joystick es sencillo. Leeremos la lectura de la posición de los potenciómetros con las entradas analógicas. Mapearemos su lectura para pasarlo a una posición del motor. Leeremos el pulsador central con la entrada digital. Y finalmente mostraremos por puerto la que sería su lectura.


          1. Como vamos a trabajar con Servo motores en el ARDUINO tenemos que declarar la librería servo.

          2. #include 'servo.h'

          3. Definimos las variables que contendrán los pines de conexión.

          4. const int pinLED = 13;
            const int pinJoyX = A0;
            const int pinJoyY = A1;
            const int pinJoyButton = 9;
            const int pinMotor1 = 3;
            const int pinMotor2 = 5;
            int posicion_servo1 = 0;
            int posicion_servo2 = 0;

          5. Declaramos los servos

          6. Servo MOTOR1;
            Servo MOTOR2;

          7. En Setup inicializamos nuestra consola serial para poder visualizar las lecturas en nuestro PC y declaramos el pin digital del botón como input con el pullUp interno.

          8. void setup() {
               pinMode(pinJoyButton , INPUT_PULLUP);   //activar resistencia pull up 
               MOTOR1.attach(pinMotor1); // Declaramos el servo motor uno indicandole el pin al que esta conectado
               MOTOR2.attach(pinMotor2); // Declaramos el servo motor dos indicandole el pin al que esta conectado
               Serial.begin(9600);
            }

          9. Una vez hecho esto ya pasamos al Loop y creamos la lectura de los pines, guardándolos en una variable.

          10. void loop() {
               int Xvalue = 0;
               int Yvalue = 0;
               bool buttonValue = false;
             
               //leer valores
               Xvalue = analogRead(pinJoyX);  //leemos la lectura analógica del  VERT o Vry del joystick
               delay(100);                 //es necesaria una pequeña pausa entre lecturas analógicas
               Yvalue = analogRead(pinJoyY); //leemos la lectura analógica del  VERT o Vry del joystick
               buttonValue = digitalRead(pinJoyButton);  //leemos el botón interno del joystick (pin SW)

          11. Ahora, como la lectura que nos da el joystick es de 0 a 1023 y los motores solo van de -180 a 180 en su lectura de grados, vamos a usar la función map interna del arduino para transformar esa lectura.

          12. posicion_servo1 = map (Xvalue, 0, 1023, -180, 180); //mapeamos la posición del servo1 desde lectura joystick HOR
            posicion_servo2 = map (Yvalue, 0, 1023, -180, 180); //mapeamos la posición del servo2 desde lectura joystick VERT

          13. Y por último hacemos que nos escriba por serial los valores leídos del joystick.

          14. //mandamos la nueva posición al servo en grados
                MOTOR1.write(posicion_servo1);
                MOTOR2.write(posicion_servo2);
                //mostrar valores por serial
               Serial.print("X:" );
               Serial.print(Xvalue);
               Serial.print(" | Y: ");
               Serial.print(Yvalue);
               Serial.print(" | Pulsador: ");
               Serial.println(buttonValue);
               delay(1000);
            }
            
            
          Código completo


          #include 'servo.h'
          
          const int pinLED = 13;
          const int pinJoyX = A0;
          const int pinJoyY = A1;
          const int pinJoyButton = 9;
          const int pinMotor1 = 3;
          const int pinMotor2 = 5;
          int posicion_servo1 = 0;
          int posicion_servo2 = 0;
          
          Servo MOTOR1;
          Servo MOTOR2;
          
          void setup() {
             pinMode(pinJoyButton , INPUT_PULLUP);   //activar resistencia pull up 
             MOTOR1.attach(pinMotor1); // Declaramos el servo motor uno indicandole el pin al que esta conectado
             MOTOR2.attach(pinMotor2); // Declaramos el servo motor dos indicandole el pin al que esta conectado
             Serial.begin(9600);
          }
           
          void loop() {
             int Xvalue = 0;
             int Yvalue = 0;
             bool buttonValue = false;
           
             //leer valores
             Xvalue = analogRead(pinJoyX);  //leemos la lectura analógica del  VERT o Vry del joystick
             delay(100);                 //es necesaria una pequeña pausa entre lecturas analógicas
             Yvalue = analogRead(pinJoyY); //leemos la lectura analógica del  VERT o Vry del joystick
             buttonValue = digitalRead(pinJoyButton);  //leemos el botón interno del joystick (pin SW)
           
             posicion_servo1 = map (Xvalue, 0, 1023, -180, 180); //mapeamos la posición del servo1 lectura joystick HOR
             posicion_servo2 = map (Yvalue, 0, 1023, -180, 180); //mapeamos la posición del servo2 lectura joystick VERT
            
              //mandamos la nueva posición al servo en grados
              MOTOR1.write(posicion_servo1);
              MOTOR2.write(posicion_servo2);
          
             //mostrar valores por serial
             Serial.print("X:" );
             Serial.print(Xvalue);
             Serial.print(" | Y: ");
             Serial.print(Yvalue);
             Serial.print(" | Pulsador: ");
             Serial.println(buttonValue);
             delay(1000);
          }