projeto de robô seguidor de linha com controlador pid

33
Universidade Federal da Bahia Escola Polit ´ ecnica Departamento de Engenharia El ´ etrica Curso de Engenharia El ´ etrica ENGC35 - Modelagem e An ´ alise de Sistemas Din ˆ amicos Projeto de um Rob ˆ o Seguidor de Linha com Controlador PID Ana Tereza Borba Franklin Lima Lucas Santana Salvador - Bahia Novembro de 2015

Upload: franklin-lima

Post on 28-Jan-2016

119 views

Category:

Documents


28 download

DESCRIPTION

Projeto de Robô Seguidor de Linha com Controlador PID

TRANSCRIPT

Page 1: Projeto de Robô Seguidor de Linha com Controlador PID

Universidade Federal da Bahia

Escola Politecnica

Departamento de Engenharia Eletrica

Curso de Engenharia Eletrica

ENGC35 - Modelagem e Analise de Sistemas Dinamicos

Projeto de um Robo Seguidor de Linhacom Controlador PID

Ana Tereza BorbaFranklin LimaLucas Santana

Salvador - Bahia

Novembro de 2015

Page 2: Projeto de Robô Seguidor de Linha com Controlador PID

Projeto de um Robo Seguidor de Linhacom Controlador PID

Ana Tereza Borba

Franklin Lima

Lucas Santana

Trabalho apresentado ao Professor Humberto

Xavier como requisito avaliativo da disciplina

Modelagem e Analise de Sistemas Dinamicos do

curso de Engenharia Eletrica.

Orientador: Prof. Humberto Xavier.

Salvador - Bahia

Novembro de 2015

Page 3: Projeto de Robô Seguidor de Linha com Controlador PID

“A Matematica nao mente. Mente

quem faz mau uso dela”.

Albert Einstein

Page 4: Projeto de Robô Seguidor de Linha com Controlador PID

Resumo

Este projeto tem como finalidade apresentar o estado da arte da criacao de um

prototipo de um robo seguidor de linha para aplicacao dos conceitos de elaboracao de

modelos e determinacao de parametros de controle estudados no curso Modelagem de Sis-

temas Dinamicos ministrada pelo professor Humberto Xavier. Inicialmente apresentam-se

as etapas do projeto, descricao dos modelos utilizados e sao apresentadas tambem as des-

cricoes dos projetos de modo conceitual e posteriormente detalhado.

Page 5: Projeto de Robô Seguidor de Linha com Controlador PID

Sumario

Introducao 1

1 Projeto de Engenharia 3

1.1 Cronograma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

1.2 Orcamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

1.3 Work Breakdown Structure . . . . . . . . . . . . . . . . . . . . . . . . . . 5

1.4 RACI Chart . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

2 Modelo do Sistema 7

2.1 Modelo Cinematico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

2.2 Modelo do Motor DC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

2.2.1 Identificacao dos Parametros . . . . . . . . . . . . . . . . . . . . . . 9

2.3 Modelo dos Sensores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

3 Projeto do Controlador 12

3.1 Projetos Conceitual e Basico . . . . . . . . . . . . . . . . . . . . . . . . . . 13

3.2 Projeto Detalhado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

3.2.1 Parte Mecanica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

3.2.2 Parte Eletrica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

4 Resultados e Conclusoes 18

Referencias Bibliograficas 20

APPENDICES 21

A Prototipo Desenvolvido 21

B Codigo PID do Arduino 23

Page 6: Projeto de Robô Seguidor de Linha com Controlador PID

Introducao

O controle de sistemas tem sido um objeto de estudos cada vez maior da area de en-

genharia. O ser humano tem buscado revolucionar os equipamentos e maquinas de modo

a aperfeicoar o seu funcionamento, tornando-os mais estaveis e suavizando erros. E nesse

contexto que as definicoes de modelagem de sistemas e controle aparecem como protago-

nistas em diversos cursos: Engenharia Eletrica, Eletronica, Mecanica e, principalmente,

Engenharia de Automacao e Controle.

Estudar controladores significa estudar formas de como realizar um processo, en-

tende-lo, elencar ferramentas e parametros para obter o melhor resultado.

Problema proposto

A Figura 1 mostra um veıculo autonomo que deve percorrer uma trajetoria cur-

vilınea. O problema resume-se em manter o carrinho o mais estavel possıvel ao realizar

as curvas da trilha atraves de um sistema de controle que leia a entrada da posicao do

veıculo e retorne uma resposta de alteracao da velocidade dos motores para que o prototipo

