lunes, 28 de octubre de 2013

B-ROBOT: Un robot equilibrista impreso en 3D...

Bueno, ya he terminado mi primer robot totalmente diseñado e impreso con la impresora 3D (ruedas, estructura, cuerpo...  hasta los ojos!).
Se trata de un robot tipo SegWay con solo dos ruedas, que tiene que mantener el equilibrio y que se puede controlar desde un Smartphone/tablet via Wifi. También funciona en modo autónomo con un sonar para detectar obstáculos y alguna que otra sorpresa que se puede ver en el vídeo...



La verdad es que después de "pelearme" un poco con los algoritmos de control ha quedado muy suave y controlable. Inicialmente empecé probando un típico control PID que recibía como entrada el ángulo del robot (calculado con la IMU) y como salida controlaba la velocidad de los motores. El resultado no era muy bueno y sólo conseguía corregir bien en la zona cerca del equilibrio (0 grados) donde el problema parece ser más lineal. La verdadera mejora vino cuando cambié el algoritmo y probé un control PD donde la salida es la aceleración de los motores. Esto sí que permite controlar el balanceo del péndulo inverso y de hecho tiene lógica desde el punto de vista físico del sistema. El problema está en que de esta forma el robot no tiene la "obligación" de quedarse quieto, al fin y al cabo una aceleración 0 no implica velocidad 0, así que añadí un segundo control (control en cascada) PI de velocidad que gobierna al control PD interno de aceleración. Visto esquemáticamente:



La placa principal (WITA) es un diseño que realicé junto con Jordi Muñoz (de 3DRobotics) y se trata de un Arduino Leonardo con un módulo Wifi integrado (RN131 o RN171). Esta placa permite diseñar fácilmente proyectos que se controlan desde dispositivos remotos via Wifi o proyectos de Intenet of Things. En cualquier caso el proyecto podría reproducirse con una placa de Arduino Leonardo y un módulo Wifi externo (tipo RN-XV por ejemplo) o incluso modificando el código supongo que podría hacerse compatible con un Arduino Yun.



La IMU utilizada es un sensor MPU6050 con 3 acelerómetros y 3 giróscopos y usamos además el procesamiento interno DMP para conseguir una solución de actitud (ángulos del robot) a 200Hz.
Los motores empleados son Steppers de tipo NEMA17 (de los cortos) con drivers A4988 y Mircrosteping a 1/8. He montado los 2 drivers necesarios en una pequeña placa aparte añadiendo los condensadores y resistencias necesarios (ver datasheet del driver).



Las librerías de Steppers para Arduino que he podido ver permiten controlar la posición de los steppers pero no su velocidad y la mayoría de ellas son MUY ineficientes! así que me he tenido que hacer un pequeño driver en Arduino usando interrupciones para realizar un control preciso de velocidad (funciona a 25Khz).



La interfaz con los smarphone esta basada en el interfaz abierta OSC (mensajes tipo UDP). La aplicación que suelo usar (tanto para Iphone como Android) se llama TouchOSC.
Para el brazo que permite levantar al robot del suelo uso un servo tamaño mini (20gramos)
Por último el sonar empleado es un LV-MaxSonar-EZ3 que tenía libre de otros proyectos...
Todos los diseños 3D de las piezas han sido realizados en OpenSCAD.



Todo el proyecto: códigos (Open Source), librerías y diseños 3D están públicos y compartidos en un repositorio de GitHub: https://github.com/jjulio/b-robot

Llevo bastantes años dedicado a la robótica y es la primera vez que puedo partir de un lienzo totalmente en blanco y con toda la libertad para hacer lo que quiera. Lo normal (y muchos me comprenderán...) era hacer una visita a Leroy Merlin (o equivalente) ver lo que hay, planchas, varillas, etc... y diseñar condicionado por eso... Ahora cambia el paradigma, abres un OpenSCAD y ha pensar... un paso más adelante en el mundo DIY, me gusta!

Gracias a Ramon por ayudarme como el video como siempre... ;-)

Jose.

