AGV - Seguidor de Linha com controlo PID




LABSI

2019


Autores:


Simão Silva (Nº 1161849)

1161849@isep.ipp.pt


Artur Shupa (Nº 1171070)

1171070@isep.ipp.pt


Introdução

Arquitetura

Hardware

Software

Resultados

Conclusões

Referências


  • Introdução

Início



Objetivo

Como projeto da cadeira Laboratório de Sistemas, propusemo-nos à construção de um veículo autónomo (AGV - Automatic Guided Vehicle).

O projeto irá ter diferentes etapas como a escolha do material adequado às nossas necessidades (motores, microcontrolador, sensores etc…), a construção mecânica do veículo, criação e implementação do Software (em linguagem C), criação do relatório onde indique o progresso efetuado no trabalho, contendo os esquemas elétricos, fluxogramas, o desenho da placa de circuito impresso (PCB – Printed Circuit Board) , descrição do projeto e melhorias a serem implementadas.

Estado da Arte

O objetivo de um Estado de Arte é apresentar o mais alto nível de desenvolvimento de uma determinada temática.

Relativamente aos AGV, as empresas atualmente têm muito interesse em reduzir os seus custos, e procuram soluções que permitam agilizar o trabalho. Neste sentido, a procura por veículos autónomos e a crescente aposta em tecnologias de navegação cresceu bastante, devido às vantagens inerentes a estes sistemas. Estes veículos não necessitam de tripulante, podem operar remotamente, facilitam o transporte de mercadorias pesadas, de formar geral são mais rápidos e seguros, aumentando a produtividade da empresa.

Estes veículos podem operar em diferentes tipos de seguimento de caminho: Dinâmico e Fixo.

A opção recaiu sobre um seguimento fixo, no caso, um seguidor de linha, como ilustrado:


Figura 1 - AGV Seguidor de linha



  • Arquitetura

Início



De forma a sintetizar e facilitar a interpretação, no seguinte diagrama de blocos é apresentado o funcionamento do sistema:


Figura 2 - Diagrama de Blocos do Sistema

A interação com o carro é feita através de uma aplicação, ligada por Bluetooth, com interface gráfica do utilizador (GUI). Através da aplicação é feito o controlo de todo o carro, como por exemplo escolher entre o modo seguidor de linha ou o modo Controlo Remoto.  A informação enviada por Bluetooth é recebida no microcontrolador, que processa todos os dados e atua nos motores em conformidade com o modo escolhido.


  • Hardware

Início



Neste capitulo são apresentados os componentes usados no projeto, bem como o circuito elétrico com a respetiva descrição, e a placa de circuito impresso.

Microcontrolador


Figura 3 - Microcontrolador Atmega328

É utilizado o microcontrolador ATmega328, de 8 bits, por ter as capacidades necessárias para implementar este trabalho.

O projeto faz uso de cinco entradas ADC (Analog Digital Converter) para os sensores óticos, comunicação USART (Universal Synchronous Asynchronous Receiver Transmitter), um Cristal Oscilador para que a frequência do Clock seja 16MHz, dois timers, Timer 0 (modo CTC) para o sistema mínimo (controlo do LED) e Timer 2 (modo FAST PWM) para gerar o sinal PWM para atuar nos motores.


Ponte H


Figura 4 - Ponte H

O L293D é um chip capaz de controlar dois motores, até 600mA por canal. A gama de alimentação varia entre 4,5 até 36V. Tem duas entradas de alimentação e quatro saídas de controlo. Foi escolhido por ser característico neste tipo de aplicações, por ser de simples utilização, tendo também dimensões pequenas, facilitando a organização do circuito elétrico.


Motores DC


Figura 5 - Motor DC

Para movimentar o carro são utilizados dois motores de corrente continua, com tensão de alimentação variável (3V-6V), caixa de redução (1:48) e um peso total, com roda, de cerca de 80g. São alimentados a 6V e sem carga consomem cerca de 200mA, não ultrapassando o máximo do Driver de potência.


Bateria


