Com certeza vocês já viram, ou já ouviram falar sobre aqueles robôs aspiradores de pó que ficam andando pela casa, né? No post de hoje, nós faremos um robô que anda bem parecido com aqueles robôs. Sim, eles andam um pouco engraçado, mas o fato é que eles nunca batem e ficam insistindo em andar para frente em uma parede. O projeto utiliza a placa Arduino Uno e um Motor Shield L293D para o controle dos motores, e para detectar os obstáculos, iremos usar um sensor ultrassônico HC-SR04.
A conexão no Arduino será somente essa:
Para ficar menos confuso, eu fiz um vídeo mostrando a conexão do HC-SR04 com a placa:
Soldei um cabo na parte do Shield que dá 5v e outro no GND, para a conexão ser mais fácil. No meu caso o cabo que coloquei era grande, mas caso prefira, é possível soldar diretamente o Vcc e o GND do sensor diretamente no Shield.
A primeira parte é montar o chassi do robô:
Foi necessária a soldagem de dois fios e uma barra de pinos no Shield como na imagem a seguir:
Após isso, basta encaixar o shield no Arduino e fazer as ligações conforme o circuito.
Eu soldei esses dois fios na parte do Shield onde tem os pinos de 5v e GND, para facilitar na conexão com o sensor:
Agora, o carrinho montado:
#include <AFMotor.h> //inclui a biblioteca do Motor Shield AF_DCMotor motor1(2); //define em quais portas do shield cada motor está ligado AF_DCMotor motor2(3); int vel = 250; //variavel para o controle da velocidade int PinTrigger = 15; // Pino usado para disparar os pulsos do sensor int PinEcho = 14; // pino usado para ler a saida do sensor float TempoEcho = 0; const float VelocidadeSom_mporus = 0.000340; void setup() { pinMode(PinTrigger, OUTPUT); //configura o Trigger como saída digitalWrite(PinTrigger, LOW); pinMode(PinEcho, INPUT); // configura pino ECHO como entrada } void loop() { // Envia pulso para o disparar o sensor DisparaPulsoUltrassonico(); // Mede o tempo de duração do sinal no pino de leitura(us) TempoEcho = pulseIn(PinEcho, HIGH); if((CalculaDistancia(TempoEcho)*100) > 15){ // se a distância calculada em cm for maior que 15cm, o robô anda para frente motor1.run(FORWARD); motor2.run(FORWARD); motor1.setSpeed(vel); motor2.setSpeed(vel); } else{ //se a distância não for maior que 15cm, o robô vira para a direita motor1.run(FORWARD); motor2.run(BACKWARD); motor1.setSpeed(vel); motor2.setSpeed(vel); delay(300); } } // Funçao para enviar o pulso de trigger void DisparaPulsoUltrassonico(){ digitalWrite(PinTrigger, HIGH); delayMicroseconds(10); digitalWrite(PinTrigger, LOW); } // Função para calcular a distancia em metros float CalculaDistancia(float tempo_us){ return((tempo_us*VelocidadeSom_mporus)/2); }
int PinTrigger = 15; int PinEcho = 14;
Os pinos Analógicos podem ser utilizados como digitais, no caso o 14 e o 15 são as portas A0 e A1, respectivamente.
|
A Eletrogate é uma loja virtual de componentes eletrônicos do Brasil e possui diversos produtos relacionados à Arduino, Automação, Robótica e Eletrônica em geral.
Conheça a Metodologia Eletrogate e Lecione um Curso de Robótica nas Escolas da sua Região!