retorne ao set point estabelecido.

Sensor de

luminosidade

Veículo

Figura 1: Vista superior do robo sobre a trajetoria

A organizacao do trabalho e a que segue: no Capıtulo 1 sao discutidas as etapas do

projeto, incluindo cronograma, orcamento e distribuicao de atividades entre os integrantes

1

Page 7: Projeto de Robô Seguidor de Linha com Controlador PID

2

do grupo. Seguindo a sequencia, no Capıtulo 2, apresenta-se a modelagem do sistema,

com o detalhamento do modelo cinematico, do motor DC e dos sensores utilizados. O

projeto do controlador pode ser visto no Capıtulo 3 e, por fim, os resultados e conclusoes

sao apesentados no Capıtulo 4.

Page 8: Projeto de Robô Seguidor de Linha com Controlador PID

Capıtulo 1

Projeto de Engenharia

Neste capıtulo serao descritos topicos relativos a engenharia do projeto. Na Secao

1.1 e apresentado o cronograma do projeto, que teve duracao total de 7 semanas, enquanto

na Secao 1.2 e apresentado o orcamento parcial do projeto, omitindo o trabalho laborial,

custo operacional e a utilizacao dos recursos da Universidade. No fim do capıtulo sao

apresentados o WBS e RACI Chart.

1.1 Cronograma

O desenvolvimento deste trabalho seguiu o cronograma que pode ser visto na Ta-

bela 1.1. O inıcio das atividades foi dado como 12/10/2015.

Tabela 1.1: Cronograma das atividades

SemanaEtapa

1 2 3 4 5 6 7

Revisao bibliografica • • •Elaboracao do projeto conceitual •Elaboracao do projeto basico • •Busca de facilitadores e recursos • •Aquisicao de materiais •Identificacao dos parametros do motor •Identificacao do modelo do sensor •Modelagem do sistema • •Testes e Correcoes •Escrita do relatorio •Apresentacao •

3

Page 9: Projeto de Robô Seguidor de Linha com Controlador PID

4

1.2 Orcamento

A Tabela 1.2 mostra os custos na construcao do prototipo, desconsiderando os cus-

tos operacionais e a utilizacao dos recursos da Universidade. Os custos foram embolsados

pelos estudantes.

Tabela 1.2: Orcamento para o projeto

Item Descricao Qtde. Preco Unitario Preco Total

1 Arduino Leonardo 1 R$ 43,99 R$ 43,99

2 Shield L293d Driver Ponte H 1 R$ 22,90 R$ 22,90

3 Chassi + Motor com reducao 1 R$ 46,00 R$ 46,00

5 Sensor CNY70 2 R$ 4,00 R$ 8,00

6 Trimpot 10kΩ 2 R$ 2,50 R$ 5,00

7 Resistor 10kΩ 2 R$ 0,20 R$ 0,40

8 Resistor 100Ω 2 R$ 0,20 R$ 0,40

9 Barra de pinos 2 R$ 2,00 R$ 4,00

10 Jumper 3 R$ 0,30 R$ 0,90

11 Placa de Fenolite 10x10cm 1 R$ 7,75 R$ 7,75

12 Bateria 9V 2 R$ 3,35 R$ 6,70

Total R$ 146,04

Page 10: Projeto de Robô Seguidor de Linha com Controlador PID

5

1.3 Work Breakdown Structure

O diagrama WBS do projeto pode ser visto na Figura 1.1

Robô Seguidor de Trilha com Controlador PID

Do

cu

me

nta

çã

o

Motor DC Sensores Trilha

Modelagem Código

µC - Arduino Chassi

Identificação dos

ParâmetrosPlaca de Interface

Figura 1.1: Diagrama WBS para o projeto

Page 11: Projeto de Robô Seguidor de Linha com Controlador PID

6

1.4 RACI Chart

A matriz de atribuicao de responsabilidade e atividades e mostrada na Tabela 1.3.

Tabela 1.3: RACI Chart para o projeto

Ana

Ter

eza

Fra

nklin

Lim

a

Luca

sSan

tana

Hum

ber

to

Tarefas

1 Revisao bibliografica R R R

2 Elaboracao do projeto conceitual e basico R R R

3 Elaboracao do projeto detalhado R R, A R

4 Busca de facilitadores e recursos R R R C

5 Aquisicao de materiais R

6 Identificacao dos parametros do motor R, A R

7 Identificacao do modelo do sensor R R, A

8 Modelagem do sistema R R R C, I

