You are on page 1of 66

UNIVERSIDADE FEDERAL DO CEAR

CENTRO DE TECNOLOGIA
DEPARTAMENTO DE ENGENHARIA ELTRICA
PROGRAMA DE GRADUAO EM ENGENHARIA ELTRICA





MICHEL NEY DE ALMEIDA BARROSO RODRIGUES





CONTROLE DE UM ROB MVEL: IMPLEMENTAO E
DESENVOLVIMENTO











FORTALEZA
2013


MICHEL NEY DE ALMEIDA BARROSO RODRIGUES





CONTROLE DE UM ROB MVEL : IMPLEMENTAO E
DESENVOLVIMENTO






Dissertao apresentada ao Programa de
Graduao em Engenharia Eltrica da
Universidade Federal do Cear, como requisito
parcial obteno do ttulo de engenheiro em
Engenharia Eltrica. rea de concentrao:
Automao e Controle.

Orientador: Prof. Dr. Bismark Claure Torrico.













FORTALEZA
2013




















___________________________________________________________________________


Pgina reservada para ficha catalogrfica que deve ser confeccionada aps apresentao e
alteraes sugeridas pela banca examinadora.
Para solicitar a ficha catalogrfica de seu trabalho, acesse o site: www.biblioteca.ufc.br, clique
no banner Catalogao na Publicao (Solicitao de ficha catalogrfica)

___________________________________________________________________________





MICHEL NEY DE ALMEIDA BARROSO RODRIGUES







CONTROLE DE UM ROB MVEL : IMPLEMENTAO E
DESENVOLVIMENTO





Dissertao apresentada ao Programa de
Graduao em Engenharia Eltrica da
Universidade Federal do Cear, como requisito
parcial obteno do ttulo de engenheiro
eletricista em Engenharia Eltrica. rea de
concentrao: Automao e Controle.

Aprovada em: 13/ 12 / 2013.

BANCA EXAMINADORA

________________________________________
Prof. Dr. Bismark Claure Torrico (Orientador)
Universidade Federal do Cear (UFC) / DEE

_________________________________________
Prof. Dr. Fabrcio Gonzalez Nogueira
Universidade Federal do Cear (UFC) / DEE

_________________________________________
Prof. Msc Vanier Andrade
Universidade Federal do Cear (UFC)




























A Caroline, meus familiares e amigos.


AGRADECIMENTO

A Caroline, minha vida, por sempre estar ao meu lado ajudando e dando motivos
para continuar nos momentos mais difceis e tambm por sua magnfica reviso textual.
Ao Instituto de Idiomas Santa Ifignia, pelo apoio com a manuteno pesquisa
desenvolvida na rea de tecnologia.
Ao Prof. Dr. Bismark Claure Torrico, pela excelente orientao.
Aos examinadores participantes da banca Prof. Dr. Fabrcio Nogueira e Prof. Msc.
Vanier Andrade pelo tempo, pelas valiosas colaboraes e sugestes.
Aos professores que auxiliaram na correo do texto e nas discusses.
Aos colegas da turma, em especial Saulo Guillermo e Vicente Queiroz, pelas
reflexes, crticas e sugestes recebidas.




















































Don't tell me that man doesn't belong out there.
Man belongs wherever he wants to go and
he'll do plenty well when he gets there.
- Wernher von Braun


RESUMO

O presente trabalho consiste no desenvolvimento e implementao de um rob mvel
concomitantemente com um algoritmo com objetivo de locomoo, de acordo com o desejo de
um usurio, e tcnicas de controle clssico. Para tal foram utilizadas uma das tecnologias mais
recentes de microprocessadores, o Arduino. O controle do rob mvel, foi realizado por
intermdio do uso de um thumbstick (controle analgico do joystick) para representar a lgica
do modo de direo.

Palavras-chave: Robs Mveis, Controle de sistemas dinmicos, Navegao de robs mveis
autnomos, Arduino.




ABSTRACT

The present work is the development and implementation of a mobile robot concomitantly with
an algorithm for the purpose of locomotion, according to the desire of a user, and techniques of
classical control. For this we used one of the newer technologies of microprocessors, the
Arduino . The mobile robot control was performed through the use of a thumbstick (analog
joystick control) to represent the logic of the drive mode.

Keywords: Mobile Robots. Control of dynamic systems.. Navigation of autonomous mobile
robots. Arduino .


LISTA DE ILUSTRAES

Figura 1 - Modelo do rob mvel diferencial utilizado. 14
Figura 4 Esquemtico do posicionamento central do thumbstick 16
Figura 5 Pontos possveis captados pela equao formulada, Y negativo e X positivo. 18
Figura 6 - Pontos possveis captados pela equao formulada, Y Positivo e X Negativo 18
Figura 5 - Fluxograma da Parte de Controle Manual 20
Figura 7 - Circuito Equivalente a um motor CC de excitao separada. 21
Figura 7 - Modelo do diagrama de blocos do motor CC 23
Figura 9 - Curva de resposta ao degrau do motor CC utilizado 25
Figura 10 - Aplicao da funo degrau Planta 25
Figura 11 - Ponto de Inflexo e Reta Tangente curva 26
Figura 12 - Modelo do Simulink de Controle das simulaes. 29
Figura 13 - Modelo do Simulink de Controle do Ensaio 31
Figura 14 - Esquemtico do Circuito Eletrnico da Ponte-H 32
Figura 15 - Grfico da Corrente no Motor CC 33
Figura 3 Arduino Mega 2560 34
Figura 16 Encapsulamento do Multiwatt15 35
Figura 17 - Encapsulamento do PowerSO20 35
Figura 18 Diagrama Interno do L298N 36
Figura 19 - Foto do Prottipo 37
Figura 20 - Layout da placa PCB 38
Figura 21 - Oscilografia dos sinais de referencia, sada e erro do controlador durante o ensaio
39
Figura 22 - malha de controle e sinal de sada do controlador (primeira iterao) 48
Figura 23 - malha de controle e sinal de sada do controlador (segunda iterao) 48
Figura 24 - malha de controle e sinal de sada do controlador (terceira iterao) 48
Figura 25 - malha de controle e sinal de sada do controlador (quarta iterao) 48
Figura 26 - malha de controle e sinal de sada do controlador (quinta iterao) 49



LISTA DE ABREVIATURAS E SIGLAS
UFC Universidade Federal do Cear
CT Centro de Tecnologia
DEE Departamento de Engenharia Eltrica
GPAR Grupo de Pesquisa em Automao e Robtica
PID Proporcional Integral Derivativo
PI
LGR
Proporcional Integral
Lugar Geomtrico das Razes
PWM Pulse Width Module Largura de Pulso Modulada
CC Corrente Contnua
CI Circuito Integrado
PCB Printed Circuit Board Placa de Circuito Impresso







LISTA DE SMBOLOS
% Porcentagem
Copyright
Marca Registrada
Trade Mark
Hz Hertz



SUMRIO
1 INTRODUO ........................................................................................................................................... 13
2 ALGORITMO PARA DETERMINAO DA REFERNCIA DO CONTROLADOR ................................................. 15
2.1 REFERNCIA POR MEIO DO POSICIONAMENTO MANUAL ........................................................................................... 15
2.1.1 Calibrao ........................................................................................................................................... 15
2.1.2 Mapeamento de Intervalo .................................................................................................................. 16
2.1.3 Equacionamento de diferena de razo cclica do PWM. .................................................................. 17
3 CONTROLE DE VELOCIDADE ...................................................................................................................... 20
3.1 MODELAGEM FSICA DO MOTOR DE CORRENTE CONTNUA ...................................................................................... 20
3.2 PROJETO DO CONTROLADOR .............................................................................................................................. 28
4 CIRCUITO ELETRNICO PARA INVERSO DO SINAL DE SADA DO CONTROLADOR & ARDUINO ................. 32
4.1 CARACTERSTICAS DO ARDUINO .................................................................................................................... 34
4.2 IMPLEMENTAO E RESULTADOS ........................................................................................................................ 35
5 CONCLUSO ............................................................................................................................................. 40
REFERNCIAS .............................................................................................................................................. 41
ANEXOS ...................................................................................................................................................... 42
ANEXO A CDIGO DO ALGORITMO: ........................................................................................................................ 42
Organizao Geral ....................................................................................................................................... 42
Rotinas de teste da equao criada ............................................................................................................. 42
Plotagem das Figuras ................................................................................................................................... 43
ANEXO B CDIGO C2D ........................................................................................................................................ 43
Coeficientes .................................................................................................................................................. 43
Variveis....................................................................................................................................................... 44
ANEXO C OSCILOGRAFIA DA SADA DO CONTROLADOR PARA OS CINCO CASOS DE MOTORES SIMULADOS .............................. 48
ANEXO D CDIGO NO ARDUINO .......................................................................................................................... 50













13

1 INTRODUO

O crescimento constante da robtica a faz ser inserida cada vez mais no cotidiano
do homem, tendo assim um papel importante quando diz respeito a trazer mais comodidade e
simplicidade para as pessoas.
Uma das principais razes para o interesse na robtica ser to significante a
tendncia acentuada de se automatizar determinado nmero de tarefas que podem ser realizas
por uma mquina, liberando, assim, mais tempo ao homem.
Dentre os diversos ramos que a robtica compreende, o brao referente parte mvel
se mostra extremamente intrigante, por ser um dos que traz maior possibilidade de avano.
Como (BEKEY,2005) comenta, dentre os seres vivos, uma das principais
intersees entre todos a habilidade de se mover. Para tal finalidade, a locomoo, existem
inmeros mtodos utilizados na natureza e, a partir da observao, retira-se a inspirao para
aplicar tais modelos e metodologias a fim de permitir que robs se locomovam.
Todavia, mesmo que uma grande quantidade de animais utilizem pernas para seu
deslocamento - e que robs tambm possam ser criados utilizando-as - significativamente
mais simples a implementao do movimento atravs de rodas e, essa foi a razo de se utilizar
um rob mvel do tipo diferencial
1
(ver Figura 1).
Segundo (PACHECO; COSTA, 2002), robs mveis so agentes artificiais ativos,
cuja capacidade de locomoo existente e gera, por consequncia, atuao no meio nos quais
esto inseridos, o mundo fsico real. Assim, o atual trabalho desenvolve o controle de um
pequeno rob mvel de trs rodas, duas motorizadas e uma livre, utilizando as mais recentes
tecnologias no quesito de microprocessadores.


1
Rob mvel diferencial: So robs mveis que no necessitam de um volante, ou seja, a mudana de direo se
d pela diferena relativa de velocidade das rodas
14

Figura 1 - Modelo do rob mvel diferencial utilizado.

Fonte: <http://img1.mlstatic.com/kit-smart-car-carro-com-2-motores-robotica-arduino-
micro_MLB-O-4504082419_062013.jpg> - Acesso em 20/10/2013

Utilizando tcnicas de controle tradicional para sistemas dinmicos,
principalmente sobre modelagem e controle de velocidade, alm de conhecimentos na rea de
programao da linguagem C/C++, neste trabalho investiga-se uma estratgia para comandar o
rob manualmente por meio de um thumbstick, cujos controladores envolvidos nesta parte
apenas tm a finalidade de isentar e, consequentemente corrigir, o sistema de possveis
interferncias externas, tais como atritos e deslizamentos entre a roda e o solo.
De modo conciso, o captulo 2 abrange o algoritmo criado para empregar o
thumbstick e utiliz-lo como a referncia do controlador. No terceiro captulo, explanada a
metodologia de modelagem do sistema de controle, desde a planta at o controlador.
Posteriormente, no quarto captulo, mostra-se a simulao do circuito eletrnico necessrio para
amplificar o sinal PWM de corrente a ser enviado ao motor e fazer a inverso desta quando
necessrio. Finalmente, tambm no quarto captulo, o presente trabalho abrange a
implementao de um prottipo.
A principal justificativa para o desenvolvimento do trabalho sob tais aspectos se d
devido necessidade de implementar um rob mvel e um algoritmo que seja funcional nas
principais tecnologias atuais de sistemas embarcados, como a placa Arduino, objetivando um
custo relativamente baixo.


