Sunteți pe pagina 1din 70

INSTITUTO FEDERAL DE EDUCAO, CINCIA E TECNOLOGIA FLUMINENSE IFFluminense

PROGRAMA DE GRADUAO EM ENGENHARIA DE CONTROLE E AUTOMAO


BACHARELADO EM ENGENHARIA DE CONTROLE E AUTOMAO

Caio Jorge Haddad de Paula

PROJETO E CONSTRUO DE UM ROB AUTNOMO COM VISO


COMPUTACIONAL

CAMPOS DOS GOYTACAZES, RJ


Dezembro de 2015

INSTITUTO FEDERAL DE EDUCAO, CINCIA E TECNOLOGIA FLUMINENSE IFFluminense


COORDENAO DE GRADUAO EM ENGENHARIA DE CONTROLE E AUTOMAO
BACHARELADO EM ENGENHARIA DE CONTROLE E AUTOMAO

Caio Jorge Haddad de Paula

PROJETO E CONSTRUO DE UM ROB AUTNOMO COM VISO


COMPUTACIONAL

Trabalho
de
Concluso
de
Curso
apresentado coordenao do curso de
Engenharia de Controle e Automao, do
Instituto Federal de Educao, Cincia e
Tecnologia Fluminense, para obteno do
grau de BACHAREL EM ENGENHARIA DE
CONTROLE E AUTOMAO

Orientador: Prof. MSc. Edson Simes dos Santos.

CAMPOS DOS GOYTACAZES, RJ


Dezembro de 2015

CAIO JORGE HADDAD DE PAULA

PROJETO E CONSTRUO DE UM ROB AUTNOMO COM VISO


COMPUTACIONAL

Trabalho
de
Concluso
de
Curso
apresentado Coordenao de Engenharia
de Controle e Automao, do Instituto
Federal de Educao, Cincia e Tecnologia
Fluminense Campos dos Goytacazes/RJ,
para obteno do grau de BACHAREL EM
ENGENHARIA
DE
CONTROLE
E
AUTOMAO

Aprovada em 23 de dezembro de 2015.

Orientador: Prof. MSc. Edson Simes dos Santos.

BANCA EXAMINADORA
_________________________________________________________
Professor Edson Simes dos Santos, M.Sc.- Orientador
Instituto Federal Fluminense
_________________________________________________________
Professor Fbio Junio dos Santos Coelho
Instituto Federal Fluminense
________________________________________________________
Professor Marcos Moulin Valencia
Instituto Federal Fluminense

CAMPOS DOS GOYTACAZES / RJ


DEZEMBRO 2015

AGRADECIMENTOS

Agradeo a Deus pela sua infinita misericrdia.


Ao meu orientador, professor Edson Simes dos
Santos, pela compreenso e dedicao que foram
fundamentais na concretizao deste trabalho.
Aos meus queridos e amados pais e irm, Jorge
Afonso de Paula, Faride Rena Haddad de Paula e
Sara Ester Haddad de Paula, pela pacincia e
dedicao.
A minha querida namorada, Giullia Junqueira
Pessanha pelo carinho e apoio incondicional.
A minha querida tia Denise Rena Haddad que
contribuiu com orientao e recursos para a
concluso deste projeto.
Ao Instituto Federal de Educao, Cincia e
Tecnologia Fluminense pela disponibilizao de
seus laboratrios sem os quais o projeto no
poderia ter se concretizado.

A vitria cabe ao que mais persevera.


Napoleo Bonaparte

RESUMO

O objetivo deste projeto construir um rob com viso computacional via


processamento de imagens, em que uma plataforma microcontrolada recebe um
algoritmo de controle para que o objetivo de colocar a bola dentro do gol seja alcanado.
Esta plataforma recebe parmetros referentes as posies dos objetos dentro do espao
delimitado como o campo. Tal sistema dever ser utilizado para fins educacionais dentro
do Instituto Federal Fluminense. O funcionamento do sistema se d atravs de uma
cmera ajustada para capturar imagens do campo em que os robs se encontram envia
as imagens capturadas para um computador, em que atravs do software Matlab as
imagens so processadas, de forma que se identifique marcadores nessas imagens. O
marcador da plataforma robtica um tringulo issceles vermelho, em que atravs da
cor pode se identificar o objeto, e atravs do formato pode se identificar a direo e o
sentido da plataforma. O marcador da bola uma circunferncia verde, e o marcador do
gol um retngulo azul. Aps analisar a imagem, o software calcula a distncia e o
ngulo do rob at a posio ideal, onde a bola dever sofrer o impacto para que se
acerte o gol. Aps ter estes parmetros, um sistema microcontrolado responsvel por
enviar estes parmetros plataforma robtica via rdio frequncia.

PALAVRAS-CHAVE:
Computacional.

Rob

Autnomo.

Processamento

de

Imagem.

Viso

ABSTRACT

The objective of this project is to build a system using image processing,


where a robotic microcontrolled platform should make the decision-making so that
the goal of putting the ball into the goal is reached. This platform receives parameters
for the positions of objects within the limited space as the field. Such a system should
be used for educational purposes within the Federal Fluminense Institute. The
system operation takes place as follows: A camera is set to capture images of the
field where robots are, sends the captured images to a computer, where software
Matlab through the images are processed, so that these markers identify images.
The marker of the robotic platform is a red isosceles triangle, where through color
can identify the object, and through the format can identify the direction and the
direction of the platform. The ball marker is a green circle, and the goal of the marker
is a blue rectangle. After analyzing the image, the software will calculate the distance
and the angle of the robot to the ideal position where the ball should be impacted so
that they hit the goal. After these parameters, one microcontroller system will be
responsible for sending these parameters robotics platform via radio frequency.
KEYWORDS:

Autonomous

Robot.

Image

Processing.

Computer

Vision.

LISTA DE FIGURAS E TABELAS


Figura 1: TRANSMISSOR DE RF

18

Figura 2: RECEPTOR DE RF

19

Figura 3: SERVOMOTOR PARALLAX

21

Figura 4: GRFICO PWM

22

Figura 5: ROB MONTADO

26

Figura 6: BOLA E GOL

27

Figura 7: IMAGEM CAPTURADA COM RETAS TRAADAS PELO MATLAB

30

Figura 8: IMAGEM CAPTURADA PELO MATLAB EM DETALHES

31

Figura 9: ROB E A INDICAO DO NGULO

32

Quadro 1: MATRIZ DOS VALORES MNIMOS

33

Quadro 2: MATRIZ DOS VALORES MXIMOS

33

Figura 10: TRINGULO DE EXTREMIDADES 1, 2 E 3

34

Quadro 3: RELAO ENTRE VARREDURAS E LOCALIZAO DE PIXELS

35

Figura 11(a): ILUSTRAO DE BOLA EM FORMATO DE PIXELS

36

Figura 11(b): ILUSTRAO DA PRIMEIRA VARREDURA

36

Figura 12: SEQNCIA DE VARREDURAS EFETUADAS

37

Figura 13: VARREDURA EM UM TRINGULO

37

Figura 14: GRFICO

41

Figura 15: IMAGENS EXTRADAS DA FILMAGEM DO TESTE

42

LISTA DE SIGLAS
RF

Rdio Frequncia

PID

Proporcional Integrativo e Derivativo

PD

Proporcional e Derivativo

PI

Proporcional e Integrativo

TX

Transmissor

RX

Receptor

GND

Ground (Terra)

PWM

Pulse Width Modulation

Vcc

Volts em Corrente Contnua

SUMRIO
1 INTRODUO

11

1.1 OBJETIVO

12

1.1.1 Objetivo Geral

12

1.1.2 Objetivos Especficos

12

1.2 JUSTIFICATIVA

13

1.3 ORGANIZAO DOS CAPTULOS

13

2 REVISO DE LITERATURA

15

2.1 PROCESSAMENTO DE IMAGENS

15

2.2 - ARDUINO

16

2.3 Transmissor e Receptor RF

17

2.4 Servomotor

20

2.5 PWM - Modulao por largura de pulso

22

2.6 Comunicao Serial

23

3 DESENVOLVIMENTO DO PROJETO

24

3.1 DESING DE HARDWARE E ESTRUTURAS

24

3.2 PROGRAMAO DOS MDULOS

27

3.2.1 Programao do Mdulo de Transmisso

27

3.2.2 Programao do Mdulo de Recepo

28

3.3 PROGRAMAO DO MATLAB

29

3.3.1 Funes

32

3.3.1.1 Calibra_Cores.m

32

3.3.1.2 captura.m

33

3.3.1.3 varredura.m

34

3.3.1.4 verifica.m

38

3.3.1.5 corrigir.m

38

3.3.1.6 pos_carro.m

38

3.3.1.7 pos_centro.m

38

3.3.1.8 pos_otima.m

39

3.3.1.9 frente_do.m

39

3.3.1.10 encontre_reta.m

39

4 RESULTADOS

40

5 CONSIDERAES FINAIS

43

5.1 CONCLUSO

43

5.2 SUGESTES PARA TRABALHOS FUTUROS

43

6 REFERNCIAS BIBLIOGRFICAS

45

APNDICE A - HARDWARE E MICROCONTROLADORES

46

APNDICE B - CDIGO IMPLEMENTADO NO MATLAB

53

11

1 INTRODUO

A robtica autnoma uma rea de pesquisas que vem se desenvolvendo


bastante nos ltimos anos. Os robs tem auxiliado o homem em diversas tarefas,
tais como a explorao espacial e o auxlio a pessoas com deficincias fsicas.
Diversos algoritmos vem sendo desenvolvidos para controlar esses robs, muitos
deles se utilizam de informaes coletadas a priori para planejar, antes da
execuo, todos os movimentos do incio ao fim da tarefa. Outros algoritmos utilizam
dados coletados do ambiente, em tempo real, atravs de sensores, para decidir qual
ser o prximo movimento (comportamento reativo) (HEINEN, 1999; OSRIO,
1999).
Para obter resultados de forma abrangente em tempo real ao implementar
sensores em um rob autnomo podemos fazer uso da ferramenta de viso
computacional. A viso computacional vem sendo utilizada cada vez mais devido a
sua imensa flexibilidade de aplicaes. possvel atravs dela, identificar formas,
cores e tonalidades, e trabalhar com os dados obtidos de forma que o rob consiga
identificar sozinho no ambiente os objetos necessrios para a sua interao, dando
a ele um comportamento reativo.
Este trabalho consiste em projetar e implementar uma plataforma utilizando
de ferramentas de viso computacional que em conjunto com uma base robtica
microcontrolada faz com que um jogo que simula uma partida de futebol seja
implementado. O jogo de futebol robtico proposto por este trabalho tem um objetivo
diferente do convencional: alm de fazer com que a bola alcance a rea delimitada
que representa o gol, necessrio desenvolver um algoritmo de controle de
trajetria eficiente, dadas as limitaes fsicas do projeto.
O sistema a ser desenvolvido ter o objetivo de atuar junto s plataformas
robticas j existentes no Laboratrio de Automao Inteligente do Instituto Federal
Fluminense; tais plataformas so microcontroladas. O sistema desenvolvido deve
localizar estas plataformas robticas em um espao fsico delimitado, calcular
parmetros de posio e ngulo em relao a posio em que se encontram, e
transmitir

estes

parmetros

ao

microprocessador

da

prpria

plataforma,

possibilitando que cada estudante desenvolva seu prprio algoritmo e insira dentro

12

das plataformas robticas a fim de tornar os movimentos da plataforma robtica mais