9 Testes e Correcoes R R R

10 Escrita da documentacao R R, A R I

11 Apresentacao R R R I

Legenda

R Responsavel pela execucao da tarefa. Podem ser uma ou mais pes-

soas designadas a executar a tarefa.

A Prestador de contas. Havera somente uma pessoa designada para

esse papel.

C Consultor da tarefa. Sao pessoas com maior “know how” sobre

determinados assuntos, responsaveis por fornecerem informacoes

uteis para a conclusao da tarefa. A comunicacao com esse grupo

sera de duas vias.

I Pessoas informadas sobre o progresso e status da tarefa. A comu-

nicacao com esse grupo sera de mao unica

Page 12: Projeto de Robô Seguidor de Linha com Controlador PID

Capıtulo 2

Modelo do Sistema

Neste capıtulo serao descritos os modelos do sistema. Na Secao 2.1 sera descrito o

modelo cinematico, mostrando a relacao entre as dimensoes fısicas da trilha e do prototipo

e o seu comportamento dinamico, enquanto na Secao 2.2 e mostrado o modelo do mo-

tor e o procedimento experimental para determinacao dos coeficientes de sua funcao de

transferencia. Por fim, na Secao 2.3, e apresentado o modelo para os sensores.

2.1 Modelo Cinematico

Tem-se um veıculo dotado de duas rodas com tracao obtida por dois motores de

corrente contınua e uma roda omnidirecional, que com auxılio de sensores opticos que

fazem leitura da diferenca de cor da trilha, deve manter-se na trajetoria especificada no

plano, como ilustra a Figura 2.1.

O vetor em vermelho indica o gradiente da curva no ponto especificado, o vetor

em azul indica a direcao e sentido do veıculo. Para manter o veıculo na curva e preciso

que ϕ→ 0. ϕ e, portanto, a variavel controlada.

O objetivo do controlador e, deste modo, e garantir, com bom desempenho, que

29°

ϕ

Motor Esquerdo

Motor Direito

ââL

âR

Figura 2.1: Vista superior do robo sobre a trajetoria

7

Page 13: Projeto de Robô Seguidor de Linha com Controlador PID

8

ϕ = 0.

No entanto, nao ha o controle direto sobre o angulo ϕ, mas sim sobre a grandeza que

o determina no ponto considerado, levando em consideracao que o vetor a e a combinacao

dos vetores aL e aR (indicados na figura). Tais vetores sempre terao a mesma direcao de

a, porem, se aL e aR:

• tiverem mesmo sentido e mesmo modulo, o carro anda em linha reta;

• tiverem mesmo sentido mas modulos diferentes, o carro curva (aL ¿ aR: a direita,

aL ¡ aR: a esquerda) com deslocamento linear;

• tiverem sentidos diferentes, o carro curva sem deslocamento linear (curva em relacao

ao ponto central do eixo dos motores).

O sentido dos vetores aL e aR e analogo ao sentido de rotacao do motor e o modulo esta

associado a velocidade de rotacao.

O controle da velocidade e sentido de rotacao e feito baseado na tensao aplicada

no motor, entao nossa variavel manipulada e a tensao do motor.

De modo a compreender o comportamento dinamico do motor e preciso obter a

sua funcao de transferencia. O procedimento e descrito a seguir.

2.2 Modelo do Motor DC

A funcao de transferencia para um motor de corrente contınua controlado pela

corrente da armadura e dada pela Eq. 2.1

G(s) =Θ(s)

Va(s)=

Km

s[Ra(Js+ b) +KbKm]=Km/(Rab+KbKm)

s(τ1s+ 1)(2.1)

onde:

Θ(s) e a posicao angular em s;

Va(s) e a tensao aplicada no motor;

Kb, Km sao as constantes;

b e o coeficiente de friccao;

J e o torque aplicado ao eixo do motor.

Page 14: Projeto de Robô Seguidor de Linha com Controlador PID

9

O diagrama em blocos pode ser visto na Figura 2.2.

Figura 2.2: Diagrama em blocos do motor de corrente contınua

Como nao foi possıvel encontrar as especificacoes junto ao fabricante e de modo

a obter os dados mais precisos foi necessaria realizar a identificacao dos parametros dos

motores. O processo e descrito na secao seguinte.

2.2.1 Identificacao dos Parametros

De modo a desempenhar a identificacao dos parametros do motor utilizado, foi ne-

cessario realizar experimento com auxılio de um sensor optico, com o objetivo e obter uma