15

2 ALGORITMO PARA DETERMINAO DA REFERNCIA DO CONTROLADOR
2.1 Referncia por meio do posicionamento manual

Realizar o controle de robs autnomos mveis envolve, incialmente, definir qual
tipo de mobilidade ele ter e quantos graus de liberdade, conforme (BEKEY, 2005). Para o
projeto aqui apresentado, definiu-se que a estrutura seria um rob mvel diferencial, ou seja,
sua mobilidade ser por meio de rodas e ter dois graus de liberdade.
O algoritmo criado pode ser divido em trs partes principais: Calibrao,
Mapeamento e Equacionamento, os quais sero explicados detalhadamente mais adiante. Em
linhas gerais, o objetivo deste algoritmo definir o valor correto da razo cclica do PWM a ser
enviado ao controlador e posteriormente ao circuito eletrnico (atuador), ou seja, o valor de
referncia do modelo de controle.
2.1.1 Calibrao

A principal razo que justifica a criao desta rotina se d pela necessidade de
padronizar os valores emitidos pelo thumbstick, uma vez que modelos de fabricantes diferentes
do utilizado poderiam vir a interferir no correto funcionamento do algoritmo.
Assim, nesta rotina, foram criadas 6 variveis, sensorMaxX, sensorMinX,
sensorMaxY, sensorMinY, sensorMaxSW e sensorMinSW, para armazenar os valores
lidos de mximo e mnimo dos eixos vertical (X), horizontal (Y), e do boto (SW
2
)
respectivamente.
Desse modo, inicialmente, deve-se fazer a movimentao completa do thumbstick,
ou seja, que o mesmo ocupe todas as posies possveis, consequentemente enviando os valores
corretos para as variveis respectivas. Caso tal passo no seja corretamente realizado, o clculo
de mapeamento se dar de forma equivocada, resultando em valores de sada de PWM
superiores e incompatveis com os mximos permitidos pelo prprio hardware, no caso de zero
a 255 (8 bits).
Tendo em vista a necessidade de uma atuao do usurio para que tais valores
sejam transmitidos, o programa fica em espera durante tempo suficiente para que o thumbstick
seja manuseado de modo que ocorra a calibrao correta (aproximadamente 5 segundos), para

2
SW faz referncia a switch, do ingls, cujo significado chave, boto.
16

somente ento prosseguir. Vale atentar para o fato de que, sendo feito corretamente o
procedimento, este realizado apenas uma vez, mesmo que a rotina de locomoo seja utilizada
mais de uma vez.

2.1.2 Mapeamento de I ntervalo

Aps a calibrao dos valores, calcula-se a mdia entre a varivel que contm o
valor mximo e mnimo e, em seguida, faz-se o mapeamento desta mdia em relao aos valores
lidos de mximo, 1024, e mnimo, 0, com a respectiva equivalncia aos valores de sada dos
pinos de PWM do hardware, no caso, 0 a 255 - ou seja, descobre-se quanto o valor mdio, na
escala de 0 a 1023 vale em uma outra escala, no caso, 0 a 255. Esse procedimento realizado
tanto para o eixo X (vertical) quanto para o Y (horizontal). Simplificando, o mapeamento
funciona da mesma maneira que uma regra de trs.
A rotina do algoritmo de referncia entra, ento, em sua parte final onde feito o
clculo da razo cclica do PWM a ser enviado para cada um dos motores.
Contudo, antes de se entender o procedimento de clculo realizado, deve-se saber
que, quando thumbstick est inerte, o valor lido pela entrada analgica gira em torno de 512,
com uma preciso de mais ou menos um, ou seja, esse valor lido pela porta analgica do
Arduino quando o thumbstick se encontra conforme mostrado na figura 4.

Figura 2 Esquemtico do posicionamento central do thumbstick

Fonte: prprio autor.

17

2.1.3 Equacionamento de diferena de razo cclica do PWM.

Segundo (MCSHAFFRY,2012), quando se deseja que um objeto se mova na
diagonal, por exemplo, ele deveria se mover mais rapidamente do que quando colocado apenas
para seguir em frente, uma vez que aconteceria a soma dos valores dos vetores de X e Y.
No obstante, para corrigir esse problema sugerido que se utilize a Equao 1, que
consiste em multiplicar a velocidade mxima (ocorrida quando o thumbstick da figura 4 se
encontra na posio mxima do eixo X positivo) pela raiz da soma dos quadrados dos valores
de X e Y (MCSHAFFRY,2012).

2
+
2
(1)

No entanto, como o thumbstick disponvel no tinha um comportamento totalmente
linear, a Equao 1 no funcionou perfeitamente.
Preferiu-se, ento, munir-se de uma equao cuja forma fosse logartmica (Equao
2), juntamente com certas condies que concertassem os problemas das regies no lineares.
O procedimento inicial (ver anexo A) para obter essa equao se deu atravs de
simulao matemtica, com software especfico para fins desse tipo, Matlab, por meio de uma
licena estudantil. Os resultados obtidos esto ilustrados nas figuras 5 e 6 que representam o
espectro de pontos alcanveis das possveis posies do thumbstick, ou seja, os pontos
alcanveis do segundo e primeiro quadrante da figura 4, respectivamente.

18

Figura 3 Pontos possveis captados pela equao formulada, Y negativo e X positivo.

Fonte: prprio autor. Simulao de Matlab

Figura 4 - Pontos possveis captados pela equao formulada, Y Positivo e X Negativo

Fonte: prprio autor. Simulao de Matlab

Para se obter os grficos das figuras 5 e 6, criaram-se duas rotinas, cada uma
utilizando dois vetores de dados aleatrio entre zero a 255. Almejando chegar o mais prximo
de um caso real, no qual no se saberia qual valor de posio no thumbstick o usurio estaria
19

colocando, os valores foram inseridos aleatoriamente, utilizando a rotina interna do programa,
randi(). Assim, o eixo horizontal das figuras refere-se ao quanto de PWM ser inserido no
motor da roda mais externa ao se realizar uma curva e o eixo vertical ao do PWM dado ao motor
da roda mais interna, cuja metodologia explanada a seguir.
A equao emprica matemtica que trouxe soluo ao problema mostrada a
seguir.

=
(|

|) (log |

| )

(2)
Onde:
: Coeficiente constante de correo.

: Valor de PWM referente ao eixo X.


: Valor de PWM referente ao eixo Y.


: Valor mdio calculado dos PWMs.
Assim, analisando as Figuras 6 e 7, percebe-se que o espectro de pontos alcanveis
pelo thumbstick, resultam em uma correta diferena de PWMs, modelados pela equao 1,
entre os motores nos casos de curvas.
No entanto, deve se atentar ao fato de que o resultado,

, ser igualado
respectiva varivel, a depender do lado para o qual se deseja girar, isso : quando se deseja girar
para a direita, a razo cclica do PWM para o motor 1 ser dado pela equao formulada,
enquanto que para o motor 2, ser o prprio valor mapeado referente ao eixo X, e, de modo
anlogo, para quando se quer girar para a esquerda.
Durante os testes realizados, j aplicando a equao formulada, todas as direes
possveis trouxeram resultados satisfatrios. Apesar disso, aps posicionar o thumbstick ao
mximo para um dos lados da horizontal, no eixo Y, iniciando-se o movimento para a posio
diagonal, variando-se a posio vertical eixo X ocorria um erro, pois em vez dos motores
comearem fazendo uma curva mais branda, na realidade eles tendiam a receber valores iguais
de PWM, por consequncia fazendo o rob mvel sair pela tangente da trajetria. Esta faixa de
erro se encontrava entre as linhas vermelhas das figura 5 e 6.
A soluo para este empecilho se deu - aps vrias tentativas falhas de se criar
outra equao matemtica que atendesse a esses casos no lineares - ao inserir as condies de
controle no cdigo, fazendo uma inverso na equao 1, entre o valor de PWM Y dentro do
logaritmo para PWM X quando se entrava nesta regio no linear.
20

3 CONTROLE DE VELOCIDADE

Terminada a parte que realiza o clculo do algoritmo dos valores de PWM a serem
utilizadas como referncia para o modelo do controlador PID de velocidade, parte-se para a
modelagem do sistema dos motores, a planta. O modelo de fluxograma do trabalho mostrado
na Figura 5.
Figura 5 - Fluxograma da Parte de Controle Manual

Fonte: prprio autor.

3.1 Modelagem Fsica do Motor de Corrente Contnua

O motor de corrente contnua (CC) tem como sua principal funo converter a
energia eltrica proveniente da corrente eltrica em energia mecnica rotacional. A grande parte
do torque gerado no rotor do motor utilizado para mover uma carga externa, portanto estas
caractersticas (alto torque, fcil controle da corrente de alimentao, etc) fazem com que o
motor de corrente contnua seja amplamente utilizado em diversos tipos de aplicaes,
incluindo a apresentada neste trabalho, a robtica mvel.
Para se realizar o correto controle de velocidade do motor e, por consequncia, um
eficaz design do controlador, necessrio conhecer a funo de transferncia deste motor. Essa
ser desenvolvida por uma aproximao linear, pois o estudo de efeitos como histerese e queda
de tenso nas escovas, entre outros, no so o alvo do presente trabalho.
21

O desenvolvimento da modelagem matemtica apresentado a seguir
concomitantemente com o circuito eltrico referente ao motor CC.

Figura 6 - Circuito Equivalente a um motor CC de excitao separada.

Fonte: Eletric Machinery, Guru; pg. 617.

A Figura 8 prope o correto modelo do motor CC de excitao separada
3
. Como
comentado por (Guru,2001) motores CC por muitas vezes tm a necessidade de uma resistncia
varivel em srie com a resistncia de armadura.
Essa devida partida do motor, cuja corrente inicial se torna excessiva e pode vir
a causar danos permanentes nos enrolamentos de armadura do mesmo, entretanto como a
aplicao utiliza motores de pequeno porte cujo objetivo no movimentar grandes cargas, essa
resistncia varivel desprezada.
O modelo dessa figura pode ser estendido para motores de ims permanentes
4
.
Dessa maneira, uma vez que a corrente de campo,

, mantida constante, a modelagem do motor


CC - analisando o desenho e aplicando as equaes bsicas de circuitos - segue-se semelhante
ao apresentado por (Guru,2001,cap 11) e (Dorf, 2011), na forma de uma equao diferencial de
primeira ordem:

V
s
= V
R
+V
L
+V
EMF
(3)

3
So motores onde, em teoria, se utiliza uma fonte auxiliar apenas para o enrolamento de campo, no entanto
como no prtico essa utilizao, se diz que ele virtualmente no existente. Tambm considerado um caso
especial de um motor CC shunt.
4
Um motor de ims permanentes um caso especial de um motor CC shunt cuja densidade de fluxo constante
e, por consequncia, tambm a corrente de campo.
22


V
S
(t) =

(t) +L


d i

(t)
d t
+V
EMF
() (4)

V
EMF
= K
b

() (5)

K
b
= K
a

(6)

Onde

a resistncia de armadura, L

a indutncia, K
b
uma constante devido a
corrente de campo uniforme, K
a
a constante da mquina e

