AS5600 conseguir nueva posición de origen

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:

imagen

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:

imagen

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.

imagen

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.

imagen

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
  }

}

Si la nueva posición es X grados tu problema es simple.
Si el valor en grados es >274 le restas 274 y obtienes el valor relativo.
Si el valor es menor como por ejemplo 30 grados entonces ahi tienes que usar tu corrección
( 360-274) ya recorridos + 30 = 86 + 30 = 116°

Segundo ejemplo 120 grados.
Todo lo que midas > a 120 hasta 360 surgirá como mera diferencia.
X grados (> 120) = > por ejemplo 180 grados
Grados corridos en 120° = 180-120 = 60 °
Ahora todo lo que vaya desde 0 a 120 requiere de nuevo el calculo 360-120= 240 asi que 30 grados serán
30 grados corridos 120° = 240° + 30°C = 270°

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.