Tabla de contenido:

The Butter Robot: el robot Arduino con crisis existencial: 6 pasos (con imágenes)
The Butter Robot: el robot Arduino con crisis existencial: 6 pasos (con imágenes)

Video: The Butter Robot: el robot Arduino con crisis existencial: 6 pasos (con imágenes)

Video: The Butter Robot: el robot Arduino con crisis existencial: 6 pasos (con imágenes)
Video: George Hotz | Programming | Fun with MuZero and MCTS on a lovely Sunday | CartPole | DeepMind AI 2024, Mes de julio
Anonim
Image
Image

Este proyecto está basado en la serie animada "Rick and Morty". En uno de los episodios, Rick fabrica un robot cuyo único propósito es traer mantequilla. Como estudiantes de Bruface (Facultad de Ingeniería de Bruselas) tenemos una tarea para el proyecto de mecatrónica que es construir un robot basado en un tema sugerido. La tarea de este proyecto es: hacer un robot que solo sirva mantequilla. Puede tener una crisis existencial. Por supuesto, el robot en el episodio de Rick y Morty es un robot bastante complejo y es necesario hacer algunas simplificaciones:

Dado que su único propósito es traer mantequilla, existen alternativas más sencillas. En lugar de hacer que el robot mire y agarre la mantequilla, antes de que se la lleve a la persona adecuada, el robot puede llevar la mantequilla todo el tiempo. La idea principal es, pues, hacer un carro que transporte la mantequilla hasta donde debe estar.

Además de transportar la mantequilla, el robot necesita saber dónde debe llevar la mantequilla. En el episodio, Rick usa su voz para llamar y ordenar al robot. Esto requiere un costoso sistema de reconocimiento de voz y sería demasiado complicado. En cambio, todos en la mesa reciben un botón: una vez que este botón está activado, el robot puede localizar este botón y moverse hacia él.

En resumen, el robot debe cumplir con los siguientes requisitos:

  • Debe ser seguro: debe evitar obstáculos y evitar que se caiga de la mesa;
  • El robot debe ser pequeño: el espacio en la mesa es limitado y nadie querría un robot que sirva mantequilla pero que tenga la mitad del tamaño de la mesa;
  • El funcionamiento del robot no puede depender del tamaño o forma de la mesa, de esa forma se puede utilizar en diferentes mesas;
  • Necesita llevar la mantequilla a la persona adecuada en la mesa.

Paso 1: Concepto principal

Los requisitos mencionados anteriormente se pueden cumplir utilizando diferentes técnicas. Las decisiones sobre el diseño principal que se tomaron se explican en este paso. Los detalles sobre cómo se implementan estas ideas se pueden encontrar en los siguientes pasos.

Para cumplir con su deber, el robot debe moverse hasta llegar al destino. Teniendo en cuenta la aplicación del robot, es sencillo que usar ruedas en lugar de un movimiento de "caminar" es mejor para hacer que se mueva. Dado que una mesa es una superficie plana y el robot no alcanzará velocidades muy altas, dos ruedas accionadas y una bola giratoria es la solución más simple y fácil de controlar. Las ruedas accionadas deben ser accionadas por dos motores. Los motores deben tener un gran par pero no necesitan alcanzar una alta velocidad, por eso se utilizarán servomotores continuos. Otra ventaja de los servomotores es la simplicidad de uso con un Arduino.

La detección de obstáculos se puede realizar mediante un sensor ultrasónico que mide la distancia, acoplado a un servomotor para elegir la dirección de la medición. Los bordes se pueden detectar utilizando sensores LDR. El uso de sensores LDR requerirá la construcción de un dispositivo que contenga tanto una luz LED como un sensor LDR. Un sensor LDR mide la luz reflejada y puede verse como una especie de sensor de distancia. El mismo principio existe con la luz infrarroja. Existen algunos sensores de proximidad infrarrojos que tienen una salida digital: cerca o no cerca. Esto es exactamente lo que necesita el robot para detectar los bordes. Al combinar 2 sensores de borde colocados como dos antenas de insectos y un sensor ultrasónico accionado, el robot debería poder evitar obstáculos y bordes.

La detección del botón también se puede lograr mediante el uso de sensores IR y leds. La ventaja del IR es que es invisible, lo que hace que su uso no resulte molesto para las personas en la mesa. También se podrían usar láseres, pero entonces la luz sería visible y también peligrosa cuando alguien apunte el láser al ojo de otra persona. Además, el usuario tendría que apuntar a los sensores del robot con solo un rayo láser delgado, lo que sería bastante molesto. Al equipar el robot con dos sensores IR y construir el botón con un LED IR, el robot sabe en qué dirección debe ir siguiendo la intensidad de la luz IR. Cuando no hay botón, el robot puede girar hasta que uno de los leds capte la señal de uno de los botones.