o fluxo por plo.


Semelhantemente, tambm possvel realizar o clculo do torque desenvolvido pelo motor:

T

= K
b
i

(t) =

+D

(t) +
d

(t)
d t
(7)

T o torque, D o coeficiente de atrito (frico) e J a constante de inrcia.
Observa-se que tanto a equao 4 quanto a 7, realizadas as devidas substituies,
podem ser reescritas de forma conjunta em um modelo de espao-estado, como demonstrado
por (Guru,2001, cap. 11). Partindo-se para a aplicao da transformada de La Place
5
nas
equaes 4 e 7, temos que:

R
a
i

(s) +

(s) +

(s) = V
S
(s) (8)

K
b
i

(s) =

+ D

(s) +

(s) (9)

Considerando que o torque da carga nulo, pois o mesmo trabalha a vazio e,
sabendo que a entrada do sistema de controle de velocidade dos motores um valor de tenso
e o da sada um de velocidade, obtm-se a funo de transferncia do modelo:

m
(s)
V
S
(s)
=
K
b
s
2
(J L
a
)+s(DL
a
+JR
a
)+(R
a
D+K
b
)
(10)


5
Para maiores informaes sobre o aspecto terico da transformada de La Place consultar (Dorf,2011)
23


Figura 7 - Modelo do diagrama de blocos do motor CC

Fonte: Dorf,2011. Cap.2

A Figura 7 ilustra o modelo referente funo de transferncia da Equao 10,
mostrando desde a modelagem do sistema do im permanente at a carga, porm vale lembrar
que a perturbao alusiva ao torque da carga foi considerado nulo.
Todavia, uma vez que trabalhar-se- com o tempo em modo discreto pois almeja-
se implementar um controlador por linhas de cdigo da linguagem C no microprocessador
Arduino poder-se-ia realizar o processo de amostragem das equaes 4 e 7 para, somente
ento, iniciar os procedimento de design do controlador discreto, porm, uma vez que a
ferramenta de software utilizada, Matlab, contm sua rotina prpria para a discretizao de
funes de contnuas, a c2d, optou-se por utiliz-la, em vez de se demonstrar todo o
procedimento de clculo, j que no o escopo do presente trabalho e o mesmo pode ser
encontrado em (Dorf,2011).
Sintetizando, a rotina utilizada, c2d, modifica uma funo de transferncia
proveniente da aplicao da transformada de La-Place em um outra funo de transferncia que
viria a ser obtida a partir da aplicao da transformada Z equao diferencial discreta.
Uma vez definido o perodo de amostragem a ser escolhido (50 milissegundos
6
), o
mesmo utilizado na rotina em questo.
Para se utilizar a funo c2d do Matlab necessrio criar a funo de
transferncia com os valores finais das constantes, ou seja, no so permitidos valores

6
Levou-se em conta o desejo de no sobrecarregar a capacidade de clock (frequncia) do hardware, 16kHz, uma
vez que ele tambm realizar outras rotinas simultaneamente e tambm que a amostragem no deve ser superior
que a menor constante de tempo do sistema.
24

lingusticos (no-numricos). As grandezas de tais coeficientes foram obtidas a partir dos
valores considerados como padro por (DORF,2011), (GURU,2001) sendo assim ilustrados na
tabela 1.

Tabela 1 Grandeza das Constantes da funo de transferncia
Constante Grandeza Unidade
Constante do Motor (K
b
) 10
3
N.m/A
Constante de Inrcia (J) 10
3
N.m.s/rad
Coeficiente de frico (D) 10
3
N.m.s
Resistencia de Armadura 1 Ohms
Indutncia 10
3
Henry
Fluxo por Plo 10
3
Weber
Fonte: Dorf, 2011, Cap 2 & Guru,,2001, Cap11

O anexo B mostra o cdigo e os valores das constantes utilizadas no programa
Matlab para criar a funo de transferncia discreta.
Dentre os quatro mtodos disponveis para se discretizar a funo de transferncia
contnua (Zero-Order Hold,First-Order Hold,Impulse e Matched) o Zero-order hold foi o
escolhido por ser o padro do comando c2d.
Portanto, a funo de transferncia no domnio discreto, utilizando os valores da
tabela 1, dada por:

m
(z)

()
=
0.03896+0,009152

2
0.9104+0.006704
(11)

Para fins de comparao tambm foi realizado um ensaio com o motor disponvel
para saber qual seria a funo de transferncia dele.
Utilizando o osciloscpio Tektronix TDS2004B (60MHz) para observar a resposta
ao se fornecer um degrau de 12 V ao motor, possvel descobrir os parmetros que acarretaro
na funo de transferncia.

25

Figura 8 - Curva de resposta ao degrau do motor CC utilizado

Fonte: prprio autor.

Verificando a forma de onda obtida (figura 9), percebe-se que ela chega a se
assemelhar a uma resposta ao degrau de sistemas de primeira ordem. Mesmo sabendo que sua
funo de transferncia deveria seguir um padro de funes de segunda ordem, conforme
demonstrado anteriormente, devido forma de onda permitir essa associao primeira ordem,
assim foi feito para simplificar os clculos.

Figura 9 - Aplicao da funo degrau Planta

Fonte: Ogata,2011. Cap.11.

Conforme explanado por (OGATA,2011), aplicando-se um degrau planta obtm-
se o resultado, de acordo com o mtodo de Ziegler-Nichols escolhido, para identificar a funo
de transferncia da planta, conforme visto na Figura 10. Essa assemelha-se a um modelo de
primeiro grau cuja forma explicitada na equao 12:

() =

+
(12)

Onde T a constante de tempo e K o ganho.
26

Para calcular esses parmetros, a bibliografia (OGATA,2011) informa que se deve
traar uma tangente ao ponto de inflexo, na curva de resposta ao degrau conforme visto na
Figura 11.

Figura 10 - Ponto de Inflexo e Reta Tangente curva

Fonte: Ogata,2011. Cap.11.


Os valores de L e T da figura 11 sero os parmetros previstos para o controlador,
dependendo do tipo a ser utilizado (P,PI,PID,etc).
Como o grfico da figura 9 de tenso versus tempo, foi possvel saber tais valores
pela simples diferena entre o ponto de origem sobre o eixo das abcissas e o ponto de tangncia,
que no caso, esto sendo medidos pelos cursores, resultando, portanto, no valor encontrado da
constante de tempo de 220 milissegundos. Em relao ao ganho, este regido pela razo entre
os valores finais e iniciais da tenso:

=
y
x
=
y
f
y
0
x
f
x
0
=
12
1
= 12 (13)

Esse valor foi encontrado analisando o eixo das ordenadas e a diferena entre os
valores de tenso na origem e o valor final de tenso da resposta ao degrau, conforme pode ser
observado na figura 11. Finalmente, a funo de transferncia da Planta, do ensaio do motor
apresentada na equao 14.
27


() =
12
0,044
0.22+1
(14)

Essa funo deve, ento, ser discretizada, e para tal utiliza-se o comando c2d do
Matlab, gerando a funo discreta da Planta de ensaio.

() =
1
0.3229+2.117
0.7967
(15)



28

3.2 Projeto do Controlador

A correta especificao dos parmetros do sistema de controle fundamental para
se obter a alta qualidade almejada no projeto. Desse modo, aps realizar os clculos necessrios
e se encontrar a funo de transferncia da planta do sistema de controle, parte-se para o clculo
dos coeficientes do controlador. Uma vez que o processo ser todo regido pelo
microprocessador Arduino, o controlador dever ser discreto, como dito anteriormente. Vale
comentar que, para o Arduino, apenas necessrio inserir os dados dos coeficientes P,I e D,
uma vez que j existem bibliotecas especficas de controle cujos dados de entrada so estes.
Finalmente, uma vez que a equao geral de um PID dada por (16), este foi o
modelo utilizado para criar o cdigo no anexo E.

=

( ) +

) (16)

A determinao dos coeficientes do controlador pelas regras do controle clssico,
realizada via dois mtodos principais, o Lugar Geomtrico das Razes, LGR, e o mtodo da
Resposta em Frequncia.
O passo-a-passo manual para se obter tais coeficientes por cada um dos mtodos
relativamente extenso e foge das diretrizes do trabalho, no entanto tal metodologia facilmente
encontrada em bibliografias (OGATA,2011)
Em especial, utiliza-se a ferramenta Simulink do Matlab, no qual, criado o modelo
como mostra a figura 12 , ento, possvel realizar as simulaes necessrias.
Para obter os coeficientes do controlador, utilizou-se o bloco PID Controller, no
qual possvel digitar os coeficientes ou ento utilizar a funo Tune
7
, que lineariza a Planta
e d, automaticamente, os valores dos coeficientes visando a estabilidade do sistema.


7
Apesar da alta confiabilidade desta funo, algumas vezes possvel que ela no consiga encontrar parmetros
os quais faam o sistema ficar estvel. Nesse caso deve-se voltar para a parte de modelagem da Planta, pois h
boas chances desta estar com valores errado, ou o sistema simplesmente instvel.
29

Figura 11 - Modelo do Simulink de Controle das simulaes.

Fonte: prprio autor.

Como se pode verificar, o modelo sugerido pela figura 12 mostra todos os blocos
utilizados: Sinal degrau de entrada, Somador (Referncia Sada) que resulta no Erro,
Controlador PID, Somador (Sinal de Controle + Perturbaes Externas) e a Funo de
Transferncia da Planta. Vale lembrar que o sinal de realimentao, na prtica, ser provido
atravs de um tacmetro acoplado ao motor cujo sinal de tenso ser lido pelo Arduino.
Dando continuidade, o primeiro passo para ser montado esse modelo da Figura 12,
foi ter criado a funo de transferncia da Planta seguindo a modelagem expressa anteriormente
neste trabalho. Para fins de entendimento da simulao e da robustez do controlador a ser
projetado, foram feitas algumas simulaes usando valores aleatrios, obtidos utilizando a
funo rand() do Matlab e respeitando a grandeza destas constantes, para os coeficientes do
modelo de segunda ordem da Planta.
Estes valores aleatrios recm comentados so indicados na Tabela 2. No total
foram realizados dez casos distintos de estudo com diferentes valores para cada um dos
coeficientes da funo de transferncia da Planta
8
, a fim de testar esta metodologia apresentada.


8
As funes de transferncia discreta da Planta, utilizando valores aleatrios, encontram-se no anexo B.
30

Tabela 2 - Valores adotados para os coeficientes da Funo de Transferncia das Plantas
simuladas tericas
Iterao
1 2 3 4 5
Kb 0,05 0,068 0,018 0,021 0,091
La 0,01 0,03 0,057 0,019 0,06
Ra 2 8,9719 0,5375 4,4172 0,1328
J 0,001 0,007 0,1 0,034 0,03
D 0,001 0,091 0,009 0,009 0,078
Iterao
6 7 8 9 10
Kb 0,068 0,047 0,092 0,011 0,075
La 0,03 0,014 0,022 0,09 0,008
Ra 8,9719 1,9666 0,9337 3,0737 4,5606
J 0,007 0,03 0,005 0,051 0,077
D 0,091 0,54 0,011 0,083 0,034
Fonte: prprio autor

A Tabela 3 refere-se aos coeficientes do parmetros P, I, D e N Proporcional,
Integrador, Derivativo e Filtro resultantes ao se estudar cada uma das cinco iteraes de
valores da Planta no Simulink, ou seja, para a tabela 3 a primeira sendo o Controlador cuja
Planta a da primeira iterao da tabela 2 e assim sucessivamente. A razo de apenas cinco e
no dez iteraes terem sido escolhidas foi apenas para reduzir esforo computacional e no
desviar o foco do objetivo principal, que realizar tal iterao com a planta de ensaio.

