Lista de materiales para este tutorial
Pieza | Cantidad | |
---|---|---|
Arduino UNO R3 Compatible ATMEGA328 | 1 | |
Servo 9g SG90 Microservo | 2 | |
Joystick Tipo PS2 Arduino | 1 | |
PLACA PROTOTIPO MB102 830 | 1 | |
40 x Cables Hembra-Macho 20cm jumper dupont 2.54 | 1 |
¿
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.
- Como vamos a trabajar con Servo motores en el ARDUINO tenemos que declarar la librería servo.
- Definimos las variables que contendrán los pines de conexión.
- Declaramos los servos
- 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.
- Una vez hecho esto ya pasamos al Loop y creamos la lectura de los pines, guardándolos en una variable.
- 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.
- Y por último hacemos que nos escriba por serial los valores leídos del joystick.
#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 desde lectura joystick HOR
posicion_servo2 = map (Yvalue, 0, 1023, -180, 180); //mapeamos la posición del servo2 desde 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);
}
#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);
}