La mantequilla se coloca en un compartimento en la parte superior del robot. Este compartimento puede constar de una caja y una tapa accionada para abrir la caja. Para abrir la tapa y mover el sensor ultrasónico para escanear y detectar los obstáculos necesitamos dos motores y para ello, los servomotores no continuos están más adaptados porque los motores necesitan ir a una determinada posición y mantener esa posición.

Una característica adicional del proyecto fue interactuar con el entorno externo con una voz de robot. Un timbre es simple y está adaptado para este propósito, pero no se puede usar en ningún momento porque el consumo actual es alto.

La principal dificultad del proyecto radica en la codificación, ya que la parte mecánica es bastante sencilla, hay que tener en cuenta muchos casos para evitar que el robot se atasque o haga algo no deseado. ¡Los principales problemas que tenemos que resolver son perder la señal de infrarrojos debido a un obstáculo y parar cuando llega al botón!

Paso 2: Materiales

Partes mecánicas

  • Impresora 3D y cortadora láser

    • El PLA se utilizará para la impresión 3D, pero también puede utilizar ABS
    • Se utilizará una placa de madera contrachapada de abedul de 3 mm para el corte por láser ya que da la posibilidad de realizar modificaciones posteriormente fácilmente, también se puede utilizar plexiglás pero es más difícil modificarlo una vez cortado con láser sin destruirlo
  • Pernos, tuercas, arandelas

    La mayoría de los componentes se mantienen unidos mediante tornillos, arandelas y tuercas de cabeza de botón M3, pero algunos de ellos requieren un juego de tornillos M2 o M4. La longitud de los pernos está en el rango de 8-12 mm

  • Separadores de PCB, 25 mm y 15 mm
  • 2 servomotores con ruedas compatibles
  • Algún alambre de metal grueso de alrededor de 1-2 mm de diámetro

Partes electronicas

  • Microcontrolador

    1 placa arduino UNO

  • Servomotores

    • 2 servomotores grandes: Feetech continuo 6Kg 360 grados
    • 2 micro servomotores: Feetech FS90
  • Sensores

    • 1 sensor ultrasónico
    • 2 sensores de proximidad por infrarrojos
    • 2 fotodiodos IR
  • Pilas

    • 1 soporte de batería de 9V + batería
    • 1 portapilas 4AA + pilas
    • 1 caja de batería de 9V + batería
  • Componentes adicionales

    • Algunos alambres saltadores, alambres y placas de soldadura.
    • Algunas resistencias
    • 1 LED de infrarrojos
    • 3 interruptores
    • 1 timbre
    • 1 botón
    • 1 conector de batería Arduino a 9V

Paso 3: prueba de la electrónica

Prueba de la electrónica
Prueba de la electrónica
Prueba de la electrónica
Prueba de la electrónica

Creación del botón:

El botón está hecho simplemente por un interruptor, un LED infrarrojo y una resistencia de 220 Ohm en serie, alimentada por una batería de 9V. Esto se coloca en un paquete de baterías de 9V para un diseño compacto y limpio.

Creación de los módulos receptores de infrarrojos:

Estos módulos están hechos con placas de soldadura de orificio pasante, que luego se unirán con tornillos al robot. Los circuitos de estos módulos se muestran en los esquemas generales. El principio es medir la intensidad de la luz infrarroja. Para mejorar las mediciones, se pueden usar colimadores (hechos con tubos retráctiles) para enfocar una determinada dirección de interés.

Los diferentes requisitos del proyecto deben cumplirse utilizando dispositivos electrónicos. El número de dispositivos debe limitarse para mantener una complejidad relativamente baja. Este paso contiene los esquemas de cableado y cada código para probar todas las partes por separado:

  • Servomotores continuos;
  • Sensor ultrasónico;
  • Servomotores no continuos;
  • Zumbador;
  • Detección de la dirección del botón IR;
  • Detección de bordes por sensores de proximidad;

Estos códigos pueden ayudar a comprender los componentes al principio, pero también son muy útiles para depurar en etapas posteriores. Si ocurre un cierto problema, el error se puede detectar más fácilmente probando todos los componentes por separado.

Paso 4: Diseño de piezas impresas en 3D y cortadas con láser

Diseño de piezas impresas en 3D y cortadas con láser
Diseño de piezas impresas en 3D y cortadas con láser
Diseño de piezas impresas en 3D y cortadas con láser
Diseño de piezas impresas en 3D y cortadas con láser
Diseño de piezas impresas en 3D y cortadas con láser
Diseño de piezas impresas en 3D y cortadas con láser

