Вы находитесь на странице: 1из 100

UNIVERSIDADE FEDERAL DE GOIS

ESCOLA DAS ENGENHARIAS MECNICA ELTRICA E DE COMPUTAO

Marcelo Pereira Barros


Murillo de Lima Inomata

MDULO DE COMUNICAO BLUETOOTH UTILIZANDO O


MICROCONTROLADOR 8051 PARA MANIPULAR UM GUINCHO

Goinia
2013

Marcelo Pereira Barros


Murillo de Lima Inomata

MDULO DE COMUNICAO BLUETOOTH UTILIZANDO O


MICROCONTROLADOR 8051 PARA MANIPULAR UM GUINCHO

Trabalho

de

Concluso

de

Curso

apresentado Coordenadoria do Curso


de

Engenharia

de

Computao

da

Universidade Federal de Gois para a


obteno do ttulo de Engenheiro de
Computao.

Orientador: Prof. Dr. Jos Wilson Lima Nerys

Goinia
2013

Marcelo Pereira Barros


Murillo de Lima Inomata

MDULO DE COMUNICAO BLUETOOTH UTILIZANDO O


MICROCONTROLADOR 8051 PARA MANIPULAR UM GUINCHO

Trabalho

de

Concluso

de

Curso

apresentado Coordenadoria do Curso


de

Engenharia

de

Computao

da

Universidade Federal de Gois para a


obteno do ttulo de Engenheiro de
Computao.

Aprovado em __/__/____

BANCA EXAMINADORA

Prof. Dr. Jos Wilson Lima Nerys

Prof. Dr. Marcelo Stehling de Castro

Ms. Gustavo Souto de S e Souza

1 RESUMO

O presente trabalho visa desenvolver um manipulador robtico de baixo


custo, fazendo uso do microcontrolador 8051 que o ncleo de toda a famlia MSC51. O sistema baseado em microcontrolador dever receber sinais de um dispositivo
mvel atravs do protocolo de comunicao Bluetooth, e realizar os movimentos
solicitados pelo usurio que est controlando o guindaste. A interface dever ser
simples e intuitiva, e os sensores de posio devero ter um controle rgido de
posio.
Palavras-chaves: Microcontrolador, guindaste, 8051, Bluetooth, brao
mecnico, dispositivos mveis, motores de passo.

2 ABSTRACT

This work aims to develop a low-cost robotic manipulator, using the 8051
microcontroller which is the core of the whole family MSC-51. The microcontroller
based system will receive signals from a mobile device via Bluetooth communication
protocol, and perform the movements required by the user who is controlling the
crane. The interface should be simple and intuitive, and the position sensors should
have tight control of the crane position.
Keywords: Microcontroller, crane, 8051, Bluetooth, mechanical arm, mobile
devices, stepper motors.

3 AGRADECIMENTOS

Agradeo, acima de tudo, a Deus, que me deu a vida e a fora. Aos meus
filhos, por serem minha inspirao, e a minha esposa, por todo apoio. Mas em
especial agradeo aos meus pais, por tudo, e dedico a eles essa conquista.

Marcelo Pereira Barros

Agradeo primeiramente a Deus que sempre me deu foras para alcanar


vitrias, a minha famlia pelo apoio e aos meus companheiros de curso que me
motivaram
Agradeo a todos os professores e servidores da UFG pela pacincia e
competncia no exerccio de suas atividades.

Murillo de Lima Inomata

" preciso que o discpulo da sabedoria


tenha o corao grande e corajoso. O
fardo pesado e a viagem longa."
Confncio

"O grau mais elevado da sabedoria


humana saber adaptar o seu carter s
circunstncias e ficar interiormente calmo
apesar das tempestades exteriores."
Daniel Defoe

SUMRIO
1

RESUMO .............................................................................................................. 4

ABSTRACT........................................................................................................... 5

AGRADECIMENTOS ............................................................................................ 6

ndice de Figuras ................................................................................................ 12

ndice de Tabelas ............................................................................................... 14

Smbolos e Siglas ............................................................................................... 15

CAPTULO 1 - INTRODUO............................................................................ 16

7.1

Descrio da Parte Fsica do Guincho ......................................................... 17

7.2

Fluxo de Desenvolvimento do Projeto .......................................................... 19

Captulo 2 - Microcontroladores .......................................................................... 20


8.1

Aplicaes de Microcontroladores ............................................................... 21

CAPTULO 3 A FAMLIA MCS-51 ................................................................... 22


9.1

Introduo Histrica ..................................................................................... 22

9.2

Por que usar o 8051 ..................................................................................... 22

9.3

Principais Caractersticas Comuns da famlia 8051 ..................................... 23

9.4

Arquitetura Interna 8051............................................................................... 24

9.5

Configurao e descrio dos pinos do 8051 .............................................. 25

9.6

ORGANIZAO DA MEMRIA ................................................................... 28

9.6.1

Memria RAM Interna ............................................................................ 28

9.6.2

Memria RAM Externa .......................................................................... 29

9.7

REGISTRADORES DE FUNES ESPECIAIS .......................................... 29

9.8

CONJUNTO DE INSTRUES ................................................................... 31

10

CAPTULO 3 BLUETOOTH .......................................................................... 32

10.1
11

Processo de estabelecimento de conexes .............................................. 34

DISPOSITIVOS UTILIZADOS ......................................................................... 36

11.1

AT89C52 ................................................................................................... 36

11.1.1
11.2

Memria de Dados ............................................................................. 37

MOTOR DE PASSO ................................................................................. 39

11.2.1

Definio ............................................................................................ 39

11.2.2

Parmetros dos motores de passo: .................................................... 40

11.2.3

Ponte H .............................................................................................. 41

11.3

Mdulo Bluetooth RS232 TTL ................................................................... 43

11.4

Conversor A/D (ADC0804)........................................................................ 44

11.4.1

Caractersticas: .................................................................................. 45

11.4.2

Funcionamento: .................................................................................. 46

11.4.3

Converter a entrada analgica e ler a sada do ADC0804. ................ 47

11.5

ULN2803 ................................................................................................... 48

11.6

Potencimetro ........................................................................................... 49

11.7

L298N ....................................................................................................... 50

12

FERRAMENTAS E DISPOSITIVOS UTILIZADOS .......................................... 53

12.1

Proteus...................................................................................................... 53

12.2

PEQui........................................................................................................ 54

12.2.1

Funcionamento: .................................................................................. 54

12.3

ChipMax2 .................................................................................................. 55

12.4

MaxLoader ................................................................................................ 56

12.5

Eclipse e Android SDK .............................................................................. 57

13

RESULTADOS OBTIDOS ............................................................................... 58

13.1

Esquemtico do circuito eletrnico ........................................................... 58

13.2

Placa de Circuito Impresso ....................................................................... 60

13.3

Processo de confeco da placa .............................................................. 61

13.4

Comunicao com os Dispositivos Bluetooth ........................................... 64

14

CONCLUSO E TRABALHOS FUTUROS...................................................... 67

15

BIBLIOGRAFIA................................................................................................ 69

16

APNDICE

CDIGO

EM

ASSEMBLY

DO

PROGRAMA

DO

MICROCONTROLADOR........................................................................................... 74
17

APNDICE B CDIGO EM JAVA DO PROGRAMA ANDROID/BLUETOOTH


79

4 ndice de Figuras

Figura 1 - Etapas de funcionamento do projeto......................................................... 16


Figura 2 - Descrio e funcionamento do guincho .................................................... 18
Figura 3 - Conexo das engrenagens do guincho..................................................... 18
Figura 4 - Fluxo de desenvolvimento do projeto........................................................ 19
Figura 5 - Arquitetura tpica de um microcontrolador ................................................ 20
Figura 6 - Caractersticas Especiais da Famlia MCS-51 .......................................... 24
Figura 7 - Arquitetura Interna do 8051 ...................................................................... 25
Figura 8 - Pinagem do 8051 ...................................................................................... 26
Figura 9 - Memria RAM do 8051. ............................................................................ 29
Figura 10 - Duas piconets formando uma scatternet, com um dispositivo escravo em
comum. ..................................................................................................................... 33
Figura 11 - Conjunto de estados dos dispositivos Bluetooth. .................................... 35
Figura 12 - Mapa dos SRF e seus valores de Reset ................................................. 38
Figura 13 - Ponte H chaveada................................................................................... 42
Figura 14 - ponte H automatizada. ............................................................................ 42
Figura 15 - Pinos usados do mdulo Bluetooth. ........................................................ 44
Figura 16 - Clculo de resoluo do ADC. ................................................................ 45
Figura 17 - Interface do ADC 0804 com o 8051. ....................................................... 47
Figura 18 - CI ULN2803. ........................................................................................... 48
Figura 19 - Partes de um potencimetro linear. ........................................................ 49
Figura 20 - Relao entre giro do cursor e as resistncias. ...................................... 50
Figura 21 - Pinagem do L298N. ................................................................................ 51
Figura 22 - Ligao do L298N com motor de passo bipolar. ..................................... 52
Figura 23 - Ambientes ISIS (esquerda) e ARES (direita). ......................................... 54
Figura 24 - Ambiente do PEQui................................................................................. 55
Figura 25 - Dispositivo de gravao de chips ChipMax2. .......................................... 56
Figura 26 - Ambiente do MaxLoader. ........................................................................ 56
Figura 27 - Esquemtico bsico do guincho.............................................................. 58
Figura 28 - PCI do 8052. ........................................................................................... 62
Figura 29 - PCI da ponte H com L298N. ................................................................... 63
Figura 30 - PCI de ativao do eletrom. ................................................................. 63

Figura 31 - Circuito eletrnico completo. ................................................................... 63


Figura 32 - Interface do dispositivo Bluetooth. .......................................................... 64
Figura 33 - Controle dos motores. ............................................................................. 65
Figura 34 - Tela de Configurao .............................................................................. 66

5 ndice de Tabelas

Tabela 1 - Principais modelos da famlia MCS-51 com especificao de ROM, RAM


e T/C. ........................................................................................................................ 22
Tabela 2 - Descrio e funcionamento da pinagem do 8051 .................................... 26
Tabela 3 - Funo bsica dos SFRs. ........................................................................ 30
Tabela 4 - Classificao dos dispositivos Bluetooth. ................................................. 34
Tabela 5 - Descrio da Pinagem do ADC0804 ........................................................ 45

6 Smbolos e Siglas

ADT: Android Development Tools


AFH: Adaptive Frequency Hopping
API: Application Programming Interface
CISC: Complex Instruction Set Computer
CLP: Controlador lgico programvel
CMOS: Complementary metal-oxide-semiconductor
CPU: Central Processing Unit
DC: Direct Current
EPROM: Erasable Programmable Read-Only Memory
FCE: Fora contra-eletromotriz
GFSK: Gaussian Frequency-Shift Keying
IDE: Integrated development environment
ISM: Industrial, Scientific and Medicine
LED: Light-emitting diode
PAN: Personal Area Networks
PC: Personal Computer
PCI: Placa de Circuito Impresso
PHP: Hypertext Preprocessor
RAM: Random Access Memory
ROM: Read Only Memory
SDK: Software Development Kit
SIG: Special Interest Group
SWT: Standard Widget Toolkit
TTL: TransistorTransistor Logic
USB: Universal Serial Bus
ULA: Unidade lgica e aritmtica

7 CAPTULO 1 - INTRODUO

Os

microcontroladores

esto

presentes no

cotidiano

da

populao,

conquistando cada vez mais espao em diversas aplicaes e ganhando cada vez
mais espao no mercado.
Nos sistemas eletrnicos, eles so responsveis pela diminuio das
dimenses dos equipamentos, gerenciam e controlam as tarefas internas, facilitam a
manuteno, tornam alguns sistemas mais baratos e robustos, alm de otimizar e
automatizar tarefas, facilitando a vida moderna.
Em questo de investimentos o microcontrolador fornece um excelente custobenefcio, sendo um componente verstil que se adqua a vrios tipos de aplicaes
diferentes, geralmente voltados para propsitos especficos.
Por possuir a maioria dos componentes necessrios para o desenvolvimento
de um sistema em um nico chip, torna muito mais vivel sua utilizao em vrios
projetos, deixando o sistema mais simples, barato e reduzido. Cada vez mais os
sistemas microcontrolados ganham mais destaque e importncia, sendo de suma
importncia em sistemas de automao e controle.
Neste contexto, propomos o desenvolvimento de um sistema microcontrolado
que manipule e controle um guincho. Este sistema microcontrolado dever
implementar um sistema de comunicao mvel baseado na tecnologia Bluetooth,
para que dispositivos mveis que possuam comunicao Bluetooth, enviem sinais
de controle para o sistema microcontrolado com o intuito de manipular um guincho.
A figura 1 resume as etapas de funcionamento do nosso projeto.

Figura 1 - Etapas de funcionamento do projeto.

16

Como podemos observar o projeto composto pelas seguintes etapas:

1. Um dispositivo que possua capacidade de comunicao wireless utilizando


o protocolo Bluetooth, envia o sinal de controle para o mdulo transceptor Bluetooth.
2. O mdulo Bluetooth envia os sinais recebidos do dispositivo mvel para o
microcontrolador AT89C52.
3. O microcontrolador recebe o sinal do mdulo Bluetooth e envia o sinal para
o L298N que ir movimentar o motor que passo para realizar os movimentos do
guincho. O motor de passo est acoplado ao guincho por engrenagens poder
movimentar o guincho na direo horizontal (horrio e anti-horrio) e vertical (para
cima e para baixo). O microcontrolador poder tambm ligar o eletrom se for
solicitado.
4. Os movimentos do brao do guincho iro mover o cursor do potencimetro,
variando a resistncia entre suas extremidades e a derivao central.
5. O ADC0804 vai converter os dados de analgico para digital, devido a
variao da resistncia dos potencimetros (sensores).
6. O sinal convertido para digital ser enviado pelo mdulo transceptor
Bluetooth para o dispositivo mvel, informando os movimentos e a posio atual do
brao do guincho.

7.1

Descrio da Parte Fsica do Guincho

O guincho utilizado no nosso projeto consiste em um brao mecnico que


realiza movimentos horizontais e verticais. Tal brao possui seu eixo central fixo, um
motor de passo que controla o movimento horizontal e outro motor de passo
responsvel pelo controle vertical. Foi adicionado um fim de curso no eixo vertical
para controlar a altura mxima do guincho.

Na extremidade do guincho est presente um eletrom que quando


energizado passa a produzir os mesmos efeitos magnticos de um m, com plo
norte e sul definidos, podendo ento atrair materiais ferromagnticos.
17

Foram instalados dois potencimetros lineares, sendo um para cada motor de


passo unipolar utilizado, com o intuito de controlar fielmente seus movimentos. O
microcontrolador da famlia MCS-51 utilizado, ir receber sinais de controle atravs
de um dispositivo mvel e ir movimentar o potencimetro, que est acoplado ao
motor de passo atravs de engrenagens. A figura 2 descreve os componentes e o
funcionamento do guincho, e a figura 3 mostra a conexo das engrenagens do
guincho.

Figura 2 - Descrio e funcionamento do guincho

Figura 3 - Conexo das engrenagens do guincho

18

7.2

Fluxo de Desenvolvimento do Projeto

Aps um estudo sobre a viabilidade do projeto, elaboramos um fluxo de


desenvolvimento a ser seguido, onde cada etapa posterior dependende das
anteriores.

Figura 4 - Fluxo de desenvolvimento do projeto

19

8 Captulo 2 - Microcontroladores

Um microcontrolador corresponde a um sistema computacional completo


alocado em um chip. Possui como componentes principais a Unidade Cental de
Processamento (CPU Central Processor Unit), memria de dados (memria RAM)
e de programa (ROM/PROM/EPROM), linhas de entrada e sada.

composto tambm por outros perifricos, que podem ou no ser utilizados


dependendo da aplicao, tais como, mdulos de temporizao, conversores A/D e
D/A, osciladores, codificadores, portas serial e paralela, modulao de largura de
pulso, entre outros.

A Figura 5 representa a arquitetura tpica de um microcontrolador, em que


todos os componentes esto alocados em um nico chip.

Figura 5 - Arquitetura tpica de um microcontrolador

20

8.1

Aplicaes de Microcontroladores

bastante vasta a aplicao dos microcontroladores no mundo atualmente,


ele est presente nos mais diversos dispositivos eletro-eletrnicos.

Na indstria est presente em CLPs, equipamentos de medio, controle de


processos, esteira de cho de fbrica.

Nos automveis esto presentes nos alarmes contra roubo, GPS,


computadores de bordo, injeo eletrnica, etc.

Nas residncias, esto presentes nos fornos microondas, nas mquinas de


lavar, porto eletrnico, porta retrato digital, brinquedos, eletrnicos, etc.

No cotidiano est presente em elevadores, alarmes de incndio, caixas


eletrnicos, leitores de cdigo de barras, chaveiro localizador, celulares, sensores,
cmeras de segurana, etc.

21

9 CAPTULO 3 A FAMLIA MCS-51

9.1

Introduo Histrica

A famlia MSC-51 teve sua origem a partir da MCS-48 (lanada pela INTEL
em 1976), que foi a primeira famlia de controladores lanada pela INTEL. Por no
ser to limitada quanto seu antecessor e nem to cara como a MCS-96,
praticamente a famlia de controladores mais usada e popular atualmente.
Atualmente diversos fabricantes produzem o 8051, tais como AMD, Atmel, Dallas,
OKI, Matra, Philips, Siemens, entre outros.
Tem como membro original o microcontrolador 8051, que tambm o ncleo
para toda a MCS-51.
Seus principais modelos so:
Tabela 1 - Principais modelos da famlia MCS-51 com especificao de ROM, RAM e T/C.

Modelo

ROM

RAM

Temporizadores/
Contadores

8031

sem ROM (ROMLESS)

128 bytes de RAM

2 T/C

8051

com 4KB de ROM

128 bytes de RAM

2 T/C

8751

com 4KB de EPROM

128 bytes de RAM

2 T/C

8032

sem ROM (ROMLESS)

256 bytes de RAM

3 T/C

8052

com 8KB de ROM

256 bytes de RAM

3 T/C

8752

com 8KB de EPROM

256 bytes de RAM

3 T/C

9.2

Por que usar o 8051

Optamos pelo uso do 8051 devido s seguintes vantagens:

Por ser um microcontrolador de baixo custo e de alto nvel de


integrao, podendo assim montar um sistema completo funcional fazendo
uso de poucos componentes.
22

o microcontrolador mais popular atualmente, oferecendo um


amplo suporte e de fcil aquisio.

Oferece um amplo conjunto de instrues por ser um


microcontrolador CISC (Computador com um Conjunto Complexo de
Instrues), sendo muito utilizado em inmeras aplicaes desde um simples
programa que faz piscar um LED, at programas mais complexos, como um
controlador robtico manipulado via Bluetooth.

Bastante usado no meio acadmico, pois proporciona economia


real em termos de custo de ferramentas, treinamento alm de possuir
softwares livres que compilam e simulam o funcionamento do circuito.

rpido e eficaz, pois a sua arquitetura se correlaciona de perto


com o sistemas de controle, e menos bytes precisam ser buscados e menos
jumps

condicionais

so

processados,

por

suas

instrues

serem

especializadas.

Possui

aperfeioamentos

constantes,

como

aumento

da

velocidade e melhorias na manufatura, sendo produzido por diversos


fabricantes, e possui centenas de variedades, que so compatveis por
possurem o mesmo ncleo de arquitetura.

9.3

Principais Caractersticas Comuns da famlia 8051

CPU de 8 bits
128 bytes de RAM interna
4 portas bidirecionais de I/O de 8 bits cada (P0, P1, P2 E P3),
com bits individualmente endereveis.
Memria de dados externa e memria de programa externa com
capacidade de at 64KB cada.
23

Frequncia de clock de 1 at 12MHz.


2 temporizadores /contadores de 16 bits
1 canal de comunicao serial
5 fontes de interrupo, com dois nveis de prioridade
selecionveis por software. Das 5 fontes de interrupo, duas so
timers, duas externas e mais o canal de comunicao serial.
Oscilador de clock interno
Arquitetura CISC, que permite executar operaes aritmticas e
lgicas mais complexas.

Os diversos fabricantes do 8051, adicionam algumas caractersticas


especiais, alm das caractersticas comuns todos modelos do 8051, de acordo
com a aplicao e o mercado que se destinam. As caractersticas especiais da
famlia 8051 que podem ser adicionadas esto especificadas na figura 6.

Figura 6 - Caractersticas Especiais da Famlia MCS-51

9.4

Arquitetura Interna 8051

O microcontrolador da famlia MCS-51 possui todos os componentes


relevantes para se obter um sistema em um nico chip, como podemos observar
24

pela figura 7. A CPU de 8 bits controla as memrias, as portas bidirecionais, a parta


serial, os contadores/temporizadores, interrupes e barramentos.
O oscilador responsvel por gerar o clock que define a frequencia de
funcionamento do microcontrolador, j o controle de interrupo auxilia a CPU
quando for gerada uma interrupo externa, ou do canal serial, ou dos
contadores/temporizadores.

Figura 7 - Arquitetura Interna do 8051

9.5

Configurao e descrio dos pinos do 8051

A figura 8 demonstra a localizao dos pinos do microcontrolador baseado na


famlia MCS-51, ela relaciona o nome do pino com a sua real localizao nos pinos
do 8051. J a tabela 2, descreve o funcionamento dos pinos tpicos de qualquer chip
baseado no 8051.

25

Figura 8 - Pinagem do 8051


Tabela 2 - Descrio e funcionamento da pinagem do 8051

Nome do Pino

Numerao

Descrio / Funcionamento

Porta P0 (P0.0
a P0.7)

39 a 32

A porta P0 corresponde a uma porta bidirecional


de entrada e sada de 8 bits de dreno aberto.
Se escrever o nvel lgico 1 nas em qualquer
pino da porta P0, eles flutuam, podendo assim esses
estados serem usados como entradas de alta
impedncia.
Fornece
multiplexada
a
parte
menos
significativa do barramento de endereo (A0 a A7) e
do barramento de dados (D0 a D7) durante o acesso a
uma memria de programa ou de dados externa.
Portanto se estiver sendo usada como um
barramento de endereos, a porta P0 no poder ser
usada como uma porta bidirecional de entrada e sada.

Porta P1 (P1.0
a P1.7)

1a8

A porta P1 corresponde a uma porta bidirecional


de 8 bits para entra e sada co pull-ups internos. O
resistor de pull-up fornece uma corrente de entrada em
nvel baixo se aplicar um nvel lgico zero.
Se colocarmos a porta P1 para funcionar como
entrada, os seus pinos so externamente elevados
para o nvel lgico zero, que acaba fornecendo
corrente devido aos pull-upss internos dos pinos.

Porta P2 (P2.0
a P2.7)

21 a 28

A porta P2 corresponde a uma porta bidirecional


de 8 bits para entra e sada co pull-ups internos.
Pode ser usada como sada ou como parte mais
significativa do endereo que necessrio quando se
deseja acessar a memria externa. Recebe o byte
mais significativo do endereo durante a verificao da
ROM e da EPROM e durante a programao da
EPROM.
26

Porta P3 (P3.0
a P3.7)

10 a 17

A porta P3 tambm pode ser usada como uma


porta bidirecional de entrada e sada de 8 bits.
Porm, se o Latch da porta P3 estiver em nvel
lgico um, a sua sada ser controlada pelo sinal de
Funo de Sada Alternativa. Assim a pinagem da
porta P3 passa a ter as seguintes funes especiais:
P3.0: Entrada Serial
P3.1: Sada Serial
P3.2: Interrupo 0
P3.3: Interrupo 1
P3.4: Contador 0
P3.5: Contador 1
P3.6: Sinal de Escrita
P3.7: Sinal de Leitura

Fonte de
alimentao Vcc

40

Entrada do positivo da fonte de alimentao

Terra - Vss

20

Entrada do Terra (GND)

Reset

Pino de entrada do Reset do circuito. Enquanto


o oscilador interno estiver sendo executado, se
mantivermos o nvel lgico um no pino de reset por 2
ciclos de mquina, ele inicializa alguns registradores
internos com os valores predefinidos de fbrica,
resetando o dispositivo.

Adress Latch
Enable

30

Responsvel por controlar a demultiplexao de


dados ou endereo da Porta P0.
Indica a um dispositivo externo quando ele deve
capturar o sinal de endereo e os dados que devem
ser multiplexados no tempo.
Pode ser utilizado para fins de clock ou de
temporizador externo.

Program Store
Enable

29

Sinal de leitura para a memria de programa


externa.

XTAL1 e
XTAL2

18 e 19.

Conexo do cristal para funcionamento do


oscilador de clock interno.

External
Access Enable

31

Se ligado ao terra, habilita a busca na memria


de programa externa (0000h a FFFFh).
Se estiver no nvel lgico alto, executa apenas
os primeiros 4K na memria ROM interna.

27

9.6

ORGANIZAO DA MEMRIA

O 8051 no segue a arquitetura de Von Newmann em que a memria de


dados e de programa podem ser armazenadas no mesmo espao de memria, ele
adota o modelo de arquitetura de Harward podendo assim ter dados e programas
alocados em memrias distintas.
As memrias de dados e de programa, que so denominadas memrias
externas, podem conter at 64KB cada. A utilizao ou no dos 4KB da ROM interna
do microcontrolador vai ser definida pelo nivel lgico do pino EA (External Access
Enable). Se EA=0, ento os 64KB de memria sero a de programa externa. Se
EA=1, ento teremos 4KB de ROM interna mais 64KB de memria de programa
externa.
Para acessar a memria de programa externa, so emitidos endereos de 16
bits (0h Fh), sacrificando ento as porta P0 e P2 quando se deseja fazer uso da
memria de programa externa.

9.6.1 Memria RAM Interna

O 8051 fornece uma memria de dados interna com um mnimo de 128 bytes,
com isso para muitas aplicaes que no necessitam de grande quantidade de
memria, no h a necessidade de fazer uso da RAM externa.

De acordo com a figura 8, a memria interna dividida em trs blocos


fisicamente distintos, sendo dois deles blocos de RAM de 128 bytes cada,
mapeados nos endereos 00H-7FH e 80H-FFH, tambm tem os registradores de
funes especiais, que esto endereados na faixa de 80H-FFH. O modo de
endereamento acessa de maneira distinta o bloco superior e o de registradores de
funes especiais, que possuem o mesmo endereo.

28

Figura 9 - Memria RAM do 8051.

9.6.2 Memria RAM Externa

Conforme explicado anteriormente, a memria de dados externa pode ocupar


at 64KB. Porm, como a faixa de endereo da memria de programa e da memria
de dados interna, que corresponde de 00h FFh, a mesma, h conflitos no
endereamento.
Tal conflito pode ser resolvido de duas maneiras. Um corresponde a ativao
ou no do sinal PSEN (Program Store Enable), responsvel pela leitura na memria
de programa. O hardware utiliza esse sinal para habilitar o banco de memria
correspondente. A outra forma corresponde utilizao das instrues MOV e
MOVX, sendo que a MOV utilizada para acessar a memria de interna, e a MOVX
para acessas a memria externa.

9.7

REGISTRADORES DE FUNES ESPECIAIS

Os Registros de Funo Especial (SFRs - Special Function Registers) so de


suma importncia no do controle do 8051. Os registradores podem ser endereados
29

a byte atravs do endereo correspondente (exemplo: MOV P0, #2FH), ou atravs


do nome (exemplo: MOV DPL, DPH).
Est descrito na tabela 3, os registradores especiais com seu endereo na
RAM ao lado, e a descrio de sua funo bsica.
Tabela 3 - Funo bsica dos SFRs.

Registrador de Funo
Especial

Funo bsica

P0 (80H), P1 (90H), P2 Corresponde aos endereos na RAM que contm os


(A0H) e P3 (B0)
dados das 4 portas de I/O do micro, caso as mesmas
sejam utilizadas com essa finalidade. Ao realizar uma
escrita em um desses registros, o contedo presente na
sada do pino ser automaticamente alterado.
Ao realizar uma leitura dos mesmos, coloca o estado atual
do pino em um desses registradores.
SP (81H)

o apontador de pilha (Stack Pointer), que aponta para o


topo da pilha, ou seja, indica o ltimo endereo que foi
armazenado na pilha.

DPL (82H) e DPH (83H) Em conjunto formam o DPTR,


endereamento indireto de 16 bits.

utilizado

para

PCON (87H)

O registro PCON (Power Control) permite controlar o


consumo de energia do microcontrolador com segurana.

TCON (88H) e TMOD


(89H)

Registros responsveis pelo Controle e de Modo de


Operao dos Temporizadores/Contadores, permitindo a
programao dos mesmos.

TL0 (8AH), TH0 (8CH), So os registros que contem os valores a serem contados
TL1 (8BH) e TH1 (8DH) dos Temporizadores/Contadores (T0 e T1).
SCON (98H) e SBUF
(99H)

SCON permite trabalhar com a porta de comunicao


serial e o SBUF armazena os dados recebidos e escreve
os dados transmitidos.

IE (A8H) e IP (B8H)

Registro para programao (habilitao/desabilitao,


prioridade etc.) das interrupes.

PSW (D0H)

O PSW (Program Status Word - palavra de status do


programa) responsvel pelo registro dos Flags do 8051,
indica as operaes que ocorreram na ALU e o banco de
registradores que foi acessado por ltimo.

ACC (E0H)

o acumulador. acessvel como posio de memria.

B ( F0H)

Registro auxiliar B. acessvel como posio de memria.

30

9.8

CONJUNTO DE INSTRUES

A famlia MCS-51 apresenta um total de 111 instrues, sendo elas


aritmticas, lgicas, booleanas, transferncia de dados e de desvios. As instrues
so otimizadas para melhorar o desempenho das aplicaes de 8 bits. Abaixo esto
relacionados exemplos de instrues e o seu tipo correspondente.
MOV A, 20h; move para o acumulador o dado presente no endereo
20h - Instruo de transferncia de dados.
INC 23h; incrementa o contedo da memria RAM de endereo 23h Instruo Aritmtica.
ORL P1, A; seta os pinos de P1 segundo os valores dos bits do
acumulador - Instruo Lgica.
JB P3.4, T0_ON; testa se a entrada do temporizador 0 est setado Instruo booleana.
SJMP 00h; desvia para a prxima instruo (offset = 0) - Instruo de
desvio.

31

10 CAPTULO 3 BLUETOOTH

Bluetooth um padro global para a comunicao sem fio de curto alcance,


automtico e de baixo consumo de energia. Para isso ela usa ondas de rdio
freqncia, para substituir todo o cabeamento necessrio para trocar dados entre
dispositivos eletrnicos.

Dentre suas principais vantagens citamos: elevados nveis de segurana,


baixo custo efetivo, baixo consumo de energia ao manter a potncia de transmisso
em nveis bem baixos, comunicao simples e eficiente, alm de fornecer servios
sncronos (como voz sobre ip), e assncronos (como transferncias de arquivos).

A histria do Bluetooth comea em 1994, quando a Ericsson estudava a


viabilidade de transmitir dados entre celulares usando rdio frequencia no lugar nos
cabos convencionais, resultando no MCLink que um sistema de rdio de curto
alcance. Aps o lanamento a Intel, IBM, Toshiba e Nokia se uniram a Ericsson e
criaram o consrcio Bluetooth SIG (Special Interest Group).

Com empresas das mais diversas tecnologias pertencentes ao consrcio SIG,


tornou-se possvel a interoperabilidade da tecnologia nos mais diversos tipos de
aparelhos eletrnicos. O SIG uma organizao privada sem fins lucrativos, e
responsvel por proteger os direitos da marca Bluetooth, publicar especificaes,
administrar a qualificao do programa e difundir o uso da tecnologia de
comunicao sem fio.

O Bluetooth opera na faixa ISM (Industrial, Scientific, Medical), que opera


freqncia de 2,45 GHz, ela est livremente disponvel e no licenciada na maioria
dos pases, a sua faixa de operao varia de 2,4 GHz a 2,5 GHz. Por operar em
uma banda que no licenciada, ocorrem interferncias com outros aparelhos
operantes na mesma faixa, por isso se utiliza a tcnica de saltos adaptativos em
frequncia (Adaptive frequency hopping AFH)

com o intuito de diminuir tal

interferncia.

32

O AFH detecta os outros dispositivos no espectro e evita as frequncia que


eles esto utilizando, para isso ele divide a faixa em 79 canais e muda de canal
regularmente podendo mudar at 1600 vezes por

segundo. Com isso qualquer

interferncia que ocorrer dura em frao de segundo.

Os sistemas Bluetooth podem, atravs dessas faixas de alcance,

formar

pequenas redes privadas conhecidas como PANS (Personal Area Networks Redes
de rea Pessoal) ou piconets. Uma piconet uma rede formada por at oito
dispositivos, assim cada aparelho dotado da tecnologia Bluetooth pode comunicar
com at outros 7 aparelhos da mesma piconet. A piconet formada
automaticamente medida que os aparelhos saem e entram na cobertura da
piconet.

O dispositivo Bluetooth que iniciar a conexo assume o papel de master


(mestre), enquanto que os demais dispositivos se tornam slave (escravos), com isso
em cada piconet deve haver um master e no mximo sete slaves.
Um dispositivo pode fazer parte de mais de uma piconet ao mesmo tempo,
como por exemplo na figura 10, o mesmo dispositivo escravo na piconet A (slave
A3) e na piconet B(slaveB3). Desta forma ocorre a formao de uma scatternet,
onde uma piconet se comunica com outra dentro de um limite de alcance.

Figura 10 - Duas piconets formando uma scatternet, com um dispositivo escravo em comum.

33

O raio de operao da piconet vai depender dos dispositivos que esto sendo
utilizados. Tais dispositivos so classificados em trs categorias, de acordo com a
tabela 4.
Tabela 4 - Classificao dos dispositivos Bluetooth.

Classe

Alcance

Potncia

Classe 1

Longo alcance (100 m)

Entre 1 mW e 100 mW

Classe 2

Curto alcance (10 m)

Entre 0,25 mW e 2,5 mW

Classe 3

Curtssimo (1 m)

At 1 mW

10.1

Processo de estabelecimento de conexes

Assim que um dispositivo Bluetooth detectar outro, este assume o papel de


master e passa a gerenciar a conexo sobre o outro dispositivo que assume o papel
de slave. O master pode realizar a conexo de duas maneiras:
1. Comando Inquiry - utilizado quando no conhecido o nmero de
identificao ou endereo dos slaves. Permite que descubra quais os dispositivos
que esto ao alcance do master.
2. Comando Page - utilizado assim que o endereo do slave for obtido e tem
a funo de completar o estabelecimento da conexo. Quando for estabelecida a
conexo os dispositivos Bluetooth trocam pacotes entre si para sincronizar seus
relgios, definir a identificao de cada dispositivo e controlar a troca de mensagens.

Depois de estabelecida a conexo o dispositivo pode assumir os seguintes


estados:
Estado de Espera: Quando o dispositivo est ligado mas ainda
no se conectou a uma piconet.
Estado de Solicitao: Quando um dispositivo envia requisies
para encontrar outros que estejam ao seu alcance e que ele pode se
conectar.
Estado de Pgina: Estado onde h um envio de mensagens para
encontrar outros dispositivos que possam entrar ao alcance na sua piconet, e
apenas dispositivos mestres podem ficar neste estado de pgina.
34

Estado Conectado: Assim que for estabelecida a conexo, e um


dos dispositivos assumir o papel de mestre e o outro de escravo.
Estado de Transmisso: Estado em ocorre a transmisso de
dados de um dispositivo a outro. Depois da transmisso, retorna-se ao estado
conectado.
Estado de Escuta: Quando o escravo fica inativo por uma
quantidade definida de slots.
Estado bloqueado: Semelhante ao estado de escuta, porm no
ocorre transferncia de dados.
Estado estacionado: Um dispositivo entra nesse estado quando
perde o seu endereo atual na piconet.

A figura 11 mostra o conjunto de estados que um dispositivo Bluetooth pode


encontrar, assim que for estabelecida a conexo.

Figura 11 - Conjunto de estados dos dispositivos Bluetooth.

35

11 DISPOSITIVOS UTILIZADOS

11.1

AT89C52

O AT89C52 um microcontrolador baseado no 8051, que possui uma CPU


de 8 bits de alta performance baseado na tecnologia CMOS, possui baixo consumo
de energia, e 8 KB de EPROM.

O dispositivo produzido usando a tecnologia de memria no-voltil de alta


densidade, e compatvel com os padres de pinagem e conjunto de instrues do
80C51 e 80C52. O Flash on-chip permite a memria de programa ser reprogramada
no sistema, ou por um programador convencional de memria no-voltil.

Atravs da combinao de uma CPU de 8 bits verstil com flash em um chip


monoltico, o AT89C52 um poderoso microcomputador que fornece uma soluo
altamente flexvel e de baixo custo para a maioria das aplicaes de controle
embarcados.

O AT89C52 foi projetado com lgica esttica para operar com freqncias
prximas de zero, e possui dois modos de economia de energia selecionveis por
software. O modo de espera interrompe a CPU enquanto permite que a RAM,
temporizadores/contadores, a porta serial, e o sistema de interrupo permaneam
funcionando. O modo de desligamento salva o contedo da RAM, mas congela o
oscilador, desabilitando todas as outras funes do chip, at o prximo sinal de reset
do hardware.

Caractersticas:
Compatvel com produtos de MCS-51
8KB de memria Flash reprogramvel
Operao inteiramente de esttica: 0 hertz a 24 megahertz
Fechamento em trs nveis da memria do programa
RAM interno de 8 bits de 256 x
36

32 linhas programveis de entrada/sada


Trs temporizadores/contadores de 16 bits
Oito fontes da interrupo
Canal de comunicao serial programvel
Baixo consumo de potncia no estado de espera e modo de desligamento

11.1.1 Memria de Dados

O AT89C52 implementa 256 bytes de RAM on-chip. Os 128 bytes superiores


ocupam um espao de endereamento paralelo ao dos registradores de funo
especiais (Special Function Registers).

Isso significa que os 128 bytes superiores possuem o mesmo endereo que
os Registradores de Funes Especiais, mas esto fisicamente seprados no espao
de memria.

Quando uma instruo acessa um endereo de memria interno abaixo do


endereo 7FH, o modo de endereamento usado na instruo especifica se a CPU
deve acessar os 128 bytes superiores da memria RAM ou o espao de
endereamento dos registradores de funo especiais.

Por exemplo a instruo seguinte que usa o modo de endereamento direto


no endereo 0A0H (correspondente a P2)

MOV 0A0H, #data

Instrues que usam o modo de endereamento indireto acessam os 128


bytes superior da RAM.
Por exemplo a instruo abaixo que usa endereamento indireto, onde R0
contem 0A0H, que acessa os dados do endereo 0A0H em vez de P2 cujo endereo
tambm 0A0H.

MOV @R0, #data


37

Podemos

observar

que

as

operaes de

pilha

so

exemplos

de

endereamento indireto, ento os 128 bytes de dados da RAM esto disponveis


como espao de pilha.

A figura 12 representa o mapa dos Registradores de Funo Especiais e os


valores de Reset do AT89C52.

Figura 12 - Mapa dos SRF e seus valores de Reset

38

11.2

MOTOR DE PASSO

11.2.1 Definio
Os Motores de Passo so dispositivos eletro-mecnicos sncronos, que
possuem a funo de converter pulsos digital de algum sinal (geralmente sinais
eltricos) em movimentos mecnicos rotativos bem preciso, gerando variaes
angulares discretas. Os motores de passo podem ser aplicados em sistemas de
malha aberta, ou seja, sem qualquer controle de realimentao, e possuem trs
tipos bsicos: de relutncia varivel, m permanente e hbridos.

Relutncia Varivel
Consiste de um rotor de ferro, com mltiplos dentes e um estator com uma
quantidade especifica de enrolamentos. Se energizarmos os enrolamentos do
estator com corrente DC os plos cam magnetizados. A rotao ocorre quando os
dentes do estator so atrados para os plos do estator energizado, para que o
sistema tenha o circuito com menor relutncia.
m Permanente
Possuem baixo custo e baixa resoluo e baixo torque. O rotor construdo
com ms permanentes e no possui dentes. Os plos magnetizados do rotor
provm uma maior intensidade de uxo magntico exibindo ento uma melhor
caracterstica de torque.
Hbrido
Mais caro do que os demais, porm possui melhor desempenho com respeito
resoluo de passo, torque e velocidade. O rotor multi-dentado e contem um m
permanente ao redor do seu eixo. Para aplicaes que exigem um controle bem
rgido e um ajuste fino de posicionamento, em mquinas de pequena e mdia
dimenso, os motores de passo hbrido so os mais utilizados devido sua tima
relao custo/benefcio.

O motor de passo diferencia da maioria dos motores eltricos devido a sua


capacidade de controlar movimentos de forma bem precisa, sendo amplamente
usados em impressoras, robs e na automao industrial.
39

A preciso de movimento aliado ao seu torque, a capacidade de atingir uma


boa velocidade, a boa resposta a acelerao e desacelerao, e por seguir uma
lgica digital, fez do motor de passo o mais vivel para o nosso projeto de controle
do guincho.
Os motores de passo possuem como componentes o rotor e o estator. O rotor
o conjunto eixo-im que rodam solidariamente na parte mvel do motor, e o estator
correspondem a trave fica onde so enroladas as bobinas.
Se aplicarmos uma seqncia definida de pulsos eltricos nos terminais do
motor, o rotor de um motor de passo rotacionado em incrementos angulares
especficos, denominados passos.
Abaixo especificamos os principais parmetros dos motores de passo e com o
que esto relacionados.

11.2.2 Parmetros dos motores de passo:

Rotao do motor: diretamente relacionado com os impulsos eltricos


recebidos.
Direo: relacionado com a seqncia que pulsos eltricos so
aplicados. Invertendo a seqncia dos pulsos, muda-se a direo de rotao
do motor.
Velocidade: relacionado com a freqncia de pulsos recebidos. Quanto
menor o intervalo entre os pulsos maior a velocidade, e vice-versa. O intervalo
no deve ser inferior a 10ms entre cada passo, pois geralmente o motor
perder o torque e em vez de rodar, ir vibrar.
ngulo rotacionado: relacionado com o nmero de pulsos aplicados.

O motor de passo utilizado o 23LM-C004, que corresponde a um motor de


passo unipolar, com tenso de 6V/fase, corrente de 1,2A/fase e deslocamento
angular de 1,8graus/fase.
Por ser unipolar caracterizado por ter 2 enrolamentos por fase sendo que a
corrente atravessa em um sentido em cada enrolamento, e possui uma derivao
central (center-tape) em cada uma das bobinas.

40

Essa derivao central usada para alimentar o motor, e o motor de passo


basicamente controlado aterrando seus enrolamentos. O aterramento feito por
um circuito controlador e um driver, para que conforme acionado possa produzir uma
rotao contnua em alguma direo. O circuito de controle pode inverter o sentido
rotao do motor (horrio/anti-horrio) e at mesmo variar a sua velocidade.
Para que o motor de passo funcione corretamente, a alimentao deve ser de
forma seqencial (energizando as bobinas em uma ordem especfica) e repetida
(para que execute o movimento contnuo, definido pelo nmero de passos).

11.2.3 Ponte H

Os motores de passo podem ter seu sentido de rotao invertido, apenas


mudando o sentido dos pulsos eltricos aplicados no mesmo, ou seja se invertermos
o sentido da corrente eltrica que atravessa as bobinas do motor.
Poderamos ento inverter a polaridade dos terminais eltricos de um circuito,
que conseqentemente inverteria o sentido da corrente. Para inverter a polaridade
eltrica poderamos usar chaves, no qual se estiverem devidamente usadas para
este propsito controlariam facilmente o sentido do motor.
Porm como a maioria dos motores de passo so usados em processos
automatizados, o uso de chaves torna-se inadequado, para resolver este problema
podemos inserir transistores no circuito para poder controlar a corrente eltrica sem
o uso de partes mveis.
A Ponte H um circuito transistorizado que visa controlar esse sentido de
corrente, permitindo que um determinado motor rode tanto no sentido horrio quanto
no anti-horrio, e o seu nome "ponte H" devido ao formato do circuito quando
montado.
Para construir um circuito Ponte H chaveado, basta ligar conforme a figura 13,
na qual um par de chaves so acionadas de forma alternada (S1 e S4 ou S2 e S3)
para inverter o sentido da corrente.
De acordo com a figura 13, se as chaves S1 e S4 estiverem fechadas e as
chaves S2 e S3 abertas, uma tenso positiva ser aplicada no motor, j se as
chaves S1 e S4 estiverem fechadas e S2 e S3 estiverem abertas, uma "tenso
negativa" ser aplicada ao motor, invertendo o sentido da corrente. Nesta
41

configurao, as chaves S1 e S2 nunca podero ser fechadas ao mesmo tempo,


pois isso ocasionaria um curto-circuito da fonte de tenso, de forma anloga as
chaves S3 e S4 no podem ser fechadas ao mesmo tempo.

Figura 13 - Ponte H chaveada

Para construir uma ponte H automatizada podemos utilizar qualquer


dispositivo que simule uma chave, como transistores, rels ou mosfets. No nosso
projeto usamos transistores que quando estiverem no corte funcionam como uma
chave fechada, e quando estiverem saturados funcionam como uma chave aberta.
A presena de diodos entre os transistores serve de proteo devido FCE
(fora contra eletromotriz) que gerada pelo motor durante a partida e durante as
paradas, e serve tambm para controlar a circulao da corrente como no caso do
motor deixar de funcionar, fazendo com que a corrente volte para a fonte de
alimentao.
Capacitores podem ser adicionados para minimizar picos de tenso nas
bobinas do motor, evitando faiscamento nas escovas. Alm disso, serve tambm
para filtrar rudos de alta-freqncia e minimizar interferncias em equipamentos de
RF.

Figura 14 - ponte H automatizada.

42

11.3

Mdulo Bluetooth RS232 TTL

um mdulo transceptor criado para permitir a comunicao sem-fio entre


dispositivos utilizando o protocolo Bluetooth. interessante para a comunicao de
um dispositivo como um guincho e outros dispositivos mveis para mandar
mensagens de controle, pois ele permite que o dispositivo de destino envie e receba
dados TTL (Lgica Transistor-Transistor) usando o protocolo Bluetooth sem a
necessidade de cabos seriais.
Caractersticas:

Fcil de usar e completamente encapsulado.


Chipset da CSR (empresa pioneira em projetos que usam Bluetooth).
Bluetooth de classe 2 (possui um alcance de at 10 metros e um
consumo de potncia entre 0,25 mW e 2,5 mW) .
Modulao: GFSK (Gaussian Frequency Shift Keying), que a tcnica
de modulao mais usados nos sistemas Bluetooth, pois fornecem uma
melhor eficincia espectral.
Opes de Segurana: Autenticao e encriptao
Baud Rate definido pelo usurio: 1200, 2400, 4800, 9600, 19200,
38400, 57600, and 115200.
Tenso: de 3,6 at 6V.

No nosso projeto necessrio usar apenas 4 pinos do mdulo Bluetooth, que


so: Vcc, Terra(GND), Tx (transferncia de informao) e Rx (recebimento de
informao), conforme a figura 15.

43

Figura 15 - Pinos usados do mdulo Bluetooth.

11.4

Conversor A/D (ADC0804)

Um conversor analgico-digital um dispositivo eletrnico capaz de converter


grandezas analgicas em digital (zeros e uns).

O conversor ADC0804 usado em nosso projeto, um circuito integrado


produzido pela National Semicondutor que um dos maiores fabricantes de
semicondutores, circuitos integrados, processadores embutidos e softwares e
ferramentas de apoio, sediada na Califrnia EUA.

O ADC0804 converte amostras analgicas (de 0 a 5 Voltz), em um valor


binrio de 8 bits, baseado em CMOS, converte os valores por aproximao, baseado
em

uma

escada

diferencial

potenciomtrica.

No

necessrio

nenhum

interfaceamento lgico, pois o conversor visto como endereo de memria ou


portas de entrada/sada pelo microprocessador.

Entradas analgicas diferenciais de tenso permitem o aumento da rejeio


de modo comum e compensando o valor zero analgico da tenso de entrada. Em
compensao a tenso de referncia pode ser ajustada para permitir a codificao
de qualquer tenso analgica para a sua respectiva resoluo de 8 bits.

A sua sada poder assumir valores entre 0 a 255 decimal (ou de 00000000
at 11111111 binrio), sendo equivalente a 5V podendo ser convertidos em valores
44

mltiplos de 1*0,0195V=19,5mV at 255*0,0195V= 4,99V, conforme o esquema da


figura abaixo.

Figura 16 - Clculo de resoluo do ADC.

11.4.1 Caractersticas:

Interface fcil e simples com todos os microprocessadores, ou opera no


modo "stand alone". Interface lgica no requerida e tempo de acesso de 135
ns.
Entradas de tenso analgica diferencial
Funciona com 2.5V (tenso de referncia), com mximo de 6,5V
Corrente de alimentao de 1,3mA (tpica), 2,5mA (mxima)
Gerador de clock interno (on chip)
Chip moldado com 20 pinos
Nenhum ajuste zero.
Fornece de 0 at 5V a partir de uma nica alimentao de 5V.

Caractersticas da Pinagem do ADC0804:


Tabela 5 - Descrio da Pinagem do ADC0804

Pinos
VIN(+) e VIN(-)
DB0 a DB7

Funo/Descrio
Entradas analgicas diferenciais
Sadas digitais
45

/CS (entrada)

Seleo do Chip quando em nvel "0"

/RD (entrada)

Habilita leitura disponibilizando os dados na sada quando em


nvel "0"

/WR (entrada)

Comanda incio de converso quando em nvel "0"

CLOCK IN
(entrada)
/INTR (sada)

Terminal de malha RC
Sinal indicando fim de converso quando comutado para nvel "0"

AGND

Terra analgico

DGND

Terra digital

VREF/2

Tenso de referncia no valor da metade de V+, para correo


de fundo de escala

CLOCK R
(entrada)
V+ ou VREF

Segundo terminal para gerao de clock interno


Tenso de alimentao

11.4.2 Funcionamento:

O conversor possui 2 entradas analgicas diferencias VIN(+) e VIN(-), fora do


modo livre uma ligao do pino 3 (/WR) com o pino 5 (/INTR) providencia um sinal
de incio de converso. Uma tenso de referncia VRE/2 de preciso pode corrigir
um erro no fundo de escala do conversor. O seu terminal /CS capaz de habilitar o
dispositivo em um endereamento de I/O para dispositivos externos pela CPU.

O pino /RD habilita diretamente a sada colocando os dados no barramento


do sistema. O sinal de clock gerado internamente bastando apenas a colocao de
um resistor e um capacitor externo, sua freqncia ser determinado pela frmula
abaixo.

Onde: R o valor da resistncia, C o valor da capacitncia.


Observao: O valor do resistor recomendado pelo fabricante de 10K.

46

11.4.3 Converter a entrada analgica e ler a sada do ADC0804.

1. Faa CS = 0 e envie um pulso de alta para baixa o pino WR para iniciar a


converso.
2. Continue monitorando o pino INTR. INTR ser 1 se a converso estiver concluda,
e ser 0 se a converso ainda no estiver terminada.
3. Se a converso no est terminada (INTR = 0), aguarde at que esteja terminado.
4. Se a converso for concluda (INTR = 1), v para o passo seguinte.
5. Fazer CS = 0 e enviar um pulso de alta para baixa para o pino RD para ler os
dados a partir do ADC (trazer os dados convertidos para os pinos de sada).

Figura 17 - Interface do ADC 0804 com o 8051.

A figura 17 acima mostra o esquema usado para fazer o interfaceamento


ADC0804 com o 8051. Basicamente o circuito converte uma entrada analgica de
tenso (Vin) em dados digitais e exibe este resultado sobre os 8 LEDs que esto
ligados na porta P0 do microcontrolador.
47

Se a tenso de entrada Vin for 5V, todos os LEDs acendero representando


255 em binrio que equivale a 11111111, e a cada queda de tenso de 19,5mV
(referente ao clculo da resoluo) far com que os LEDs representem uma unidade
a menos referente ao valor mximo de 255 em decimal.

Neste esquema a porta P1 do microcontrolador est funcionando como


entrada e a porta P0 est funcionando como sada. E os sinais de controle INTR,
WR, RD e CS, esto respectivamente conectados aos pinos P3.4 a P3.7 do
microcontrolador. O resistor R9 e o capacitor C1 esto associados com o circuito de
relgio interno do ADC, os resistores R1 a R8 so limitadores de corrente, j o
resistor R10 forma um divisor de tenso, que aplicado aos pinos de entrada
analgica do ADC.
11.5

ULN2803

O CI ULN2803 tem 8 entradas que podem controlar at 8 sadas. Um CI


ULN2803 pode controlar at 2 motores de passo simultaneamente.

Figura 18 - CI ULN2803.

Como podemos observar na figura 18, o CI ULN2803 contm 8 transistores


com emissores comum e diodos de supresso integral para cargas indutivas. Cada
transistor comporta uma corrente de carga de pico de 500mA contnuo, e pode
48

suportar pelo menos 50V no estado desligado. As sadas podem ser configuradas
em paralelo para suportarem uma corrente maior.

Possui um resistor de entrada 2.7kW para 5V TTL e CMOS. Apresentam um


pino de sada oposto ao de entrada para simplificar o layout da placa.
11.6

Potencimetro

Potencimetros so dispositivos eltricos formados por resistores variveis


com uma derivao central, sendo que a resistncia entre os terminais extremos
(valor nominal) fixa, como por exemplo, 10K (usado em nosso projeto).
J a resistncia entre a derivao central e um dos terminais extremos vai ser
definido pelo posicionamento do cursor, podendo ser ajustada de um valor muito
baixo de resistncia (aproximadamente 0) at o seu valor nominal. A figura 19
mostra as principais partes de um potencimetro linear.

Figura 19 - Partes de um potencimetro linear.

49

Os potencimetros mecnicos possuem internamente uma pista de material


resistivo (carbono, cromo, nquel, etc) por onde desliza o cursor, se a resistncia
entre a derivao central e uma das extremidades variar linearmente com relao ao
movimento do cursor, o potencimetro dito linear. A figura 20 mostra a relao
entra as resistncias dos terminais (A e C) e o cursor (B), com o deslocamento do
cursor (giro).

Figura 20 - Relao entre giro do cursor e as resistncias.

11.7

L298N

O Circuito Integrado L298N um circuito integrado monoltico, constitudo de


dupla Ponte-H e projetado para aceitar nveis lgicos TTL padro e unidade de
cargas indutivas tais como rels, solenides, DC e motores de passo. Internamente,
o L298N consiste de quatro amplificadores de potncia independentes, com
entradas digitais de 5V, sendo que estes amplificadores de conduzir motores DC, ou
motores de passo unipolar e bipolar.
Os quatro amplificadores de so freqentemente usados em pares, formando
uma ponte H para alternar a polaridade com o intuito de controlar a direo de um
motor DC.
50

Caractersticas:

Driver de ponte dupla


Corrente de sada: 2A
Voltagem de sada: 46V
N de pinos: 15
N de sadas: 4
Faixa de Tenso: 4.5V 7V
Temperatura de Operao: -25 C a 130 C
Corrente mxima: 4A
Tenso mxima: 50V

A pinagem do L298N do modelo Multiwatt15 utilizado neste projeto est


descrita na figura 21.

Figura 21 - Pinagem do L298N.

Os pinos 1 e 15 so usados como sensor de corrente (current sensor). Eles


podem ser ligados diretamente ao terra do circuito, porm aconselhvel conect-lo
51

a um resistor de baixo valor (at 0,5) para no influenciar na corrente de sada, e


para que possa ser medido a tenso em cima do mesmo e calcular a corrente que
est sendo fornecida.
Os pinos ENA, ENB, e IN1-IN4 possuem o padro de 5V lgica TTL para
fazer a conexo com a maioria dos microcontroladores de maneira simples e fcil.
O pino Supply voltage corresponde a tenso de alimentao para os motores
de passo, enquanto que o pino Logical Supply Voltage corresponde a tenso do
circuito de controle +5V do 8051. O pino 8, GND ligado diretamente ao terra. Entre
as tenses de alimentao e o terra so inseridos capacitores de desacoplamento.

Os pinos Enable A e Enable B, podem ser colocados em nvel alto


diretamente conectados ao Vs, ou podem ser usados por pinos de controle
provenientes do 8051. A figura 22 mostra o esquema de ligao do L298N com um
motor de passo bipolar.

Figura 22 - Ligao do L298N com motor de passo bipolar.

52

12 FERRAMENTAS E DISPOSITIVOS UTILIZADOS

12.1

Proteus

Proteus um software de projeto e simulao de circuitos eletrnicos,


desenvolvido pela empresa inglesa Labcenter Electronics, muito til para
estudantes e profissionais que desejam desenvolver projetos com aplicaes
analgicas e digitais.
O software possui dois ambientes (ISIS e ARES) para criar esquemticos e
realizar simulaes, e para posteriormente criar layout de placas de circuito impresso
se necessrio.
Possui um entorno grfico no qual podem inserir os smbolos representativos
dos componentes do circuito que desejamos projetar, podendo verificar a viabilidade
das conexes, e simular o funcionamento do circuito para evitar danos aos
componentes.
Durante a simulao podemos incluir instrumentos de medio e grficos que
demonstrem os sinais obtidos durante a simulao do circuito. Ele pode simular
circuitos com os microcontroladores mais populares e usados atualmente, como
8051, PIC, ATMEL-AVR, Motorola, entre outros.
No

ambiente

ISIS

podemos

criar

esquemas

eltricos

utilizando

microcontrolador e componentes necessrios para nosso projeto. Assim que for


criado o esquema podemos programar o microcontrolador e fazer simulaes e
testes que verificam a viabilidade do projeto.
No ambiente ARES, podemos transformar o esquemtico do circuito
eletrnico em um layout para a confeco de placas de circuito impresso. No ARES,
podemos definir as trilhas para uma correta comunicao entre os componentes,
evitar

cruzamento

proximidade

das

trilhas,

prevenindo

interferncias

eletromagnticas e possvel mal funcionamento do circuito. A figura 23 mostra os


ambientes ISIS (esquerda) e ARES (direita).

53

Figura 23 - Ambientes ISIS (esquerda) e ARES (direita).

12.2

PEQui

O simulador PEQui um software gratuito desenvolvido na Escola das


Engenharias Eltrica Mecnica e de Computao, da Universidade Federal de
Gois, que auxilia estudantes e desenvolvedores que desejam projetar circuitos com
o microcontrolador 8051.
No ambiente do PEQui podemos digitar, compilar e simular o programa
escrito em Assembly a ser carregado no microcontrolador 8051. O PEQui capaz
de simular as todas as funcionalidades do microcontrolador 8051, como
comunicao serial, fontes de interrupo, contadores/temporizadores, etc. Tambm
capaz de transmitir os arquivos hex para o microcontrolador atravs da porta
serial do computador.
12.2.1 Funcionamento:

O programa digitado gravado automaticamente com a extenso ".asm. A


compilao do programa gera um arquivo com extenso .hex

e outro com

extenso ".lst". O programa .lst fornece a listagem do programa em assembly e o


cdigo hexadecimal equivalente, alm de possveis mensagens de erro.
O kit didtico acompanhado de um programa que usado para transferir o
arquivo ".hex" para o kit. O programa transferido inicia automaticamente sua
execuo.
54

Figura 24 - Ambiente do PEQui.

O simulador permite visualizar os contedo dos principais registradores do


8051, alm de poder depurar o programa passo a passo (por instruo), verificando
alteraes na memria RAM, do contedo das portas de 8 bits e dos registradores.
12.3

ChipMax2

ChipMax2 um dispositivo programador universal de baixo custo e alto


desempenho que utiliza a interface PC USB 2.0. Pode programar uma memria flash
de 64Mb em 42 segundos. Suporta mais de 13.000 dispositivos programveis de
baixa tenso, oferece uma interface amigvel e vrias facilidades para programao
de chips. Suporta EPROM e microcontroladores, identifica se o chip foi corretamente
inserido antes de programar assim como pinos mal conectados.

55

Figura 25 - Dispositivo de gravao de chips ChipMax2.

12.4

MaxLoader

O maxloader uma ferramenta da EETools. Apresenta uma interface simples


como podemos verificar na figura 26, que permite ler, apagar, verificar e programar
memrias e microcontroladores. Possui um catlogo variado de microcontroladores,
e trabalha com o dispositivo de gravao ChipMax2.

Figura 26 - Ambiente do MaxLoader.

56

12.5 Eclipse e Android SDK

O Eclipse uma IDE (integrated development environment) desenvolvida em


JAVA, usada para facilitar o desenvolvimento de aplicaes em vrias linguagens de
programao, entre elas o JAVA, C++, PHP, entre outras. Formada por um
consrcio da IBM, a IDE lder de mercado, e segue o modelo open source de
desenvolvimento de software. Suas principais caractersticas so:

Utiliza o SWT (The Standard Widget Toolkit) como biblioteca grfica,


que usa componentes nativos do sistema operacional. Isso permite
criar

aplicaes

grficas

multiplataforma

sem

sacrificar

compatibilidade.
Orientao ao desenvolvimento baseado em plugins, que possuem
inmeras funcionalidades diferentes, como: suporte a servidores de
aplicao, visualizadores de banco de dados, geradores de diagramas
UML, etc.
Porttil, ou seja, as aplicaes desenvolvidas so compatveis com
vrios ambientes.
Permite a refatorao do cdigo, permitindo melhorar o design sem
alterar a funcionalidade.

Juntamente com o Eclipse, foi preciso baixar e instalar o SDK (kit de


desenvolvimento de software) do Android. Depois de instalar o Android SDK, atravs
do Android SDK Manager, baixamos a API 2.3.3 para Android, escolhida como
verso mnima requerida para o aplicativo.

Aps isso baixamos e instalamos o plugin de desenvolvimento Andoid para o


Eclipse, o Android Development Tools (ADT). O ADT possibilita criar mais
rapidamente novos projetos Android, construir uma interface do aplicativo, depurar o
aplicativo e exportar pacotes para distribuio.

57

13 RESULTADOS OBTIDOS

13.1 Esquemtico do circuito eletrnico

A figura 27 mostra o esquemtico que foi projetado e simulado no Proteus.

Figura 27 - Esquemtico bsico do guincho.

58

Aps montar e simular o esquemtico do projeto, com o programa em


assembly do Apndice A, notou-se seu correto funcionamento, e esse circuito serviu
de base para a confeco da placa de circuito impresso.
Para facilitar a confeco do circuito impresso e para adapt-lo melhor
nossa necessidade, alteramos as seguintes caractersticas do circuito:

Os conversores analgico digitais (ADC0804) foram conectados nas


portas P1 e P2, e o driver L298N foi conectado na porta P0 do
microcontrolador.
O eletrom foi conectado no pino T0 do microcontrolador.
No foram necessrias as resistncias dos pinos de sensor de
corrente do L298N. Visto que o mesmo fornece na porta uma tenso
de 6V e a resistncia interna do motor de passos de 6, ele fornece
a corrente de aproximadamente 1A para o motor se desconsiderarmos
a queda de tenso dentro L298N. Nos resultados

prticos,

considerando a queda de tenso do L298N, a corrente que entra no


motor girou em torno de 750mA.

As entradas do L298N foram conectadas na porta P0 do microcontrolador, e


suas sadas ligadas s fases de cada motor. Visto que cada motor de passo possui
4 fases, foi necessrio o uso de quatro pinos do microcontrolador por cada motor.
Os pinos sensA e sensB (sensor de corrente) do L298N foram ligados porta GND
do mesmo (aterrados). O Vs ligado tenso de controle do micro e o Vss na
tenso de alimentao do motor de passo.

Os conversores analgico-digital de 8 bits (ADC0804), foram conectados na


porta P1 e P2 do microcontrolador, sendo que o bit menos significativo do conversor
foi ligado na .0 e o mais significativo na .7. Os pinos VIN(+) e VIN(-) que
correspondem s entradas analgicas diferenciais so conectados ao terminal de
derivao central do potencimetro e no GND, respectivamente. Os pinos de escrita
(WR) e leitura (RD) do conversor foram ligados aos pinos de 16 e 17 do
microcontrolador. Os pinos CLK IN e CLK R so conectados ao gerador de clock do
59

micro e separados por um resistor e um capacitor em srie para gerao do clock


interno.

O pino Rx e o Tx do mdulo Bluetooth so conectados respectivamente nos


pinos TxD(11) e RxD(10) do microcontrolador. A tenso de operao do mdulo
ligado tenso de controle do microcontrolador, que corresponde a 5V. J o
eletrom foi ligado no pino T0 do microcontrolador.

Com o programa em assembly, usamos o software PEQui para emular e


depurar todo o funcionamento do micro, verificando alterao dos registradores e
envio de sinais. Para gravar o programa no chip usamos o software MaxLoader e o
dispositivo ChipMax2, que so compatveis com os mais diversos fabricantes do
8051, inclusive o AT89C51 usado no projeto.

Convertemos o esquemtico do ambiente ISIS, para o ambiente ARES do


Proteus, fizemos as modificaes necessrias como trilhas cruzadas e correo das
mesmas, e otimizamos o espao entre os componentes para deixar o circuito mais
simples e funcional.

13.2 Placa de Circuito Impresso

A Placa de Circuito Impresso composta por camadas de materiais plsticos


e fibrosos, que contem finas pelculas de alguma substncia metlica como cobre
nquel ou ouro. Essas pelculas sero responsveis pela formao das trilhas nas
placas, onde ir fluir a corrente eltrica pelos componentes do circuito.

O desenho da placa foi feito depois de inmeras simulaes no ambiente do


PROTEUS e vrios testes fsicos, verificando a viabilidade do projeto. A construo
das placas veio tornar mais simples, eficaz e menos suscetvel a erros os testes
fsicos do sistema, pois foi reduzido drasticamente o nmero de fios e conexes
defeituosas.
60

Para o desenho da placa, visamos otimizar o espao dos componentes na


placa, evitando trilhas abertas e cruzamentos, e tambm possveis interferncias
eletromagnticas que poderiam ser causadas pelas proximidades das trilhas.
Deixamos tambm pinos para entrada de corrente e comunicao com outras
placas.

13.3

Processo de confeco da placa

1. Depois de gerado o layout da placa no ambiente ARES do PROTEUS,


imprimimos em uma impressora a laser de boa qualidade, usando papel fotogrfico.
2. Lixamos a superfcie da placa de circuito com uma esponja de ao para
tirar possveis resduos e a parte oxidada. Depois de lixada, limpamos com lcool
para retirar a gordura da placa.
3. Fixamos o layout da placa com uma fita isolante e deixamos o papel bem
firme e esticado para evitar defeitos no desenho do circuito.
4. Passamos um ferro j quente na regio do desenho para transferi-lo para a
placa.
5. Deixamos a placa esfriar e retiramos o papel da placa.
6. Corroemos a placa de cobre usando percloreto de ferro, deixando de molho
em uma vasilha plstica. Depois de corrodo lavamos a placa em gua corrente, e
limpamos com tiner para tirar a tinta de cima das trilhas.
7. Fizemos os furos nas ilhas da placa para fixao dos componentes do
circuito. Soldamos os componentes na placa com cuidado para evitar curto circuito e
falhas nas trilhas.

As placas individuais podem ser vistas nas figuras 28, 29 e 30. J a figura 31
mostra o circuito eletrnico completo necessrio para o funcionando do projeto.

61

Figura 28 - PCI do 8052.

62

Figura 29 - PCI da ponte H com L298N.

Figura 30 - PCI de ativao do eletrom.

Figura 31 - Circuito eletrnico completo.

63

13.4 Comunicao com os Dispositivos Bluetooth

Todo o programa para a comunicao com o Bluetooth foi feito na linguagem


de programao JAVA, e utilizando a SDK Android. O cdigo do programa em JAVA
da comunicao Bluetooth, est no Apndice B. Foi desenvolvido primeiramente a
interface grfica que buscou ser simples e intuitiva, depois foi desenvolvido a
interface para a comunicao com o mdulo Bluetooth. Depois foi desenvolvida toda
a estrutura lgica do sistema, que buscava adequar ao correto funcionamento de
todos os dispositivos usados no projeto, e suas respectivas limitaes.

Com a concluso do programa e em posse de um celular Android com


capacidade de comunicao Bluetooth, foi selecionado o mdulo Bluetooth para
realizar a conexo. Aps conectado, mostrado uma interface simples e intuitiva, de
modo que o usurio possa oper-la sem grandes problemas. A figura 32 mostra a
interface do programa atravs da tela do celular.

Figura 32 - Interface do dispositivo Bluetooth.

64

Figura 33 - Controle dos motores.

Foi criada uma tela de configuraes (figura 34), para possibilitar ao usurio
mudar, em tempo de execuo, os valores de algumas constantes do sistema.
Atravs desta tela possvel limitar o curso do guincho e definir a preciso de
parada.

A definio de um valor limitador para o guincho no s uma comodidade,


como tambm um fator de segurana, podendo evitar acidentes e danos nos
sensores.

Atravs das relaes de engrenagens, e usando os limitadores de curso, foi


possvel realizar a aferio dos sensores, para que indique uma posio
aproximada, traduzida em Graus, e mostrada em tempo real na tela do celular.
65

O funcionamento do programa est descrito abaixo:

- A barra de posio atual do motor pode ser vista como a poro de giro do
cursor do potencimetro.
- A barra de posio desejada do motor onde o usurio ir controlar o
movimento do motor, fazendo com que a barra de posio atual se locomova at a
posio desejada.
- A interface contm botes para ligar e desligar os motores, o m, e tambm
para conectar e desconectar os dispositivos Bluetooth.

Figura 34 - Tela de Configurao

66

14 CONCLUSO E TRABALHOS FUTUROS

O desenvolvimento deste projeto mostrou ser um grande desafio. E o principal


motivo foi a integrao entre as vrias reas de conhecimento aplicadas durante seu
desenvolvimento. Durante seu processo foi necessrio estudo de Mecnica,
Microcontroladores, Eletrnica e Linguagens de programao. Em cada uma dessas
reas tivemos que realizar inmeras pesquisas e aprofundar no conhecimento.

O processo de adequao da estrutura fsica para instalao de sensores e


adaptao dos motores foi bastante dispendioso. Vimos como pode ser difcil criar
um projeto baseando-se em algo j construdo, em que no foi projetado para essas
mudanas. A instalao dos sensores demandou diversas horas na confeco de
engrenagens com apertos precisos, que coubessem em espaos curtos e que no
foram criados para esse propsito. Alm das engrenagens diversos ajustes tiveram
que ser feitos na estrutura fsica, tendo em vista o desgaste sofrido com o tempo, de
forma que o funcionamento no deixasse a desejar.

O projeto eletrnico tambm foi de grande valor. O contato prximo com as


diversas ferramentas como conversores analgico-digital e transistores foram
fundamentais para agregar conhecimento. Nesse estudo temos que ressaltar a
importncia de leitura minuciosa da documentao do fabricante, que detalha o
funcionamento de cada componente. Ainda sim, vimos que essa documentao vez
ou outra pode se apresentar confusa ou incompleta, onde se mostra importante a
troca de experincia e a orientao.

No trabalho pudemos concretizar, na prtica, uma grande parte do


conhecimento aprendido nos diversos anos desta graduao. A confeco de
circuitos se mostrou um exemplo de algo que, apesar de aprendido em sua teoria,
mostra diversos desafios que s aparecem com a prtica, e que agregam bastante
conhecimento.

Considerando o desafio com extensa rea de conhecimento, o problema foi


enfrentado por partes. Essa abordagem foi fundamental para conseguir o resultado,
67

resolvendo problemas menores e juntando os resultados. Durante o trabalho, cada


um dos componentes foi estudado e conhecido a fundo seu funcionamento, e, s
ento, iniciado o prximo, seguindo o nosso fluxo de desenvolvimento. O
componente de software tambm foi desenvolvido seguindo esta proposta, onde foi
desenvolvido sua interface grfica, sua interface para comunicao Bluetooth e, por
fim, a lgica do programa.

Durante o desenvolvimento do projeto vimos tambm como os erros de


projeto podem atingir o andamento dos trabalhos. Com o projeto j na fase final
experimentamos um erro de clculo em duas engrenagens no sistema, ao qual,
apesar de funcionarem, no estavam adequadas aos requisitos do projeto. Essas
modificaes tiveram custo ao projeto e tambm serviram de aprendizado, onde
remodelamos a forma de trabalho para que no ocorresse novamente.

Por fim, o trabalho gera grandes expectativas para o futuro, tendo em vista
apresentar uma tecnologia que, apesar de no ser muito nova, ainda mostra um
enorme potencial para o mercado. Os dispositivos Bluetooth, considerando a
integrao com dispositivos mveis, so uma tendncia de mercado para os novos
dispositivos, e ainda no possuem um concorrente com abrangncia comparvel.
Isso significa que aplicaes escritas para estes dispositivos podem atingir a um
nmero muito grande de usurios, com a provvel tendncia de que este quadro no
se altere nos prximos anos.

Assim, esta integrao de componentes eletrnicos com dispositivos mveis


se mostra uma grande rea de pesquisa, contendo inmeros exemplos em que
podem ser trabalhados. Desde o conforto, como na automao residencial, quanto
na medicina, com sensores de sade, at a rea de segurana, as aplicaes so
diversas e demanda uma mo de obra bem especfica do Engenheiro de
Computao.

68

15 BIBLIOGRAFIA

[1] STALLINGS, W. Arquitetura e Organizao de Computadores, Edio 5. Editora


Pearson Addison Wesley. 2005.

[2] TAUB, H.; Circuitos Digitais e Microprocessadores. So Paulo: Mc- Graw Hill,
1984.

[3] SILVA JNIOR , Vidal Pereira da . Microcontrolador 8051. So Paulo:tica, 2. ed,


1999;

[4] NICOLOSI, D.E.C. Microcontrolador 8051 Detalhado. 2a. edio. So Paulo:


Editora rica, 2000.

[5] Microcontrolador. Disponvel em: <http://pt.wikipedia.org/wiki/Microcontrolador>


Acessado em 11 nov. 2012.

[6] Denardin, G.W. Apostila de microcontroladores. Disponvel em:


<http://pessoal.utfpr.edu.br/gustavo/apostila_micro.pdf> Acessado em 11 nov. 2012.

[7] Lima, J.W. Notas das aulas de microcontroladores e microprocessadores.


Disponvel em: <http://www.eeec.ufg.br/~jwilson/aulasmicro/ > Acessado em 11 nov.
2012.

[8] Brain, M. Como funcionam os microcontroladores. Disponvel em:


<http://eletronicos.hsw.uol.com.br/microcontroladores.htm> Acessado em 17 nov.
2012.

[9] Zelenovsky, R. Mendona, A. Arquitetura de Microcontroladores Modernos.


Disponvel em: <http://www.mzeditora.com.br/artigos/mic_modernos.htm> Acessado
em 17 nov. 2012.

69

[10] Juc, S. A apostila PIC e Perifricos. Disponvel em:


<http://mecatronicananet.blogspot.com.br/2011/11/apostila-pic-e-perifericosatualizada.html> Acessado em 08 dez. 2012.

[11] Antnio, M. Apostila de:programao de microcontroladores usando linguagem


C. Disponvel em: <http://www.pictronics.com.br/downloads/apostilas/Apostila-PicC.pdf> Acessado em 08 dez. 2012.

[12] Ruiz, W. MicrocontroladoresFamlia MCS-51 Conceitos, Aplicaes e Projetos.


Disponvel em: <http://aragao.spo.ifsp.edu.br/files/apostilas/microcontroladores.pdf>
Acessado em 08 dez. 2012.

[13] Intel 8051. Disponvel em: <http://pt.wikipedia.org/wiki/Intel_8051> Acessado em


09 dez. 2012.

[15] Neto, H.G. MICROCONTROLADORES MCS51. Disponvel em:


<http://pessoal.utfpr.edu.br/hvieir/download/mcs51_1.pdf> Acessado em 09 dez.
2012.

[16] Aplicaes de Microprocessadores II. Disponvel em:


<http://iris.sel.eesc.sc.usp.br/sel337> Acessado em 09 dez. 2012.

[17] Aplicao de Microprocessadores I. Disponvel em:


<http://iris.sel.eesc.usp.br/sel433/Aula8-i4.pdf> Acessado em 09 dez. 2012.

[18] Interfaciing ADC to 8051. Disponvel em:


<http://www.circuitstoday.com/interfacing-ADC-to-8051> Acessado em 13 jan. 2013.

[19] Tateoki, G.T. Disponpivel em:


<http://www.getulio.eng.br/meusalunos/sad/ADC0804.pdf> Acessado em 13 jan.
2013.

70

[20] How to Interface Bluetooth with 8051. Disponvel em:


<http://www.pantechsolutions.net/accessory-boards/Bluetooth-interfacing-with-8051>
Acessado em 27 jan. 2013.

[21] Brites, F.G. Santos, V.P. Disponvel em:


<http://www.telecom.uff.br/pet/petws/downloads/tutoriais/stepmotor/stepmotor2k8111
9.pdf> Acessado em 02 fev. 2013.

[22] Controle de motor de passo atravs da porta paralela. Disponvel em:


<http://www.rogercom.com/pparalela/IntroMotorPasso.htm> Acessado em 03 fev.
2013.

[23] O que so e como funcionam os potencimetros digitais. Braga, N.C.Disponvel


em: <http://www.sabereletronica.com.br/secoes/leitura/115> Acessado em 03 fev.
2013.

[24] Moraes, M. L298N Ponte H Dupla. Disponvel em:


<http://arduinobymyself.blogspot.com.br/2013/02/l298n-ponte-h-dupla-breakoutboard.html> Acessado em 10 fev. 2013.

[25] L298 Dual H-Bridge Motor Driver. Disponvel em:


<http://billwaa.wordpress.com/2012/06/06/arduino-l298-dual-h-bridge-motor-driver/>
Acessado em 10 fev. 2013.

[26]Patsko, L.F. Tutorial de Montagem da Ponte H. Disponvel em:


<http://www.maxwellbohr.com.br/downloads/robotica/mec1000_kdr5000/tutorial_eletr
onica_-_montagem_de_uma_ponte_h.pdf> Acessado em 10 fev. 2013.

[27] L298 Dataseet. Disponvel em:


<http://www.sparkfun.com/datasheets/Robotics/L298_H_Bridge.pdf> Acessado em
10 fev. 2013.

71

[28] Motores de passo (passo a passo). Disponvel em:


<http://www.roboticasimples.com/artigos.php?acao=14> Acessado em 10 fev. 2013.

[29] Moraes,M. Ponte H - Controle de Motores DC. Disponvel em:


<http://arduinobymyself.blogspot.com.br/2012/08/ponte-h-controle-de-motoresdc.html >Acessado em 10 fev. 2013.

[30] Manual em portugus do Proteus. Disponvel em:


<http://mecatronicadegaragem.blogspot.com.br/2011/02/manual-em-portugues-doproteus-que.html> Acessado em 24 jan. 2013.

[31] Bluetooth - Camada Fsica e Camada de Acesso ao Meio. Disponvel em:


<http://www.gta.ufrj.br/grad/09_1/Bluetooth/index.html> Acessado em 24 fev. 2013.

[32] Layton, J. Franklin, C. Como funciona o Bluetooth. Disponvel em:


<http://informatica.hsw.uol.com.br/Bluetooth.htm> Acessado em 24 fev. 2013.

[33] Alecrim, E. Tecnologia Bluetooth. Disponvel em:


<http://www.infowester.com/Bluetooth.php> Acessado em 24 fev. 2013.

[34] Kobayashi, C. Y. A Tecnologia Bluetooth e aplicaes. Disponvel em:


<http://grenoble.ime.usp.br/movel/monografia_Bluetooth.pdf> Acessado em 24 fev.
2013.

[35] Cavalheiro, L. Como fazer sua PCI (Placa de Circuito Impresso). Disponvel em:
<http://lucascavalheiro.wordpress.com/2008/10/22/como-fazer-pci/> Acessado em
26 fev. 2013.

[36] Braga, N. Como funcionam potencimetros e trimpots. Disponvel em:


<http://www.newtoncbraga.com.br/index.php/como-funciona/3379-art472.html>
Acessado em 26 fev. 2013.

72

[37] Loflin, L. Connecting the Arduino to a L298N H-Bridge. Disponvel em:


<http://www.bristolwatch.com/L298N/L298N_arduino.htm> Acessado em 27 fev.
2013.

73

16 APNDICE

CDIGO

EM

ASSEMBLY

DO

PROGRAMA

DO

MICROCONTROLADOR
$mod51
IMA equ T0;
MOTOR1 equ R1;
MOTOR2 equ R2;
MOTOR1_LIGADO equ 00h;
MOTOR1_SENTIDO equ 01h;
MOTOR2_LIGADO equ 02h;
MOTOR2_SENTIDO equ 03h;
IMA_LIGADO equ 04h;
RESULTADO_ENTRADA equ 20h;
RESULTADO_SAIDA equ R0;
MOTOR equ P0;
GIROMINIMO equ R3;
INTS1 equ P3.2;
INTS2 equ P3.3;
ADC_VAL1 equ R4;
ADC_VAL2 equ R5;
ADC_SENSOR1 equ P1;
ADC_SENSOR2 equ P2;

org 00h;
ajmp INICIALIZAR;
org 23h;
ajmp SERIAL;
org 40h;
INICIALIZAR:

74

mov

SP, #2Fh;

mov RESULTADO_ENTRADA, #0h;


mov RESULTADO_SAIDA, #0h;
mov MOTOR1, #0CCh;
mov MOTOR2, #0CCh;
mov GIROMINIMO, #0Fh;
mov IE, #10010000b;
mov SCON, #01010000b;
mov PCON, #00000000b;
mov TMOD, #00100000b;
mov TH1, #0FDh;
setb TR1;
INICIO:
acall APRESENTAR_RESULTADO;
acall AGUARDAR_TEMPO;
PROXIMO1:
jnb MOTOR1_LIGADO, PROXIMO2;
jnb MOTOR1_SENTIDO, INVERSO1;
mov A, MOTOR1;
rr A;
mov MOTOR1, A;
ajmp PROXIMO2;
INVERSO1:
mov A, MOTOR1;
rl A;
mov MOTOR1, A;
PROXIMO2:
jnb MOTOR2_LIGADO, PROXIMO3;
jnb MOTOR2_SENTIDO, INVERSO2;
mov A, MOTOR2;
rr A;
mov MOTOR2, A;
ajmp PROXIMO3;

75

INVERSO2:
mov A, MOTOR2;
rl A;
mov MOTOR2, A;
PROXIMO3:
jnb IMA_LIGADO, IMA_DESLIGADO;
setb IMA;
ajmp FIM;
IMA_DESLIGADO:
clr IMA;
FIM:
djnz GIROMINIMO, INICIO;
inc GIROMINIMO;
ajmp FIM;
APRESENTAR_RESULTADO:
mov A, MOTOR1;
clr C;
rrc A;
clr C;
rrc A;
clr C;
rrc A;
clr C;
rrc A;
mov RESULTADO_SAIDA, A;
mov A, MOTOR2;
clr C;
rlc A;
clr C;
rlc A;
clr C;
rlc A;
clr C;
rlc A;

76

add A, RESULTADO_SAIDA;
mov RESULTADO_SAIDA, A;
mov MOTOR, A;
ret;
AGUARDAR_TEMPO:
push B;
mov B,#0FAh;
Tempo2:
push B;
mov B,#0FFh;
Tempo1:
djnz B,Tempo1;
pop B;
djnz B,Tempo2;
pop B;
ret;
SERIAL:
mov GIROMINIMO,

#0Fh;

mov RESULTADO_ENTRADA, SBUF;


clr RI;
acall ADC_Converter;
mov SBUF, ADC_VAL1;
jnb TI, $;
clr TI;
mov SBUF, ADC_VAL2;
jnb TI, $;
clr TI;
reti;
ADC_Converter:
clr wr

77

nop
setb wr
jb INTS1,$
jb INTS2,$
clr rd
mov ADC_VAL1,ADC_SENSOR1
mov ADC_VAL2,ADC_SENSOR2
setb rd
ret;
end;

78

17 APNDICE B CDIGO EM JAVA DO PROGRAMA ANDROID/BLUETOOTH


package ufg.eeec.guincho;
import java.io.IOException;
import ufg.eeec.guincho.BluetoothConnection.Motor;
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import

android.app.Activity;
android.app.Notification;
android.app.PendingIntent;
android.app.Service;
android.content.BroadcastReceiver;
android.content.Context;
android.content.Intent;
android.content.IntentFilter;
android.content.SharedPreferences;
android.os.AsyncTask;
android.os.Bundle;
android.os.IBinder;
android.preference.PreferenceManager;
android.view.Menu;
android.view.MenuItem;
android.view.View;
android.widget.Button;
android.widget.ProgressBar;
android.widget.SeekBar;
android.widget.TextView;
android.widget.ToggleButton;
android.widget.SeekBar.OnSeekBarChangeListener;

public class Principal extends Activity {


private
private
private
private
private
private
private
private
private
private
private
private
private
private

ToggleButton cmdLigaDeslMot1;
ToggleButton cmdLigaDeslMot2;
ToggleButton cmdLigaDeslIma;
ProgressBar pbPosMot1;
ProgressBar pbPosMot2;
SeekBar sbPosDesMot1;
SeekBar sbPosDesMot2;
TextView txtPosDesMot1;
TextView txtPosDesMot2;
TextView txtPosMot1;
TextView txtPosMot2;
Button cmdBluetooth;
Button cmdConnect;
Button cmdDisconnect;

private
private
private
private
private
private
private
private

static
static
static
static
static
static
static
static

final
final
final
final
final
final
final
final

int
int
int
int
int
int
int
int

numEngrenagemSup1
numEngrenagemSup2
numEngrenagemSup3
numEngrenagemSup4
numEngrenagemInf1
numEngrenagemInf2
numEngrenagemInf3
numEngrenagemInf4

=
=
=
=
=
=
=
=

90;
12;
42;
12;
40;
12;
36;
17;

79

private static final int numVoltasSensor = 10;


private
static
final
int
anguloMaxMotor1
=
(int)
(360
numVoltasSensor / ((((float) numEngrenagemInf1) / numEngrenagemInf2)
(((float) numEngrenagemInf3) / numEngrenagemInf4)));
private
static
final
int
anguloMaxMotor2
=
(int)
(360
numVoltasSensor / ((((float) numEngrenagemSup1) / numEngrenagemSup2)
(((float) numEngrenagemSup3) / numEngrenagemSup4)));
private static final int margemSeguranca = 1;
private
static
final
int
margemSegurancaMotor1
(margemSeguranca * ((float) anguloMaxMotor1) / numVoltasSensor);
private
static
final
int
margemSegurancaMotor2
(margemSeguranca * ((float) anguloMaxMotor2) / numVoltasSensor);

*
*
*
*

(int)

(int)

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.guincho);
if (context == null)
context = getApplicationContext();
// Registra um BroadcastReciever para receber solicitacoes das
threads.
RegistrarReciever();
System.out.println(margemSegurancaMotor1);
System.out.println(margemSegurancaMotor2);
// Mantem uma referencia aos controles
cmdLigaDeslMot1
=
(ToggleButton)
findViewById(R.id.cmdLigaDeslMot1);
cmdLigaDeslMot2
=
(ToggleButton)
findViewById(R.id.cmdLigaDeslMot2);
cmdLigaDeslIma
=
(ToggleButton)
findViewById(R.id.cmdLigaDeslIma);
pbPosMot1 = (ProgressBar) findViewById(R.id.pbPosMot1);
pbPosMot2 = (ProgressBar) findViewById(R.id.pbPosMot2);
sbPosDesMot1 = (SeekBar) findViewById(R.id.sbPosDesMot1);
sbPosDesMot2 = (SeekBar) findViewById(R.id.sbPosDesMot2);
txtPosDesMot1 = (TextView) findViewById(R.id.txtPosDesMot1);
txtPosDesMot2 = (TextView) findViewById(R.id.txtPosDesMot2);
txtPosMot1 = (TextView) findViewById(R.id.txtPosMot1);
txtPosMot2 = (TextView) findViewById(R.id.txtPosMot2);
cmdBluetooth = (Button) findViewById(R.id.cmdBluetooth);
cmdConnect = (Button) findViewById(R.id.cmdConnect);
cmdDisconnect = (Button) findViewById(R.id.cmdDisconnect);
//Chama os valores padrao nas preferencias, caso o usuario nao as
tenha modificado.
PreferenceManager.setDefaultValues(this,
R.xml.preferences,
false);
CarregarValoresPreferencias();
// CRIA OS EVENTOS PARA OS BOTOES
cmdBluetooth.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {

80

SelecionarDispositivoBluetooth();
}
});
cmdConnect.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
Conectar();
}
});
cmdDisconnect.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
Desconectar();
}
});
sbPosDesMot1.setOnSeekBarChangeListener(new
onSeekBarChange(txtPosDesMot1, onSeekBarChange.Motor1));
sbPosDesMot2.setOnSeekBarChangeListener(new
onSeekBarChange(txtPosDesMot2, onSeekBarChange.Motor2));
}
/**
* Cria o menu de opcoes.
*/
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menuprincipal, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.dispositivoBT:
SelecionarDispositivoBluetooth();
break;
case R.id.configuracoes:
Configuracoes();
break;
case R.id.sair:
if (PodeSair()) {
finish();
System.exit(0);
}
break;
default:
break;
}
return super.onOptionsItemSelected(item);
}
/**
* Recebe respostas das atividades iniciadas, como solicitacao de
procura de dispositivos Bluetooth
* e abrir tela de propriedades.
*/

81

@Override
protected void onActivityResult(int requestCode,
Intent data) {
// Recebe resposta as solicitacoes
switch (requestCode) {

int

resultCode,

// Recebe o dispositivo Bluetooth escolhido na atividade


case ProcuraDispositivo:
if (resultCode == RESULT_OK)
dispositivoBluetooth
=
new
DispositivoBluetooth(data.getStringExtra(BluetoothActivity.name),
data.getStringExtra(BluetoothActivity.address));
break;
case AbrePreferencias:
CarregarValoresPreferencias();
break;
}
super.onActivityResult(requestCode, resultCode, data);
}
@Override
protected void onResume() {
AtualizarInterface();
super.onResume();
}
@Override
protected void onDestroy() {
unregisterReceiver(broadcastReceiver);
super.onDestroy();
}
/** Nome para salvar estado persistente da variavel "strEstado" **/
private static final String strEstado = "estado";
/**
Nome
para
salvar
estado
persistente
da
variavel
"strNomeDispositivoBluetooth" **/
private static final String strNomeDispositivoBluetooth = "nome";
/**
Nome
para
salvar
estado
persistente
da
variavel
"strEnderecoDispositivoBluetooth" **/
private
static
final
String
strEnderecoDispositivoBluetooth
=
"endereco";
/**
* Permite ao aplicativo manter seu estado apos a tela ser
redesenhada,
* seja na rotacao da tela, ou se o aplicativo for fechado pelo
sistema.
*
*/
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putInt(strEstado, estado);
if (dispositivoBluetooth != null) {
outState.putString(strNomeDispositivoBluetooth,
DispositivoBluetooth.getNome());
outState.putString(strEnderecoDispositivoBluetooth,
DispositivoBluetooth.getEndereco());
}
super.onSaveInstanceState(outState);

82

}
/**
* Permite ao aplicativo manter seu estado apos a tela ser
redesenhada,
* seja na rotacao da tela, ou se o aplicativo for fechado pelo
sistema.
*/
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
String
nome
=
savedInstanceState.getString(strNomeDispositivoBluetooth);
String
endereco
=
savedInstanceState.getString(strEnderecoDispositivoBluetooth);
if (nome != null && endereco != null)
dispositivoBluetooth
=
new
endereco);

DispositivoBluetooth(nome,

estado = savedInstanceState.getInt(strEstado);
super.onRestoreInstanceState(savedInstanceState);
}
/**
* Nao permite o usuario fechar o aplicativo sem estar no estado
desconectado.
*/
@Override
public void onBackPressed() {
if (PodeSair()) {
super.onBackPressed();
System.exit(0);
}
}
/**
*
Apresenta na tela os valores dos angulos dos motores, conforme
modificado nas barras de progresso.
*/
private class onSeekBarChange implements OnSeekBarChangeListener {
private TextView textView;
private boolean Motor;
public static final boolean Motor1 = false, Motor2 = true;
public onSeekBarChange(TextView textView, boolean Motor) {
this.textView = textView;
this.Motor = Motor;
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {}
@Override
public void

onProgressChanged(SeekBar

seekBar,

int

progress,

83

boolean fromUser) {
if (fromUser) {
if (Motor == Motor1)
textView.setText(progress
ValoresPreferencias.limiteInferiorMotor1 + "");
else if (Motor == Motor2)
textView.setText(progress
ValoresPreferencias.limiteInferiorMotor2 + "");
}
}
}

+
+

private static final int ProcuraDispositivo = 1;


private static final int AbrePreferencias = 2;
/** Permite ao usuario selecionar um dispositivo Bluetooth. **/
private void SelecionarDispositivoBluetooth() {
// Inicializa uma atividade para escolher um dispositivo
Bluetooth
if (estado == estadoDesconectado)
startActivityForResult(new
Intent(Principal.this,
BluetoothActivity.class), ProcuraDispositivo);
}
/** Abre a tela de configuracoes. **/
private void Configuracoes() {
if (estado == estadoDesconectado)
startActivityForResult(new
Preferencias.class), AbrePreferencias);

Intent(Principal.this,

}
/**
*
Carrega
da
memoria
persistente
os
valores
salvos
das
configuracoes.
*/
private void CarregarValoresPreferencias() {
SharedPreferences
sharedPreferences
=
PreferenceManager.getDefaultSharedPreferences(context);
ValoresPreferencias.limiteInferiorMotor1
=
Integer.parseInt(sharedPreferences.getString(getString(R.string.limite_infe
rior_motor1), getString(R.string.limite_inferior_motor1_defaultValue)));
ValoresPreferencias.limiteSuperiorMotor1
=
Integer.parseInt(sharedPreferences.getString(getString(R.string.limite_supe
rior_motor1), getString(R.string.limite_superior_motor1_defaultValue)));
ValoresPreferencias.limiteInferiorMotor2
=
Integer.parseInt(sharedPreferences.getString(getString(R.string.limite_infe
rior_motor2), getString(R.string.limite_inferior_motor2_defaultValue)));
ValoresPreferencias.limiteSuperiorMotor2
=
Integer.parseInt(sharedPreferences.getString(getString(R.string.limite_supe
rior_motor2), getString(R.string.limite_superior_motor2_defaultValue)));
ValoresPreferencias.precisao
=
Integer.parseInt(sharedPreferences.getString(getString(R.string.precisao_ke
y), getString(R.string.precisao_defaultValue)));
if
(ValoresPreferencias.limiteInferiorMotor1
ValoresPreferencias.limiteSuperiorMotor1
ValoresPreferencias.limiteInferiorMotor1
<
margemSegurancaMotor1
ValoresPreferencias.limiteSuperiorMotor1
>
anguloMaxMotor1
margemSegurancaMotor1 ) {
ValoresPreferencias.limiteInferiorMotor1

>=
||
||
=

84

Integer.parseInt(getString(R.string.limite_inferior_motor1_defaultValue));
ValoresPreferencias.limiteSuperiorMotor1
=
Integer.parseInt(getString(R.string.limite_superior_motor1_defaultValue));
String[] mensagens = {"Limites do Motor
inferior maior que superior", "Redefinindo valores padrao."};
Mensagens.Notificacao(context, mensagens);
}

1",

"Valor

if
(ValoresPreferencias.limiteInferiorMotor2
>=
ValoresPreferencias.limiteSuperiorMotor2
||
ValoresPreferencias.limiteInferiorMotor2
<
margemSegurancaMotor2
||
ValoresPreferencias.limiteSuperiorMotor2
>
anguloMaxMotor2
margemSegurancaMotor2) {
ValoresPreferencias.limiteInferiorMotor2
=
Integer.parseInt(getString(R.string.limite_inferior_motor2_defaultValue));
ValoresPreferencias.limiteSuperiorMotor2
=
Integer.parseInt(getString(R.string.limite_superior_motor2_defaultValue));
String[] mensagens = {"Limites do Motor
inferior maior que superior", "Redefinindo valores padrao."};
Mensagens.Notificacao(context, mensagens);
}

2",

"Valor

sbPosDesMot1.setMax(ValoresPreferencias.limiteSuperiorMotor1
ValoresPreferencias.limiteInferiorMotor1);
sbPosDesMot2.setMax(ValoresPreferencias.limiteSuperiorMotor2
ValoresPreferencias.limiteInferiorMotor2);

pbPosMot1.setMax(anguloMaxMotor1);
pbPosMot2.setMax(anguloMaxMotor2);
sbPosDesMot1.setProgress(sbPosDesMot1.getMax() / 2);
sbPosDesMot2.setProgress(sbPosDesMot2.getMax() / 2);
}
/**
* Registra um {@link BroadcastReceiver} para receber comandos das
threads.
*/
private BroadcastReceiver broadcastReceiver = new BroadcastReceiver()
{
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(bcAtualizarInterface)) {
AtualizarInterface();
} else if (intent.getAction().equals(bcIniciarServico)) {
Intent
intentBluetoothService
=
new
Intent(BluetoothService.ConexaoBluetoothGuincho);
intentBluetoothService.setClass(Principal.this,
BluetoothService.class);
Principal.this.startService(intentBluetoothService);
} else if (intent.getAction().equals(bcPararServico)) {
Intent
intentBluetoothService
=
new
Intent(BluetoothService.ConexaoBluetoothGuincho);
intentBluetoothService.setClass(Principal.this,
BluetoothService.class);
Principal.this.stopService(intentBluetoothService);
}
else
if

85

(intent.getAction().equals(bcAtualizaValoresMotor)) {
AtualizaValoresMotor();
} else if (intent.getAction().equals(bcAtualizaSensor1))
{
int valor = intent.getIntExtra(bcAtualizaSensor1, 1);
System.out.println("Valor 1: " + valor);
if (valor != -1) {
valor
=
(int)
(valor
*
anguloMaxMotor1) / 255));
pbPosMot1.setProgress(valor);
txtPosMot1.setText(valor + "");
}

(((float)

} else if (intent.getAction().equals(bcAtualizaSensor2))
{
int valor = intent.getIntExtra(bcAtualizaSensor2, 1);
System.out.println("Valor 2: " + valor);
if (valor != -1) {
valor
=
(int)
(valor
*
anguloMaxMotor2) / 255));
pbPosMot2.setProgress(valor);
txtPosMot2.setText(valor + "");
}

(((float)

}
}
};
/**
* Registra um filtro para um {@link BroadcastReceiver}, para filtrar
as solicitacoes desejadas.
*/
private void RegistrarReciever() {
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(bcAtualizarInterface);
intentFilter.addAction(bcIniciarServico);
intentFilter.addAction(bcPararServico);
intentFilter.addAction(bcAtualizaValoresMotor);
intentFilter.addAction(bcAtualizaSensor1);
intentFilter.addAction(bcAtualizaSensor2);
registerReceiver(broadcastReceiver, intentFilter);
}
private static Context context;
private
static
final
String
bcAtualizarInterface
"ufg.eeec.principal.AtualizarInterface";
private
static
final
String
bcIniciarServico
"ufg.eeec.principal.IniciarServico";
private
static
final
String
bcPararServico
"ufg.eeec.principal.PararServico";
private
static
final
String
bcAtualizaValoresMotor
"ufg.eeec.principal.AtualizaValoresMotor";
private
static
final
String
bcAtualizaSensor1

=
=
=
=
=

86

"ufg.eeec.principal.AtualizaSensor1";
private
static
final
"ufg.eeec.principal.AtualizaSensor2";

String

bcAtualizaSensor2

/** Solicita uma conexao Bluetooth com o dispositivo selecionado. **/


private static void Conectar() {
if (estado == estadoDesconectado && dispositivoBluetooth !=
null) {
estado = estadoConectando;
context.sendBroadcast(new Intent(bcAtualizarInterface));
// CONECTA A INTERFACE BLUETOOTH
(new TarefaConectar()).execute((Void) null);
}
}
/** Expressa o desejo do usuario em desconectar a conexao Bluetooth.
**/
private static void Desconectar() {
if (estado == estadoConectado) {
estado = estadoDesconectando;
context.sendBroadcast(new Intent(bcAtualizarInterface));
SolicitarDesconexao();
}
}
/**
* Verifica se o aplicativo esta em condicoes de ser fechado, ou
seja, se as conexoes foram fechadas.
**/
private static boolean PodeSair() {
// Verifica se foi desconectado
if (estado == estadoDesconectado) {
return true;
} else {
String[] mensagens = {"Dispositivo conectado.", "Por
favor, desconecte antes de sair."};
Mensagens.Notificacao(context, mensagens);
return false;
}
}
/** Cria os estados do ambiente grafico. **/
private static final int estadoConectado = 0, estadoDesconectado = 1,
estadoConectando = 2, estadoDesconectando = 3;
private static int estado = estadoDesconectado;
/** Objeto que armazena os dados de um dispositivo Bluetooth **/
private static class DispositivoBluetooth {
private static String nome;
private static String endereco;
public DispositivoBluetooth(String nome, String endereco) {
DispositivoBluetooth.nome = nome;
DispositivoBluetooth.endereco = endereco;
}
public static String getNome() {

87

return nome;
}
public static String getEndereco() {
return endereco;
}
}
/** Armazena um {@link DispositivoBluetooth} com o dispositivo
selecionado. **/
private static DispositivoBluetooth dispositivoBluetooth;
/** Armazena uma solicitacao de desconexao. **/
private static boolean solicitadoDesconexao = false;
/** Registrar que foi solicitado uma desconexao. **/
private synchronized static void SolicitarDesconexao() {
solicitadoDesconexao = true;
}
/** Registrar que a solicitacao de desconexao foi atendida. **/
private synchronized static void SolicitacaoAtendida() {
solicitadoDesconexao = false;
}
/** Retorna um valor represenando se existe uma solicitacao
desconexao. **/
private synchronized static boolean SolicitadoDesconexao() {
return solicitadoDesconexao;
}

de

/**
*
Tarefa executada em segundo plano, responsavel por inicar a
comunicacao Bluetooth atraves
* da classe {@link BluetoothConnection}.
*/
private static class TarefaConectar extends AsyncTask<Void, Void,
Boolean> {
@Override
protected void onPostExecute(Boolean resultado) {
if (resultado.booleanValue()) {
estado = estadoConectado;
context.sendBroadcast(new Intent(bcIniciarServico));
(new TarefaComunicar()).execute((Void) null);
} else {
String[]
mensagens
{BluetoothConnection.getMensagemErro()};
Mensagens.Notificacao(context, mensagens);
estado = estadoDesconectado;
}

context.sendBroadcast(new Intent(bcAtualizarInterface));
super.onPostExecute(resultado);
}
@Override
protected Boolean doInBackground(Void... params) {
return

88

Boolean.valueOf(BluetoothConnection.Conectar(DispositivoBluetooth.getEndere
co()));
}
}
/**
* Tarefa executada em segundo plano, responsavel por realizar as
chamadas as funcoes
* de comunicacao Bluetooth definidas em {@link BluetoothConnection}
seguindo o protocolo pre-especificado.
*/
private static class TarefaComunicar extends AsyncTask<Void, Integer,
Boolean> {
private static final int ValoresMotor = 0, Sensor1 = 1, Sensor2
= 2;
/**
* Executada assim que a tarefa e concluida.
* Executa os procedimentos de desconexao e reestabelecimento
das condicoes iniciais.
*/
@Override
protected void onPostExecute(Boolean resultado) {
BluetoothConnection.Desconectar();
SolicitacaoAtendida();
estado = estadoDesconectado;
context.sendBroadcast(new Intent(bcPararServico));
context.sendBroadcast(new Intent(bcAtualizarInterface));
super.onPostExecute(resultado);
}
/**
* Executada para publicar os eventos da tarefa na interface
grafica do aplicativo.
*/
@Override
protected void onProgressUpdate(Integer... values) {
Intent intent;
switch (values[0].intValue()) {
case ValoresMotor:
context.sendBroadcast(new
Intent(bcAtualizaValoresMotor));
break;
case Sensor1:
intent = new Intent(bcAtualizaSensor1);
intent.putExtra(bcAtualizaSensor1, values[1]);
context.sendBroadcast(intent);
break;
case Sensor2:
intent = new Intent(bcAtualizaSensor2);
intent.putExtra(bcAtualizaSensor2, values[1]);
context.sendBroadcast(intent);
break;
}

89

super.onProgressUpdate(values);
}
/**
* Tread responsavel por executar a tarefa. Define o protocolo
a nivel de Software
* a ser utilizado na comunicacao.
*/
@Override
protected Boolean doInBackground(Void... params) {
try {
while (!SolicitadoDesconexao()) {
publishProgress(ValoresMotor);
BluetoothConnection.Escrever(PegaValoresMotor());
publishProgress(Sensor1,
BluetoothConnection.Ler());
publishProgress(Sensor2,
BluetoothConnection.Ler());
}
return Boolean.TRUE;
} catch (IOException e) {
return Boolean.FALSE;
}
}
}
/**
*
* Define o servico que mantem ativa a conexao Bluetooth
* para o caso da interface grafica ser encerrada, nao permitindo
* que o sistema mate a aplicacao.
*
*/
public static class BluetoothService extends Service {
public static final int id = 5114463;
public
static
final
String
ConexaoBluetoothGuincho
"ufg.eeec.guincho.bluetooth";

@Override
public void onDestroy() {
stopForeground(true);
super.onDestroy();
}
@Override
public void onCreate() {
super.onCreate();
Notification
notification=
Notification(R.drawable.ic_launcher,
getText(R.string.conexao_inicializada), System.currentTimeMillis());

new

Intent intents = new Intent(this, Principal.class);


PendingIntent contentIntent = PendingIntent.getActivity(this,
0, intents, 0);

90

notification.setLatestEventInfo(this,
getText(R.string.conexao_inicializada),
getText(R.string.dispositivo_bluetooth_conectado), contentIntent);
startForeground(id, notification);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
return START_NOT_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
};
/**
* Faz as alteracoes visuais
nos controles, habilitando
desabilitando,
*
de acordo com a condicao do aplicativo: conectado
desconectado.
*/
private void AtualizarInterface() {
String[] mensagens;

ou
ou

cmdLigaDeslMot1.setEnabled(estado == estadoConectado);
cmdLigaDeslMot2.setEnabled(estado == estadoConectado);
cmdLigaDeslIma.setEnabled(estado == estadoConectado);
cmdBluetooth.setEnabled(estado == estadoDesconectado);
cmdConnect.setEnabled(dispositivoBluetooth != null && estado ==
estadoDesconectado);
cmdDisconnect.setEnabled(estado == estadoConectado);
if (dispositivoBluetooth != null) {
mensagens = new String[3];
if (estado == estadoConectado) {
mensagens[0] = "Conectado:";
} else if (estado == estadoConectando) {
mensagens[0] = "Conectando:";
} else if (estado == estadoDesconectando) {
mensagens[0] = "Desconectando:";
} else if (estado == estadoDesconectado) {
mensagens[0] = "Selecionado:";
}
mensagens[1] = DispositivoBluetooth.getNome();
mensagens[2] = " (" + DispositivoBluetooth.getEndereco()
+ ")";
} else {
mensagens = new String[1];
mensagens[0] = getString(R.string.SemDispositivo);
}
Mensagens.Notificacao(getApplicationContext(), mensagens);
}

91

/**
* Busca as informacoes nos controles visuais, como botoes ou barras
de progresso,
* e armazena estas informacoes em objetos {@link Motor}.
*/
private synchronized void AtualizaValoresMotor() {
if (BluetoothConnection.Motor1 != null) {
BluetoothConnection.Motor1.setLigado(cmdLigaDeslMot1.isChecked()
Math.abs(sbPosDesMot1.getProgress()
ValoresPreferencias.limiteInferiorMotor1
pbPosMot1.getProgress())
ValoresPreferencias.precisao);
BluetoothConnection.Motor1.setHorario(sbPosDesMot1.getProgress()
ValoresPreferencias.limiteInferiorMotor1 > pbPosMot1.getProgress());
}

&&
+
>
+

if (BluetoothConnection.Motor2 != null) {
BluetoothConnection.Motor2.setLigado(cmdLigaDeslMot2.isChecked()
Math.abs(sbPosDesMot2.getProgress()
ValoresPreferencias.limiteInferiorMotor2
pbPosMot2.getProgress())
ValoresPreferencias.precisao);
BluetoothConnection.Motor2.setHorario(sbPosDesMot2.getProgress()
ValoresPreferencias.limiteInferiorMotor2 > pbPosMot2.getProgress());
}

&&
+
>
+

BluetoothConnection.Ima = cmdLigaDeslIma.isChecked();
}
/**
* Pega os valores dos objetos {@link Motor} e serializa em um numero
inteiro de 0 a 255.
* O numero e formado somando-se os valores conforme abaixo:
* <br>
* <br>
Motor1
Ligado
= 1
* <br>
Motor1
Sentido
= 2
* <br>
Motor2
Ligado
= 4
* <br>
Motor2
Sentido
= 8
* <br>
Ima
Ligado
= 16
*
* @return Um inteiro de 0 a 255.
*/
private synchronized static int PegaValoresMotor() {
int retorno = 0;
if (BluetoothConnection.Motor1.isLigado())

retorno

+=

if (BluetoothConnection.Motor1.isHorario())

retorno

+=

if (BluetoothConnection.Motor2.isLigado())

retorno

+=

if (BluetoothConnection.Motor2.isHorario())

retorno

+=

if (BluetoothConnection.Ima)

retorno

+=

0x01;
0x02;
0x04;
0x08;
0x10;
return retorno;
}

92

/**
* Armazena os valores das ultimas preferencias salvas.
*/
private static class ValoresPreferencias {
private static int limiteInferiorMotor1;
private static int limiteSuperiorMotor1;
private static int limiteInferiorMotor2;
private static int limiteSuperiorMotor2;
private static int precisao;
}
}
package ufg.eeec.guincho;
import
import
import
import

java.io.IOException;
java.io.InputStream;
java.io.OutputStream;
java.util.UUID;

import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
/**
*
Cria todas as condicoes para comunicacao Bluetooth.
*
*/
public class BluetoothConnection {
/**
*
* Define os parametros da conexao Bluetooth
*
*
*/
private static String mensagemErro;
private static BluetoothSocket bluetoothSocket;
private static OutputStream outputStream;
private static InputStream inputStream;
public static Motor Motor1, Motor2;
public static boolean Ima;
public static boolean Conectar(String enderecoDispositivo) {
BluetoothAdapter
bluetoothAdapter
BluetoothAdapter.getDefaultAdapter();
if (bluetoothAdapter != null) {
BluetoothDevice
bluetoothDevice
bluetoothAdapter.getRemoteDevice(enderecoDispositivo);

try {
mensagemErro

"Erro

ao

criar

conexao

com

dispositivo";
bluetoothSocket
=
bluetoothDevice.createRfcommSocketToServiceRecord(UUID.fromString("00001101
-0000-1000-8000-00805F9B34FB"));

93

mensagemErro = "Erro ao conectar ao dispositivo";


bluetoothSocket.connect();
mensagemErro = "Erro ao solicitar Canal de Saida";
outputStream = bluetoothSocket.getOutputStream();
mensagemErro

"Erro

ao

solicitar

Canal

de

Entrada";
inputStream = bluetoothSocket.getInputStream();
Motor1 = new Motor();
Motor2 = new Motor();
return true;
} catch (IOException e) {
Desconectar();
return false;
}
} else {
mensagemErro = "Nao foi encontrado adaptador Bluetooth.";
return false;
}
}
public static boolean Desconectar() {
try {
if (outputStream != null)
outputStream.close();
} catch (IOException e) {}
try {
if (inputStream != null)
inputStream.close();
} catch (IOException e) {}
try {
if (bluetoothSocket != null)
bluetoothSocket.close();
} catch (IOException e) {}
outputStream = null;
inputStream = null;
bluetoothSocket = null;
Motor1 = null;
Motor2 = null;
Ima = false;
return true;
}
public static int Ler() throws IOException {
int valor = inputStream.read();
System.out.println("In: " + valor);
return valor;
}
public static void Escrever(int valor) throws IOException {
outputStream.write(valor);
System.out.println("Out: " + valor);

94

}
public static String getMensagemErro() {
return mensagemErro;
}
/**
*
* Define os valores ativados para os Motores e para o Ima
*
*/
public static class Motor {
private boolean ligado = false;
private boolean horario = true;
public synchronized boolean isLigado() {
return ligado;
}
public synchronized void setLigado(boolean ligado) {
this.ligado = ligado;
}
public synchronized boolean isHorario() {
return horario;
}
public synchronized void setHorario(boolean horario) {
this.horario = horario;
}
}
}
package ufg.eeec.guincho;
import
import
import
import
import

java.util.ArrayList;
java.util.HashMap;
java.util.Iterator;
java.util.Map;
java.util.Set;

import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import

android.app.Activity;
android.app.AlertDialog;
android.app.Dialog;
android.bluetooth.BluetoothAdapter;
android.bluetooth.BluetoothDevice;
android.content.BroadcastReceiver;
android.content.Context;
android.content.DialogInterface;
android.content.Intent;
android.content.IntentFilter;
android.os.Bundle;
android.provider.Settings;
android.view.View;
android.widget.AdapterView;
android.widget.Button;
android.widget.ListView;
android.widget.SimpleAdapter;

95

public class BluetoothActivity extends Activity {


private BluetoothAdapter bluetooth;
@Override
protected void onDestroy() {
try {
unregisterReceiver(broadcastReceiver);
} catch (Exception e) {}
super.onDestroy();
}
private
int
DialogTitle,
DialogText;
private
String
DialogTitleString;
private DialogInterface.OnClickListener DialogOkAction;
private DialogInterface.OnClickListener DialogCancelAction;
final private int DialogOk = 0, DialogOkCancel = 1, DialogWishConnect
= 2;
final private int turnOnBluetooth = 100;
final private int showBluetoothConfig = 200;
@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case DialogOk:
return
AlertDialog.Builder(BluetoothActivity.this)
.setTitle(DialogTitle)
.setPositiveButton(android.R.string.ok,
DialogOkAction)
.setMessage(DialogText)
.create();
case DialogOkCancel:
return
AlertDialog.Builder(BluetoothActivity.this)
.setTitle(DialogTitle)
.setPositiveButton(android.R.string.ok,
DialogOkAction)
.setNegativeButton(android.R.string.cancel,
DialogCancelAction)
.setMessage(DialogText)
.create();
case DialogWishConnect:
return
AlertDialog.Builder(BluetoothActivity.this)
.setTitle(DialogTitleString)
.setPositiveButton(android.R.string.ok,
DialogOkAction)
.setNegativeButton(android.R.string.cancel,
DialogCancelAction)
.setMessage(DialogText)
.create();
default:
return null;
}
}
@Override
protected
Intent data) {

void

onActivityResult(int

requestCode,

int

new

new

new

resultCode,

96

switch (requestCode) {
case turnOnBluetooth:
if (resultCode == RESULT_CANCELED)
TurnOnBluetooth();
break;
case showBluetoothConfig:
LoadBTTypes();
break;
}
super.onActivityResult(requestCode, resultCode, data);
}
private
final
BroadcastReceiver() {

BroadcastReceiver

broadcastReceiver

@Override
public void onReceive(Context context, Intent intent) {
if
(intent.getAction().compareTo(BluetoothAdapter.ACTION_STATE_CHANGED)
{
if
(intent.getIntExtra(BluetoothAdapter.EXTRA_STATE,
-1)
BluetoothAdapter.STATE_OFF)
TurnOnBluetooth();
else
(intent.getIntExtra(BluetoothAdapter.EXTRA_STATE,
-1)
BluetoothAdapter.STATE_ON)
LoadBTTypes();
}
}
};

new

==

0)
==
if
==

private void TurnOnBluetooth() {


if (!bluetooth.isEnabled()) {
DialogTitle = R.string.BluetoothOffTitle;
DialogText = R.string.BluetoothOffText;
DialogOkAction = new DialogInterface.OnClickListener() {
@Override
public void

onClick(DialogInterface

dialog,

int

which) {
startActivityForResult(new
Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE), turnOnBluetooth);
}
};
DialogCancelAction = new DialogInterface.OnClickListener()
{
@Override
public void

onClick(DialogInterface

dialog,

int

which) {
if (!bluetooth.isEnabled())
BluetoothActivity.this.finish();
}
};
showDialog(DialogOkCancel);
} else LoadBTTypes();
}

97

public static final String name = "Name", address = "Address";


private void LoadBTTypes() {
final
ListView
findViewById(R.id.lstBTTypes);

lstBTTypes

(ListView)

String[] from = {name, address};


int[] to = {android.R.id.text1, android.R.id.text2};
Set<BluetoothDevice> devices = bluetooth.getBondedDevices();
if (devices != null)
lstBTTypes.setAdapter(new
SimpleAdapter(this,
DevicesToNameAddress(devices),
android.R.layout.simple_list_item_2,
from,
to));
}
private
ArrayList<Map<String,
DevicesToNameAddress(Set<BluetoothDevice> devices) {
ArrayList<Map<String,
String>>
nameAddress
ArrayList<Map<String,String>>();

String>>
=

new

Iterator<BluetoothDevice> iterator = devices.iterator();


while (iterator.hasNext())
nameAddress.add(DeviceToMap(iterator.next()));
return nameAddress;
}
private Map<String, String> DeviceToMap(BluetoothDevice device) {
Map<String, String> map = new HashMap<String, String>();
map.put(name, device.getName());
map.put(address, device.getAddress());
return map;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.bluetooth);
bluetooth = BluetoothAdapter.getDefaultAdapter();
if (bluetooth != null) {
registerReceiver(broadcastReceiver,
IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED));
TurnOnBluetooth();

new

((Button)
findViewById(R.id.btnBTConfig)).setOnClickListener(new
Button.OnClickListener() {
@Override
public void onClick(View v) {
startActivityForResult(new
Intent(Settings.ACTION_BLUETOOTH_SETTINGS), showBluetoothConfig);
}
});

98

final
ListView
findViewById(R.id.lstBTTypes);

lstBTTypes

(ListView)

lstBTTypes.setOnItemClickListener(new
ListView.OnItemClickListener() {
@Override
public void
arg1, int item, long arg3) {
final
lstBTTypes.getItemAtPosition(item);

onItemClick(AdapterView<?>
Map<?,

?>

map

arg0,

View

(Map<?,

?>)

DialogTitleString = ((String) map.get(name)) +


"\n(" + ((String) map.get(address)) + ")";
DialogText = R.string.WishConnect;
DialogOkAction
=
new
DialogInterface.OnClickListener() {
@Override
public
void

onClick(DialogInterface

dialog, int which) {


Intent data = new Intent();
data.putExtra(name,
(String)
map.get(name));
data.putExtra(address,

(String)

map.get(address));
BluetoothActivity.this.setResult(BluetoothActivity.RESULT_OK, data);
BluetoothActivity.this.finish();
}
};
DialogCancelAction
DialogInterface.OnClickListener() {
@Override
public
void

new

onClick(DialogInterface

dialog, int which) {}


};
showDialog(DialogWishConnect);
}
});
} else {
DialogTitle = R.string.BluetoothAdapterNotFoundTitle;
DialogText = R.string.BluetoothAdapterNotFoundText;
DialogOkAction = new DialogInterface.OnClickListener() {
@Override
public void

onClick(DialogInterface

dialog,

int

which) {
BluetoothActivity.this.finish();
}
};
showDialog(DialogOk);
}
}
}

99

package ufg.eeec.guincho;
import android.os.Bundle;
import android.preference.PreferenceActivity;
public class Preferencias extends PreferenceActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
setResult(BluetoothActivity.RESULT_OK);
}
}
package ufg.eeec.guincho;
import
import
import
import
import
import

android.annotation.SuppressLint;
android.content.Context;
android.view.Gravity;
android.widget.LinearLayout;
android.widget.TextView;
android.widget.Toast;

public class Mensagens {


@SuppressLint("ShowToast")
public static void Notificacao(Context context, String[] mensagens) {
if (mensagens != null) {
if (mensagens.length > 0) {
Toast toast = Toast.makeText(context, mensagens[0],
Toast.LENGTH_SHORT);
LinearLayout
linearLayout
=
(LinearLayout)
toast.getView();
for (int i = 1; i < mensagens.length; i++) {
TextView
textView
=
(TextView)
Toast.makeText(context,
mensagens[i],
Toast.LENGTH_SHORT).getView().findViewById(android.R.id.message);
((LinearLayout)
textView.getParent()).removeView(textView);
linearLayout.addView(textView);
}
linearLayout.setGravity(Gravity.CENTER_HORIZONTAL);
toast.show();
}
}
}
}

100

Вам также может понравиться