eficientes para um determinado objetivo, como por exemplo, ao executar
movimentos buscando atingir a bola em direo ao gol. Aps a implantao do
algoritmo de processamento de imagem, transmisso e recepo de dados via RF, a
plataforma robtica servir de ferramenta para os estudantes de engenharia no
aprendizado e prtica de controle, possibilitando que cada estudante possa
compreender e aprimorar seus conhecimentos em controle e automao.
O algoritmo de processamento de imagem possui o objetivo de implementar a
estrutura de viso computacional ao sistema. Atravs da viso computacional ser
possvel obter informaes de imagens, e atravs destes dados extrados da
imagem ser possvel fazer com que o rob autnomo determine o erro existente
entre sua posio atual e a posio ideal, e a correo necessria para que este
erro seja nulo ou prximo de zero.
Robs autnomos geralmente so utilizados para realizar determinada tarefa
em um ambiente em que no existe estrutura dedicada ao funcionamento do rob e
no existe auxlio humano. Especificamente neste projeto, o rob autnomo deve
realizar a tarefa de empurrar a bola em direo ao gol, completando o objetivo
determinado. Para isso, a nica interface sensorial que este rob dispe para
identificar o mundo exterior so os parmetros adquiridos atravs da viso
computacional.
Dentre os possveis conhecimentos que os estudantes podero explorar ao
trabalhar com este sistema, encontram-se reas como algoritmos, linguagem de
programao, tcnicas de programao, microcontroladores, robtica, controle,
entre outros.

1.1 OBJETIVO
1.1.1 Objetivo Geral

Projetar e construir uma plataforma robtica dinmica de modo a receber


sinais contendo parmetros via radio frequncia e conforme a variao destes
parmetros aplicar uma ao de controle de modo que a plataforma robtica se
desloque em uma trajetria permitindo que a bola seja atingida e role em direo ao

13

marcador que simboliza o gol.

1.1.2 Objetivos Especficos

Montar uma plataforma robtica fsica, incluindo estrutura fsica, hardware e


lgica implementada no microcontrolador.
Prover a captura de imagens em bancada projetada, que permita a
visualizao de todo a rea de atuao do projeto em tempo real.
Promover programao adequada a insero de parmetros de ajustes
caractersticos do ambiente de modo que seja simples executar o sistema em
diversas condies de iluminao.
Analisar o comportamento do sistema em relao s estratgias aplicadas.
Verificar se o controle aplicado consegue atender aos requisitos estipulados
no projeto.

1.2 JUSTIFICATIVA

Atravs desta plataforma ser possvel desenvolver um ambiente de


aprendizagem baseado em dispositivos robticos, permitindo a prtica de atividades
pedaggicas, visto que o cenrio universitrio atual exige a presena de recursos
tecnolgicos didticos para que se torne encorajador o aprendizado relacionado s
ferramentas e tecnologias disponveis no mercado.

1.3 ORGANIZAO DOS CAPTULOS

Captulo 1: Introduo: Neste captulo apresentada uma contextualizao


dos temas abordados na viso computacional. Expem-se os objetivos, justificativas
e a forma como o tema organizado e abordado nos captulos.

Captulo 2: Reviso da Literatura. Neste captulo faz-se uma breve


introduo sobre os elementos utilizados no projeto, tais como transmissor e
receptor de RF, PWM, Microcontroladores e Comunicao serial, seu surgimento e

14

sua evoluo, reas de atuao e definio do conceito IA para que o leitor se sinta
familiarizado com o tema.

Captulo 3: Desenvolvimento. Neste captulo apresentado e detalhado o


desenvolvimento do projeto. Cada parte do processo de elaborao aqui descrito,
tais como materiais utilizados na prototipagem, projeto de hardware e programao.

Captulo 4: Resultados. Neste captulo so apresentados atravs de grficos,


tabelas e quadros, os resultados obtidos aps a implementao do sistema.

Captulo 5: Consideraes finais. Este captulo apresenta a concluso e


sugestes para trabalhos futuros.

Concluso. Neste utiliza-se os resultados apresentados para fazer uma


anlise e responder se os objetivos estipulados na apresentao deste trabalho
foram alcanados e o quanto se alcanou.

Sugestes para trabalhos futuros. Neste captulo so apresentadas


algumas sugestes pra trabalhos futuros, de modo a aproveitar os dados gerados e
a metodologia aplicada no desenvolvimento deste trabalho.

Captulo 6: Referncias Bibliogrficas. Lista os trabalhos que serviram


como base para o desenvolvimento desta pesquisa.

Apndice A: Hardware e Microcontroladores. Apresenta os cdigos


implementados na programao dos microcontroladores e os desenhos
esquemticos contendo as ligaes.
Apndice B: Cdigo implementado no Matlab. Apresenta os cdigos
implementados na programao do Matlab.

15

2 REVISO DE LITERATURA

Este captulo contm a reviso de literatura relacionada aos dispositivos e


ferramentas utilizados no desenvolvimento do projeto.
2.1 PROCESSAMENTO DE IMAGENS

Atualmente o desenvolvimento de sistemas de informao multimdia, tais


como bibliotecas virtuais e catlogos eletrnicos, trouxeram a necessidade de
gerenciamento de grandes bancos de dados de imagens. Para que este
gerenciamento seja eficaz necessrio o desenvolvimento de metodologias que
incorporem tcnicas eficientes de acesso para o arquivamento e recuperao da
informao. Alm disso, a necessidade da utilizao de mtodos baseados em
descrio textual tem introduzido o desenvolvimento de mecanismos para consulta
de bases de dados atravs de imagens-exemplo ou pela especificao da imagem
desejada, em termos de cores dominantes, textura e formato dos objetos (RUDECK,
2001; COELHO, 2001; CANCIGLIERI JR, 2001).
Uma imagem formada por diversos pixels. Um pixel o menor ponto que
compe uma imagem, e atravs da manipulao seletiva dos pixels de uma imagem,
feita atravs de softwares especficos, possvel efetuar o processamento de
imagem utilizando-se tcnicas para que se alcance o objetivo determinado.
Diversas tcnicas de reconhecimento de imagens tm sido apresentadas na
literatura e geralmente so validadas atravs de prottipo de aplicaes, pois em um
ambiente industrial, raramente obtm-se as condies ideais de iluminao,
contraste, posicionamento correto da pea, e do ngulo de obteno da imagem,
alm de outros fatores externos que dificultam a interpretao de uma cena
(RUDECK, 2001; COELHO, 2001; CANCIGLIERI JR, 2001 apud WEEKS, 1996;
RUSS, 1995; YANG &YAN, 2000; CHENG, 2000).
Utilizando um modelo de textura compatvel com a textura utilizada no objeto
o qual se deseja identificar na imagem possvel atravs de uma simples varredura
de pixels efetuada em uma imagem filtrada, identificar a localizao do objeto na
imagem. Rudeck (2001), Coelho (2001) e Canciglieri Jr (2001) propem um
algoritmo genrico para processamento de imagens com o objetivo de reconhecer
padres. Este algoritmo foi testado com sucesso no reconhecimento de padres de

16

diferentes tipos de parafusos. O algoritmo aplicado por Rudeck (2001), Coelho (2001)
e Canciglieri Jr (2001) descrito da seguinte forma:
Aquisio Pr-processamento Segmentao Identificao do Objeto Reconhecimento de Padres

Durante a aquisio da imagem pertinente destacar que elementos presentes


no ambiente, tais como iluminao e posicionamento, e elementos como hardware e
software utilizados so de fundamental importncia, sendo necessrio prestar devida
ateno no que diz respeito a fatores externos. O pr-processamento ocorre ao
transmitir os dados de imagem para o computador. Nele so feitos ajustes de cor,
brilho, contraste e nitidez. Durante a segmentao a imagem compactada, de
forma que o nmero de informaes nela contida seja apenas o necessrio para que
o objetivo seja cumprido. Isto torna o processamento mais rpido e evita que
informaes desnecessrias para a realizao da tarefa sejam enviadas junto com a
imagem capturada para a etapa de identificao do objeto.

Na etapa de

identificao do objeto, o software ir efetuar comparaes das imagens adquiridas


com modelos pr-programados e a partir de caractersticas do objeto, como seu
formato e tamanho, iro determinar dentro daquela imagem, onde est localizado o
objeto. Durante o reconhecimento de padres feita a comparao do objeto
identificado na imagem, com padres pr-programados via software, e a partir da
poder ser feita a classificao do objeto.

2.2 ARDUINO
O conceito Arduino surgiu na Itlia, em 2005, com objetivo de criar um
dispositivo de controle para prottipos construdos de forma menos dispendiosa do
que outras solues disponveis. O quite de desenvolvimento Arduino dito uma
plataforma de computao fsica, em que sistemas digitais, ligados a sensores e a
atuadores, so capazes de medir variveis no ambiente fsico, realizar clculos
numricos e tomar decises lgicas no ambiente computacional e gerar novas
variveis no ambiente fsico. A parte central do kit um microcontrolador, o qual
pode ser entendido como a evoluo de um microprocessador, na qual ele

17

ampliado com sistemas de temporizao, de aquisio e de comunicao (Da


FONSECA, 2011; DE LA VEGA, 2011).
Existe um portiflio diversificado com informaes disponveis sobre a
capacidade do hardware do Arduino, a linguagem de programao para a sua IDE
especfica, e fruns de discusso com experincias de outros desenvolvedores
disponvel em: www.arduino.cc.
Segundo Da Fonseca e De La Veja (2011), um grande diferencial deste kit a
utilizao da licena open-source, em que uma comunidade de usurios
constantemente explora o sistema com o objetivo de desenvolver e aperfeioar
projetos que so divulgados livremente.

2.3 TRANSMISSOR E RECEPTOR RF


Existem diversos formas de se efetuar uma comunicao sem fio utilizando
Arduino. Uma delas consiste na utilizao de mdulos de transmisso e recepo de
frequncias de rdio. Um dos mdulos disponveis no mercado utilizado para
prototipagem o mdulo RF 433, cuja montagem simples e a aplicao
elementar.
O rdio um recurso tecnolgico de telecomunicaes utilizado para permitir a
transmisso e recepo de dados pela transcepo de informaes previamente
codificadas em um sinal eletromagntico. So necessrios trs elementos para que
haja a comunicao: o transmissor, o meio de transmisso e o receptor (PEREIRA,
2014).
Segundo Pereira (2014), existe mais de um modo de transmisso utilizado na
comunicao via radiofrequncia. O modo simplex utilizado quando a
comunicao unidirecional no meio da transmisso. J o modo de transmisso
semi duplex, tambm conhecido como half duplex, utilizado quando a transmisso
bidirecional, porm os transmissores compartilham o mesmo meio, no podendo
transmitir simultaneamente. O modo duplex aquele em que a comunicao
bidirecional e simultnea.
A modulao de sinal pode ser tambm de dois tipos, designados como AM e
FM. Na modulao por amplitude, conhecida como AM, o comprimento da onda da
ordem de metros. Ento, so usadas as camadas atmosfricas para a propagao

18

por reflexo. Por outro lado, na modulao por frequncia, FM, o comprimento de
onda bem inferior, da ordem de centmetros, o que a torna muito penetrante
apesar de pouco refletida (PEREIRA, 2014, apud, VIEIRA, 2011).

Transmissor:

O mdulo transmissor possui 3 pinos, sendo 2 utilizados para a alimentao e


1 pino dedicado a receber os dados que sero transmitidos via RF. Para transmitir
os dados basta envi-los utilizando a funcionalidade da comunicao serial do
Arduino. Tambm possui um orifcio no circuito no qual poder ser soldada uma
antena para ampliar o alcance do sinal. Na Figura 1 apresentado um modelo de
transmissor de RF e suas caractersticas.
Figura 1: Transmissor de RF

Fonte: www.blog.filipeflop.com (2015).

O transmissor MX-FS-03V, identificado na Figura 1, opera na faixa de