Tabela 3 Quadro de Coeficientes do Controlador para o caso da Planta de Simulao terica

Fonte: prprio autor.

Vale comentar que o valor de referncia permaneceu constante no valor escolhido
de 1500 (valor este que seria o desejado de velocidade do motor, em rpm) durante todas as
simulaes e o erro tambm foi para zero, conforme esperado.
Iterao 1 2 3 4 5
P 6,75378 40,81778 110,70208 10,87747 20,2389
I 0,64693 0,00189 0,27464 0,00329 0,0055
D -12,53240 -81,94912 -181,06645 -50,52497 -42,9662
N 0,30808 0,02244 0,49759 0,03790 0,0536
Referencia 1500 1500 1500 1500 1500
Largura de Banda 0.292 0.292 0.292 0.293 0.294
Margem de fase 60 60 60 60 60
Simulao
Coeficientes do Controlador
31

O controlador projetado a partir dos dados prticos da Planta (fundamentado na
oscilografia obtida do motor figura 9) tambm foi obtido, cujos parmetros Proporcional,
Integrador e Derivativo do modelo so apresentados na tabela 4.

Figura 12 - Modelo do Simulink de Controle do Ensaio

Fonte: prprio autor.

Tabela 4 Quadro de Coeficientes do Controlador para o caso da Planta de Ensaio
Coeficientes do Controlador
Ensaio
P 0.1169
I 0.27208
D 0
Referencia 1500 1500 1500 1500 1500
Largura de Banda 0.292 0.292 0.292 0.292 0.292
Margem de fase 60 60 60 60 60
Fonte: prprio autor


Desta forma, com base em todos os resultados dos controladores tanto das
simulaes quanto de ensaio pelo Tune do bloco de PID Controller - o valor final dos
parmetros do controlador a ser utilizado foram os encontrados pelo ensaio, referentes tabela
4, pois com tais valores a robustez e eficcia se mostraram capazes de segurar o modelo da
Planta, mesmo com a algumas variaes de perturbao externa.

32

4 CIRCUITO ELETRNICO PARA INVERSO DO SINAL DE SADA DO
CONTROLADOR & ARDUINO

Ponderando que a corrente disponibilizada pelos pinos de sada do Arduino
bastante reduzida, esse hardware sozinho no teria capacidade de alimentar corretamente os
motores. Desse modo, se fez necessria a elaborao de um circuito de chaveamento (baseado
na razo cclica do sinal de PWM) de uma Ponte-H, para que, alm de trabalhar como o atuador
do controle da velocidade, pudesse ser feita a inverso do sentido da corrente nos polos dos
motores (a fim de possibilitar a r).
A montagem do circuito inicialmente seria feita utilizando o circuito integrado
L293D, pois este j uma ponte-H com diodos internos embutidos cuja corrente tem limite em
600mA. Entretanto, devido indisponibilidade do produto no mercado local, fez-se a utilizao
do L298N, que uma ponte-H dupla, mas com a necessidade de se implantar os diodos
externamente. A montagem desse circuito integrado, juntamente com a lgica necessria para
seu funcionamento correto, descrita no captulo cinco mais detalhadamente.
Este captulo baseia-se em realizar uma simulao de como seria a inverso por
uma ponte-H terica, a fim de melhor compreender o funcionamento do que viria a ser
implementado, atravs do software de simulao ORCAD CAPTURE CIS, por meio da
licena acadmica do departamento de engenharia eltrica. Os resultados das simulaes e seu
esquemtico so ilustradas a seguir.

Figura 13 - Esquemtico do Circuito Eletrnico da Ponte-H

Fonte: prprio autor
33


Onde, para a fonte de sinal livre ligada a base dos transistors, V1 o valor de tenso
inicial para o pulso, V2 o valor final de tenso deste, TD o tempo de atraso tempo cuja tenso
permanece em V1, TR o tempo de subida tempo necessrio para o sinal de tenso passar de
V2 para V1 (deve tender a zero), TF tempo de descida (tempo para passar de V1 para
V2 e tambm interessante se aproxima de zero), PW a largura do pulso (Este valor a
quantidade de tempo que o pulso permanece no valor de V2, funcionado de maneira semelhante
a um valor de razo cclica) e PER o perodo do pulso. Para o caso dos parmetros do motor
CC da simulao, estes so os considerados durante a modelagem matemtica da Planta.
Como (POTSKI,2006) analisa, o funcionamento da ponte H, observando o
esquemtico do circuito mostrado na figura 15, ao se ter um nvel lgico alto na base dos
transistors Q1 e Q3, o primeiro, que um PNP, no conduzir corrente entre os terminais
emissor-coletor, enquanto que o transistor Q3, que um NPN, poder conduzir. Havendo um
nvel lgico baixo na base dos transistors Q2 e Q4, o transistor Q4 conduzir a corrente entre
os terminais emissor-coletor (por ser PNP), mas o Q4 no ser capaz de faz-lo.
Sendo assim, temos uma corrente que flui entre os transistores Q3 e Q4, acionando
o motor, como o caminho verde demonstra. Para alterar o sentido da rotao do motor, basta
inverter o nvel lgico imposto as bases, resultando, assim, no caminho ilustrado pelas setas
vermelhas.

Figura 14 - Grfico da Corrente no Motor CC
Fonte: prprio autor

A figura 16 demonstra graficamente as duas trajetrias do sentido de rotao do
motor (horrio e anti-horrio), a primeira durante os cinco segundos iniciais e a segunda nos
prximos cinco segundos, com um perodo de dez segundos. Observa-se que o valor negativo
da corrente apenas uma mudana de referencial.
34

4.1 Caractersticas do Arduino

Criado pelo professor Massimo Banzi, o Arduino est se tornando um dos mais
utilizados hardwares quando se deseja trabalhar com sistemas embarcados devido sua
simplicidade, fcil linguagem de programao e enorme comunidade.
Assim como dito por (MUNIZ,2012) e (MCROBERTS,2011), em termos
prticos, este hardware utiliza principalmente a comunicao serial pela porta USB a qual
tambm fornece a energia eltrica necessria de alimentao com o computador, no qual
deve ser instalado o ambiente de programao prprio do Arduino
9
e os drivers necessrios
(a literatura disponibilizada pelo prprio fabricante explana como fazer isto para cada tipo
de sistema operacional). A razo pela qual foi escolhida a placa Mega2560 ver figura 3
foi seu custo-benefcio.
A verso utilizada contm 16 pinos de entradas analgicas (maiores detalhes
tcnicos sobre a placa encontram-se no em MUNIZ,2012). Os valores de tenso lidos,
amostrados automaticamente, resultam em valores que variam de zero a 1023 (10 bits).

Figura 15 Arduino Mega 2560

Fonte: http://arduino.cc/en/Main/ArduinoBoardMega2560

Vale comentar que, de acordo com a referncia de tenso utilizada pelo Arduino,
por meio do respectivo pino, possvel alterar a proporcionalidade dos valores amostrados
para a tenso. No entanto, manteve-se o valor de referncia padro do hardware, 5 Volts.
Exemplificando, um valor de 1023 lido pela entrada analgica refere-se, na verdade, a uma
tenso de 5 Volts, da mesma maneira que um valor nulo equivale a 0 (zero) Volts.

9
Existem outros compiladores de cdigo que tambm permitem trabalhar com o Arduino, no entanto para o
presente trabalho optou-se por usar o oficial, disponibilizado em www.arduino.cc
35

4.2 Implementao e Resultados

Este captulo demonstra todo o procedimento prtico para a montagem do prottipo,
principalmente com fotos dos materiais.
Em um primeiro momento, deve ser explicado o funcionamento do circuito
integrado L298N
10
. Este pode ser encontrado em dois encapsulamentos distintos, Multiwatt15
e PowerSO20 (vale comentar que apenas o primeiro foi adquirido devido ser o nico encontrado
no mercado local) e so mostrados nas figuras 16 e 17. O diagrama de bloco que representa a
lgica e o funcionamento interno destes CIs tambm apresentado na figura 18.

Figura 16 Encapsulamento do Multiwatt15

Fonte: Datasheet L298N Dual Full Bridge Driver da ST

Figura 17 - Encapsulamento do PowerSO20

Fonte: Datasheet L298N Dual Full Bridge Driver da ST


10
O datasheet completo do CI em questo pode ser encontrado nos Anexos.
36

Figura 18 Diagrama Interno do L298N

Fonte: Datasheet L298N Dual Full Bridge Driver da ST - (editado pelo autor).

Para melhor entender o funcionamento do CI pela Figura 18, deve-se saber que a
passagem de corrente, provinda da fonte conectada ao pino 4, pelas chaves, somente acontece
quando o nvel lgico alto imposto aos terminais das suas respectivas bases (destaque em
verde). Os caminhos em vermelho e azul demonstram a trajetria da corrente indo e voltando
do motor quando o nvel lgico alto imposto sob as chaves respectivas do lado esquerdo (A).
O mesmo raciocnio pode ser expandido para a ponte H do lado direito (B) da figura. Os pinos
6 e 11 (Enable A e Enable B) ligam ou desligam a respectivas pontes H, enquanto os pinos 1 e
15 servem para a sada da corrente
11
.
Desse modo o controle da corrente que flui para o motor e por consequncia sua
velocidade depende diretamente da frequncia do sinal a ser enviada para as bases dos TBJs,
as quais estaro conectadas aos pinos de sada do Arduino referentes a razo cclica calculada
pelo algoritmo da referncia, atravs do thumbstick. Vale comentar que para a inverso de

11
Na prtica no se fez necessrio as resistncias destas sadas, pois elas se aplicam somente quando se deseja
medir a corrente de sada via um pino de entrada analgica.
37

sentido se faz uma comutao da lgica do pino do L298N que recebia a razo cclica e do
recebia o nvel lgico alto
Continuando com a implementao do prottipo, tambm foi necessrio adquirir
outros dois motores CCs, os quais serviriam como os sensores para a realimentao da malha
de controle. Esses funcionaro como geradores, ou seja, tacmetros, e sero ligados aos motores
por meio de uma correia elstica entre os eixos almejando uma certa rigidez
12
nessa liga. A
energia mecnica transforma-se em eltrica a partir da rotao do eixo e assim a tenso pode
ser lida pela entrada analgica do Arduino, fechando o sistema. A foto referente figura 19
ilustra o descrito.
Figura 19 - Foto do Prottipo

Fonte: prprio autor

Para melhorar a confiabilidade do projeto, observou-se a necessidade da fabricao
do circuito em uma placa de cobre; logo, se fez necessrio criar o desenho do layout da placa
onde ficaro os componentes eletrnicos. Para tal, foi utilizado o software ExpressPCB, por
ser gratuito. O layout desenhado mostrado na figura 20, a seguir.


12
Isso ocorre para evitar o deslizamento da correia e consequentemente ineficincia na transferncia de energia
mecnica.
38

Figura 20 - Layout da placa PCB

Fonte: prprio autor

