Autor Tema: Robot equilibrista  (Leído 228499 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re:Robot equilibrista
« Respuesta #525 en: 25 de Febrero de 2016, 13:29:32 »
En estos post está explicado el tema de los acelerómetros, junto a su offset:
http://www.todopic.com.ar/foros/index.php?topic=41980.0

En este otro está lo relativo a los giróscopos:
http://www.todopic.com.ar/foros/index.php?topic=41979.0

Antes de intentar cualquier cosa con fusion de ámbos sensores te recomiendo leer y entender bien el funcionamiento individual de los sensores. Kalman no es simple y si no tienes bien claro la forma de trabajar con los sensores va a ser muy dificil que obtengas resultados.

Por ejemplo, al enteder el funcionamiento de los sensores podrías pensar en intentar equilibrar el robot sin Kalman (no conozco los detalles de la implementacion de Kalman, nunca lo usé) y hacer una simple fusion de los sensores para obtener el àngulo. Una aproximacion sería Angulo_Pitch = PitchGyro * 0.9 + PitchAccel * 0.1. Donde variando ese 0.9 - 0.1 podés pesar un tipo de medicion versus el otro.

En tu calculo de ángulo de giróscopo usas 0.01 como tiempo de muestreo. Tu lectura del giróscopo esta en una ISR de algun timer con ese tiempo de interrupcion?

No he leido todo el post original de este tema, solo estoy leyendo tus dudas y por eso no puedo responder sobre que cosas tenes que adaptar para que funcione el código de este tema...

Saludos!
-
Leonardo Garberoglio

Desconectado Pacio

  • PIC10
  • *
  • Mensajes: 8
Re:Robot equilibrista
« Respuesta #526 en: 25 de Febrero de 2016, 21:22:25 »
Muchas gracias por responder mis dudas

te cuento hice muchos avances, la mayoria de mis errores eran por dar por echo que la configuracion por default del sensor era una y al final era otra(por ejemplo la sensibilidad del giroscopo y del acc)

Te agradezco mucho los post que me pasaste sobre el giro y el acelerometro! esta muy bien explicado!

Aplicando solo correccion del offset en el giroscopo:

Ya logro obtener el angulo tanto del acelerómetro como del giroscopo, ambos en grados inclinandolos a 90 respecto a la mesa y parecen correctos aunque obtengo un desfazaje de casi 10° entre una y otra, es decir, el acelerometro indica 90° grados pero el giroscopo me marca 80°, esto se debe a la impresicion de la medida? (para lo que se puede aplicar el filtro complementario o kalman más adelante?) o crees que es un margen de error muy grande?
por otro lado estoy tratando de interpretar el datasheet de mi sensor comparandolo como el tuyo para asi crear la correccion del offset para el acelerometro, pero aunque sea medio tonto, no encuentro como calcular a cuanto equivale 1g con la sensibilidad de mi sensor, te dejo el datasheet para ver si me podes dar una mano

http://www.jarzebski.pl/datasheets/MPU6050_rev32.pdf
(pagina 13 están las caracteristicas del acelerometro) pero no logro distingir cuantos son los mg que debo usar y cual es el calculo que debo realizar, veo que en tu post de acelerometro usaste este calculo : (1/0.0039) pero o encuentro nada similar en mi datasheet

Espero no cansarte con tantas dudas jaja, acá te dejo la rutina para corregir el offset a ver que te parece :)

 
Código: C
  1. for(i=0;i<10;i++){       // solo tomo 10 muestras por ahora, la voy a subir más adelante
  2.       GYROSCOPO();      // refresco los valores GyX y GyY que son los registros del giro
  3.       off_GY[0] += GyX;
  4.      
  5.  
  6. ACELEROMETRO();  // refresco AcX,AcY y AcZ que son los registros del acc
  7.  
  8. off_ACC[0]=off_ACC[0]+AcX;
  9. off_ACC[1]=off_ACC[1]+AcY;
  10. off_ACC[2]=off_ACC[2]+AcZ;
  11.  
  12. delay_ms(10);
  13. output_toggle(pin_a0);
  14. }
  15.  
  16. off_GY[0]=(off_GY[0]/10);
  17. //off_GY[1]=(off_GY[1]/10);
  18.  
  19. off_ACC[0]=(off_ACC[0]/10);
  20. off_ACC[1]=(off_ACC[1]/10);
  21. off_ACC[2]=(off_ACC[2]/10);
  22. off_ACC[2]-= numero;   //  valor que equivale a 1g para que se mantenga en 1g negativo en el eje Z que es la gravedad cuando el sensor esta en posición horizontal  
  23. ES EL QUE NO SE ENCONTRAR                                                                                                                                                                                            
  24.  


