Fluxogramas do carro
De forma a conceber um LED que pisque a uma frequência de 1 Hz, implementámos no nosso código uma interrupção que liga e desliga o LED de acordo com a frequência pretendida.

Figura 15 - Fluxograma da interrupção do LED de 1 Hz
Decidimos incorporar um sensor de luz (LDR) que ligasse LEDs de acordo com a luminosidade do ambiente onde se encontra, para tal desenvolvemos duas funções: uma para ligar e desligar o LED de acordo registado pelo LDR e outra que regista ditos valores.
Implementámos também uma interrupção de forma que o sensor esteja constantemente a fazer novas leituras.
Como podemos observar pelo fluxograma abaixo, a função começa por selecionar o ADC a utilizar (no caso ADC5), lendo o seu valor e testando de seguida se a leitura terminou.
Caso tenha terminado, coloca o valor presente em ADCH numa variável e retorna esse valor. Caso contrário volta a testar se a leitura foi terminada.

Figura 16 - Fluxograma da função ler_ADC
Já neste segundo fluxograma apresentado, podemos observar o funcionamento da função principal do sensor de luz.
A função começa por fazer a leitura do valor a comparar atrás da função anterior (ler_ADC), verificando de seguida se esse valor é menor ou igual a 80.
Se for, acende o LED, se não for menor ou igual a 80, desliga o LED.

Figura 17 - Fluxograma da função do sensor de luz
Para a interrupção, temos um fluxograma bastante simples pois é apenas necessário chamar a função (sensor_luz) criada anteriormente.

Figura 18 - Fluxograma da interrupção do sensor de luz
Para movimentar o nosso carro, desenvolvemos uma função que recebe um valor e procura um caso correspondente a mesma.
Cada caso controla o sentido e a velocidade de cada motor.

Figura 19 - Fluxograma da função do motor
De modo a controlar o carro desenvolvemos uma aplicação Android, que tem um funcionamento relativamente parecido com o do motor, mas neste caso envia os valores de acordo com o botão pressionado ("TouchDown") e que para o carro quando o botão deixa de ser pressionado ("TouchUp").

Figura 20 - Fluxograma da função da aplicação Bluetooth
A aplicação também funciona com controlo por voz, apresentando um funcionamento idêntico quando enunciados os comandos e tem o seguinte aspecto:

Figura 21 - Aplicação Android desenvolvida

Figura 22 - Código da aplicação Android desenvolvida
A função main() começa por executar a função init(), inicializando os portes para os motores (PORTD), para o sensor de luz (PORTC), para o LED de 1Hz (PORTB) e para o módulo Bluetooth.
De seguida, entra num ciclo infinito onde são registados os valores provenientes da aplicação móvel, executando de seguida a fun¸ão que contra os motores.

Figura 23 - Fluxograma da função Main
Configurações
Inicialização do PortD, tudo como saídas, mas inicialmente desativadas.

Figura 24
Inicialização do PortB, tudo como saídas, menos o PortB0, pois servia como entrada para o sensor de proximidade.

Figura 25
Inicialização do PortC, para leitura dos ADC0 a ADC5.

Figura 26
Inicialização do Timer/Counter0 que servirá como interrupção para o sensor de luz LDR. O Timer está configurado para modo Normal e com um Prescaler de 1024, tendo também a flag de overflow ativa.

Figura 27
Inicialização do Timer/Counter1 que servirá como interrupção para o led de 1Hz. O Timer está configurado para modo CTC e com um Prescaler de 256, tendo o OCR1A ativo.

Figura 28
Inicialização do Timer/Counter2 que servirá para atribuir velocidades aos motores DC. O Timer está configurado para modo PWM Phase Correct e com um Prescaler de 64, tendo o OCR2A e OCR2B ativos.

Figura 29
Inicialização da USART no modo assíncrono, com uma resolução de 8 bits, velocidade de transmissão normal, bit paridade desativado, 1 bit stop, com a flag RXC0 ativa e com a transmissão e receção dos dados ativa.

Figura 30
Inicialização do comparador analógico ADC, com o AREF como tensão de referência, com resolução de 8 bits e os dados ajustados à esquerda, a não começar a converter e, por fim, um fator de divisão de 128.

Figura 31
Para habilitar todas as interrupções, utilizamos a função sei().
|