Miniatura de un robot R2D2 funcional y autónomo.

Descripción:

Emite sonidos reales. Gira la cabeza 180 grados. Se desplaza en cualquier dirección. Evita obstáculos orientado mediante una brújula. Reacciona al contacto corporal. Es posible controlar sus movimientos mediante mando o software Bluetooth. Expresa «emociones» mediante sonidos, luces de colores y movimientos. 

Posee dos tipos de funcionamiento, el autónomo de desplazamiento y el estático de exposición para poder interactuar colocado sobre un escritorio o vitrina.


Material necesario:

Dependiendo el resultado deseado puedes elegir entre componentes mínimos necesarios o completar con adicionales para realizar un proyecto algo más complejo.

Componente mínimos:

  • 2 Motores TT.
  • 1 Arduino Nano
  • Driver puente H, LN298N.
  • Servo motor MG90S.
  • Batería 18650.
  • Módulo Cargador USB de batería litio 18650 modelo 03962A.
  • Convertidor DC Step-Up Booster.
  • Interrurtor de palanca.
  • Rodamiento 608ZZ (22x8x7mm).
  • Rodamiento de bola de metal (pata central).
  • Tornillos y tuercas M3.
  • Tornillos autorroscantes 3×10mm.

Componentes adicionales:

  • Brújula HCM5883L
  • Módulo BlueTooth.
  • 5 Leds RGB de cátodo común.
  • 3 transistores 2N2222A.
  • 6 resistencias 1K, 300 ohm.
  • Sensor ultrasonidos HC-SR04.
  • Sensor capacitivo de contacto TTP223B.
  • Reproductor de mp3 Open-Smart.
  • Lente de cristal (de linternas comerciales).

Elementos de la estructura

Ruedas y tracción

Como cualquier casa pensé que empezar a construir desde abajo será un buen criterio.

Punto fundamental a plantearse aunque parezca una nimiedad es el tipo de adherencia al suelo del robot. Quizás unos de los puntos que me ha provocado mayores quebraderos de cabeza.

Las dimensiones de las ruedas deben ser reducidas, no superar los 35mm de diámetro. Esto y el poco peso del robot hacen que esta cuestión no deba dejarse de lado. 

Decide qué tipo de adherencia te viene mejor y haz algunas pruebas previas. Puedes usar una o dos ruedas por pata si así se requiere (recuerda que el motor posee dos ejes).

Propongo a continuación varias soluciones al problema. Elige la que mejor se adapte a tus necesidades y recuerda que además existen una gran variedad de ruedas en el mercado.


Modelo 1 de tracción:

La goma se puede imprimir en TPU o Nylon que encajará a presión sobre la llanta que puedes imprimir en un material rígido. El diámetro total del conjunto es de 32cm.


Modelo 2 de tracción:

Este modelo es un solo bloque que puedes imprimir enteramente con un filamento flexible.


Modelo 3 de tracción:

Esta es la opción que adopté personalmente pues me parece la más estable y con mejor fricción. Consta de una llanta con un hueco adecuado para insertar una goma toroide de grifería. El agarre es mejor. Tener en cuenta que el diámetro de la llanta es de 27mm, se pueden usar gomas de menor tamaño (20mm es apropiado) pues se estiran y adaptan bastante bien

Obsérvese que la goma puede estirarse hasta adaptarse

Las ruedas deben ser la primera pieza a montar en el robot. Pues una vez colocado el motor dentro de las patas, ya será imposible el acceso a estas sin desmontar nada.

Primer paso del montaje. En la imagen ruedas de nylon. Usar dos por motor es otra opción a tener en cuenta pues caben adecuadamente.

Patas

El modelo consta de 3 patas. Una central y dos laterales.

Patas laterales

Las patas laterales están marcadas en su interior por las letras I de izquierda y D de derecha. 

Cada pata está compuesta de dos piezas que encajarán una vez colocados los motores.

En ellas deben ubicarse los motores en los que previamente habremos colocado las ruedas.

Para fijar los motores en su interior usaremos tornillos M3 de 25mm de largo (preferentemente de cabeza cónica). Las tuercas deben incrustarse previamente en los orificios adecuados para ellas que nos facilitarán enormemente la fijación con el destornillador.

El cable de los motores debe pasarse en este momento por el interior de la pata que la atravesará y saldrá por el otro extremo con forma cuadrada.

Una vez fijados, es momento de cerrar el conjunto usando la pieza «pie«. Existen igualmente dos de ellas marcadas con la letra correspondiente. Para ello usamos 4 tornillos autorroscantes de 3x10mm.