Un saludo
PACIO!
« Última modificación: 25 de Febrero de 2016, 22:02:25 por Pacio »

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 17755
    • MicroPIC
Re:Robot equilibrista
« Respuesta #527 en: 09 de Febrero de 2018, 08:55:38 »
¡Uff, cómo pasa el tiempo!
Hace 14 años que inicié este hilo con la idea de montar un robot equilibrista y nunca tuve realmente el tiempo y la dedicación suficiente para sacarlo adelante.
Sin embargo, mi sueño no ha desaparecido, y voy a volver a intentarlo.

He estado echando un vistazo al B-ROBOT EVO de JJRobots y creo que voy a intentar armar algo parecido.
En principio, me quedaré con la misma estructura que han diseñado, con piezas impresas en 3D, dos motores NEMA17 conectados directamente a las ruedas, la batería encima, y la electrónica en un nivel superior.
Sin embargo, quiero hacer el controlador por mí mismo. Ellos han optado por Arduino y a mí me gustaría cambiar de arquitectura. Pero estoy en duda: no sé si implementarlo con un PIC, plataforma en la que ya tengo experiencia, o montar una Raspberry Pi y aprender desde cero con ella, ya que aún no me he introducido en ese mundo y me apetece un montón.

¿Qué opináis?
Un saludo desde Sevilla, España.
Visita MicroPIC                                                                                        ɔ!doɹɔ!ɯ ɐʇ!s!ʌ

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5416
Re:Robot equilibrista
« Respuesta #528 en: 09 de Febrero de 2018, 10:07:52 »
Me apunto.

Raspberry no la utilizaría para control de equilibrio. Es un ordenador y tiene lapsus porque el sistema operativo no es de tiempo real.

Yo usaría Arduino. Te ayudo en todo lo que pueda. No es tan difícil.

Un saludo.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5416
Re:Robot equilibrista
« Respuesta #529 en: 09 de Febrero de 2018, 10:09:26 »
Lo de los motores paso a paso no lo termino de ver. ¿Por qué no utilizas motores DC?

Este shield es ideal para quitar cables:
https://www.pololu.com/product/2511
« Última modificación: 09 de Febrero de 2018, 10:11:47 por Picuino »

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re:Robot equilibrista
« Respuesta #530 en: 09 de Febrero de 2018, 10:54:51 »
Pero estoy en duda: no sé si implementarlo con un PIC, plataforma en la que ya tengo experiencia, o montar una Raspberry Pi y aprender desde cero con ella, ya que aún no me he introducido en ese mundo y me apetece un montón.

¿Qué opináis?


Yo usaría un microcontrolador ARM. Tienes buenas opciones para elegir, STM32 de ST, Kinetis MK66 de NXP, Atmel SAM S70, o esperar un poco y para Marzo usar el nuevo NXP i.MX RT1020 un Cortex M7 a 500 Mhz en TQFP100 y 144 pines.

Si optas por STM32 o Kinetis, tienes entornos basados en Eclipse, con asistentes gráficos de configuración, Cubemx y MCUExpresso, también el RT1020 estará soportado por MCUExpresso.
 
Arduino, es muy flojo para estas cosas, y su IDE una castaña.  Raspberry yo no lo usaría, salvo que quieras sacar video, que me parece que no es el caso para esta aplicación, y es muy pobre en puertos comparado con un microcontrolador.
« Última modificación: 09 de Febrero de 2018, 10:57:19 por planeta9999 »

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5416
Re:Robot equilibrista
« Respuesta #531 en: 09 de Febrero de 2018, 12:24:00 »
Arduino, es muy flojo para estas cosas, y su IDE una castaña.