frequncia de 433,92MHz e pode ser alimentado com tenso entre 3,5Vcc e 12Vcc.
Especificaes tcnicas:

Frequncia: 433,92 MHz;

Modelo: MX-FS-03V;

Distncia de transmisso: 20m a 200m (depende da tenso);

19

Tenso: 3,5 V ~ 12V;

Dimenses: 19 mm x 19 mm;

Tipo de modulao: AM;

Potncia de transmisso: 10mW;

Antena: 25 cm;

Velocidade de transmisso: 4 Kb/s

Receptor:

O mdulo receptor possui 4 terminais, sendo 2 utilizados exclusivamente para


a alimentao e 2 utilizados para a transmisso de dados, no havendo diferena
entre estes. possvel utilizar apenas um terminal dos dois destinados a
transmisso de dados, deixando o outro terminal livre. O mdulo receptor tambm
possui um orifcio no circuito no qual poder ser soldada uma antena para ampliar a
qualidade de recepo do sinal. A Figura 2 apresenta um modelo de receptor de RF
e suas caractersticas.
Figura 2: Receptor de RF

Fonte: www.blog.filipeflop.com (2015).

No receptor de RF identificado na Figura 2 podemos notar a presena de dois


pinos dedicados a transmisso de dados. Este receptor opera na faixa de frequncia
de 433,92 MHz e deve ser alimentado com 5 Vcc.
Especificaes tcnicas:

20

Frequncia:433,92MHz;

Modelo:MX-05V;

Tenso: 5VCC;

Corrente: 4 mA;

Sensibilidade: 105db;

Antena: 35 cm;

Dimenses: 30 mm x 17 mm x 7 mm.

2.4 SERVOMOTOR

Servomotor uma mquina que recebe um sinal de controle, verifica a


posio original, e depois atua no sistema em busca da posio desejada. um
motor que no gira indefinidamente, pode fazer a rotao de apenas 180 graus, mas
so extremamente precisos. Ele constitudo por trs partes principais: Sistema
atuador, sensor e circuito de controle. O primeiro um motor, geralmente de
corrente contnua, e um conjunto de engrenagens que forma uma caixa de reduo
com uma relao longa, pra aumentar o torque. O sensor normalmente um
potencimetro acoplado ao eixo do servo, e atravs da sua resistncia, possvel
determinar a sua posio. E o circuito de controle um circuito composto de
componentes eletrnicos discretos ou circuitos integrados que tem a capacidade de
receber o sinal do sensor e o sinal de controle e posicionar o motor no eixo da
direo desejada (ARAJO, 2011; PESSOA, 2011; TURCHENSKI, 2011).
possvel modificar um servomotor para que o mesmo possua sua rotao
contnua, sem que fique limitada aos 180 graus. No interior do servomotor existe um
potencimetro acoplado a uma engrenagem, utilizado para garantir a posio do
eixo. Tanto o potencimetro quanto a engrenagem possuem travas mecnicas que
limitam a rotao. Ao retirar estas travas, o motor ter liberdade para girar
continuamente. necessrio tambm modificar o circuito de controle, que
responsvel pelo monitoramento do potencimetro e acionamento do motor visando
obter uma posio pr-determinada. Existem servo motores modificados disponveis
no mercado que controlam a velocidade do servo ao invs da posio. O servomotor
da marca Parallax na Figura 3 um exemplo de servomotor modificado de fbrica.

21

Figura 3: Servomotor Parallax

Fonte: www.parallax.com (2015)

O controle dos servomotores feito atravs de PWM, assunto que ser


tratado posteriormente. Porm, o Arduino possui uma biblioteca especfica para
controle de servomotores. Essa biblioteca se chama Servo.h e possui funes
especficas para controle de posio do eixo do servomotor, em que a angulao
desejada inserida, e a sada da funo envia um sinal de controle para o motor de
forma que a posio desejada seja alcanada. No caso do controle de servomotores
modificados, os ngulos inseridos faro com que a velocidade do motor seja
modificada. Cada ngulo possui velocidade e sentido de rotao especfica, e so
obtidos experimentalmente para cada servomotor. Por exemplo, ao passar 93 como
argumento para a funo, um servomotor modificado ficaria parado. Ao elevar essa
angulao para 95 esse motor iria girar em sentido horrio bem devagar. Ao reduzir
essa angulao para 70, o motor giraria em sentido anti-horrio com velocidade
elevada, possivelmente atingiria a sua velocidade mxima.

22

2.5 PWM - MODULAO POR LARGURA DE PULSO


PWM (Modulao por Largura de Pulso) um mtodo de emularmos um
comportamento analgico a partir de uma porta digital. Para isto utilizamos um
chaveamento sobre a porta, ativando-a e desativando-a em um perodo de tempo.
Geramos deste modo, uma onda retangular, em que o tempo do sinal em tenso alta
denominado largura de pulso. Ao variarmos a relao entre o tempo da chave
ligada e o perodo de oscilao total, variamos tambm a tenso mdia que a carga
recebe, ou seja, efetuamos uma modulao da largura do pulso. Na Figura 4,
podemos visualizar os pulsos gerados, utilizando a funo analogWrite da biblioteca
padro do Arduino, que fornece uma resoluo de 8 bits para o controle da tenso
de sada (ARAJO, 2011; PESSOA, 2011; TURCHENSKI, 2011).
Figura 4: Grfico PWM.

Fonte: (ARAJO, 2011; PESSOA, 2011; TURCHENSKI, 2011).

2.6 COMUNICAO SERIAL

Por definio, comunicao serial o processo de enviar dados bit a bit,


seqencialmente, atravs de um canal de comunicao. A comunicao serial do
Arduino tem o objetivo de comunicar o Arduino com um computador ou outros

23

dispositivos.
A biblioteca SoftwareSerial possui funes que podem ser utilizadas em
conjunto com os mdulos de transmisso e recepo de RF para realizar a
transmisso de dados sem fio. Essas duas funcionalidades trabalham juntas
harmonicamente e no geram conflitos entre si.

24

3 DESENVOLVIMENTO DO PROJETO
Neste captulo ser feita a descrio detalhada dos elementos que constituem
o sistema proposto e desenvolvido neste trabalho. abordado o desenvolvimento de
toda a parte fsica do projeto, incluindo hardware e embarcados, e tambm
abordada toda a parte de programao do projeto.
3.1 DESING DE HARDWARE E ESTRUTURAS

O hardware foi projetado com base na plataforma arduino, utilizando matriz


de contatos e fios conectores para realizar as conexes. Existem dois Arduinos no
sistema. Um deles responsvel por receber os parmetros que so enviados pelo
Matlab atravs da porta serial do computador e enviar estes parmetros atravs de
radio frequncia. Para isso, a placa se conecta ao computador atravs da porta USB,
que serve de ponte para a comunicao serial e alimento da placa, esta possui
um mdulo transmissor de rdio frequncia de 433Mhz conectado a placa Arduino
atravs do pino 12. O esquemtico desta ligao se encontra no Apndice A Hardware e Microcontroladores.
A parte de hardware projetada para receber os dados foi concebida de modo
a funcionar sendo alimentada atravs de uma bateria de 9V. Este mdulo fica
localizado acoplado a plataforma robtica, em que tem a funo de receber os
parmetros transmitidos via rdio frequncia, e de acordo com o tipo de controle
implementado, enviar o sinal de correo para os servo-motores. Portanto este
Arduino est conectado a dois servo-motores atravs dos pinos 9 (servo-motor
esquerdo) e 10 (servo-motor direito) que movimentam a plataforma, um mdulo
receptor de rdio frequncia de 433MHz atravs do pino 11, e um led atravs do
pino 12, utilizado para indicar o momento em que a posio ideal para o chute
alcanada de acordo com o algoritmo do exemplo implementado. O esquemtico
desta ligao se encontra no Apndice A - Hardware e Microcontroladores.
Alm destes sistemas, uma Webcam Logitec utilizada para capturar imagens da
rea de testes e enviar estes dados para o Matlab. Os marcadores utilizados para
identificar o gol, a bola e a plataforma robtica foram escolhidos arbitrariamente
entre as cores vermelho, verde e azul, por serem as matrizes de cores que o Matlab
utiliza - Matriz RGB. O gol recebeu a cor azul e foi pintado em uma folha de papel

25

utilizando tinta relevo. Aps feita a pintura, a pea foi recortada e inserida na rea de
testes. A bola foi projetada em isopor por ser um material leve e de baixo atrito.
Outros materiais emborrachados e metlicos foram utilizados, porm o isopor se
tornou o material mais apropriado, de acordo com testes prticos realizados. A bola
de isopor foi tingida com tinta para tecido cor verde brilhante. O marcador utilizado
para sinalizar a plataforma robtica no formato de uma estrela de 3 pontas,
tomando-se como base para a criao dessa estrela um tringulo issceles. Este
formato ideal para indicar o sentido no qual se encontra a plataforma robtica, uma
vez que os pontos mais prximos indicam a parte de trs da plataforma, e o ponto
mais distante indica a frente. O marcador foi confeccionado em papel e isopor. O
desenho foi feito utilizando tinta para tecido vermelha, a figura foi fixada em um
pedao retangular de isopor e posicionado em cima de 4 palitos que foram fixados
em 4 pontos da plataforma robtica, a fim de esconder as partes coloridas para no
serem detectadas na captura de imagem, destacando-se assim apenas o marcador.
A plataforma robtica utilizada para a base do carro foi gentilmente cedida
pelo Laboratrio de Automao Inteligente do Instituto Federal Fluminense, e
consiste em uma plataforma fixa

de metal contendo dois

servomotores

independentes conectados a rodas atravs de um eixo, e uma base esfrica para


apoio. Um cano de PVC foi cortado e fixado a frente da plataforma e tem o objetivo
de empurrar a bola. Os servomotores so modificados de fbrica, de modo a
fornecer rotao contnua e forte trao, alm de facilitar o controle da velocidade. A
Figura 5 mostra o rob montado.

26

Figura 5: Rob montado

Fonte: Autor.

1- PVC utilizado para tocar a bola.


2- Figura utilizada para identificar o rob e sua posio.
3- Acrlico utilizado para sustentar os elementos eletrnicos do rob.
4- Plataforma robtica de metal.
5- Roda com elstico acoplada a servomotor.

A base robtica (4) possui um cano de PVC cortado (1) a fim de direcionar a bola
tangencialmente a circunferncia do cano. O teto com o marcador vermelho (2)
feito de isopor e fixado com palitos de madeira nas extremidades da estrutura de
acrlico (3) que tambm abriga os elementos do circuito. As rodas de plstico (5)
foram adaptadas com elsticos de borracha a fim de melhorar o atrito e evitar
derrapagens.

27

A Figura 6 mostra a bola na cor verde e o gol na cor azul utilizados neste
experimento.
Figura 6: Bola e gol

Fonte: Autor.

3.2 PROGRAMAO DOS MDULOS


Neste item descrita a estrutura utilizada na programao dos
microcontroladores utilizados nos mdulos de transmisso e recepo do sistema.
3.2.1 Programao do Mdulo de Transmisso
O mdulo de transmisso foi programado de modo a transmitir a informao
recebida via comunicao serial da mesma forma como foi recebida. Caso nenhuma
informao for recebida, nenhum dado ser transmitido, caracterizando assim uma
comunicao assncrona.
Este programa foi concebido com a finalidade de servir como exemplo
funcional, e se restringe a transmisso de 8 bytes por vez. Ao receber dados atravs
da comunicao serial, a taxa de transmisso (baud rate) dever ser ajustada para

28