resposta aproximada a resposta ao degrau do motor. O metodo utilizado esta disponıvel

em [1].

O grafico da Figura 2.3 mostra o resultado aproximado da resposta ao degrau do

motor.

Tempo (s)2 3 4 5 6 7 8 9 10

0

0.2

0.4

0.6

0.8

1

Resposta ao Degrau

Figura 2.3: Resposta ao degrau bastante ruidosa

Page 15: Projeto de Robô Seguidor de Linha com Controlador PID

10

Como e possıvel observar, a resposta e bastante ruidosa por diversos motivos: a

velocidade do motor varia, ha perda de pulsos na contagem oriunda do enconder, alem

de que o tempo de medicao e o perıodo de amostragem nao coincidem precisamente [1].

Com auxılio de um filtro passa-baixas (Figura 2.4), consegue-se obter uma resposta

melhor.

Figura 2.4: Filtro utilizado no processo

O grafico da Figura 2.5 mostra a resposta filtrada.

Figura 2.5: Resposta ao degrau filtrada

O arranjo experimental desenvolvido pode ser visto na Figura A.3 disponıvel no

Apendice A.

Utilizando-se a ferramenta Parameter Estimation do Matlab foi possıvel a es-

timacao dos parametros, como mostra a Figura 2.6.

Page 16: Projeto de Robô Seguidor de Linha com Controlador PID

11

Figura 2.6: Modelo aproximado (esq.) e parametros estimados

2.3 Modelo dos Sensores

O comportamento do sensor esta disponıvel na suas especificacoes fornecidas pelo

fabricante. A Figura 2.7 mostra a corrente eletrica que flui na malha do receptor de

acordo com o distancia do sensor para uma dada superfıcie.

0.0

0.1

0.2

0.3

0.4

0.5

0.6

0.7

0.8

0.9

1.0

0

s - Displacement (mm)96 11915

VCE = 5 VIF = 20 mA

I

- R

ela

tive

Co

llecto

r C

urr

en

tC

rel

d = 5 mm4 mm3 mm2 mm1 mm0

E D

D

E

1.5

d

s0

5 mm

10 mm

s0

5 mm

10 mm

1110987654321

Figura 2.7: Corrente eletrica relativa versus distancia

Embora o sensor responda continuamente a distancia, podemos definir limites de

modo que:

VOUT =

0, VOUT < 2V

1, cc.

Onde ‘1’ e ‘0’ representam nıveis logicos para famılia TTL.

Page 17: Projeto de Robô Seguidor de Linha com Controlador PID

Capıtulo 3

Projeto do Controlador

O controlador escolhido para ser utilizado no projeto e o PID (Proporcional-

Integral-Derivativo), que e o algoritmo de controle mais usado na industria e tem sido

utilizado em todo o mundo para sistemas de controle industrial. A popularidade de con-

troladores PID pode ser atribuıda em parte ao seu desempenho robusto em uma ampla

gama de condicoes de funcionamento e em parte a sua simplicidade funcional, que permite

aos engenheiros opera-los de uma forma simples e direta.

O sinal de controle u(t) para este controlador e dado por:

u(t) = Kpe(t) +Ki

∫ t

0

e(τ)dτ +Kdd

dte(t) (3.1)

onde:

Kp e o ganho proporcional;

Ki e o ganho integral;

Kd e o ganho derivativo.

O processo de determinacao dos ganhos e conhecido com sintonia e foi feito com

auxılio do MATLAB. A Figura 3.1 mostra parte do processo. Basicamente, o MATLAB,

utilizando-se do modelo linearizado da planta, gera a saıda do controlador PID que pode

ser ajustada de acordo com os criterios de tempo de resposta (rapido versus lento) e

comportamento do transiente (agressivo versus robusto).

12

Page 18: Projeto de Robô Seguidor de Linha com Controlador PID

13

Figura 3.1: Ferramenta para sintonia do PID

3.1 Projetos Conceitual e Basico

O projeto de um robo seguidor de linha com controlador PID consiste na construcao

de um prototipo de veıculo autonomo cujo objetivo e percorrer uma trajetoria curvilınea

com desempenho aceitavel.

De modo a controlar o movimento cinematico do robo, e preciso identificar a sua

posicao na trilha, processo no qual sao utilizados dois sensores de luminosidade na frente

do prototipo que irao diferenciar quando o carro estiver seguindo a linha preta ou quando

sair e estiver na regiao branca. O erro e, portanto, a diferenca entre o set point, relacionado

