2.11 Regulador de luz con joystick

1. Qué vamos a hacer
Vamos a usar el joystick como el regulador de luz de una lámpara: cuanto más lo alejemos del centro, hacia la izquierda o hacia la derecha, más brillará el LED verde. Con el joystick en el centro, el LED estará apagado.
1.1 Qué vamos a aprender
- Cómo funciona un joystick: dos potenciómetros, uno para cada eje, que leemos con
analogRead. - A convertir un rango de valores en otro con la función
map, por ejemplo, la posición del joystick en un brillo. - A repasar
analogWritey el condicionalif ... else if ... else.
1.2 Qué vamos a usar
Componentes
- Joystick (eje X en el pin A0 y eje Y en el pin A1): Palanca que se mueve en dos direcciones. Por dentro tiene dos potenciómetros, uno por eje, que dan un valor según la posición de la palanca. En este proyecto usamos solo el eje X.
- LED verde (pin 11): Su brillo se regula con PWM, como en el proyecto Brillo LED.

Programación
Los ejes del joystick están en pines analógicos, así que los leemos con analogRead. Con la palanca en reposo, los dos ejes dan valores en torno a 512. El eje X baja hasta 0 a la izquierda y sube hasta 1023 a la derecha; el eje Y da 0 abajo y 1023 arriba.
El problema es que analogWrite necesita un brillo entre 0 y 255. Para pasar de un rango a otro usamos la función map(valor, desdeMin, desdeMax, hastaMin, hastaMax):
- valor: el número que queremos convertir, por ejemplo, la lectura del joystick.
- desdeMin y desdeMax: el rango en el que está ese número.
- hastaMin y hastaMax: el rango al que lo queremos llevar.
Por ejemplo, map(valorX, 532, 1023, 0, 255) convierte un valor entre 532 y 1023 en otro entre 0 y 255: 532 da 0, 1023 da 255 y los valores intermedios, lo que corresponda en proporción. Si en el primer rango ponemos los números al revés, map(valorX, 492, 0, 0, 255), el rango se invierte: 492 da 0 y 0 da 255.
2. Programamos
El programa lee el eje X del joystick. Si la palanca está en el centro (entre 492 y 532), apaga el LED; si se ha movido a la izquierda o a la derecha, convierte su posición en un brillo con map: cuanto más lejos del centro, más brillo.
Escribe el siguiente código en Arduino IDE y cárgalo en la placa:
// Regulador de luz: el LED verde brilla más cuanto más movemos el joystick
const int joystickX = A0; // eje X del joystick en el pin A0
const int ledVerde = 11; // LED verde conectado al pin 11
const int centroMin = 492; // por debajo, el joystick está hacia la izquierda
const int centroMax = 532; // por encima, hacia la derecha
int valorX = 0; // guarda la posición del joystick en el eje X (de 0 a 1023)
int brillo = 0; // guarda el brillo del LED (de 0 a 255)
void setup() {
pinMode(ledVerde, OUTPUT); // el LED es una salida
}
void loop() {
// lee la posición del joystick
valorX = analogRead(joystickX);
if (valorX > centroMax) {
// hacia la derecha: de 532 a 1023 pasa a 0 a 255
brillo = map(valorX, centroMax, 1023, 0, 255);
} else if (valorX < centroMin) {
// hacia la izquierda: de 492 a 0 pasa a 0 a 255
brillo = map(valorX, centroMin, 0, 0, 255);
} else {
brillo = 0; // en el centro: apagado
}
analogWrite(ledVerde, brillo); // enciende el LED con ese brillo
}
Cómo funciona:
Las constantes (líneas 3 a 7): guardan los pines del joystick y del LED, y los dos límites de la zona del centro, centroMin y centroMax, donde el LED está apagado.
Las variables (líneas 9 y 10): valorX guarda la posición del joystick y brillo, el brillo que le daremos al LED.
La función setup() (líneas 12 a 14): configura el pin del LED como salida. El joystick no necesita pinMode, porque está en un pin analógico.
La función loop() (líneas 16 a 31): lee el joystick y, con if ... else if ... else, decide el brillo:
SI el joystick da más de 532 (movido a la derecha):
--> El brillo va de 0 (en 532) a 255 (en 1023).
SI NO, SI da menos de 492 (movido a la izquierda):
--> El brillo va de 0 (en 492) a 255 (en 0).
SI NO (está en el centro):
--> El brillo es 0.
La zona del centro, de 492 a 532, evita que el LED se encienda un poco con el joystick suelto, porque la palanca nunca vuelve exactamente a 512. Por último, analogWrite enciende el LED con el brillo calculado.
3. Mejóralo
Prueba a realizar algunas de las siguientes modificaciones al proyecto:
-
Lee el joystick: Mira qué valores dan los ejes X e Y del joystick de tu placa en reposo y al moverlo, y ajusta las constantes
centroMinycentroMaxsi el LED se enciende un poco con el joystick suelto.Pista: envía los dos valores al ordenador y ábrelos con el Serial Plotter (menú Herramientas > Serial Plotter), que los dibuja como una gráfica, como en la primera mejora del Vúmetro. Si escribes antes de cada valor un nombre seguido de dos puntos (
X:eY:), el Serial Plotter dibuja cada eje con su color y su nombre. -
Mando de colores: Usa los dos ejes del joystick para mezclar colores en el LED RGB: el eje X controla el rojo y el eje Y, el azul. Con la palanca en el centro, el LED se verá morado, y al moverla cambiará la mezcla.
Pista: lee los dos ejes y convierte cada uno, de
0a1023, en una intensidad de0a255conmap. El rojo del LED RGB está en el pin9y el azul, en el6. -
Theremín: Convierte la placa en un theremín, un instrumento que se toca sin tocarlo: al mover el joystick, el zumbador cambia de nota, más grave hacia la izquierda y más aguda hacia la derecha. Con el joystick en el centro, silencio.
Pista: convierte la posición del joystick en una frecuencia con
map, por ejemplo, de200Hz a la izquierda a1000Hz a la derecha, y hazla sonar contone(zumbador, frecuencia). Para que no suene todo el rato, comprueba si el joystick está fuera del centro: para saber si se cumple una u otra condición se usa||(«o»),if (valorX < centroMin || valorX > centroMax). Si está en el centro, calla el zumbador connoTone(zumbador).