Hola, escribo porque tengo un problema con el sensor AS5600, descargue la librería de Rob Tillaart para poder usarlo. Estoy intentando conocer la posición en grados del motor de pasos colocando una perilla en el eje para moverlo con la mano.
En la parte de abajo del motor de pasos nema 17 en el eje coloque un imán de neodimio centrado al sensor.
La forma en que conecte el Arduino Nano y el sensor AS5600 se muestra en la figura 1:
Al momento de encenderlo automáticamente el 0 grados se encuentra en la línea blanca de la perilla y muevo la perilla para ver si funciona correctamente, lo coloco a 180 grados y los valores en el serial monitor también me los da, incluso con una aplicación de celular llamada Angulus los mido para comprobar que los valores son correctos como se muestra en la figura 2:
El problema es que cuando yo encienda el Arduino automáticamente el 0 grados sea donde este la línea blanca de la perilla no ahí en la línea como se muestra en la figura 2.
Para eso estuve investigando y existe un comando que se llama as5600.setOffset(), aquí lo que hago es una resta entre 360-274= 86, esta resta proviene de las siguientes posiciones del motor de la figura 3, en la parte del lado izquierdo en el serial monitor me da 0 y yo tomo el valor de 360 grados y la del derecho giro la perilla a la posición 274 grados par que sea el nuevo 0.
Al tener el nuevo cero Los resultados no coinciden, aunque en esta ocasión no es necesario utilizar una aplicación de celular para medir el ángulo de 180 grados por que a simple vista se sabe cuál es lo hice y en el Arduino el valor es de 120 grados.
Agradecería mucho algún consejo para saber si existe alguna forma de que el sensor pueda leer los datos correctamente tomando en cuenta de que el cero no sea únicamente en la línea diagonal en el motor de la figura 2, si no sea en algún otra parte como por ejemplo el de la figura 4 una línea en el centro del motor.
Este es el código que estoy utilizando.
#include "AS5600.h"
#include "Wire.h"
AS5600 as5600; // use default Wire
float offset=86; //declaro una variable para poder cambiar el origen del cero
void setup()
{
Serial.begin(115200);
Serial.println(__FILE__);
Serial.print("AS5600_LIB_VERSION: ");
Serial.println(AS5600_LIB_VERSION);
Wire.begin();
as5600.begin(4); // set direction pin.
as5600.setDirection(AS5600_CLOCK_WISE); // default, just be explicit.
Serial.println(as5600.getAddress());
// as5600.setAddress(0x40); // AS5600L only
int b = as5600.isConnected();
Serial.print("Connect: ");
Serial.println(b);
delay(1000);
as5600.resetPosition();
as5600.setOffset(offset); //offset para cambiar origen
}
void loop()
{
static uint32_t lastTime = 0;
if (millis() - lastTime >= 600)
{
lastTime = millis();
Serial.print(as5600.readAngle());
Serial.print("\t");
Serial.println((as5600.readAngle()*359.99)/4095.0,2); // convierto el valor en grados
}
}