50 comentarios:

  1. Recuerdo que Jordi me encargó que revisara sus dibujos de la placa WITA hace mucho, y que le entregara prototipos listos para enviartelos a ti. Que bien que sirve de algo ese hardware! Un saludo desde 3D Robotics.

    ResponderEliminar
    Respuestas
    1. Gracias Sam! y buen trabajo!, la verdad es que la placa es muy útil para este tipo de proyectos...
      Saludos para ti y para Jordi

      Eliminar
  2. Me encanta Jose Julian. Felicidades por tu proyecto. Me esta picando aun más montar un pequeñín de estoy, ahora que veo algo de documentación en castellano y aun que no entiendo nada de algoritmos suena divertido. No as pensado en hacer un paso a paso de como montarlo?

    ResponderEliminar
    Respuestas
    1. Para el material he encontrado esto:

      Giroscopo + acelerometro: 6,63€
      http://dx.com/es/p/gy-521-mpu6050-3-axis-acceleration-gyroscope-6dof-module-blue-154602

      Arduino leonardo (compatible): 9,12 €
      http://dx.com/es/p/diy-eduino-leonardo-module-blue-black-213956

      Driver A4988 7,17 €
      http://dx.com/es/p/stepstick-a4988-stepper-motor-driver-module-white-black-186465

      Sonar sensor 26,95€
      http://www.pololu.com/catalog/product/793

      motor nama 17 corto 12,45 € por motor
      http://www.ebay.es/itm/Nema17-56-6-Oz-In-reprap-3d-printer-cnc-prusa-mendel-/151149334304?pt=LH_DefaultDomain_186&hash=item233133cf20&_uhb=1

      modulo wifi ¿esto sería trasparente?
      38,66€ + portes
      http://www.bricogeek.com/shop/wifi/410-rn-xv-wifly-80211-b-g.html


      si Compro todo esto, he probado a compilar el código arduino con las librerias. OK y ahora como monto todo el cambalache ;-)

      Eliminar
  3. Cool project.
    Do you have any drawings that explains the wiring of the different components ?

    Thanks

    ResponderEliminar
  4. Great work! I want very much put one B-Robot together. Are you releasing more information on how to assemble and set up?

    Thanks

    Eduardo

    ResponderEliminar
  5. Hi,
    Where can I buy the WITA board ? :)

    Sascha

    ResponderEliminar
  6. Hi Sascha,
    WITA board is not a comercial product now, but you can emulate the board with more "stardard" components (as described on blog).
    We will release the WITA board schematic if someone wants to replicate it.
    I will make a diagram with the wirings also...

    Thanks,
    Jose.

    ResponderEliminar
  7. Hi Jose !
    I have seen your project and like it very much.
    You don't write much about the app to run the smartphone. What is it called and where can it be downloaded from ?
    Thank you

    ResponderEliminar
  8. Muy buen proyecto... me encanta, con tu permiso intentaré construirme uno de estos.

    ResponderEliminar
  9. Hello! Arduino1.0.5 compile your code errors. Show arduino-1.0.5-windows\arduino-1.0.5\libraries\WITA\WITA.cpp:259: warning: deprecated conversion from string constant to 'char*' Many errors

    ResponderEliminar
  10. Hola ! antes que nada muchísimas Felicitaciones por su B-RoBot!!! admiro mucho estos logros.. Me gustaría que me explicara ya que tengo dudas sobre como aplicar los controladores PD y PI . La Velocidad del robot es la Velocidad de las ruedas?, la Velocidad Deseada a que se refiere? el Angulo del robot es el de la IMU? me preguntaba si por casualidad me podría conectar por Skype , Face Time... ya que hace mucho pero mucho tiempo que llevo con este proyecto y no lo puedo sacar adelante ...
    Desde ya muchas gracias !! Lucas E Blanco

    ResponderEliminar
    Respuestas
    1. Hola Lucas, te he contactado por Google+ y asi puedes preguntarme lo que quieras...
      Encantado de intentar ayudarte...

      Eliminar
  11. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  12. HI there! We love your project and are using as the basis for a CoderDojo class in SF. We have most of the parts sourced and connected, but we are very curious about what power supply you used here.

    What did you use and how did it turn out?

    ResponderEliminar
    Respuestas
    1. Hi,
      I used an 3S1000 LiPo battery (typical RC equipment). I have not make an specific test but I think that I could play more than 30 minutes on one charge...

      Eliminar
  13. Can you use an Ardiunio Yun instead of the custom WITA?

    ResponderEliminar
    Respuestas
    1. I suppose that the answer is yes, you could use an Arduino Yun but you have to rewrite some parts of the code (outputs, Wifi module conection and protocol,packet decoding...). I don´t have an Arduino Yun so I have not tested...

      Eliminar
  14. Hola Jose. Disculpa mi español, estoy escribiendo desde Suecia.
    Estoy muy impresionado con tu proyecto! Y me decidí por hacer un B-robot yo tambien.
    Quería preguntarte si tienes la esquemática de los componentes electrónicos que me parece lo único que falta en tu documentación.

    Pensé usar otro tipo de Arduino sin Wifi y talvez xbee y de allí tratar de cambiar lo necesario en el código. Aparte de eso estoy usando los mismos mosfets, motores y accelerómetro. Hasta la misma impresora ;)

    Saludos de Suecia

    ResponderEliminar
  15. I am doing a project where I need to control the speed of stepper motors with a microcontroller. I was looking at your code and I don't quite understand how you are controlling the speed. I understand that you have an interrupt at 25KHz and I see you are doing something with sub periods but I don't understand how it works. I was wondering if you could explain it a little more so I could adapt it to my project. If you could I would be very grateful.

    ResponderEliminar
  16. Have you seen this? Looks very similar!
    http://www.wowwee.com/mip/

    ResponderEliminar
  17. Hola amigos, espectacular en verdad que solo de verlo funcionando me a dejado impresionado. De ahora en adelante amigo sere casi casi tu Padawan. Estoy con la idea de hacer un robot aunq no de tales complejidad, solo mantener el equilibrio y ya. Dispongo de la tarjeta Arduino Uno mmm supongo que trasladarlo a esta tarjeta no sera muy complicado amigo mio

    ResponderEliminar
  18. hola josé felicidades por este excelente proyecto, me preguntaba si podrías ayudarme con los diagramas de conexiones y algunas explicaciones sobre el montaje y funcionamiento del segway, soy estudiante del quinto semestre de ingeniería electrónica y no entiendo muy bien los PI, PD. PID, si me pudieras ayudar te lo agradecería mucho. (y)

    ResponderEliminar
  19. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  20. Hi! Jose
    Great Project ^^;
    I am making this.

    Thanks for sharing your project!! every time.

    ResponderEliminar
  21. Hi Jose,

    Wow, nice project, I almost finished printing mine :-)
    However, I have a few questions:
    - Can you tell me what you use for the rubber tires ?
    - Can you tell me how big the eyes are in diameter ? (I'm going to 3D design & print them)
    - What font did you use for the "B-robot" sign ?

    I have my own blog http://www.digitalplayground.be , I hope it's OK for you if I refer to your blog, when I put up some pictures on my blog of my B-Robot ?

    Best regards from Belgium,
    Kris

    ResponderEliminar
    Respuestas
    1. Hi Kris,
      I used a rubber that my wife use to make bracelets. It´s 2mm color rubber. Then I glued with cianocrylate.
      The eyes are made of EVA foam (white part) and it´s about 3cm by 2cm, The black circle is 3D printed
      I designed the B-ROBOT text with Sketchup but I don´t remmember the font now...
      Yes you can referer the blog and use some pictures, no problem...

      Regards,
      Jose

      Eliminar
  22. Hi Jose,
    its very great project .. :)
    I would like to replicate it by my self, where I can get the wiring diagram?
    Can I replace the stepper motor with other type? do you have any suggestion for that?

    ResponderEliminar
    Respuestas
    1. wiring is not so difficult, have a look at the arduino code :-)

      You need 2 stepsticks to control the stepper motors, look in google for stepsticks, you will find a diagram to connect the stepper to the stepstick.
      Connecting the stepsticks to the Arduino can be found in the arduino code itself:

      / ENABLE PIN: D4
      // STEP Motor1: D6 -> PORTD,7
      // DIR Motor1: D8 -> PORTB,4
      // STEP Motor2: D12-> PORTD,6
      // DIR Motor2: D13-> PORTC,7

      // Robot servo arm connected to D5
      // Distance sensor (sonar) connected to A0 (analog 0)
      // Battery monitor (voltage divider) connected to A5

      Furthermore, you need a standard RN131 or RN171 Rover Network wifi module.

      That should be it :-)

      Good luck,
      Kris

      Eliminar
    2. Thanks Kris for the help...
      Yes, I have no wiring scheme for this project but the comments on the code show all the connections to the drivers.

      Eliminar
    3. Thanks Kris & Jose.
      How about if I use another type of motor stepper? like this one http://www.4tronix.co.uk/arduino/Stepper-Motors.php ( 28BYJ48 ), can I use it?

      Eliminar
  23. Hi Jose,
    I did almost done but I don't know the values - /1/fadder1,fadder2 Value range, and /2/fadder1,2,3,4 - of TouschOSC.
    Could you share your TouchOSC layout or values?
    Thank you so much!!!

    ResponderEliminar
    Respuestas
    1. I have added a new TouchOSC folder on the GitHub repo with the layout I used.

      Eliminar
    2. Thanks Jose, It's very helpful.
      The name is diffrent from fadder1, fadder2..in B_ROBOT.ino to fader1, fader2... in TouchOSC.
      fader1, fader2 ... in TouchOSC Should be chaged into fadder1, fadder2...?

      and another problem is a 4988's 8 microstepping mode. It's really bad for stepper motor.
      Stepper motor squeak!! and stop !!
      but a 4988's 16 microstepping is ok. Do you have any suggestion for that?

      Eliminar
  24. It's good news.
    I solved my problem above mentioned.
    I changed stepper motor for 4V from stepper motor for 12V and A4988 adjusting pot for current.
    My robot have to be arranged. It's really short video. Thanks jose!!

    http://www.youtube.com/watch?v=B-1P-JLi5Ko&feature=share&list=UUMxUByEqCO6Ps_azcIrxa9w

    ResponderEliminar
    Respuestas
    1. Great!! Good job! It seems to work very nice and stable... Thanks for share the video!

      Eliminar
  25. Hi Jose!
    Magnificent project! Thanks for the idea!
    A few weeks ago I started to implement it.
    And the first thing I was unpleasantly surprised - you use it quite expensive and large in size components.
    Quest to reduce the cost and size led me to the following components:
    Arduino compatible board - Pro Micro;
    WiFi module - HLK-RM04;
    Sonar - HC-SR04;
    Stepper motors - 17HS2408 (0.6A, 12H.cm).
    Scheme will feed from the battery pack at 5A * h 3.7V (Li-Ion) through the boost converter to 5V.
    Currently creative porting your program to the selected equipment. I want to add functionality. For example, (1) Please add a link with a remote control; (2) a discharge Bater make the robot look for the charging station and connect it to charge; (3 plans) add between narrow wheels suction skirt + DC motor creates a vacuum debris hopper + = funny robot vacuum cleaner, which will bring joy to the children and do the cleaning.
    About their results will periodically report if you're interested.
    Potential of your B-robot is not limited!

    Regards, Oleg (Minsk, Belarus)

    ResponderEliminar
  26. Hi Jose,
    What pins do I connect the 6050MPU to?
    I cant see anything in the code...
    Thanks

    ResponderEliminar
  27. Hi Luc,

    It all depends on the arduino board you are using.
    6050MPU uses the standard I2C pins.
    So, you only need to connect 4 pins to the MPU6050 sensor.
    - SCL
    - SDA
    - GND
    - VCC (to 5V)

    pin layouts on different arduino's:
    Uno, Ethernet A4 (SDA), A5 (SCL)
    Mega2560 20 (SDA), 21 (SCL)
    Leonardo 2 (SDA), 3 (SCL)
    Due 20 (SDA), 21 (SCL), SDA1, SCL1

    so, if you use a Leonardo, connect SDA to pin D2 and SCL to pin D3
    (not the analog pin 2 and 3 !)

    P.S. Since I have been ill for a few months, and even have been in hospital for a few weeks, my B-Robot is still not finished. I hope to get it up and running within the next week :-)


    good luck,
    Kris

    http://www.digitalplayground.be
    Where fun meets technology ...

    ResponderEliminar
  28. I have a question.
    I assume you use a simple voltage divider with 2 resistors for the battery monitoring ?
    What ratio do you use ? 2.5 ?
    Would a 10k resistor for the low side and a 15k resistor foe the high side be OK ?
    I also use a 3s lipo 1800 mah)

    Best regards,
    Kris

    Http://www.digitalplayground.be
    Where fun meets technology ...

    ResponderEliminar
    Respuestas
    1. I had to check it. I used a 33k/22k voltage divider (22k for the low side). I used normal tolerance resistors, so I check with a tester to calculate the proper voltage cutoff on code.

      Eliminar
  29. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  30. Hola Jose,
    Gracias por compartir este excelente proyecto. Tengo una pregunta sobre la funcion dmpGetPhi(). Creo que la orientacion de mi MPU es distinta a la tuya en el robot (aunque no la puedo ver en las fotos). Como podria encontrar una funcion/formula para sacar el angulo Theta en vez de Phi a partir de los quaternion? Gracias una vez mas por compartir tu proyecto.

    ResponderEliminar
    Respuestas
    1. Gracias!
      En el propio codigo, en la funcion float dmpGetPhi() {

      Tienes una linea comentada con la funcion para obtener el otro angulo:
      //return( asin(-2*(q.x * q.z - q.w * q.y)) * 180/M_PI); //roll
      Descomenta esta linea y comenta la siguiente (el return actual)...

      Eliminar
  31. Hola Jose Julio,

    En el caso de que solo quiero equilibrar el robot, prodria omitir el speedPIControl() y solo usar el stabilityPDControl() metodo?

    Un saludo y gracias por compartir este projecto!
    -Al

    ResponderEliminar
    Respuestas
    1. Si, efectivamente podrías usar el StabilityPDControl() con un target_angle=0 para que mantenga la estabilidad. El otro control es solo para la velocidad.

      Eliminar
  32. Hola Jose, primero de todo felicitarte por tu increíble proyecto, si no es el mejor que e visto, no le falta mucho para ser-lo.
    Estoy intentando construir un robot auto balanceado como el tuyo, pero mis conocimientos sobre algoritmos y cosas de estas son bastante básicos por no decir nulos ya que acabo de terminar la ESO, por si fuera poco, mi nivel de programación no es suficiente para comprender tu código y modificar-lo para su uso sin el modulo wifi, por eso querría preguntarte si tienes y si podrías facilitarme alguna versión de el código en la que no la utilices.
    Muchísimas gracias de antemano, un saludo
    Marc

    ResponderEliminar