Paso 11: Detección de movimiento
Este paso describe cómo el controlador decide qué tipo de movimiento está ocurriendo. A través de pruebas, se determinó que, como referencia del estado de inactividad, es el patrón que sigue el movimiento del controlador. (G = mayor, L = menos, S = igual)
Ideal: 510, 497, 627
Derecho 611, 492, 521... G, S, L
Izquierda 408, 496, 530... L, S, L
Adelante 512, 598, 526... S, G, L
Inversa de 514, 395, 536... S, L, L
Lo que aquí se está diciendo es que, por ejemplo, para allí que movimiento a la derecha, la X lectura debe ser mayor que está inactiva, la lectura Y debe ser sobre la misma y la Z debe ser menos de inactividad de la lectura. El mismo tipo de lógica sigue para los otros tipos de movimiento. En el siguiente código, la instrucción switch/case utiliza lógica simple para determinar el movimiento. El caso por defecto es declarar un "error" y no enviar un movimiento si por alguna razón el acelerómetro no detecta o perdido.
caso 0:
LCD.Clear(); lcd.setCursor(0,0);
LCD.Print("Move"); lcd.setCursor (0, 1);
Si (xRaw > idleX & & yRaw > idleminY & & yRaw < idlemaxY & & zRaw < idleZ) {}
LCD.Print("Right");
}
else if (xRaw < idleX & & yRaw > idleminY & & yRaw < idlemaxY & & zRaw < idleZ) {}
LCD.Print("left");
}
else if (xRaw > idleminX & & xRaw < idlemaxX & & yRaw > idleY & & zRaw < idleZ) {}
LCD.Print("forward");
}
else if (xRaw > idleminX & & xRaw < idlemaxX & & yRaw < idleY & & zRaw < idleZ) {}
LCD.Print("REVERSE");
}
Else {}
LCD.Print("idle");
}