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

WALTER - El insecto Arduino Photovore

Componentes y suministros

SparkFun Arduino Pro Mini 328 - 5V / 16MHz
× 1
Sensor ultrasónico - HC-SR04 (genérico)
× 3
Fotodiodo
× 4
Resistencia 100k ohm
× 4
Micro Servo con engranajes metálicos MG90S
× 5
Paquete de energía portátil para teléfonos inteligentes (2 canales:1A y 2.1 A)
× 1

Herramientas y máquinas necesarias

Soldador (genérico)
Pistola de pegamento caliente (genérica)

Aplicaciones y servicios en línea

Arduino IDE

Acerca de este proyecto

[Disculpe mi inglés]

Me gusta mucho la configuración popular de 2 servos arduino insectos en Youtube. Cuando lo miré, siempre recuerdo lo que hicieron los chicos robóticos de BEAM mucho antes de que esa configuración se convirtiera en la favorita. A estas personas que son fanáticos de los robots analógicos les fue mejor en la marcha debido a un mejor ángulo entre los dos motores ( microcore / bicore walker , etc.).

Sin embargo, en mi opinión, ninguno de los mencionados anteriormente parece más vivo que VBug1.5 (también conocido como Walkman) creado por el fundador de la robótica de haz, Mark Tilden. Utiliza 5 motores, por lo que tiene más maniobrabilidad.

Hacer un robot BEAM simple no es difícil, pero construir algo tan complicado como VBug1.5 podría resultar angustioso para un novato electrónico como yo. Entonces, cuando decidí hacer algo como los errores de Tilden, tuve que conformarme con la plataforma arduino, la opción más fácil para los no ingenieros (o en mi caso, vergonzosamente, un aspirante a ingeniero).

Como resultado, hice Walter , un robot arduino de 4 patas con 5 servos. Quizás se pregunte, si quería hacer un robot de insectos que pareciera vivo, entonces ¿por qué no opté por 8 o 12 servos? Bueno, estaba pensando en algo más simple que pueda hacer para obtener la mayor maniobrabilidad posible. Me refiero a usar mucho pegamento en lugar de hacer marcos.

COMPORTAMIENTOS

Como muchos otros robots arduino, Walter puede evitar obstáculos utilizando sensores ultrasónicos HC-SR04. Para agregar carácter como un error, Walter también un photovore, significa que se siente atraído por la luz. Los fotodiodos se utilizan para detectar la luz. Hay valores aleatorios generados en el boceto de arduino para que Walter decida cuándo quiere detenerse para descansar, y también para cambiar aleatoriamente su velocidad de marcha (3 velocidades).

Cuando comencé, tenía la intención de tener botones táctiles debajo de cada uno de los pies de Walter para que tuviera sensores de superficie. Pero la batería (un banco de energía portátil para teléfonos inteligentes) cuesta mucho peso a los servos. Sé que los botones táctiles no pesan casi nada de lo que preocuparse para agregar peso, pero, irónicamente, el peso del robot no es suficiente para poder presionar los botones boca abajo.

Planeé hacer la versión 2 de Walter con servos más grandes y luego incluí estos botones como sensores de superficie.

más detalles

Código

  • WALTER.ino
