Sensores
de Obstáculos laterais
Para
detectar as paredes laterais, foram usados sensores Sharp GP2D12, com saída
analógica.

Estes
sensores utilizam uma técnica de cálculo da distância por triangulação. Um
pequeno CCD está colocado a 3/4' do emissor IR. O ângulo de recepção do
sinal depende da distância ao objecto.
Estes
sensores IR podem medir distâncias entre 10cm e 80 cm, fornecendo uma tensão
entre 2,45V e 0,45V. A curva experimental é do tipo Y = A . x-k .

Utilizando
o conversor analógico/digital do microcontrolador, iremos ligar os dois
sensores aos pinos analógicos do porto A (pinos a0 e a1). Para simplificar o
circuito, iremos apenas usar como tensão de referência os 5 V da alimentação
(5V correspondem a 256 níveis)- isso reduz a precisão da leitura mas evita ter
que arranjar uma tensão de referência de 2,5 V. (ver tabela em anexo).
Tabela e Gráfico experimentais
|
|
Programação dos Sensores
Assim, na
programação, temos que definir os pinos de entrada (input)
pin_a0_direction
= input -- entrada analógica RA0/AN0 do conversor A/D
pin_a1_direction
= input -- entrada analógica RA1/AN1 do conversor A/D
A
parametrização do conversor A/D obtém-se do seguinte modo:
procedure
ch0_on is
--
activa a leitura do pino a0
f877_adcon0
= 0b_0100_0001
-- fosc/8, a0, ad on
end
procedure
procedure
ch1_on is
--
activa a leitura do pino a1
f877_adcon0
= 0b_0100_1001
-- fosc/8, a1, ad on
end
procedure
procedure
ad8_noref is
bank_1
f877_adcon1 = 0b_0000_0000
-- todas as entradas analógicas.
-- 8 msbits do resultado em ADRESH.
bank_0
end
procedure
procedure
ch_write is
delay_10uS ( 2 )
-- espera tempo mínimo de aquisição
adcon0_go = high
-- inicia conversão A/D
while adcon0_go loop
end loop
-- espera pelo fim da conversão
-- (adcon0_go = 0)
-- os 8 bits mais significativos do
-- resultado (10 bits) ficam em adresh
ch_hi
= f877_adresh
-- guarda valor conversão em ch_hi
end procedure
Por exemplo, para detectar se há parede do lado esquerdo - sensor
ligado supostamente ao pino a1 - poderemos escrever o seguinte código:
Definição
de variáveis
var byte
limiar = 45
-- corresponde a distância = 30 cm
var byte
ch_hi = 0
var byte
ch_hi_E = 0
var bit
parede_E
-- 1 significa que há parede
procedure
converter is
ch1_on
-- inicia conversor A/D no ch1
ch_write
-- leitura do resultado
ch_hi_E = ch_hi
-- variável guarda o valor
-- compara com limiar
if (ch_hi_E > limiar - 5) & (ch_hi_E < limiar + 5) then
parede_E
= high
else
parede_E = low
end if
end
procedure
Por exemplo, para acompanhar a parede (distância menor que limiar,
vira para a parede, distância maior que limiar,vira para fora)
o programa seria:
procedure
converter is
ch1_on
-- inicia conversor A/D no ch1
ch_write
-- leitura do resultado
ch_hi_E = ch_hi
-- variável guarda o valor
-- compara com limiar
if (ch_hi_E > limiar + 5) then
parede_E = high
elsif (ch_hi_E < limiar - 5)
parede_E = low
end if
end procedure
-- programa principal
ad8_noref
forever loop
converter
if parede_E == high then
for 100 loop
desviar_da_parede
end loop
else
for 100 loop
aproximar_da_parede
end
loop
end if
end loop
onde
desviar_da_parede e aproximar_da_parede são procedimentos de controlo dos
motores com esse fim.