9600 bits por segundo. Para fins de desenvolvimento, o programa exibe no monitor
serial, caso esteja disponvel, a mensagem que foi recebida via comunicao serial.
Aps receber a informao via comunicao serial, o programa transmite essa
informao atravs do mdulo de transmisso de radio frequncia conectado ao
Arduino. Alm disso, toda vez que uma informao enviada, um led conectado
internamente ao pino 13 do Arduino indica a transmisso de dados. A biblioteca
utilizada

"RadioHead"

est

disponvel

em:

http://www.airspayce.com/mikem/arduino/RadioHead/ (2015)
O programa utilizado como exemplo pode ser encontrado no Apndice A Hardware e Microcontroladores.

3.2.2 Programao do Mdulo de Recepo


O mdulo de recepo foi programado de modo a receber a informao
transmitida pelo mdulo de transmisso e disponibilizar o dado para efetuar o
controle de velocidade dos motores de acordo com o parmetro recebido pelo
controlador. Um controlador proporcional foi implementado, de forma que quanto
maior fosse a diferena entre o ngulo ideal e o ngulo real, maior seria a velocidade
dos motores.
Tal correo seria aplicada durante um determinado perodo fixo de tempo,
pois tal artifcio foi utilizado como forma de contornar um conflito entre bibliotecas do
Arduino e o retardo de transporte gerado pelo atraso do computador no tratamento
de imagens ao realizar os clculos e enviar os parmetros. Sendo assim, os motores
s sero configurados pela biblioteca a partir do momento que o ngulo recebido.
Aps a configurao, os motores so acionados por um determinado perodo de
tempo fixo, e ento so excludos da memria do programa, precisando de nova
configurao quando outro ngulo for recebido.
A biblioteca RadioHead tambm foi utilizada neste programa como forma de
substituir a biblioteca VirtualWire que gerava conflitos constantes com a biblioteca
Servo. A biblioteca PID no foi utilizada, sendo efetuado o controle atravs das
prprias linhas de comando do programa. Para fins de programao, o programa
exibe no monitor serial, caso esteja conectado, o valor recebido via rdio frequncia.
Para utilizar a biblioteca RadioHead necessrio alterar uma linha em seu cdigo de

29

forma que o timer1 do microcontrolador seja substitudo pelo timer2, pois o timer1
utilizado pela biblioteca Servo.h que controla os motores. No arquivo RH_ASK.cpp,
acrescentar a linha "#define RH_ASK_ARDUINO_USE_TIMER2".
Este programa tambm foi desenvolvido como exemplo e est disponibilizado
no Apndice A - Hardware e Microcontroladores.

3.3 PLATAFORMA DE TRATAMENTO DE IMAGEM

O software Matlab R2011A foi escolhido para efetuar o processamento dos


dados capturados atravs da cmera, retirar destes dados os devidos parmetros, e
enviar estes atravs da porta de comunicao serial. Basicamente o programa
realiza um ciclo que ser repetido quantas vezes o usurio determinar. Porm antes
de realizar o ciclo de captura, processamento e envio de dados, necessrio efetuar
a calibrao das cores atravs de modelos fotografados anteriormente. Isto se faz
necessrio pois as condies de luminosidade do ambiente podem variar de acordo
com o horrio do dia, local e condies climticas no momento em que o programa
est sendo executado. Tambm necessrio abrir um canal de comunicao com a
cmera de vdeo e um canal de comunicao serial.
Sendo assim, podemos determinar o escopo do programa como sendo:
-Calibrao das cores
-Abertura de conexo com a cmera de vdeo
-Abertura de conexo com a porta serial
-Ciclo de captura, processamento e envio de dados
-Fechamento da conexo com a porta serial
-Fechamento da conexo com a cmera de vdeo
muito importante que as conexes sejam finalizadas, pois conexes em
aberto podem resultar em erros nos prximos ciclos de execuo. Por exemplo, caso
acontea algum erro de captura de imagem, processamento ou envio de dados
durante a realizao do ciclo, o Matlab ir interromper a execuo do programa sem
fechar as portas de conexo (serial e vdeo). Ao tentar executar novamente o
programa um erro de comunicao serial ser mostrado na tela, tornando-se
necessrio fechar o Matlab e abrir novamente o trabalho salvo para continuar
executando o programa.

30

O ciclo de captura executa diversas funes com o objetivo de encontrar o


erro a cada nova captura. O erro, no caso deste estudo, consiste na diferena entre
o ngulo da posio ideal e o ngulo de encontro entre as retas; a que define a
posio real do carro e a reta ideal que passa sobre o gol, sobre a bola e sobre a
posio ideal. A Figura 7 mostra a imagem capturada com as retas calculadas e
traadas pelo Matlab.
Figura 7: Imagem capturada com retas traadas pelo Matlab.

Fonte: Autor.

31

A Figura 8 aponta a localizao exata na imagem de cada item presente.


Figura 8: Imagem capturada pelo Matlab em detalhes.

Fonte: Autor.

1- Asterisco azul utilizado para marcar a base do rob, calculada pelo Matlab.
2- Reta traada entre a base e a frente do rob, com o objetivo de indicar a direo
do rob
3- Asterisco verde utilizado para indicar a frente do rob.
4- Reta traada entre a frente do rob e a posio ideal para acertar a bola.
5- Asterisco verde utilizado para indicar a posio ideal, no qual o rob acerta a bola
em direo ao gol.
6- Asterisco verde indicando o centro da bola.
7- Reta entre a bola e o centro do gol, utilizada para encontrar a posio ideal.
8- Asterisco azul indicando a posio do centro do gol.

32

A Figura 9 mostra o ngulo entre a direo do rob e a reta ideal.


Figura 9: Rob e a indicao do ngulo

Fonte: Autor.

1- ngulo formado entre a reta que indica a direo do rob e a reta ideal que passa
pela posio ideal e pela frente do rob.
3.3.1 Funes

Esta seo descreve detalhadamente cada funo que foi criada para a
utilizao no cdigo implementado no Matlab.

3.3.1.1 Calibra_Cores.m
Esta funo efetua a leitura de 3 recortes de imagens com exemplos de cores
e em seguida determina as intensidades de cores que esto compreendidas dentro
daquele espectro para a identificao dos marcadores. Ao exibir uma imagem
colorida, existem intensidades diferentes de cores diferentes que so caractersticos
da imagem. Ao efetuar a mistura dessas cores em intensidades diferentes,
possvel gerar novas cores. A funo Calibra_Cores se encarrega de efetuar a busca
dos valores de intensidade mnimos e mximos para as cores vermelho, verde e
azul, para identificar o carro, a bola e o gol na imagem.
Sendo assim, esta funo gera duas matrizes, uma matriz com os valores

33

mnimos de intensidade e outra com os valores mximos de intensidade, em que as


linhas representam as cores vermelho, verde e azul e as colunas so referentes ao
carro, bola e gol. Estes valores sero utilizados posteriormente ao efetuar a
varredura, em busca dos marcadores da imagem.
Por exemplo: Suponhamos hipotticamete que uma imagem do marcador do
rob seja capturada e sua cor no ponto mais claro formada por 10% de azul, 80%
de vermelho e 0% de verde, e por 20% de azul, 85% de vermelho e 5% de verde no
ponto mais escuro. Sendo assim, a matriz dos valores mnimos indicada pelo
Quadro 1:
Quadro 1: Matriz dos valores mnimos
ROB

BOLA

GOL

VERMELHO

80%

indiferente

indiferente

VERDE

0%

Indiferente

Indiferente

AZUL

10%

indiferente

Indiferente

Fonte: Autor.

E a matriz dos valores mximos indicado pelo Quadro 2:


Quadro 2: Matriz dos valores mximos
ROB

BOLA

GOL

VERMELHO

85%

indiferente

indiferente

VERDE

5%

Indiferente

Indiferente

AZUL

20%

indiferente

Indiferente

Fonte: Autor.

Obviamente neste exemplo no estamos considerando valores de intensidade


de cores para a bola e para o gol, portanto neste exemplo hipottico estes valores
so indiferentes.
3.3.1.2 captura.m
A funo captura.m utilizada para efetuar a captura da imagem e efetuar
uma varredura de forma que o retorno desta funo sejam 3 matrizes representando
3 imagens diferentes, j filtradas em preto e branco: A matriz contendo apenas o
marcador do carro (Img_Red), a matriz contendo apenas o marcador da bola
(Img_Green), e a matriz contendo apenas o marcador do gol (Img_Blue).

34

Os parmetros recebidos por esta funo so as matrizes de padres mximo


e mnimo definidas na funo Calibra_Cores, pois alm de efetuar a captura, esta
funo j faz uma varredura na imagem a fim de filtrar os objetos.
Esta filtragem feita pixel a pixel, comparando se o valor do pixel da imagem
est compreendido entre os valores mximos e mnimos de cores calibrados
anteriormente. Caso essa afirmao seja verdadeira, este pixel copiado para uma
outra imagem. Caso contrrio, um pixel preto utilizado para substituir aquele pixel
cuja cor no se enquadra nos limites calibrados.

3.3.1.3 varredura.m
Realiza 8 varreduras em todos os sentidos e direes possveis na imagem, aps
reconhecer o objeto e transformar a imagem em preto e branco de forma a sempre
identificar o primeiro pixel branco. Esta funo foi concebida para encontrar os 3
pontos que caracterizam as extremidades do tringulo marcador do carro. Esta
funo retorna 8 pontos, e no geral, estes 8 pontos possuem 3 valores distintos que
se repetem. A Figura 10 mostra um tringulo.
Figura 10: Tringulo de extremidades 1, 2 e 3.

Fonte: Autor

Sabendo-se que podem ser efetuadas 8 tipos distintos de varreduras, o Quadro 3


indica em qual das extremidades do tringulo estar o primeiro pixel a ser
encontrado.

35

Quadro 3: Relao entre varreduras e localizao de pixels (Ref. Figura 10)

Direo da Varredura

Primeiro pixel encontrado

Direita para Esquerda

Cima para Baixo


Direita para Esquerda

Baixo para Cima


Esquerda para Direita

Cima para Baixo


Esquerda para Direita

Baixo para Cima


Cima para Baixo

Direita para Esquerda


Baixo para Cima

Direita para Esquerda


Cima para Baixo

Esquerda para Direita


Baixo para Cima

Esquerda para Direita


Fonte: Autor

Como podemos observar apenas 3 valores referentes ao primeiro pixel


encontrado de cada vrtice sero encontrados, e devero se repetir entre os 8
valores coletados atravs da varredura. Se a varredura coletar mais de 3 valores
distintos pode significar erro na aquisio de imagens ou na maioria dos casos dois
pixels muito prximos. Para os casos em que pixels muito prximos, relativos ao
mesmo ponto, so detectados, existe a funo corrigir.m que pode ser utilizada para
converter a posio de dois pixels diferentes e prximos, dentro de um raio
especfico, em uma posio nica.
Para ilustrar melhor, tomaremos como exemplo a Figura 11(a):

36

Figura 11(a): Ilustrao de bola em formato de pixels

Fonte: Autor.

A figura 11(b) representa uma circunferncia ampliada, ao ponto que


consegue-se observar cada pixel que forma esta imagem. Ao efetuar a primeira
varredura (da esquerda para a direita, de cima para baixo) o primeiro pixel a ser
encontrado e o pixel da linha 3 coluna 4, conforme ilustra a figura 11(b):
Figura 11(b): Ilustrao da primeira varredura.

Fonte: Autor.

Seguindo este mesmo raciocnio, a figura 12 mostra a seqncia completa


das varreduras efetuadas:

37

Figura 12: Seqncia de varreduras efetuadas.

Fonte: Autor.

No caso da Figura 12, oito varreduras encontraram 8 pixels diferentes por se