As principais dificuldades relacionadas com o desenho desta placa se mostraram,
sobretudo, em relao a quais seriam as corretas dimenses dos pinos onde os componentes
iriam adentrar, entretanto, aps algumas tentativas definiu-se corretamente o tamanho a ser os
adotado (0,065de crculo com 0,035 do buraco para furo no casos de conexo de dispositivos
eletrnicos, motores e alimentao 5V e 0,250/0,125 para a alimentao de 12V )
Finalmente, em relao codificao do controlador PID no Arduino, esta foi
baseada no texto explanado por [BEUREGARD,2013]. O cdigo funciona de modo que apenas
necessrio informar os dados dos coeficientes do controlador (Kp,Ki e Kd), pois a referncia
j automaticamente lida pelo valor de resposta do algoritmo proposto anteriormente.
Um comentrio em relao aplicao prtica que, por meio de testes, percebeu-
se que a realimentao pelos tacmetros no alcanava uma preciso to boa quanto se
esperava, mesmo com os cuidados prvios comentados. Desse modo, viu-se necessrio realizar
o mapeamento do valor de realimentao com base no seguinte teste:
Ao se aplicar a tenso de 12V diretamente a cada um dos motores, sem passar pela
Ponte-H, tomou-se nota do valor mximo gerado pelos tacmetros acoplados e, assim, pode-se
realizar o mapeamento no cdigo do intervalo. Este, que deveria se situar entre 0 e 1024, tornou-
se um valor entre 0 e 220 para o motor CC1 e entre 0 e 276 para o motor CC2.

39

O novo intervalo, ao qual tais valores seriam mapeados, continua sendo entre 0 e
255, da mesma maneira que quando utilizado e explanado na seo do algoritmo da referncia.
Tambm observou-se que um problema deveria acontecer quando os motores
girassem em sentido inverso quando desejava-se que o carrinho fosse para trs pois o valor
de tenso que, teoricamente, estaria sendo lido pela entrada analgica do Arduino seria
negativa, uma vez que a corrente estaria percorrendo o sentido contrrio no tacmetro e a
referncia do circuito eltrico (terra) no seria alterado. Por conta disso, admitiu-se que quando
o motor estivesse no sentido reverso (o rob estivesse dando r) no se faria uso do algoritmo
PID, e a referncia provinda do thumbstick seria diretamente aplicada aos motores.
Os parmetros seletos para P,I e D, foram: 0.1169, 0.27208 e 0. Essa escolha foi
fundamentada durante o processo de desenvolvimento obtido na seo Projeto do Controlador.
A Figura 21 ilustra a oscilografia obtida do sinal de resposta do motor seguindo a referncia
proposta. A regio destacada pelo retngulo verde mostra os sinais de referncia, sada e o erro
(os rudos da parte anterior de devem principalmente ao fato de que no momento da foto o
circuito ainda estava montada na protoboard, o que comprometia a qualidade do sinal)

Figura 21 - Oscilografia dos sinais de referencia, sada e erro do controlador durante o ensaio

40

5 CONCLUSO

Este trabalho apresenta, inicialmente, o algoritmo de referncia para a
movimentao de um rob mvel.
Enfatiza-se que a metodologia descrita neste trabalho se mostrou satisfatria, uma
vez que todos os objetivos propostos criar algoritmo de diferena de razo cclica entre rodas,
desenvolver o cdigo para um controlador PID discreto em um microprocessador e implementar
a ponte H foram alcanados, principalmente no que consta ao algoritmo de referncia,
concomitantemente com a equao proposta da diferena de razo cclica e aos parmetros
escolhidos na modelagem matemtica tanto da Planta quanto do Design do Controlador. Deste
modo, comprova-se a robustez do modelo sugerido para realizar as metas traadas inicialmente.
Entretanto, ainda existem certas possibilidades de melhoria, principalmente no que
se refere automao do rob, pois esta pode ser refeita por comunicaes sem fio, dando mais
beleza ao projeto.
Percebe-se tambm que empregando as tcnicas de controle clssico foi possvel
comandar os motores de modo que a velocidade desses permanecessem constantes de maneira
relativamente simples, mas, nada impede que se utilize outras formas de controle moderno para
o mesmo, considerando at mesmo a hiptese de um melhor rendimento caso o controle fosse
realizado por mtodos de inteligncia artificial.
Demais opes para trabalhos futuros em cima do projeto proposto podem consistir
sobretudo em realizar o algoritmo de referncia de modo autnomo, fazendo com que o usurio
do rob apenas informe o destino final deste e, assim, via mediao e feedback de sensores para
navegao (p.e. ultrassnicos), chegar a tal ponto.
Tambm conclui-se que a utilizao do hardware livre do Arduino uma vez que
trouxe significante simplificao ao projeto, pois permitiu que o foco do trabalho e esforos
no fossem dispersos em outras reas da eletrnica. A no utilizao de um hardware pronto,
principalmente com conversores analgico-digitais e simples como este, traria dificuldades no
equivalentes ao valor investido para a aquisio da placa.





41

REFERNCIAS

BARRETT, Steven F. 2010. Arduino Microcontroller: Processing for Everyone. Morgan
& Claypool, 325 pp. ISBN: 9781608454389. Available online at UCSD library

BEUREGARD, Brett. Improving the Beginners PID - Introduction. Disponvel em:
<http://brettbeauregard.com/blog/2011/04/improving-the-beginners-pid-introduction/>.
Acesso em: 13 set. 2013.

BEKEY, George A. Autonomous Robots: From Biological Inspiration to Implementation
and Control. cap.1,3,4,6,7,14; App.: A.1,A.2,A.3,A.4; THE MIT PRESS, Cambridge,
Massachusetts, 2005.

DORF, Richard C., BISHOP, Robert H.; Modern Control Systems. 12ed; PRENTICE
HALL, 2011.

GURU, Bhag S., HIZIROGLU, Huseying R.; Eletric Machinery and Transformers. 3ed.
cap. 6; Department of Electrical and Computer Engineering, Kettering University,OXFORD
UNIVERSITY PRESS, New York, Oxford, 2001.

MATLAB HELP DOCUMENTS.

MCSHAFFRY, Mike Mr.Mike. Game Coding Complete. 3 ed. p.224-225 Boston, 2012.

MUNIZ, Saulo Guillermo DEduard Araripe Sobreira. Controle de Mltiplos
Servomotores: Animao em Robtica. 2012. Monografia (Graduo em Engenharia
Eltrica) Universidade Federal do Cear, Fortaleza, 2012.


OGATA, Katsuhiko. Discrete-time Control Systems. 2 ed. cap.4; PRENTICE HALL
INTERNATIONAL EDITIONS, University of Minnesota, 1995.

PACHECO, Rafael Neto; COSTA, Anna Helena Reali. Navegao de robs mveis
utilizando o mtodo de campos potenciais. Departamento de Engenharia de Computao e
Sistemas Digitais. Escola Politcnica da Universidade de So Paulo, 2002. Disponvel em:
< http://www.lti.pcs.usp.br/robotics/react/html/workcomp2002-react.pdf/>. Acesso em: 27
set. 2013.

PATSKO, Lus Fernando. Tutorial da montagem da ponte H. Maxwell Bohr
Instrumentao Eletrnica, Pesquisa e Desenvolvimento de Produtos, 2006.
Disponvel em: < http://ppgel.ufsj.edu.br/uaisoccer/downloads/1272025457.pdf >. Acesso
em: 27 set. 2013.



42

ANEXOS
Anexo A Cdigo do Algoritmo:
Organizao Geral
clc
clear all
Rotinas de teste da equao criada
for i = 1:20000 %Realizam-se 20000 interaes com valores aleatrios a fim de
cobrir todas as possibilidades de posio do thumbstick
pwmX(i) = randi(255);
pwmY(i) = -randi(255);
valor_med_Y = 127;
Coef = 10 ;% mudar para input('Coef');
pwmX1(i) = pwmX(i);
pwmX2(i) = Coef*pwmX(i)*log(abs(pwmY(i)))/valor_med_Y;

end

for k = 1:20000
pwmX_2(k) = randi(255);
pwmY_2(k) = randi(255);
valor_med_Y_2 = 127;
Coef = 10 ;% mudar para input('Coef');
pwmX1_2(k) = pwmX_2(k);
pwmX2_2(k) = Coef*pwmX_2(k)*log(abs(pwmY_2(k)))/valor_med_Y_2;

end

max_PWMX1 = max(pwmX1)
min_PWMX1 = min(pwmX1)
max_PWMX2 = max(pwmX2)
min_PWMX2 = min(pwmX2)


max_PWMX1_2 = max(pwmX1_2)
min_PWMX1_2 = min(pwmX1_2)
max_PWMX2_2 = max(pwmX2_2)
min_PWMX2_2 = min(pwmX2_2)

43

Plotagem das Figuras
figure(1);
title('pwmX2_1 vs pwmY');
plot (pwmY,pwmX2);
xlabel('pwmY');
ylabel('pwmX2');


figure(2);
title('pwmX2_2 vs pwmY_2');
plot (pwmY_2,pwmX2_2);
xlabel('pwmY_2');
ylabel('pwmX2_2');


Anexo B Cdigo C2D
Coeficientes
Kb = [0.05 ,(randi(100)*10^-3),(randi(100)*10^-3),(randi(100)*10^-3),(randi(100)*10^-
3),(randi(100)*10^-3),(randi(100)*10^-3),(randi(100)*10^-3),(randi(100)*10^-
3),(randi(100)*10^-3)]

La = [0.01 ,(randi(100)*10^-3),(randi(100)*10^-3),(randi(100)*10^-3),(randi(100)*10^-
3),(randi(100)*10^-3),(randi(100)*10^-3),(randi(100)*10^-3),(randi(100)*10^-
3),(randi(100)*10^-3)]

Ra = [ 2
,(rand*10),(rand*10),(rand*10),(rand*10),(rand*10),(rand*10),(rand*10),(rand*10),(rand*10)]

J = [0.001,(randi(100)*10^-3),(randi(100)*10^-3),(randi(100)*10^-3),(randi(100)*10^-
3),(randi(100)*10^-3),(randi(100)*10^-3),(randi(100)*10^-3),(randi(100)*10^-
3),(randi(100)*10^-3)]

D = [0.001,(randi(100)*10^-3),(randi(100)*10^-3),(randi(100)*10^-3),(randi(100)*10^-
3),(randi(100)*10^-3),(randi(100)*10^-3),(randi(100)*10^-3),(randi(100)*10^-
3),(randi(100)*10^-3)]

44

Variveis
for i=1:10
SysC(i) = tf( [Kb(i)], [(0.001*10*10^-3) (D(i)*La(i)+ J(i)*Ra(i)) (Kb(i)^2+2*10^-3)]);
SysD_Impulse(i) = c2d(SysC(i),50*10^-3,'impulse');
SysD_Matched(i) = c2d(SysC(i),50*10^-3,'matched');
SysD_zoh(i) = c2d(SysC(i),50*10^-3,'zoh');
end


SysC_Ensaio = tf(12,[0.22 1],'ioDelay',0.044); % Funo de Transferencia do Motor (mtodo
Ziegler-Nichols)
SysD_Ensaio_zoh = c2d(SysC_Ensaio,50*10^-3,'zoh');
SysD_Ensaio_impulse = c2d(SysC_Ensaio,50*10^-3,'impulse');
SysD_Ensaio_foh = c2d(SysC_Ensaio,50*10^-3 ,'foh');


SysC
SysD_Impulse
SysD_Matched
SysD_zoh
SysC_Ensaio
SysD_Ensaio_zoh
SysD_Ensaio_impulse
SysD_Ensaio_foh


45

SysC =

From input 1 to output:
0.001
---------------------------------
1e-05 s^2 + 0.001001 s + 0.002001

From input 2 to output:
0.055
-------------------------------
1e-05 s^2 + 0.4581 s + 0.005025

From input 3 to output:
0.03
-----------------------------
1e-05 s^2 + 0.5024 s + 0.0029

From input 4 to output:
0.075
-------------------------------
1e-05 s^2 + 0.3819 s + 0.007625

