Monografia REVISÃO V1

download Monografia REVISÃO V1

of 66

Transcript of Monografia REVISÃO V1

  • 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 diferencial1 (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: - 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 (SW2)

    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 Intervalo

    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 separada3. 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 permanentes4.

    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:

    Vs = VR + VL + VEMF (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

    VS(t) = i(t) + L d i(t)

    d t+ VEMF() (4)

    VEMF = Kb () (5)

    Kb = Ka (6)

    Onde a resistncia de armadura, L a indutncia, Kb uma constante devido a

    corrente de campo uniforme, Ka a constante da mquina e o fluxo por plo.

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

    T = Kb 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 Place5 nas

    equaes 4 e 7, temos que:

    Ra i(s) + i(s) + (s) = VS(s) (8)

    Kb 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)

    VS(s)=

    Kb

    s2(J La)+s(DLa+JRa)+(RaD+Kb) (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 milissegundos6), 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 (Kb) 103 N.m/A

    Constante de Inrcia (J) 103 N.m.s/rad

    Coeficiente de frico (D) 103 N.m.s

    Resistencia de Armadura 1 Ohms

    Indutncia 103 Henry

    Fluxo por Plo 103 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

    20.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=

    yfy0

    xfx0=

    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.

    () = 10.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 Tune7, 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 Planta8, 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 Arduino9 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 L298N10. 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 corrente11.

    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 rigidez12 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: .

    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

    #include

    #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 //

    #else //

    #include //

    #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 //

    #else //

    #include //

    #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

  • 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

  • 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 -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