com a velocidade do motor, e por conseguinte a posicao do veıculo e a saıda do sensor,

que determina a atual posicao do veıculo na trilha. E funcao do controlador alterar a

velocidade dos motores de modo que o veıculo mantenha-se na trajetoria.

O diagrama em blocos do sistema de controle a ser projetado pode ser visto na

Figura 3.2.

Na proxima secao o projeto detalhado e apresentado.

Page 19: Projeto de Robô Seguidor de Linha com Controlador PID

14

-

PID Interface Ponte H

MotorDireito

MotorEsquerdo

Se

nso

res

InterfaceSensor

+

Referência

Figura 3.2: Diagrama em blocos do sistema a ser projetado

3.2 Projeto Detalhado

Nesta secao serao descritos detalhadamente as etapas projeto, apresentado os es-

quematicos e codigos desenvolvidos, bem como os dispositivos utilizados.

3.2.1 Parte Mecanica

Na parte mecanica destaca-se o sistema de tracao e o suporte o mesmo (chassi).

A Figura 3.3 mostra as rodas e motores com a caixa de reducao utilizados no projeto.

Figura 3.3: Motores com caixa de reducao e as rodas utilizadas no projeto

Page 20: Projeto de Robô Seguidor de Linha com Controlador PID

15

3.2.2 Parte Eletrica

Arduino e Interface com os Motores

Arduino e uma plataforma baseada no microcontrolador ATmega32u4, que permite

o desenvolvimento eficiente e rapido de diversas aplicacoes. O Arduino utilizado pode ser

visto na Figura 3.4.

Figura 3.4: Arduino Leornado (esq.) e Motor Shield utilizados no prototipo

Para o controle do sentido de rotacao dos motores, bem como o devido interfacea-

mento entre o Arduino e os motores, a placa Motor Shield usada pode ser vista na Figura

3.4 (dir.).

Sensores

O sensor escolhido para determinacao da posicao do veıculo na trilha foi o CNY70,

que pode ser visto na Figura 3.5

Figura 3.5: Sensor CNY70 utilizado no prototipo

Um esquema do circuito de interface dos sensores pode ser visto na Figura 3.6.

Page 21: Projeto de Robô Seguidor de Linha com Controlador PID

16

R1

100

R2

4.7k

5V

10k

R3

5V

Sensor CNY70

VOUT

Figura 3.6: Circuito de interface para o sensor

Implementacao do PID no Arduino

O controlador PID discreto foi implementado para Arduino utilizando os valores

de ganhos (KP ,KI ,KD) determinados pelo MATLAB. Trecho do codigo implementado

para o Arduino pode ser visto abaixo. O codigo completo esta disponıvel no Apendice B.

Codigo 3.1: Trecho de codigo da implementacao do PID

1 int error = position - 2500;

2

3 int motorSpeed = Kp * error + Kd * (error - lastError);

4 lastError = error;

5

6 int rightMotorSpeed = rightBaseSpeed + motorSpeed;

7 int leftMotorSpeed = leftBaseSpeed - motorSpeed;

Page 22: Projeto de Robô Seguidor de Linha com Controlador PID

17

Simulacao

As simulacoes do sistema foram realizadas no ambiente Simulink do MATLAB. A

Figura 3.7 mostra o diagrama montado na plataforma.

Figura 3.7: Diagrama em blocos do sistema projetado em Simulink

Page 23: Projeto de Robô Seguidor de Linha com Controlador PID

Capıtulo 4

Resultados e Conclusoes

O grafico abaixo mostra em rosa a velocidade relativa, enquanto azul e amarelo

representam os motores. Os PIDs estao sintonizados diferentemente de maneira a mostrar

como o erro varia e portanto como o carro segue a curva.

Figura 4.1: Velocidade dos motores e velocidade relativa

Num teste mais realista, simulando o sinal emitido pelos sensores, obtem-se o

grafico da Figura 4.2

18

Page 24: Projeto de Robô Seguidor de Linha com Controlador PID

19

Figura 4.2: Velocidade dos motores e velocidade relativa para sinal mais realista

O trabalho foi extremamente importante para colocar em pratica os conceitos dados

na sala de aula sobre modelagem de sistemas fısicos, controlador PID, realimentacao, erro

e modelagem por parametros de curva S. Antes de o controle PID ter sido o objeto de

estudo e realizacao, o robo funcionava de modo ON-OFF, em que os sensores apenas

sinalizavam para que os motores ligassem caso fosse detectada a superfıcie branca. Como