Figura 6 - Baterias 18650

Como alimentação do projeto, foram escolhidas duas pilhas recarregáveis 18650 de Lítio da Samsung, em série, conseguindo uma tensão total de 8.4V e 2600mAh. Esta opção deve-se ao facto destas pilhas permitirem obter uma boa autonomia, serem mais leves que pilhas tradicionais e terem capacidade de alimentar tanto o circuito de controlo (microcontrolador), como o circuito de potencia (Motores DC), tornando-se ideais para o projeto.


Regulador de Tensão


Figura 7 - Regulador LM7805

O LM7805 é um componente que permite regular a tensão de entrada, entre 7 e 20V, para uma tensão de saída estável de 5V e corrente máxima de 1 A. É utilizado para a alimentação de todo o circuito lógico.


Módulo Bluetooth


Figura 8 - Módulo HC-05

Para existir comunicação via Bluetooth, optou-se pelo módulo HC-05, alimentado com tensão DC de 5V, capaz de manter uma comunicação sem fios até cerca de 10 metros, podendo também funcionar como escravo ou mestre.


Sensor Ótico


Figura 9 - Sensor Ótico CNY70

O sensor ótico escolhido foi o CNY70, tem como princípio de funcionamento a propagação/reflexão da luz e é utilizado para detetar a linha preta da pista, onde há absorção da luz, do restante circuito que é branco e a reflexão é máxima.

Este sensor já tem emissor e recetor no mesmo componente, sendo necessário dimensionar as resistências que integram o circuito, uma vez que irá ser ligado a entradas analógicas do microcontrolador.

Foi também optado por montar cinco sensores óticos, em linha, como ilustrado na seguinte figura, de modo a permitir fazer um controlo de trajetória através de um algoritmo PID, permitindo obter movimentos mais suaves durante o modo seguidor de linha.


Figura 10 - Disposição dos Sensores


Esquema Elétrico

Na seguinte figura é apresentado o esquema elétrico total do circuito, numerado em 5 secções que são descritas de forma mais detalhada.


Figura 11 - Esquema Elétrico

Secção 1

Circuito que integra o regulador de tensão, regulador este que é alimentado pela tensão das baterias de cerca de 8,4V, obtendo 5V constantes à saída. Para ajudar na estabilização da tensão de saída, foram adicionados dois condensadores (0,33uF e 0,1uF) o mais próximo possível do LM7805, como recomendado pelo fabricante.

 

Secção 2

Considerado como circuito principal, o microcontrolador Atmega328 é responsável por tomar todas as decisões no veículo. É alimentado pelo regulador LM7805 no pino 7, com 5V DC, e conectado à massa pelos pinos 8 e 22.

 Funciona a uma frequência de 16Mhz e para tal tem ligado um oscilador entre os pinos XLAT1 e XLAT2. Os condensadores C3 e C4 ligados nesses pinos permitem o correto funcionamento do cristal oscilador, sendo ambos de 22pF.


É ainda adicionado um outro condensador, C5, entre o pino ARef e a massa, de modo a diminuir as oscilações de tensão durante as conversões analógicas.

No pino de Reset existe uma resistência de pull-up de 10kΩ conectada aos 5V, esta resistência tem como função prevenir que o micro faça Reset inesperadamente.

No Porto PD7 está conectado o LED Verde que pisca a uma frequência de 1Hz, em série com uma resistência de 330Ω, pois um LED verde tem uma queda de tensão de cerca de 2V e uma corrente máxima de 20mA, logo inserindo a resistência limitamos a corrente para 10mA.
No Porto PD3 e PB3 estão as saídas PWM do Timer2 que controlam as velocidades dos motores.
No Porto PD2 e PD4 estão as saídas responsáveis por atuar no sentido de rotação do motor do lado direito, enquanto que no porto PB1 e PB2 estão as saídas responsáveis do sentido de rotação do motor do lado esquerdo.

