Módulo BNO-055

Muy buenas tardes, estoy trabajando en un robot móvil basado en microcontrolador Arduino y el sensor BNO-055. El caso es que necesito un control para que el robot gire el ángulo que yo quiera mandarle de referencia. Con este sensor dispongo del ángulo y me lo ofrece desde 0 asta 359,9, cuando vuelve a 360 se pone a 0 la variable.

Estoy haciendo un control muy básico en el que veo la diferencia entre la referencia y lo que me da el sensor y multiplicando por una constante, consigo la variación de PWM que le tengo que quitar o dar a ambos motores.

El control del ángulo quedaría así:

void programaControlAngulo() {
  e0 = ref - orientation;
  inA = KpA * e0;
  inB = KpB * e0;
}

El motor A es la rueda derecha y el B es la izquierda, para dejarlo claro.
Por tanto, el control lo aplico de la siguiente manera:

programaControlAngulo();

  pwm_valueA = pwm_valueA + inA;
  pwm_valueB = pwm_valueB - inB;
  if (pwm_valueB > 255) {
    pwm_valueB = 120;
  }
  if (pwm_valueB < 0) {
    pwm_valueB = 0;
  }
    if (pwm_valueA > 255) {
    pwm_valueA = 120;
  }
  if (pwm_valueA < 0) {
    pwm_valueA = 0;
  }

De esta manera, si quiero tener de referencia 90 grados, la rueda derecha tendrá que correr menos que la rueda izquierda, y mediante este control lo consigo.
El problema viene en el cambio de 0 a 360 grados. Imaginaros que pongo de referencia 0 grados, y el robot es inestable y me empieza en 359.9 grados, por lo que, de esta manera mi robot va a dar la vuelta entera hacia la izquierda, en lugar de girar y regular ese 0.1 hacia la derecha que es lo más fácil. Llevo un tiempo haciendo pruebas y no llego a dar con algo que me funcione, a ver si alguien me pudiera ayudar. Muchísimas gracias!

control_dos_ruedas.ino (6.98 KB)

Lo que yo haría sería que todo lo > 180 deja de ser movimiento positivo para mi y se transforma en movimiento negativo. Asi que una simple diferencia 359.9-360 me daria -0.1
Si se hubiera movido a derecha seria +0.1 y como lo hizo a izq será -0.1

Ahora con esa simple conversión tu corriges moviendo tus ruedas a gusto.

surbyte:
Lo que yo haría sería que todo lo > 180 deja de ser movimiento positivo para mi y se transforma en movimiento negativo. Asi que una simple diferencia 359.9-360 me daria -0.1
Si se hubiera movido a derecha seria +0.1 y como lo hizo a izq será -0.1

Ahora con esa simple conversión tu corriges moviendo tus ruedas a gusto.

De esta manera, el error pasaría a si le doy de referencia 180 grados, y con tal de que haga un pequeño giro de más se pondría a -179,9 y por tanto, daría la vuelta entera hasta llegar de nuevo a 180.

No comprendo algo... porque ahora un sensor que indica de 0 a 359.9 de golpe me da -179.9 como llegaste a esa lectura?

La lectura será 179.9 o 180.1

Una cosa es tu referencia de 0 a 359.9 no? Otra la que indica el sensor de 0 a 359.9.

Es correcto?

surbyte:
No comprendo algo... porque ahora un sensor que indica de 0 a 359.9 de golpe me da -179.9 como llegaste a esa lectura?

La lectura será 179.9 o 180.1

Una cosa es tu referencia de 0 a 359.9 no? Otra la que indica el sensor de 0 a 359.9.

Es correcto?

El sensor capta información desde 0 a 359.9, eso es cierto.

Creo que no he entendido bien lo que me dijiste anteriormente. Lo que yo he querido decir es que si va para la izquierda será movimiento negativo, y debo hacer lo que has dicho, la diferencia. Es decir, si tengo 359.9-360=-0.1, pero, ¿y si el valor que quiero de referencia es 180? Girando hacia la derecha, mi sensor me dará los grados hasta los 180, y el problema viene cuando hago la diferencia que me has dicho, ya que si gira un poco más de la cuenta no serían 181 grados con la conversión, sino que sería 181-360=-179, y por tanto, con la diferencia hay un cambio brusco entre los 180 y los -179, no sé si me entiendes.

Mi problema es que quiero hacer una trayectoria cuadrada, y debo enviar referencias de 90 grados, 180 grados, 270 grados y 0 grados de nuevo para completar la trayectoria.

Ok ahora te entiendo pero entonces lo que debes hacer es esto.

Como en elprimer caso la REFERENCIA era 0 no hubo problema en entenderlo pero ahora es 180.

Si ahora tienes en cuenta la referencia y la sumas tendrias
REFERENCIA + 181-360 = > 180 + 181 -360 = 1

El caso es que necesito en el mismo programa dar varias referencias, es decir, le daré referencia 0 unos 2 segundos, luego le daré 90 de referencia otros dos segundos, 180 de referencia otros dos segundos, y así hasta formar un cuadrado. Y, con tu fórmula para los 180, no me serviría, por ejemplo para una referencia de 0 grados. ¿Es correcto lo que digo?

Y te va a funcionar con la referencia que uses.

Prueba la idea porque la referencia corrije el defecto que antes indicaste.

Lo que hago en todo momento es transformar la lectura a la referencia en la que estoy

Dime..
Si estas en 0 lo que te indique el sensor es lo que quieres perooo tiene el problema del salto entre 0 y 360.

Ahora si estas a 90 tu sensor sigue a 0 pero si lo mueves como si lo giraras tendrias tu lectura del mismo modo.

Asi que lo que tienes que hacer en todo momento cuando cambies la referencia es cambiar lo que lees del sensor rotado la REFERENCIA

La lectura de tu sensor ahora cambiada será asi SEnsor - REFERENCIA:

Para 0 solo tienes que tener en cuenta lo que te dije antes de 180 y asegurarte que sea positivo o negativo. Si ya sabes que es negativo en lugar de tomar 0 como refencia tomas 360 y mira que pasa

Para la derecha 0.1.... a 179.9
para la izq -0.1 a -179.9

Para una REFERENCIA 90
para la izq tu sensor cuando lea 89.9 convertido será 89.9 - 90 = -0.1
Para la der tu sensor cuando lea 90.1 convertido sera 90.1- 90 = +0.1

y asi para todos los casos

para 180 funciona igual que para 90

Incluso cuando superemos 180 de nuevo hay que hacer un ajuste porque habrá errores.
A ver si te sirve lo que te sugiero.