Paso 6: Paso Final
Combinamos el código de servo y el código de acelerómetro. De los valores encontramos antes, que agregamos el código para hacer que los motores gire al valor correcto.Los valores no son muy precisos. Nos resulta difícil precisar un valor exacto, todavía no es un sistema perfecto de "orejas" como que no convierta cada vez que giramos nuestras cabezas.
Código final:
===================================================
#include < Servo.h >
int i;
const int xPin = 0;
const int yPin = 1;
const int zPin = 2;
minVal int = 265;
int maxVal = 402;
x doble;
y doble;
z doble;
Servo myservoLeft;
la rutina de instalación se ejecuta una vez al presionar reset:
void setup() {}
Serial.Begin(9600);
myservoLeft.attach(9);
}
una y otra vez funciona para siempre la rutina bucle:
void loop() {}
int xRead = analogRead(xPin);
yRead int = analogRead(yPin);
int zRead = analogRead(zPin);
convertir Lee valores a grados -90 90 - para atan2
xAng int = mapa (xRead, minVal, maxVal, -90, 90);
int yAng = mapa (yRead, minVal, maxVal, -90, 90);
zAng int = mapa (zRead, minVal, maxVal, -90, 90);
Caculate 360deg valores así: atan2 (-yAng, - zAng)
ATAN2 salidas el valor de - π a π (radianes)
Nosotros estamos entonces convertir los radianes a grados
x = RAD_TO_DEG * (atan2 (-yAng, - zAng) + PI);
y = RAD_TO_DEG * (atan2 (-xAng, - zAng) + PI);
z = RAD_TO_DEG * (atan2 (-yAng, - xAng) + PI);
Serial.Print ("x:");
Serial.Print(x);
Serial.Print("| y: ");
Serial.Print(y);
Serial.Print("| z: ");
Serial.println(z);
Delay(100);
Si (z > = 76) {//right
Delay(100);
para (i = 0; i < 90; i += 10)
{
myservoLeft.write(i);
Delay(100);
}
para (i = 90; i > 0; i-= 10)
{
myservoLeft.write(i);
Delay(100);
}
}
Si ((z > = 50) & & (z < = 75)) {//middle
myservoLeft.write(60);
Delay(100);
}
Si (z < = 49) {//left
Delay(100);
para (i = 90; i < 180; i += 10)
{
myservoLeft.write(i);
Delay(100);
}
para (i = 180; i > 90; i-= 10)
{
myservoLeft.write(i);
Delay(100);
}
}
}
===================================================
Se hace!