Nos pinos 23 a 27 (ADMUX 0 a 4), correspondentes às entradas analógicas provenientes dos sensores óticos, estão ainda conectadas resistências de 10kΩ para garantir uma correta leitura dos valores da pista.

 

Secção 3

Nesta secção está presente o Driver de potência L293DNE que atua nos motores.
É alimentado com 5V para o seu funcionamento, através do pino 16 (+V), mas disponibiliza uma tensão diferente para os motores, pois no pino 8 (+Vmotor) recebe alimentação diretamente das baterias que fornece posteriormente aos motores, tenho uma queda interna de cerca de 2V, logo dos 8,4V das baterias apenas 6V, sensivelmente, alimentam os motores, não sendo necessária uma retificação da tensão.

Os motores estão ligados nos pinos OUT 1,2 (motor direito) e OUT 3,4 (motor esquerdo) e o sentido de rotação (horário e anti-horário) é selecionado pelo microcontrolador, colocando um valor lógico nos pinos IN 1,2 e IN 3,4.

Para o controlo de velocidade, são colocados os sinais PWM provenientes do microcontrolador nos pinos ENABLE 1 e 2, habilitando o respetivo motor à frequência desejada, controlado o Duty Cicle da onda e consequentemente a velocidade dos motores.

 

Secção 4

Representa o circuito do Bluetooth, onde o módulo HC-05 é alimentado com 5V DC, e os pinos de receção e transmissão, RX e TX, são ligados aos pinos TX e RX do microcontrolador, respetivamente. No entanto é aconselhado nas especificações do fabricante que a tensão lógica no pino RX do módulo Bluetooth seja de 3,3V, mas a tensão no pino TX do microcontrolador é de 5V, logo para colmatar tal situação, é efetuado um divisor de tensão com resistências de 2kΩ e 1kΩ, permitindo obter a tensão desejada de 3,3V.

 

 

 

Secção 5

Corresponde à ligação dos sensores óticos, composta por resistências de 150Ω com a finalidade de limitar a corrente, sendo que com estas resistências obtemos uma corrente de 33mA, que é inferior à corrente máxima de 50mA dos sensores. A leitura dos valores está a ser feita de forma analógica e o esquema de montagem pode ser percebido melhor na seguinte figura:


Figura 12 - Esquema de ligação do Sensor

Por fim foi feito o esquema do PCB, obtendo a seguinte placa:


Figura 13 - Placa de Circuito Impresso


  • Software

Início




Fluxogramas

Com o auxílio a fluxogramas é explicado em detalhe o funcionamento do software.

O ATMEGA corre num ciclo infinito e toma decisões de acordo com a informação recebida pela interrupção da receção do Bluetooth. A comunicação é feita a 9600bps e permite então selecionar o funcionamento do carro, como é demonstrado no fluxograma seguinte:


Figura 14 - Fluxograma Principal

Para enviar os dados de controlo, foi desenvolvida a seguinte aplicação Android


Figura 15 - Aplicação Android

Onde as setas permitem controlar o carro remotamente, ao serem pressionadas (“Touch Down”) enviam o caracter de controlo respetivo ao movimento do carro, e ao serem libertadas (“Touch Up”) enviam o caracter “s”, que para o movimento. O funcionamento do Controlo Remoto é descrito no próximo fluxograma:


Figura 16 - Fluxograma do Controlo Remoto

Caso seja pressionado o botão de START na aplicação, o carro entra então no modo seguidor de linha, demonstrado no próximo fluxograma:


Figura 17 - Fluxograma do Seguidor de Linha

Primeiramente efetua uma simples leitura dos sensores, recorrendo a uma função que dá inicio à conversão analógica para o ADC0, depois desta conversão acabar, guarda o valor lido na respetiva variável do sensor, incrementa o registo ADMUX (para ler o valor do próximo sensor), inicia uma nova conversão analógica, e repete o mesmo procedimento para todos os sensores, tomando depois as decisões.

Se o modo for igual a 1, então é o fim da pista e o carro deverá parar, mas caso o modo seja igual a 2, o carro está ainda na linha preta e irá efetuar um controlo PID de modo a seguir a mesma.