resultado a trajetoria do robo era muito instavel e com muitas variacoes, o que fazia o

erro ser muito alto. Com o controlador PID foi possıvel suavizar a trajetoria do robo

consideravelmente para que ele seguisse a trilha de forma aperfeicoada, diminuindo o erro

do sistema na trajetoria. O Arduıno foi uma plataforma excelente para o desenvolvimento

do codigo e monitoramento de todas as acoes. Sua velocidade, simplicidade e extensao de

bibliotecas tornaram o trabalho mais simples de ser executado. A utilizacao do MATLAB

para a determinacao dos parametros tambem foi um facilitador na elaboracao do projeto,

pois permitiu que o controlador fosse obtido atraves da observacao da melhor resposta ao

sistema. Como conclusao de todo o trabalho descrito neste relatorio obteve-se um sistema

de robo seguidor de trilha com controlador PID com bons resultados, minimizacao de erros

e desempenho melhor do que com outros controladores testados, como o ON-OFF descrito

anteriormente.

Page 25: Projeto de Robô Seguidor de Linha com Controlador PID

Referencias Bibliograficas

[1] Activity 6 Part (a): Time-Response Analysis of a DC Motor. http://ctms.engin.

umich.edu/CTMS/index.php?aux=AboutTutorials.

[2] S.E.M. Bajestani and A. Vosoughinia. Technical report of building a line follower

robot. In Electronics and Information Engineering (ICEIE), 2010 International Con-

ference On, volume 1, pages V1–1–V1–5, Aug 2010.

[3] K.M. Hasan, A. Al-Nahid, and A. Al Mamun. Implementation of autonomous line

follower robot. In Informatics, Electronics Vision (ICIEV), 2012 International Con-

ference on, pages 865–869, May 2012.

[4] K. Ogata. Engenharia de controle moderno. Pearson Prentice Hall, 1982.

[5] M. Pakdaman and M.M. Sanaatiyan. Design and implementation of line follower ro-

bot. In Computer and Electrical Engineering, 2009. ICCEE ’09. Second International

Conference on, volume 2, pages 585–590, Dec 2009.

[6] M. Pakdaman, M.M. Sanaatiyan, and M.R. Ghahroudi. A line follower robot from de-

sign to implementation: Technical issues and problems. In Computer and Automation

Engineering (ICCAE), 2010 The 2nd International Conference on, volume 1, pages

5–9, Feb 2010.

[7] Wei Wu. Dc motor parameter identification using speed step responses. Model. Simul.

Eng., 2012:30:30–30:30, January 2012.

20

Page 26: Projeto de Robô Seguidor de Linha com Controlador PID

Apendice A

Prototipo Desenvolvido

A Figura A.1 mostra o prototipo desenvolvido.

Figura A.1: Vista superior do prototipo

21

Page 27: Projeto de Robô Seguidor de Linha com Controlador PID

22

Uma placa para os sensores foi montada e pode ser vista na Figura A.2:

Figura A.2: Placa sensorial

Um arranjo experimental foi montado para determinacao da resposta do motor e

pode ser visto na A.3.

Figura A.3: Medicao da velocidade do motor

Page 28: Projeto de Robô Seguidor de Linha com Controlador PID

Apendice B

Codigo PID do Arduino

1 #include <PID_v1.h>

2

3 // Arduino pins for the shift register

4 #define MOTORLATCH 12

5 #define MOTORCLK 4

6 #define MOTORENABLE 7

7 #define MOTORDATA 8

8

9 // 8-bit bus after the 74HC595 shift register

10

11 // These are used to set the direction of the bridge driver.

12 #define MOTOR1_A 2

13 #define MOTOR1_B 3

14 #define MOTOR2_A 1

15 #define MOTOR2_B 4

16

17 // Arduino pins for the PWM signals.

18 #define MOTOR1_PWM 11

19 #define MOTOR2_PWM 3

20

21 // Codes for the motor function.

22 #define FORWARD 1

23 #define BACKWARD 2

24 #define BRAKE 3

25 #define RELEASE 4

26

27 // Tuning parameters

28 float Kp = 1; //Initial Proportional Gain

29 float Ki = 0.22; //Initial Integral Gain

30 float Kd = 0.4; //Initial Differential Gain

31

32

33 void setup()

34

35 //Serial.begin(9600); //Start a serial session

36

37

38

39 int lastError = 0;

23

Page 29: Projeto de Robô Seguidor de Linha com Controlador PID

24

40 int rightBaseSpeed = 45;

41 int leftBaseSpeed = 45;

