Kit Iniciante Robótica - 9. Robô Anticolisão
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.
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.
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:
Com o robô conectado ao seu computador:
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.
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.
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".
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.
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.
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.