Piezas cortadas con láser

El ensamblaje está hecho de tres placas horizontales principales unidas por espaciadores de PCB para obtener un diseño abierto que proporciona un fácil acceso a los componentes electrónicos si es necesario.

Esas placas deben tener los agujeros necesarios cortados para atornillar los espaciadores y otros componentes para el ensamblaje final. Básicamente, las tres placas tienen orificios en la misma ubicación para los espaciadores, y orificios específicos para la electrónica fijados respectivamente en cada placa. Observe que la placa del medio tiene un orificio para pasar cables en el medio.

Las piezas más pequeñas se cortan a las dimensiones del servo grande para fijarlas al conjunto.

Piezas impresas en 3D

Además del corte por láser, algunas piezas deberán imprimirse en 3D:

  • El soporte para el sensor ultrasónico, que lo une a un brazo de micro servomotor
  • El soporte para la rueda giratoria y los dos sensores de borde IR. El diseño particular del tipo de extremos en forma de caja de la pieza para los sensores de infrarrojos actúa como una pantalla para evitar interferencias entre el botón que emite la señal de infrarrojos y los sensores de infrarrojos que necesitan enfocarse solo en lo que está sucediendo en el suelo.
  • El soporte para el micro servo motor que abre la tapa.
  • Y finalmente la propia tapa, hecha de dos piezas para tener un mayor ángulo de funcionamiento al evitar la colisión con el micro servo motor que abre la tapa:

    • El inferior que se fijará a la placa superior.
    • Y la parte superior que está unida a la parte inferior por una bisagra, y accionada por el servo mediante un alambre de metal grueso. Decidimos agregar un poco de personalidad al robot dándole una cabeza.

Una vez que se diseñan todas las piezas y se exportan los archivos en el formato correcto para las máquinas utilizadas, se pueden realizar las piezas. Tenga en cuenta que la impresión 3D lleva mucho tiempo, especialmente con las dimensiones de la pieza superior de la tapa. Es posible que necesite uno o dos días para imprimir todas las piezas. Sin embargo, el corte por láser es solo cuestión de minutos.

Todos los archivos de SOLIDWORKS se pueden encontrar en la carpeta comprimida.

Paso 5: Montaje y cableado

Image
Image
Montaje y cableado
Montaje y cableado
Montaje y cableado
Montaje y cableado
Montaje y cableado
Montaje y cableado

El ensamblaje será una combinación de cableado y atornillado de los componentes, comenzando de abajo hacia arriba.

Placa inferior

La placa inferior se ensambla con el paquete de baterías 4AA, los servomotores, la parte impresa (uniendo la rueda giratoria debajo de la placa), los dos sensores de borde y 6 espaciadores macho-hembra.

Plato medio

A continuación, se puede montar la placa intermedia, comprimiendo los servomotores entre las dos placas. Esta placa se puede fijar colocando otro juego de espaciadores encima. Algunos cables se pueden pasar por el orificio central.

El módulo ultrasónico se puede conectar a un servo no continuo, que se fija en la placa central con el Arduino, la batería de 9V (que alimenta el arduino) y los dos módulos receptores de infrarrojos en la parte frontal del robot. Estos módulos se fabrican con placas de soldadura de orificio pasante y se fijan con tornillos a la placa. Los circuitos de estos módulos se muestran en los esquemas generales.

La placa superior

En esta parte del montaje, los interruptores no son fijos pero el robot ya puede hacer todo menos acciones que requieran la tapa, por lo que nos permite hacer alguna prueba para corregir el umbral, adaptar el código del movimiento y tener un fácil acceso a los puertos del arduino.

Cuando todo esto se logra, la placa superior se puede fijar con espaciadores. Los últimos componentes que son los dos interruptores, el botón, el servo, el zumbador y el sistema de tapa se pueden fijar finalmente a la placa superior para terminar el montaje.

Lo último que hay que probar y corregir es el ángulo del servo para abrir correctamente la tapa.

El umbral de los sensores de borde debe adaptarse con el potenciómetro incluido (utilizando un destornillador plano) para las diferentes superficies de la mesa. Una mesa blanca debe tener un umbral más bajo que una mesa marrón, por ejemplo. Además, la altura de los sensores influirá en el umbral necesario.

Al final de este paso, el ensamblaje está terminado y la última parte restante son los códigos faltantes.

Paso 6: Codificación: uniendo todo