42 int position = 0;

43

44 void loop()

45

46 int LeftSensorValue = analogRead(A1);

47 int RightSensorValue = analogRead(A0);

48

49 float voltageLeft = LeftSensorValue * (5.0 / 1023.0);

50 float voltageRight = RightSensorValue * (5.0 / 1023.0);

51

52 //Serial.println(voltageLeft);

53 //Serial.println(voltageRight);

54

55 if (voltageRight > 1 && voltageLeft > 2) // nao bateu nenhum

56 position = 2500;

57 else

58 if (voltageLeft > 2) // bateu sensor esquerdo

59 position = 0;

60 else if (voltageRight > 1) // bateu sensor direito

61 position = 5000;

62

63

64

65 Serial.println(position);

66 int error = position - 2500;

67

68 //Serial.println(error);

69 error = map(error, -2500, 2500, -25, 25);

70 int motorSpeed = Kp * error + Kd * (error - lastError);

71 lastError = error;

72

73

74 int rightMotorSpeed = rightBaseSpeed + motorSpeed;

75 int leftMotorSpeed = leftBaseSpeed - motorSpeed;

76

77

78 //Serial.print(" SpeedR = ");

79 //Serial.println(rightMotorSpeed);

80 // Serial.print(" SpeedL = ");

81 //Serial.println(leftMotorSpeed);

82

83 motor(1, FORWARD, rightMotorSpeed);

84 motor(2, FORWARD, leftMotorSpeed);

85

86 //

87 // if(LeftSensorValue > RightSensorValue) //Se bateu do lado esquerdo, o controle e do motor direito

88 //

89 // SetPoint = SetPointR;

90 // Input = map(LeftSensorValue, 0, 1024, 0, 50); //Map it to the right scale

91 //

92 // myPID.Compute(); //Run the PID loop

93 // OutputR = SetPoint + Output;

94 // OutputL = SetPoint - Output;

95 // motor(1, FORWARD, OutputR);

Page 30: Projeto de Robô Seguidor de Linha com Controlador PID

25

96 // motor(2, FORWARD, OutputL);

97 //

98 // else if(LeftSensorValue < RightSensorValue)

99 //

100 // SetPoint = SetPointL;

101 // Input = map(RightSensorValue, 0, 1024, 0, 50);

102 //

103 // myPID.Compute(); //Run the PID loop

104 // OutputR = SetPoint - Output;

105 // OutputL = SetPoint + Output;

106 // motor(1, FORWARD, OutputR);

107 // motor(2, FORWARD, OutputL);

108 //

109

110 //

111 //

112 ////analogWrite(led, OutputR); //Write out the output from the PID loop to our LED pin

113 //now = millis(); //Keep track of time

114 //

115 // if(now - lastMessage > serialPing)

116 // //If it has been long enough give us some info on serial

117 // // this should execute less frequently

118 // // send a message back to the mother ship

119 // Serial.print("SetPoint = ");

120 // Serial.print(SetPoint);

121 // Serial.print(" Input = ");

122 // Serial.print(Input);

123 // Serial.print(" InputR = ");

124 // Serial.print(RightSensorValue);

125 // Serial.print(" InputL = ");

126 // Serial.print(LeftSensorValue);

127 // Serial.print(" OutputR = ");

128 // Serial.print(OutputR);

129 // Serial.print(" OutputL = ");

130 // Serial.print(OutputL);

131 // Serial.print("\n");

132 //

133 // if (Serial.available() > 0)

134 // //If we sent the program a command deal with it

135 // for (int x = 0; x < 4; x++)

136 // switch (x)

137 // case 0: Kp = Serial.parseFloat(); break;

138 // case 1: Ki = Serial.parseFloat(); break;

139 // case 2: Kd = Serial.parseFloat(); break;

140 // case 3:

141 // for (int y = Serial.available(); y == 0; y--)

142 // Serial.read(); //Clear out any residual junk

143 // break;

144 //

145 //

146 // Serial.print(" Kp,Ki,Kd = ");

147 // Serial.print(Kp);

148 // Serial.print(",");

149 // Serial.print(Ki);

150 // Serial.print(",");

151 // Serial.println(Kd); //Let us know what we just received

Page 31: Projeto de Robô Seguidor de Linha com Controlador PID

26

152 // //myPID_R.SetTunings(KpR, KiR, KdR); //Set the PID gain constants and start running

153 //

154 //

155 // lastMessage = now; //update the time stamp.

156 //

157 ////Serial.println(myPID_R.GetKp());