From input 5 to output:
0.019
--------------------------------
1e-05 s^2 + 0.08166 s + 0.002361

From input 6 to output:
0.069
------------------------------
1e-05 s^2 + 0.253 s + 0.006761

From input 7 to output:
0.019
-------------------------------
1e-05 s^2 + 0.2599 s + 0.002361

From input 8 to output:
0.037
--------------------------------
1e-05 s^2 + 0.08554 s + 0.003369

From input 9 to output:
0.063
-------------------------------
1e-05 s^2 + 0.7991 s + 0.005969

From input 10 to output:
0.079
-------------------------------
1e-05 s^2 + 0.1799 s + 0.008241

Continuous-time transfer function.



SysD_Impulse =

From input 1 to output:
0.04664 z - 1.274e-18
-------------------------
z^2 - 0.9104 z + 0.006704

From input 2 to output:
0.006 z
--------------
z^2 - 0.9995 z

From input 3 to output:
0.002985 z + 4.926e-22
----------------------
z^2 - z

From input 4 to output:
0.009808 z
-------------------------
z^2 - 0.999 z - 1.109e-16

From input 5 to output:
0.01162 z - 5.415e-21
--------------------------
z^2 - 0.9986 z + 1.109e-16

From input 6 to output:
0.01362 z + 3.381e-21
--------------------------
z^2 - 0.9987 z + 1.109e-16

From input 7 to output:
0.003653 z - 1.014e-22
----------------------
z^2 - z + 1.11e-16

From input 8 to output:
0.02159 z + 5.899e-21
-------------------------
z^2 - 0.998 z - 1.108e-16

From input 9 to output:
0.00394 z + 4.272e-22
---------------------
z^2 - z

From input 10 to output:
0.0219 z
--------------
z^2 - 0.9977 z

Sample time: 0.05 seconds
Discrete-time transfer function.



46

SysD_Matched =

From input 1 to output:
0.02406 z + 0.02406
-------------------------
z^2 - 0.9104 z + 0.006704

From input 2 to output:
0.003001 z + 0.003001
---------------------
z^2 - 0.9995 z

From input 3 to output:
0.001493 z + 0.001493
---------------------
z^2 - z

From input 4 to output:
0.004907 z + 0.004907
---------------------
z^2 - 0.999 z

From input 5 to output:
0.005812 z + 0.005812
---------------------------
z^2 - 0.9986 z + 4.666e-178

From input 6 to output:
0.006814 z + 0.006814
---------------------
z^2 - 0.9987 z

From input 7 to output:
0.001827 z + 0.001827
---------------------
z^2 - z

From input 8 to output:
0.0108 z + 0.0108
--------------------------
z^2 - 0.998 z + 1.801e-186

From input 9 to output:
0.001971 z + 0.001971
---------------------
z^2 - z

From input 10 to output:
0.01096 z + 0.01096
-------------------
z^2 - 0.9977 z

Sample time: 0.05 seconds
Discrete-time transfer function.



SysD_zoh =

From input 1 to output:
0.03896 z + 0.009152
-------------------------
z^2 - 0.9104 z + 0.006704

From input 2 to output:
0.005999 z + 2.62e-06
---------------------
z^2 - 0.9995 z

From input 3 to output:
0.002984 z + 1.188e-06
----------------------
z^2 - z

From input 4 to output:
0.009808 z + 5.136e-06
-------------------------
z^2 - 0.999 z - 1.109e-16

From input 5 to output:
0.0116 z + 2.845e-05
--------------------------
z^2 - 0.9986 z + 1.109e-16

From input 6 to output:
0.01362 z + 1.077e-05
--------------------------
z^2 - 0.9987 z + 1.109e-16

From input 7 to output:
0.003651 z + 2.811e-06
----------------------
z^2 - z + 1.11e-16

From input 8 to output:
0.02156 z + 5.047e-05
-------------------------
z^2 - 0.998 z - 1.108e-16

From input 9 to output:
0.00394 z + 9.862e-07
---------------------
z^2 - z

From input 10 to output:
0.0219 z + 2.435e-05
--------------------
z^2 - 0.9977 z

Sample time: 0.05 seconds
Discrete-time transfer function.



47

SysC_Ensaio =

12
exp(-0.044*s) * ----------
0.22 s + 1

Continuous-time transfer function.


SysD_Ensaio_zoh =

0.3229 z + 2.117
z^(-1) * ----------------
z - 0.7967

Sample time: 0.05 seconds
Discrete-time transfer function.



SysD_Ensaio_impulse =

2.654
----------
z - 0.7967

Sample time: 0.05 seconds
Discrete-time transfer function.


SysD_Ensaio_foh =

0.01946 z^2 + 1.52 z + 0.9003
-----------------------------
z^2 - 0.7967 z

Sample time: 0.05 seconds
Discrete-time transfer function.



48

Anexo C Oscilografia da sada do Controlador para os cinco casos de Motores
simulados

Figura 22 - malha de controle e sinal de sada do controlador (primeira iterao)

Figura 23 - malha de controle e sinal de sada do controlador (segunda iterao)

Figura 24 - malha de controle e sinal de sada do controlador (terceira iterao)

Figura 25 - malha de controle e sinal de sada do controlador (quarta iterao)

49

Figura 26 - malha de controle e sinal de sada do controlador (quinta iterao)


50

Anexo D Cdigo no Arduino

/*
* CODIGO REFERENTE AO CONTROLE MANUAL DO ROBO MOVEL.
* RESUMO:
* A FUNCAO LOOP FICA ESPERANDO A SERIAL PARA ENTRAR EM UMA DAS FUNCOES PRINCIPAIS (1 A
4).

* FUNCAO 1: FUNCAO EM FRENTE - FUNCAO APENAS PARA TESTAR MOTORES E SENSOR ULTRASOM
* FUNCAO 2: CONTROLE MANUAL - JOYSTICK -> CONTROLE DE VELOCIDADE
*(FUTURO)FUNCAO 3: CONTROLE AUTONOMO - ALGORITMO SPLINE PARA GERAR TRAJETORIA -> CONTROLE
VELOCIDADE
* FUNCAO 4: COMUNICACAO PROTOCOLO - LE A SERIAL, JA PROTOCOLADA, E REALIZA ACOES
CONSEQUENTES
*/

/////////////////////// BIBLIOTECAS
/////////////////////////////=================================================================
=============================================================

// Bibliotecas
#include <PID_v1.h>
#include<Wire.h>
#define DEVICE (0x53) // Endereo do dispositivo ADXL345
#define TO_READ (6) // N de bytes a serem lidos por vez (dois bytes por eixo)

byte buff[TO_READ] ; // Buffer para salvar os dados de 6 bytes de leitura
char str[512]; // String buffer que adapta o dado para a porta serial

//#include "Ultrasonic.h"///////////////////////////////////////
#ifndef Ultrasonic_h //
#define Ultrasonic_h //
#if (ARDUINO >= 100) //
#include <Arduino.h> //
#else //
#include <WProgram.h> //
#endif //
#define CM 1 //
#define INC 0 //
class Ultrasonic //
{ //
public: //
Ultrasonic(int TP, int EP); //
long Timing(); //
long Ranging(int sys); //
//
private: //
int Trig_pin; //
int Echo_pin; //
long duration,distacne_cm,distance_inc; //
//
}; //
#endif //
//Ultrasonic.cpp////////////////////////////////////////////////
#if (ARDUINO >= 100) //
51

#include <Arduino.h> //
#else //
#include <WProgram.h> //
#endif //
Ultrasonic::Ultrasonic(int TP, int EP){ //
pinMode(TP,OUTPUT); //
pinMode(EP,INPUT); //
Trig_pin=TP; //
Echo_pin=EP;} //
long Ultrasonic::Timing(){ //
digitalWrite(Trig_pin, LOW); //
delayMicroseconds(2); //
digitalWrite(Trig_pin, HIGH); //
delayMicroseconds(10); //
digitalWrite(Trig_pin, LOW); //
duration = pulseIn(Echo_pin,HIGH); //
return duration;} //
long Ultrasonic::Ranging(int sys) //
{ Timing(); //
distacne_cm = duration /29 / 2 ; //
distance_inc = duration / 74 / 2; //
if (sys) //
return distacne_cm; //
else //
return distance_inc;} //
//////////////////////////////////////////

/////////////////////// VARIAVEIS
/////////////////////////////=================================================================
=============================================================
// Variveis

// Em Frente

char P;

//Escolha
int k;
int dec;
int opcao; //return da funo Escolha

//ASCII2DEC
char ascii; //parametro da funo ASCII2DEC
int valor; // return funo ASCII2DEC

//Ultrasom
int TriggerP = 12; // PINO TRIGGER
int EchoP = 11; // PINO ECHO
Ultrasonic ultrasonic(TriggerP,EchoP); // objeto da biblioteca

//Thumbstick
int VRx = A12;
int VRy = A10;
int SW = A8;
int valor_X = 0;
int valor_X_med = 0;
int valor_Y = 0;
52

int valor_Y_med = 0;
int valor_SW = 0;
int pwmX = 0;
int pwmX_percentagem = 0;
int pwmY = 0;
int pwmY_percentagem = 0;

int pwmX1 = 0;
int pwmX2 = 0;

int Ponte_H1 = 3;
int Ponte_H2 = 4;
int Ponte_H3 = 5;

int pinoX1 = 6;
int pinoX2 = 7;
int pinoY = 8;

int Enable_A = 22;
int Enable_B = 24;

//calibracao
int sensorValueX = 0; // the sensor value X
int sensorValueY = 0; // the sensor value Y
int sensorValueSW = 0; // the sensor value SW
int sensorMinX = 0; // minimum sensor value X
int sensorMaxX = 1023; // maximum sensor value X
int sensorMinY = 0; // minimum sensor value Y
int sensorMaxY = 1023; // maximum sensor value Y
int sensorMinSW = 0; // minimum sensor value SW
int sensorMaxSW = 1023; // maximum sensor value SW

int x_max = 0;
int x_min = 0;

int y_max = 0;
int y_min = 0;

int z_max = 0;
int z_min = 0;


//SPLINE
int destino[7];
int spline[2];
int saida;
int hi;
int di;
int resultado_Spline;

//LED
int led = 13; // pino para LED
long contador;

//Motores DC
int DC1 = 30; // Pino para motor DC1
int DC2 = 40; // pino para motor DC2
53


//PID
int Realimentacao_map_DC1;
int Realimentacao_map_DC2;
float Saida_DC1_map;
float Saida_DC2_map;
int resultado_PID_DC1;
int resultado_PID_DC2;
long lastTime_DC1, lastTime_DC2;
int Realimentacao_DC1,Realimentacao_DC2, Saida_DC1,Saida_DC2;
int lastErr_DC1, lastErr_DC2;
double kp_DC1, ki_DC1, kd_DC1, kp_DC2, ki_DC2, kd_DC2;
/////////////////////// SETUP
/////////////////////////////=================================================================
=============================================================

//Funo SETUP
void setup()
{
pinMode(led,OUTPUT);
pinMode(DC1,OUTPUT);
pinMode(DC2,OUTPUT);
pinMode(Enable_A,OUTPUT);
pinMode(Enable_B,OUTPUT);

Serial.begin(115200);
delay(20); // Elimina possveis caracteres estranhos no inicio da
comunicao
Menu();

}
/////////////////////// LOOP
/////////////////////////////=================================================================
=============================================================
//Funo LOOP
void loop()
{
k=2;
// k=escolha();
switch (k){ // caso o valor entre parentese,k, seja igual a label do case, case '1'



case 1:

em_frente();
break;

case 2:

pre_controle_manual();
break;

case 3:

Controle_autonomo();
break;
54


case 4:
while(true)
{
pendulo();
}
break;

}

}