Es flojo, pero más que suficiente.
En principio solo hace falta leer un acelerómetro y controlar los motores con un PID.
Te sobra más del 90% del procesador. (16 millones de instrucciones por segundo)
Otra cosa distinta es que quieras hacer un control más complejo con observadores de estado, etc. Entonces un dsPic o un ARM es ideal.

Por otro lado no hay mucho que depurar y hay muchos ejemplos de código en internet para copiar y una gran comunidad para ayudarte. En esto Arduino es ideal.


Si el IDE no te gusta, puedes pasarte a eclipse para Arduino o el IDE de Atmel (ahora ya es Microchip) que también es bueno, pero te darán guerra hasta que los eches a andar.
Pero ten en cuenta que con el IDE de Arduino (muy simple) y las librerías y programas de ejemplo que encuentras en internet, en una tarde tienes el programa funcionando y ajustado.

Saludos.
« Última modificación: 09 de Febrero de 2018, 13:57:17 por Picuino »

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5416
Re:Robot equilibrista
« Respuesta #532 en: 09 de Febrero de 2018, 12:27:41 »
https://create.arduino.cc/projecthub/zac-jackson/how-to-build-an-arduino-self-balancing-robot-46d992

Código: C
  1. #include <PID_v1.h>
  2. #include <LMotorController.h>
  3. #include "I2Cdev.h"
  4. #include "MPU6050_6Axis_MotionApps20.h"
  5. #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
  6. #include "Wire.h"
  7. #endif
  8. #define MIN_ABS_SPEED 20
  9. MPU6050 mpu;
  10. // MPU control/status vars
  11. bool dmpReady = false; // set true if DMP init was successful
  12. uint8_t mpuIntStatus; // holds actual interrupt status byte from MPU
  13. uint8_t devStatus; // return status after each device operation (0 = success, !0 = error)
  14. uint16_t packetSize; // expected DMP packet size (default is 42 bytes)
  15. uint16_t fifoCount; // count of all bytes currently in FIFO
  16. uint8_t fifoBuffer[64]; // FIFO storage buffer
  17. // orientation/motion vars
  18. Quaternion q; // [w, x, y, z] quaternion container
  19. VectorFloat gravity; // [x, y, z] gravity vector
  20. float ypr[3]; // [yaw, pitch, roll] yaw/pitch/roll container and gravity vector
  21. //PID
  22. double originalSetpoint = 173;
  23. double setpoint = originalSetpoint;
  24. double movingAngleOffset = 0.1;
  25. double input, output;
  26. //adjust these values to fit your own design
  27. double Kp = 50;
  28. double Kd = 1.4;
  29. double Ki = 60;
  30. PID pid(&input, &output, &setpoint, Kp, Ki, Kd, DIRECT);
  31. double motorSpeedFactorLeft = 0.6;
  32. double motorSpeedFactorRight = 0.5;
  33. //MOTOR CONTROLLER
  34. int ENA = 5;
  35. int IN1 = 6;
  36. int IN2 = 7;
  37. int IN3 = 8;
  38. int IN4 = 9;
  39. int ENB = 10;
  40. LMotorController motorController(ENA, IN1, IN2, ENB, IN3, IN4, motorSpeedFactorLeft, motorSpeedFactorRight);
  41. volatile bool mpuInterrupt = false; // indicates whether MPU interrupt pin has gone high
  42. void dmpDataReady()
  43. {
  44.   mpuInterrupt = true;
  45. }
  46. void setup()
  47. {
  48.   // join I2C bus (I2Cdev library doesn't do this automatically)
  49. #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
  50.   Wire.begin();
  51.   TWBR = 24; // 400kHz I2C clock (200kHz if CPU is 8MHz)
  52. #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE
  53.   Fastwire::setup(400, true);
  54. #endif
  55.   mpu.initialize();
  56.   devStatus = mpu.dmpInitialize();
  57.   // supply your own gyro offsets here, scaled for min sensitivity
  58.   mpu.setXGyroOffset(220);
  59.   mpu.setYGyroOffset(76);
  60.   mpu.setZGyroOffset(-85);
  61.   mpu.setZAccelOffset(1788); // 1688 factory default for my test chip
  62.   // make sure it worked (returns 0 if so)
  63.   if (devStatus == 0)
  64.   {
  65.     // turn on the DMP, now that it's ready
  66.     mpu.setDMPEnabled(true);
  67.     // enable Arduino interrupt detection
  68.     attachInterrupt(0, dmpDataReady, RISING);
  69.     mpuIntStatus = mpu.getIntStatus();
  70.     // set our DMP Ready flag so the main loop() function knows it's okay to use it
  71.     dmpReady = true;
  72.     // get expected DMP packet size for later comparison
  73.     packetSize = mpu.dmpGetFIFOPacketSize();
  74.     //setup PID
  75.     pid.SetMode(AUTOMATIC);
  76.     pid.SetSampleTime(10);
  77.     pid.SetOutputLimits(-255, 255);
  78.   }
  79.   else
  80.   {
  81.     // ERROR!
  82.     // 1 = initial memory load failed
  83.     // 2 = DMP configuration updates failed
  84.     // (if it's going to break, usually the code will be 1)
  85.     Serial.print(F("DMP Initialization failed (code "));
  86.     Serial.print(devStatus);
  87.     Serial.println(F(")"));
  88.   }
  89. }
  90. void loop()
  91. {
  92.   // if programming failed, don't try to do anything
  93.   if (!dmpReady) return;
  94.   // wait for MPU interrupt or extra packet(s) available
  95.   while (!mpuInterrupt && fifoCount < packetSize)
  96.   {
  97.     //no mpu data - performing PID calculations and output to motors
  98.     pid.Compute();
  99.     motorController.move(output, MIN_ABS_SPEED);
  100.   }
  101.   // reset interrupt flag and get INT_STATUS byte
  102.   mpuInterrupt = false;
  103.   mpuIntStatus = mpu.getIntStatus();
  104.   // get current FIFO count
  105.   fifoCount = mpu.getFIFOCount();
  106.   // check for overflow (this should never happen unless our code is too inefficient)
  107.   if ((mpuIntStatus & 0x10) || fifoCount == 1024)
  108.   {
  109.     // reset so we can continue cleanly
  110.     mpu.resetFIFO();
  111.     Serial.println(F("FIFO overflow!"));
  112.     // otherwise, check for DMP data ready interrupt (this should happen frequently)
  113.   }
  114.   else if (mpuIntStatus & 0x02)
  115.   {
  116.     // wait for correct available data length, should be a VERY short wait
  117.     while (fifoCount < packetSize) fifoCount = mpu.getFIFOCount();
  118.     // read a packet from FIFO
  119.     mpu.getFIFOBytes(fifoBuffer, packetSize);
  120.     // track FIFO count here in case there is > 1 packet available
  121.     // (this lets us immediately read more without waiting for an interrupt)
  122.     fifoCount -= packetSize;
  123.     mpu.dmpGetQuaternion(&q, fifoBuffer);
  124.     mpu.dmpGetGravity(&gravity, &q);
  125.     mpu.dmpGetYawPitchRoll(ypr, &q, &gravity);
  126.     input = ypr[1] * 180 / M_PI + 180;
  127.   }
  128. }
  129.  