158

159

160

161

162

163

164

165 // motor

166 // Select the motor (1-4), the command,

167 // and the speed (0-255).

168 // The commands are: FORWARD, BACKWARD, BRAKE, RELEASE.

169 void motor(int nMotor, int command, int speed)

170

171 int motorA, motorB;

172

173 if (nMotor >= 1 && nMotor <= 4)

174 switch (nMotor)

175 case 1:

176 motorA = MOTOR1_A;

177 motorB = MOTOR1_B;

178 break;

179 case 2:

180 motorA = MOTOR2_A;

181 motorB = MOTOR2_B;

182 break;

183 default:

184 break;

185

186

187 switch (command)

188 case FORWARD:

189 motor_output (motorA, HIGH, speed);

190 motor_output (motorB, LOW, -1); // -1: no PWM set

191 break;

192 case BACKWARD:

193 motor_output (motorA, LOW, speed);

194 motor_output (motorB, HIGH, -1); // -1: no PWM set

195 break;

196 case BRAKE:

197 motor_output (motorA, LOW, 255); // 255: fully on.

198 motor_output (motorB, LOW, -1); // -1: no PWM set

199 break;

200 case RELEASE:

201 motor_output (motorA, LOW, 0); // 0: output floating.

202 motor_output (motorB, LOW, -1); // -1: no PWM set

203 break;

204 default:

205 break;

206

207

Page 32: Projeto de Robô Seguidor de Linha com Controlador PID

27

208

209

210

211 void motor_output (int output, int high_low, int speed)

212

213 int motorPWM;

214

215 switch (output)

216

217 case MOTOR1_A:

218 case MOTOR1_B:

219 motorPWM = MOTOR1_PWM;

220 break;

221 case MOTOR2_A:

222 case MOTOR2_B:

223 motorPWM = MOTOR2_PWM;

224 break;

225 default:

226 // Use speed as error flag, -3333 = invalid output.

227 speed = -3333;

228 break;

229

230

231 if (speed != -3333)

232

233 // Set the direction with the shift register

234 // on the MotorShield, even if the speed = -1.

235 // In that case the direction will be set, but

236 // not the PWM.

237 shiftWrite(output, high_low);

238

239 // set PWM only if it is valid

240 if (speed >= 0 && speed <= 255)

241

242 analogWrite(motorPWM, speed);

243

244

245

246

247

248 // ---------------------------------

249 // shiftWrite

250 //

251 // The parameters are just like digitalWrite().

252 //

253 // The output is the pin 0...7 (the pin behind

254 // the shift register).

255 // The second parameter is HIGH or LOW.

256 //

257 // There is no initialization function.

258 // Initialization is automatically done at the first

259 // time it is used.

260 //

261 void shiftWrite(int output, int high_low)

262

263 static int latch_copy;

Page 33: Projeto de Robô Seguidor de Linha com Controlador PID

28

264 static int shift_register_initialized = false;

265

266 // Do the initialization on the fly,

267 // at the first time it is used.

268 if (!shift_register_initialized)

269

270 // Set pins for shift register to output

271 pinMode(MOTORLATCH, OUTPUT);

272 pinMode(MOTORENABLE, OUTPUT);

273 pinMode(MOTORDATA, OUTPUT);

274 pinMode(MOTORCLK, OUTPUT);

275

276 // Set pins for shift register to default value (low);

277 digitalWrite(MOTORDATA, LOW);

278 digitalWrite(MOTORLATCH, LOW);

279 digitalWrite(MOTORCLK, LOW);

280 // Enable the shift register, set Enable pin Low.

281 digitalWrite(MOTORENABLE, LOW);

282

283 // start with all outputs (of the shift register) low

284 latch_copy = 0;

285

286 shift_register_initialized = true;

287

288

289 // The defines HIGH and LOW are 1 and 0.

290 // So this is valid.

291 bitWrite(latch_copy, output, high_low);

292

293 // Use the default Arduino ’shiftOut()’ function to

294 // shift the bits with the MOTORCLK as clock pulse.

295 // The 74HC595 shiftregister wants the MSB first.

296 // After that, generate a latch pulse with MOTORLATCH.

297 shiftOut(MOTORDATA, MOTORCLK, MSBFIRST, latch_copy);

298 delayMicroseconds(5); // For safety, not really needed.

299 digitalWrite(MOTORLATCH, HIGH);

300 delayMicroseconds(5); // For safety, not really needed.

301 digitalWrite(MOTORLATCH, LOW);

302