CONTACT INFORMATION
Monday to Friday from 8:00 to 17:30
+55 11 3522-7626 / vendas@robocore.net
Back
to top

Kit Iniciante Robótica - 9. Robô Anticolisão

This tutorial is not available in English



Quando estava desenvolvendo os exercícios anteriores da apostila, você provavelmente começou a pensar, "Quero fazer meu robô desviar de objetos", como nos da Robocore sabemos tudo o que você quer, criamos este experimento que atenderá suas necessidades introduzindo como o sensor funciona e sua implementação para detectar obstáculos e medir a distância entre o obstaculo e o robô.

O HC-SR04 trabalha medindo o tempo que uma onda ultrassônica demora para atingir um objeto e voltar. Com esse tempo de ida e volta e a velocidade do som é possível determinar, com auxilio do Julieta a distancia. No sensor, você notará que existem dois cilindros que lembram dois olhos. Um deles é o emissor e o outro o detector.

Características do sensor


Como seu funcionamento se baseia no comportamento de ondas sonoras, o sensor ultrassônico tem algumas limitações. Uma delas é quando mede distancia com objetos angulados, pois quanto mais angulado o objeto esta em relação ao sensor, maior é a dificuldade que a onda ultrassônica tem para retornar ao receptor este efeito ocorre pois objetos muito angulados desviam a trajetória das ondas sonoras. Nota: Mesmo se tratando de ondas sonoras, os ouvidos não são sensíveis a tais ondas pois os sensores trabalham em frequências maiores que a frequência audível.

Detectando Obstáculos


Nesse exemplo iremos simplesmente ler e imprimir os valores do Sensor Ultrassônico para compreender melhor seu funcionamento, para isso vamos usar a biblioteca FalconRobot responsável por obter o tempo de resposta do sensor e calcular a distancia.

Carregue esse código de exemplo para a sua Plataforma Falcon. Para isso, vá em: Arquivo->Exemplos->RoboCore Falcon Robot Library->Exp5_1_DeviatingObstacles ou copie e cole o código de exemplo abaixo.



Após carregar o código para seu robô, abra o Monitor Serial para visualizar a leitura do sensor. Você deve observar uma janela assim:




Exercício: Verificando erros de medição com objetos não perpendiculares.

Para compreender os efeitos que objetos angulados podem causar nas leituras do sensor, faça os seguinte procedimentos a seguir.
Com o robô conectado ao seu computador:
  • Coloque o seu robô sobre sua mesa.
  • Posicione na frente do robô, algum objeto paralelo a mesa. Nessas condições será possível verificar que as leituras do sensor estão corretas, pois será possível verificar que não há grandes variações nas leituras

  • Agora posicione um objeto a frente do sensor com uma angulação maior que 30º com relação a mesa, neste momento quando verificamos as leituras do sensor podemos verificar que as leituras variam muito e portanto o sensor não consegue medir a distância de objetos com muita angulação, resultado dos fenômenos mecânicos que baseiam o funcionamento do sensor.


Agora sabendo como fazer a leitura do sensor ultrassônico é possível programar o robô para evitar colisões assunto que será desenvolvido loga abaixo.

Experimento: Robô Anticolisão.

Sistemas anticolisão são amplamente utilizados hoje em diferentes áreas. Desde o sistema ACAS em aeronaves, que ajudam os pilotos a tomarem ações eficazes para não haver uma colisão entre avião e outros objetos, até sistemas mais simples, encontrados em alguns veículos de passeio. O que esses sistemas tem em comum? A leitura de sensores que auxiliam o usuário ou mesmo fazem com que sejam tomadas atitudes sem a interferência de uma pessoa.
Pensando nisso, este experimento se torna muito interessante, já que vamos fazer com que nosso robô "entenda" o ambiente que está inserido sozinho, e tome ações a partir disso. Atualmente existem competições de robótica onde o robô precisa evacuar uma sala sem ação de humanos, e essa técnica pode ser usada neste caso.

Vamos fazer um exercício mental, pensando qual objetivo queremos alcançar e o que devemos fazer para alcançar esse objetivo. Assim, iremos determinar quais passos devemos trilhar para atingirmos o objetivo do experimento.