Solo 90 líneas de código si quitas comentarios.
« Última modificación: 09 de Febrero de 2018, 12:30:47 por Picuino »

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 17755
    • MicroPIC
Re:Robot equilibrista
« Respuesta #533 en: 09 de Febrero de 2018, 14:46:09 »
Yo usaría Arduino. Te ayudo en todo lo que pueda. No es tan difícil.


Muchas gracias por tu amable ofrecimiento, Picuino, pero descarto hacerlo en Arduino porque el propio B-Robot ya está hecho en Arduino, y me gustaría aportar algo nuevo.
Aquí puedes ver el código:
https://github.com/jjrobots/B-ROBOT_EVO2/tree/master/Arduino/BROBOT_EVO2

Lo de los motores paso a paso no lo termino de ver. ¿Por qué no utilizas motores DC?

Este shield es ideal para quitar cables:
https://www.pololu.com/product/2511
Sí, podría usar los motores DC, ¿pero porqué no los PaP?, con la popularización de las impresoras 3D, están tirados de precio. Y en cuanto al funcionamiento, júzgalo tú mismo:

Yo usaría un microcontrolador ARM. Tienes buenas opciones para elegir, STM32 de ST, Kinetis MK66 de NXP, Atmel SAM S70, o esperar un poco y para Marzo usar el nuevo NXP i.MX RT1020 un Cortex M7 a 500 Mhz en TQFP100 y 144 pines.