Todo el código necesario para que el robot funcione se encuentra en el archivo comprimido que se puede descargar. El más importante es el código "principal" que incluye la configuración y el ciclo funcional del robot. La mayoría de las otras funciones están escritas en subarchivos (también en la carpeta comprimida). Estos subarchivos deben guardarse en la misma carpeta (que se denomina "principal") que el script principal antes de cargarlo en Arduino

Primero se define la velocidad general del robot junto con la variable "recordar". Este "recordatorio" es un valor que recuerda en qué dirección giraba el robot. Si "recordar = 1", el robot estaba / está girando a la izquierda, si "recordar = 2", el robot estaba / está girando a la derecha.

int velocidad = 9; // Velocidad general del robot

int recordar = 1; // Dirección inicial

En la configuración del robot, se inicializan los diferentes subarchivos del programa. En estos subarchivos están escritas las funciones básicas sobre el control de los motores, sensores,…. Al inicializarlos en la configuración, las funciones que se describen en cada uno de estos archivos se pueden utilizar en el bucle principal. Al activar la función r2D2 (), el robot hará un ruido como el robot R2D2 de la franquicia de películas de Star Wars cuando se pone en marcha. Aquí, la función r2D2 () está deshabilitada para evitar que el zumbador consuma demasiada corriente.

// Configuración @ reset // ----------------

