Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

WALTER - O Arduino Photovore Insect

Componentes e suprimentos

SparkFun Arduino Pro Mini 328 - 5 V / 16 MHz
× 1
Sensor ultrassônico - HC-SR04 (genérico)
× 3
Fotodiodo
× 4
Resistor 100k ohm
× 4
MG90S Metal Geared Micro Servo
× 5
Power Pack portátil para smartphones (2 canais:1A e 2.1 A)
× 1

Ferramentas e máquinas necessárias

Ferro de soldar (genérico)
Pistola de cola quente (genérica)

Aplicativos e serviços online

Arduino IDE

Sobre este projeto


[Por favor, desculpe meu inglês]

Eu realmente gosto da configuração popular de 2 servos arduino insetos no YouTube. Quando eu olhava para ele, sempre me lembro do que os robôs robóticos do BEAM faziam muito antes de aquela configuração se tornar favorita. Essas pessoas fanáticas por robôs analógicos tiveram melhor desempenho na marcha devido ao melhor ângulo entre os dois motores ( microcore / bicore andador , etc).

No entanto, em minha opinião, nenhum dos mencionados antes parece mais vivo do que VBug1.5 (também conhecido como Walkman) criado pelo fundador da beam robótica, Mark Tilden. Está usando 5 motores, portanto tem mais manobrabilidade.

Fazer um robô BEAM simples não é difícil, mas construir algo tão complicado como o VBug1.5 pode ser angustiante para um novato em eletrônica como eu. Então, quando decidi fazer algo como os bugs de Tilden, tive que me contentar com a plataforma Arduino, a escolha mais fácil para não engenheiros (ou no meu caso, embaraçosamente, um aspirante a engenheiro).

Como resultado, fiz Walter , um robô arduino de 4 pernas com 5 servos. Você pode se perguntar, se eu queria fazer um robô bug com aparência de vida, então por que não optei por 8 ou 12 servos em vez disso. Bem, eu estava pensando em algo mais simples que posso fazer para obter a maior capacidade de manobra que posso ter. Estou falando sobre usar muita cola em vez de fazer molduras.

COMPORTAMENTOS

Como muitos outros robôs arduino, Walter pode evitar obstáculos usando sensores ultrassônicos HC-SR04. Para adicionar personagem como um inseto, Walter também um fotovisor, significa que ele é atraído pela luz. Fotodiodos são usados ​​para detectar luz. Existem valores aleatórios gerados no esboço do arduino para fazer Walter decidir quando quer parar para descansar, e também para alterar aleatoriamente sua velocidade de marcha (3 velocidades).

Quando comecei, pretendia ter botões táteis sob cada um dos pés de Walter para que ele tivesse sensores de superfície. Mas a bateria (um banco de energia portátil para smartphone) custa muito peso aos servos. Eu sei que botões táteis não pesam quase nada para aumentar o peso, mas ironicamente o peso do robô não é suficiente para ser capaz de pressioná-los de cabeça para baixo.

Planejei fazer a versão 2 do Walter com servos maiores e incluí esses botões como sensores de superfície.

mais detalhes

Código

  • WALTER.ino
