- Materiais requisitados:
- Conceito de robô para evitar obstáculos:
- Diagrama de circuito e explicação:
- Programando seu microcontrolador PIC:
- Robô Avoider Obstáculo em Ação:
Obstacle Avoider Robot é outro robô famoso que apimenta projetos embutidos. Para aqueles que são novos robôs evitadores de obstáculos, é apenas um robô normal com rodas que pode navegar seu caminho sem bater em nenhum obstáculo. Há muitas maneiras de construir um robô que evita obstáculos. No projeto, vamos usar um sensor ultrassônico (frontal) e dois sensores IR (esquerda / direita) para que nosso robô tenha olhos nas três direções. Dessa forma, você pode torná-lo muito mais inteligente e rápido, detectando objetos em todos os três lados e manobrando de acordo. Aqui estamos processando o microcontrolador PIC PIC16F877A por este obstáculo evitando o robô.
O funcionamento de um robô evitando obstáculos pode ser observado a partir de um produto em tempo real denominado robôs de limpeza doméstica. Embora a tecnologia e os sensores usados neles sejam muito complicados, o conceito permanece o mesmo. Vamos ver o quanto podemos realizar usando nossos sensores normais e microcontroladores PIC.
Verifique também nossos outros robôs para evitar obstáculos:
- Robô para evitar obstáculos baseado em Raspberry Pi
- Robô de limpeza a vácuo inteligente DIY usando Arduino
Materiais requisitados:
- PIC16F877A
- Sensor IR (2Nos)
- Sensor Ultrassônico (1Nos)
- Motor de engrenagem DC (2Nos)
- Motorista L293D
- Chaises (você também pode construir seu próprio usando papelão)
- Banco de energia (qualquer fonte de energia disponível)
Conceito de robô para evitar obstáculos:
O conceito de Obstacle Avoiding Robot é muito simples. Usamos sensores para detectar a presença de objetos ao redor do robô e usar esses dados para não colidir o robô sobre esses objetos. Para detectar um objeto, podemos usar qualquer sensor de uso como sensor IR e sensor ultrassônico.
Em nosso robô, usamos o sensor US como o sensor frontal e dois sensores IR para a esquerda e direita, respectivamente. O robô se moverá para frente quando não houver nenhum objeto presente antes dele. Assim, o robô avançará até que o sensor ultrassônico (US) detecte qualquer objeto.
Quando um objeto é detectado pelo sensor US, é hora de mudar a direção do robô. Podemos virar à esquerda ou à direita, para decidir a direção do giro usamos a ajuda do sensor IR para verificar se há algum objeto presente próximo ao lado esquerdo ou direito do robô.
Se houver um objeto detectado na frente e no lado direito do robô, o robô voltará e virará à esquerda. Fazemos o robô correr para trás por uma certa distância para que não colida no objeto ao fazer a curva.
Se houver um objeto detectado na frente e no lado esquerdo do robô, o robô voltará e virará à direita.
Se o robô chegar a um canto da sala, ele sentirá um objeto presente em todos os quatro. Neste caso, temos que conduzir o robô para trás até que qualquer um dos lados fique livre.
Outro caso possível é que haverá um objeto na frente, mas pode não haver nenhum objeto nem no lado esquerdo nem no lado direito, neste caso temos que virar aleatoriamente em qualquer uma das direções.
Espero que isso tenha dado uma ideia aproximada de como funciona um aviador de Obstáculos, agora vamos prosseguir com o Diagrama de Circuito para construir este bot e apreciá-lo em ação.
Diagrama de circuito e explicação:
O diagrama completo do circuito deste robô evitando obstáculos baseado em PIC é mostrado na imagem acima. Como você pode ver, usamos dois sensores IR para detectar objetos à esquerda e à direita do robô, respectivamente, e um sensor ultrassônico para medir a distância do objeto que está presente à frente do robô. Também usamos um módulo Motor Driver L293D para acionar os dois motores presentes neste projeto. Estes são apenas motores de engrenagem CC comuns para rodas e, portanto, podem ser derivados com muita facilidade. A tabela a seguir o ajudará nas conexões.
S.Não |
Conectado de |
Conectado a |
1 |
Pino de saída do sensor IR |
RD2 (pino 21) |
2 |
Pino direito do sensor IR |
RD3 (pino 22) |
4 |
Pino do canal A do motor 1 |
RC4 (pino 23) |
5 |
Pino do canal B do motor 1 |
RC5 (pino 25) |
6 |
Pino do canal A do motor 2 |
RC6 (pino 26) |
7 |
Pino do canal B do motor 2 |
RC7 (pino 27) |
8 |
US Trigger Pin |
RB1 (pino 34) |
9 |
US Echo Pin |
RB2 (pino 35) |
Um módulo de driver de motor como L293D é obrigatório porque a quantidade de corrente necessária para operar o motor redutor DC não pode ser fornecida pelo pino de E / S do microcontrolador PIC. Os sensores e o módulo são alimentados pela alimentação de + 5V que está sendo regulada pelo 7805. O módulo driver do motor pode ser alimentado até mesmo usando + 12V, mas para este projeto eu apenas me fixei nos + 5V disponíveis.
O robô completo é alimentado por um banco de energia no meu caso. Você também pode usar qualquer banco de energia comum e ignorar a seção do regulador ou usar o circuito acima e usar qualquer bateria de 9 V ou 12 V para o Robô, conforme mostrado no diagrama de circuito acima. Uma vez que suas conexões sejam feitas, ficaria mais ou menos assim abaixo
Programando seu microcontrolador PIC:
Programar seu PIC para trabalhar para um aviador de Obstáculos é realmente fácil. Precisamos apenas ler o valor desses três sensores e acionar os motores de acordo. Neste projeto estamos usando um sensor ultrassônico. Já aprendemos como fazer a interface ultrassônica com o microcontrolador PIC, se você for novo aqui, por favor, volte a esse tutorial para entender como um sensor US funciona com um PIC, já que irei pular os detalhes sobre isso aqui para evitar repetição.
O programa completo ou este Robô é fornecido no final desta página. Eu expliquei mais detalhadamente as partes importantes do programa abaixo.
Como sabemos, todos os programas começam com as declarações dos pinos de entrada e saída. Aqui, os quatro pinos do módulo do driver do motor e os pinos do acionador são os pinos de saída, enquanto o pino Echo e os dois pinos de saída IR serão inseridos. Devemos inicializar o módulo Timer 1 para usá-lo com o sensor ultrassônico.
TRISD = 0x00; // PORTD declarado como saída para interface LCD TRISB1 = 0; // O pino do gatilho do sensor US é enviado como pino de saída TRISB2 = 1; // O pino de eco do sensor dos EUA é definido como pino de entrada TRISB3 = 0; // RB3 é o pino de saída para LED TRISD2 = 1; TRISD3 = 1; // Ambos os pinos do sensor IR são declarados como input TRISC4 = 0; TRISC5 = 0; // Pinos do motor 1 declarados como saída TRISC6 = 0; TRISC7 = 0; // Pinos do motor 2 declarados como saída T1CON = 0x20;
Neste programa, teríamos que verificar a distância entre o sensor e o objeto com bastante frequência, então criamos uma função chamada calcular_distance () dentro da qual mediremos a distância pelo método discutido no tutorial de interface do sensor dos EUA. O código é mostrado abaixo
void calcul_distance () // função para calcular a distância de US {TMR1H = 0; TMR1L = 0; // limpa os bits do temporizador Trigger = 1; __delay_us (10); Gatilho = 0; enquanto (Eco == 0); TMR1ON = 1; enquanto (Eco == 1); TMR1ON = 0; time_taken = (TMR1L - (TMR1H << 8)); distância = (0,0272 * time_taken) / 2; }
A próxima etapa seria comparar os valores do sensor ultrassônico e do sensor IR e mover o robô de acordo. Aqui neste programa, usei um valor de cm como a distância crítica abaixo da qual o robô deve começar a fazer alterações na direção. Você pode usar seus valores preferidos. Se não houver objeto, o robô apenas se move para frente
se (distância> 5) {RC4 = 0; RC5 = 1; // Motor 1 para frente RC6 = 1; RC7 = 0; // Motor 2 forward}
Se um objeto for detectado, a distância ficará abaixo de cm. Neste caso, consideramos os valores do sensor ultrassônico esquerdo e direito. Com base neste valor, decidimos virar à esquerda ou à direita. Um atraso de ms é usado para que a mudança de direção seja visível.
if (RD2 == 0 && RD3 == 1 && distance <= 5) // O sensor esquerdo está bloqueado {back_off (); RC4 = 1; RC5 = 1; // Motor 1 parada RC6 = 1; RC7 = 0; // Motor 2 para frente __delay_ms (500); } calcule_distância (); if (RD2 == 1 && RD3 == 0 && distance <= 5) // Sensor direito está bloqueado {back_off (); RC4 = 0; RC5 = 1; // Motor 1 para frente RC6 = 1; RC7 = 1; // Motor 2 para __delay_ms (500); }
Às vezes, o sensor ultrassônico detecta um objeto, mas nenhum objeto é detectado pelos sensores infravermelhos. Neste caso, o robô vira à esquerda por padrão. Você também pode fazê-lo virar à direita ou em uma direção aleatória com base em suas preferências. Se houver objetos em ambos os lados, fazemos com que retroceda. O código para fazer o mesmo é mostrado abaixo.
calcule_distância (); if (RD2 == 0 && RD3 == 0 && distance <= 5) // Ambos os sensores estão abertos {back_off (); RC4 = 0; RC5 = 1; // Motor 1 para frente RC6 = 1; RC7 = 1; // Motor 2 para __delay_ms (500); } calcule_distância (); if (RD2 == 1 && RD3 == 1 && distance <= 5) // Ambos os sensores estão bloqueados {back_off (); RC4 = 1; RC5 = 0; // Motor 1 reverso RC6 = 1; RC7 = 1; // Motor 2 para __delay_ms (1000); }
Robô Avoider Obstáculo em Ação:
O funcionamento do projeto é muito interessante e divertido de assistir. Assim que terminar com seu circuito e código, apenas ligue o bot e deixe-o no solo. Deve ser capaz de identificar obstáculos e evitá-los com inteligência. Mas, aí vem a parte divertida. Você pode modificar o código e fazê-lo fazer mais coisas, como evitar uma escada, torná-lo mais inteligente ao armazenar curvas preciosas e o que não?
Este robô ajudará você a entender o básico da programação e aprender como um hardware real responderá ao seu código. É sempre divertido programar este robô e observar como ele se comporta para o código no mundo real.
Aqui usamos a mesma placa PIC perf que fizemos para LED piscando usando o microcontrolador PIC e usamos esta placa em outros projetos da Série PIC Tutorial.
Seu robô deve ser semelhante ao mostrado na imagem acima. O funcionamento completo deste projeto é mostrado no vídeo abaixo.
Espero que você tenha entendido o projeto e gostado de construir um. Se você tiver alguma dúvida ou travamento, pode usar a seção de comentários para postar suas perguntas e eu tentarei o meu melhor para respondê-las.