WALTER.ino Arduino
 / * WALTER - THE 4 LEGGED PHOTOVORE Este boceto de Arduino es mi intento de construir un robot de 5 servo cuadrúpedos (4 patas) llamado "WALTER". Para usar este boceto, es posible que deba cambiar algunos valores para su conveniencia o para ajustar a su propia configuración de hardware. Busque (Ctrl + F) estas marcas para buscar fácilmente qué valores pueden necesitar ser cambiados:- ****:Estas marcas significan que son la posición central de los servos y deben calibrarse (su robot potitioning de piernas cuando está inactivo). - ***:Estas marcas significan asignación de pines arduino (sensores y conexión de servos a arduino). Refiérase a esto cuando construya el robot. - **:Estas marcas significan que los valores opcionalmente se pueden cambiar según su gusto (ancho de paso de las piernas, cuánto girar al detectar luz / obstáculo, etc.). Déjelo como está si no sabe lo que estaba haciendo. Puede usar este boceto bajo su propio riesgo ... y se proporciona tal cual y ... uh ... escribir en el código fuente publicado ?? El punto es que no quiero ser responsable si algo malo sucedió cuando estaba usando estos códigos. ¡Diviértete! Yohanes Martedi - 2015 * / # include  // ** ** Calibre el ángulo central de los servos (en microsegundos porque usaremos el comando "xx.writeMicroseconds ();"). Comience con 1500.const int ANGLE_mid_Shaft =1520; const int ANGLE_mid_FLeft =1550; const int ANGLE_mid_FRight =1570; const int ANGLE_mid_BLeft =1450; const int ANGLE_mid_BRight =1450; const int ANGLE_sweep =250; // ** Establezca este valor (en microsegundos) para determinar el ancho de barrido de los servos (ancho de paso de las piernas). Un valor más grande significa un ángulo de barrido más amplio.const int ANGLE_res =10; // ** Establezca la resolución de movimiento del servo (en microsegundos) al menos en el ancho de banda muerta mínimo predeterminado del servo (resolución más alta) o más (menos resolución). Ejemplo:el ancho de banda muerta del servo SG90 es de 10 microsegundos.int sweepSPEED; // variable para determinar qué tan rápido barren los servos.int sweepSPEED_Rand [3] ={4, 6, 8}; // ** La velocidad del servo (velocidad de marcha) cambiará aleatoriamente en 3 modos. Configure la velocidad (en milisegundos) para cada modo. Un valor más pequeño significa más rápido.const int ANGLE_turnMAX =ANGLE_sweep * 1.5; // ** Establezca este valor para determinar cuánto máximo girará el bot hacia la luz. Un valor más grande significa un giro más grande.const int ANGLE_turnNARROW =ANGLE_sweep * 0.25; // ** Establezca este valor para determinar cuánto máximo girará el bot evitando objetos a sus lados en un espacio estrecho. Un valor más grande significa más turn.const int SONAR_sum =3; // Cantidad de sonares usados.const int PHOTO_sum =4; // Cantidad de fotodiodos utilizados.int PIN_trig [SONAR_sum] ={13, 11, 8}; // *** Establecer pines arduino conectados a los pines de disparo de los sensores ultrasónicos; {frontal, izquierda, derecha} .int PIN_ec [SONAR_sum] ={12, 10, 7}; // *** Establecer los pines arduino conectados a los pines de eco de los sensores ultrasónicos; {frontal, izquierda, derecha} .int PIN_PHOTO [PHOTO_sum] ={2, 3, 1, 0}; // *** Establecer pines de entrada analógica arduino conectados a fotodiodos; {delantero izquierdo, delantero derecho, trasero izquierdo, trasero derecho} .const int distRotate =25; // ** Configure la distancia mínima (en cm) entre el robot y el obstáculo antes de que el robot lo evite girando.const int distRetreat =10; // ** Configure la distancia mínima (en cm) entre el robot y el obstáculo antes de que el robot lo evite retirándose.const int distTurn =20; // ** Configure la distancia mínima (en cm) entre el robot y el obstáculo antes de que el robot lo evite girando.const int counter_gait_max =8; // ** Configure cuántos pasos tomará el robot para evitar un obstáculo (al girar o retroceder) .// ** Configure cuánto tiempo el bot descansa y corre (en milisegundos) .const int RUN_time =25000; const int REST_time =3000; // ID para sonares:int SONAR_id; const int FRONT =0; const int LEFT =1; const int RIGHT =2; // ID para fotodiodos:const int FRONT_LEFT =0; const int FRONT_RIGHT =1; const int BACK_LEFT =2; const int BACK_RIGHT =3; // Variables para lectura de fotodiodos:int PHOTO_Front_Left; int PHOTO_Front_Right; int PHOTO_Back_Left; int PHOTO_Back_Right; const int SONAR_TrigSig =10; // Duración (en S) de la señal de disparo que los sensores necesitan para producir sonido ultrasónico (ya especificado por los productos, no cambie este valor) .const unsigned long SONAR_MaxEc =50000; // Duración máxima (en S) de la señal de eco dada por los sensores (ya especificada por los productos, no cambie este valor) .const float SOUND_speed =0.034; // La velocidad del sonido en el aire en S / cm (ya especificada por sciene, se necesita avatar Aang para hacer flexión de aire si se desea cambiar este valor) .int distancia [SONAR_sum]; // Resultados del cálculo de la distancia.// Ddeclaración de los servos:Servo SERVO_shaft; Servo SERVO_front_left; Servo SERVO_front_right; Servo SERVO_back_left; Servo SERVO_back_right; // Variables para los ángulos de cada servos:int ANGLE_shaft =ANGLE_mid_Shaft_Shaft =ANGLE_shaft; ANGLE_front_right =ANGLE_mid_FRight; int ANGLE_back_left =ANGLE_mid_BLeft; int ANGLE_back_right =ANGLE_mid_BRight; // Manipulación del ángulo para el servo medio (eje) .const int ANGLE_max_Shaft =ANGLE_mid_Shaft + ANGLE_sweepmin; const ANGLE_medio de la corriente ANGLE_shaft; ángulos de cada servos:int ANGLE_shaft_record; int ANGLE_front_left_record; int ANGLE_front_right_record; int ANGLE_back_left_record; int ANGLE_back_right_record; // Variables para la corrección de los ángulos de los servos según la detección de luz:int LIGHT_left; int LIGHT_Frente a la detección de los ángulos; // Variables para la corrección de los servos de la luz:int SONAR_left; int SONAR_right; // Que cosas como banderas, contadores, registros que no siempre estoy seguro de cómo explicar. :(int ANGLE_prev; int flag_shaft_reverse; int flag_transition_rotate; int flag_transition_start =1; int flag_rest =0; int flag_RUN_time =0; int rotate_random; int counter_gait; void setup () {// Serial.begin (9600); // Serial. . ya sabes, verificando y depurando .. SERVO_shaft.attach (2); // *** Configurar el pin de señal del servo horizontal (eje) en arduino. SERVO_front_left.attach (4); // *** Configurar front-left pin de señal del servo en arduino. SERVO_front_right.attach (3); // *** Configure el pin de señal del servo delantero derecho en arduino. SERVO_back_left.attach (6); // *** Configure el pin de señal del servo trasero izquierdo en arduino. SERVO_back_right.attach (5); // *** Configura el pin de señal del servo trasero derecho en arduino. // Prepara los servos en sus ángulos medios. SERVO_shaft.writeMicroseconds (ANGLE_mid_Shaft); SERVO_front_left.writeMicroseconds (ANGLE_mid_FLeft); SERVO_front_right.writeMicroseconds (ANGLE_mid_FRight); SERVO_back_left.writeMicroseconds (ANGLE_mid_BLeft); SERVO_back_right.writeMicroseconds (ANGLE_mid_BRight); // Pin de ajuste s para sonares, tanto pinMode como value. para (SONAR_id =0; SONAR_id  distRotate) {flag_RUN_time =0; while (flag_RUN_time ==0) {ADELANTE (); }} while (distancia [FRENTE]> distRetreat &&distancia [FRONT] <=distRotate) {while (distancia [IZQUIERDA]> distancia [DERECHA]) {ROTATE_LEFT_AVOID (); descanso; } while (distancia [IZQUIERDA]  =ANGLE_max_Shaft) {ANGLE_prev =ANGLE_shaft; ANGLE_shaft - =ANGLE_res; } else if (ANGLE_prev> ANGLE_shaft &&ANGLE_shaft> ANGLE_min_Shaft) {ANGLE_prev =ANGLE_shaft; ANGLE_shaft - =ANGLE_res; } else if (ANGLE_shaft <=ANGLE_min_Shaft) {ANGLE_prev =ANGLE_shaft; ANGLE_shaft + =ANGLE_res; } SERVO_shaft.writeMicroseconds (ANGLE_shaft);} void SHAFT_REVERSE () {if (ANGLE_prev  ANGLE_shaft) {ANGLE_prev =ANGLE_shaft - 1; }} / * ================================FIN DEL MOVIMIENTO DEL EJE ================================* // * =====================================TRANSICIÓN ===================================* / void TRANSITION_GAIT () {ANGLE_front_left_record =ANGLE_front_left; ANGLE_front_right_record =ANGLE_front_right; ANGLE_back_left_record =ANGLE_back_left; ANGLE_back_right_record =ANGLE_back_right; ANGLE_shaft_record =ANGLE_shaft; int flag =HIGH; int contador =0; while (bandera ==ALTA) {EJE (); LIGHT_left =0; LIGHT_right =0; contador ++; ANGLE_front_left =map (contador, 1, ((ANGLE_sweep * 2) / ANGLE_res), ANGLE_front_left_record, ANGLE_mid_FLeft); ANGLE_front_right =map (contador, 1, ((ANGLE_sweep * 2) / ANGLE_res), ANGLE_front_right_record, ANGLE_mid_FRight); ANGLE_back_left =map (contador, 1, ((ANGLE_sweep * 2) / ANGLE_res), ANGLE_back_left_record, ANGLE_mid_BLeft); ANGLE_back_right =map (contador, 1, ((ANGLE_sweep * 2) / ANGLE_res), ANGLE_back_right_record, ANGLE_mid_BRight); SERVO_shaft.writeMicroseconds (ANGLE_shaft); SERVO_front_left.writeMicroseconds (ANGLE_front_left); SERVO_front_right.writeMicroseconds (ANGLE_front_right); SERVO_back_left.writeMicroseconds (ANGLE_back_left); SERVO_back_right.writeMicroseconds (ANGLE_back_right); if (contador ==((ANGLE_sweep * 2) / ANGLE_res)) {flag =LOW; COMIENZO(); flag_transition_rotate =0; }}} void TRANSITION_START () {if (ANGLE_shaft ==ANGLE_mid_Shaft || (ANGLE_shaft> ANGLE_mid_Shaft &&ANGLE_shaft> ANGLE_prev) || (ANGLE_shaft  =ANGLE_mid_Shaft &&ANGLE_prev  =ANGLE_mid_Shaft &&ANGLE_prev> ANGLE_shaft) {ANGLE_front_left =map (ANGLE_shaft, ANGLE_max_Shaft, ANGLE_mid_Shaft, ANGLE_mid_FLeft, ((ANGLE_mid_FLeft_left_left) --SweAR; ANGLE_front_right =map (ANGLE_shaft, ANGLE_max_Shaft, ANGLE_mid_Shaft, ANGLE_mid_FRight, ((ANGLE_mid_FRight + ANGLE_sweep_val) + LIGHT_right + SONAR_right)); ANGLE_back_left =map (ANGLE_shaft, ANGLE_max_Shaft, ANGLE_mid_Shaft, ANGLE_mid_BLeft, ((ANGLE_mid_BLeft - ANGLE_sweep_val) + LIGHT_left + SONAR_left)); ANGLE_back_right =map (ANGLE_shaft, ANGLE_max_Shaft, ANGLE_mid_Shaft, ANGLE_mid_BRight, ((ANGLE_mid_BRight - ANGLE_sweep_val) - LIGHT_right - SONAR_right)); } else if (ANGLE_shaft  ANGLE_shaft) {ANGLE_front_left =map (ANGLE_shaft, ANGLE_mid_Shaft, ANGLE_min_Shaft, ((ANGLE_mid_FLeft + ANGLE_sweep_val) - ANGLE_left_left) ANGLE_front_right =map (ANGLE_shaft, ANGLE_mid_Shaft, ANGLE_min_Shaft, ((ANGLE_mid_FRight + ANGLE_sweep_val) + LIGHT_right + SONAR_right), ANGLE_mid_FRight); ANGLE_back_left =map (ANGLE_shaft, ANGLE_mid_Shaft, ANGLE_min_Shaft, ((ANGLE_mid_BLeft - ANGLE_sweep_val) + LIGHT_left + SONAR_left), ANGLE_mid_BLeft); ANGLE_back_right =map (ANGLE_shaft, ANGLE_mid_Shaft, ANGLE_min_Shaft, ((ANGLE_mid_BRight - ANGLE_sweep_val) - LIGHT_right - SONAR_right), ANGLE_mid_BRight); } else if (ANGLE_shaft  =ANGLE_mid_Shaft &&ANGLE_prev  =ANGLE_mid_Shaft &&ANGLE_prev> ANGLE_shaft) {ANGLE_front_left =map (ANGLE_shaft, ANGLE_max_Shaft, ANGLE_mid_Shaft, ANGLE_mid_FLeft, (ANGLE_mid_FLeft - ANGLE_valor); ANGLE_front_right =map (ANGLE_shaft, ANGLE_max_Shaft, ANGLE_mid_Shaft, ANGLE_mid_FRight, (ANGLE_mid_FRight + ANGLE_sweep_val)); ANGLE_back_left =map (ANGLE_shaft, ANGLE_max_Shaft, ANGLE_mid_Shaft, ANGLE_mid_BLeft, (ANGLE_mid_BLeft + ANGLE_sweep_val)); ANGLE_back_right =map (ANGLE_shaft, ANGLE_max_Shaft, ANGLE_mid_Shaft, ANGLE_mid_BRight, (ANGLE_mid_BRight - ANGLE_sweep_val)); } else if (ANGLE_shaft  ANGLE_shaft) {ANGLE_front_left =map (ANGLE_shaft, ANGLE_mid_Shaft, ANGLE_min_Shaft, (ANGLE_mid_FLeft - ANGLE_sweep_val), ANGLE); ANGLE_front_right =map (ANGLE_shaft, ANGLE_mid_Shaft, ANGLE_min_Shaft, (ANGLE_mid_FRight + ANGLE_sweep_val), ANGLE_mid_FRight); ANGLE_back_left =map (ANGLE_shaft, ANGLE_mid_Shaft, ANGLE_min_Shaft, (ANGLE_mid_BLeft + ANGLE_sweep_val), ANGLE_mid_BLeft); ANGLE_back_right =map (ANGLE_shaft, ANGLE_mid_Shaft, ANGLE_min_Shaft, (ANGLE_mid_BRight - ANGLE_sweep_val), ANGLE_mid_BRight); } else if (ANGLE_shaft  0.0) {SONAR_distance =SONAR_EcInterval * (SOUND_speed / 2.0); descanso; } while (SONAR_EcInterval ==0.0) {SONAR_distance =501.0; descanso; } return SONAR_distance;} / * ===========================FIN DE LECTURA ULTRASÓNICA =============================* // * ====================================DETECCIÓN DE LUZ ==================================* / void LIGHT_COMPARE_EXECUTE () {// PHOTO_FLeft_RAW =analogRead (PIN_PHOTO [FRONT_LEFT]); // PHOTO_FRight_RAW =analogRead (PIN_PHOTO [FRONT_RIGHT]); PHOTO_Front_Left =analogRead (PIN_PHOTO [FRONT_LEFT]); PHOTO_Front_Right =analogRead (PIN_PHOTO [FRONT_RIGHT]); PHOTO_Back_Left =analogRead (PIN_PHOTO [BACK_LEFT]); PHOTO_Back_Right =analogRead (PIN_PHOTO [BACK_RIGHT]); if ((PHOTO_Front_Left + PHOTO_Front_Right)> =(PHOTO_Back_Left + PHOTO_Back_Right)) {int LIGHT_Sensitivity =50; if (LIGHT_COMPARE ()> LIGHT_Sensitivity) {LIGHT_COMPARE =​​LIGHT_COMPARE (); LIGHT_right =0; } más si (LIGHT_COMPARE () <-LIGHT_Sensitivity) {LIGHT_left =0; LUZ_derecha =LUZ_COMPARA (); } más {LIGHT_left =0; LIGHT_right =0; }} else {if (PHOTO_Back_Left> PHOTO_Back_Right) {LIGHT_right =0; LIGHT_left =ANGLE_turnMAX; } más si (PHOTO_Back_Left  PHOTO_Front_Right) {LIGHT_rate =PHOTO_Front_Left; } más si (PHOTO_Front_Right> PHOTO_Front_Left) {LIGHT_rate =PHOTO_Front_Right; } else {// elige usar una y comenta la otra de estas variables a continuación // LIGHT_rate =PHOTO_Front_Left; LIGHT_rate =PHOTO_Front_Right; } int LIGHT_compareRAW =PHOTO_Front_Left - PHOTO_Front_Right; LIGHT_compareRAW =map (LIGHT_compareRAW, -LIGHT_rate, LIGHT_rate, -ANGLE_turnMAX, ANGLE_turnMAX);; return LIGHT_compareRAW;} / * ===============================FIN DE DETECCIÓN DE LUZ =================================* // * ======================================COMPORTAMIENTO ======================================* / void RETREAT_AVOID () {counter_gait =0; while (counter_gait <=counter_gait_max) {RETIRO (); }} anular ROTATE_LEFT_AVOID () {counter_gait =0; rotate_random =2; while (counter_gait <=counter_gait_max) {ROTATE_LEFT (); }} anular ROTATE_RIGHT_AVOID () {counter_gait =0; rotate_random =2; while (counter_gait <=counter_gait_max) {ROTATE_RIGHT (); }} anular ROTATE_RANDOM_AVOID () {rotate_random =ROTATE_RANDOM (); while (rotate_random ==0) {ROTATE_LEFT_AVOID (); } while (rotate_random ==1) {ROTATE_RIGHT_AVOID (); }} void SIDE_AVOID () {if (distancia [IZQUIERDA] <=distTurn &&distancia [RIGHT]> distTurn) {LIGHT_left =0; LIGHT_right =0; SONAR_left =0; SONAR_right =- (mapa (distancia [IZQUIERDA], 0, distTurn, ANGLE_turnMAX, 0)); } else if (distancia [DERECHA] <=distTurn &&distancia [LEFT]> distTurn) {LIGHT_left =0; LIGHT_right =0; SONAR_right =0; SONAR_left =mapa (distancia [RIGHT], 0, distTurn, ANGLE_turnMAX, 0); } else if (distancia [IZQUIERDA] <=distTurn &&distancia [RIGHT] <=distTurn) {LIGHT_left =0; LIGHT_right =0; if (distancia [IZQUIERDA]   

Esquemas


Proceso de manufactura

  1. Dados digitales Arduino
  2. Iron Man
  3. Encuéntrame
  4. Brazo robótico Arduino impreso en 3D
  5. Cómo medir la masa de la Tierra usando Arduino
  6. Control del humidificador Arduino
  7. NeoMatrix Arduino Pong
  8. Joystick de Arduino
  9. Receptor de radio FM Arduino TEA5767
  10. Podómetro (Arduino 101)
  11. Health Band:un asistente inteligente para los ancianos