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

 

Distância (cm)

Tensão (V)

BinVal

8

2,65

135

9

2,54

130

10

2,39

122

11

2,21

113

12

2,05

105

13

1,9

97

14

1,78

91

15

1,67

85

16

1,59

81

17

1,51

77

18

1,44

73

19

1,33

68

20

1,27

65

21

1,2

61

22

1,16

59

23

1,11

57

24

1,06

54

25

1,03

53

26

0,99

50

27

0,95

48

28

0,93

47

29

0,89

45

30

0,87

44

31

0,87

44

32

0,82

42

33

0,78

40

34

0,78

40

35

0,76

39

36

0,74

38

37

0,72

37

38

0,71

36

39

0,68

35

40

0,65

33

41

0,64

33

42

0,64

33

43

0,63

32

44

0,62

32

45

0,61

31

46

0,6

31

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.