tratar de uma circunferncia. Ao efetuar as 8 varreduras em tringulos, possvel
que mais de 3 pixels sejam identificados como pontos, caso estejam muito prximos,
como podemos ver na Figura 13. Neste caso, dois pixels muito prximos
representam um nico ponto.
Figura 13: Pixels encontrados ao efetuar varredura em um tringulo

Fonte: Autor

38

3.3.1.4 verifica.m
A funo verifica.m utilizada para verificar se a funo varredura.m
identificou os 3 pontos distintos referentes ao tringulo marcador do carrinho. Caso a
funo identifique mais ou menos de 3 pontos distintos, a mesma retorna o valor 1
(erro=1). Caso a funo identifique os 3 pontos distintos sem erro, o valor de retorno
0 (erro=0).

3.3.1.5 corrigir.m
Caso sejam capturados mais ou menos de 3 pontos ao tentar identificar o
marcador do carro, a funo corrigir.m poder ser utilizada para aproximar os
parmetros. A funo recebe um vetor contendo 8 pontos, e um raio de ao (em
pixels) como parmetros. Caso pontos muito prximos sejam capturados, possvel
determinar um raio para que todos os pontos encontrados dentro deste raio sejam
substitudos pelo valor mdio entre eles. O valor para o raio de ao ideal
encontrado experimentalmente no sistema implementado pelo autor foi de 10 pixels.

3.3.1.6 pos_carro.m
Esta funo tem o objetivo de substituir o vetor com 8 pontos responsvel por
identificar o carro, que foi obtido atravs da varredura da imagem em todas as
direes, por uma matriz 3x2 que contm apenas os pontos necessrios, no qual
cada linha representa um ponto diferente e cada coluna representa um eixo no plano
(x e y). Em outras palavras, quando o vetor de 8 pontos formado, ele recebe
pontos repetidos. Quando a matriz 3x2 criada pela funo pos_carro, esses pontos
repetidos so eliminados, restando somente os 3 pontos essenciais para a
identificao da posio do carro na imagem.

3.3.1.7 pos_centro.m
Esta funo realiza a varredura em uma imagem preto e branco. Ao identificar
o objeto, a funo calcula o centro a partir dos 8 pontos encontrados aps efetuar a

39

varredura da imagem.
3.3.1.8 pos_otima.m
Esta funo encontra a equao da reta que passa atravs do gol e da bola.
Aps encontrar a equao, a funo calcula a posio ideal para o carro empurrar a
bola em trajetria retilnea at o gol, de forma que a posio ideal um
prolongamento desta reta, acrescido dos parmetros raio da bola e raio do prachoque do carrinho. Para nvel de desenvolvimento, esta funo pode tambm exibir
a reta tima sobre a imagem capturada.

3.3.1.9 frente_do.m
Esta funo compara os trs pontos adquiridos atravs do marcador do carro,
e identifica qual deles representa a frente do carro, atravs da comparao entre as
distncias entre os pontos. Visto que o marcador um tringulo issceles, o ponto
mais distante dos outros dois representa a frente do carro.

3.3.1.10 encontre_reta.m
Esta funo recebe dois pontos como parmetros e retorna a equao da reta
entre esses pontos. utilizada por exemplo para encontrar a reta ideal, que passa
pelo ponto que representa a frente do carro e a posio ideal, ou mesmo a reta que
determina a direo do carro

40

4 RESULTADOS
Alguns problemas ocorreram no desenvolvimento deste projeto. O conflito de
bibliotecas devido a utilizao do mesmo timer do microcontrolador merece
destaque. Este problema foi contornado substituindo-se a biblioteca virtualwire.h
pela biblioteca radiohead.h. Ambas so utilizadas para facilitar a programao do
microcontrolador junto a mdulos de comunicao via rdio frequncia, porm a
biblioteca virtualwire.h conflitava com a biblioteca servo.h pois ambas utilizam o
timer1 para efetuar a temporizao. Esta biblioteca foi substituda pela biblioteca
radiohead.h que possui uma linha de comando interna que pode alterar o seu
funcionamento, de modo que o timer1 seja substitudo pelo timer2. Embora este
problema tenha sido contornado, ele ainda existe de forma que no instante em que
os servomotores esto trabalhando, no possvel utilizar a recepo de dados via
RF. O atraso gerado pelo processamento de imagem lento, fez com que os
parmetros fossem enviados em intervalos de tempo longos, o que permitiu definir
um tempo exato para que o motor permanecesse ligado e depois fosse desligado
para receber os dados. Porm, caso cdigos de processamento de dados mais
eficientes sejam implementados, esta soluo no ser funcional. Sugere-se que
no se utilize a biblioteca servo.h para controlar os servomotores, e seja
implementado o comando atravs do envio de sinal PWM manualmente.
Os servomotores possuem um bom resultado quando submetidos ao controle
proporcional. Porm sua velocidade muito limitada. possvel substituir os
servomotores por motores de corrente contnua, uma vez que a bola utilizada no
jogo constituda de isopor, e no necessita de muita fora para ser deslocada. A
utilizao de motores de corrente contnua tornaria o sistema mais dinmico.
O algoritmo de controle PID foi implementado no mdulo de recepo de
parmetros, porm os ganhos integral e derivativo foram ajustados para zero. Isto se
fez necessrio pois o retardo de transporte devido ao longo intervalo de tempo entre
a aquisio de parmetros impediu a implementao de um controlador PID. Este
algoritmo

de

controle

foi

implementado

sem

utilizao

de

bibliotecas

especializadas. O controle consiste em corrigir o ngulo de forma proporcional ao


erro, sendo assim, quanto mais prximo o ngulo do carro estiver da direo ideal,
mais devagar ocorrer o giro dos motores.

Dada a preciso pouco acurada na

aquisio de parmetros, no h garantia do erro assumir o valor zero, mas um valor

41

prximo de zero. Esta faixa definida como parmetro no controlador, estando


ajustada para 1.
O grfico abaixo mostra a variao de ngulo entre a direo da plataforma
robtica e a bola. O ltimo ponto o momento no qual considera-se o ngulo ideal
por ser muito prximo do desejado, 0. A seqncia de imagens foi retirada das
filmagens do teste, e ilustram perfeitamente os resultados finais do projeto,
apresentados na Figura 15 e o grfico apresentado na Figura 14 mostra a retroao
do erro ao longo do tempo.
Figura 14: Grfico ngulo X tempo

Fonte: Autor.

42

Figura 15: Imagens extraidas da filmagem do teste

Figura 15 (a)

Figura 15 (b)

Figura 15 (c)

Figura 15 (d)

Figura 15 (e)

Figura 15 (f)

Figura 15 (g)

Fonte: Autor.

A Figura 15 (a) representa o primeiro ponto do grfico, a Figura 15 (b)


representa o segundo ponto, e assim sucessivamente. Quando determinada
angulao bem prxima a ideal atingida, como na Figura 15 (e), o algoritmo interno
do rob faz com que um led localizado na parte inferior do rob comece a piscar Figura 15 (f) - indicando a posio ideal para atingir a bola no melhor ngulo - Figura
15 (g).

43

5 CONSIDERAES FINAIS
Neste captulo so apresentadas as concluses dos resultados obtidos e
sugestes para trabalhos futuros.

5.1 CONCLUSO
A realizao do projeto pode ser considerada um sucesso, em virtude dos
desafios encontrados no decorrer do desenvolvimento. Com o sistema desenvolvido
possvel identificar marcadores em objetos utilizando viso computacional, enviar
dados via rdio frequncia de um computador para um sistema microcontrolado e
aplicar uma estratgia de controle, conforme o sistema proposto inicialmente.
Embora tenha atendido ao propsito inicial, o desenvolvimento do projeto
encontrou dois pontos a serem considerados. O primeiro deles o tempo necessrio
para processar todas as informaes referentes aos parmetros. Uma vez que
clculos complexos so realizados e varreduras de imagem so feitas, a capacidade
de processamento necessria para que o sistema possua uma resposta rpida
aumenta. Com isso foi possvel enviar parmetros a cada intervalo de 1 segundo a 1
segundo e meio.
Outro fator a ser considerado o conflito de bibliotecas, que impediu a
utilizao do controle dos servomotores e o recebimento de parmetros via RF ao
mesmo tempo.
Estes dois itens em conjunto tornaram difcil de se utilizar um controlador PID,
sendo utilizado apenas um controlador proporcional para a demonstrao do
sistema.

5.2 SUGESTES PARA TRABALHOS FUTUROS


Algumas consideraes devem ser feitas para futuros projetos a serem
desenvolvidos com base neste sistema. Primeiramente necessrio diminuir o
tempo de processamento da imagem e da aquisio e clculo de parmetros. Isto
pode ser feito com o aperfeioamento das funes descritas neste trabalho e a
utilizao de um hardware com maior capacidade de processamento. Estas aes

44

tornariam o sistema mais rpido e dinmico, evitando problemas com retardo de


transporte.
Recomenda-se a substituio dos servomotores por motores de corrente
contnua. Embora os servomotores sejam mais simples de se controlar, no
possuem velocidade o suficiente para fazer a bola se mover rapidamente. Neste tipo
de sistema a fora contida em um servomotor no necessria para deslocar a bola
com uma velocidade apropriada.
Controlar a velocidade dos motores utilizando diretamente o PWM, ao invs
de utilizar uma biblioteca especfica. Isso poder evitar futuros conflitos de
bibliotecas.
Utilizar os registradores do microcontrolador para efetuar operaes de forma
mais rpida.
Desenvolver um software especfico que permita a calibrao e utilizao do
sistema de forma simples e intuitiva.

45

6 REFERNCIAS BIBLIOGRFICAS.

ARAJO, Fabiano Guilherme Prado; PESSOA, Igor Rodrigues; TURCHENSKI,


Rafael Ges. Desenvolvimento de um Rob Perseguidor de Objetos. 2011.

DA FONSECA, Erika GP; DE LA VEGA, Alexandre S. Tutorial sobre Introduo a


Projetos Utilizando o kit de Desenvolvimento Arduino. 2011.

HEINEN, Farlei J.; OSRIO, Fernando Santos. Salo de Iniciao Cientfica. Livro
de

resumos.

Porto

Alegre

UFRGS/PROPESQ,

1999,

Disponvel

em:

http://hdl.handle.net/10183/100179. Acesso em: 19/01/2016.

MIRANDA, Alan Tavares; DE ALBUQUERQUE, Mrcio Portes; DE ALBUQUERQUE,


Marcelo Portes. Introduo ao MatLab. Centro Brasileiro de Pesquisas Fsicas,
CBPFNT-002/2007, 2007.

PEREIRA, Eduardo Henrique Hortencio. Solues inteligentes e de baixo custo para


a automao residencial utilizando smartphones. 2014

RUDEK, Marcelo; COELHO, Leandro dos Santos; CANCIGLIERI JR, Osris. Viso
computacional aplicada a sistemas produtivos: fundamentos e estudo de caso. XXI
Encontro Nacional de Engenharia de Produo-2001, Salvador, 2001.

46

APNDICE A HARDWARE E MICROCONTROLADORES

Cdigo implementado no mdulo transmissor de RF:


//
//
//
//
//

ask_transmitter.pde
-*- mode: C++ -*Simple example of how to use RadioHead to transmit messages
with a simple ASK transmitter in a very simple way.
Implements a simplex (one-way) transmitter with an TX-C1 module

#include <RH_ASK.h>
#include <SPI.h> // Not actually used but needed to compile
RH_ASK driver;
void setup()
{
Serial.begin(9600);
// Debugging only
if (!driver.init())
Serial.println("init failed");
pinMode(13,OUTPUT);
}
void loop()
{
if (Serial.available())
{
char recebido[8]="";
Serial.readBytes(recebido, 8);
Serial.println(recebido);
driver.send((uint8_t *)recebido, strlen(recebido));
driver.waitPacketSent();
digitalWrite(13,1);
delay(200);
digitalWrite(13,0);
}
//char recebido[8]={'1', '2', '3', '4', '5', '6', '7', '8'};
}