O controlo PID pode ser entendido melhor no seguinte gráfico:


Figura 18 - Representação do PID

O trajeto ideal será o carro centrado na linha, logo o erro quando apenas o sensor do meio deteta o preto, é 0. No entanto o carro pode sofrer desvios laterais, e a cada desvio (para a esquerda e para a direita) está associado um sinal de erro, positivo e negativo. Quanto maior for o desvio, mais afastado está o carro da linha e por isso, maior será o valor do erro.

O objetivo do controlo PID é tentar obter sempre um erro de 0 e consoante o erro que se faz sentir no momento, é feito o ajuste aos valores PWM enviados a cada motor, como ilustrado na figura anterior.

O cálculo do valor de PID e da velocidade que deverá estar presente em cada motor pode ser consultado recorrendo ao próximo fluxograma:


Figura 19 - Fluxograma do PID

Os valores relativos aos ganhos Kp, Ki e Kd são valores que foram descobertos de forma experimental para a pista em questão, e são os parâmetros que definem o controlo PID, sendo que cada ganho é responsável por determinadas alterações ao controlo, listadas na tabela seguinte:


Tabela 1 - Influência dos Parâmetros

No caso em concreto estão a ser utilizados só valores de Kp e Kd, sendo feito um controlo apenas PD.

Através da aplicação é ainda possível calibrar os sensores de moto a encontrar um valor para a cor preta correspondente à linha da pista, através do botão “Calibrar” e é também possível alterar os valores de Kp, Ki, Kd, entrando no modo de PID Tuning, pressionando o botão “Iniciar”. Ao clicar nos botões para enviar os valores dos parâmetros, a aplicação converte a string, que se encontra na caixa de texto, para um valor numérico, enviando depois ao microcontrolador que guarda os valores nas respetivas variáveis. Os processos descritos anteriormente estão explícitos no fluxograma que se segue:


Figura 20 - Fluxogramas de Controlo

Por fim, o ATMEGA está a funcionar com duas interrupções (USART e TIMER0) ativas, que podem ser descritas na seguinte figura:


Figura 20 - Fluxogramas de Interrupções


Configurações

Timer0

De modo a obter uma temporização de 10ms, de acordo com a equação 1, o valor do OCR0 foi definido como 156, utilizando um Prescaler de 1024.

$$Tempo = {{Prescaler \over F_Clock} \times (OCR0 + 1)}$$


Equação 1



TCCR0A


Tabela 2 - Registo TCCR0A

TCCR0B


Tabela 3 - Registo TCCR0B

TIMSK0


Tabela 4 - Registo TIMSK0

  • No registo TCCR0A os bits 7,6,5 e 4 estão a 0 para selecionar o modo “Normal” com “0C0A” e “0C0B” desconectados.
  • Para escolher o modo 2(CTC) o bit 1 e 0 do registo TCCR0A devem ficar com o valor 1 e 0, juntamente com o bit 3 do TCCR0B a 0.
  • No registo TCCR0B os bits 0, 1 e 2 devem ficar a 1, 0, 1 para obter o Prescaler de 1024.
  • O bit 1 do registo TIMSK0 habilita a interrupção do Timer0. Quando ocorre um “Compare Match” o programa executa o código que está na respetiva interrupção.



Timer2

De modo a obter uma frequência de 244Hz, de acordo com a equação 2, selecionou-se um Prescaler de 256.

$$FreqPWM = {F_Clock \over {Prescaler \times 256}}$$


Equação 2



TCCR2A


Tabela 5 - Registo TCCR2A

TCCR2B


Tabela 6 - Registo TCCR2B

  • Os bits 1 e 0 com os valores 1, 1 do registo TCCR2A, juntamente com o bit 3 a 0 do registo TCCR2B permitem escolher o modo Fast PWM do Timer2.
  • No TCCR2A os bits 7 e 5 têm o valor lógico 1 e os bits 6 e 4 têm o valor lógico 0 para gerar o sinal PWM nos pinos de saída A (PB3) e B (PD3).
  • Os bits 2,1 e 0 do TCCR2B selecionam o Prescaler de 256.



