Você está na página 1de 144

Construa um robô inteligente

Prefácio – Pág. 3
Dedicatória – Pag. 4
Sobre o Livro – Pag. 5

Capítulo 1 – Eletrônica
1.1 - Introdução - Pag.10
1.2 - Acessórios mais utilizados em eletrônica - Pag.10
1.3 - A Solda - Pag.10
1.4 - Ferro de soldar - Pag.11
1.5 - Sugador de solda - Pag.11
1.6 - Placa de circuito impresso - Pag.12
1.7 - Percloreto de ferro e caneta para desenho de circuitos - Pag.12
1.8 - Como fazer uma solda bem feita? - Pag.14
1.9 - Os componentes eletrônicos - Pag.15
1.10 - Os componentes que utilizaremos são os seguintes - Pag.15
1.10.1 - Resistor - Pag.15
1.10.2 - Cristais - Pag.16
1.10.3 - Capacitores cerâmicos - Pag.16
1.10.4 - Circuito Integrado L293D - Pag.17
1.10.5 - Multímetro - Pag.17

Capítulo 2 – Mecânica
2.1 - Introdução - Pag.21
2.2 - Modelix - Pag.21
2.3 - Motor e caixa de redução - Pag.22
2.4 - Mini Retífica - Pag.23
2.5 - Outros acessórios - Pag.24

Capítulo 3 – PIC 18F452 e LCD Gráfico


3.1 - PIC 18F452 - Pag.26
3.2 - Gravando um programa no PIC - Pag.27
3.3 - Compilando e gravando o programa no PIC - Pag.28
3.4 - LCD Gráfico – Informações gerais - Pag.29

Capítulo 4 – Projetando e desenvolvendo o circuito eletrônico


4.1 - Introdução - Pag.32
4.2 - Construindo o circuito - Pag.32
4.3 - Lista de componentes - Pag.33
4.4 - Ligar os pontos do circuito - Pag.34

Capítulo 5 – Montando a estrutura mecânica do robô


5.1 - Introdução - Pag.38
5.2 - Caixa de redução - Pag.38
5.3 - Montagem do corpo robótico - Pag.38

Capítulo 6 – Programação do recurso de voz


6.1 - Introdução - Pag.55
6.2 - Instalação das linguagens de programação Microsoft Visual C++ 2010 Express Edition e
Microsoft Visual C# 2010 Express Edition - Pag.56
6.3 – Registrando o Visual C# - Pag.66
6.4 – Registrando o Visual C++ - Pag.68
6.5 - Biblioteca de voz - Pag.71
6.6 - Instalando o pacote de voz em português - Pag.80

1
6.7 - Programando o reconhecimento de voz sintetizada - Pag.90
6.8 - Código fonte da tela que carrega as palavras - Pag.92
6.9 - Código fonte da função de reconhecimento de comando de voz - Pag.95

Capítulo 7 – Programação da visão artificial


7.1 - Introdução - Pag.99
7.2 – Algoritmo de detecção do movimento dos motores - Pag.100
7.3 – Instalando o OpenCV - Pag.100
7.4 - Configurando as bibliotecas do OpenCV no Visual C++ - Pag.104
7.5 - Configurando as opções globais do Visual Studio - Pag.107
7.6 - Programando a visão artificial - Pag.110

Capítulo 8 – Programação da porta USB


8.1 - Introdução - Pag.117
8.2 - Programando a biblioteca USB - Pag.120
8.3 - Biblioteca de funções - Pag.125
8.4 - Recebendo comandos de voz e enviando as coordenadas da webcam ao robô - Pag.129

Capítulo 9 – Programação do Micro-controlador PIC


9.1 – Mikrobasic - Pag.131
9.2 - Conceito de linguagens de programação para micro-controladores - Pag.131
9.3 - Programando o LCD Gráfico - Pag.134
9.4 - O programa para controle dos motores - Pag.139
9.5 - Entendendo o programa que controla o robô - Pag.140

Conclusão – Pág. 143

2
Prefácio

A presente obra trata-se de um trabalho bem elaborado,


fundamentado por diversos estudos e pesquisas experimentais no campo
da mecatrônica ao longo dos anos. Kleber Afonso Tibúrcio, um grande
amigo e exímio técnico em desenvolvimento de software e de hardware,
apresenta um conteúdo significante aos que desejam maior conhecimento
acerca dessa área tão surpreendente e inovadora.
Atuando ao lado do autor deste interessante livro, posso declarar
que as experiências e descobertas obtidas no decorrer de sua carreira
profissional foram mais do que importantes para a concretização deste
projeto. É notável como ao longo do percurso, as linguagens
experimentadas, em suas mais variadas versões, tornaram-se úteis e
significativas na conclusão das pesquisas aqui realizadas. Com uma
linguagem clara e objetiva, repleto de ilustrações e curiosidades sobre o
assunto, a obra visa apresentar técnicas para a construção e a
programação de um robô, capaz de responder a diversos comandos
manuais e de voz, além de ensinar técnicas de visão artificial.
Louvo a Jesus pela vida do autor e peço que lhe conceda mais e mais
sabedoria.

Renato Zibordi Junior


Analista de Sistemas Consultor
www.zibordi.com.br

3
Dedicatória

Quero dedicar este livro à minha família, em especial à minha mãe Maria
Amélia Molina Tiburcio. Também dedico o livro às amizades que consegui
fazer durante toda a minha vida.

Em memória de Amália Muñoz Rubio e Clóvis Tiburcio.

4
Sobre o Livro

Entre no nosso grupo para tirar dúvidas e baixar os arquivos e


códigos-fonte. O endereço do grupo é:
http://tech.groups.yahoo.com/group/build_smart_robot
Para entrar no grupo, nós enviaremos um convite para o endereço de
e-mail que você usou para comprar este livro. Depois é só seguir as
instruções contidas no convite.

Se você não receber o convite entre em contato no nosso endereço de


e-mail: kleberengenharia@yahoo.com.br

Este livro ensina algumas técnicas da ciência da robótica,


apresentando passo a passo a construção de um robô que tem a
capacidade de responder a comandos de voz, enxergar movimentos num
ambiente e interagir com o humano.

O Robô é um dispositivo eletromecânico, capaz de realizar tarefas


de maneira autônoma. Os robôs industriais utilizados nas linhas de
produção são a forma mais comum de robôs, porém esta situação esta
mudando recentemente devido à popularização dos robôs comerciais
limpadores de pisos e cortadores de gramas.
Outras aplicações incluem o tratamento de lixo tóxico, exploração
subaquática e espacial, cirurgias, mineração, busca/resgate e localização
de minas terrestres. Os robôs também aparecem nas áreas do
entretenimento e tarefas caseiras.

O termo robô tem origem na palavra checa robota, que significa


“trabalho forçado”.

Ao contrário de alguns trabalhos similares de outros autores, este


livro tem o enfoque na capacidade do robô em realizar atividades
autônomas – sem a interferência direta do homem – e no princípio de que
ele possa "pensar por si".

Nós abordaremos principalmente, além da montagem mecânica e