/////////////////////// Funes
/////////////////////////////=================================================================
=============================================================


//////////////////////Funo MENU INICIAL
void Menu(){

Serial.println(">Menu<");
Serial.println("-----------------------");
Serial.println("1. Seguir em frente ");
Serial.println("2. Controle Manual ");
Serial.println("3. Controle Autonomo "); //(SIMULAO COM
THUMBSTICK) comunicao direta com tablet. desenho tela do tablet do trajeto a ser seguido --
recebimento dos pontos direto pelo tablet (bluetooth) --
Serial.println("4. Pendulo ");
Serial.println("-----------------------");
Serial.println("Escolha uma opcao: \t");

}
////////////////////////////////////////FIM MENU


//////////////////////Funo 1. Seguir em frente
void pre_em_frente(){ //Essa funo s ir fazer o carro se movimentar caso no haja nada
na frente dele a menos de 5 cm.
em_frente();
}
////////////////////////////////////////FIM EM_FRENTE

//////////////////////Funo 2. Controle Manual TABLET ( THUMBSTICK )
void pre_controle_manual(){

// calibracao();
controle_manual();

}
////////////////////////////////////////FIM CONTROLE MANUAL

//////////////////////Funo 3. CONTROLE AUTNOMO
/* Atravs do destino inserido pelo usurio, calcula-se a melhor trajetria at o ponto
evitando obstculos.*/
void Controle_autonomo(){


55

int aux; // varivel auxiliar se precisar.
Serial.println("Controle autonomo");
Serial.print ("O robo iniciara em (0,0)");
Destino() ; // funo para adquirir o ponto de destino desejado!


resultado_Spline = func_spline(destino[0],destino[1]);
Serial.print(" \n Resultado = ");
Serial.print(resultado_Spline);
Serial.println("\n");
Menu();

}
////////////////////////////////////////FIM CONTROLE AUTNOMO

//////////////////////Funo 3. COMUNICAO PROTOCOLADA
void pre_comunicacao()
{
comunicacao_prot();
}

////////////////////////////////////////FIM COMUNICAO PROTOCOLADA
//////////////////////Funo Escolha
int escolha(){
while ( Serial.available() > 0 ){
char ascii = Serial.read();
Serial.print(ascii);

dec = ascii2dec(ascii); // funo que transforma 'opcao' ( 49~54 em ascii ) para
decimal (1~6)

if (dec >=1 && dec <= 6){
opcao = dec;
Serial.println("\n Opcao escolhida foi: ");
Serial.print(opcao );
Serial.println("\n");
return opcao;
}
else {

Serial.println("\n Valor errado. \n");
Menu();
}
}
}

///////////////////////////////////////Funo Extra 3. CONTROLE MANUAL

void controle_manual(){

/* AQUISIO DE VALORES ANALGICOS */
valor_X = ((analogRead(VRx))); // leitura dos valores analgicos do
thumbstick
56

delay(5); // intervalo de tempo para garantir a
no-repetio do valor1 com o valor2
valor_Y = ((analogRead(VRy))); //
delay(5);
valor_SW = analogRead(SW);
// delay(5);

/* MOSTRANDO VALORES ANALGICOS */
// Serial.print("\nValue X: "); //printa os valores de X
// Serial.print(valor_X);
// Serial.print("\t Value Y: "); //printa os valores de Y
// Serial.print(valor_Y);
// Serial.print("\t Value SW: "); //printa os valores de SW
// Serial.print(valor_SW);




/* CONDIO DE RETORNO AO MENU PRINCIPAL */
if (valor_SW == 0 ){
Serial.print("\n Retornando ao Menu Principal\n");
Menu();
return;
}

/* GERANDO OS PWM'S EQUIVALENTES */
else{
delay(10);

valor_X_med = map ( ((sensorMaxX-sensorMinX)/2) ,sensorMinX,sensorMaxX,0,255);
/* faz uma transformao do valor [ (sensorMaxX -sensorMinX)/2 ] no intervalo sensorMinX

e sensorMaxX para seu equivalente no intervalo de zero a 255 -> VALOR_X_MED ~= 128*/

delay(10);

valor_Y_med = map ( ((sensorMaxY-sensorMinY)/2) ,sensorMinY,sensorMaxY,0,255);

delay(10);

/* MAPEANDO OS VALORES PARA O EIXO X*/
pwmX = map(valor_X, sensorMinX, sensorMaxX, 0, 255) ; /* faz uma
transformao do valor_X no intervalo sensorMinX
e sensorMaxX para seu
equivalente no intervalo de zero a 255 */

pwmX_percentagem = map(pwmX,valor_X_med,255,0,100); // O valor
novamente mapeado para seu equivalente entre 0 e 100 %
pwmX = map(pwmX,valor_X_med,255,0,255); // 2 Transformao:
de "0-255" para "valor_X_med-255" ( para um PWM correto )

delay(10);

/* MAPEANDO OS VALORES DE PARA O EIXO Y*/
pwmY = map(valor_Y, sensorMinY, sensorMaxY, 0, 255);

pwmY_percentagem = map(pwmY,valor_Y_med,255,0,100); // O valor
57

novamente mapeado para seu equivalente entre 0 e 100 %

pwmY = map(pwmY,valor_Y_med,255,0,255); // 2 Transformao:
de "0-255" para "valor_X_med-255" ( para um PWM correto )

delay(10);

/* MOSTRANDO OS VALORES MAPEADOS DE X E Y*/
Serial.print("\n\t PWM X =");
Serial.print(pwmX);
Serial.print("(");
Serial.print(pwmX_percentagem);
Serial.print(" %)");


// Serial.print("\t PWM Y =");
// Serial.print(pwmY);
// Serial.print("(");
// Serial.print(pwmY_percentagem);
// Serial.print(" %)");
}
/* SADA DO PWM */
/* AQUI DEVER CONTER O PWM REFERENTE AO X (PWM X) EM DOIS PINOS DISTINTOS (
PINOX1 E PINOX2 ).
CADA PINO REFERENCIADO A UM MOTOR DC ( PINOX1 AO DC1 & PINOX2 AO DC2 ).
DESSE MODO, O PWM Y SER O VALOR A SER SUBSTRADO DE UM DOS DOIS PINOS PARA
QUE AS RODAS GIREM EM VELOCIDADES DIFERENTES
E ASSIM O ROB POSSA GIRAR PARA ESQUERDA OU DIREITA -
http://home.kendra.com/mauser/Joystick.html &&
http://www.robotc.net/forums/viewtopic.php?f=33&t=823 (principal)
*/

/*Observao: Subdividido em pwmX > 5 e pwmX < -5. Quando pwmX < -5, aciona a
chave da ponte H para poder rodar no sentido contrrio*/

digitalWrite(Enable_A,HIGH); // LIGA A
PONTE H ESQUERDA DO L298N
digitalWrite(Enable_B,HIGH); // LIGA A
PONTE H DIREITA DO L298N
/*============================================================================================
============================================================================================*/

/* CONDIO DE EM FRENTE*/
if (pwmY < 7 && pwmY > -7 && pwmX > 10 ){

pwmX1 = pwmX;
resultado_PID_DC1 = func_PID_DC1(pwmX1,0.73,1.47,0.2); // (double
Referencia,double Kp, double Ki, double Kd)
pwmX2 = pwmX;
resultado_PID_DC2 = func_PID_DC2(pwmX2,0.73,1.47,0.2); // (double
Referencia,double Kp, double Ki, double Kd)

analogWrite(pinoX1,resultado_PID_DC1); // PWM
[VARIAVEL] da RODA ESQUERDA (DC1) : PINO6_ARDUINO ->PINO 5_L298N
analogWrite(Ponte_H1,LOW); // IN2 do
L298N, que deve ser Zero : PINO3_ARDUINO ->PINO 7_L298N

58

Serial.print("\t PID_DC1 = ");
Serial.print(resultado_PID_DC1);

analogWrite(pinoX2,resultado_PID_DC2); // PWM
[VARIVEL]da RODA DIREITA (DC2) : PINO7_ARDUINO ->PINO 10_L298N
analogWrite(Ponte_H2,LOW); // IN3 do
L298N, que deve ser Zero : PINO4_ARDUINO ->PINO 12_L298N
Serial.print("\t PID_DC2 = ");
Serial.print(resultado_PID_DC2);

// Serial.print("\t PH- frente \t PWM DC1 = ");
// Serial.print(pwmX1);
// Serial.print("\t PWM DC2 = ");
// Serial.print(pwmX2);
/*============================================================================================
============================================================================================*/
}
/* CONDIO DE PRA TRS*/
else if(pwmY < 7 && pwmY > -7 && pwmX < -10 ){

pwmX1 = abs(pwmX) ; pwmX2 = abs(pwmX) ;

analogWrite(pinoX1,LOW); // IN1 do
L298N, que deve ser Zero : PINO6_ARDUINO ->PINO 5_L298N
analogWrite(Ponte_H1,pwmX1); // PWM
[VARIVEL] da RODA ESQUERDA (DC1) : PINO3_ARDUINO ->PINO 7_L298N
analogWrite(pinoX2,HIGH); // IN4 do
L298N, que deve ser Zero : PINO7_ARDUINO ->PINO 10_L298N
analogWrite(Ponte_H2,pwmX2); // PWM
[MXIMO]da RODA DIREITA (DC2) : PINO4_ARDUINO ->PINO 12_L298N

Serial.print("\t PH+ tras \t PWM DC1 = ");
Serial.print(pwmX1);
Serial.print("\t PWM DC2 = ");
Serial.print(pwmX2);

}

/*============================================================================================
============================================================================================*/
/* CONDIES DE GIRO ( ESQUERDA ) */
if(pwmY <= -7 ){ // Margem de
erro adotada de |3|

/* CONDIES PARA ESQUERDA FRENTE (2 quadrante) */
if ( pwmX > -10 ){ // 2 quadrante
inicia acima do -5.

Serial.print("\t PH-");

pwmX1 = abs(15*pwmX*log(abs(pwmY))/valor_Y_med);
pwmX2 = abs(pwmY);

if (pwmY > -250){
pwmX1 = abs(18*pwmX*log(abs(pwmX))/valor_Y_med); // LOG na
linguagem do arduino neperiano. A alterao para log(pwmX) para continuar na trajetria
limite at chegar no "para frente".
59

pwmX2 = abs(pwmX); // Mudana para
pwmX1 ser igual ao pwmX, devido a correo da funo logaritmica
}

analogWrite(pinoX1,pwmX1); // PWM [MXIMO] da
RODA ESQUERDA (DC1) : PINO6_ARDUINO ->PINO 5_L298N
analogWrite(Ponte_H1,LOW); // IN2 do L298N, que
deve ser Zero : PINO3_ARDUINO ->PINO 7_L298N
analogWrite(pinoX2,pwmX2); // PWM [VARIVEL]da
RODA DIREITA (DC2) : PINO7_ARDUINO ->PINO 10_L298N
analogWrite(Ponte_H2,LOW); // IN3 do L298N, que
deve ser Zero : PINO4_ARDUINO ->PINO 12_L298N

}

/*===================================================================*/
/* CONDIES PARA ESQUERDA TRS (3 quadrante) */
else { // 3
quadrante inicia abaixo do -5.
Serial.print("\t PH+");
pwmX2 = abs(pwmY); //
necessidade da ausncia de mdulo para funcionar corretamente a r
pwmX1 = abs(15*pwmX*log(abs(pwmY))/valor_Y_med);

if (pwmY > -250){
pwmX1 = abs(18*pwmX*log(abs(pwmX))/valor_Y_med); // LOG na
linguagem do arduino neperiano.A alterao para log(pwmX) para continuar na trajetria
limite at chegar no "para trs".
pwmX2 = abs(pwmX); // Mudana
para pwmX1 ser igual ao pwmX, devido a correo da funo logaritmica
}
analogWrite(pinoX1,LOW); // IN1 do
L298N, que deve ser Zero : PINO6_ARDUINO ->PINO 5_L298N
analogWrite(Ponte_H1,pwmX1); // PWM
[VARIVEL] da RODA ESQUERDA (DC1) : PINO3_ARDUINO ->PINO 7_L298N
analogWrite(pinoX2,HIGH); // IN4 do
L298N, que deve ser Zero : PINO7_ARDUINO ->PINO 10_L298N
analogWrite(Ponte_H2,pwmX2); // PWM
[MXIMO]da RODA DIREITA (DC2) : PINO4_ARDUINO ->PINO 12_L298N

}

Serial.print(" \t esquerda ");
Serial.print("\t PWM DC1 = ");
Serial.print(pwmX1);
Serial.print("\t PWM DC2 = ");
Serial.print(pwmX2);
}
/*============================================================================================
============================================================================================*/
/* CONDIES DE GIRO ( DIREITA ) */