configuración vacía () {initialize_IR_sensors (); initialize_obstacles_and_edges (); initialize_movement (); initialize_lid (); initialize_buzzer (); // r2D2 (); int recordar = 1; // dirección inicial Starter (recordar); }

La función Starter (recordar) se llama primero en la configuración. Esta función hace que el robot se dé la vuelta y busque la señal IR de uno de los botones. Una vez que ha encontrado el botón, el programa saldrá de la función Starter cambiando la variable 'cond' a false. Durante la rotación del robot debe estar atento a su entorno: tiene que detectar bordes y obstáculos. Esto se comprueba cada vez que sigue girando. Una vez que el robot detecta un obstáculo o un borde, se ejecutará el protocolo para evitar estos obstáculos o bordes. Estos protocolos se explicarán más adelante en este paso. La función Starter tiene una variable que es la variable de recordatorio que se discutió antes. Al dar el valor de recordatorio a la función de arranque, el robot sabe en qué dirección debe girar para buscar el botón.

// Starter Loop: Date la vuelta y busca el botón // ------------------------------------ ----------------

void Starter (int recordar) {if (isedgeleft () || isedgeright ()) {// Detectar los bordes edgeDetected (recordar); } else {bool cond = true; while (cond == verdadero) {if (buttonleft () == falso && buttonright () == falso && isButtonDetected () == verdadero) {cond = falso; } else {if (recordar == 1) {// Estábamos girando a la izquierda if (isobstacleleft ()) {stopspeed (); evitar_obstáculo (recordar); } else if (isedgeleft () || isedgeright ()) {// Detecta los bordes edgeDetected (recordar); } else {girar a la izquierda (velocidad); }} else if (recordar == 2) {if (isobstacleright ()) {stopspeed (); evitar_obstáculo (recordar); } else if (isedgeleft () || isedgeright ()) {// Detecta los bordes edgeDetected (recordar); } else {girar a la derecha (velocidad); }}}}}}

Si el robot encuentra el botón, se sale del primer bucle de inicio y comienza el bucle principal y funcional del robot. Este bucle principal es bastante complejo ya que cada vez el robot necesita detectar si hay o no un obstáculo o un borde frente a él, la idea principal es que el robot siga el botón encontrándolo y perdiéndolo cada vez. Al utilizar dos sensores de infrarrojos, podemos distinguir tres situaciones:

  • la diferencia entre la luz IR detectada por el sensor izquierdo y derecho es mayor que un cierto umbral, y hay un botón.
  • la diferencia de luz IR es menor que el umbral y hay un botón frente al robot.
  • la diferencia en la luz IR es menor que el umbral y NO hay ningún botón frente al robot.

El funcionamiento de la rutina de seguimiento es el siguiente: cuando se detecta el botón, el robot se mueve hacia el botón girando en el mismo sentido en el que giraba (utilizando la variable recordar) y al mismo tiempo avanza un poco. Si el robot gira demasiado, el botón se perderá nuevamente y, en este punto, el robot recuerda que debe girar en la otra dirección. Esto también se hace mientras se avanza un poco. Al hacer esto, el robot gira constantemente a la izquierda y a la derecha, pero mientras tanto sigue avanzando hacia el botón. Cada vez que el robot encuentra el botón, sigue girando hasta que lo pierde, en cuyo caso comienza a moverse en la otra dirección. Nótese la diferencia en las funciones que se utilizan en el bucle inicial y el bucle principal: el bucle inicial utiliza "turnleft ()" o "turnright ()", mientras que el bucle principal usa "moveleft ()" y "moveright ()". Las funciones moveleft / right no solo hacen que el robot gire, sino que también lo hacen avanzar al mismo tiempo.

/ * Bucle funcional ---------------------------- Aquí, solo existe la rutina de pista * /

int perdido = 0; // Si se pierde = 0 se encuentra el botón, si se pierde = 1 se pierde el botón void loop () {if (isedgeleft () || isedgeright ()) {

if (! isobstacle ()) {

moveforward (velocidad); retraso (5); } else {evitar_obstáculo (recordar); } else {if (recordar == 1 && perdido == 1) {// Estábamos girando a la izquierda stopspeed (); if (! isobstacleright ()) {moveright (velocidad); // Da la vuelta para encontrar el botón} else {evitar_obstáculo (recordar); } recordar = 2; } más si (recordar == 2 && perdido == 1) {velocidad de parada (); if (! isobstacleleft ()) {moveleft (velocidad); // Giramos a la derecha} else {evitar_obstáculo (recordar); } recordar = 1; } else if (perdido == 0) {if (recordar == 1) {// Estábamos girando a la izquierda if (! isobstacleleft ()) {moveleft (velocidad); // Estábamos girando a la derecha} else {stopspeed (); evitar_obstáculo (recordar); } //} else if (recordar == 2) {if (! isobstacleright ()) {moveright (velocidad); // Da la vuelta para encontrar el botón} else {stopspeed (); evitar_obstáculo (recordar); }}} retraso (10); perdido = 0; }} //}}

Ahora, se da una pequeña explicación de las dos rutinas más complejas:

Evite los bordes

El protocolo para evitar bordes se define en una función llamada "edgeDetection ()" que se escribe en el subarchivo "movimiento". Este protocolo se basa en el hecho de que el robot solo debe encontrar un borde cuando haya llegado a su destino: el botón. Una vez que el robot detecta un borde, lo primero que hace es retroceder un poco para estar a una distancia segura del borde. Una vez hecho esto, el robot espera 2 segundos. Si alguien presiona el botón en la parte delantera del robot en esos dos segundos, el robot sabe que ha llegado a la persona que quiere la mantequilla y abre el compartimiento de la mantequilla y presenta la mantequilla. En este punto, alguien puede quitarle mantequilla al robot. Después de unos segundos, el robot se cansará de esperar y simplemente cerrará la tapa de mantequilla. Una vez que se cierra la tapa, el robot ejecutará el ciclo de inicio para buscar otro botón. Si sucede que el robot encuentra un borde antes de llegar a su destino y no se presiona el botón en la parte frontal del robot, el robot no abrirá la tapa de mantequilla y ejecutará inmediatamente el ciclo de inicio.

Evitar obstáculos

La función prevent_obstacle () también se encuentra en el subarchivo "movimiento". La parte difícil de evitar obstáculos es el hecho de que el robot tiene un punto ciego bastante grande. El sensor ultrasónico se coloca en la parte delantera del robot, lo que significa que puede detectar obstáculos, pero no sabe cuándo lo ha pasado. Para resolver esto, se usa el siguiente principio: Una vez que el robot encuentra un obstáculo, usa la variable reming para girar en la otra dirección. De esta forma el robot evita chocar contra el obstáculo. El robot sigue girando hasta que el sensor ultrasónico ya no detecta el obstáculo. Durante el tiempo que el robot está girando, se incrementa un contador hasta que ya no se detecta el obstáculo. Este contador da una aproximación de la longitud del obstáculo. Moviéndose luego hacia adelante y al mismo tiempo disminuyendo el contador se puede evitar el obstáculo. Una vez que el contador llega a 0, la función Starter se puede usar nuevamente para reubicar el botón. Por supuesto, el robot realiza la función de arranque girando en la dirección en la que recordaba que iba antes de encontrar el obstáculo (nuevamente usando la variable recordar).

Ahora que comprende completamente el código, ¡puede comenzar a usarlo!

Asegúrese de adaptar los umbrales a su entorno (la reflexión IR es más alta en tablas blancas, por ejemplo) y de adaptar los diferentes parámetros a sus necesidades. Además, se debe prestar mucha atención a la alimentación de los diferentes módulos. Es de suma importancia que los servomotores no estén alimentados por el puerto Arduino 5V, ya que toman mucha corriente (esto podría dañar el microcontrolador). Si se utiliza la misma fuente de alimentación para los sensores que la que alimenta los servos, podrían surgir algunos problemas de medición.

Recomendado: