Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

Arduino Spider Robot (cuadrúpedo)

Componentes y suministros

Arduino Nano R3
× 1
Módulo Bluetooth de baja energía (BLE) (genérico)
× 1
Expansión OLED de Onion Corporation
× 1
Cátodo común difuso RGB
× 1
JLCPCB PCB personalizado
× 1

Acerca de este proyecto

¡Hola chicos! Aquí hay un nuevo tutorial para guiarlo paso a paso mientras realiza este tipo de proyectos electrónicos súper asombrosos, que es el "robot rastreador", también conocido como "robot araña" o "robot cuadrúpedo".

Dado que todos notaron la evolución de alta velocidad de la tecnología robótica, decidimos llevarlos a un nivel superior en robótica y fabricación de robots. Empezamos hace un tiempo haciendo algunos proyectos electrónicos básicos y un robot básico como PICTO92, el robot seguidor de línea, para familiarizarte un poco con la electrónica y descubrir que eres capaz de inventar tus propios proyectos.

Pasando a otro nivel, comenzamos con este robot, que es básico en el concepto, pero se volverá un poco complicado si profundiza en su programa. Y dado que estos gadgets son tan caros en la tienda web, proporcionamos esta guía paso a paso para guiarlos a crear su propio Spiderbot .

Este proyecto es muy útil de hacer especialmente después de obtener la PCB personalizada que pedimos a JLCPCB para mejorar la apariencia de nuestro robot y también hay suficientes documentos y códigos en esta guía para permitirle crear su rastreador fácilmente.

Hicimos este proyecto en solo 7 días, solo dos días para terminar la fabricación del hardware y el ensamblaje, luego cinco días para preparar el código y la aplicación de Android. para controlar el robot a través de él. Antes de comenzar, veamos primero

Qué aprenderá:

  • Seleccionar los componentes adecuados según las funcionalidades de su proyecto
  • Hacer el circuito para conectar todos los componentes elegidos
  • Reúna todas las partes del proyecto
  • Escalado de la balanza del robot
  • Usando la aplicación de Android. para conectarse a través de Bluetooth y comenzar a manipular el sistema

Paso 1:¿Qué es un "robot araña"?

Como su nombre lo define, nuestro robot es una representación básica de los movimientos del sorbedor pero no realizará exactamente los mismos movimientos corporales ya que estamos usando solo cuatro patas en lugar de ocho patas.

También llamado Cuadrúpedo robot dado que tiene cuatro patas y hace sus movimientos usando estas piernas, el movimiento de cada pierna está relacionado con las otras piernas para identificar la posición del cuerpo del robot y también para controlar el equilibrio del cuerpo del robot.

Los robots con patas manejan el terreno mejor que sus contrapartes con ruedas y se mueven de formas variadas y animales. Sin embargo, esto hace que los robots con patas sean más complicados y menos accesibles para muchos fabricantes. y también el costo de fabricación y las altas dependencias que un fabricante debería gastar para crear un cuadrúpedo de cuerpo completo, ya que se basa en servomotores o motores paso a paso y ambos son más caros que los motores de CC que podrían usarse en robots con ruedas.

Ventajas

Encontrará cuadrúpedos abundantes en la naturaleza, porque las cuatro patas permiten la estabilidad pasiva o la capacidad de permanecer de pie sin ajustar activamente la posición. Lo mismo ocurre con los robots. Un robot de cuatro patas es más barato y simple que un robot con más patas, pero aún puede lograr estabilidad.

Paso 2:Los servomotores son los actuadores principales

Un servomotor como se define en wikipedia, es un actuador giratorio o actuador lineal que permite un control preciso de la posición angular o lineal, la velocidad y la aceleración. [1] Consiste en un motor adecuado acoplado a un sensor para retroalimentación de posición. También requiere un controlador relativamente sofisticado, a menudo un módulo dedicado diseñado específicamente para su uso con servomotores.

Los servomotores no son una clase específica de motor, aunque el término servomotor se usa a menudo para referirse a un motor adecuado para su uso en un sistema de control de circuito cerrado.

En términos generales, la señal de control es un tren de pulsos de onda cuadrada. Las frecuencias comunes para las señales de control son 44Hz, 50Hz y 400Hz. El ancho de pulso positivo es lo que determina la posición del servo. Un ancho de pulso positivo de alrededor de 0.5ms hará que la bocina del servo se desvíe tanto como pueda hacia la izquierda (generalmente alrededor de 45 a 90 grados dependiendo del servo en cuestión). Un ancho de pulso positivo de alrededor de 2.5ms a 3.0ms hará que el servo se desvíe hacia la derecha tanto como pueda. Un ancho de pulso de alrededor de 1,5 ms hará que el servo mantenga la posición neutra a 0 grados. El alto voltaje de salida es generalmente algo entre 2.5 voltios y 10 voltios (con 3V típico). El voltaje bajo de salida varía de -40mV a 0V.