Puede observarse que las ruedas sobresalen unos milímetros por debajo.

Ya podemos ir añadiendo partes electrónicas con el driver ln298n que controlarán los motores.

Realizar la misma tarea en las dos patas.


Pata Central

Como apoyo en esta para podemos usar cualquier tipo de pata loca de pequeño tamaño. En mi caso usaré unos rodamientos de bola de acero.

La pata central consta de dos piezas. Una es la pata en sí y la otra es el soporte del rodamiento que usaremos de apoyo que servirá para su fijación. Irán atornilladas con tornillos autorroscantes de 3x10mm.

Nótese que la pata central posee 5 orificios para ser anclada al cuerpo del robot desde su interior.


Cuerpo

Tener en cuenta que la pieza que sujeta el altavoz, la pila y el USB aparecen en apartados siguientes para poder descargar e imprimir.

En su interior estará la electrónica y la pila. La pieza de engranajes se anclará en los cuatro zurcos laterales. 

Más adelante se explica el proceso de colocación de las piezas interiores.

Lo primero que debemos añadir a esta pieza del cuerpo será la pata central que se atornillará con 5 tornillos 3x10mm autorroscantes.

Seguidamente colocar el altavoz mordido con una pieza especial de la que se habla en secciones posteriores y el módulo de sonido.

Incluir ahora la pila bloqueada por una pieza especial que destacamos en las secciones siguientes y el módulo de carga USB con otra pieza que la asegura a la estructura y el interruptor.

Después de esto es momento de las patas laterales y el driver Ln298N


Cabeza

Es el momento de elegir el tipo de cabeza que otorgarás a tu robot. Te propongo dos modelos.

La opción 1 corresponde al modelo que incluye sensor de distancia por ultrasonidos y una lente (reciclada de proyector antiguo de diapositivas con un diámetro de 35mm) . 

Como doy por supuesto que no cuentas con esta lente de proyector, incluyo la pieza imprimible en el paquete de la cabeza para que la sustituye y la puedas imprimir y pintar a tu gusto, o si es el caso, añadirle un cristal.

La opción 2 corresponde a un modelo que posee tres lentes que encajan a la perfección con unas lentes de linternas de una famosa marca de supermercados. Como es de suponer que no dispones de las piezas mencionadas, añado lo complementos necesarios para que puedas imprimir la cabeza con todas sus partes aunque será cosa tuya añadirle o no un cristal a la lente.


Engranaje y rodamiento central

En primer lugar usaremos la pieza con forma de H en la que incrustaremos el servomotor atornillado con 2 dornillos de 3x10mm autorroscables.

También añadiremos el rodamiento 608ZZ (22x8x7mm) que atraparemos con la pieza «soporte_rodamiento» asegurada con 3 tornillos 3x10mm autoroscantes. También ajustaremos la pieza del eje del servo que agarrará el engranaje de 18 dientes.

Este es un buen momento para asegurarnos que el servo tiene la posición 90º que es la que usaremos para que el robot mire al centro.

Para ello usaremos un pequeño programa que coloque el servo en esa posición.

Esto lo hacemos para poder colocar con certeza la pieza anillo en la posición correcta y poder garantizar así el giro adecuado de la cabeza del robot.

Roscaremos el engranaje de 18 dientes con los tornillos que incluye el kit del servomotor con la precaución de que los tornillos deben estar hacia arriba para evitar colisiones.

La razón por la que he decidido diseñar los engranajes con distinto número de dientes es garantizar que con 180º de giro del servo, la cabeza gire algunos grados más, es decir, que pueda mirar de una pata a la otra para medir la distancia a los obstáculos laterales.

Es momento ahora de colocar la pieza «anillo» que posee un rodamiento de 16 dientes. La ajustaremos el rodamiento usando un tornillo 25x3mm con su tuerca incrustada en el hueco destinado. Se usarán las arandelas necesarias para garantizar el ajuste perfecto del sistema.

Una vez asegurada la pieza que se ancla al rodamiento, es el momento de añadir la pieza que sostendrá la brújula. La atornillaremos desde abajo preferentemente para evitar colisiones con 3 tornillos 10x3mm autorroscantes.

Ya solo queda añadir el sensor de orientación y asegurarlo con la pieza que lo agarrará al sistema. La razón por la que no uso tornillos metálicos es como se ha comentado antes para evitar en todo lo posible la interferencia electromagnética. De ahí la ubicación tan extraña a la que he forzado el instrumento de medición.