Qual objetivo que queremos alcançar ?

Fazer com que o robô ande sem colidir com objetos.

O que devemos fazer para alcançar o objetivo?

Configurar as portas digitais dos motores 1 e 2 e do sensor ultrassonico; fazer a leitura do sensor; e finalmente, acionar os motores, quando a distancia lida pelo sensor for menor que determinada distância.

É claro que em aeronaves e carros existem sensores por toda parte. Em nosso caso iremos fazer algo mais simples, mas muito legal: se houver algum obstáculo na frente do robô, ele deverá tomar uma atitude sozinho. Agora que os passos estão determinados vamos segui-los para desenvolver a programação para o robô anticolisões.

Passo 1:


Configurar as portas digitais dos motores 1 e 2 e do sensor ultrassônico.

Para isso serão utilizadas as funções "FalconRobotMotors", onde é determinado quais pinos da placa Julieta serão usados para os motores, e "FalconRobotDistanceSensor", para o sensor de distância. Como estamos usando funções da biblioteca "FalconRobot.h" não se esqueça de incluí-la também.


Passo 2:


Fazendo a leitura do sensor.

O que devemos ter em mente é que o robô deve atualizar a posição de objetos à sua frente a todo momento e, a partir disso, decidir como acionar os motores. Assim, a primeira coisa que fazemos dentro do void loop é a leitura do sensor ultrassônico HC-SR04 e o armazenamento dessa informação em uma variável. Para a leitura do sensor ultrassônico utilize a função "FalconRobotDistanceSensor".


Passo 3:


Acionar os motores.

Após a leitura do sensores, precisamos determinar uma condição com base nas leituras, para que o robô tome uma decisão. Neste caso, como o propósito é que o robô mude de direção se chegar próximo a objetos, a condição é que se a distância lida for menor que 20cm, devemos parar e girar para um lado (aqui iremos fazer para a direita, mas nada lhe impediria de girar para o outro lado). Para isso, vamos utilizar uma das estruturas condicionais mais usadas, o if ou, em português, "se". Fazendo mais uma vez o exercício mental, o comando dado ao robô deveria ser algo como:


Convertendo o código acima o código seria:



Agora, reúna todas as partes do código e envie-o para a placa:



Resultado esperado:
Com este código o robô de sempre movimentará a direita quando se aproxima a uma distancia menor que 20cm.



Solução de Problemas


Meu robô não está andando no sentido correto!

Inverta a ligação dos motores.

Meu robô não está ligando os motores.

Verifique a chave liga desliga da placa. Verifique também se os motores estão ligados corretamente. Certifique-se se a placa Julieta esta sendo alimentada por alguma fonte externa (pilhas), os motores não serão acionados se a placa for alimentada apenas com a USB.



Para fazer comentários é necessário estar logado. Efetuar login.

Você ainda nao é cadastrado? Cadastre-se agora!


cjmoretti
date Enviado: 2019-10-28 21:01:33
oi!
Terminei de montar meu kit dois problemas como Robô Anticolisão:
a) o exemplo : Library->Exp6_1_DeviatingObstacles
    não existe ( importei corretamente o ZIP ) existe 0 Exp5_1_DeviatigObstacles   é isto ???
b) Carregando o exemplo acima, o robo, não colide mais fica girando... 
     como se estiver sempre um objeto bloquendo o caminho.
     olhando o retorno serial só esta lendo zero, como se tivesse um obstaculo permanente na frente, como faço para corrigir isto?

Giovanni5
date Enviado: 2019-10-29 10:39:41
cjmoretti
Sim, é o exemplo "Exp5_1_DeviatingObstacles", agradecemos pela observação, já corrigimos o texto. Em relação à leitura do sensor ultrassônico, verifique a ligação elétrica do sensor, é possível que os pinos "Trigger" e "Echo" estejam com suas conexões invertidas, resultando na leitura errônea de distância.

caio_evil
date Enviado: 2019-09-09 20:44:02
Boa noite, como eu poderia fazer para usar as portas digitais 5,6,7 e 8, sendo que estas são dos motores?

