Paso 6: Carga de sketch de Arduino Wii_Nunchuck_Level
Hay dos bocetos de Arduino: 1) Wiichuck_range_test; y 2) Wii_Nunchuck_Level.En primer lugar, necesitas saber qué el Nunchuck acelerómetro cada variedad de datos eje. He probado algunos de ellos y todos ellos muestra ligeras diferencias. Pero sobre todo, los rangos de 60-70 como mínimo y 180-200 como máximo. Para la mayor sensibilidad del nivel, debe cargar primero el Wiichuck_range_test y encontrar aquellos valores (mínimo, centro (nivel) y máximo) para cada eje y ajuste los valores en el bosquejo principal si es necesario.
El bosquejo de la prueba de rango es simple y sencillo por lo que no explico el detalle aquí.
El programa principal, Wii_Nunchuck_Level se muestra a continuación y también adjunto.
La función getData() obtener los valores para cada eje y guardarlos en el array de bytes [AgCl] y buscar la orientación del nivel y devuelve 'Oriente'.
La función orientation() obtiene los valores actuales de eje y buscar la orientación del nivel. Cada orientación da dos ejes como medio (nivelado, alrededor de 120-130) y un eje como mínimo o máximo dependiendo de la dirección de la gravedad. Con estas características, determina la orientación.
El loop() principal es bastante simple. Controla si el botón de calibración se presiona por ver si el pin 10 es alta y si no leer los datos actuales y encender LEDs. El programa compara los datos actuales a la tienda (en la EEPROM de la ATmega328P) datos de calibración. Hay tres etapas de la exhibición: 1) si el valor está dentro de cierto rango, se encenderá el LED rojo central conectado al pin digital 7; 2) si el valor es mayor que el rango (sens en el programa) y menos de 2 veces de la gama (sens), se encenderá el rojo LED y un LED verde en el opuesto (para simular la dirección de la burbuja) lado de la inclinación; 3) si el valor es mayor que 2 veces de la gama (sens), entonces solamente el LED verde se enciende.
Los valores de calibración son el valor neutro de cada eje cuando está nivelada en el eje de lectura. Por ejemplo, la lectura de datos del Nunchuck es entre 60-70 (estos valores son diferentes desde el sensor a) - g (boca abajo) en el eje y es más de 170 g (arriba la derecha). Por lo que el valor neutro (nivelado) de cada eje es de 120-130. La calibración comienza cuando el pin 10 va alto conectadas a V + con un pequeño empuje interruptor de botón presionado. Uno comienza el proceso de calibración, con el fin de dar al usuario un tiempo para colocar el dispositivo sobre una superficie plana, espera hasta que el LED rojo central parpadee un par de veces. La calibración real es realmente rápida y seguida por unos parpadea más rápido.
/*
* Wii_Nunchuck_Level
* Febrero-marzo 2012, Jinseok Jeon
* http://jeonlab.wordpress.com
*
* Wii Nunchuck datos leer:
* nunchuck_funcs.h de WiiChuckDemo de Tod E. Kurt,
* http://todbot.com/blog/2008/02/18/wiichuck-wii-nunchuck-adapter-available/
*/
#include < Wire.h >
#include < EEPROM.h >
#include "nunchuck_funcs.h"
AgCl Byte [3]; las lecturas del acelerómetro para x, y, eje z
calPin int = 10; pin de calibración
sens de int = 1; sensibilidad
int Oriente;
void setup()
{
nunchuck_init();
para (int i = 5; i < 10; i ++) {}
pinMode (i, salida);
} //9 izquierda, 8 a, centro 7, 6 abajo, derecha 5
pinMode (calPin, entrada);
Delay(100);
}
void loop()
{
Si se presiona el pin de calibración, saltar a la funcion calibrate()
Si (digitalRead(calPin) == HIGH) calibrate();
getData();
Si (Oriente == 1 || Oriente == 2) {}
Si (abs (AgCl [0]-EEPROM.read (0 + Oriente * 10)) < = 2 * sens) digitalWrite (7, alto);
Si (AgCl [0]-EEPROM.read (0 + Oriente * 10) > sens) digitalWrite (5, alto);
Si (EEPROM.read(0 + orient*10)-AgCl [0] > sens) digitalWrite (9, alto);
}
Si (Oriente == 3 || Oriente == 4) {}
Si (abs (AgCl [1]-EEPROM.read (orientar + 1 * 10)) < = 2 * sens) digitalWrite (7, alto);
Si (AgCl [1]-EEPROM.read (orientar + 1 * 10) > sens) digitalWrite (8, HIGH);
Si (EEPROM.read(1 + orient*10)-AgCl [1] > sens) digitalWrite (6, alto);
}
Si (Oriente == 5 || Oriente == 6) {}
Si (abs (AgCl [0]-EEPROM.read (0 + Oriente * 10)) < = 2 * sens & & abs (AgCl [1]-EEPROM.read (orientar + 1 * 10)) < = 2 * sens) digitalWrite (7, alto);
Si (AgCl [0]-EEPROM.read (0 + Oriente * 10) > sens) digitalWrite (5, alto);
Si (EEPROM.read(0 + orient*10)-AgCl [0] > sens) digitalWrite (9, alto);
Si (AgCl [1]-EEPROM.read (orientar + 1 * 10) > sens) digitalWrite (8, HIGH);
Si (EEPROM.read(1 + orient*10)-AgCl [1] > sens) digitalWrite (6, alto);
}
Delay(50);
para (int i = 5; i < 10; i ++) {//turn apaga todos los LEDs
digitalWrite (i, LOW);
}
}
getData() vacío
{
nunchuck_get_data();
AgCl [0] = nunchuck_accelx();
AgCl [1] = nunchuck_accely();
AgCl [2] = nunchuck_accelz();
Oriente = orientation(); obtener orientación
}
void calibrate()
{
para (int i = 0; i < 3; i ++) {}
digitalWrite (7, alto);
Delay(500);
digitalWrite (7, bajo);
Delay(500);
}
getData();
para (int i = 0; i < 3; i ++) {}
EEPROM.write (+ Oriente * 10, accl[i]);
}
para (int i = 0; i < 3; i ++) {}
digitalWrite (7, alto);
Delay(200);
digitalWrite (7, bajo);
Delay(200);
}
}
int orientation()
{
Si (AgCl [0] > 125 & & AgCl [0] < 145 & & AgCl [2] > 110 & & AgCl [2] < 140) {}
Si Oriente (AgCl [1] > 170) = 1; abajo en el piso
otra cosa si Oriente (AgCl [1] < 75) = 2; arriba en el piso
}
else if (AgCl [1] > 110 & & AgCl [1] < 140 & & AgCl [2] > 110 & & AgCl [2] < 140) {}
Si Oriente (AgCl [0] > 180) = 3; izquierda en el piso
otra cosa si Oriente (AgCl [0] < 90) = 4; en piso
}
else if (AgCl [1] > 110 & & AgCl [1] < 140 & & AgCl [0] > 125 & & AgCl [0] < 145) {}
Si Oriente (AgCl [2] > 170) = 5; en el piso
otra cosa si Oriente (AgCl [2] < 80) = 6; frente en el piso
}
retorno Oriente;
}