El último paso es conectar adecuadamente los terminales a la placa central y atornillar el bloque de engranajes a la cabeza con 3 tornillos 10x3mm autorroscantes y luego al cuerpo del robot con 4 de esos tornillos.

El sistema debe quedar sujeto y cerrado.


Electrónica

Esquema electrónico


Elementos electrónicos:

Para el proyecto usaremos las siguientes partes:

  • Brújula HCM5883L
  • Alimentación: batería 18650, cargador USB, Step-Up para 5Voltios.
  • 2Motores TT
  • 5 Leds RGB de cátodo común, 3 transistores 2N2222A, 6 resistencias.
  • Driver para motores LN298N
  • Servo motor MG90S
  • Sensor de distancia por ultrasonidos HC-SR04
  • Sensor capacitivo de contacto TTP223B
  • Reproductor/amplificador de sonidos Open-Smart Mp3

Brújula

Una brújula digital es un sensor que mide el valor del campo magnético en tres ejes. Con esta medición, es posible estimar la orientación del dispositivo respecto al campo magnético de la tierra.

En este caso usaremos la brújula HCM5883L.

Los tornillos que sujetan la estructura pueden generar anomalías en la medición.

La conexión es sencilla, simplemente alimentamos el módulo desde Arduino mediante GND y 5V y conectamos el pin SDA y SCL de Arduino con los pines correspondientes del sensor, dejando el pin DRY sin conectar. Usaremos así la interfaz I2C.

A tener en cuenta que este módulo no permite modificar su dirección I2C que será fija con el valor 0x1E de fábrica.

En este ejemplo empleamos la medición del campo magnético para determinar la orientación del sensor.

La orientación se obtiene en grados respecto al norte magnético. Sin embargo, el norte geográfico no está perfectamente alineado al norte magnético. Esto se denomina declinación, y depende del punto del globo donde estéis ubicados.

Por tanto, si queréis obtener la orientación respecto al norte geográfico deberéis introducir la declinación de vuestra posición. Existen varias páginas donde consultar este valor, como www.ign.es para ubicaciones dentro de España, o www.ngdc.noaa.gov para ubicaciones en todo el mundo.

Realmente para este proyecto no es necesario compensar la declinación, pero la información no está de más. En mi localización y en esta fecha la compensación será de 0’06.

Para usar el código necesitarás las siguientes librerías: HMC5883L.h y I2Cdev.h que se usarán también en el programa definitivo.

El motivo para incluir una brújula en este proyecto es que el desplazamiento del robot sea ortogonal, es decir que realice giros de 90 grados para corregir su posición.

El código de la función que usaré para la posición será el siguiente:

Problemas

Durante las pruebas la brújula ha dado valores erróneos y parecen ser debidos a el campo magnético alterado por los tornillos que lo anclan a la estructura y la cercanía de la brújula al imán del altavoz del robot. Por este motivo modificaré la fijación de la brújula para ubicarla lo más lejos posible de estos elementos y evitaremos usar sujeciones metálicas. La pieza de los engranajes de la cabeza parece el mejor candidato.


Alimentación

Por economía de espacio usaremos una batería litio 18650 que proporciona un voltaje de 3.7 voltios junto a su cargador USB. Como es preciso elevar dicho voltaje a 5 Voltios debemos usar un Step-UP para esta tarea. Además debemos incorporar un interruptor de encendido y apagado que interrumpa el paso de corriente desde el positivo del Step-up hasta la placa de conexiones.

Emplearemos un interruptor de palanca de dimensiones como se muestran en la imagen.

El interruptor encaja en el orificio asignado en la parte trasera del cuerpo del robot y es bloqueado por su propia rosca.

Y el cargador de la batería posee un lugar especial en la parte superior de la trasera del cuerpo del robot en la que va anclada con una pieza especial que debemos imprimir con dos tornillos 3x10mm autorroscantes.

Por su parte, la pila debe ir colocada en el hueco cilíndrico del interior del cuerpo del robot bloqueada por una pieza que impide su movimiento que debemos imprimir y atornillar con 2 tornillos 3x10mm autorroscantes.


Motores

El motor TT para Arduino es un motor DC pequeño y económico utilizado en proyectos de electrónica y robótica debido a su tamaño compacto y bajo costo. Este tipo de motor se caracteriza por su fácil control a través de un módulo controlador de motores o puente H.

Pueden ser alimentados de 3 a 8 voltios. En nuestro proyecto usaremos 5 voltios. Disponen de una reductora que genera suficiente tracción para nuestro robot.

En nuestro robot usaremos dos de ellos que serán controlados por el driver LN298N.


Luces leds