47

Cdigo implementado no mdulo receptor de RF:


#include <RH_ASK.h>
#include <SPI.h> // Not actualy used but needed to compile
#include <Servo.h>
float cp, cd,kp,kd, ki,e,e0,t,t0,vp,sp,dir,k1,k2;
float bias=0.0;
float pid,ci;
float angulo;
char texto[8];
int i;
RH_ASK pacote;
Servo Motor_e; //Motor esquerdo
Servo Motor_d; //Motor direito
int pos;
long oldPosition

= -999;

//Caso d: Giro para a direita


//Caso e: Giro para a esquerda
//Caso f: Anda para frente
//Caso r: Anda de r
//Caso p: Fica parado
void movimento(char lado)
{
switch (lado)
{
case 'd':
Motor_d.write(92);
position in variable 'pos'
Motor_e.write(94);
delay(20);
to reach the position
break;
case 'e':
Motor_e.write(94);
position in variable 'pos'
Motor_d.write(92);
delay(20);
to reach the position
break;

// in steps of 1 degree
// tell servo to go to
// waits 15ms for the servo

// tell servo to go to
// waits 15ms for the servo

case 'f':
Motor_e.write(180);
position in variable 'pos'
Motor_d.write(0);
delay(20);
to reach the position
break;
case 'r':

// tell servo to go to
// waits 15ms for the servo

48

Motor_e.write(0);
position in variable 'pos'
Motor_d.write(180);
delay(20);
to reach the position
break;

//

tell

servo

to

go

to

// waits 15ms for the servo

case 'p':
Motor_e.write(93);
position in variable 'pos'
Motor_d.write(93);
delay(20);
to reach the position
break;
}
}

// tell servo to go to
// waits 15ms for the servo

void chute_a_gol(Servo* MdServo, Servo* MeServo)


{
MeServo->detach();
MdServo->detach();
digitalWrite(13,HIGH);
delay(1000);
for(int j=0;j<=20;j++)
{
digitalWrite(12,HIGH);
delay(100);
digitalWrite(12,LOW);
delay(100);
}
for(int j=0;j<=50;j++)
{
digitalWrite(12,HIGH);
digitalWrite(13,LOW);
delay(50);
digitalWrite(12,LOW);
digitalWrite(13,HIGH);
delay(50);
}
digitalWrite(12,HIGH);
digitalWrite(13,LOW);
delay(3000);
MeServo->attach(9);
MdServo->attach(10);
delay(100);
MdServo->write(0);
MeServo->write(180);
delay(2000);
digitalWrite(12,LOW);
}
void controle(Servo* MdServo, Servo* MeServo, double angulo)
{

49

float newPosition = angulo;


if (newPosition != oldPosition) {
oldPosition = newPosition;
//Serial.println(newPosition);
}
vp=newPosition;
//sp= map(analogRead(A9), 0, 1023, 0, 5000);
sp=0;
kp=0.05;
ki=0.0;
kd=0.0;
//vp= map(analogRead(A0), 0, 1023, 0, 255);
e=sp-vp;
cp=kp*e;
//ci=ki*((e+e0)/2)*((t-t0)/1000)+ci;
//cd=kd*(e-e0)/((t-t0)/1000);
if(ci>6) ci=6;
if(ci<-6) ci=-6;
if (cd>4) cd=4;
if (cd<-4) cd=-4;
pid=cp+ci+cd+bias;
if
if
if
if

(pid>4) pid=4;
(pid<-4) pid=-4;
(pid>-1 && pid<0) pid=-1;
(pid<1 && pid>0) pid=1;

if (e<3 && e>-3 && e0<3 && e0>-3)


{
chute_a_gol(MdServo,MeServo);
}
else
{
MdServo->write(93+pid);
MeServo->write(93+pid);
}
e0=e;
t0=t;
t=millis();
Serial.print("\t SP = ");
Serial.print(sp);
Serial.print("\t VP = ");
Serial.print(vp);
Serial.print("\t PID = ");
Serial.println(pid);
Serial.print("\t k1 = ");
Serial.println(k1);
Serial.print("\t k2 = ");
Serial.println(k2);
Serial.print("\t angulo = ");
Serial.println(angulo);
delay(1);
//parseInt()

50

}
void setup()
{
Serial.begin(9600); // Debugging only
Serial.println("setup");
if (!pacote.init())
Serial.println("init failed");
pinMode(12,OUTPUT);
pinMode(13,OUTPUT);
ci=0;
bias=0;
e=0;
e0=e;
t=millis();
t0=t;
}
uint8_t buf[RH_ASK_MAX_MESSAGE_LEN];
uint8_t buflen = sizeof(buf);
void loop()
{

if (pacote.recv(buf, &buflen)) // Non-blocking


{
for (i = 0; i < buflen; i++)
{
texto[i]=buf[i];
Serial.print(texto[i]);
Serial.print(" ");
}//for
Serial.println("");
angulo=atof(texto);
Serial.print("Angulo: ");
Serial.print(angulo);
Serial.println("");
Motor_e.attach(9); //Motor esquerdo
Motor_d.attach(10); //Motor direito
controle(&Motor_d, &Motor_e, angulo);
delay(500);
Motor_e.detach();
Motor_d.detach();
}
}//loop

51

52

53

APNDICE B CDIGO IMPLEMENTADO DO MATLAB


Funes:
video.m
vid = videoinput('winvideo',1);% abre a conexo com a camera de video
%preview(vid) % abre uma janela com a camera
A = getsnapshot(vid); % obtem um quadro do video (figura RGB)
delete(vid)
imshow(A)

verifica.m
%vet_pos=[pos1 pos2
[vert hor]
%vet_pos_V=[pos1(1)
pos8(1)]; %Vetor de
%vet_pos_H=[pos1(2)
pos8(2)]; %Vetor de

pos3 pos4 pos5 pos6 pos7 pos8]; %Vetor de posies


pos2(1) pos3(1) pos4(1) pos5(1) pos6(1) pos7(1)
posies verticais
pos2(2) pos3(2) pos4(2) pos5(2) pos6(2) pos7(2)
posies horizontais

function [erro1] = verifica(vet_pos)


vet_pos_V=[vet_pos(1,1) vet_pos(2,1) vet_pos(3,1) vet_pos(4,1) vet_pos(5,1)
vet_pos(6,1) vet_pos(7,1) vet_pos(8,1)];
vet_pos_H=[vet_pos(1,2) vet_pos(2,2) vet_pos(3,2) vet_pos(4,2) vet_pos(5,2)
vet_pos(6,2) vet_pos(7,2) vet_pos(8,2)];
%Ordenando os vetores
for k=1:1:7
for i=1:1:7
if vet_pos_V(i) > vet_pos_V(i+1);
aux=vet_pos_V(i);
vet_pos_V(i)=vet_pos_V(i+1);
vet_pos_V(i+1)=aux;
end
end
end
for k=1:1:7
for i=1:1:7
if vet_pos_H(i) > vet_pos_H(i+1);
aux=vet_pos_H(i);
vet_pos_H(i)=vet_pos_H(i+1);
vet_pos_H(i+1)=aux;
end
end
end
%Verificando valores iguais
total_de_pontos_V=1;
total_de_pontos_H=1;
for k=1:1:7
if vet_pos_V(k+1) ~= vet_pos_V(k)
total_de_pontos_V=total_de_pontos_V+1;
end

54

end
for k=1:1:7
if vet_pos_H(k+1) ~= vet_pos_H(k)
total_de_pontos_H=total_de_pontos_H+1;
end
end
%caso o nmero de parmetros recolhidos do tringulo seja maior que 3,
%um sinal de erro gerado
if total_de_pontos_V >3 || total_de_pontos_H >3;
erro1=1; %erro de aquisio de parmetros
else
erro1=0;
end

varredura_intensiva.m
%Efetua a varredura procurando pixels brancos na imagem, pixels brancos
%possuem valor 1, enquanto pixels pretos possuem valor 0.
%Esta funo recebe como parmetro a imagem e retorna uma matriz com as
%primeiras posies encontradas de acordo com a orientao da varredura
%Cada posio encontrada apagada em um "raio" de pixels ao redor do ponto
%encontrado. Esta funo deve ser utilizada tendo como marcador 3 pontos
%vermelhos.
function [vet_pos] = varredura_intensiva(Im, raio)
tam=size(Im); %Im(1) == Altruta Im(2) == Largura
%Varredura 1
for V=1:1:tam(1, 1)
%Vertical
for H=1:1:tam(1, 2) %Horizontal
if (Im(V,H)== 1)
%pos1 o primeiro ponto branco encontrado.
pos1=[V,H];
Im(V,H)=0;
%Apaga o ponto na Imagem
for(cont1=(V-floor(raio/2)):1:floor((raio/2)))
for(cont2=floor((H-raio/2)):1:floor((raio/2)))
Im(cont1,cont2)=0;
end
end
figure (9)
imshow(Im)
break
end
end
end
%Varredura 2
for V=1:1:tam(1, 1)
%Vertical
for H=1:1:tam(1, 2) %Horizontal
if (Im(V,H)== 1)

55

%pos2 o segundo ponto branco encontrado.


pos2=[V,H];
%Apaga o ponto na Imagem
for(cont1=(V-floor(raio/2)):1:floor((raio/2)))
for(cont2=floor((H-raio/2)):1:floor((raio/2)))
Im(cont1,cont2)=0;
end
end
break
end
end
end
%Varredura 3
for V=1:1:tam(1, 1)
%Vertical
for H=1:1:tam(1, 2) %Horizontal
if (Im(V,H)== 1)
%pos3 o terceiro ponto branco encontrado.
pos3=[V,H];
%Apaga o ponto na Imagem
for(cont1=(V-floor(raio/2)):1:floor((raio/2)))
for(cont2=floor((H-raio/2)):1:floor((raio/2)))
Im(cont1,cont2)=0;
end
end
break
end
end
end

vet_pos=[pos1; pos2; pos3]


figure(9);
imshow(Im);
end

varredura.m
%Efetua a varredura procurando pixels brancos na imagem, pixels brancos
%possuem valor 1, enquanto pixels pretos possuem valor 0.
%Esta funo recebe como parmetro a imagem e retorna uma matriz com as
%primeiras posies encontradas de acordo com a orientao da varredura
function [vet_pos] = varredura(Im)
tam=size(Im); %Im(1) == Altruta Im(2) == Largura
%Varredura da esquerda para a direita de cima para baixo
for V=1:1:tam(1, 1)
%Vertical
for H=1:1:tam(1, 2) %Horizontal
if (Im(V,H)== 1)
pos1=[V,H];

56