Si optas por STM32 o Kinetis, tienes entornos basados en Eclipse, con asistentes gráficos de configuración, Cubemx y MCUExpresso, también el RT1020 estará soportado por MCUExpresso.
 
Arduino, es muy flojo para estas cosas, y su IDE una castaña.  Raspberry yo no lo usaría, salvo que quieras sacar video, que me parece que no es el caso para esta aplicación, y es muy pobre en puertos comparado con un microcontrolador.
Sería una buena oportunidad para hincarle el diente a un bicharraco de esos, aunque es mucha tela para un proyecto tan peque. Pero les echaré un vistazo

Gracias por vuestra ayuda, compañeros. Sigo dándole vueltas, a ver qué hago al final.
Un saludo desde Sevilla, España.
Visita MicroPIC                                                                                        ɔ!doɹɔ!ɯ ɐʇ!s!ʌ

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5416
Re:Robot equilibrista
« Respuesta #534 en: 09 de Febrero de 2018, 15:34:31 »
Los motores DC son más pequeños y suelen tener mejor rendimiento.
A favor de los PaP, es más fácil controlar su posición.

Si al final te decides por un micro grande, puedes elegir un ARM sin salirte de Arduino con Arduino Due o Teensy.
Otras placas interesantes son las STM32. Planeta te puede ayudar a elegir una.

También puedes elegir un dsPic, pero te espera mucho más trabajo y no te servirá mucho en el futuro. Yo no lo haría.

¿Qué quieres aportar nuevo?
Lo más difícil suele ser la mecánica. Si aportas diseños sencillos y baratos (con pocas piezas 3d y pequeñas) sería estupendo.

Un saludo.


Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5416
Re:Robot equilibrista
« Respuesta #535 en: 09 de Febrero de 2018, 15:37:57 »
Otra cosa que puedes aportar es un BOM con las referencias de todos los componentes y enlaces a dónde comprar, en el menor número de webs posible.
Eso es un trabajo bastante tedioso, que lleva mucho tiempo y que no sueles encontrarlo hecho.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5416
Re:Robot equilibrista
« Respuesta #536 en: 09 de Febrero de 2018, 15:41:42 »
Aquí dicen por qué utilizan motores PaP:

https://www.jjrobots.com/projects-2/b-robot/
Why are you using Stepper motors?
There are several options for motors: DC, Brushless, Steppers… We choose stepper motors because they have enough torque, you could connect the wheels directly without gears that generate some backslash (this is a common problem in balancing robots), they have good bearings and you will be able to control the speed of the motors with accuracy. In standard sizes these motors are cheap (we use the same motors used on a regular 3D printers) and the drivers are cheap and easy to interface with Arduino too.


Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5416
Re:Robot equilibrista
« Respuesta #538 en: 09 de Febrero de 2018, 16:16:44 »

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 17755
    • MicroPIC
Re:Robot equilibrista
« Respuesta #539 en: 11 de Febrero de 2018, 15:34:18 »
Un saludo desde Sevilla, España.
Visita MicroPIC                                                                                        ɔ!doɹɔ!ɯ ɐʇ!s!ʌ