eletrônica do corpo do robô, a questão da inteligência artificial. Hoje esta
ciência ainda está engatinhando (um texto muito interessante sobre I.A.
pode ser encontrado no site http://pt.wikipedia.org/wiki/Inteligência_artificial).

5
Ensinaremos essa matéria de forma simples e didática, dando a você
uma noção da programação de um robô para que este consiga “enxergar” e
fazer distinção de movimentos, “ouvir” e identificar instruções de voz, ter
uma conversa razoável com um interlocutor humano e se movimentar de
acordo com sua própria “vontade”.

Apesar de ainda estarem engatinhando, já existem projetos caros e


complexos sendo desenvolvidos para suprir as deficiências dos sentidos
robóticos mais avançados como a visão e audição, para se tornarem
futuramente mais parecidos com os mesmos sentidos humanos.

Todas essas matérias serão aplicadas no nosso projeto e explicadas


passo a passo.

Mas então, como funciona a magia de fazer com que o robô


decida por tomar certas ações por conta própria?

Fazendo as devidas analogias com o mecanismo humano, podemos


comparar a estrutura mecânica que sustenta o corpo robótico com os ossos.
Os motores que fornecem os movimentos, com os músculos. A eletrônica
que alimenta os motores, sensores e assessórios com a energia biológica
que impulsiona o organismo humano.

E onde se encaixa o cérebro neste contexto? As máquinas


basicamente são burras, um amontoado de peças mecânicas e eletrônicas
de que nada servem se não existir uma "alma" por trás comandando tudo.

E esta "alma" que dá sentido à máquina se chama programa ou


software. A programação de computadores é a ciência que dá vida a uma
máquina. E o programador é o arquiteto por trás de tudo isso.

O que será ensinado adiante não é fazer de você um exímio


programador, mas dar base para que evolua nos programas apresentados
aqui, fazendo do seu próprio robô uma peça única.

Um breve resumo da História da robótica

No século I, um grego chamado Heron de Alexandria teve a idéia de


criar um engenho mecânico movido por cordas de pressão que tinha a
função de movimentar e controlar bonecos, velas, portas, etc. Este pode ter
sido o primeiro computador de tarefas programadas e repetitivas.

6
Outro pioneiro, na década de 1930, Wallace J. Eckert trabalhava num
laboratório de computação com uma máquina fabricada pela IBM, ao qual a
programação era feita a base de cartões perfurados. Na época, Wallace
trabalhava em astronomia e ele programou o computador da IBM para
retornar resultados matemáticos e salvar as informações em outros cartões
perfurados, processo parecido com os pentes de memória dos dias atuais.

Foi ele também quem elaborou as técnicas de depuração de


programas, para identificar e corrigir eventuais erros na programação dos
cartões, algo bastante arcaico nos dias de hoje, mas na época foi uma
inovação. Os seus trabalhos nessa área influenciaram os responsáveis pela
fabricação da primeira bomba atômica.

Outro programador notável, Alan Turing, é frequentemente


mencionado como o pai da ciência da computação. Ele foi responsável por
ajudar na elaboração de um programa destinado a quebrar o código alemão
ENIGMA durante a Segunda Guerra Mundial, utilizado no computador
chamado "Máquina Enigma".

O que você precisa obter para realizar o projeto apresentado neste


livro?

Algumas premissas devem ser atendidas antes de iniciar o projeto.


Todos os nossos testes foram feitos no sistema operacional Windows 7
Ultimate 32 bits, uma webcam com 640 colunas X 480 linhas e um
computador com 2 Gigabytes de memória. É aconselhável que você possua
uma máquina semelhante.

Utilizaremos três linguagens de programação e vamos explicar passo


a passo como trabalhar com elas no nosso projeto. As linguagens de
programação são os seguintes:

Visual C# 2010 Express Edition


Visual C++ 2010 Express Edition
Mikrobasic 7

O Visual C++ Express Edition e o Visual C# Express Edition são


softwares livres que podem ser usados a vontade, sem nenhum custo.

O Mikrobasic 7 é um software fabricado pela mikroElektronika, que


disponibiliza uma versão experimental grátis para download. Porém, no

7
nosso projeto, deve-se adquirir a versão completa, pois a experimental é
limitada e só permite um programa do tamanho de 2 Kbytes. O Mikrobasic
pode ser comprado por US$99,00 (noventa e nove dólares).

Você vai descobrir que vale a pena comprar o MikroBasic, pois ele
será muito útil em seus próprios projetos e o custo compensa a enorme
gama de recursos que possui esta linguagem.

Para quem não quiser de jeito nenhum comprar o Mikrobasic, não se


preocupe, no site
http://tech.groups.yahoo.com/group/build_smart_robot/files/
fornecemos todos os códigos fonte e código compilados para utilizarmos
neste projeto.
Mais adiante, forneceremos os links de onde poderão ser baixados os
softwares.

Microsoft Visual C ++ é uma marca registrada da Microsoft Corporation


Microsoft Visual C# é uma marca registrada da Microsoft Corporation
Mikrobasic é uma marca registrada da mikroElektronika

LEMBRE-SE: COMPRAR SOFTWARE PIRATA É CRIME!

8
Capítulo 1 – Eletrônica

9
1.1 - Introdução

A eletrônica é o ramo da ciência que estuda o uso de circuitos


formados por componentes elétricos e eletrônicos, com o objetivo principal
de representar, armazenar, transmitir ou processar informações além do
controle de processos e servomecanismos. Ela se divide em eletrônica
analógica e digital (usada principalmente em computadores). Nosso objetivo
aqui não é ensinar eletrônica detalhadamente, mas sim dar base para você
realizar facilmente o projeto eletrônico abordados neste livro.

1.2 - Acessórios mais utilizados em eletrônica:

A solda, ferro de soldar, placa de circuito impresso, removedor de


solda, caneta para desenho do circuito, percloreto de ferro e o multímetro
são os acessórios mais comuns na bancada de um hobbysta e de um
técnico em eletrônica. Você deve adquirir esses materiais para que coloque
em prática os ensinamentos deste livro.

1.3 - A Solda

As soldas têm a função de ligar componentes eletrônicos em placas


de circuito impresso. As soldas mais comuns são aquelas de estanho de 1
mm, como mostrada na Figura 1.

Figura 1 - Solda em embalagem em formato de tubo, com 4 metros de fio.

10
1.4 - Ferro de soldar

Outro acessório obrigatório é o ferro de soldar (mostrado na figura 2).


Os ferros de soldar mais comuns são aqueles de potência entre 30 e 40
Watts.

Figura 2 – Ferro de soldar e suporte.

1.5 - Sugador de solda

Quando você precisar remover soldas frias ou excessos de solda num


circuito, você deve utilizar o sugador (Figura 3). Posicione o ferro de soldar
e o sugador próximos à solda a ser removida. Após esta derreter, dispare o
sugador e jogue fora o conteúdo removido.

Figura 3 - Sugador de solda.

11
1.6 - Placa de circuito impresso

A mais comum placa de circuito impresso (Figura 4) utilizada pelos


hobbystas é feita de fenolite ou fibra de vidro e tem a superfície coberta com
uma ou duas faces de fina película de cobre ou níquel. A placa tem a função
de manter os componentes eletrônicos conectados em série ou paralelo,
ativando-os através da passagem da corrente elétrica.

Figura 4 - Placa de Fenolite.

1.7 - Percloreto de ferro e caneta para desenho de circuitos

O percloreto de ferro (Figura 5) é um ácido utilizado para corroer a


fina camada de cobre das placas de circuito impresso. Para este processo
deve ser utilizada também uma caneta (Figura 6) com tinta especial para
desenhar as trilhas do circuito eletrônico, que não é corroída facilmente pelo
percloreto de ferro.

Figura 5 - Percloreto de Ferro.

12
Figura 6 - Caneta para desenhar trilhas.

Para iniciar a corrosão de uma placa de fenolite, deve-se primeiro


limpá-la com um pano úmido e depois passar uma palha de aço sobre a
superfície metálica.

Depois se deve desenhar o circuito com a caneta especial e fazer os


furos na placa com uma mini-furadeira elétrica ou um furador manual
(Figura 7), abrir o percloreto de ferro e derramar o líquido num vasilhame de
plástico (para isso, pode-se utilizar os recipientes de sorvete de 2 litros).

Figura 7 - Furador manual.

13
ATENÇÃO
Cuidado com o manuseio do percloreto, pois além de ser tóxico, ele
mancha permanentemente roupas, pisos e azulejos e não sai nem
com reza brava! Faça todos os procedimentos num local isolado e
longe de crianças e animais. Após o uso, guarde-o em local seguro. O
produto pode ser reutilizado diversas vezes.

Mexa um pouco o liquido com um pedaço de madeira. Coloque a


placa de circuito já desenhada e devidamente furada imersa no percloreto.
Aguarde de 5 a 10 minutos e retire a placa.

Você verá que a corrosão ainda não está totalmente concluída, pois
existem algumas partes de cobre cor-de-rosa ainda na placa.

Mova a placa pra frente e para trás dentro do percloreto até que o
excesso de cobre desapareça, ficando apenas as trilhas que foram
desenhadas com a caneta especial. Finalmente, remova a tinta preta com
um algodão molhado com acetona.

1.8 - Como fazer uma solda bem feita?

Uma boa solda deve ser feita com cuidado e algum treino. A solda
deve ser fina e de boa qualidade com uma percentagem alta de estanho e
de antioxidante (que serve para remover a sujeira ou oxidação dos pontos
de solda). Treine a soldagem com as instruções a seguir:

. Faça-a em cima de uma mesa, sentado confortavelmente e sob bastante


iluminação.

. A superfície da placa (item 1.6) e os componentes devem estar bem


limpos. Se houver algum resíduo de solda nos componentes usados,
remova-os com uma espátula ou canivete.

. Depois de o ferro ter esquentado o suficiente para derreter a solda,


encoste a ponta deste entre a placa, o componente e a solda, exatamente
no ponto onde deve ser feita a soldagem.
. A solda deve ficar com aspecto liso e brilhante, sem a formação de
bolinhas (o que significa que a solda não aderiu completamente a placa e
então causará mal contato - a chamada “solda fria”). Geralmente esta é a

14
principal causa do mau funcionamento dos circuitos. Para resolver o
problema, remova a solda com o sugador (Figura 3) e faça novamente a
soldagem.

. Fique atento na hora de soldar para que não caia nenhum pingo de solda
em outra parte da placa e cuidado especial na manipulação do ferro para
que não venha a sofrer queimaduras. Use um suporte para quando não
estiver usando o ferro.

1.9 - Os componentes eletrônicos

Agora vamos abordar o funcionamento básico dos componentes


eletrônicos que farão parte do nosso projeto de automação. Não nos
aprofundaremos na matéria, apenas daremos uma pequena noção para
acabamento do nosso projeto.

1.10 - Os componentes que utilizaremos são os seguintes:

1.10.1 - Resistor

O resistor (figura 8) é um componente eletrônico que tem a função de


oferecer resistência à passagem de uma corrente elétrica. Sua composição
física é geralmente de silício. A unidade de cálculo da resistência elétrica é
o Ohm (pronuncia-se ômi), símbolo Ω.

Figura 8 – Resistores Fixo e Variável.

Existem dois tipos de resistores: de valor fixo e variável. Os resistores


fixos têm um código de cores para identificação do valor. Não iremos
abordar os códigos neste livro. Os resistores de resistência variável são
chamados também de potenciômetros. Uma versão deles em miniatura são
os Trimpots (Figura 9).

15
Figura 9 – Trimpot mais comum.

1.10.2 - Cristais

São componentes que tem um cristal interno que oscila a certa


freqüência quando estimulados por uma corrente elétrica (Figura 10). São
muito utilizados em conjunto com os micro-controladores. A unidade
representativa é o Hertz (HZ) e geralmente o valor em Hz está marcado no
topo ou no corpo do cristal.

Figura 10 – Cristais.

1.10.3 - Capacitores cerâmicos

É um componente que armazena energia num campo elétrico.


Funciona analogicamente a uma bateria, armazenando e liberando energia.
A unidade representativa é o Farad (F) e o valor está registrado no corpo do
capacitor (Figura 11).

Figura 11 – Capacitor Cerâmico.

16
1.10.4 - Circuito Integrado L293D

O L293D (Figura 12) tem a função de controlar o movimento de dois


motores independentemente, em ambas as direções. Mais adiante, na
montagem da placa principal, iremos falar mais detalhadamente sobre este
componente.

Figura 12 – L293D.

1.10.5 - Multímetro

Os multímetros servem para medir tensões e correntes e identificar


curtos e falhas nas trilhas dos circuitos impressos. Existem dois tipos:
Digitais e Analógicos (Figuras 13 e 14). Os digitais são os mais fáceis de
trabalhar.

Figura 13 – Multímetro digital mais comum.

17
Figura 14 – Multímetros digital e analógico.

Para conferir a resistência de resistores, basta colocar as duas pontas


do multímetro nas duas extremidades do resistor e girar o controle do
multímetro para o símbolo Ω (ohm). Você verá que existe uma faixa
numérica de 2000 até 200k. Essa faixa é o valor de resistência. Se você não
souber o valor do resistor, mude-o o controle para o valor de 200 e veja se
aparece no visor um valor menor. Se aparecer o número zero ou -1, mude o
valor de resistência para 2000. Se ainda assim continuar o zero ou -1, mude
para 20k e assim por diante.

O valor correto será sempre aquele que for maior que zero e menor
que o número da faixa. Por exemplo, se você posicionou o multímetro em
20k e no visor apareceu 9.5, significa que o resistor tem uma resistência de
9.5kΩ.

Para medir uma tensão, mude o controle do multímetro para


(tensão em corrente contínua). Aqui também existe um intervalo numérico
que vai de 200m volts a 1000 volts. Geralmente nos projetos pequenos de
eletronica, a faixa de tensão varia de 4 a 32 volts. Então se for usar um
fonte de 5 ou 12V, deixe o multímetro na posição 20 V.

18
ATENÇÃO
Nunca meça tensões de corrente alternada posicionando o multímetro
em corrente continua. Isso pode danificar o aparelho. Corrente
contínua e corrente alternada têm tipos de medições diferentes. Como
não vamos trabalhar com alternada, não vamos explicar os seus
fundamentos.

19
Capítulo 2 – Mecânica

20
2.1 - Introdução

A Mecânica é a parte da física que estuda o movimento, as variações


de energia, velocidade e as forças que atuam sobre um corpo. Vamos
utilizar as técnicas da ciência mecânica para construir a estrutura do robô,
aumentar o torque e diminuir a velocidade dos motores.

2.2 - Modelix

Modelix (Figura 15) é um conjunto de peças metálicas para


montagens de estruturas mecânicas, fabricado pelo Grupo Leomar
Equipamentos Náuticos, líder brasileiro de equipamentos e roupas para
mergulho. Essa linha atende a muitos setores e projetos, desde brinquedos
educativos e lúdicos até robótica.

Modelix é a solução perfeita para concretizar projetos de automação,


pois substitui os materiais alternativos, proporcionando um excelente
resultado final, com baixo custo e possui uma infinidade de peças que
podem ser combinadas entre si, criando quase tudo o que a imaginação
desejar.

No nosso projeto, iremos utilizar o Modelix para a montagem do corpo


do robô e para fornecer toda a sua mobilidade. Mais adiante iremos explicar
passo-a-passo como montar uma estrutura estável, segura e flexível.

Figura 15 – Um box do Modelix.

21
A Figura 16 mostra algumas peças de alumínio do kit Modelix.

Figura 16 – Peças do Modelix.

2.3 - Motor e caixa de redução

Os motores elétricos de corrente contínua são os mais comuns que


existem. Eles rodam em direção horária e anti-horária, porém não são
precisos, isto é, não há um indicador mostrando em qual posição o eixo se
encontra. Para sanar esta deficiência, nosso projeto irá utilizar recursos de
programação, que serão abordados mais adiante.

A Caixa de redução é um dispositivo mecânico que reduz a


velocidade e aumenta a força (torque) de um motor. Uma caixa de redução
é formada por um motor ligado a uma série de engrenagens, como mostra a
Figura 17.

Figura 17 – Caixa de redução e motor CC.

22
No nosso projeto, vamos usar duas caixas de redução ligadas a dois
motores CC. Quando abordarmos a montagem da estrutura mecânica,
falaremos mais sobre caixas de redução e onde podemos encontrá-las em
sucatas.

2.4 - Mini Retífica

Nas montagens mecânicas, precisaremos de ferramentas especificas


para moldagem, corte e montagem de materiais, sejam eles plásticos ou
metais. Adquirir uma mini-retífica de boa qualidade (Figura 18) é essencial.

Figura 18 – Mini-retifica de alta potência.

Existem boas marcas de retífica no mercado, como Bosch e Mallory.


Não adquiria aparelhos de baixa potência, que não têm força para cortar
sequer o alumínio. Fuja de aparelhos com menos de 135 Watts.

ATENÇÃO
Um ponto importante que não deve ser esquecido na hora da compra
é verificar a quantidade de acessórios que acompanham os aparelhos.
Muitas mini-retíficas de boa qualidade vêm acompanhadas de poucos
acessórios, então é importante também comprar uma maleta de
acessórios, principalmente de corte e furo, caso sua retífica venha
com poucas unidades.

23
2.5 - Outros acessórios

As ferramentas mais comuns para uma bancada de mecânica são as


seguintes: Alicate de corte, alicate de ponta, chaves de fenda, chaves
“Philips” de vários tamanhos e cola potente (não use “Super Bonder”). Com
esse conjunto de acessórios e ferramentas você estará apto a desenvolver
projetos mecânicos como os abordados neste livro.

24
Capítulo 3 - PIC 18F452 e LCD Gráfico

25
3.1 - PIC 18F452

O PIC 18F452 (Figura 19 e 20) é um micro-controlador da família 18F


da empresa Microchip. É um micro-controlador de 8 bits, com 33 pinos de
entrada/saída, função PWM (controle de motor CC), 2 pinos para
comunicação serial, pinos com funções Analógico/Digital, 32 kbytes de
memória para gravação de programas e mais uma série de outras funções.
O 18F452 suporta cristais de até 20 Mhz, o que é mais que suficiente para
pequenos projetos. No nosso projeto, usaremos um cristal de 8 Mhz, que já
é o bastante para controlar com rapidez o robô.

Figura 19 – PIC 18F452.

Figura 20 – Descrição das funcionalidades de cada pino do PIC.

A conceito de programação de um PIC é razoavelmente simples. Nas


mais básicas funções, determinamos que um pino seja de entrada ou saída.
Se for entrada, temos que verificar o seu valor (zero ou um). Se estiver com
o valor zero, estará desligado, caso contrario estará ligado. Por exemplo,
conectamos uma chave liga/desliga ao pino B0 do PIC. Quando acionamos
manualmente a chave, podemos verificar através de um multímetro ligado

26
ao pino B0 que este estará registrando o valor 1, caso contrário, se
soltarmos a chave o valor será zero.

Por outro lado, podemos definir o pino B0 do PIC como pino de saída.
Se ligarmos um Led ao B0 e através de um programa, definirmos o pino
com o valor 1, o Led acenderá. Se definirmos B0 com o valor zero, o Led
apagará.

Estas são as operações mais básicas que podemos realizar com um


PIC. Se você for um programador experiente, verá que o PIC pode ser
programado com recursos mais avançados, pois o micro-controlador nada
mais é do que um pequeno computador com todos os recursos de
processamento, atentando é claro, para as proporcionalidades entre um e
outro.

3.2 - Gravando um programa no PIC

Para gravar um programa no PIC, os passos são os seguintes:


a) Escrever um programa utilizando uma linguagem de programação para
PICs, como por exemplo, o MikroBasic e depois compilá-lo.

b) Utilizar um software que transfere o programa para o PIC em conjunto


com um Dispositivo Programador que faz a gravação física do programa no
PIC.

O Dispositivo Programador (Figura 21) é um aparelho eletrônico que


tem a função de gravar um programa fisicamente no PIC. Ele é ligado ao
computador através da porta serial ou USB. Existem vários modelos no
mercado, porém aconselhamos a comprar um que seja compatível com um
número maior de modelos de PIC e que seja acessível através da porta
USB. Procure na internet por programadores de PIC compatíveis com o
Windows 7 - 32 bits.

27
Figura 21 – Modelo de Dispositivo Programador de PIC.

3.3 - Compilando e gravando o programa no PIC

Além do Dispositivo Programador, você vai precisar de um programa


que faça a gravação do programa no PIC. Em nossos testes, utilizamos o
programa WinPic800 (Figura 22). Para baixá-lo, vá ao site
http://www.winpic800.com/ e na opção Download. Após baixar o arquivo,
descompacte-o e salve-o em uma pasta. Não é necessário executar um
programa de instalação. Após descompactá-lo, execute o programa
WinPic800.exe. Irá aparecer a tela da figura 22.

Figura 22 – WinPic800.

28
O WinPic800 tem a função de carregar um arquivo com extensão
HEX (HEX é o programa compilado gerado pelo Mikrobasic) e gravar no
PIC. Depois de conectar o PIC ao Dispositivo Programador (Figura 21), vá
ao menu Arquivo/Abrir e carregue o arquivo HEX que você compilou no
MikroBasic.

No canto superior direito da tela do WinPic800, existe um campo para


informar o modelo do PIC. Informe “18F452-4539” (modelo do PIC que
utilizaremos neste projeto). Para gravar o programa no PIC, clique no botão
“Programar Tudo” .

IMPORTANTE: CADA DISPOSITIVO PROGRAMADOR TEM UM


PROGRAMA ESPECÍFICO PARA SUA UTILIZAÇÃO. O WINPIC800
PODE NÃO SER IDEAL PARA TODOS OS DISPOSITIVOS. PEÇA MAIS
INFORMAÇÕES AO SEU FORNECEDOR.

3.4 - LCD Gráfico – Informações gerais

Os LCDs Gráficos (Figura 23) são dispositivos que mostram


informações escritas ou desenhadas numa tela de Cristal Líquido. Eles têm
variados tamanhos e larguras, mas os mais comuns são os de 128 colunas
X 64 linhas.

Figura 23 – LCD Gráfico (frente e verso).

Para que as informações apareçam na tela, o LCD Gráfico necessita


de controlador que recebe uma instrução de um micro-controlador (um PIC,
por exemplo) e preenche a tela de cristal líquido com gráficos e caracteres.
Sem esse controlador, o LCD é um dispositivo inútil.

29
Hoje, não existe uma padronização em relação aos controladores de
LCD, mas o mais comum é o controlador KS0108B. Para nosso projeto,
aconselhamos o uso do LCD tipo 12864G. Este possui o controlador
KS0108B e foi o LCD que melhor se adaptou aos testes no
desenvolvimento do projeto.

Atenção
Quando for adquirir um LCD Gráfico, verifique no Datasheet (manual
de especificações técnicas) se os pinos do LCD estão na seguinte
configuração:
N. 1 2 3 4 5 6 7 8 9 10
PINO
SINAL VSS VDD V0 RS R/W E DB0 DB1 DB2 DB3
N. 11 12 13 14 15 16 17 18 19 20
PINO
SINAL DB4 DB5 DB6 DB7 CS1 RST VEE CS2 NC NC

O DataSheet do LCD que usamos no projeto está no site


http://tech.groups.yahoo.com/group/build_smart_robot/files/LCD
Grafico datasheet.rar. Antes de sair para comprar o LCD, imprima-o e leve
junto com você.

30
Capítulo 4 – Projetando o circuito eletrônico

31
4.1 - Introdução

Neste capítulo, vamos iniciar a construção eletrônica do nosso robô


inteligente. Vamos mostrar passo-a-passo como construir a placa de
circuitos e dar outras informações sobre a eletrônica aplicada ao nosso
projeto. Será mais produtivo se você der uma revisada no capítulo 1.

4.2 - Construindo o circuito

Para começar, limpe uma placa virgem de fenolite e desenhe o


circuito da Figura 24 com a caneta especial. Se você nunca criou um
circuito eletrônico, lá vai uma dica importante: para desenhar os pinos do
PIC, posicione e segure firme um PIC na parte metálica da placa e marque
com a caneta a posição de todos os pinos.

Figura 24 – Frente e verso do circuito.

32
A Figura 24 mostra como o circuito eletrônico deve ficar num lado da
placa e a posição dos componentes no outro lado. O lado direito da figura
mostra a ligação dos componentes e do LCD. Tome cuidado para não
inverter a posição dos fios no LCD.

Alguns LCDs têm na parte esquerda dois pinos com as


denominações K e A escritos de ponta cabeça. Preste atenção quando ligar
esses pinos nos pólos positivo e negativo da placa de circuitos.

Fique atento: A parte traseira do LCD está impresso o número 1


referente ao primeiro pino.

É bom adquirir o hábito de usar suportes para PIC ao invés de soldá-


lo diretamente na placa de circuito, pois se depois você quiser alterar o
programa ou se o PIC estiver danificado, pode-se tirar o PIC do circuito
facilmente, refazer a programação e colocá-lo de volta na placa ou trocá-lo
por outro.

4.3 - Lista de componentes

Os componentes que utilizaremos para montar a placa de circuito do nosso


projeto são os seguintes:

. 20 conectores fêmea e 20 conectores macho do tipo pino para ligar o LCD


à placa (ver figura 25)

. 1 PIC 18F452

. 1 Suporte para PIC de 40 vias

. 7 Resistores 10 K Ohms

. 2 Capacitores Cerâmicos de 33 micro F

. 1 Cristal de 8 Mhz

. 1 Circuito integrado L293D de 20 pinos

. Fios de diversas cores

. 2 Motores CC (M1 e M2) com redutores de velocidade (veja mais sobre


redutores de velocidade no Capitulo 5 - Montando a estrutura mecânica)

33
. 1 Trimpot de 10 K Ohms (modelo semelhante ao da Figura 9 do Capítulo
1)

. 1 fonte de 5V

ATENÇÃO
Muito cuidado ao ligar o trimpot, como está mostrado ao lado direito
da Figura 24: Deve-se soldar o trimpot com a frente virada para você,
identificar os 3 pinos e soldá-los na placa, na posição mostrada na
figura 24. O trimpot é muito importante para o projeto, pois é ele quem
fornece o contraste da saída de sinal do LCD. Se a ligação for feita de
modo errado, o LCD não funcionará. Deve-se comprar o trimpot
semelhante ao modelo da Figura 9. Foram testados outros modelos
mas não funcionaram adequadamente.

4.4 - Ligar os pontos do circuito

Depois de concluída confecção do circuito na placa de fenolite,


analise novamente a Figura 24. Você pode ver que alguns locais do circuito
são numerados de 1 a 13 e outros pontos tem indicadores alfanuméricos
(por exemplo: S1, S2, M2, etc.).

Os indicadores de 1 a 13 deverão ser ligados por fios com cada ponto


de numeração equivalente, isto é, ligue 1 com 1, 2 com 2 e assim por
diante. Pois bem, agora ligue os pontos de números 1, 2, 3, 4, 5, 6, 7, 8, 9,
10, 11, 12 e 13.

Fazendo um breve resumo, os pontos S1 e S2 são dois sensores que


registram quando os motores M1 e M2 estão posicionados em seus pontos
iniciais. S3 é o pólo positivo da corrente elétrica (USB) que será colocado na
carcaça metálica do robô. Como se fosse uma chave liga/desliga, S1 é um
pólo da chave e S3 é o outro pólo. Quando o motor está posicionado no
ponto inicial, S1 e S3 agem como uma chave acionada. Este entendimento
é muito importante na montagem do robô.

Os pontos U+, U-, RX e TX são ligados aos 4 fios do cabo USB ligado
ao computador (depois veja o capítulo 8 sobre os pólos da porta USB). Os
dois pontos chamados M1 são os dois pólos do motor 1 e M2 são os dois
pólos do motor 2. Os pontos LCD + e LCD – do circuito são ligados aos

34
pontos LCD + e LCD - do LCD Gráfico.

Os dois pólos referentes à R1, R2, R3, R4, R5, R6 e R7 devem ser
ligados os dois pólos dos resistores de 10 K. Os dois pólos referentes ao
ponto A devem ser ligados ao cristal de 8 MHZ e os pontos B serão ligados
aos capacitores cerâmicos de 33 micro F.

Finalmente, os ponto + (positivo) e – (negativo) devem ser ligados a


uma fonte 5 Volts (use o multímetro para saber qual fio da fonte possui o
pólo positivo e qual possui o pólo negativo). Tudo isso será abordado com
mais detalhes na montagem mecânica.

Três questões importantes que devem ser lembradas:

. M1 é o motor que movimenta horizontalmente toda a estrutura e M2 é o


motor que movimenta verticalmente a cabeça do robô.

. Não se deve inverter a posição dos pinos 10, 11, 12 e 13 em relação ao


L293D. A inversão pode causar a rotação errada do motor, isto é, quando o
robô tiver que se movimentar para a direita, ele mudará de direção, indo à
esquerda e ao invés de movimentar a cabeça para baixo, ele movimentará
para cima e vice-versa.

. O LCD Gráfico só ira funcionar adequadamente se os pinos K e A


estiverem ligados na corrente elétrica (pontos Lcd+ e Lcd-), como mostra o
circuito (Figura 24).

Na parte final da montagem, você deve conectar a placa de circuito


ao LCD Gráfico. Solde os conectores tipo pino macho no LCD Gráfico e os
conectores tipo pino fêmea na placa de circuitos, conforme a Figura 25:

35
Figura 25 - Conectores fêmea e macho do tipo pino.

36
Capítulo 5 – Montando a estrutura mecânica do
robô

37
5.1 - Introdução
Como foi visto no capitulo 2, iremos utilizar as peças do Modelix para
montar o corpo do robô. O kit Modelix contém peças de alumínio,
parafusos, porcas, eixos de metal, engrenagens e peças de borracha, entre
outros.

5.2 - Caixa de redução

Agora vamos mostrar como anexar os motores na estrutura mecânica


do robô. No nosso projeto, vamos precisar de dois motores com caixas de
redução.

Figura 26 – Caixas de redução de vídeo-cassete, leitor de fitas magnéticas e aparelho de CD


doméstico.

Como você já sabe, usaremos duas caixas de redução. Uma delas


pode ser extraída de um vídeo cassete usado (figura 26, primeira caixa) e a
segunda, extraída de um aparelho de CD automotivo (figura 26, terceira
caixa). Se você não encontrar aparelhos semelhantes use a sua criatividade
para adaptar suas próprias opções.

5.3 - Montagem do corpo robótico

O corpo robótico será construído com peças do Modelix, já visto no


Capítulo 2. Siga as instruções contidas nas figuras abaixo para montar o
corpo do robô:

38
A figura abaixo mostra a visão frontal do LCD Grafico. Atenção para a
quantidade de furos das peças Modelix. Se precisar, faça pequenas
dobraduras nas peças para ficarem parecidas com as figuras.

Faça as conexões das peças Modelix com parafusos.

39
40
A Figura abaixo mostra a estrutura com o LCD e a caixa de redução do
motor horizontal.

41
Conexão do motor na estrutura.

42
Abaixo são mostradas as visões frontal e lateral.

Abaixo tem inicio a montagem lateral.

43
Conectando as partes da imagem anterior

Repare na figura abaixo à direita. É um motor e um redutor com três


engrenagens, como foi visto na figura 26. Esta caixa de redução irá
movimentar a cabeça do robô para cima e para baixo (Motor Vertical).

A figura a seguir mostra como será montada a parte da mecânica que


irá movimentar a cabeça do robô para cima e para baixo. Veja que
temos a caixa de redução, parafusos com pontas e dois parafusos
Modelix grandes, porcas, borrachas e uma peça de plástico verde com
dois furos. Agora pegue a mini retífica e lixe a ponta inferior da peça
modelix de 5 furos (veja a indicação abaixo “Lixe Aqui”).

44
A peça de plástico verde deve ser criada por você. Corte e faça dois
furos num pedaço de plástico resistente da mesma largura de uma
peça de alumínio do Modelix. Prenda dois parafusos na engrenagem
mais abaixo da caixa de redução, na peça de plástico e na peça do
Modelix, como mostrado na figura abaixo.

45
Este deve ser o resultado final desta etapa.

Atenção! Os dois parafusos com pontas finas devem ser parafusados


deixando uma distância entre a ponta (parafusada na engrenagem) e a
cabeça do parafuso (mais próximo ao plástico verde e a peça Modelix),
como mostrado na imagem abaixo. Isto deve ser assim para que o
braço fique corretamente alinhado à estrutura que contém o LCD.

46
Agora vamos conectar a estrutura principal com a caixa de redução,
conforme figura abaixo. O motor tem que ser parafusado na estrutura e
a peça de Modelix 1 deve ser parafusado na peça de Modelix 2, no
segundo buraco. Lembre-se de que deve haver uma folga neste buraco
para que o robô movimente a cabeça para frente e para trás. Por isso,
deve-se usar um parafuso Modelix grande com duas borrachas nas
extremidades do parafuso. Não esqueça de colocar uma porca nesse
parafuso.

47
Abaixo tem o resultado final da montagem anterior. Preste muita
atenção nas conexões em buracos corretos das peças Modelix.

Depois da montagem acima, deve-ser colocar finalmente, as duas


últimas peças Modelix na estrutura.

48
As duas últimas peças serão parafusadas em dois lugares distintos da
estrutura: No topo (EXTREMIDADE SUPERIOR) e mais abaixo
(EXTREMIDADE INFERIOR). Elas terão a função de bloquear os
movimentos da palheta do motor vertical quando estiver posicionado
na extremidade superior e inferior, como mostra a imagem abaixo:

Este ponto é muito importante: Como você deve se lembrar, na Figura


24, você pode ver que o ponto S1 envia informações ao PIC e detecta
quando o motor vertical está posicionado nos pontos inicial e final.

Então você deve ligar um fio do pino S3 (do circuito) nas peças
Modelix da Extremidade Inferior e Superior e depois conecte um fio do
pino S1 à peça Modelix parafusada à engrenagem da caixa de redução
do Motor Vertical.

49
Quando a peça Modelix ligada à engrenagem do Motor Vertical
encostar-se à Extremidade Inferior ou Superior, o PIC receberá a
informação de que o motor vertical está posicionado em cima ou
embaixo.

Você pode perguntar: Mas como o PIC saberá quando o motor estiver
em cima ou embaixo, se existe apenas um sensor do ponto S3 para as
duas Extremidades?

Respondemos: O programa que foi desenvolvido para rodar no PIC vai


fazer o controle de onde está posicionado o motor (Vamos falar sobre
este programa mais adiante).

Para terminar a montagem mecânica, vamos montar a estrutura que


vai ser ligada ao Motor Horizontal e ao pino S2 do circuito. A figura
abaixo representa o motor horizontal que já apresentamos na Figura
26.

50
Coloque uma das peças do Modelix embaixo do suporte do motor.

51
Conforme a figura abaixo, coloque a outra peça do Modelix por cima
da primeira e parafuse nos locais indicados.

Finalmente deve-se ligar um fio do ponto S2 à estrutura montada na


base do suporte do Motor Horizontal e um fio do ponto S3 à estrutura
principal do robô.

Agora explicaremos como funcionará toda a parte mecânico-


eletrônico: A palheta horizontal está ligada ao motor horizontal.
Quando o motor horizontal se move, a palheta move-se para a direita
ou para a esquerda. O sensor do ponto S2 detecta quando a palheta
toca na estrutura do robô (que está ligado ao sensor S3) e então o PIC
é informado onde o motor horizontal está posicionado.

52
A figura abaixo mostra a visão lateral do robô com toda a estrutura
montada.

53
Capítulo 6 – Programação do recurso de voz

54
6.1 - Introdução

No nosso projeto, trabalharemos com três linguagens de


programação: Visual C++, Visual C# e Mikrobasic.

O Visual C++ (pronuncia-se Visual C Mais Mais) tem a função de


captar movimentos através de uma câmera e enviar as coordenadas para o
micro-controlador. O programa em Mikrobasic terá as funções de receber as
coordenadas e transformá-las em movimentos dos motores, monitorar os
sensores e controlar o LCD Gráfico (falaremos sobre o Mikrobasic mais
adiante).

O Visual C# (pronuncia-se Visual C Sharp) terá a função de receber


os comandos de voz do usuário e também a função de responder através
de voz sintetizada, fazendo com que robô interaja vocalmente.

Vamos falar sobre um ponto importante na programação do micro-


controlador. É fato que os dois motores CC que estamos utilizando para
mover o robô não têm um sensor próprio ou coisa parecida que informe ao
micro-controlador qual é a posição atual do eixo de cada motor.

Diferente dos servos motores (Figura 27), que possuem um


potenciômetro ligado ao eixo do motor que informa a posição atual, os
motores CC (Figura 28) não tem esse recurso. Por isso, temos que resolver
esse problema através da criação de um algoritmo de programação. Mas
não se preocupe, o algoritmo já está pronto e você apenas vai ter que
aprender como isso foi feito.

Em suma, o robô terá a capacidade de falar, ouvir, conversar,


identificar e acompanhar movimentos e simular emoções.

Figura 27 – Servo motor mais comum.

55
Figura 28 – Motor CC.

6.2 - Instalação das linguagens de programação Microsoft Visual C++


2010 Express Edition e Microsoft Visual C# 2010 Express Edition

O Visual C++ Express 2010 é um ambiente de programação para a


linguagem C e que faz parte do pacote Visual Studio Express 2010. A
fabricante, Microsoft Corporation, disponibiliza uma versão grátis e a
usaremos pelos recursos de baixo nível que ela possui e a facilidade de
integração com as bibliotecas de visão artificial.

O Visual C# Express 2010 é uma linguagem de programação de alto


nível. Ela também faz parte do pacote Visual Studio Express 2010. No
nosso projeto, o Visual C# terá a função de controlar os recursos de voz:
fala, conversação e comandos vocais. E ele também é de graça!

Vamos agora iniciar a instalação das linguagens. Vá ao site


http://tech.groups.yahoo.com/group/build_smart_robot/files/. Salve o
arquivo “vc_web.exe” em qualquer pasta (anote o nome da pasta que você
salvou para que possa instalá-lo no próximo passo).

Para instalar o Visual C++, você vai precisa estar conectado na


Internet!

56
Após o download, vá à pasta onde você salvou o programa e clique
duas vezes no ícone “vc_web.exe”. Vai aparecer a tela abaixo. Clique em
“Next >”.

57
Na próxima tela, marque a opção “I have read and accept the licence
terms” e clique em “Next >”.

Na próxima tela, desmarque as opções abaixo e clique em “Next >”.

58
Na próxima tela, clique em “Install >”.

As próximas telas mostram o andamento da instalação. Aguarde a


finalização.

59
A próxima tela solicita que o computador seja reiniciado para completar a
instalação. Clique em “Restart Now”.

60
Após o computador reiniciar, a próxima tela irá surgir. Ela mostra o
progresso da instalação. Aguarde a finalização.

A próxima tela indica o fim da instalação. Clique em “Exit”.

61
A próxima tela solicita que o computador seja reiniciado para completar a
instalação. Clique em “Restart Now”. Pronto! O Visual C++ está
instalado.

Agora vá ao site
http://tech.groups.yahoo.com/group/build_smart_robot/files/ e salve o
arquivo “vcs_web.exe” em qualquer pasta (anote o nome da pasta onde
você salvou o arquivo para que possa instalá-lo no próximo passo).

Para instalar o Visual C#, você precisa estar conectado na


Internet!

Após o Download, vá à pasta onde você salvou o programa e clique


duas vezes no ícone “vcs_web.exe”. Vai aparecer a tela abaixo. Clique em
“Next >”.

62
Na próxima tela, marque a opção “I have read and accept the licence
terms” e clique em “Next >”.

Na próxima tela, desmarque as opções abaixo e clique em “Next >”.

63
Na próxima tela, clique em “Install >”.

As próximas telas mostram o andamento da instalação. Aguarde a


finalização.

64
Na próxima tela, clique em “Exit”. Pronto! o Visual C# está instalado.

65
6.3 – Registrando o Visual C#

Para usar indefinidamente o Visual C# 2010, você deve registrá-lo. É


grátis! Conecte-se na Internet e abra o Visual C#. Vá ao menu Help ->
Register Product. A tela abaixo irá aparecer. Clique em Obtain a
registration key online.

Irá aparecer o site da Microsoft. Preencha os campos Email address e


Password com seu usuário e senha do MSN ou HOTMAIL e aperte o botão
“Sign In”. Se não possuir registro no MSN, crie um e depois volte a esta
etapa novamente.

66
A seguir, ainda no site, clique em “Continue”.

Irá aparecer uma página com o numero do registro. Copie o número


marcado em vermelho (a marca vermelha é nossa).

67
Finalmente, volte ao Visual C#. Preencha o campo Registration key na tela
abaixo e clique em “Register Now”. Se aparecer uma mensagem de alerta
com os dizeres “Deseja permitir que este programa atualize o seu
computador?”, clique em “SIM”.

Pronto! o Visual C# está registrado!

6.4 – Registrando o Visual C++

Agora vamos registrar o Visual C++. Conecte-se à Internet e abra o


Visual C++. Vá ao menu Help -> Register Product. A tela abaixo irá
aparecer. Clique em “Obtain a registration key online”.

68
Irá aparecer o site da Microsoft. Preencha os campos Email address e
Password com seu usuário e senha do MSN ou HOTMAIL e aperte o botão
“Sign In”

A seguir, ainda no site, clique em “Continue”.

69
Irá aparecer uma página com o numero do registro. Anote o número
marcado em vermelho (a marca vermelha é nossa).

Finalmente, volte ao Visual C++. Preencha o campo Registration key


na tela abaixo com o número anotado anteriormente e clique em “Register
Now”. Se aparecer uma mensagem de alerta com os dizeres “Deseja
permitir que este programa atualize o seu computador?”, clique em
“SIM”.

Pronto! o Visual C++ está registrado!

70
6.5 - Biblioteca de voz

O Microsoft Speech API é uma biblioteca de processamento de voz.


Ela permite que o computador reconheça comandos e voz e tenha a
capacidade de transformar textos em voz sintetizada.

Um dos grandes entraves deste software é que ele entende apenas a


língua inglesa. Isto significa que para ele entender uma palavra em
português, é necessário pronunciá-la com sotaque inglês. Podemos
amenizar o problema se na nossa lista de comandos não houver palavras
com sonoridades semelhantes, por exemplo, “porta” e “corta”. Neste caso,
ele poderá se confundir.

Mas podemos garantir que não haverá grandes contratempos em


decorrência disso. Os nossos testes tiveram razoável sucesso na hora de
dar os comandos vocais ao robô na língua portuguesa.

Apesar dos testes que realizamos em língua portuguesa, este


projeto foi feito inteiramente na língua inglesa, para maior eficiência.

Se em nos nossos testes, os comandos vocais em português não


apresentaram grandes revezes, na conversação a situação é um pouco
diferente. As frases que você escolher para uma conversa com o robô
devem ser bastante distintas no quesito sonoridade, isto é, se você quiser
criar frases para estabelecer uma conversação com o robô, use-as com
sonoridades bastante diferentes entre si. Exemplifico: “Como vai você?” e
“Aonde vai você?” são muito parecidas. Evite usá-las nos seus próprios
projetos.

Importante: Como dissemos antes, quando for dar os comandos de


voz ou estabelecer uma conversa em português, procure pronunciar
as palavras com sotaque inglês, por exemplo, pronunciando o R do
mesmo modo que pronunciam os nativos do interior de São Paulo. Se
ainda não sabe, é o famoso “R do sotaque caipira”.

O Microsoft Speech também tem a capacidade de “falar”, isto é, ele lê


um texto e fala com voz sintetizada. Hoje, com o avanço da tecnologia, as
vozes sintetizadas são bastante reais, inclusive conseguem até cantar.

71
Porém é difícil entender o que o Microsoft Speech fala quando as
frases são ditas em português, porque ele utiliza a voz padrão do Windows
7 e essa voz é baseada no sotaque inglês. Então nós precisaremos incluir
algumas outras vozes que falem com sotaque português, para que você
possa utilizar nos seus futuros projetos.

Para que o recurso de voz funcione, é necessário possuir o recurso de


Fala do Windows 7. Vá ao Painel de Controle e clique no ícone
“Reconhecimento de Fala” (Veja a próxima imagem). Se não tiver esse
ícone, instale-o a partir do disco de instalação do Windows 7.

72
Na tela abaixo, clique em Conversão de Texto em Fala.

A próxima tela mostra as propriedades de fala do Windows. Clique


em “Demonstração de voz” para o Windows pronunciar vocalmente o
texto do campo “Usar o seguinte texto para demonstrar a voz”.

73
Mas como você pode reparar, as vozes padrão do Windows são em
inglês e então será necessário instalar vozes com sotaque em português
para que você conheça como usar vozes em português.

No Brasil, foi criada uma voz feminina sintetizada em português muito


utilizada por deficientes visuais em seus computadores, chamada
LianeTTS. É necessário instalá-la. Além disso, deve-se instalar um
sintetizador de voz chamado eSpeak, que faz a configuração da LianeTTS
no programa de falas do Painel de controle do Windows 7.

Mas antes de instalar os pacotes de voz em português, Vamos


instalar o Microsoft Speech, que é a biblioteca de voz que acompanha o
Windows SDK. Vá ao site
http://www.microsoft.com/download/en/details.aspx?id=8279

A seguinte página irá aparecer. Clique no botão “Download” do item


marcado em vermelho (winsdk_web.exe) e salve o arquivo na sua máquina
(anote a pasta onde você irá salvar o arquivo).

74
Após o Download, Siga as instruções abaixo:

a) Vá à pasta onde você salvou o arquivo e clique duas vezes com o botão
direito do mouse sobre winsdk_web.exe e siga as instruções abaixo:

Se aparecer uma mensagem de alerta com os dizeres “Deseja


permitir que este programa atualize o seu computador?”, clique em
“SIM”.

Irá aparecer a tela abaixo. Clique em ”Next >”.

75
Na próxima tela, marque a opção “I agree” e clique em ”Next >”.

Na próxima tela, clique em ”Next >”.

76
Na próxima tela, marque todas as opções do lado esquerdo e clique em
”Next >”.

Na próxima tela, clique em ”Next >”.

77
A próxima tela mostra o progresso da instalação do Windows SDK.
Aguarde!

Na próxima tela, clique em ”Next >”.

78
Se aparecer a próxima tela, clique em ”Ok”.

Se aparecer a próxima tela, clique em ”Exit”.

Pronto! Instalamos o Windows SDK.

79
6.6 - Instalando o pacote de voz em português

Agora vamos instalar o pacote de voz em português. Este recurso


permitirá que qualquer mensagem de texto que aparecer no Windows será
vocalizada por um sintetizador de voz.

OBS: O programa que será instalado alterará o seu Windows. Sempre


que o Windows iniciar, aparecerá uma tela do Mbrola, que é um
programa usado por deficientes visuais para navegar no computador,
isto é, qualquer evento do Windows será informado vocalmente. Você
pode ligar e desligar as vocalizações. Por padrão, elas são
desativadas.

Fica a seu exclusivo critério a instalação deste pacote


Agora siga as instruções abaixo para instalar o Mbrola e a voz LianeTTS:

Baixe os arquivos no site


http://tech.groups.yahoo.com/group/build_smart_robot/files/liane e faça a
descompactação. Depois abra o aplicativo setup_liane.exe. (Referência no
site http://www.serpro.gov.br/servicos/downloads/lianetts/)

Se aparecer uma mensagem de alerta com os dizeres “Deseja permitir


que este programa atualize o seu computador?”, clique em “SIM”.

Vai aparecer a tela abaixo. Clique em “Avançar >”:

80
Escolha uma pasta para instalação e clique em “Avançar >”.

IMPORTANTE: ANOTE A PASTA ONDE VOCÊ ESTÁ INSTALANDO O


LIANETTS.

Irá surgir a tela seguinte. Clique em “Next >”.

81
Na tela seguinte, marque a opção “I accept the agreement” e clique em
“Next >”.

Escolha uma pasta para instalação e clique em “Next >”.

82
Na próxima tela, escolha a opção “Typical Installation” e clique em “Next
>”.

Novamente clique em “Next >”.

83
Agora clique em “Install”.

Na próxima tela, desmarque a opção “Download mbrola databases” e


clique em “Finish”.

84
Em seguida, a tela abaixo aparecerá. Clique em “I agree”.

OBS: Esta tela aparecerá toda vez que você iniciar o Windows. Clique
sempre em “I agree”:

Finalmente, clique no botão “Concluir”, da tela abaixo:

85
Agora precisamos instalar o programa “eSpeak”, que está disponível
no site http://espeak.sourceforge.net/download.html (baixe a versão para
Windows). Este programa habilita as vozes de LianeTTS no recurso de Fala
do Painel de Controle do Windows. Depois de descarregado, descompacte
e clique no ícone setup_espeak.exe.

Aparecerá a tela abaixo. Clique em “Seguinte >”:

Escolha a pasta de instalação do “eSpeak” e clique em “Seguinte >”:

86
Em seguida, aparecerá tela abaixo solicitando que sejam informadas
as vozes que se pretende instalar. Adicione mb-br4, que é a biblioteca de
voz em português.

Clique em “Instalar” na próxima tela:

87
Desmarque a opção “Visualizar Readme.txt” e clique em “Concluir”:

Agora copie o arquivo br4, que está na pasta onde foi instalado o
LianeTTS (C:\winvox\Lianetts) para a pasta de instalação do eSpeak:
(C:\Program Files\eSpeak\espeak-data\mbrola).

Vá ao Painel de controle, programa Reconhecimento de Fala, link


Conversão de Texto em Fala, e em Seleção de Voz, selecione a opção
eSpeak-MB-BR4.

Preencha um texto em português no campo “Usar o seguinte texto


para demonstrar a voz” e clique em “Demonstração de voz”. Se você
ouvir uma voz acelerada, clique novamente e provavelmente você irá ouvir
uma voz feminina normal com sotaque português.

88
ATENÇÃO

Se você ouviu uma voz feminina com sotaque em português, você


configurou com sucesso o recurso de voz. Se não conseguiu ouvir
verifique se você esqueceu algum detalhe nas instruções que foram
passadas. Se ainda assim não obteve sucesso, verifique se o som
está habilitado no seu Windows ou se seu computador está com
algum defeito na placa de som ou nos alto-falantes.

89
6.7 - Programando o reconhecimento de voz sintetizada

Agora vamos analisar o programa de detecção de comandos de voz.


Copie o conteúdo que está em
http://tech.groups.yahoo.com/group/build_smart_robot/files/ListBox.ra
r para o seu computador. Abra o Visual C#, vá ao menu File->Open Project
e abra o projeto copiado para o computador.

Agora aperte a tecla “F5”. Aparecerá a tela da Figura 29. Clique no


botão “Palavras” e uma caixa será preenchida com as palavras que serão
reconhecidas pelo interpretador de voz, no nosso projeto. A detecção de
voz funciona melhor com palavras em inglês, pois o programa utiliza a
biblioteca de voz Microsoft Speech SDK que não têm detecção de voz em
português. Você pode até trocar as palavras para português, mas terá que
pronunciar com sotaque inglês.

Figura 29 – Tela do programa de reconhecimento de voz.

As palavras têm funções específicas para o controle do robô, então


se quiser trocar para palavras em português, saiba a função de cada
palavra-chave:

SERIOUS – Faz o robô ficar com uma cara séria


ANGRY – Faz o robô ficar com uma cara brava
SAD – Faz o robô ficar com uma cara triste
TURNON – Liga o monitor de posições
TURNOFF – Desliga o monitor de posições
RIGHT – Vira a cabeça do robô para a direita
LEFT – Vira a cabeça do robô para a esquerda
GOAHEAD – Posiciona a cabeça do robô para a frente
BACK – Posiciona a cabeça do robô para trás

90
TOMOVE – Move o motor horizontal da cabeça para n posições. Após dar o
comando “mover”, diga um número de “um” a “seis” (ONE to SIX). O robô
irá se mover n passos para a esquerda ou n passos para a direita.
ONE – Move a cabeça horizontalmente uma posição
TWO – Move a cabeça duas posições
THREE – Move a cabeça três posições
FOUR – Move a cabeça quatro posições
FIVE – Move a cabeça cinco posições
SIX – Move a cabeça seis posições

Também podemos inserir frases com perguntas e repostas para


simular uma conversação, como as mostradas abaixo:

HOW ARE YOU? – Tradução: “Como vai você?”


I AM OK – Tradução: “Eu estou bem”
ARE YOU FINE? – Tradução: “Você está bem?”

Agora, mantenha o programa ativo e fale ao microfone cada uma das


palavras que estão na tela. Na medida em que você fala uma palavra, ela é
destacada na lista. Isto é reconhecimento de voz!

Vamos analisar o código do programa. Feche o programa de


reconhecimento de voz, volte ao Visual C# e clique no menu View /
Solution Explorer. Irá aparecer a tela seguinte (Figura 30). Dê duplo click
no item MainForm.cs. Você verá uma tela da Figura 31.

Figura 30 – Solution Explorer do Visual C#.

91
Figura 31 – Tela MainForm.cs

A tela acima contém o programa que faz o reconhecimento de voz.


Iremos usá-la para que o robô possa reconhecer os comandos de voz e até
permitir uma conversação. Dê duplo click no botão “Palavras” e você verá o
código fonte que contém as palavras que o robô reconhecerá.

6.8 - Código fonte da tela que carrega as palavras:

private void btnAdd_Click(object sender, System.EventArgs e)


{
int a = 0;
String[] comando;
comando = new string[19];

comando[0] = "SERIOUS";
comando[1] = "ANGRY";
comando[2] = "SAD";
comando[3] = "TURNON";
comando[4] = "TURNOFF";
comando[5] = "RIGHT";
comando[6] = "LEFT";
comando[7] = "GOAHEAD";
comando[8] = "BACK";
comando[9] = "TOMOVE";
comando[10] = "ONE";
comando[11] = "TWO";
comando[12] = "THREE";

92
comando[13] = "FOUR";
comando[14] = "FIVE";
comando[15] = "SIX";
comando[16] = "HOW ARE YOU?";
comando[17] = "I AM OK";
comando[18] = "ARE YOU FINE?";

a = 0;

while (a < 19)


{
speechListBox1.AddItem(comando[a]);
a++;
}
}

Vamos analisar este programa, ele é muito simples. Um array contém


todas as palavra que devem ser reconhecidas pelo robô e a tela principal é
carregada com elas (dê mais uma olhada na Figura 29). Você pode ver um
retângulo com a inscrição “speechListBox1” (Figura 31). Este é o objeto de
detecção de comandos de voz e todo processamento é controlado por ele.

Programa de detecção de comandos de voz

Clique em Solution Explorer e dê duplo clique em SpeechListBox.cs,


conforme figura abaixo:

93
Se aparecer tela abaixo, clique em “Click here to switch to code
view”, para entrar no código fonte do objeto.

Vamos explicar a lógica do programa: Quando é detectado um


comando de voz, é acionada automaticamente a função
RecoContext_Hypothesis(). Esse evento apenas detecta o comando de
voz como uma hipótese de reconhecimento de alguma palavra que foi
adicionada na tela principal (Figura 29).

Já a função RecoContext_Recognition() é acionada quando o


programa efetivamente reconhece um comando de voz. Vamos analisar
esta função. O método this.Text contém o comando de voz que foi
reconhecido.

Para cada comando detectado, o programa envia um caractere para


um programa em Visual C++, que então envia instruções ao robô
(Falaremos sobre o programa em Visual C++ mais tarde).

Veja a linha de código ”if (this.Text == "SERIOUS")


SendKeys.Send("{S}");”. Traduzindo, significa: Se o comando detectado foi
“SERIOUS”, envie a letra “S” para o Visual C++. A instrução
“SendKeys.Send” tem a função de enviar caracteres para qualquer
programa que esteja no primeiro plano do Windows.

Vamos entender melhor esse processo: Você dá um comando de voz


através do microfone, o programa reconhece o comando como uma palavra
cadastrada, neste caso foi a palavra “SERIOUS”. O programa envia a letra
“S” para outro programa que, por sua vez, envia um comando ao robô para
que mostre uma “cara séria” no LCD Gráfico.

94
Outra função essencial deste objeto é a fala artificial ou voz
sintetizada. A linha de programa abaixo verifica se o comando de voz dado
foi “How are you?” (como vai você?). Então o programa irá falar com uma
voz artificial “I am fine. How about you?” (Estou bem, e você?). E outras
palavras, é possível programar o robô para estabelecer uma conversa com
você. Veja o código fonte abaixo:

if (this.Text == "HOW ARE YOU?")


voice.Speak("I AM FINE. SO YOU?",0);

A função voice.Speak() ativa a fala sintetizada. Qualquer texto que


você coloque entre aspas será vocalizado. Se escrever o texto em
português e quiser o sotaque em português, mude a seleção de voz na tela
“Propriedades de fala“ do Painel de Controle do Windows para “eSpeak-
MB-BR4”. Se quiser sotaque em Inglês, mude para “Microsoft Mike” ou
“Microsoft Sam”.

Com isso, você tem uma gama infinita de comandos e respostas que
poder ser inseridos, podendo simular uma conversa entre o ser humano e o
computador. A imaginação é o limite!

6.9 - Código fonte da função de reconhecimento de comando de voz:

public void RecoContext_Recognition(int StreamNumber,


object StreamPosition,
SpeechRecognitionType RecognitionType,
ISpeechRecoResult Result)
{
Debug.WriteLine("Recognition: " +
Result.PhraseInfo.GetText(0, -1, true) + ", " +
StreamNumber + ", " + StreamPosition);

int index;
ISpeechPhraseProperty oItem;

oItem = Result.PhraseInfo.Properties.Item(0).Children.Item(0);
index = oItem.Id;

if ((System.Decimal)Result.PhraseInfo.GrammarId == grammarId)
{

95
if( oItem.Name.CompareTo(this.Items[index].ToString())==0 )
{
this.SelectedIndex = index;

if (this.Text == "SERIOUS") SendKeys.Send("{S}");


if (this.Text == "ANGRY") SendKeys.Send("B");
if (this.Text == "SAD") SendKeys.Send("T");
if (this.Text == "TURNON") SendKeys.Send("L");
if (this.Text == "TURNOFF") SendKeys.Send("N");
if (this.Text == "RIGHT") SendKeys.Send("D");
if (this.Text == "LEFT") SendKeys.Send("E");
if (this.Text == "GOAHEAD") SendKeys.Send("F");
if (this.Text == "BACK") SendKeys.Send("A");

if (this.Text == "HOW ARE YOU?")


voice.Speak("I AM FINE. HOW ABOUT YOU?",0);

if (this.Text == "I AM OK")


voice.Speak("GOOD FOR YOU.", 0);

if (this.Text == "ARE YOU FINE?")


voice.Speak("YES, THANKS.", 0);

if (this.Text == "TOMOVE")
{
mover = true;
SendKeys.Send("M");
}

if (mover)
{
if (this.Text == "ONE") SendKeys.Send("1");
if (this.Text == "TWO") SendKeys.Send("2");
if (this.Text == "THREE") SendKeys.Send("3");
if (this.Text == "FOUR") SendKeys.Send("4");
if (this.Text == "FIVE") SendKeys.Send("5");
if (this.Text == "SIX") SendKeys.Send("6");
mover = false;
}
}
}
}

96
Fornecemos uma visão geral do processo de reconhecimento de
voz e voz sintetizada. Dê uma boa olhada em todo o programa no
Visual Studio, estude, entenda e faça as adaptações em seus próprios
projetos.

97
Capítulo 7 – Programação da visão artificial

98
7.1 - Introdução

Técnicas de Visão computacional são algoritmos que permite que o


computador reconheça formas, padrões e cores. São bastante utilizadas
nas indústrias para detectar falhas na fabricação em peças. A cada dia
surgem novos avanços, inclusive no reconhecimento de faces.

Nosso projeto se utiliza da detecção de movimentos captados através


de uma webcam. Exemplificando, quando a câmera captar um movimento
num ambiente, o programa extrai as coordenadas da câmera de onde
ocorreu o movimento, por ex: na linha 100 e coluna 400 e guarda essa
informação.

OBS: A Webcam utilizada neste projeto tem 640 colunas X 480 linhas.
Você deve adquirir uma câmera com configuração semelhante. É
essencial que a Webcam fique posicionada logo atrás do robô.

Vamos mostrar agora como usamos as coordenadas que foram


capturadas pela câmera. Resolvemos simplificar e dividir a tela em
quadrantes. Se a coordenada horizontal capturada estiver na faixa entre 0 e
100, definimos que o quadrante é 1; de 101 a 200, quadrante 2; de 201 a
300, quadrante 3; de 301 a 400, quadrante 4; de 401 a 500, quadrante 5 e
de 501 a 640, quadrante 6. Já as coordenadas verticais de 480 linhas têm 4
quadrantes.

OBS: Na programação do PIC, iremos explicar melhor o conceito dos


quadrantes.

Para utilizar a visão artificial vamos precisar de uma biblioteca de


funções gráficas chamada OPENCV, que é um conjunto de funções para
manipular formas geométricas e complexas, imagens em 2D e 3D, vídeo,
reconhecimento de faces e movimento, algoritmo de aprendizado, etc.

Muito versátil, OPENCV será usado no projeto para detectar


movimentos. Hoje, está na versão 2.4.1, mas usaremos uma versão
anterior, que pode ser encontrado no site
tech.groups.yahoo.com/group/build_smart_robot/files/OpenCV. OPENCV é
uma ferramenta de distribuição gratuita e faz parte de um projeto de Open
Source (veja mais em http://sourceforge.net/projects/opencvlibrary/).

99
7.2 – Algoritmo de detecção do movimento dos motores

Descreveremos abaixo como o OpenCV trabalha no nosso projeto. É


um algoritmo simplificado para que você entenda como o programa de
detecção de movimentos funciona:

a) O programa aciona a câmera que filma o ambiente.

b) OpenCV divide a filmagem em imagens estáticas, isto é, se a


WebCam é do tipo que filma 30 frames por segundo, OpenCV separa os
frames para trabalhar individualmente com cada um. OBS: Um frame é
uma imagem estática. 30 frames por segundo formam 1 segundo de
uma filmagem.

c) OpenCV compara o primeiro com o segundo frame para verificar


se houve alguma alteração de um em relação ao outro. Se houve, OpenCV
entende que aconteceu um movimento de algum corpo na filmagem. Se não
houve, ele compara o segundo frame com o terceiro a assim por diante, até
detectar um movimento.
d) OpenCV identifica as coordenadas de onde surgiu o movimento e
guarda essa informação para ser usada posteriormente.

7.3 – Instalando o OpenCV

Vamos agora instalar o OpenCV. No site


tech.groups.yahoo.com/group/build_smart_robot/files/OpenCV, baixe
os 21 arquivos, salve-os no seu computador e faça a descompactação.

Abra o programa OpenCV-1.2.0-win32. Vai aparecer a tela abaixo. Clique


em “Próximo >”:

100
Na próxima tela, clique em ”Eu concordo”:

Marque as opções conforme tela abaixo e clique em “Próximo >”.

101
Escolha a pasta de instalação (anote em um caderno) e clique em
“Próximo >”:

Na próxima tela, clique em “Próximo >”.

102
Na próxima tela, marque as opções abaixo e clique em “Instalar”.

Finalmente, na próxima tela, clique em “Terminar”:

103
Testando o OpenCV

Agora vamos testar o OpenCV para sabermos se foi instalado


corretamente. Vá ao menu do Windows Iniciar  Programas 
OpenCV1.2  CC++ Samples.

Aparecerá uma relação de programas do OpenCV. Clique no


aplicativo convexhull.exe. Se aparecer a tela abaixo, o OpenCV está
configurado corretamente.

Porém, se aparecer uma mensagem de erro, você está com algum


problema de configuração ou conflito no seu Windows 7. Aconselhamos a
consultar um técnico de sua confiança para verificar o problema.

7.4 - Configurando as bibliotecas do OpenCV no Visual C++

No nosso projeto, o Visual C++ terá a função de controlar a visão


artificial e enviar comandos ao robô. Antes de começarmos a trabalhar com
o Visual C++, devemos configurá-lo para que reconheça as bibliotecas do
OpenCV, como será explicado adiante:

Para permanentemente incluir as bibliotecas necessárias ao


funcionamento do OpenCV, deve-se alterar a variável Path do Windows.
Vamos mostrar como fazer isso: clique No ícone “Computador”, clique com
o botão direito e escolha o item de menu “Propriedades”.

104
Vai aparecer a seguinte tela. Clique em configurações avançadas do
sistema, conforme imagem abaixo:

105
Na próxima tela, clique em “Variáveis de ambiente”

Na opção “Variáveis do Sistema”, procure a variável Path e clique


duas vezes nela. Aparecerá a tela “Editar variáveis de sistema”. Adicione
a pasta de instalação do OpenCV que você anotou anteriormente e
complemente com \bin (por exemplo: C:\Program Files\OpenCV1.2\bin)
na variável Path do Windows.
Acompanhe as figuras a seguir:

106
IMPORTANTE: Todas as variáveis de ambiente deve ser separadas por
; (ponto e vírgula).
OBS: Agora feche e abra novamente o Visual C++ para que as
alterações tenham efeito.

7.5 - Configurando as opções globais do Visual Studio


Vá ao site tech.groups.yahoo.com/group/build_smart_robot/files/,
e baixe o arquivo projeto2.1.rar, salve-o no seu computador e
descompacte-o.

Abra o Visual C++ Express Edition, vá ao menu File -> Open ->
Project/Solution, clique no botão “Abrir” e abra o projeto salvo, conforme
figura abaixo:

107
A seguir, clique na aba “Solution Explorer” (flecha do lado de cima
da figura abaixo). Em seguida, clique com o botão direito do mouse sobre
o item projeto2.1. Vai aparecer um menu “pop-up”. Clique em “Properties”
(flecha do lado de baixo).

Agora devemos configurar o Visual C++ para informar em quais


diretórios estão os arquivos de configuração do OpenCV. Na próxima tela,
clique em VC++ Directories.

108
No campo ao lado do item “Library Directores”, inclua os seguintes
diretórios:

Localize a pasta onde você instalou o OpenCV. Por exemplo, se


OpenCV foi instalado em “C:\Program Files\OpenCV1.2”, inclua o
complemento”\lib”, ficando assim “C:\Program Files\OpenCV1.2\lib”,
conforme a figura a seguir (não apague o conteúdo anterior e separe os
diretórios com ponto e vírgula (;)):

Inclua a pasta onde você instalou o Opencv mais o complemento


“\include\opencv” (ex: C:\Program Files\OpenCV1.2\include\opencv) no
item “Include Directories”, conforme figura a seguir:

109
Agora Vamos associar as bibliotecas do OpenCV ao nosso projeto.
Clique no item Configuration Properties -> Linker -> Input. No campo
Additional Dependencies, verifique se as bibliotecas cv120.lib,
cxcore120.lib e highgui120.lib estão contidas no campo, conforme figura a
seguir. Se não estiverem no campo, inclua o seguinte:
cv120.lib;cxcore120.lib;highgui120.lib

Finalmente, clique em OK e então clique no botão “Save all”, na


barra de ícones no topo do Visual C++.

Pronto! OpenCV foi configurado com sucesso!

7.6 - Programando a visão artificial

Neste passo, vamos analisar o programa que controla a visão artificial


do robô. Vá ao Visual C++ e clique duas vezes no item Projeto2.1.cpp. Irá
surgir uma tela com o programa principal de visão artificial (tela seguinte).

110
No lado direito da tela, procure a função int _tmain. Primeiro iremos
entender os tipos de variáveis mais importantes relacionados ao OpenCV,
no nosso projeto:

IplImage: Este tipo é atribuido a uma imagem, seja ela um bmp, jpg ou um
frame de um filme, ao vivo ou gravado.

CvCapture: Este tipo se refere a uma filmagem, seja ela ao vivo ou já


gravada. No nosso caso, será usada para a captura de uma filmagem ao
vivo através de uma webcam.

CvSize: Tipo para dimensionar uma imagem. É usada geralmente com a


função CvSize(image->tamanho,imagem->largura).

CvFont: Tipo para ser usado em textos dentro de imagens.

Muito bem, agora vamos entender a lógica do funcionamento da


captura de uma filmagem ao vivo e analisaremos o programa de captura:

Função principal do projeto:


int _tmain(int argc, _TCHAR* argv[])

111
Definindo as variáveis motion e capture.
IplImage* motion = 0;
CvCapture* capture = 0;

A função cvCaptureFromCAM(0) inicia a captura das imagens de uma


webcam. O parametro “0” (zero) define o número da câmera que será
usada. Neste caso, será a câmera 1 (valor zero).
Havendo duas cameras conectadas no computador e alterando a
captura
para a segunda câmera, mude o parametro para 1 (um)
capture = cvCaptureFromCAM(0);

se a captura foi bem sucedida.


if( capture )
{

esta função cria uma janela onde será mostrado o filme.


cvNamedWindow( "Visao", 1 );

faz um loop infinito.


for(;;)
{

define a variável image, que será usada para conter cada frame do
filme.
IplImage* image;

e a filmagem chegou ao fim, o loop é interrompido.


if( !cvGrabFrame( capture ))
break;

Usa a variável image para receber cada frame, isto é, ela vai conter a
imagem de cada frame separadamente. Como nosso robô se
movimenta de acordo com movimentos no ambiente capturados pela
webcam, Isto será útil para tratar cada frame e identificar alguma
alteração no frame atual em relação ao frame anterior.
image = cvRetrieveFrame( capture );

Se a variável image tiver algum conteúdo, continua


if( image )
{

112
Se a variável motion tiver algum conteúdo (motion contém cada frame
do filme), continua o processamento.
if( !motion )
{

A variável motion vai conter o frame atual da filmagem


motion = cvCreateImage( cvSize(
image->width,image->height), 8, 3 );
cvZero( motion );
motion->origin = image->origin;
}
}

A função update_mhi vai processar o frame capturado e detectar se


houve alguma alteração no frame atual em relação ao frame anterior.
Se houve, isto significa que aconteceu um movimento no ambiente,
capturado pela webcam.

update_mhi( image, motion, 30 );


cvShowImage( "Visao", image);

if( cvWaitKey(10) >= 0 )


break;
}

As funções abaixo liberam a memória utilizada do computador.


cvReleaseCapture( &capture );
cvDestroyWindow( "Visao" );
}

As funções adicionais que iremos abordar agora se referem à


identificação de movimento em uma webcam. Como já explicamos, um
programa irá detectar se houve algum movimento numa filmagem ao vivo
capturada por uma webcam e enviar as coordenadas para o robô
movimentar a cabeça na direção de onde houve o movimento.

Pois bem, para detectar movimentos, o OpenCV possui funções


específicas. Vamos falar somente sobre aquelas que são as mais
importantes no nosso projeto.

Vá ao Visual C++ novamente. Procure a função update_mhi. Faça a


análise dos códigos. As linhas abaixo são as mais significativas:

113
center = cvPoint((comp_rect.x + comp_rect.width/2),(comp_rect.y +
comp_rect.height/2));

itoa(center.x/100,x,10);
itoa(center.y/100,y,10);

Vamos analisá-las. cvPoint é uma função que extrai os pixels de uma


imagem. Neste caso, a imagem está registrada na variável comp_rect, que
também contém o registro das alterações entre dois frames. Em outras
palavras, essa variável tem o registro dos movimentos na filmagem
capturada pela webcam.

Como se pode ver nas linhas anteriores do programa, a variável


comp_rect passa por tratamento de outras funções do OpenCV. Isto é
necessário para refinar e tornar mais rápida a detecção de alterações
entre dois frames. Não entraremos em detalhes neste refinamento,
pois foge do escopo deste livro ensinar detalhadamente o OpenCV.
Vamos nos atentar apenas para aquilo que é mais importante conhecer
neste projeto.

A variável center vai conter as coordenadas de onde houve o


movimento. A nossa webcam tem 640 X 480 pixels, então center terá o
valor correspondente a esse intervalo: de 0 a 640 colunas e de 0 a 480
linhas.

Nas duas linhas de comando abaixo vamos extrair as coordenas


contidas na variável center e atribuir às variáveis x (posição horizontal) e y
(posição vertical). Veja que temos que colocar os complementos “.x” e “.y”
para informar que estamos trabalhando com as coordenadas horizontal e
vertical da variável center. Exemplificando, se houve um movimento nas
coordenadas 120 x 80, então x = 120 e y = 80.

itoa(center.x/100,x,10);
itoa(center.y/100,y,10);

Finalmente, x e y serão enviados ao robô, através da função


FT_Write (veremos mais em programação USB).

114
As coordenadas dos movimentos é mostrado na tela da webcam,
através da função cvPutText, como mostrado abaixo. A variável texto vai
conter as coordenadas x e y.

Atribui a variavel texto à string “ X=”


strcpy(texto," X=");

Atribui a variavel texto à variavel xx


strcat(texto,xx);

Atribui a variavel texto à string “ Y=”


strcat(texto," Y=");

Atribui a variavel texto a variavel yy


strcat(texto,yy);

Mostra na tela da WebCam as coordenadas horinzontal e vertical. Vai


ser mostrado algo parecido com “X=100 Y=30”.
cvPutText( img, texto, cvPoint( 10, 30 ), outputFont, color );

Neste capítulo vimos como funciona a visão artificial utilizando a


biblioteca OpenCV, suas funções e métodos. Não execute ainda o
programa de visão artificial. Vamos configurar mais recursos no
próximo capítulo.

115
Capítulo 8 – Programação da porta USB

116
8.1 - Introdução

Os comandos enviados pelo PC ao robô serão feitos pela porta USB.


A porta USB (Universal Serial Bus) surgiu em 1995 com uma parceria entre
as várias companhias de alta tecnologia (Compac, HP, Intel, Microsoft,
Lucet, Nec e Philips). O USB é um dispositivo muito utilizado pelo mercado
de Hardware. Ele permite a conexão de vários aparelhos ao computador e
Hoje virou um padrão de conexão de dispositivos para o PC. Já foram
lançadas várias versões até a versão 2.0 com velocidade 60 MBps.

Existem dois tipos de conectores USB: Tipo A e tipo B (Figura 32):

Figura 32 – Conectores A e B machos

Os conectores tipo A Fêmea são aqueles encontrados nos


computadores. Os Tipos A Macho são aqueles encontrados em cabos USB
e Pendrives, entre outros.

Os conectores tipos B Fêmea são aqueles conectores encontrados


em impressoras, máquinas digitais e outros aparelhos e o tipo B macho são
encontrados nos cabos USB que se conectam a estes dispositivos. Vamos
trabalhar com dois tipos: A macho e B macho.

Existem quatro pinos na porta USB: Um para envio e um para


recebimento de dados, um para o pólo positivo e um para o pólo negativo
da corrente elétrica, que é gerada pelo computador (+- 5V). A Figura 33
mostra mais detalhes na relação de pinos.

117
Figura 33 – Número da relação de pinos dos conectores A e B machos.

Teoricamente, qualquer aparelho que seja alimentado por uma carga


de 5V pode funcionar se conectado a uma porta USB do PC. Isso, porém,
pode causar danos irreparáveis ao computador se houver algum curto no
aparelho conectado. Por isso, devem-se usar algumas proteções eletrônicas
no circuito para que isso não aconteça.

Como já dissemos anteriormente, no nosso projeto, o circuito principal


é alimentado pela porta USB do computador e os dois motores são
alimentados por uma fonte externa de 5V.

Como fazer para o computador enviar informações para o robô,


através da porta USB?

Não é possível simplesmente conectar os fios positivo e negativo e


acionar a chave do robô. É necessário usar um componente USB que faça
a interface entre o computador e o PIC. Pra isso, vamos usar um dispositivo
de interface baseado no Chip FT232BM (Figura 34). Não vamos entrar a
fundo sobre o funcionamento deste chip, mas falar apenas sobre o
dispositivo USB baseado neste chip.

O dispositivo de conexão USB baseado no FT232BM (Figura 35)


permite facilmente a conexão entre PIC e o computador e usa funções de
comunicação serial do PIC e funções da biblioteca do FT232BM. Essa
biblioteca vem em um pacote de instalação junto com drivers que permitem
o reconhecimento do Chip pelo computador.

118
Figura 34 – ChipSet FT232BM.

Figura 35 – Dispositivo de comunicação USB.

Você pode encontrar este dispositivo para venda no nosso site ou em


outros sites. O importante é você procurar por dispositivo de comunicação
USB baseado no FT232.

Após adquirir o dispositivo, você terá que fazer certas adaptações no


circuito. Explicamos: Existem dois tipos de dispositivos USB: O primeiro tipo
é alimentado pela USB e o segundo tipo é alimentado por uma fonte
externa. Apesar dos motores serem alimentados por uma fonte externa de
5V no nosso projeto, o restante do circuito deve ser alimentado pela porta
USB, então vamos nos basear no primeiro tipo. O nosso robô terá o circuito
principal alimentado pela porta USB.

As adaptações ao circuito do dispositivo serão feitas no sentido de


permitir que o dispositivo e qualquer circuito ligado a ele sejam alimentados
pela energia fornecida pela porta USB.

Vamos ver agora como funciona a relação de pinos do dispositivo. A


Figura 36 mostra a parte traseira e especifica os pinos e as adaptações que
você deve fazer.

119
Figura 36 – Posicionamento dos pinos do dispositivo de comunicação USB.

As adaptações são as seguintes: Você deve conectar os pontos RS,


VIO, EXT e BUS. São eles que contêm o pólo positivo da carga (+ 5Volts),
que deve ser ligado ao pino U+ do circuito principal do robô.

Os pinos PWL e GND devem ser ligados. São eles que possuem o
pólo negativo (-), que deve ser ligado ao pino U- do circuito do robô.

O pino TX do dispositivo deve ser ligado ao pino TX do circuito do


robô e o pino RX do dispositivo deve ser ligado ao pino RX do circuito.

8.2 - Programando a biblioteca USB

A FTDI – Future Technology Devices International Ltd. é a fabricante


do FT232BM (www.ftdchip.com/FTDrivers.htm). No site
http://tech.groups.yahoo.com/group/build_smart_robot/files/FTDrivers.
rar, baixe e descompacte o arquivo para o seu computador e siga as
instruções abaixo para fazer a configuração:
Conecte o Dispositivo de Comunicação USB (Figura 35) na porta
USB do computador, utilizando o cabo da imagem abaixo:

120
No próximo passo, você vai precisar ter acesso de administrador
no seu computador. Após conectar o dispositivo no computador, siga os
passos abaixo:

Se surgir a mensagem abaixo, ignore-a.

Abra o Windows Explorer, clique com o botão direito em


Computador e em Propriedades.

121
Irá aparecer a tela abaixo. Clique em Configurações avançadas do
sistema.

Na tela abaixo, clique na aba Hardware e no botão Gerenciador de


dispositivos.

122
Na tela abaixo, clique com o botão direito em USB232-RCOM1 e em
Atualizar Driver...

Abaixo, escolha Procurar software de driver no computador

123
Após baixar os drivers do FT232 no seu computador (veja o item 8.2),
conforme tela abaixo, clique em Procurar, insira a pasta onde você baixou
os drivers e clique em Avançar.

Em seguida, vai aparecer a tela abaixo. Clique em Fechar. Pronto, o driver


está instalado.

124
8.3 - Biblioteca de funções

A FTD desenvolveu uma biblioteca de funções para o uso do


FTD232BM. São funções de comunicação serial via USB e são bastante
simples de programar e usar.

No nosso projeto, usaremos as funções no Visual C++. Mas antes,


precisamos informar ao Visual C++ onde estão todas as bibliotecas e
programas do FTD232.

Vá ao Visual C++ e ao menu Project -> projeto2.1 Properties ou


Project -> Properties. A tela abaixo irá surgir. Vá em Configuration-
>Linker->Input. No quadro a direita, em Additional Dependencies, sem
apagar o resto do texto, no início, adicione FTD2XX.lib; (separe-os com
ponto e vírgula).

125
Na mesma tela, clique em VC++ Directories, clique no item “Include
Directories” e inclua a pasta FTDrivers (e ponto e virgula), que foi
copiada para o seu computador anteriormente.

No item “Library Directories”, inclua a pasta FTDrivers\i386.

126
Explicando as funções

No Visual C++, abra o código Projeto2.1.cpp. Vamos analisar o


programa referente ao FTD:

No início, devem ser definidas três variáveis, descritas abaixo:

FT_HANDLE ftHandle;
FT_STATUS ftStatus;
DWORD bytesWritten;

FT_HANDLE é um tipo que guarda o ponteiro, isto é, endereço na


memória do dispositivo FTD232BM que está ativo no momento. A variável
ftHandle vai ser usada por todas as funções de comunicação para que o
sistema saiba em qual dispositivo estará trabalhando.

FT_STATUS é um tipo que guarda o status da execução de uma


função, para o sistema saber se a função foi executada com sucesso ou
não. A variável ftStatus conterá essa informação e será usada para todas
as funções do projeto.

A variável bytesWritten vai conter o tamanho em bytes da


informação que é enviado ao dispositivo FTD232BM, através da porta USB.
Não tem utilidade prática neste projeto, mas será usada apenas porque a
função de envio exige a sua declaração.

Antes de enviar caracteres pela porta USB, deve-se configurar o FTD


e para isso serão usadas as funções descritas acima:

Vamos analisar agora a função update_mhi:

if (FT_Open(0, &ftHandle) == FT_OK)


{
ftStatus = FT_SetDataCharacteristics(ftHandle, FT_BITS_8,
FT_STOP_BITS_1, FT_PARITY_NONE);

ftStatus = FT_SetBaudRate(ftHandle, FT_BAUD_9600);

ftStatus = FT_SetTimeouts(ftHandle, 1, 0);

ftStatus = FT_Purge(ftHandle, FT_PURGE_RX || FT_PURGE_TX);


}
else

127
{
printf("Open FTD Falhou!");
}

FT_Open tem a função abrir a conexão com o dispositivo e é a


primeira a ser utilizada. O ideal é que seja feita como mostrado acima,
dentro de um IF para que seja validado se o dispositivo USB está
conectado ao computador.

FT_SetDataCharacteristics configura o dispositivo para


propriedades específicas de comunicações seriais.

FT_SetBaudRate configura-o para velocidade de transmissão, que


neste caso é de 9600 bytes por segundo.

FT_Purge informa ao dispositivo que este será utilizado para


transmissão ou recepção de dados, no nosso caso é a transmissão de
dados.

Depois de configurada, vamos usar uma função para transmitir dados


ao robô, e esta função é FT_Write, como é mostrado abaixo:

ftStatus = FT_Write(ftHandle, x, 1, &bytesWritten);

A variável ftStatus vai conter o resultado da execução da função, se


foi bem sucedida ou não. Os parâmetros da função são os seguintes:
(HANDLE DO DISPOSITIVO, CARACTER A SER TRANSMITIDO,
QUANTIDADE DE BYTES E VARIAVEL DE RETORNO)

O parâmetro CARACTER A SER TRANSMITIDO possui certas


peculiaridades, que devem ser bem entendidas antes de se utilizar a
função. Este parâmetro pode ser um caracter, mas não pode ser inserido na
chamada da função simplesmente na forma de caracter, por exemplo, “A”.

Ele apenas aceita variáveis tipo CHAR. A variável deve ser declarada
desta maneira: char charac[256];, depois deve-se usar a função strcpy_s
para atribuir um caracter à variável, por exemplo, strcpy_s(charac,"A").
Agora sim, pode ser usada: ftStatus = FT_Write(ftHandle, charac, 1,
&bytesWritten);

128
Muito bem, vimos como implementar as funções para comunicação
serial via porta USB. Estas funções farão a comunicação entre o
computador e o robô.

8.4 - Recebendo comandos de voz e enviando as coordenadas da


webcam ao robô

O programa de controle de voz recebe um comando de voz,


identifica-o e envia um comando em forma de caractere ao programa de
visão artificial que deve ficar no primeiro plano do Windows.

O programa de visão artificial receberá o caractere enviado pelo


programa de controle de voz. E então envia o caractere ao robô, que irá agir
de acordo com o comando dado.

Por exemplo, você fala ao microfone o comando “Right” (direita), o


programa de controle de voz enviará o caractere “R” para o programa de
visão artificial (este deve estar em primeiro plano no Windows) que envia o
caractere “R” ao robô, que então vira a cabeça totalmente à direita.

O comando de voz é um recurso avançado e causa boa impressão no


publico, mas o principal recurso do projeto é a visão artificial. O programa
que ativa a visão envia coordenadas capturadas pela webcam para o robô
movimentar a cabeça para a direita/esquerda/para cima/para baixo.

Resumindo a descrição esse processo, podemos dizer que uma


webcam padrão tem 640 (colunas) X 480 (linhas) na tela. O programa de
visão identifica onde houve uma alteração na imagem da webcam (se houve
movimento no ambiente) e em qual posição ocorreu. Por exemplo, houve
algum movimento na posição 300 X 150. Então são enviadas essas
coordenadas ao robô, que compara com as coordenadas anteriormente
enviadas e movimenta a cabeça para frente ou para trás, para a direita ou
para a esquerda.

129
Capítulo 9 – Programação do Micro-controlador
PIC

130
9.1 – Mikrobasic

Mikrobasic é uma linguagem de programação específica para micro-


controladores. A estrutura básica de seus programas é a mesma de
qualquer linguagem de programação. O fabricante é a mikroElektronika
(www.mikroe.com) e a versão mais básica pode ser adquirida por
US$99,00, o que é uma pechincha pela gama de recursos que ela possue.

Se você já tiver conhecimentos em programação, este capítulo vai ser


útil para que conheça também a programação de micro-controladores. Se
você nunca programou, daremos uma pequena base da linguagem,
estimulando-o a se aperfeiçoar.

Mas se você não tiver interesse em programação, fornecemos o


código fonte do programa utilizado no projeto do robô no site
tech.groups.yahoo.com/group/build_smart_robot/files/pic basic.rar.

O Mikrobasic trabalha com dois tipos de arquivos: O projeto (arquivo


com extensão PBP) e o código fonte (extensão PBAS). Quando está pronto
um programa PBAS, deve-se compilá-lo para gravá-lo no PIC e então o
Mikrobasic gera um arquivo com extensão HEX. É esse o arquivo que será
gravado no micro-controlador.

9.2 - Conceito de linguagens de programação para micro-


controladores

Vamos agora falar sobre a programação especificamente do PIC


18F452, como mostrado no capítulo 3.

O PIC 18F452 tem 40 pinos, com 33 pinos de entrada/saída. Esse


tipo de pino é do tipo que recebe e transmite sinais elétricos binários (0 e 1).
Por exemplo, para acender um LED é necessário ligar um pólo do LED num
pino do PIC (p.ex: pino 40) e o outro pólo do LED no pólo positivo da fonte
de energia.

Cada pino tem um número físico seqüencial indicando a sua posição


(de zero a 40) no PIC e tem um número lógico que é utilizado para
identificá-lo dentro de um programa. No caso do pino 40, seu número lógico
é o B7. Olhe de novo a Figura 20 do Capítulo 3.

131
A letra B significa que o pino pertence a um bloco conjunto de oito
pinos, de B0 a B7. Existem outros blocos, dependendo da quantidade de
pinos que tiver o micro-controlador. No caso do 18F452, temos os blocos A,
B, C, D e E. Apenas o bloco E tem três pinos, o outros tem oito pinos cada.

Figura 37 – Ligando um LED ao PIC.

Os componentes que utilizaremos para montar o esquema acima são os


seguintes:

. 1 PIC 18F452
. 1 Resistor de 10 K Ohms
. 1 Resistor de 330 Ohms
. 2 Capacitores Cerâmicos de 33 micro F
. 1 Cristal de 8 Mhz
. 1 Led

Pois bem, após ligamos um LED ao PIC, devemos programar o PIC


para fazer acender e apagar o LED a cada segundo.

132
Vamos agora fazer o primeiro programa:

Tudo inicia com uma diretiva obrigatória do Mikrobasic. A primeira


linha (programa AcendeApagaLed) é uma indicação do nome do
programa.

A segunda linha (main:) indica o início do programa. É a partir daí


que as coisas acontecem. Esta linha também é obrigatória.

A terceira linha (TRISB = %00000000) indica que todos os pinos do


bloco B estão configurados para entrada e saída. Se estivessem com o
número 1 ao invés de 0, todos os pinos seriam obrigatoriamente de entrada.
Como você pode ver, são oito zeros (%00000000) representando um pino.
O pino B0 é o primeiro da direita e o pino B7 é o primeiro da esquerda. O
símbolo percentual (%) indica que os números são do tipo binário.

A quarta linha (while true) é um comando que indica o início de uma


estrutura de Loopping, isto é, um laço sem fim. O objetivo é apagar e
acender um LED a cada um segundo. Para isso precisamos de um fluxo
que se repetissem ininterruptamente. Então utilizamos o Loopping. O
comando while true é a indicação do inicio da estrutura. O comando wend
é o fim da estrutura. Isso indica que todos os comandos que estiverem
dentro do laço While – Wend serão executados repetitivamente.

A quinta linha (PORTB.7 = 0) faz com que o PIC deixe de enviar sinal
elétrico para o pino B7. Procedendo assim, o LED se apaga.

133
A sexta linha (DELAY_MS(1000)) faz com que o PIC fique inativo
durante 1 segundo (1000 milissegundos). Se o LED estiver apagado, vai
ficar assim durante 1 segundo.

A sétima linha (PORTB.7 = 1) faz com que o PIC envie um sinal


elétrico para o pino B7. Procedendo assim, o LED acende.

A oitava linha (DELAY_MS(1000)) faz com que o PIC fique inativo


durante 1 segundo (1000 milissegundos). Se o LED estiver aceso, vai ficar
assim durante 1 segundo.

A nona linha (wend) tem a função de indicar o fim da estrutura While-


wend.

Finalmente, a décima linha (end.) também é uma diretiva obrigatória.


Indica o fim do programa.

Pois bem, temos aí a descrição de um programa bem simples. O que


vem a seguir é bem mais complexo.

Vamos começar agora a montar o programa completo que controlará o


robô.

9.3 - Programando o LCD Gráfico

Para criar um programa no Mikrobasic, vá em Project -> New


Project.

Se você não quiser aprender a programar, vá ao menu Project -> Open


Project e abra o projeto do PIC que você baixou anteriormente
(ROBO.PBP). Este é o programa que controla o robô.

A Figura 38 é a tela de criação do projeto. No campo Project Name,


digite o nome do programa. No nosso caso, digite “Robô”. No campo
Project Path, escolha um caminho para gravar o programa. No campo
Description não precisa escrever nada. No campo Device, escolha o
dispositivo P18F452 e no campo Clock digite 008.000000 (este é o valor do
cristal usado no circuito (8 MHZ)).

134
Para efetivamente configurar os parâmetros internos do nosso
programa, clique nos botões “Default” e “Ok”.

Figura 38 – Tela de configuração do projeto em Mikrobasic.

Após este passo, aparecerá a tela da Figura 39. Trata-se de um editor


e ambiente de programação para construção de programas.

Antes de tudo, precisaremos criar os rostos com expressões diversas


para serem mostradas no LCD do robô. Criaremos quatro rostos com
expressões de seriedade, tristeza, raiva e com olhos fechados (essas
imagens também estão juntas ao projeto do PIC).

Desenhe as imagens da Figura 40 separadamente, com tamanho


obrigatório de 128 X 64 pixels, e utilizando apenas as cores preta e branca.
As imagens devem ser do tipo bitmap monocromático.

135
Figura 39 – Tela de principal do Mikrobasic.

Figura 40 – Silhuetas do robô: sério, bravo, piscando, triste.

Depois de criadas as imagens das silhuetas, no Mikrobasic vá em


Tools / GLCD Bitmap Editor. Aparecerá a tela da Figura 41, clique na aba
KS0108. No canto inferior direito, marque a opção “mikroBasic Code”.
Clique no botão “Load BMP Picture” e carregue o primeiro rosto da Figura
40.

136
Figura 41 – Tela para carga de imagens para LCD.

Você verá que, após carregar a imagem, no campo Generated CODE


aparecerá um código parecido com o mostrado abaixo:
' ------------------------------------------------------
' GLCD Picture name: tela_principal.bmp
' GLCD Model: KS0108 128x64
' ------------------------------------------------------

const tela_principal_bmp as byte[1024] = (


0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
170,168,168,160,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 42,170,170,170,170,170,170,170,
170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,
170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,
170,170,170,170,170,170,170,170,170,170,170, 42, 0, 0, 0, 0,
0, 0, 42,170,170,170,170,170,170,170,170,170,170,170,170,170,

137
170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,
170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,
170,170,170,170,170, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 10, 10, 42, 42,170)

Copie o código que foi gerado e cole no editor de programas (Figura


39). Agora faça o mesmo para todas as outras imagens. Dê uma olhada no
arquivo ROBO.PBAS e veja como é o programa pronto.

Trabalhar com LCD gráficos é muito simples no Mikrobasic. você


precisa declarar quais pinos do PIC serão utilizados para enviar comandos
ao LCD. Existem duas portas no LCD gráfico: a porta de controle e a porta
de dados. No datasheet do LCD, você pode ver quais são o dois tipos de
portas: A Porta de controle tem os seguintes pinos: CS1,CS2,RS,RW,RST e
EN. A porta de dados tem os seguintes pinos: B0,B1,B2,B3,B4,B5,B6 e B7.

Você pode ver no circuito eletrônico que ligamos à porta de controle


do LCD Gráfico nos pinos 0,1,2,3,5,4 (não foi invertido: é 5 antes do 4
mesmo) da porta PORTB do PIC. E a porta de controle do LCD Gráfico nos
pinos 0,1,2,3,4,5,6,7 da porta PORTD do PIC.

Para deixar mais claro o conceito, vamos detalhar melhor os


procedimentos:

Este é o comando que informa as portas:


Glcd_Init(portaControle, cs1, cs2, rs, rw, rst, en, portaDados)

Ele será escrito assim no programa principal:


Glcd_Init(PORTB, 0, 1, 2, 3, 5, 4, PORTD)

Portas de controle:
CS1 (LCD) = PORTB.0 (PIC)
CS2 (LCD) = PORTB.1 (PIC)
RS (LCD) = PORTB.2 (PIC)
RW (LCD) = PORTB.3 (PIC)
RST (LCD) = PORTB.5 (PIC)
EN (LCD) = PORTB.4 (PIC)

Portas de dados:
B0 (LCD) = PORTD.0 (PIC)
B1 (LCD) = PORTD.1 (PIC)
B2 (LCD) = PORTD.2 (PIC)

138
B3 (LCD) = PORTD.3 (PIC)
B4 (LCD) = PORTD.4 (PIC)
B5 (LCD) = PORTD.5 (PIC)
B6 (LCD) = PORTD.6 (PIC)
B7 (LCD) = PORTD.7 (PIC)

Como você pode constatar, não é necessário que os pinos da


PORTD sejam declarados no comando, pois é padrão que os pinos de
dados sejam ligados em seus correspondentes numéricos, tanto no LCD
como no PIC.

Todas as funções e comandos para manipulação do LCD podem ser


encontrados no Help do Mikrobasic.

9.4 - O programa para controle dos motores

Como dissemos anteriormente, criamos um algoritmo para controlar a


posição dos motores. Existem dois sensores (S1 e S2, como visto no item
4.4 do Capítulo 4) que detectam a posição dos motores. Um deles registra
quando o motor horizontal vira totalmente para a esquerda ou para a direita.
E outro sensor registra quando o motor vertical vira totalmente para trás ou
totalmente para frente.

O algoritmo começa quando o robô é ligado, ele posiciona o motor


horizontal da cabeça na posição mais a direita e o motor vertical da cabeça
para trás. Vamos chamar de X a posição horizontal e de Y a posição
vertical. O programa registra X = 0 e Y = 0 inicialmente.

Quando o PIC receber as coordenadas X e Y da WebCam, ele tem


que movimentar os motores. P.Ex., o PIC recebe a coordenada X = 4 e Y =
2. O programa move o motor X para a direita 4 passos e o motor Y para
frente 2 passos.

Chamaremos de passos a função que criamos para que o PIC envie


sinais elétricos ao motor X a cada 200 milissegundos e para o motor Y a
cada 150 milissegundos. A diferença entre X e Y é que a distância entre as
duas extremidades de ambos é diferente. As coordenadas do motor X vão
de zero até seis e do motor Y vão de zero até quatro.

Depois o PIC receberá as coordenadas X = 1 e Y= 3. Ele então


movimentará o motor X para a esquerda 3 passos (antes X = 4, agora X = 1
 4 - 1 = 3) e o motor Y será movimentado 1 passo à frente.

139
Finamente, se receber X = 2 e Y= 1, O motor X irá à direita um passo
e o motor Y irá para trás dois passos.

Um ponto importante no algoritmo é que sempre que o PIC receber


da WebCam as coordenadas X = 0 ou X = 6 e Y = 0 ou Y = 4, ele
movimentará os motores até que os sensores sejam acionados. Isso é
essencial para o PIC saber exatamente qual é a posição atual dos motores
X e Y.

9.5 - Entendendo o programa que controla o robô

O programa inicia na rotina main.

' ------------------------------------------------------
' GLCD Picture name: tela_principal.bmp
' A variável tela_principal_bmp vai conter a tela
' principal do LCD, que neste caso é
' ------------------------------------------------------

const tela_principal_bmp as byte[1024] = (


0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
170,168,168,160,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 42,170,170,170,170,170,170,170,
170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,
170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,
170,170,170,170,170,170,170,170,170,170,170, 42, 0, 0, 0, 0,
0, 0, 42,170,170,170,170,170,170,170,170,170,170,170,170,170,
170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,
170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,
170,170,170,170,170, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 10, 10, 42, 42,170)

main:

'Configurando as portas de entrada/saída


TRISC = %00000000
PORTC = %00000000
TRISB = %00000000
PORTB = %00000000

140
'Configurando o LCD
Glcd_Init(PORTB,0,1,2,3,5,4,PORTD)

'Apagando a tela do LCD


Glcd_Fill(0x00)

'Definindo o gráfico contido na variável tela_principal_bravo_bmp


'que a tela principal do LCD
Glcd_Image(tela_principal_bravo_bmp)

'Configurando a entrada serial/usb


'para a velocidade de 9600 bits/seg.
USART_init(9600)

mostraMon = "1"
contad = 0
segundo = 0

T1CON = 1
pir1.TMR1IF = 0
PIE1 = 1
INTCON = $C0
mostraCara = "2"
fezComando = "0"

'a função MoveX posiciona o motor X (horizontal)


'neste caso, será posicionado totalmente a direita
MoveX("0")

'a função MoveY posiciona o motor Y (vertical)


'neste caso, será posicionado totalmente para trás
MoveY("0")
'*********************************************
'*********** Principal *********************
'*********************************************
while TRUE
gosub MostraCaraRobot

'Aguarda que um caractere seja recebido pela


'porta USB
if (Usart_Data_Ready() = 1) then
segundo = 21

141
milis = 16
gosub MostraCaraRobot

'a variável txt2 vai conter


'o caractere recebido
txt2 = Usart_Read
y = txt2
contad = contad + 1

if (contad = 2) then
gosub VerificaComando

if fezComando = "0" then


'movimenta os motores x e y
'com as variáveis x e y
'que contém as coordenadas
'enviadas pela webcam
Move(x,y)
else
fezComando = "0"
end if

contad = 0
end if

x = txt2
end if
wend
'********************************************

O resto do programa está bem documentado (Robo.pbp) e


finalmente, você deve compilar o programa no Mikrobasic. A compilação
deverá gerar um arquivo com extensão HEX. É esse arquivo que deverá ser
gravado no PIC (rever capítulo 3, pág. 27 “Gravando um programa no
PIC”)

Para compilar um programa no Mikrobasic, vá ao menu Project >


Build All. Um arquivo HEX será gerado na pasta onde está Robo.pbp.

142
Conclusão

Tudo foi preparado! Agora vamos juntar as peças e proceder da


seguinte maneira:

1) Posicione o robô numa superfície aderente, que não corra o risco de


deslizar.

2) Posicione a WebCam logo atrás do robô numa altura dez cm mais alto.

3) Ligue o robô na corrente elétrica.

4) Conecte o robô na porta USB do computador.

5) O robô irá posicionar automaticamente a cabeça à direita e para trás.

6) Abra o Visual C#. Carregue o programa de reconhecimento de voz


ListBoxCSharp e execute-o apertando a tela “F5”.

7) Deve aparecer a tela de reconhecimento de voz. Clique no botão


“Palavras”.

8) Abra o Visual C++. Carregue o programa de visão artificial projeto2.1 e


execute-o apertando a tela “F5”.

9) Deve aparecer uma tela preta e outra tela com a imagem da WebCam.

10) Mantenha a tela preta no primeiro plano do Windows. Essa tela


receberá os comandos de voz e os enviará ao robô.

11) Neste momento, o robô deve estar se movimentando para as posições


onde a WebCam recebeu coordenadas de movimento.

12) Experimente dar comandos de voz para o robô, que foram configurados
no programa de reconhecimento de voz.

Considerações finais

O SEU sucesso na confecção deste projeto depende de prestar muita


atenção nas instruções dadas, ter muita força de vontade, estudar bastante,
pesquisar bastante, eliminar a preguiça e avançar cada vez mais.

143
Estarei sempre disponível para ajudar você, leitor. Criei um grupo
para que você possa compartilhar experiências e sanar dúvidas. Sempre
que possível participarei do grupo para ajudá-lo a fazer o projeto e o mais
importante: também ajudá-lo a se aprimorar! Anote o endereço do grupo:
http://groups.yahoo.com/group/build_smart_robot

Obrigado por ter adquirido este livro. O que espero de você é que
trabalhe duro e se divirta.

O AUTOR

144

Você também pode gostar