if(pwmY > 7){ // Margem de erro adotada de |3|

/* CONDIES PARA DIREITA FRENTE (1 quadrante) *//////
if (pwmX > -10){ // 1 quadrante
inicia acima do -5.
60


Serial.print("\t PH-");
pwmX1 = abs(pwmY);
pwmX2 = abs(15*pwmX*log(abs(pwmY))/valor_Y_med); // LOG na linguagem
do arduino neperiano

if (pwmY < 250){
pwmX1 = abs(pwmX); // Mudana para
pwmX1 ser igual ao pwmX, devido a correo da funo logaritmica
pwmX2 = abs(18*pwmX*log(abs(pwmX))/valor_Y_med); // LOG na linguagem
do arduino neperiano.A alterao para log(pwmX) para continuar na trajetria limite at
chegar no "em frente".
}

analogWrite(pinoX1,pwmX1); // PWM [MXIMO] da
RODA ESQUERDA (DC1) : PINO6_ARDUINO ->PINO 5_L298N
analogWrite(Ponte_H1,LOW); // IN2 do L298N, que
deve ser Zero : PINO3_ARDUINO ->PINO 7_L298N
analogWrite(pinoX2,pwmX2); // PWM [VARIVEL]da
RODA DIREITA (DC2) : PINO7_ARDUINO ->PINO 10_L298N
analogWrite(Ponte_H2,LOW); // IN3 do L298N, que
deve ser Zero : PINO4_ARDUINO ->PINO 12_L298N
/***************************************************/

}

/* CONDIES PARA DIREITA TRS (4 quadrante) */////////
else{ // 4 quadrante
inicia abaixo do -5.
Serial.print("\t PH+");
pwmX1 = abs(pwmY) ;
pwmX2 = abs(15*pwmX*log(abs(pwmY))/valor_Y_med);

if (pwmY < 250){
pwmX1 = abs(pwmX); // Mudana para
pwmX1 ser igual ao pwmX, devido a correo da funo logaritmica
pwmX2 = abs(18*pwmX*log(abs(pwmX))/valor_Y_med); // LOG na linguagem
do arduino neperiano.A alterao para log(pwmX) para continuar na trajetria limite at
chegar no "para trs".
}

analogWrite(pinoX1,LOW); // IN1 do L298N,
que deve ser Zero : PINO6_ARDUINO ->PINO 5_L298N
analogWrite(Ponte_H1,pwmX1); // PWM [MXIMO] da
RODA ESQUERDA (DC1) : PINO3_ARDUINO ->PINO 7_L298N
analogWrite(pinoX2,HIGH); // IN4 do L298N,
que deve ser Zero : PINO7_ARDUINO ->PINO 10_L298N
analogWrite(Ponte_H2,pwmX2); // PWM [VARIVEL]da
RODA DIREITA (DC2) : PINO4_ARDUINO ->PINO 12_L298N
/***************************************************/

}
Serial.print(" \t direita ");
Serial.print(" \t PWM DC1 = ");
Serial.print(pwmX1); // pino 5
Serial.print("\t PWM DC2 = ");
Serial.print(pwmX2); // pino 6
61

}

/*============================================================================================
============================================================================================*/
/* CONDIO DE PARADO*/
if (pwmY <= 6 && pwmY >= -6 && pwmX <= 10 && pwmX >= -10 ){

digitalWrite(Enable_A,LOW); // DESLIGA A
PONTE H ESQUERDA DO L298N
digitalWrite(Enable_B,LOW); // DESLIGA A
PONTE H DIREITA DO L298N

pwmX1 = 0 ; pwmX2 = 0 ;

/* Limapando as Sadas*/////
analogWrite(pinoX1,pwmX1);//
analogWrite(pinoX2,pwmX2);//
analogWrite(Ponte_H1,LOW);//
analogWrite(Ponte_H2,LOW);//
/**********************/////

Serial.print("\t PH- parado \t \t PWM DC1 = ");
Serial.print(pwmX1);
Serial.print("\t PWM DC2 = ");
Serial.print(pwmX2);

/*Leitura do Realimentacao pela entrada analgica conectada aos
Tacometros*/
Realimentacao_DC1 = analogRead(A5);
int Realimentacao_map_DC1 = map(Realimentacao_DC1, 0, 276, 0, 255); //
devido as imperfeies do sistema do tacometro (liga entre eixos)
//o
valor mximo lido quando aplicado tenso nominal entre os terminais do motor
// pela
entrada analgica do Arduino foi 276. Entretanto s funciona para frente pois no
// foi
implementado uma

Serial.print("\t RealimDC1 = ");
Serial.print(Realimentacao_DC1);

Realimentacao_DC2 = analogRead(A3);
int Realimentacao_map_DC2 = map(Realimentacao_DC2, 0, 220, 0, 255); //
devido as imperfeies do sistema do tacometro (liga entre eixos)
//o
valor mximo lido quando aplicado tenso nominal entre os terminais do motor
// pela
entrada analgica do Arduino foi 220
Serial.print("\t RealimDC2 = ");
Serial.print(Realimentacao_DC2);

}

/* RETORNO AQUISIO DE VALORES ANALGICOS PARA NOVA ITERAO */

// comunicacao_prot(); // Entra na
funo de ler a serial e guarda o protocolo APENAS se tiver algo na serial.
62

controle_manual();
}



////////////////////////////////////////////// FIM CONTROLE MANUAL

float func_PID_DC1(int Referencia_DC1,float Kp_DC1, float Ki_DC1, float Kd_DC1)
{
int errSum_DC1;
int limiar_DC1 = 255;
float Periodo_Amostragem_DC1 = 1; // 1/2 segundo


/*Leitura do Realimentacao pela entrada analgica conectada aos Tacometros*/
Realimentacao_DC1 = analogRead(A5);
Realimentacao_map_DC1 = map(Realimentacao_DC1, 0, 276, 0, 255); //
devido as imperfeies do sistema do tacometro (liga entre eixos)
//o
valor mximo lido quando aplicado tenso nominal entre os terminais do motor
// pela
entrada analgica do Arduino foi 276. Entretanto s funciona para frente pois no
// foi
implementado uma
Serial.print("\t RealimDC1 = ");
Serial.print(Realimentacao_DC1);

/*Tempo*/
float now_DC1 = (millis()/1000);
int timeChange_DC1 = abs(now_DC1 - lastTime_DC1);
if (timeChange_DC1 >= Periodo_Amostragem_DC1)
{
// PID PARALELO -> Kp*erro + Ki*Integral(erro) + Kd* d(erro)/dt
int error_DC1 = (Referencia_DC1 - Realimentacao_map_DC1);
errSum_DC1 += (error_DC1*timeChange_DC1); // Realiza a
mesma operao que o clculo da integral do erro (Integrador)
int dErr_DC1 = (error_DC1 - lastErr_DC1)/timeChange_DC1;
// Realiza a mesma operao que o clculo da derivada do erro (Derivativo)

//
kp_DC1 = Kp_DC1;
ki_DC1 = Ki_DC1;
kd_DC1 = Kd_DC1;



/*Computa a sada do PID */
Saida_DC1 = abs( kp_DC1 * error_DC1 + ki_DC1 * errSum_DC1 + kd_DC1 * dErr_DC1);
// if (Saida_DC1 > 255) Saida_DC1 = 255;

Serial.print("\t Saida_DC1 = ");Serial.print(Saida_DC1);

// Serial.print("\t errSum_DC1 = ");
// Serial.print(errSum_DC1);
63

// Serial.print("\t dErr_DC1 = ");
// Serial.print(dErr_DC1);
//
// Serial.print("\t now_DC1 = ");
// Serial.print(now_DC1);
/*Para segunda iterao*/
lastErr_DC1 = error_DC1;
lastTime_DC1 = now_DC1;



return Saida_DC1;
}
return Saida_DC1;
}

float func_PID_DC2(int Referencia_DC2,float Kp_DC2, float Ki_DC2, float Kd_DC2)
{
int errSum_DC2;
int limiar_DC2 = 255;
float Periodo_Amostragem_DC2 = 1; // 1/2 segundo


/*Leitura do Realimentacao pela entrada analgica conectada aos Tacometros*/
Realimentacao_DC2 = analogRead(A5);
Realimentacao_map_DC2 = map(Realimentacao_DC2, 0, 276, 0, 255); //
devido as imperfeies do sistema do tacometro (liga entre eixos)
//o
valor mximo lido quando aplicado tenso nominal entre os terminais do motor
// pela
entrada analgica do Arduino foi 276. Entretanto s funciona para frente pois no
// foi
implementado uma
Serial.print("\t RealimDC2 = ");
Serial.print(Realimentacao_DC2);

/*Tempo*/
float now_DC2 = (millis()/1000);
int timeChange_DC2 = abs(now_DC2 - lastTime_DC2);
if (timeChange_DC2 >= Periodo_Amostragem_DC2)
{
// PID PARALELO -> Kp*erro + Ki*Integral(erro) + Kd* d(erro)/dt
int error_DC2 = (Referencia_DC2 - Realimentacao_map_DC2);
errSum_DC2 += (error_DC2*timeChange_DC2); // Realiza a
mesma operao que o clculo da integral do erro (Integrador)
int dErr_DC2 = (error_DC2 - lastErr_DC2)/timeChange_DC2;
// Realiza a mesma operao que o clculo da derivada do erro (Derivativo)

//
kp_DC2 = Kp_DC2;
ki_DC2 = Ki_DC2;
kd_DC2 = Kd_DC2;


64


/*Computa a sada do PID */
Saida_DC2 = abs( kp_DC2 * error_DC2 + ki_DC2 * errSum_DC2 + kd_DC2 * dErr_DC2);
if (Saida_DC2 > 255) Saida_DC2 = 255;

// Serial.print("\t error_DC2 = ");
// Serial.print(error_DC2);
// Serial.print("\t errSum_DC2 = ");
// Serial.print(errSum_DC2);
// Serial.print("\t dErr_DC2 = ");
// Serial.print(dErr_DC2);
//
// Serial.print("\t now_DC2 = ");
// Serial.print(now_DC2);
/*Para segunda iterao*/
lastErr_DC2 = error_DC2;
lastTime_DC2 = now_DC2;



return Saida_DC2;
}
return Saida_DC2;
}

You might also like