ADC

O ADC está a trabalhar a uma frequência de 125KHz, calculada pela equação 3, cumprindo o requisito pedido pelo fabricante de estar entre 50KHz e 200KHz, de modo a obter valores corretos na conversão.

$$FreqADC = {F_Clock \over Fator Divisao}$$


Equação 3



ADMUX


Tabela 7 - Registo ADMUX

ADCSRA


Tabela 8 - Registo ADCSRA

  • Os bits 7 e 6 do ADMUX a 0 e 1 ativam o AVcc externo, com condensador.
  • O bit do ADLAR tem o valor logico 1, ajustando o valor da conversão à esquerda, utilizando apenas 8 bits do ADC.
  • Os bits 3,2,1 e 0 definem inicialmente o ADC0 como entrada analógica.
  • O bit ADEN ativa o ADC.
  • O bit ADSC inicia a conversão.
  • Ao colocar os três bits menos significativos, do registo ADCSRA, todos a 1 consegue-se obter um fator de divisão igual a 128.



USART

UCSR0B


Tabela 9 - Registo UCSR0B

UCSR0C


Tabela 10 - Registo UCSR0C

  • O bit RXCIE0 habilita a interrupção na receção, que só vai estar completa quando RXCIE0 SREG e RXC0 estiverem a 1.
  • RXEN0 e TXEN0 tomam valor logico 1 para ativar a receção e transmissão.
  • O bit 3 permite obter 2 stop bits.
  • O bit 2 do registo UCSR0B e os bits 2 e 1 do registo UCSR0C estão a 0, 1 e 1 para definir o tamanho do caracter (8-bit).


  • Resultados

Início

No seguinte video é possivel visualizar o carro em seguidor de linha, onde é perceptível o controlo PID a funcionar, tentando sempre minimizar o erro e colocar o carro numa trajectorio reta.     








  • Conclusões

Início



Como reflexão final, pode-se afirmar que os objetivos propostos no início do projeto foram cumpridos, e sentimo-nos contentes com o resultado. No entanto, sabemos que existem ainda melhorias que podem ser implementadas e que trariam maior valor ao trabalho.

Tivemos também algumas dificuldades na execução do projeto, principalmente a nível mecânico, uma vez que a roda omnidirecional nem sempre cumpre a trajetória correta, aplicando algum atrito no movimento do carro, dificultando o ajuste PID, e os motores utilizados poderiam ser outros, com maior binário, permitindo circular a velocidades baixas, mas não perder a “força” em algumas zonas do circuito.

Tentamos também colocar o peso bem distribuído, centramos as baterias e a breadboard foi colocada na horizontal, para diminuir os desvios e equilibrar o carro.

A nível de software, tentou-se criar um código limpo e de fácil perceção, dividindo as tarefas a serem executadas por funções, e comentando o código, até porque torna o “debugging” mais simples. Decidiu-se também trabalhar a 16MHz com o microcontrolador no sentido de agilizar e tornar as leituras mais rápidas, permitindo uma maior fluidez de ações.

Como melhorias, poderia ter sido implementado a placa de circuito impresso fisicamente, e eventualmente adicionar um sensor SONAR para tornar o projeto mais versátil, fazendo com que o carro parasse de forma autónoma sempre que estivesse a 15cm de um objeto frontal, no entanto o tempo para aplicar tais mudanças foi escasso.


  • Referências

Início



[1] LABSI - Nuno Dias & Guilherme Amaral, Eletrónica Geral;

[2] LABSI - Nuno Dias, Sensores;

[3] LABSI - Ramiro Barbosa, Controlo Digital;

[4] MICMIC - Lino Figueiredo, Apontamentos Teóricos;

[5] ATMEL - ATmega328 Datasheet: https://octopart.com/atmega328-pu-microchip-77760210;

[6] Eletrofun - Componentes: https://www.electrofun.pt/;