Giovanni5
date Enviado: 2019-09-10 09:17:44
caio_evil
Para usar as portas 5, 6, 7 e 8 da Julieta sem acionar os motores, é necessário remover os jumpers que estão conectados na placa. Após a remoção o sistema de controle dos motores será desativado para usar as portas normalmente.

caio_evil
date Enviado: 2019-09-10 22:54:02
caio_evil
Não sei se entendi direito... Vou explicar melhor, estou fazendo um projeto que vai utilizar muitas portas digitais e os motores, mas de alguma forma não estou conseguindo pegar as informações das portas 5 , 6, 7, 8. Há algum jeito que eu possa usar as portas digitais sem ter que deixar os motores de lado?

Giovanni5
date Enviado: 2019-09-17 15:04:19
caio_evil
Infelizmente não é possível realizar leituras pelas mesmas portas digitais que estão sendo utilizadas para controle dos motores.

pedroduraesufsj
date Enviado: 2018-10-02 15:12:12
Possuo o Motor Driver 2x2A. Posso usar o código acima nesse shild que dará certo?

Francois
date Enviado: 2018-10-02 16:12:04
pedroduraesufsj
Como o Motor Driver 2x2A usa os mesmos pinos que a Julieta para controlar os motores, você pode usar o mesmo código.

MrScoundrel
date Enviado: 2017-10-24 12:18:38
Finalizei o projeto anti colisão porem as vezes o carrinho colide e nao desvia o que pode ser?

MrScoundrel
date Enviado: 2017-10-24 12:30:33
MrScoundrel
Aumentei a distancia do Sensor resolveu!

MarceloFarias
date Enviado: 2017-10-24 13:45:55
MrScoundrel
Pode ser o tempo com que ele desacelera. Para velocidades um pouco mais altas, ele pode levar muito tempo para para completamente e acaba colidindo. Fora isso, observe também o ângulo entre o sensor e o obstáculo a ser detectado, o funcionamento do sensor é ótimo quando ele está perpendicular ao obstáculo.

cristiane2002
date Enviado: 2017-09-16 20:24:08
os valores do monitor serial estão dando 0 ,o que faço?

ViniDj
date Enviado: 2017-09-17 13:10:25
cristiane2002
Talvez a ligação do sensor esteja errada. Sugiro revisar as ligações antes de continuar os testes.

MrScoundrel
date Enviado: 2017-10-24 12:17:15
cristiane2002
Tive o mesmo problema, Verifiquei que as entradas do sensor (GND, Echo, Trig e Vcc) veem invertidas do tutorial, Coloquei corretamente funcionou.

iristardijo
date Enviado: 2017-08-08 20:03:55
o passo 2 esta dando errado oque eu posso fazer fala que e 
nessa parte: distance = distanceSensor.read();
}
me ajuda por favor

iristardijo
date Enviado: 2017-08-08 20:05:44
iristardijo
e o robô esta andando meio torto

MarceloFarias
date Enviado: 2017-08-09 09:47:54
iristardijo
Na verdade o correto seria: 

Acabamos de corrigir isso no tutorial!

MarceloFarias
date Enviado: 2017-08-09 09:53:17
iristardijo
Isso é muito comum para todos os robôs que possuem rodas motoras independentes. Existem muitas razões para isso, construção do próprio motor, pequena diferença no diâmetro das rodas, etc. Veja abaixo algumas coisas que você pode fazer para diminuir essa diferença:
Verifique se não tem nada raspando na roda do robô. Observe se a parte interna da roda não está tocando o chassi. Se isso for verdade, tente deixar uma pequena distância entre a roda e o chassi, apenas o suficiente para que eles não se toquem mais.
Para seguir em linha reta, é necessário que as duas rodas girem exatamente na mesma velocidade. Entretanto, girando os motores na velocidade máxima, pode ser que as rodas derrapem, perdendo tração. Portanto, tente utilizar uma velocidade menor que 100%.
Usar um encoder seria uma maneira de garantir que as duas rodas girem exatamente a mesma distância. Esse conceito não será abordado nessa apostila, mas você pode buscar maiores informações sobre o assunto.