Paso 3:Fabricación de PCB (producida por JLCPCB)

Acerca de JLCPCB

JLCPCB (Shenzhen JIALICHUANG Electronic Technology Development Co., Ltd.), es la empresa de prototipos de PCB más grande de China y un fabricante de alta tecnología que se especializa en prototipos de PCB rápidos y producción de PCB en lotes pequeños.

Con más de 10 años de experiencia en la fabricación de PCB, JLCPCB tiene más de 200,000 clientes en el país y en el extranjero, con más de 8,000 pedidos en línea de prototipos de PCB y producción de PCB en pequeñas cantidades por día. La capacidad de producción anual es de 200.000 metros cuadrados. para varios PCB de 1 capa, 2 capas o multicapa. JLC es un fabricante profesional de PCB que cuenta con equipos de pozo a gran escala, una gestión estricta y una calidad superior.

Volver a nuestro proyecto

Para producir el PCB, he comparado el precio de muchos productores de PCB y elegí a JLCPCB los mejores proveedores de PCB y los proveedores de PCB más baratos para pedir este circuito. Todo lo que necesito hacer son unos simples clics para cargar el archivo gerber y establecer algunos parámetros como el color y la cantidad del grosor de la PCB, luego pagué solo 2 dólares para obtener mi PCB después de solo cinco días.

Como muestra la imagen del esquema relacionado, he usado un Arduino Nano para controlar todo el sistema y también he diseñado la forma de araña del robot para hacer este proyecto mucho mejor.

Puede obtener el archivo Circuit (PDF) desde aquí. Como puede ver en las imágenes de arriba, la PCB está muy bien fabricada y tengo la misma forma de araña de PCB que hemos diseñado y todas las etiquetas y logotipos están ahí para guiarme durante los pasos de soldadura.

También puede descargar el archivo Gerber para este circuito desde aquí en caso de que desee realizar un pedido para el mismo diseño de circuito.

Paso 4:ingredientes

Ahora revisemos los componentes necesarios que necesitamos para este proyecto, así que como dije, estoy usando un Arduino Nano para hacer funcionar los 12 servomotores del robot de cuatro patas. El proyecto también incluye una pantalla OLED para mostrar las caras de Cozmo y un módulo bluetooth para controlar el robot a través de una aplicación de Android.

Para crear este tipo de proyectos necesitaremos:

  • - La PCB que le pedimos a JLCPCB
  • - 12 servomotores como recuerdas 3 servos para cada pierna:https://amzn.to/2B25XbG
  • - Un Arduino Nano:https://amzn.to/2MmZsVg
  • - Módulo Bluetooth HC-06:https://amzn.to/2B1Z3CY
  • - Una pantalla de visualización OLED:https://amzn.to/2OySnyn
  • - LED RGB de 5 mm:https://amzn.to/2B56hq3
  • - Algunos connetcors de encabezado:https://amzn.to/2nyZg7i
  • - Y el cuerpo del robot indica que necesitas imprimirlos con una impresora 3D

Paso 5:Montaje del robot

Ahora tenemos la PCB lista y todos los componentes soldados muy bien, después de eso necesitamos ensamblar el cuerpo del robot, el procedimiento es tan fácil así que solo sigue los pasos que te muestro, primero tenemos que preparar cada pata de un lado y hacer un led necesitamos dos servomotores para las articulaciones y las piezas impresas Coxa, Femur y Tibia con esta pequeña pieza adjunta.

Acerca de las piezas del cuerpo del robot, puede descargar sus archivos STL desde aquí.

Comenzando con el primer servo, colóquelo en su zócalo y sujételo con sus tornillos, luego gire el eje del servo a 180 ° sin colocar el tornillo para los acoplamientos y pase a la siguiente parte que es el fémur para conectarlo a la tibia. utilizando el primer eje de la articulación servo y la pieza de fijación. El último paso para completar la pierna es colocar la segunda articulación, me refiero al segundo servo para sujetar la tercera parte de la pierna que es la pieza Coxa.

Ahora repita lo mismo para todas las piernas para tener cuatro piernas listas. Después de eso, tome el chasis superior y coloque el resto de los servos en los enchufes y luego conecte cada pata al servo apropiado. Solo hay una última parte impresa que es el chasis inferior del robot en el que colocaremos nuestra placa de circuito

Paso 6:la aplicación de Android

Hablando de Android, te permite