WALTER.ino Arduino
 / * WALTER - THE 4 LEGGED PHOTOVORETeste esboço do Arduino é minha tentativa de construir um robô 5 servo quadrúpede (4 pernas) chamado "WALTER". Para usar este esboço, você pode precisar alterar alguns valores para sua conveniência ou para ajustar à configuração do seu próprio hardware. Encontre (Ctrl + F) essas marcas para pesquisar facilmente quais valores podem precisar ser alterados:- ****:Essas marcas significam que eles são a posição central dos servos e devem ser calibrados (seu robô posicionamento das pernas quando está ocioso). - ***:Essas marcas significam atribuição de pinos do Arduino (conexão de sensores e servos ao Arduino). Consulte isso ao construir o robô. - **:Estas marcas significam que os valores podem ser alterados opcionalmente de acordo com o seu gosto (largura dos passos das pernas, quanto virar ao detectar luz / obstáculo, etc). Apenas deixe como está se você não souber o que está fazendo. Você pode usar este esboço por sua própria conta e risco .. e, é fornecido como está e .. uh .. O que são todos esses direitos autorais que as pessoas usam para escrever no código-fonte publicado ?? A questão é que não quero ser responsabilizado se algo de ruim aconteceu quando você estava usando esses códigos.Divirta-se! Yohanes Martedi - 2015 * / # include  // ** ** Calibre o ângulo central dos servos (em microssegundos porque usaremos o comando "xx.writeMicroseconds ();"). Comece com 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_mid_sweep =250; // ** Defina este valor (em microssegundos) para determinar a largura da varredura dos servos (largura dos passos das pernas). Um valor maior significa um ângulo de varredura mais amplo.const int ANGLE_res =10; // ** Defina a resolução do movimento do servo (em microssegundos) pelo menos na largura de banda morta padrão do servo (resolução mais alta) ou mais (menos resolução). Exemplo:a largura da banda morta do servo SG90 é 10 microssegundos.int sweepSPEED; // variável para determinar a rapidez com que os servos irão sweep.int sweepSPEED_Rand [3] ={4, 6, 8}; // ** A velocidade do servo (velocidade de marcha) mudará aleatoriamente em 3 modos. Defina a velocidade (em milissegundos) para cada modo. Valor menor significa mais rápido.const int ANGLE_turnMAX =ANGLE_sweep * 1.5; // ** Defina este valor para determinar quanto máximo o bot girará em direção à luz. Maior valor significa maior turn.const int ANGLE_turnNARROW =ANGLE_sweep * 0,25; // ** Defina este valor para determinar quanto máximo o bot girará evitando objetos em seus lados em um espaço estreito. Maior valor significa maior turn.const int SONAR_sum =3; // Quantidade de sonares usados.const int PHOTO_sum =4; // Quantidade de fotodiodos usados.int PIN_trig [SONAR_sum] ={13, 11, 8}; // *** Definir os pinos do Arduino conectados aos pinos do gatilho dos sensores ultrassônicos; {frente, esquerda, direita} .int PIN_ec [SONAR_sum] ={12, 10, 7}; // *** Definir os pinos do Arduino conectados aos pinos de eco dos sensores ultrassônicos; {frente, esquerda, direita} .int PIN_PHOTO [PHOTO_sum] ={2, 3, 1, 0}; // *** Definir os pinos de entrada analógica do Arduino conectados aos fotodiodos; {frontal esquerdo, frontal direito, posterior esquerdo, posterior direito} .const int distRotate =25; // ** Configure a distância mínima (em cm) entre o robô e o obstáculo antes que o robô evite girando.const int distRetreat =10; // ** Configure a distância mínima (em cm) entre o robô e o obstáculo antes que o robô evite recuando.const int distTurn =20; // ** Configure a distância mínima (em cm) entre o robô e o obstáculo antes que o robô evite girando.const int counter_gait_max =8; // ** Configure quantos passos o robô levará para evitar obstáculos (ao girar ou recuar) .// ** Configure quanto tempo o bot descansa e executa (em milissegundos) .const int RUN_time =25000; const int REST_time =3000; // IDs para sonares:int SONAR_id; const int FRONT =0; const int LEFT =1; const int RIGHT =2; // IDs para fotodiodos:const int FRONT_LEFT =0; const int FRONT_RIGHT =1; const int BACK_LEFT =2; const int BACK_RIGHT =3; // Variáveis ​​para leitura de fotodiodos:int PHOTO_Front_Left; int PHOTO_Front_Right; int PHOTO_Back_Left; int PHOTO_Back_Right; const int SONAR_TrigSig =10; // Duração (em S) do sinal de disparo dos sensores necessários para produzir som ultrassônico (já especificado pelos produtos, não altere este valor) .const unsigned long SONAR_MaxEc =50000; // Duração máxima (em S) do sinal de eco dado pelos sensores (já especificado pelos produtos, não altere este valor) .const float SOUND_speed =0.034; // A velocidade do som no ar em S / cm (já especificada por sciene, avatar Aang é necessário para fazer a dobra no ar se este valor for alterado) .int distance [SONAR_sum]; // Resultados do cálculo da distância.// Ddeclaração dos servos:Servo SERVO_shaft; Servo SERVO_front_left; Servo SERVO_front_right; Servo SERVO_back_left; Servo SERVO_back_right; // Variáveis ​​para os ângulos de cada servo:int ANGLE_shaft =ANGLE_mid_Shaft =ANGLE_frontFL_frontmidleft; ANGLE_front_right =ANGLE_mid_FRight; int ANGLE_back_left =ANGLE_mid_BLeft; int ANGLE_back_right =ANGLE_mid_BRight; // Manipulação do ângulo para o servo médio (eixo) .const int ANGLE_max_Shaft =ANGLE_mid_Shaft // ANGLE_sweep_valor + ANGLE_sweep; ângulos de cada servo:int ANGLE_shaft_record; int ANGLE_front_left_record; int ANGLE_front_right_record; int ANGLE_back_left_record; int ANGLE_back_right_record; // Variáveis ​​para correção de ângulos dos servos de acordo com a detecção de luz:int LIGHT_left; int int SONAR_left; int SONAR_right; // Essas coisas como sinalizadores, contadores, registros que nem sempre tenho certeza de como 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. . você sabe, verificando e depurando .. SERVO_shaft.attach (2); // *** Configurar o pino de sinal do servo horizontal (eixo) no arduino. SERVO_front_left.attach (4); // *** Configurar front-left pino de sinal do servo no arduino. SERVO_front_right.attach (3); // *** Configure o pino de sinal do servo frontal direito no arduino. SERVO_back_left.attach (6); // *** Configure o pino de sinal do servo traseiro esquerdo em arduino. SERVO_back_right.attach (5); // *** Configure o pino de sinal do servo traseiro direito no arduino. // Prepare os servos em seus ângulos médios. SERVO_shaft.writeMicroseconds (ANGLE_mid_Shaft); SERVO_front_left.writeMicroseconds (ANGLE_mid_FL); SERVO_front_right.writeMicroseconds (ANGLE_mid_FRight); SERVO_back_left.writeMicroseconds (ANGLE_mid_BLeft); SERVO_back_right.writeMicroseconds (ANGLE_mid_BRight); // Definição do pino s para sonares, pinMode e value. para (SONAR_id =0; SONAR_id  distRotate) {flag_RUN_time =0; while (flag_RUN_time ==0) {FORWARD (); }} while (distance [FRONT]> distRetreat &&distance [FRONT] <=distRotate) {while (distance [LEFT]> distance [RIGHT]) {ROTATE_LEFT_AVOID (); pausa; } enquanto (distância [ESQUERDA]  =ANGLE_max_Shaft) {ANGLE_prev =ANGLE_eixo; Eixo_ ANGLE - =ANGLE_res; } else if (ANGLE_prev> ANGLE_eixo &&ANGLE_eixo> ANGLE_min_eixo) {ANGLE_prev =ANGLE_eixo; Eixo_ ANGLE - =ANGLE_res; } else if (ANGLE_eixo <=ANGLE_min_Shaft) {ANGLE_prev =ANGLE_eixo; ANGLE_eixo + =ANGLE_res; } SERVO_shaft.writeMicroseconds (ANGLE_shaft);} void SHAFT_REVERSE () {if (ANGLE_prev  ANGLE_shaft) {ANGLE_prev =ANGLE_shaft - 1; }} / * ==================================FIM DO MOVIMENTO DO EIXO ==================================* // * =======================================TRANSIÇÃO =======================================* / 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; sinalizador interno =ALTO; contador interno =0; enquanto (sinalizador ==ALTO) {EIXO (); LIGHT_left =0; LIGHT_right =0; contador ++; ANGLE_front_left =map (counter, 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 =mapa (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; COMEÇAR(); flag_transition_rotate =0; }}} void TRANSITION_START () {if (ANGLE_eixo ==ANGLE_mid_Shaft || (ANGLE_eixo> ANGLE_mid_Shaft &&ANGLE_eixo> ANGLE_prev) || (ANGLE_eixo  =ANGLE_mid_Shaft &&ANGLE_prev  =ANGLE_mid_Shaft &&ANGLE_prev> ANGLE_seixo) {ANGLE_front_left =map (ANGLE_frontal_esquerdo =map (ANGLE_eixo, ANGLE_max_Shaft, ANGLE_mid_Shaft, ANGLE_mid_FLeft, ((ANGLE_mid_value_esquerda) - ESQUERDA_Valor_esquerda) - ANGLE_front_right =map (ANGLE_volta, ANGLE_max_Shaft, ANGLE_mid_Shaft, ANGLE_mid_FRight, ((ANGLE_mid_FRight + ANGLE_sweep_val) + LIGHT_right + SONAR_right)); ANGLE_back_left =map (ANGLE_mid_left, ANGLE_max_Shaft, ANGLE_mid_Shaft, ANGLE_mid_BLeft, ((ANGLE_mid_BLeft - ANGLE_sweep_val) + LIGHT_left + SONAR_left)); ANGLE_back_right =map (ANGLE_back_right, 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), LIGHT_left_esquerdo - ANGLE_esquerdo); ANGLE_front_right =mapa (ANGLE_mid_Shaft, ANGLE_mid_Shaft, ((ANGLE_mid_FRight + ANGLE_sweep_val) + LIGHT_right + SONAR_right), ANGLE_mid_FRight); ANGLE_back_left =map (ANGLE_eshaft, ANGLE_mid_Shaft, ANGLE_min_Shaft, ((ANGLE_mid_BLeft - ANGLE_sweep_val) + LIGHT_esquerdo + SONAR_esquerdo), 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_haft  =ANGLE_mid_Shaft &&ANGLE_prev  =ANGLE_mid_Shaft &&ANGLE_prev> ANGLE_seixo) {ANGLE_front_left =map (ANGLE_front_left =map (ANGLE_haft, ANGLE_max_Shaft, ANGLE_mid_Shaft, ANGLE_mid_FLeft, (ANGLE_mid_FLeepes - ANGLE_sweep_val)); ANGLE_front_right =map (ANGLE_mid_FRight, ANGLE_max_Shaft, ANGLE_mid_Shaft, ANGLE_mid_FRight, (ANGLE_mid_FRight + ANGLE_sweep_val)); ANGLE_back_left =map (ANGLE_mid_BLeft, ANGLE_max_Shaft, ANGLE_mid_Shaft, ANGLE_mid_BLeft, (ANGLE_mid_BLeft + ANGLE_sweep_val)); ANGLE_back_right =map (ANGLE_mid_BRight, ANGLE_max_Shaft, ANGLE_mid_Shaft, ANGLE_mid_BRight, (ANGLE_mid_BRight - ANGLE_sweep_val)); } else if (ANGLE_eixo  ANGLE_eft) {ANGLE_front_left =map (ANGLE_haft, ANGLE_mid_Shaft, ANGLE_min_Shaft, (ANGLE_mid_FLeft - ANGLE_sweep_val), ANGLE_mid_fleft); ANGLE_front_right =map (ANGLE_mid_haft, ANGLE_mid_Shaft, ANGLE_min_Shaft, (ANGLE_mid_FRight + ANGLE_sweep_val), ANGLE_mid_FRight); ANGLE_back_left =map (ANGLE_mid_Shaft, ANGLE_mid_Shaft, (ANGLE_mid_BLeft + ANGLE_sweep_val), ANGLE_mid_BLeft); ANGLE_back_right =map (ANGLE_mid_Shaft, ANGLE_mid_Shaft, ANGLE_mid_BRight, (ANGLE_mid_BRight - ANGLE_sweep_val), ANGLE_mid_BRight); } else if (ANGLE_haft  0.0) {SONAR_distance =SONAR_EcInterval * (SOUND_speed / 2.0); pausa; } enquanto (SONAR_EcInterval ==0.0) {SONAR_distance =501.0; pausa; } return SONAR_distance;} / * ===============================FIM DA LEITURA ULTRASSÔNICA ===============================* // * ========================================LIGHT DETECT ========================================* / 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_left =LIGHT_COMPARE (); LIGHT_right =0; } else if (LIGHT_COMPARE () <-LIGHT_Sensitivity) {LIGHT_left =0; LIGHT_right =LIGHT_COMPARE (); } else {LIGHT_left =0; LIGHT_right =0; }} else {if (PHOTO_Back_Left> PHOTO_Back_Right) {LIGHT_right =0; LIGHT_left =ANGLE_turnMAX; } else if (PHOTO_Back_Left  PHOTO_Front_Right) {LIGHT_rate =PHOTO_Front_Left; } else if (PHOTO_Front_Right> PHOTO_Front_Left) {LIGHT_rate =PHOTO_Front_Right; } else {// escolhe usar um e comenta a outra dessas variáveis ​​abaixo // 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;} / * =====================================FIM DA LUZ DETECT ===================================* // * ========================================COMPORTAMENTO ==========================================* / void RETREAT_AVOID () {counter_gait =0; while (counter_gait <=counter_gait_max) {RETREAT (); }} void ROTATE_LEFT_AVOID () {counter_gait =0; rotate_random =2; while (counter_gait <=counter_gait_max) {ROTATE_LEFT (); }} void ROTATE_RIGHT_AVOID () {counter_gait =0; rotate_random =2; while (counter_gait <=counter_gait_max) {ROTATE_RIGHT (); }} void 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 (distance [LEFT] <=distTurn &&distance [RIGHT]> distTurn) {LIGHT_left =0; LIGHT_right =0; SONAR_esquerda =0; SONAR_right =- (mapa (distância [LEFT], 0, distTurn, ANGLE_turnMAX, 0)); } else if (distance [RIGHT] <=distTurn &&distance [LEFT]> distTurn) {LIGHT_left =0; LIGHT_right =0; SONAR_right =0; SONAR_esquerda =mapa (distância [RIGHT], 0, distTurn, ANGLE_turnMAX, 0); } else if (distância [LEFT] <=distTurn &&distance [RIGHT] <=distTurn) {LIGHT_left =0; LIGHT_right =0; if (distância [ESQUERDA]  

Esquemas


Processo de manufatura

  1. Dados digitais Arduino
  2. Homem de Ferro
  3. Encontre-me
  4. Arduino 3D-Printed Robotic Arm
  5. Como medir a massa da Terra usando o Arduino
  6. Controle do umidificador Arduino
  7. NeoMatrix Arduino Pong
  8. Joystick Arduino
  9. Receptor de rádio FM Arduino TEA5767
  10. Health Band - Um Assistente Inteligente para Idosos