Para el efecto luminoso del ojo central usaremos 5 leds RGB de cátodo común en paralelo dispuestos sobre una pieza que se anclará al interior de la cabeza con 3 tornillos 3x10mm autorroscantes.

En las imágenes se puede ver el proceso de soldadura de los leds, que usaran unas resistencias de 150 ohm para el rojo, 150 ohm para el azul y 300 ohm para el verde que parece más luminoso en mi caso.

Para encenderlos emplearemos 3 transistores 2N2222A en cada canal con una resistencia de 1K en cada una de las bases. Estos transistores serán controlados por 3 pines PWM que corresponderán a D9, D10 y D11 para cada uno de los colores.

Ha de tenerse en cuenta que la librería «servo.h» que usaremos en el proyecto para el servomotor afecta al funcionamiento del PWM del pin 10, lo que nos impedirá usar el comando «analogWrite» para encender los leds con grados de intensidad y tendremos que emplear en su lugar «digitalWrite».


Driver de motores

Para controlar los motores vamos a usar el driver LN298N que posee un puente H y puede controlar el giro y la velocidad de dos motores.

Vin admite tensiones entre 3V y 35V, nosotros lo alimentaremos con 5Voltios por lo que dejamos puesto el jumper que alimentará también a la parte lógica con los mismos 5V. 

Los pines IN1 e IN2 nos sirven para controlar el sentido de giro del motor A, y los pines IN3 e IN4 el del motor B. Funcionan de forma que si IN1 está a HIGH e IN2 a LOW, el motor A gira en un sentido, y si está IN1 a LOW e IN2 a HIGH lo hace en el otro. Y lo mismo con los pines IN3 e IN4 y el motor B.

ENA y ENB los conectaremos a dos salidas PWM de Arduino de forma que le enviemos un valor entre 0 y 255 que controle la velocidad de giro.

Usaremos la siguiente configuración de pines en el programa definitivo:

Este driver irá atornillado en un lateral del cuerpo del robot con 4 tornillos 3x10mm autorroscantes.


Servomotor

El servo elegido es el MG90S que incorpora un eje metálico y proporciona una fiabilidad algo mejor que los conocidos SG90.

Usaremos la librería incluida en el IDE de Arduino llamada «Servo.h» y conectaremos el cable naranja al pin D6 que debe ser PWM.

La documentación de esta librería nos advierte que los pines D9 y D10 serán afectados en la función PWM.


Sensor de distancia

Para medir la distancia a un obstáculos emplearemos el común y barato sensor  de ultrasonidos HC-SR04 que nos permitirá saber si hay paredes en un radio de 150cm aproximadamente.

Su funcionamiento consiste en emitir un sonido ultrasónico por uno de sus transductores, y esperar que el sonido rebote de algún objeto presente, el eco es captador por el segundo transductor. La distancia es proporcional al tiempo que demora en llegar el eco.

El emisor lo denominaremos trigger (TRIG) cuya traducción sería «desencadenante» y al receptor lo llamaremos echo cuya traducción sería «eco».

Conectaremos el sensor en los pines A2 y A3 que a pesar de ser analógicos podemos usarlos como si fuesen digitales simplemente asignándolos en el setup del programa. Debido a la gran demanda de pines de este proyecto debemos usar algunos de los analógicos como si de digitales se tratase.

Este sensor se alimenta también con 5 voltios.

La distancia se puede calcular utilizando la siguiente formula:

Distancia(m) = {(Tiempo del pulso ECO) * (Velocidad del sonido=340m/s)}/2

Lo dividimos entre dos por que el sonido hace el viaje de ida y vuelta.

Lo atornillaremos en la cabeza del robot usando 2 tornillos autorroscantes de 3x10mm. (precaución de no atornillar demasiado pues el orificio es de menor distancia que el tornillo).

Detalle del interior de la cabeza con la lente colocada en su lugar y el sensor de distancia preparado para ser atornillado.

Para calcular la distancia hasta el obstáculo emplearemos esta función a la que llamaremos periódicamente desde el loop.

Finalmente y a pesar de que el código funciona, he decidido emplear la librería que encontraremos en el repositorio de Ardunio «NewPing.h» pues ofrece mejor estabilidad al programa ya necesitamos de un timeout en casos de no detectar el rebote entre otras cosas.


Sensor touch (táctil).

Este módulo utiliza el circuito integrado TTP223B que es un sensor touch capacitivo. En su estado normal la salida del módulo se encuentra en cero lógico y bajo consumo de corriente, cuando un dedo toca la posición correspondiente la salida del módulo se activa en uno lógico. Si no se toca el modulo en 13 segundos vuelve a modo de bajo consumo.

Será alimentado en VCC con 5 voltios. GND debe conectarse a masa y el pin marcado con I/O es la salida digital que conectaremos directamente al pin A0 que configuraremos como entrada digital a pesar de tratarse de un pin analógico, pero la gran necesidad de pines me obliga a usarlos de esta manera.

El módulo posee dos zonas de puentes de soldadura nombrados como A y B.

Por defecto viene con estos puentes sin soldar (puente abierto).

El selector A configura el estado lógico, es decir, si el puente está sin soldar, el módulo entregará un 0 cuando no es pulsado y un 1 cuando es pulsado. Su comportamiento se invertirá en este aspecto si aplicamos un puente de soldadura en este selector. (Funciona como un inversor).

El selector B hace que cambie el comportamiento del módulo, es decir, si el puente está sin soldar, al ser pulsado se comportará como un interruptor momentaneo (sin bloqueo). Su aplicamos soldadura en este puente conseguiremos que se comporte como un interruptor encendido/apagado (con bloqueo). Esto es útil para evitar oscilaciones al dejar presionado durante un tiempo prolongado el sensor.

El módulo posee además una soldadura para añadir una antena y aumentar así su distancia de acción. 

También puede cambiarse su sensibilidad modificando el condensador que trae por defecto.

Es capaz de ser estimulado a través de la capa de filamento de unos milímetros por lo que lo situaremos en la parte superior de la cabeza del robot y dará la sensación que responde al estímulo del contacto corporal.

Para sujetar el módulo capacitivo usaremos una pieza que debemos imprimir para atornillarla a la parte superior de la cabeza usando 2 tornillos 3x10mm autorroscantes.


Reproductor de sonidos.

Vamos a usar un módulo muy económico y versátil, ya que además de reproducir audio en formato mp3 o wav lo amplifica ahorrando espacio pues no es necesario añadir amplificador de audio.

Se trata del Serial MP3 player A de Open – Smart. Funciona a 5 Voltios y se comunica con el microprocesador por puerto serie

Dispone de 4 pines. Tx que conectaremos al pin D8 ,Rx que conectaremos al pin D7, GND y VDD.

En el código de programación usaremos un puerto serial creado por software en los pines 7 y 8 mediante la librería <SoftwareSerial.h> que encontraremos en el repositorio natural de arduino.

Los audios los almacenaremos en una tarjeta de memoria SD. Contenida en carpetas nombrados con una numeración de 3 dígitos (001.mp3, 002.mp3…).

El kit contiene un altavoz que emplearemos también en el proyecto. Irá anclado en la parte baja del robot. Para ello es necesario haber anclado la pata central antes mediante 5 tornillos 3x10mm autorroscantes como se muestra en la figura.

Seguidamente ajustaremos el parlante y lo bloquearemos con la pieza especial para ello mediante 2 tornillos 3x10mm autorroscantes.

Por último colocar y atornillar con 4 tornillos 3x10mm autorroscantes el módulo MP3 por encima del parlante y conectar.

Para manejar este módulo necesitaremos la librería RedMP3.h demás de la librería <SoftwareSerial.h> mencionada antes.

En el siguiente enlace puedes descargar el fichero con los sonidos que se han usado en este proyecto ordenador por carpetas.

Carpeta 01: Sonidos normales que se emplearán al pulsar el sensor táctil.

Carpeta 02: Sonidos optimistas de felicidad se emplearán al encontrar una salida. (falta el 019.mp3).

Carpeta 03: Sonidos de contradicción se emplearán al detectar un obstáculo.

Carpeta 04: Sonidos de enfado se emplearán en momentos de frustración.


Código y programación

Librerías utilizadas

SofwareSerial.h: Incluida en el IDE de Arduino.

RedMp3.h: Para el reproductor de sonidos.

Servo.h: Uso la versión 1.2.1 de Michael Margois facilitada por el propio repositorio de Arduino. 

Wire.h: Instalada por defecto en el IDE de Arduino.

I2Cdev.h: Una mejora de la comunicación I2C para la brújula.

HMC5883L.h: Para la brújula que puedes descargar desde aquí. 

NewPing.h: Empleo la versión 1.9.7 de Tim Eckel instalada desde el mismo repositorio del IDE de Arduino.


Código definitivo


Resultado final

Fotos reales del resultado final del proyecto.

Una vez decorado el resultado queda muy atractivo.


Finalizado el domingo 5 de mayo de 2024.

Feliz día de la Madre, al que tenga.