conéctese a su robot a través de Bluetooth y realice movimientos hacia adelante y hacia atrás y giros de izquierda a derecha, también le permite controlar el color de la luz del robot en tiempo real eligiendo el color deseado de esta rueda de colores.

Puede descargar la aplicación de Android de forma gratuita desde este enlace:aquí

Paso 7:el código Arduino y la validación de la prueba

Ahora tenemos el robot casi listo para funcionar, pero primero debemos configurar los ángulos de las articulaciones, así que cargue el código de configuración que le permite colocar cada servo en la posición correcta colocando los servos en 90 grados, no olvide conectar el 7V Batería de CC para hacer funcionar el robot.

A continuación, debemos cargar el programa principal para controlar el robot usando la aplicación de Android. Ambos programas los puedes descargar desde estos enlaces:

- Escalar el código del servo:enlace de descarga - Programa principal del robot Spider:enlace de descarga

Después de cargar el código, conecté la pantalla OLED para mostrar las sonrisas de robot Cozmo que hice en el código principal.

Como pueden ver, muchachos en las imágenes de arriba, el robot sigue todas las instrucciones enviadas desde mi teléfono inteligente y aún algunas otras mejoras para realizar para hacerlo mucho mejor.

Código

  • Código principal de Spider Robot
Código principal del robot araña Arduino
 / ******************************************** *********************************************** *********************************************** ********************** * - Autor:BELKHIR Mohamed * * - Profesión:(Ingeniero eléctrico) Propietario de MEGA DAS * * - Objeto principal:Aplicación industrial * * - Copyright (c) titular:Todos los derechos reservados * * - Licencia:Licencia BSD de 2 cláusulas * * - Fecha:20/04/2017 * * ****************** *********************************************** *********************************************** *********************************************** / /*********************************** NOTA ************* ************************* /// Se permite la redistribución y el uso en formas fuente y binarias, con o sin // modificación, siempre que lo siguiente se cumplen las condiciones:// * Las redistribuciones del código fuente deben conservar el aviso de derechos de autor anterior, esta // lista de condiciones y la siguiente exención de responsabilidad .// * Las redistribuciones en forma binaria deben reproducir ce el aviso de copyright anterior, // esta lista de condiciones y el siguiente descargo de responsabilidad en la documentación // y / u otros materiales proporcionados con la distribución .// ESTE SOFTWARE ES PROPORCIONADO POR LOS TITULARES DE LOS DERECHOS DE AUTOR Y COLABORADORES "TAL CUAL" // Y CUALQUIER GARANTÍA EXPRESA O IMPLÍCITA, INCLUYENDO, PERO NO LIMITADO A, LAS // GARANTÍAS IMPLÍCITAS DE COMERCIABILIDAD Y APTITUD PARA UN PROPÓSITO EN PARTICULAR SE RECHAZAN / * * / # include  // para definir y controlar los servos # incluye  // para configurar un temporizador para administrar todos los servos # incluir  #include  #include  // Pantalla OLED dirección TWI # definir OLED_ADDR 0x3CAdafruit_SSD1306 display (-1); / * Servos ----------------------------------------------- --------------------- * /// definir 12 servos para 4 patas Servo servo [4] [3]; // definir los puertos de los servosconst int servo_pin [4] [3] ={{11, 12, 13}, {2, 4, 7}, {14, 15, 16}, {8, 9, 10}}; / * Tamaño del robot ------ -------------------------------------------------- - * / const float l ength_a =50; const float length_b =77.1; const float length_c =27.5; const float length_side =71; const float z_absolute =-28; / * Constantes de movimiento ---------------- ------------------------------------ * / const float z_default =-50, z_up =-30, z_boot =z_absolute; const float x_default =62, x_offset =0; const float y_start =0, y_step =40; const float y_default =x_default; / * variables de movimiento --------------- ------------------------------------- * / volatile float site_now [4] [3]; // coordenadas en tiempo real del final de cada flotante legvolátil site_expect [4] [3]; // coordenadas esperadas del final de cada legfloat temp_speed [4] [3]; // la velocidad de cada eje, necesita ser recalculada antes de cada movimiento flotador move_speed; // movimiento speedfloat speed_multiple =1; // velocidad de movimiento multipleconst float spot_turn_speed =4; const float leg_move_speed =8; const float body_move_speed =3; const float stand_seat_speed =1; volatile int rest_counter; //+1/0.02s, para descanso automático // parámetro de funcionesconst float KEEP =255; // define PI para cálculoconst float pi =3.1415926; / * Constantes para turno ------------- ------------------------------------------- * /// temp lengthconst float temp_a =sqrt (pow (2 * x_default + length_side, 2) + pow (y_step, 2)); const float temp_b =2 * (y_start + y_step) + length_side; const float temp_c =sqrt (pow (2 * x_default + length_side , 2) + pow (2 * y_start + y_step + length_side, 2)); const float temp_alpha =acos ((pow (temp_a, 2) + pow (temp_b, 2) - pow (temp_c, 2)) / 2 / temp_a / temp_b); // sitio para turnconst float turn_x1 =(temp_a - length_side) / 2; const float turn_y1 =y_start + y_step / 2; const float turn_x0 =turn_x1 - temp_b * cos (temp_alpha); const float turn_y0 =temp_b * sin (temp_alpha) - turn_y1 - length_side; const int lightR =3; const int lightG =5; const int lightB =6; int LedR =0; int LedG =0; int LedB =0; char SerialData; // Use esta variable para leer cada caractere recibido a través del puerto serialString data =""; void setup () {Serial.begin (9600); display.begin (SSD1306_SWITCHCAPVCC, OLED_ADDR); display.clearDisplay (); display.display (); retraso (10000); set_site (0, x_default - x_offset, y_start + y_step, z_boot); set_site (1, x_default - x_offset, y_start + y_step, z_boot); set_site (2, x_default + x_offset, y_start, z_boot); set_site (3, x_default + x_offset, y_start, z_boot); for (int i =0; i <4; i ++) {for (int j =0; j <3; j ++) {site_now [i] [j] =site_expect [i] [j]; }} // iniciar el servo servicio FlexiTimer2 ::set (20, servo_service); FlexiTimer2 ::inicio (); // inicializar servos servo_attach (); pararse (); // retrasar (3000); // sentarse (); // retrasar (3000); // pararse (); // retrasar (3000); feliz(); retraso (aleatorio (500, 1000)); cierra (); retraso (150); enfado (); retraso (aleatorio (1000, 3000)); cierra (); retraso (150); entorna (); retraso (aleatorio (1000, 3000)); cierra (); retraso (150); enfado1 (); retraso (aleatorio (1000, 3000)); cierra (); retraso (150); triste (); retraso (aleatorio (1000, 3000)); cierra (); retraso (150); abre (); retraso (aleatorio (500, 3000)); cierra (); retraso (150); feliz(); delay (random (500, 1000));} void loop () {while (Serial.available ()) // Mientras los datos seriales están disponibles, los almacenamos {delay (10); SerialData =Serial.read (); if (SerialData =='b') LedR =Serial.parseInt (); else if (SerialData =='g') LedG =Serial.parseInt (); else if (SerialData =='r') LedB =Serial.parseInt (); más datos + =SerialData; } if (data =="f") // Si los datos almacenados son movimiento hacia adelante {cierra (); retraso (150); feliz(); step_forward (1); } if (data =="p") // Si los datos almacenados son retroceso {cierra (); retraso (150); triste (); step_back (1); } if (data =="l") // Si los datos almacenados son girar a la izquierda el carro {cierra (); retraso (150); enfado1 (); giro_izquierda (1); } if (data =="m") // Si los datos almacenados son girar a la derecha el carro {cierra (); retraso (150); enfado (); girar_derecha (5); } datos =""; analogWrite (lightR, LedR); analogWrite (lightG, LedG); analogWrite (lightB, LedB);} void servo_attach (void) {for (int i =0; i <4; i ++) {for (int j =0; j <3; j ++) {servo [i] [j]. adjuntar (servo_pin [i] [j]); retraso (100); }}} void servo_detach (void) {for (int i =0; i <4; i ++) {for (int j =0; j <3; j ++) {servo [i] [j] .detach (); retraso (100); }}} void sit (void) {move_speed =stand_seat_speed; for (int leg =0; leg <4; leg ++) {set_site (leg, MANTENER, MANTENER, z_boot); } wait_all_reach ();} / * - stand - función de bloqueo ------------------------------------- -------------------------------------- * / soporte vacío (vacío) {move_speed =stand_seat_speed; for (int leg =0; leg <4; leg ++) {set_site (leg, MANTENER, MANTENER, z_default); } wait_all_reach ();} / * - giro puntual a la izquierda - función de bloqueo - paso del parámetro pasos que quería girar --------------------------- ------------------------------------------------ * / void turn_left (paso int sin firmar) {move_speed =spot_turn_speed; while (paso--> 0) {if (site_now [3] [1] ==y_start) {// tramo 3 &1 mover set_site (3, x_default + x_offset, y_start, z_up); esperar_todos_reach (); set_site (0, turn_x1 - x_offset, turn_y1, z_default); set_site (1, turn_x0 - x_offset, turn_y0, z_default); set_site (2, turn_x1 + x_offset, turn_y1, z_default); set_site (3, turn_x0 + x_offset, turn_y0, z_up); esperar_todos_reach (); set_site (3, turn_x0 + x_offset, turn_y0, z_default); esperar_todos_reach (); set_site (0, turn_x1 + x_offset, turn_y1, z_default); set_site (1, turn_x0 + x_offset, turn_y0, z_default); set_site (2, turn_x1 - x_offset, turn_y1, z_default); set_site (3, turn_x0 - x_offset, turn_y0, z_default); esperar_todos_reach (); set_site (1, turn_x0 + x_offset, turn_y0, z_up); esperar_todos_reach (); set_site (0, x_default + x_offset, y_start, z_default); set_site (1, x_default + x_offset, y_start, z_up); set_site (2, x_default - x_offset, y_start + y_step, z_default); set_site (3, x_default - x_offset, y_start + y_step, z_default); esperar_todos_reach (); set_site (1, x_default + x_offset, y_start, z_default); esperar_todos_reach (); } else {// tramo 0 y 2 mover set_site (0, x_default + x_offset, y_start, z_up); esperar_todos_reach (); set_site (0, turn_x0 + x_offset, turn_y0, z_up); set_site (1, turn_x1 + x_offset, turn_y1, z_default); set_site (2, turn_x0 - x_offset, turn_y0, z_default); set_site (3, turn_x1 - x_offset, turn_y1, z_default); esperar_todos_reach (); set_site (0, turn_x0 + x_offset, turn_y0, z_default); esperar_todos_reach (); set_site (0, turn_x0 - x_offset, turn_y0, z_default); set_site (1, turn_x1 - x_offset, turn_y1, z_default); set_site (2, turn_x0 + x_offset, turn_y0, z_default); set_site (3, turn_x1 + x_offset, turn_y1, z_default); esperar_todos_reach (); set_site (2, turn_x0 + x_offset, turn_y0, z_up); esperar_todos_reach (); set_site (0, x_default - x_offset, y_start + y_step, z_default); set_site (1, x_default - x_offset, y_start + y_step, z_default); set_site (2, x_default + x_offset, y_start, z_up); set_site (3, x_default + x_offset, y_start, z_default); esperar_todos_reach (); set_site (2, x_default + x_offset, y_start, z_default); esperar_todos_reach (); }}} / * - giro puntual a la derecha - función de bloqueo - paso de parámetro pasos que quería girar ------------------------------ --------------------------------------------- * / void turn_right ( paso int sin firmar) {move_speed =spot_turn_speed; while (paso--> 0) {if (site_now [2] [1] ==y_start) {// tramo 2 &0 mover set_site (2, x_default + x_offset, y_start, z_up); esperar_todos_reach (); set_site (0, turn_x0 - x_offset, turn_y0, z_default); set_site (1, turn_x1 - x_offset, turn_y1, z_default); set_site (2, turn_x0 + x_offset, turn_y0, z_up); set_site (3, turn_x1 + x_offset, turn_y1, z_default); esperar_todos_reach (); set_site (2, turn_x0 + x_offset, turn_y0, z_default); esperar_todos_reach (); set_site (0, turn_x0 + x_offset, turn_y0, z_default); set_site (1, turn_x1 + x_offset, turn_y1, z_default); set_site (2, turn_x0 - x_offset, turn_y0, z_default); set_site (3, turn_x1 - x_offset, turn_y1, z_default); esperar_todos_reach (); set_site (0, turn_x0 + x_offset, turn_y0, z_up); esperar_todos_reach (); set_site (0, x_default + x_offset, y_start, z_up); set_site (1, x_default + x_offset, y_start, z_default); set_site (2, x_default - x_offset, y_start + y_step, z_default); set_site (3, x_default - x_offset, y_start + y_step, z_default); esperar_todos_reach (); set_site (0, x_default + x_offset, y_start, z_default); esperar_todos_reach (); } else {// tramo 1 y 3 mover set_site (1, x_default + x_offset, y_start, z_up); esperar_todos_reach (); set_site (0, turn_x1 + x_offset, turn_y1, z_default); set_site (1, turn_x0 + x_offset, turn_y0, z_up); set_site (2, turn_x1 - x_offset, turn_y1, z_default); set_site (3, turn_x0 - x_offset, turn_y0, z_default); esperar_todos_reach (); set_site (1, turn_x0 + x_offset, turn_y0, z_default); esperar_todos_reach (); set_site (0, turn_x1 - x_offset, turn_y1, z_default); set_site (1, turn_x0 - x_offset, turn_y0, z_default); set_site (2, turn_x1 + x_offset, turn_y1, z_default); set_site (3, turn_x0 + x_offset, turn_y0, z_default); esperar_todos_reach (); set_site (3, turn_x0 + x_offset, turn_y0, z_up); esperar_todos_reach (); set_site (0, x_default - x_offset, y_start + y_step, z_default); set_site (1, x_default - x_offset, y_start + y_step, z_default); set_site (2, x_default + x_offset, y_start, z_default); set_site (3, x_default + x_offset, y_start, z_up); esperar_todos_reach (); set_site (3, x_default + x_offset, y_start, z_default); esperar_todos_reach (); }}} / * - avanzar - función de bloqueo - paso de parámetro pasos a seguir -------------------------------- ------------------------------------------- * / void step_forward (unsigned int paso) {move_speed =leg_move_speed; while (paso--> 0) {if (site_now [2] [1] ==y_start) {// tramo 2 &1 mover set_site (2, x_default + x_offset, y_start, z_up); esperar_todos_reach (); set_site (2, x_default + x_offset, y_start + 2 * y_step, z_up); esperar_todos_reach (); set_site (2, x_default + x_offset, y_start + 2 * y_step, z_default); esperar_todos_reach (); move_speed =body_move_speed; set_site (0, x_default + x_offset, y_start, z_default); set_site (1, x_default + x_offset, y_start + 2 * y_step, z_default); set_site (2, x_default - x_offset, y_start + y_step, z_default); set_site (3, x_default - x_offset, y_start + y_step, z_default); esperar_todos_reach (); move_speed =leg_move_speed; set_site (1, x_default + x_offset, y_start + 2 * y_step, z_up); esperar_todos_reach (); set_site (1, x_default + x_offset, y_start, z_up); esperar_todos_reach (); set_site (1, x_default + x_offset, y_start, z_default); esperar_todos_reach (); } else {// tramo 0 y 3 mover set_site (0, x_default + x_offset, y_start, z_up); esperar_todos_reach (); set_site (0, x_default + x_offset, y_start + 2 * y_step, z_up); esperar_todos_reach (); set_site (0, x_default + x_offset, y_start + 2 * y_step, z_default); esperar_todos_reach (); move_speed =body_move_speed; set_site (0, x_default - x_offset, y_start + y_step, z_default); set_site (1, x_default - x_offset, y_start + y_step, z_default); set_site (2, x_default + x_offset, y_start, z_default); set_site (3, x_default + x_offset, y_start + 2 * y_step, z_default); esperar_todos_reach (); move_speed =leg_move_speed; set_site (3, x_default + x_offset, y_start + 2 * y_step, z_up); esperar_todos_reach (); set_site (3, x_default + x_offset, y_start, z_up); esperar_todos_reach (); set_site (3, x_default + x_offset, y_start, z_default); esperar_todos_reach (); }}} / * - retroceder - función de bloqueo - paso de parámetro pasos a seguir -------------------------------- ------------------------------------------- * / void step_back (unsigned int paso) {move_speed =leg_move_speed; while (paso--> 0) {if (site_now [3] [1] ==y_start) {// tramo 3 &0 mover set_site (3, x_default + x_offset, y_start, z_up); esperar_todos_reach (); set_site (3, x_default + x_offset, y_start + 2 * y_step, z_up); esperar_todos_reach (); set_site (3, x_default + x_offset, y_start + 2 * y_step, z_default); esperar_todos_reach (); move_speed =body_move_speed; set_site (0, x_default + x_offset, y_start + 2 * y_step, z_default); set_site (1, x_default + x_offset, y_start, z_default); set_site (2, x_default - x_offset, y_start + y_step, z_default); set_site (3, x_default - x_offset, y_start + y_step, z_default); esperar_todos_reach (); move_speed =leg_move_speed; set_site (0, x_default + x_offset, y_start + 2 * y_step, z_up); esperar_todos_reach (); set_site (0, x_default + x_offset, y_start, z_up); esperar_todos_reach (); set_site (0, x_default + x_offset, y_start, z_default); esperar_todos_reach (); } else {// tramo 1 y 2 mover set_site (1, x_default + x_offset, y_start, z_up); esperar_todos_reach (); set_site (1, x_default + x_offset, y_start + 2 * y_step, z_up); esperar_todos_reach (); set_site (1, x_default + x_offset, y_start + 2 * y_step, z_default); esperar_todos_reach (); move_speed =body_move_speed; set_site (0, x_default - x_offset, y_start + y_step, z_default); set_site (1, x_default - x_offset, y_start + y_step, z_default); set_site (2, x_default + x_offset, y_start + 2 * y_step, z_default); set_site (3, x_default + x_offset, y_start, z_default); esperar_todos_reach (); move_speed =leg_move_speed; set_site (2, x_default + x_offset, y_start + 2 * y_step, z_up); esperar_todos_reach (); set_site (2, x_default + x_offset, y_start, z_up); esperar_todos_reach (); set_site (2, x_default + x_offset, y_start, z_default); esperar_todos_reach (); }}} // agregar por RegisHsuvoid body_left (int i) {set_site (0, site_now [0] [0] + i, KEEP, KEEP); set_site (1, site_now [1] [0] + i, MANTENER, MANTENER); set_site (2, site_now [2] [0] - i, MANTENER, MANTENER); set_site (3, site_now [3] [0] - i, MANTENER, MANTENER); wait_all_reach ();} void body_right (int i) {set_site (0, site_now [0] [0] - i, MANTENER, MANTENER); set_site (1, site_now [1] [0] - i, MANTENER, MANTENER); set_site (2, site_now [2] [0] + i, MANTENER, MANTENER); set_site (3, site_now [3] [0] + i, MANTENER, MANTENER); esperar_todos_reach ();} void hand_wave (int i) {flotar x_tmp; float y_tmp; float z_tmp; move_speed =1; if (site_now [3] [1] ==y_start) {body_right (15); x_tmp =sitio_ahora [2] [0]; y_tmp =site_now [2] [1]; z_tmp =site_now [2] [2]; move_speed =body_move_speed; para (int j =0; j  i / 4) // move_speed =body_dance_speed * 2; // if (j> i / 2) // move_speed =body_dance_speed * 3; / / set_site (0, KEEP, y_default - 20, KEEP); // set_site (1, KEEP, y_default + 20, KEEP); // set_site (2, KEEP, y_default - 20, KEEP); // set_site (3, MANTENER, y_default + 20, MANTENER); // wait_all_reach (); // set_site (0, MANTENER, y_default + 2 0, MANTENER); // set_site (1, KEEP, y_default - 20, KEEP); // set_site (2, KEEP, y_default + 20, KEEP); // set_site (3, KEEP, y_default - 20, KEEP); // wait_all_reach (); //} // move_speed =body_dance_speed; // head_down (30); //} / * - servicio de microservos / función de interrupción del temporizador / 50Hz - cuando se espera el sitio establecido, esta función mueve el punto final a él en línea recta:temp_speed [4] [3] debe establecerse antes de establecer el sitio esperado, asegúrese de que el punto final se mueva en línea recta y decida la velocidad de movimiento. -------------------------------------------------- ------------------------- * / void servo_service (void) {sei (); flotador estático alfa, beta, gamma; for (int i =0; i <4; i ++) {for (int j =0; j <3; j ++) {if (abs (site_now [i] [j] - site_expect [i] [j])> =abs (temp_speed [i] [j])) site_now [i] [j] + =temp_speed [i] [j]; else site_now [i] [j] =site_expect [i] [j]; } cartesiano_a_polar (alfa, beta, gamma, sitio_ahora [i] [0], sitio_ahora [i] [1], sitio_ahora [i] [2]); polar_to_servo (i, alfa, beta, gamma); } rest_counter ++;} / * - establece uno de los puntos finales 'sitio esperado - esta función establecerá temp_speed [4] [3] al mismo tiempo - función sin bloqueo --------------- -------------------------------------------------- ---------- * / void set_site (int leg, float x, float y, float z) {float length_x =0, length_y =0, length_z =0; if (x! =MANTENER) length_x =x - site_now [leg] [0]; if (y! =MANTENER) length_y =y - site_now [tramo] [1]; if (z! =MANTENER) length_z =z - site_now [tramo] [2]; longitud flotante =sqrt (pow (longitud_x, 2) + pow (longitud_y, 2) + pow (longitud_z, 2)); temp_speed [leg] [0] =length_x / length * move_speed * speed_multiple; temp_speed [leg] [1] =length_y / length * move_speed * speed_multiple; temp_speed [leg] [2] =length_z / length * move_speed * speed_multiple; if (x! =MANTENER) site_expect [tramo] [0] =x; if (y! =MANTENER) site_expect [tramo] [1] =y; if (z! =KEEP) site_expect [leg] [2] =z;} / * - espera que uno de los puntos finales se mueva para esperar el sitio - función de bloqueo ----------------- -------------------------------------------------- -------- * / void wait_reach (int leg) {while (1) if (site_now [leg] [0] ==site_expect [leg] [0]) if (site_now [leg] [1] ==site_expect [leg] [1]) if (site_now [leg] [2] ==site_expect [leg] [2]) break;} / * - esperar que todos los puntos finales se muevan para esperar la función de bloqueo del sitio ---- -------------------------------------------------- --------------------- * / void wait_all_reach (void) {for (int i =0; i <4; i ++) wait_reach (i);} / * - sitio trans de cartesiano a polar - modelo matemático 2/2 ------------------------------------- -------------------------------------- * / void cartesian_to_polar (flotante volátil y alfa, flotante volátil y beta , flotación volátil y gamma, flotación volátil x, flotación volátil y, flotación volátil z) {// calcular wz grado flotación v, w; w =(x> =0? 1:-1) * (sqrt (pow (x, 2) + pow (y, 2))); v =w - longitud_c; alpha =atan2 (z, v) + acos ((pow (longitud_a, 2) - pow (longitud_b, 2) + pow (v, 2) + pow (z, 2)) / 2 / longitud_a / sqrt (pow (v , 2) + pow (z, 2))); beta =acos ((pow (longitud_a, 2) + pow (longitud_b, 2) - pow (v, 2) - pow (z, 2)) / 2 / longitud_a / longitud_b); // calcular x-y-z grados gamma =(w> =0)? atan2 (y, x):atan2 (-y, -x); // grado trans pi-> 180 alfa =alfa / pi * 180; beta =beta / pi * 180; gamma =gamma / pi * 180;} / * - sitio trans de polar a microservos - mapa del modelo matemático al hecho - los errores guardados en eeprom se agregarán ----------------- -------------------------------------------------- -------- * / void polar_to_servo (int leg, float alpha, float beta, float gamma) {if (leg ==0) {alpha =90 - alpha; beta =beta; gamma + =90; } más si (pierna ==1) {alfa + =90; beta =180 - beta; gamma =90 - gamma; } más si (pierna ==2) {alfa + =90; beta =180 - beta; gamma =90 - gamma; } más si (pierna ==3) {alfa =90 - alfa; beta =beta; gamma + =90; } servo [leg] [0] .write (alfa); servo [pierna] [1] .escribir (beta); servo [pierna] [2] .write (gamma);} void abre () {display.clearDisplay (); display.fillCircle (50, 15, 12, BLANCO); // ojo izquierdo grande display.fillCircle (82, 20, 7, BLANCO); // ojo derecho pequeño display.display ();} void cierra () {display.clearDisplay (); display.drawFastHLine (40, 15, 20, BLANCO); display.drawFastHLine (72, 20, 15, BLANCO); display.display ();} void entorna () {display.clearDisplay (); display.fillCircle (42, 10, 20, BLANCO); // ojo izquierdo grande display.fillCircle (82, 10, 15, BLANCO); // ojo derecho pequeño display.fillRect (0, 0, 128, 15, NEGRO); // ceja superior display.fillRect (0, 40, 128, 15, NEGRO); // ceja inferior display.display ();} void triste () {display.clearDisplay (); display.fillCircle (42, 10, 17, BLANCO); // ojo izquierdo grande display.fillCircle (82, 10, 17, BLANCO); // ojo derecho pequeño display.fillTriangle (0, 0, 0, 35, 78, 0, NEGRO); // ceja superior display.fillTriangle (50, 0, 128, 35, 128, 0, NEGRO); // ceja superior display.display ();} void happy () {display.clearDisplay (); display.fillCircle (42, 25, 15, BLANCO); // ojo izquierdo grande display.fillCircle (82, 25, 15, BLANCO); // ojo derecho pequeño display.fillCircle (42, 33, 20, NEGRO); // ojo izquierdo grande display.fillCircle (82, 33, 20, NEGRO); // ojo derecho pequeño display.display ();} void enfado () {display.clearDisplay (); display.fillCircle (42, 10, 18, BLANCO); // ojo izquierdo grande display.fillCircle (82, 10, 12, BLANCO); // ojo derecho pequeño display.fillTriangle (0, 0, 54, 26, 118, 0, NEGRO); // ceja superior display.display ();} void enfado1 () {display.clearDisplay (); display.fillCircle (42, 10, 18, BLANCO); // ojo izquierdo grande display.fillCircle (82, 10, 12, BLANCO); // ojo derecho pequeño display.fillTriangle (0, 0, 65, 15, 120, 0, NEGRO); // ceja superior display.display ();} 

Piezas y carcasas personalizadas

Esquemas


Proceso de manufactura

  1. Hacer que los asistentes personales robóticos sean omnipresentes
  2. Robot Raspberry Pi controlado por Bluetooth
  3. Robot autónomo cuadrúpedo JQR
  4. Obstáculos que evitan el robot con servomotor
  5. Robot seguidor de línea
  6. Robot controlado por voz
  7. Arduino Cuadrúpedo
  8. Robot de piano controlado por Arduino:PiBot
  9. Littlearm 2C:Construya un brazo robótico Arduino impreso en 3D
  10. Robot asistente doméstico autónomo
  11. Robot para navegación interior supercogedora