esquiva-obstaculos

Nesta entrada vamos explicar como programar um esquiva obstáculos. Se tens um robot com um sensor de ultrassons e um minisservo que o possa mover, poderás programa-lo desta forma. O PrintBot Evolution é uma ferramenta perfeita para realizar esta programação.

Ostacle_avoid Brincar com o fogo é perigoso! Mesmo que o nosso robot tenha uma fantástica pele de dragão, o que ele vai fazer é tentar não chocar e esquivar-se dos objetos que encontre no seu caminho.

Como funciona o esquiva-obstáculos?


Existem muitas formas de programar um robot para que esquive obstáculos, mas vamos explicar-te o funcionamento de uma delas. Estas são as tarefas que o robot deve fazer:

  1. Tirar medidas
  2. Confirmar a detecção de um obstáculo
  3. Executar o movimento correcto

Vejamos em detalhe cada uma destas tarefas:

1) Tirar medidas com o sensor de ultrassons

Em primeiro lugar tiramos 3 medidas com o sensor de ultrassons: esquerda, centro e direita.

beep-1 beep-2 beep-3

O que estamos a medir é a distância até qualquer objeto que apareça diante do sensor, portanto bastará ir alterando a posição do sensor, tal como quando giramos a cabeça para olhar para um lado e para o outro. Esta mudança de orientação pode ser feita com um minisservo.

2) Confirmar a detecção de obstáculos para saber como actuar

beep

Se não houver nenhum obstáculo a menos de 25 cm diante do robot, faremos soar um apito Beep e podemos avançar em frente.

beep-meec_err

Se existir um obstáculo a menos de 25 cm, soará um apito de erro Meec. Neste caso temos que confirmar se podemos esquivá-lo por algum dos lados.

beep-meec

Primeiro confirmamos se podemos esquivar pela esquerda. Se não houver nenhum obstáculo a menos de 25 cm por este lado, poderemos girar à esquerda.

mec-mec-beep

Se não puder pela esquerda, confirmamos se é possível esquivar pela direita.

Mas… O que acontece se as três direcções estiverem bloqueadas?

Faremos soar um aviso Meeec meec Sou um robot queixinhas! Por aqui não se pode avançar!

E dado que está encurralado, devemos fazer retroceder o robot e logo de seguida fazer com que mude de rumo, por exemplo que gire à esquerda.

r_Meec-meec-meec

3) Executar o movimento correcto

Neste último passo, apenas teremos que mover as rodas do robot para que descreva a trajectória decidida no passo anterior. Prego a fundo!

ostacle_avoid_3

Programar no bitbloq para o PrintBot Evolution


Vamos usar o bitbloq para fazer este programa. Tomaremos como referência as conexões que se propõem no guia de montagem do PrintBot Evolution. Se é a primeira vez que utilizas este tipo de componentes electrónicos, podes ver clicando aqui os primeiros passos antes de começar a programação.

Para começar, declaramos as variáveis que necessitamos:

As variáveis obs_Esq, obs_Ctr e obs_Dir vão ser utilizadas para guardar um 1 ou um 0 se for detectado um obstáculo à esquerda, à direita ou em frente respectivamente. Um 1 significa um obstáculo nessa direcção.

As variáveis angulo_Esq, angulo_Ctr e angulo_Dir guardam as posiciones do minisservo para que os olhos do robot olhem para a esquerda, para a direita ou para o centro. Lembra-te que ao comandares o minisservo para que se mova para um determinado ângulo, o que fazemos é girar e orientar o sensor ultrassons.

Uma vez definidas as variáveis, vamos começar a programar o ciclo do programa que se repetirá uma e outra vez. A primeira coisa a fazer é que o robot pare. Vamos fazer isso com a função Stop:

obst_bit_1

As 3 medidas que falámos, podem ser programadas desta forma:

A função procurar_obstaculo é a detective dos obstáculos. Tem como parâmetro de entrada, um ângulo, e de saída será um 1 ou um 0. Esta função programa-se assim no bitbloq:

Como vês, ela primeiro move o minisservo até esse ângulo de entrada, e depois usa o bloco do sensor de ultrassons para medir a distância (em centímetros) e por último, o bloco verde de comparação:

Se a distância medida pelo sensor for menor que 25cm … então reproduz um som de erro com o buzzer e devolve um 1Existe um obstáculo!

Senão soa um apito agudo com o buzzer… beep … que indica zona segura. Devolverá neste caso um 0É seguro! Pode seguir!

Agora vem a escolha de como deve actuar o robot conforme os obstáculos detectados. Como reagir? Já explicámos anteriormente as 4 possibilidades. Aqui está como se programam com os blocos no bitbloq:

Apenas nos falta definir como são essas funções de movimento que vamos executar. Para fazer avançar o robot usamos a função chamada em_frente:

Esta função faz soar uns apitos com o buzzer, avisando quando o caminho está livre. A seguir, move as duas rodas com os servos de rotação contínua: o servo esquerdo (pino 8) gira no sentido horário e o servo direito (pino 9) gira no sentido anti-horário. [Nota: O sentido de giro pode ver-se olhando para as rodas a partir do centro do robot]

Para fazer girar o robot, usamos as funções chamadas virar_esquerda se girar para a esquerda e virar_direita se girar para a direita. Para parar o robot, usamos a função chamada stop que também usámos no principio:

printbot_evolution_virardireitaprintbot_evolution_stop

Por último, para fazer recuar o robot usamos a função chamada marcha_atras:

Esta função é muito grande porque faz três coisas:

– Emitir uns divertidos sons de erro Oh oh oohh! Estou encurralado!

– Mover a cabeça-minisservo de um lado para o outro – Não não nãoo! Estou confuso!

– Retroceder movendo os servos de rotação contínua – Para trás!

Este seria o programa completo:

Aqui está o programa completo! Mas… lembra-te que esta é apenas uma forma simples de programar um esquiva-obstáculos! Existem varias coisas que se podem melhorar: aumentar a velocidade, tirar mais medidas para não deixar obstáculos sem serem detectados, ou por exemplo, uma alteração na prioridade das acções (nem sempre é melhor avançar e girar à esquerda).

Atreves-te a melhorar este código?! Bora lá!