break
end
end
if (Im(V,H)== 1) break;
end
%Mensagem caso no seja detectada a imagem:
if V==tam(1, 1) && H==tam(1, 2);
vet_pos=[0 0 0 0 0 0 0 0];
pos1=[0 0];
pos2=[0 0];
pos3=[0 0];
pos4=[0 0];
pos5=[0 0];
pos6=[0 0];
pos7=[0 0];
pos8=[0 0];
disp('****Imagem no detectada. Erro detectado durante a
varredura.****')
break;
end
end
%pos1 o primeiro ponto branco encontrado.
%Varredura da direita para a esquerda de cima para baixo
for V=1:1:tam(1, 1)
%Vertical
for H=tam(1, 2):-1:1 %Horizontal
if (Im(V,H)== 1)
pos2=[V,H];
break
end
end
if (Im(V,H)== 1) break;
end
end
%Varredura da esquerda para a direita de baixo para cima
for V=tam(1, 1):-1:1
%Vertical
for H=1:1:tam(1, 2) %Horizontal
if (Im(V,H)== 1)
pos3=[V,H];
break
end
end
if (Im(V,H)== 1) break;
end
end
%Varredura da direita para a esquerda de baixo para cima
for V=tam(1, 1):-1:1
%Vertical
for H=tam(1, 2):-1:1 %Horizontal
if (Im(V,H)== 1)
pos4=[V,H];
break
end
end
if (Im(V,H)== 1) break;
end
end

57

%------------------------------------------------------------------%Varredura de cima para baixo da esquerda para a direita


for H=1:1:tam(1, 2)
%Horizontal
for V=1:1:tam(1, 1) %Vertical
if (Im(V,H)== 1)
pos5=[V,H];
break
end
end
if (Im(V,H)== 1) break;
end
end
%Varredura de cima para baixo da direita para a esquerda
for H=1:1:tam(1, 2)
%Horizontal
for V=tam(1, 1):-1:1 %Vertical
if (Im(V,H)== 1)
pos6=[V,H];
break
end
end
if (Im(V,H)== 1) break;
end
end
%Varredura de baixo para cima da esquerda para a direita
for H=tam(1, 2):-1:1
%Horizontal
for V=1:1:tam(1, 1) %Vertical
if (Im(V,H)== 1)
pos7=[V,H];
break
end
end
if (Im(V,H)== 1) break;
end
end
%Varredura de baixo para cima da direita para a esquerda
for H=tam(1, 2):-1:1
%Horizontal
for V=tam(1, 1):-1:1 %Vertical
if (Im(V,H)== 1)
pos8=[V,H];
break
end
end
if (Im(V,H)== 1) break;
end
end
vet_pos=[pos1; pos2; pos3; pos4; pos5; pos6; pos7; pos8];
end

pos_otima.m
%Esta funo retorna a posio tima do carrinho para que a bola seja
%atingida e acerte o gol, em coordenadas retangulares com o gol como o
%centro do plano.

58

%A posio ideal dever ser a exteno da reta que passa pelo centro do gol
%e pelo centro da bola. O ponto ideal esta reta acrescida dos valores do
%raio da bola e do raio do para-choque do carrinho.
function [posicao_otima]=pos_otima(gol, bola, raio_carrinho, raio_bola)

%Funo da reta que passa atravs do gol e da bola:


eq_reta=encontre_reta(gol,bola);
%Encontrando o coeficiente angular e o ngulo da equao da reta:
syms x;
coef_angular=subs(eq_reta,x,1)-subs(eq_reta,x,0);
theta=atan(coef_angular);
%Encontra a posio x ideal:
if gol(1)>bola(1);
x_ideal=bola(1)-(raio_carrinho*cos(theta)+raio_bola*cos(theta));
else
x_ideal=bola(1)+(raio_carrinho*cos(theta)+raio_bola*cos(theta));
end
%Encontra a posio y ideal:
y_ideal=subs(eq_reta,x,x_ideal);
%Retorna as coordenadas ideais:
posicao_otima=[x_ideal y_ideal];
%plota a reta tima
hold on;
plot(gol(1),subs(eq_reta,x,gol(1)),'*',bola(1),subs(eq_reta,x,bola(1)),'*')
%marca no desenho o centro da bola e do gol com asteriscos
plot([gol(1) bola(1)], [subs(eq_reta,x,gol(1)),subs(eq_reta,x,bola(1))])
%plota a linha: plot(valores_das_abscissas, valores_das_ordenadas)

end

pos_centro.m
%Esta funo recebe a imagem aps a aplicao dos filtros
%e retorna a posio do centro.
function [pos] = pos_centro(Im)
vet_pos=varredura(Im);
vet_pos_V=vet_pos(1,1)+vet_pos(2,1)+vet_pos(3,1)+vet_pos(4,1)+vet_pos(5,1)+
vet_pos(6,1)+vet_pos(7,1)+vet_pos(8,1);
vet_pos_H=vet_pos(1,2)+vet_pos(2,2)+vet_pos(3,2)+vet_pos(4,2)+vet_pos(5,2)+
vet_pos(6,2)+vet_pos(7,2)+vet_pos(8,2);
pos_V=vet_pos_V/8;
pos_H=vet_pos_H/8;
pos=[pos_H pos_V];
end

59

pos_carro.m
%Esta funo retorna a posio do carrinho com base nos 3 parmetros de
%posio encontrados desde que no haja erro de aquisio de parmetros.
function [posicao]=pos_carro(pos)
posicao(1,1)=pos(1,1);
posicao(1,2)=pos(1,2);
for k=2:1:8
if pos(k,1) ~= posicao(1,1) || pos(k,2) ~= posicao(1,2);
posicao(2,1)=pos(k,1);
posicao(2,2)=pos(k,2);
break
end
end
for k=3:1:8
if (pos(k,1) ~= posicao(1,1) || pos(k,2) ~= posicao(1,2)) &&
(pos(k,1) ~= posicao(2,1) || pos(k,2) ~= posicao(2,2))
posicao(3,1)=pos(k,1);
posicao(3,2)=pos(k,2);
break
end
end

param_carro.m
%Esta funo pega 3 parmetros de posio (triangulo marcador) do carro, e
%1 parametro de posio da bola e retorna a distncia do carro at a bola e
%a angulao do carro em relao a bola.
function [parametros]=param_carro(p_carro, p_bola)
%Encontrando o ponto mais afastado da base do marcador (tringulo issceles
L1=sqrt((p_carro(1,1)-p_carro(2,1))^2 + (p_carro(1,2)-p_carro(2,2))^2);
L2=sqrt((p_carro(1,1)-p_carro(3,1))^2 + (p_carro(1,2)-p_carro(3,2))^2);
L3=sqrt((p_carro(2,1)-p_carro(3,1))^2 + (p_carro(2,2)-p_carro(3,2))^2);
%compara os lados do tringulo, encontra o menor, e atribui ao centro do
%carrinho o valor do ponto oposto ao menor lado.
if L1<L2 && L1<L3
centro(1,1)=p_carro(3,1);
centro(1,2)=p_carro(3,2);
end
if L2<L1 && L2<L3
centro(1,1)=p_carro(2,1);
centro(1,2)=p_carro(2,2);
end
if L3<L1 && L3<L2
centro(1,1)=p_carro(1,1);
centro(1,2)=p_carro(1,2);
end

60

%Calcula a distncia entre o centro e a bola


dist=sqrt((centro(1,1)-p_bola(1,1))^2 + (centro(1,2)-p_bola(1,2))^2);
%Calcula o ngulo entre o carro e a bola
%Encontra o ponto mdio entre os dois pontos mais prximos (base do
%tringulo issceles (Xm)
if L1<L2 && L1<L3
Xm(1,1)=(p_carro(1,1)+p_carro(2,1))/2;
Xm(1,2)=(p_carro(1,2)+p_carro(2,2))/2;
end
if L2<L1 && L2<L3
Xm(1,1)=(p_carro(1,1)+p_carro(3,1))/2;
Xm(1,2)=(p_carro(1,2)+p_carro(3,2))/2;
end
if L3<L1 && L3<L2
Xm(1,1)=(p_carro(2,1)+p_carro(3,1))/2;
Xm(1,2)=(p_carro(2,2)+p_carro(3,2))/2;
end
%Encontra os vetores da origem at a bola e da origem at o ponto Xm
vet_bola(1,1)=p_bola(1,1)-Xm(1,1);
vet_bola(1,2)=p_bola(1,2)-Xm(1,2);
vet_carro(1,1)=centro(1,1)-Xm(1,1);
vet_carro(1,2)=centro(1,2)-Xm(1,2);
%Encontra o valor do ngulo entre os dois vetores
num=(vet_bola(1,1)*vet_carro(1,1))+vet_bola(1,2)*vet_carro(1,2);
mod_bola=sqrt((vet_bola(1,1)^2)+(vet_bola(1,2)^2));
mod_carro=sqrt((vet_carro(1,1)^2)+(vet_carro(1,2)^2));
den=mod_bola*mod_carro;
cos_theta=num/den;
ang=acos(cos_theta);
parametros=[dist, ang];

mod_e_ang.m
%Esta funo retorna o valor do mdulo e do ngulo entre 2 pontos
function [parametros]=mod_e_ang(p1, p2)
%Calcula o mdulo
mod= sqrt((p2(1)-p1(1))^2+(p2(2)-p1(2))^2);
%Calcula o ngulo

61

cos_alpha=(p2(1)-p1(1))/mod;
ang=acos(cos_theta);
%Calcula o coeficiente angular
coef_a=(p2(2)-p1(2))/p2(1)-p1(1);
%Calcula o coeficiente linear
coef_l=(p1(2)-coef_a*p1(1)); %b=y-a*x
%Retorno
parametros=[mod ang coef_a coef_l];

end

Loop.m
%Tudo
Calibra_Cores; %gera matrizes com os mximos e os mnimos de cada cor
vid = videoinput('winvideo',1);% abre a conexo com a cmera de video
s1 = serial('COM3'); %conexo serial
fopen(s1);
i=0;
while i<30
i=i+1; %parada aps realizar 10 ciclos
[CARRO BOLA GOL]=captura(vid, mat_max, mat_min);
%imagem_id %Funo utilizada para testes. Efetua a identificao da imagem.
oito_pontos=varredura(CARRO);
if(verifica(oito_pontos))
oito_pontos=corrigir(oito_pontos,10);
end
%"carro" uma matriz 3x2 que contm os 3 pontos do tringulo marcador do
carro
carro=pos_carro(oito_pontos);
%"bola" o ponto do centro da bola
bola=pos_centro(BOLA);
bola=floor(bola); %corta a parte quebrada
%"gol" o ponto do centro do gol
gol=pos_centro(GOL);
gol=floor(gol); %corta a parte quebrada
%Encontra a posio que o carrinho tem que ter para acertar a bola em um
%ponto que faa com que o trajeto da bola seja o gol.
pos_ideal=pos_otima(gol,bola,30,35);
pos_ideal=floor(pos_ideal); %corta a parte quebrada
%Encontra a reta ideal que passa pela frente do carrinho e pela posio
%ideal
frente_do_carro=frente_do(carro);

62

reta_ideal=encontre_reta(frente_do_carro,pos_ideal);
%encontra a reta que d a direo do carro, passando pela frente e pela
%base
base_do_carro=base_do(carro);
reta_carro=encontre_reta(base_do_carro,frente_do_carro);
%Ponto de encontro entre a reta ideal e a reta direo do carro
syms x;
encontro_retas=[solve(reta_carro-reta_ideal)
subs(reta_ideal,x,solve(reta_carro-reta_ideal))];
encontro_retas=sym2poly(encontro_retas);
%Encontrando o angulo ideal em 3 passos:
%1- Transladando a origem do eixo para a base do carrinho
pos_ideal1=[pos_ideal(1)-base_do_carro(1) pos_ideal(2)base_do_carro(2)];
encontro_retas1=[encontro_retas(1)-base_do_carro(1)
encontro_retas(2)-base_do_carro(2)];
%2- Encontra os ngulos entre a origem e posio ideal e origem e
encontro
%de retas
angulo_pos_ideal=atan2(pos_ideal1(2), pos_ideal1(1));
angulo_encontro_retas=atan2(encontro_retas1(2),
encontro_retas1(1));
%3- A subtrao desses ngulos ser o angulo necessrio para o
carrinho
%corrigir a posio.
erro=angulo_encontro_retas-angulo_pos_ideal;
%convertendo o erro de radianos para graus
erro=erro*180/pi;
%Ajustando o sinal do ngulo
%O gol dever estar localizado na parte inferior da imagem para funcionar.
%if frente_do_carro(2)>bola(2);
%
erro=erro*(-1);
%end
%if gol(1)<bola(1);
%
erro=180-erro;
%end
%if erro>=180;
%
erro=-(360-erro);
%end
disp(erro);
%Envia dados via comunicao serial para o arduino
fprintf(s1,'%.2f',erro);
%Plota no desenho
hold on
syms x;

63

plot(frente_do_carro(1),subs(reta_ideal,x,frente_do_carro(1)),'*',pos_ideal
(1),subs(reta_ideal,x,pos_ideal(1)),'*')
plot([frente_do_carro(1) pos_ideal(1)],
[subs(reta_ideal,x,frente_do_carro(1)),subs(reta_ideal,x,pos_ideal(1))])
hold on;
plot(base_do_carro(1),subs(reta_carro,x,base_do_carro(1)),'*',frente_do_car
ro(1),subs(reta_ideal,x,frente_do_carro(1)),'*')
plot([base_do_carro(1) frente_do_carro(1)],
[subs(reta_carro,x,base_do_carro(1)),subs(reta_carro,x,frente_do_carro(1))]
)

end
fclose(s1);
delete(s1);
delete(vid); %fecha a conexo com o canal de vdeo.

imagem_id.m
%Filtra a imagem, subtrai as cores, e indica a imagem filtrada
%em preto e branco, evidenciando o objeto.
%vid = videoinput('winvideo',1);% abre a conexo com a camera de video
%A = getsnapshot(vid); % obtem um quadro do video (figura RGB)
%delete(vid)
[A, MAP1] =
figure(1)
imshow(A)
R = A(:, :,
G = A(:, :,
B = A(:, :,

imread('teste3.png');
1); % Matriz de tons vermelhos
2); % Matriz de tons verdes
3); % Matriz de tons azuis

R1=R-G-B;
G1=G-R-B;
B1=B-R-G;
%figure(2)
%imshow(R1)
CARRO = im2bw(R1, 0.1);%(imagem preto e branco 0 0u 1 mariz nxm)
%figure(3)
%imshow(I1)
%figure(4)
%imshow(G1)
BOLA = im2bw(G1, 0.1);%(imagem preto e branco 0 0u 1 mariz nxm)
%figure(5)
%imshow(I2)
%figure(6)
%imshow(B1)
GOL = im2bw(B1, 0.1);%(imagem preto e branco 0 0u 1 mariz nxm)
%figure(7)
%imshow(I3)
IT=CARRO+BOLA+GOL;
figure(8)
imshow(IT)

64

frente_do.m
%Esta funo recebe os 3 pontos do marcador do carro (tringulo issceles)
%e retorna o ponto que marca a frente do carro (ponto oposto ao menor lado
%do tringulo issceles).
function [frente]=frente_do(p_carro)
%Encontrando o ponto mais afastado da
L1=sqrt((p_carro(2,1)-p_carro(3,1))^2
%mdulo do lado oposto ao ponto p1
L2=sqrt((p_carro(1,1)-p_carro(3,1))^2
%mdulo do lado oposto ao ponto p2
L3=sqrt((p_carro(1,1)-p_carro(2,1))^2
%mdulo do lado oposto ao ponto p3

base do marcador (tringulo issceles


+ (p_carro(2,2)-p_carro(3,2))^2);
+ (p_carro(1,2)-p_carro(3,2))^2);
+ (p_carro(1,2)-p_carro(2,2))^2);

%compara os lados do tringulo, encontra o menor, e atribui ao centro do


%carrinho o valor do ponto oposto ao menor lado.
if L1<L2 && L1<L3
centro(1,1)=p_carro(1,1);
centro(1,2)=p_carro(1,2);
end
if L2<L1 && L2<L3
centro(1,1)=p_carro(2,1);
centro(1,2)=p_carro(2,2);
end
if L3<L1 && L3<L2
centro(1,1)=p_carro(3,1);
centro(1,2)=p_carro(3,2);
end
frente=[centro(1,2) centro(1,1)];
end

envia.m
%Esta funo envia dados para o arduino.
function envia(mod, ang)
s1 = serial('COM1');
fopen(s1);
fprint(s1,'%s',mod);
fprint(s1,'%s',ang);
end

encontre_reta.m
%Encontra a equao da reta que passa por 2 pontos
function [eq]=encontre_reta(p1, p2)

65

syms x;
syms y;
A=[x y 1; p1(1) p1(2) 1; p2(1) p2(2) 1];
eq=det(A);
symvar(y);
eq=solve(eq,y);

%Declara y como varivel principal


%Isola y da equao.

end

encontre_angulo.m
%Encontra o ngulo entre 2 retas. As variveis devero conter as funes de
%x "f(x)"
function [alpha]=encontre_angulo(reta_1, reta_2)
%m1 e m2 so coeficientes angulares das retas 1 e 2.
syms x;
m1=subs(reta_1,x,1)-subs(reta_1,x,0);
m2=subs(reta_2,x,1)-subs(reta_2,x,0);
alpha=atan(abs((m1-m2)/(1+m1*m2)));
end

corrigir.m
%Esta funo corrige caso diferentes mas muito prximos estejam
%representando o mesmo ponto no vetor. Recebe um vetor com 8 pontos e um
%raio de ao como argumentos. Caso dois pontos sejam encontrados no mesmo
%raio, eles sero substituidos pelo ponto mdio.
function [corrigido] = corrigir(pontos, raio)
%Ordenando os vetores tendo como critrio o primeiro nmero da linha
for k=1:1:7
for i=1:1:7
if pontos(i,1) > pontos(i+1,1);
aux=[pontos(i,1) pontos(i,2)];
pontos(i,1)=pontos(i+1,1);
pontos(i,2)=pontos(i+1,2);
pontos(i+1,1)=aux(1);
pontos(i+1,2)=aux(2);
end
end
end
for k=1:1:7
for i=1:1:7
%Verifica se os pontos esto dentro do raio de busca. Caso
estejam,
%os dois pontos so substituidos pelo valor medio e o valor do
%contador incrementado.
p1=[pontos(i,1); pontos(i,2)];

66

p2=[pontos(i+1,1); pontos(i+1,2)];
mod= sqrt((p2(1)-p1(1))^2+(p2(2)-p1(2))^2);
mod=floor(mod);
if

mod <= raio;


pontos(i+1,1)=pontos(i,1);
pontos(i+1,2)=pontos(i,2);
i=i+1;

end
end
end
total_de_pontos=1;
pontos=round(pontos); %Arredonda para nmero inteiro mais prximo.
for i=1:1:7
%Verifica se existem apenas 3 pontos no vetor com oito.
if pontos (i,1) ~= pontos(i+1,1) || pontos (i,2) ~= pontos(i+1,2);
total_de_pontos=total_de_pontos+1;
end
end

if total_de_pontos > 3;
disp('****Erro na correo dos parmetros. Verificar o "raio" na
funo "corrigir"****')
end
corrigido=pontos;

captura.m
%Esta funo faz a leitura da cmera de vdeo e retorna as imagens em preto
%e branco aps aplicao de filtro de cores RGB. vid a varivel "canal"
%de vdeo, que dever ser passada como parmetro para a funo.
function [Img_Red Img_Green Img_Blue] = captura(vid, mat_max, mat_min)
A = getsnapshot(vid);
figure(1)
imshow(A)
%Mascara(:,:,1) representa a imagem do carro
%Mascara(:,:,2) representa a imagem da bola
%Mascara(:,:,3) representa a imagem do gol
Mascara=A(:,:,:)*0;
k=size(A);
x=1; %Limite superior de tolerncia
y=1; %Limite inferior de tolerncia

for i=1:1:3
for L=1:1:k(1,1)

67

for C=1:1:k(1,2)
if A(L,C,1)<mat_max(1,i)*x;
if A(L,C,1)>mat_min(1,i)*y;
if A(L,C,2)<mat_max(2,i)*x;
if A(L,C,2)>mat_min(2,i)*y;
if A(L,C,3)<mat_max(3,i)*x;
if A(L,C,3)>mat_min(3,i)*y;
Mascara(L,C,i)=A(L,C,i);
end
end
end
end
end
end
end
end
end
Img_Red
= im2bw(Mascara(:,:,1), 0.1);
Img_Green = im2bw(Mascara(:,:,2), 0.1);
Img_Blue = im2bw(Mascara(:,:,3), 0.1);
end

Calibra_Cores.m
[Modelo_Bola, MAP1] = imread('bola.png');
[Modelo_Carro, MAP2] = imread('carro.png');
[Modelo_Gol, MAP3] = imread('gol.png');
%Pegando os limites de intensidade dos modelos e organiza os dados em uma
%matriz de mximos e outra matriz de mnimos.
%
%
mat_max
|
mat_min
%
carro bola gol
|
carro bola gol
% r
x
x
x
| r
x
x
x
% g
x
x
x
| g
x
x
x
% b
x
x
x
| b
x
x
x

for i=1:1:3
mat_max(i,1)=max(max(Modelo_Carro(:,:,i)));
mat_min(i,1)=min(min(Modelo_Carro(:,:,i)));
mat_max(i,2)=max(max(Modelo_Bola(:,:,i)));
mat_min(i,2)=min(min(Modelo_Bola(:,:,i)));
mat_max(i,3)=max(max(Modelo_Gol(:,:,i)));
mat_min(i,3)=min(min(Modelo_Gol(:,:,i)));
end

68

base_do.m
%Esta funo recebe os 3 pontos do marcador do carro (tringulo issceles)
%e retorna o ponto que marca a base do carro. O ponto mdio entre os dois
pontos
%opostos a frente do carro.
function [base]=base_do(p_carro)
%Encontrando o ponto mais afastado da
L1=sqrt((p_carro(2,1)-p_carro(3,1))^2
%mdulo do lado oposto ao ponto p1
L2=sqrt((p_carro(1,1)-p_carro(3,1))^2
%mdulo do lado oposto ao ponto p2
L3=sqrt((p_carro(1,1)-p_carro(2,1))^2
%mdulo do lado oposto ao ponto p3

base do marcador (tringulo issceles


+ (p_carro(2,2)-p_carro(3,2))^2);
+ (p_carro(1,2)-p_carro(3,2))^2);
+ (p_carro(1,2)-p_carro(2,2))^2);

%compara os lados do tringulo, encontra o menor, e atribui a base do


%carrinho o valor mdio dos pontos opstos a frente do carro.
if L1<L2 && L1<L3
base=[(p_carro(2,2)+p_carro(3,2))/2 (p_carro(2,1)+p_carro(3,1))/2];
end
if L2<L1 && L2<L3
base=[(p_carro(1,2)+p_carro(3,2))/2 (p_carro(1,1)+p_carro(3,1))/2];
end
if L3<L1 && L3<L2
base=[(p_carro(1,2)+p_carro(2,2))/2 (p_carro(1,1)+p_carro(2,1))/2];
end
end

acha_erro.m
%Esta funo retorna o ngulo entre as retas formadas pela posio real do
%carrinho e a posio ideal do carrinho.

function [erro]=acha_erro(reta_ideal, reta_real)


R1 = mod_e_ang(gol, bola); %retorna [modulo angulo coeficiente_angular
coeficiente_linear]
R2=3;
R3=5;
%Sendo assim, a distncia do gol at a posio ideal ser:
R_ideal=R1(1)+R2+R3;
%Posio ideal:
y_ideal=bola(2)-cos(atan(coef_a))*R2+R3;
x_ideal=(y_ideal-coef_l)/coef_a;
posicao_otima=[x_ideal y_ideal];
end

S-ar putea să vă placă și