You are on page 1of 94

UNIVERSIDADE ESTADUAL DO RIO GRANDE DO SUL

UNIDADE EM GUABA
CURSO DE ENGENHARIA DE SISTEMAS DIGITAIS

HENRIQUE GABRIEL RODRIGUES CORDEIRO

DISPOSITIVO PERIFRICO PARA CAPTURA DE MOVIMENTOS DAS MOS

GUABA
2012

HENRIQUE GABRIEL RODRIGUES CORDEIRO

DISPOSITIVO PERIFRICO PARA CAPTURA DE MOVIMENTOS DAS MOS

Trabalho de Concluso de Curso


apresentado como requisito parcial
para obteno do ttulo de Bacharel em
Engenharia de Sistemas Digitais na
Universidade Estadual do Rio Grande
do Sul.

Orientador: Profa. Dra. Letcia Vieira Guimares

GUABA
2012

HENRIQUE GABRIEL RODRIGUES CORDEIRO

DISPOSITIVO PERIFRICO PARA CAPTURA DE MOVIMENTOS DAS MOS

Trabalho de Concluso de Curso aprovado


como requisito parcial para obteno do
ttulo de Bacharel em Engenharia de
Sistemas Digitais na Universidade Estadual
do Rio Grande do Sul.
Aprovado em ....../....../......
BANCA EXAMINADORA:

Profa. Dra. Letcia Vieira Guimares

Prof. Dr. Daniel Sander Hoffmann

Prof. Dr. Fernando Gonalves Pilotto

A minha filha, Yumi.

AGRADECIMENTOS

Professora Dra. Letcia Vieira Guimares, minha orientadora, por todo o apoio,
pacincia e dedicao.
A minha amada filha, Yumi, pelo simples fato de existir e ser a razo da minha vida.
A minha esposa, Caroline, pelos puxes de orelha nos meus momentos de preguia,
por me motivar sempre e ainda por me ajudar na soldagem dos acelermetros nas
placas.
Aos colegas de curso, de trabalho e amigos, pelo apoio e sugestes dadas.
Ao ex-colega de curso, colega de trabalho e, acima de tudo, amigo, Leonardo
Bordignon Ceolin, com sua imprescindvel colaborao no projeto e manufatura das
PCBs dos acelermetros.
Aos meus pais, Jorge e Nara, um agradecimento especial, por todas as noites de
sono perdidas, dores de cabea que lhes causei e por terem dedicado grande parte
de suas vidas ao objetivo de me dar uma vida melhor do que a que puderam ter.

"Educai as crianas e no ser preciso punir os homens."


Pitgoras de Samos

RESUMO

O presente trabalho aborda o desenvolvimento de um dispositivo perifrico


composto por sensores de acelerao, que permite a interao com o computador
por meio de movimentos da mo humana. Este dispositivo responsvel por
detectar os movimentos da mo e dos dedos, atravs de acelermetros
posicionados em locais especficos. Os sinais detectados so enviados para uma
interface

microcontrolada

responsvel

por

realizar

condicionamento

processamento dos mesmos e disponibiliz-los para o computador atravs de uma


interface de comunicao serial. Alm disso, foi desenvolvido um software que
interpreta e exibe graficamente os movimentos realizados.

Palavras-chave: Captura de Movimentos, Movimentos das Mos, Acelermetros,


Microcontroladores, Comunicao Serial.

ABSTRACT

The present work addresses the development of a peripheral device composed by


acceleration sensors, that allows interaction with the computer througout human
hand gestures. This device is responsible for detecting hand gestures and finger
moves, through accelerometers placed in specific locations. The detected signals are
sent to a microcontrolled interface, responsible for perform the conditioning and
processing of the signals and make them available to a computer via serial
communication interface. Also, a software was developed that translates and shows
graphically the performed gestures.

Key-words: Motion Capture, Hand Gestures, Accelerometers, Microcontrollers,


Serial Communication.

LISTA DE ILUSTRAES
Figura 1 - Sistema massa-mola..................................................................................17
Figura 2 - Estrutura bsica de um acelermetro.........................................................19
Figura 3 - Estrutura bsica de um acelermetro com a posio da massa e do
encapsulamento..........................................................................................................19
Figura 4 - Estrutura interna de um acelermetro capacitivo.......................................21
Figura 5 - Configurao comb-drive de um micro-acelermetro capacitivo...............22
Figura 6 - Material piezoeltrico antes (a) e durante (b) a aplicao de presso, a
qual gera uma tenso eltrica.....................................................................................23
Figura 7 - Diagrama de blocos de um microcontrolador.............................................24
Figura 8 - Estrutura interna da CPU............................................................................25
Figura 9 - Esquema bsico de uma memria de 16 posies....................................26
Figura 10 - Ossos da mo humana.............................................................................34
Figura 11 - Dedos da mo esquerda...........................................................................35
Figura 12 - Movimento de flexo e extenso do dedo indicador da mo direita........36
Figura 13 - Movimentos de aduo e abduo do dedo indicador da mo direita.....37
Figura 14 - Movimentos de pronao e supinao da mo direita.............................37
Figura 15 - Diagrama de blocos simplificado do projeto.............................................38
Figura 16 - Disposio dos acelermetros na luva (mo direita)...............................39
Figura 17 Vista superior e inferior do acelermetro MMA7260...............................42
Figura 18 - Pinagem do MMA7260 (viso do topo)...................................................43
Figura 19 - Sentido da acelerao em cada um dos eixos........................................44
Figura 20 - Acelerao esttica nos eixos do acelermetro MMA7260 em
posicionamentos diferentes.........................................................................................45
Figura 21 - Diagrama de conexes do acelermetro MMA7260QT...........................46
Figura 22 - PCB para o acelermetro MMA7260, vista superior (esquerda) e inferior
(direita).........................................................................................................................47
Figura 23: Arduino Uno...............................................................................................48
Figura 24 - Ambiente de Desenvolvimento Arduino....................................................49
Figura 25 - Pinagem do multiplexador CD4051B.......................................................50
Figura 26 - Setup para teste do acelermetro............................................................51
Figura 27 - Sinal observado no osciloscpio ao causar movimento em um dos eixos
do acelermetro...........................................................................................................52

Figura 28 - Acelermetro com conector fmea soldado.............................................52


Figura 29 - Conexo do acelermetro com o Arduino (fios de GND e VDD ainda no
soldados).....................................................................................................................53
Figura 30 - Dados recebidos do Arduino pelo programa Terminal, com o
acelermetro em repouso...........................................................................................55
Figura 31 - Dados recebidos do Arduino pelo programa Terminal, com o
acelermetro sendo movimentado e com o valor lido convertido em tenso.............56
Figura 32 - Grfico gerado pelo cdigo Processing relativo a tenso observada nas
sadas dos acelermetros...........................................................................................57
Figura 33 - Luva com acelermetro fixado..................................................................57
Figura 34 - Acelerao lida nos eixos dos acelermetros da mo e dos dedos........59
Figura 35 - Movimento de rotao do eixo x. .............................................................60
Figura 36 - Grfico Tenso versus Acelerao para o eixo do acelermetro MM7260.
.....................................................................................................................................60
Figura 37 - ngulos lidos nos eixos dos acelermetros da mo e dos dedos...........61
Figura 38 - Modelo tridimensional de uma mo com esqueleto para animao........62
Figura 39 Diagrama de classes do programa HandCube.......................................63
Figura 40 - Dispositivo conectado ao computador......................................................65
Figura 41 - Tela inicial do software HandCube...........................................................66
Figura 42 - Cubos sendo movimentados com os movimentos da mo no HandCube.
.....................................................................................................................................67

LISTA DE TABELAS
Tabela 1 - Sinal digital com resoluo de 2 bits, correspondente a um sinal analgico
de 0 5 volts...............................................................................................................31
Tabela 2 - Resoluo por bit e valor mximo para uma faixa dinmica de 5V em
conversores de 8, 10 e 16 bits....................................................................................31
Tabela 3 - Descrio dos pinos do acelermetro MMA7260......................................42
Tabela 4 - Descrio dos pinos g-Select.....................................................................43

LISTA DE ABREVIATURAS E SIGLAS

A/D Analgico/Digital
API Application Programming Interface
CI Circuito Integrado
CPU Central Processing Unit
EPROM Erasable Programmable Read Only Memory
EEPROM Eletrically Erasable Programmable Read Only Memory
GND Ground
I/O Input/Output
PCB Printed Circuit Board
PVDF Polyvinylidene Fluoride
PWM Pulse-Width Modulation
QFN Quad-Flat no-Leads
RAM Random Access Memory
ROM Read Only Memory
RS-232 Recommended Standard 232
SI Sistema Internacional de Unidades
UC Unidade de Controle
UCP Unidade Central de Processamento
ULA Unidade Lgica e Aritmtica
USB Universal Serial Bus

SUMRIO
1

INTRODUO...............................................................................................14

REFERENCIAL TERICO............................................................................16

2.1

ACELERAO...............................................................................................16

2.2

ACELERMETROS.......................................................................................16

2.2.1

Princpio de Funcionamento.......................................................................17

2.2.2

Estrutura de um Acelermetro....................................................................18

2.2.3

Resposta em Frequncia do Acelermetro...............................................19

2.2.4

Tipos de Acelermetros...............................................................................21

2.2.4.1 Acelermetro Capacitivo................................................................................21


2.2.4.2 Acelermetro Piezoresistivo..........................................................................22
2.2.4.3 Acelermetro Piezoeltrico............................................................................23
3

MICROCONTROLADORES..........................................................................24

3.1

CPU (CENTRAL PROCESSING UNIT).........................................................24

3.2

MEMRIA......................................................................................................25

3.2.1

ROM (Read Only Memory)...........................................................................27

3.2.2

EPROM (Erasable Programmable Read Only Memory)...........................27

3.2.3

EEPROM (Eletrically Erasable Programmable Read Only Memory)......27

3.2.4

Flash..............................................................................................................28

3.2.5

RAM (Random Access Memory).................................................................28

3.3

ENTRADA E SADA (I/O)...............................................................................28

3.4

COMUNICAO SERIAL..............................................................................29

3.5

CONVERSOR A/D (ANALGICO/DIGITAL)..................................................29

3.5.1

Faixa Dinmica.............................................................................................30

3.5.2

Resoluo.....................................................................................................30

3.5.3

Tempo de Converso...................................................................................32

3.5.4

Erro de Linearidade......................................................................................32

3.6

CLOCK...........................................................................................................33

3.7

TEMPORIZADOR...........................................................................................33

ANATOMIA DA MO.....................................................................................34

4.1

DEDOS...........................................................................................................35

4.2

MOVIMENTOS ARTICULARES.....................................................................35

4.2.1

Flexo, Extenso e Hiperextenso.............................................................36

4.2.2

Abduo........................................................................................................36

4.2.3

Aduo...........................................................................................................37

4.2.4

Pronao e Supinao.................................................................................37

DEFINIO DO PROJETO...........................................................................38

5.1

ESPECIFICAES INICIAIS.........................................................................38

5.2

METODOLOGIA.............................................................................................40

5.3

SELEO DE COMPONENTES...................................................................41

5.3.1

Acelermetro MMA7260...............................................................................41

5.3.2

Arduino..........................................................................................................47

5.3.2.1 Arduino Uno...................................................................................................48


5.3.2.2 Ambiente De Desenvolvimento Arduino........................................................49
5.3.3

Multiplexador CD4051B...............................................................................50

IMPLEMENTAO DO PROJETO...............................................................51

RESULTADOS OBTIDOS..............................................................................65

IMPLEMENTAES FUTURAS...................................................................68

CONCLUSO................................................................................................69
REFERNCIAS................................................................................................70
APNDICE A PROGRAMA TESTESERIAL.INO.............................................74
APNDICE B PROGRAMA TESTESERIAL2.INO...........................................75
APNDICE C PROGRAMA TESTESERIAL3.INO...........................................76
APNDICE D PROGRAMA TESTEACEL.INO................................................78
APNDICE E PROGRAMA TESTEACELANGULOS.INO...............................80
APNDICE F PROGRAMA ACELEROMETRO.INO.......................................82
APNDICE G CLASSE COMMUNICATOR.JAVA...........................................85
APNDICE H CLASSE HANDCUBE.JAVA.....................................................90

14
1

INTRODUO

O computador, em suas diversas formas, pode ser visto basicamente como


uma mquina capaz de resolver problemas atravs de clculos matemticos. Porm
sua funo vai muito alm da resoluo de problemas propriamente ditos, sendo
muitas vezes usado tambm para entretenimento, alm de auxiliar nas mais diversas
tarefas do dia-a-dia. Para que o uso do computador seja possvel, ou seja, para que
o homem possa "dizer" ao computador o que este deve fazer e, para que o
computador, por sua vez, seja capaz de dar-lhe algum tipo de resposta, necessrio
que haja algum mecanismo de interao entre os dois. Este mecanismo de interao
se d por meio dos dispositivos perifricos chamados de interface homem mquina
(Human Machine Interface).
Atualmente, nos deparamos com os mais diversos tipos de perifricos, que
determinam as mais diversas formas de interao entre o homem e a mquina. Os
perifricos mais bsicos e largamente difundidos, quando se trata de computadores
de mesa (os desktops), so o teclado, o monitor de vdeo e o mouse. Porm,
levando-se em conta outros sistemas computacionais, tais como telefones celulares,
video games, tablets, entre outros, encontram-se diversas outras formas de
interao com os sistemas computacionais.
Um exemplo que pode-se destacar o do joystick utilizado no Nintendo Wii,
console da empresa de entretenimento japonesa Nintendo. O Wiimote (contrao de
Wii Remote), como chamado, alm de possuir os botes encontrados nos joysticks
tradicionais, tambm capaz de captar os movimentos que o jogador faz com o
mesmo. Dessa forma, a pessoa capaz de interagir com os jogos imitando
movimentos do mundo real, como o balanar de um taco de golfe, o brandir de uma
espada ou socos em uma luta de boxe. Isso possvel graas aos sensores
contidos no joystick, que na verdade no so capazes de captar movimentos, mas
sim a acelerao a que so submetidos. A estes sensores d-se o nome de
acelermetros. O entendimento do seu funcionamento bem como a sua utilizao
sero imprescindveis para o desenvolvimento deste trabalho.

15
O presente trabalho visa o emprego de acelermetros no desenvolvimento de
um perifrico de entrada em forma de luva, capaz de captar movimentos simples
feitos pela mo humana. Os sensores sero conectados uma interface
responsvel por tratar os sinais captados pelos sensores e envi-los a uma porta
serial do computador. No ser um objetivo deste trabalho definir uma aplicao
especfica para o dispositivo, pois a ideia desenvolver um perifrico que possa ser
usado nas mais diversas aplicaes possveis, seja em entretenimento, controle
remoto ou at mesmo em fisioterapia.

16
2

2.1

REFERENCIAL TERICO

ACELERAO

De acordo com a Primeira Lei de Newton, quando a fora resultante sobre um


corpo igual a zero as foras que atuam sobre o corpo se anulam , este est em
repouso ou se desloca em velocidade constante (movimento retilneo uniforme). J a
Segunda Lei de Newton afirma que quando a fora resultante sobre um corpo no
nula, este corpo est sofrendo uma acelerao. A acelerao determina a que taxa a
velocidade de um corpo varia, em m/s (metros por segundo ao quadrado) no SI.
A acelerao, assim como a velocidade, uma grandeza vetorial, portanto
possui um sentido. Pode ser positiva, acarretando em aumento da velocidade, ou
negativa, quando existe uma fora que se ope ao movimento, acarretando na
diminuio da velocidade, at que o corpo pare ou altere o sentido do seu
movimento.

2.2

ACELERMETROS

Acelermetros so dispositivos capazes de medir acelerao. Isto feito


convertendo-se a energia mecnica neste caso, a acelerao em um sinal de
tenso eltrica proporcional, podendo este ser digital ou analgico, dependendo do
acelermetro.
Os acelermetros so usados nos mais diversos tipos de aplicaes, podendo
ser usados para detectar impacto (air bags), queda livre (sistema de deteco de
queda em discos rgidos de notebooks), vibraes (sismgrafos), ngulos
(inclinmetros), mudana de posio (alterao de referncia da tela de celulares e
tablets) etc.

17
2.2.1 Princpio de Funcionamento

O princpio de funcionamento de um acelermetro baseia-se no sistema


massa-mola (figura 1). Um sistema massa-mola constitudo de uma massa m,
chamada massa de prova ou ssmica, presa por uma de suas extremidades a uma
mola, sendo que a outra extremidade da mola presa a um ponto fixo. Este sistema
governado pelo princpio fsico da Lei de Hooke, a qual descreve uma fora
restauradora exibida pela mola, quando comprimida ou esticada, ou seja, ao sofrer
uma deformao.

Figura 1 - Sistema massa-mola.


Fonte: https://ccrma.stanford.edu/CCRMA/Courses/252/sensors/node9.html

A fora restauradora age no sentido de restaurar o formato original da mola


sendo, portanto, oposta fora que a comprime ou estica. Esta fora dada pela
equao
F =kx ,

(1)

onde k a constante de elasticidade da mola e x a deformao (deslocamento)


sofrido pela mesma. A frmula possui o sinal negativo devido ao fato de a fora
restauradora da mola atuar no sentido oposto ao da fora que a estica ou comprime.
Outro princpio que fundamenta o funcionamento dos acelermetros a
Segunda Lei de Newton, a qual afirma que um corpo de massa m submetido a uma
acelerao a, possui uma fora agindo sobre ele dada pela frmula F=ma.
Substituindo F por kx da Lei de Hooke, obtm-se a seguinte equao 2.

18

a=

k
x
m

(2)

Uma vez que a massa m e k so constantes, observa-se que a acelerao


diretamente proporcional deformao sofrida pela mola, podendo-se ento medi-la
em funo desta deformao.
O deslocamento x pode ser detectado e convertido em sinal eltrico atravs
de diversas tcnicas de sensoreamento, sendo este o princpio que rege o
funcionamento de todos os tipos de acelermetro.
importante destacar que este mtodo capaz de medir acelerao em uma
nica direo. No entanto, existem acelermetros capazes de medir acelerao em
dois e at mesmo trs eixos. Neste caso, o acelermetro possui um sistema massamola para cada eixo, medindo a acelerao em cada um destes eixos
independentemente.

2.2.2 Estrutura de um Acelermetro

A estrutura bsica de um acelermetro ilustrada na figura 2. Um


acelermetro composto por uma massa de prova m conectada a base do sensor
atravs de uma mola de coeficiente k. Alm disso, existe o coeficiente de
amortecimento , devido a perdas mecnicas da mola e viscosidade do meio
(RIPKA & TIPEK, 2007), pois os acelermetros podem conter algum tipo de gs ou
lquido (KAAJAKARI, 2009).
Quando o acelermetro submetido a uma acelerao a, produzido, devido
inrcia, um movimento relativo x da massa de prova, o qual detectado por um
transdutor, responsvel por transformar o movimento em um sinal eltrico de sada.

19

Figura 2 - Estrutura bsica de um acelermetro.


Fonte: RIPKA & TIPEK, 2007.

2.2.3 Resposta em Frequncia do Acelermetro

De acordo com Kaajakari (2009, p. 35), a equao do movimento em funo


do tempo, para a massa de prova m, dada por:

d 2 xm
dt

d ( x m x f )
+k ( x m x f )= F E ,
dt

(3)

onde xm e xf (figura 3) so as posies da massa de prova e do encapsulamento do


acelermetro, respectivamente, o coeficiente de amortecimento e k o
coeficiente de elasticidade da mola. FE a fora externa que age sobre a massa.

Figura 3 - Estrutura bsica de um acelermetro com a posio da massa e do encapsulamento.


Fonte: KAAJAKARI, 2009.

20
A equao (3) pode ser simplificada, subtraindo d2xf /dt2 de ambos os lados:

d 2( xm x f )
dt 2

d ( x mx f )
d2 x f
+k ( x m x f )=m
+F E
dt
dt 2

Levando-se em conta que

(4)

x= x f x m a diferena entre a posio do

encapsulamento do acelermetro e a posio da massa, tm-se:

d2x
dx
+ +kx= F ,
2
dt
dt

(5)

onde F a soma das foras inercial e externa, como ilustrado na equao 6.

F =m

d2 xf
dt 2

F E =m x f F E

(6)

Resolvendo a equao 5 usando a transformada de Laplace, definindo o fator


de qualidade mecnica Q=0m/ e assumindo que no h foras externas (FE=0)
(KAJAKAARI, 2009), obtm-se:

x=

x f
F /m
= 2
H ( s) x f
2
s + s0 / Q+0 s + s0 /Q+02
2

(7)

Logo, a resposta em frequncia do acelermetro dada pela seguinte


equao:

H ( s)

x
1
= 2
x f s +s 0 /Q+20

(8)

21
2.2.4 Tipos de Acelermetros

Os acelermetros podem ser construdos usando diferentes tecnologias.


Algumas delas sero brevemente descritas a seguir.

2.2.4.1 Acelermetro Capacitivo

Os acelermetros capacitivos so o tipo mais comumente empregado. Isso se


deve em grande parte ao seu baixo custo, pouca suscetibilidade a rudos e baixo
consumo de energia (KAAJAKARI, 2009, traduo nossa). Seu funcionamento
baseia-se na deteco da alterao na capacitncia alterao esta proporcional
acelerao sofrida pelo acelermetro , devido ao movimento relativo entre as
placas da massa de prova e as placas fixas estrutura de suporte do acelermetro
(figura 4).

Figura 4 - Estrutura interna de um acelermetro capacitivo.


Fonte: http://www.jera.com.br/hardware/hardware-acelerometro/.

22
As placas ou eletrodos encontram-se em uma disposio conhecida como
comb-drive, pelo fato de assemelharem-se aos dentes de dois pentes intercalados
(figura 5).

Figura 5 - Configurao comb-drive de um micro-acelermetro capacitivo.

Podem ser citados como exemplos de acelermetros capacitivos o ADXL150,


da Analog Devices, e o MMA7260, da Freescale.

2.2.4.2 Acelermetro Piezoresistivo

So transdutores que convertem a acelerao numa variao de resistncia


devido deformao de um strain-gage num dos braos de uma ponte de
Wheatstone (THOMAZINI, 2010). A fora exercida pela massa de prova faz variar a
resistncia do material piezoresistivo, sendo esta variao detectada pela ponte de
Wheatstone.

23
2.2.4.3 Acelermetro Piezoeltrico

Acelermetros piezoeltricos baseiam-se na propriedade existente em


determinados cristais naturais, como o quartzo, por exemplo, materiais cermicos e
alguns polmeros, como o PVDF, chamada de piezoeletricidade. Materiais
piezoeltricos so capazes de gerar um campo eltrico quando submetidos
deformaes, sendo que este campo pode ser medido em forma de tenso eltrica
(figura 6). A alterao do sentido da fora aplicada sobre o material (trao para
compresso) causa a inverso do sentido deste campo.

Figura 6 - Material piezoeltrico antes (a) e durante (b) a aplicao de presso, a qual gera uma
tenso eltrica.
Fonte: CALLISTER, 2002.

Nos acelermetros que baseiam-se nesse princpio, uma massa de prova


quando acelerada comprime um material piezoeltrico, o qual gera uma tenso
eltrica proporcional a acelerao sofrida. Estes acelermetros so capazes de
operar em frequncias baixas como 2Hz e frequncias acima de 5KHz e suportam
temperaturas acima de 120C.

24
3

MICROCONTROLADORES

Um microcontrolador um computador em um nico chip, otimizado para


controlar dispositivos externos enfatizando a autossuficincia e baixo custo (CESAR
FILHO, 2007). composto por uma Unidade Central de Processamento (CPU,
Central Processing Unit), memria de programa, memria de dados, entradas e
sadas para ligao com elementos externos, temporizadores, conversor A/D
(analgico/digital), entre outros componentes, como ilustra a figura 7.
Alguns destes componentes sero brevemente descritos a seguir.

Figura 7 - Diagrama de blocos de um microcontrolador.


Fonte: http://www.pictutorials.com/what_is_microcontroller.htm.

3.1

CPU (CENTRAL PROCESSING UNIT)

A CPU ou UCP, de Unidade Central de Processamento o componente


principal e mais importante de um microcontrolador, pois ela a responsvel pela
execuo do programa e processamento de todos os dados recebidos pelo
microcontrolador. muitas vezes chamada simplesmente de processador.
A CPU composta por diversos componentes. De acordo com Stallings
(2003, p. 11) seus principais componentes so os seguintes:

Unidade de Controle (UC): controla a operao da CPU e, portanto, do

25
microcontrolador;

Unidade Lgica e Aritmtica (ULA): desempenha as funes de


processamento de dados do microcontrolador;

Registradores: fornecem o armazenamento interno de dados para a CPU;

Interconexo da CPU (barramentos): mecanismo que possibilita a


comunicao entre a unidade de controle, a ULA e os registradores.

Figura 8 - Estrutura interna da CPU.


Fonte: STALLINGS, 2003.

3.2

MEMRIA

A memria tem por funo armazenar dados. Fazendo uma analogia, a


memria pode ser vista como um armrio, contendo uma srie de gavetas, onde
cada gaveta pode conter uma informao. Informaes podem ser colocadas ou
consultadas em uma gaveta especfica. Na memria, cada "gaveta" chamada
posio de memria e as operaes de "colocar" e "consultar" dados so chamadas
de escrita e leitura, respectivamente. Alm disso, para se ler ou escrever em uma
determinada posio de memria, necessrio conhecer o endereo daquela
posio.

26
Cada posio de memria possui um endereo nico, possibilitando sua
localizao. Dessa forma, toda vez que se deseja realizar uma operao sobre a
memria necessrio informar qual operao ser realizada (leitura ou escrita), em
qual endereo e, no caso da escrita, qual dado ser armazenado. Caso a operao
seja de leitura, o dado lido dever ser armazenado em algum local, como um
registrador do microcontrolador, para ser usado posteriormente. A figura 9 ilustra o
esquemtico simplificado de uma memria com 16 posies, com endereos de 0
15. Esto ilustradas na figura as linhas de dados, de endereo e de controle de
seleo da operao: leitura (read) ou escrita (write).

Figura 9 - Esquema bsico de uma memria de 16 posies.


Fonte: CESAR FILHO, 2007.

Os microcontroladores geralmente so baseados na arquitetura Harvard,


tendo a memria de programa separada da memria de dados. Para a memria de
programa, podem ser usadas memrias no-volteis, ou seja, memrias ROM,
EPROM, EEPROM e Flash, enquanto que para a memria de dados utilizada a
memria RAM, que uma memria voltil. Essa diferenciao ocorre pois a
memria de programa no deve ser perdida enquanto que a memria de dados deve

27
ser mantida somente enquanto o programa est em execuo. A seguir ser dada
uma descrio sobre cada um destes tipos de memria.

3.2.1 ROM (Read Only Memory)

As memrias deste tipo permitem apenas a leitura dos dados, como o seu
prprio nome indica (Read Only Memory, ou seja, Memria Somente Leitura). Esta
memria possui seus dados gravados pelo fabricante e possui a vantagem de ter
baixo custo em relao s outras. Geralmente utilizada na fabricao em massa
de produtos finais, onde no necessria a alterao de cdigo.
Apesar das suas vantagens, as memrias ROM vem sendo amplamente
substitudas por memrias FLASH, por estas permitirem a modificao dos dados
mesmo em um produto final. Desta forma o fabricante pode disponibilizar correes
e atualizaes de firmware para o seu produto, podendo at mesmo incluir novas
funcionalidades.

3.2.2 EPROM (Erasable Programmable Read Only Memory)

As memrias deste tipo podem ter seu contedo apagado atravs da


incidncia de raios ultravioleta sobre elas, podendo, desta forma, ser programadas
novamente.

3.2.3 EEPROM (Eletrically Erasable Programmable Read Only Memory)

As memrias EEPROM podem ser apagadas diversas vezes, eletricamente.


Podem ser lidas um nmero ilimitado de vezes, porm podem ser reprogramadas

28
um nmero limitado de vezes, sendo que este nmero varia entre cem mil e um
milho de vezes. Esta limitao se deve a deteriorao do chip de memria durante
o processo de apagamento os dados, o qual necessita de uma tenso eltrica mais
elevada.

3.2.4 Flash

A memria Flash considerada uma evoluo da memria EEPROM. Ela se


diferencia desta pelo fato de permitir escrita de dados em bloco, enquanto que a
memria EEPROM permite apenas escrita bit bit. Alm disso, as memrias Flash
ocupam uma rea menor do CI, permitindo desenvolver chips de maior capacidade
em espaos menores.
A memria Flash est sendo amplamente utilizada nos mais diversos
dispositivos, tais como pen drives, cmeras fotogrficas digitais e celulares.

3.2.5 RAM (Random Access Memory)

A memria RAM caracterizada por ser uma memria voltil os dados nela
armazenados so perdidos quando no h alimentao eltrica nos seus circuitos.
Esta memria utilizada no microcontrolador para armazenar dados ao longo da
execuo do programa, tais como constantes e variveis.

3.3

ENTRADA E SADA (I/O)

A entrada e sada (ou I/O, de input/output) o meio de comunicao do


microcontrolador com o mundo exterior. Atravs dela, o microcontrolador pode

29
receber e enviar dados para dispositivos externos. Um microcontrolador geralmente
possui vrias entradas e sadas, as quais correspondem a pinos do CI. Estes pinos
so agrupados em portas, geralmente em agrupamentos de 8 bits, podendo variar
de acordo com as caractersticas do microcontrolador.
Cada pino de uma porta pode ter seu fluxo de dados definido como de
entrada ou de sada. Pinos de entrada permitem a leitura de dados de sensores e
outros dispositivos externos ao microcontrolador, enquanto que pinos de sada
permitem o envio (escrita) de dados para atuadores e outros dispositivos.
As portas de entrada e sada podem ser digitais ou analgicas.

3.4

COMUNICAO SERIAL

Atravs de pinos especficos, pode-se realizar uma transferncia serial


bidirecional de dados com outro perifrico.
Normalmente so previstas duas linhas independentes de comunicao a
partir de dois pinos especficos, um para transmisso (Tx) e outro para recepo
(Rx). A linha de transmisso eltrica e fisicamente independente da linha de
recepo, o que permite transmitir um dado e receber outro simultaneamente
(CESAR FILHO, 2007).
Alguns microcontroladores possuem portas seriais fsicas, padro RS-232,
prontas para realizar comunicao com um PC ou outro microcontrolador. Em
modelos mais recentes, pode-se encontrar tambm pinos para comunicao via
USB.

3.5

CONVERSOR A/D (ANALGICO/DIGITAL)

O conversor A/D um dispositivo que, dado um sinal de entrada analgico,


capaz de gerar um sinal de sada digital correspondente. Desta forma, o
microcontrolador, que trabalha apenas com dados digitais, pode processar dados

30
oriundos de sensores que geram apenas sadas analgicas.
importante observar que um sinal digital apenas uma representao de
um sinal analgico. O sinal analgico contnuo no tempo, enquanto que o sinal
digital discreto. Se um sinal de tenso analgica varia de 0 a 5 volts, por exemplo,
esse sinal poder assumir infinitos valores dentro deste intervalo. J um sinal digital
equivalente poder apenas assumir alguns valores dentro deste intervalo. Isso
significa que sempre haver erro ou distores na converso de um sinal analgico
para digital.
As caractersticas de um conversor A/D que devem ser levadas em conta so
a faixa dinmica, a resoluo, o tempo de converso e o erro de linearidade.

3.5.1 Faixa Dinmica

A faixa dinmica a faixa de amplitude de operao do sinal analgico (em


geral uma tenso) dentro da regio de trabalho (linear) do conversor. O sinal de
entrada deve ser condicionado de forma a possibilitar sua mxima utilizao dentro
dessa faixa dinmica. Os conversores A/D apresentam na prtica uma faixa
dinmica de 0,1 a 10V (BONFIM, 2002).

3.5.2 Resoluo

A resoluo corresponde a menor quantidade que pode ser convertida


(resolvida) dentro da faixa dinmica do sinal de entrada. especificada pelo nmero
de bits do conversor. Considerando o exemplo anterior do sinal analgico que varia
de 0 a 5V, se a resoluo do conversor utilizado para gerar o sinal digital
correspondente fosse de 2 bits, a menor amplitude de tenso que pode ser resolvida
dada por 5V/2 = 1,25V. Ou seja, o degrau entre os valores representados ou
resoluo de tenso por bit de 1,25V. Na tabela 1, observa-se os valores de tenso
que podero ser representados pelo sinal digital. importante observar que o valor

31
mximo de tenso (5V) no pode ser representado. O valor mximo que se pode
representar, neste caso, dado por 1,25x(2-1)=3,75V. Sendo assim, as frmulas
para determinar resoluo de tenso por bit (Vres) para uma dada resoluo e o valor
mximo (Vmax) so, respectivamente:

V res =

V ent
2n

(9)

V max =V res(2 1) ,

(10)

onde Vent a faixa dinmica do sinal analgico e n o nmero de bits da resoluo


do conversor.

Tabela 1 - Sinal digital com resoluo de 2 bits, correspondente a um sinal analgico de 0 5 volts.
bits
Tenso (V)
00

0,00

01

1,25

10

2,50

11

3,75

Para a mesma faixa dinmica de 5V citada anteriormente, considerando a


utilizao de conversores A/D com resoluo de 8, 10 e 16 bits, foi construda a
tabela 2, com valores de resoluo por bit e valor de tenso mximo para cada
resoluo.

Tabela 2 - Resoluo por bit e valor mximo para uma faixa dinmica de 5V em conversores de 8, 10
e 16 bits.
Resoluo (bits)
Resoluo por bit (mV)
Valor Mximo (V)

19,531

4,980469

10

4,883

4,995117

16

0,076

4,999924

32
Conforme pode-se observar na tabela 2, quanto maior a resoluo do
conversor A/D, menor ser o degrau entre os valores representveis e mais prximo
estar o valor mximo representvel digitalmente do valor mximo do sinal
analgico. Dessa forma conclui-se que quanto maior a resoluo do conversor, mais
prximo o sinal digital estar do sinal analgico.
So encontrados na prtica conversores com resolues de 8 a 20 bits
(BONFIM, 2002).

3.5.3 Tempo de Converso

o tempo necessrio para se obter o valor na sada digital a partir do


momento em que o sinal de entrada foi lido pelo conversor e foi iniciado o processo
de converso. Este tempo ir depender do circuito utilizado pelo conversor e da sua
resoluo. De modo geral, quanto maior a resoluo, maior o tempo de converso.
Este tempo importante para definir a mxima frequncia possvel a ser convertida
a partir de um sinal de entrada variante no tempo (BONFIM, 2002).

3.5.4 Erro de Linearidade

O erro de linearidade representa o desvio do resultado de converso de uma


reta ideal. expresso em uma porcentagem do valor total ou em nmero de bits
(BONFIM, 2002).

33
3.6

CLOCK

necessrio que haja uma base de tempo constante e independente de


forma que os sinais digitais no interior da memria e da CPU sejam enviados e
recebidos corretamente. Esta base de tempo fornecida por um oscilador onde, a
cada ciclo, um evento realizado. A velocidade de realizao destes eventos
depende da frequncia do oscilador.
Como este oscilador fornece a base de tempo de funcionamento dos
dispositivos eletrnicos, recebe o nome tcnico de CLOCK (relgio) (CESAR FILHO,
2007).

3.7

TEMPORIZADOR

O temporizador um registrador existente no microcontrolador, cujo valor


numrico incrementa em uma unidade em intervalos de tempo definidos, de acordo
com o sinal de relgio (clock).
Alguns microcontroladores podem incluir mais de um temporizador e o sinal
de relgio de cada um destes pode ser de origem interna ou externa.
Caso a origem do sinal de relgio seja configurada como externa, o mdulo
temporizador pode ser utilizado como um contador de eventos externos,
incrementando o registrador com cada pulso recebido mediante o pino
correspondente. Se a origem do sinal de relgio interna, o temporizador
incrementa com cada ciclo do oscilador.

34
4

ANATOMIA DA MO

A mo humana pode ser dividida em trs partes: carpo, metacarpo e falanges


(figura 10). O carpo a poro proximal 1 da mo, correspondente ao conjunto de
ossos que articula com os ossos do antebrao articulao esta tambm conhecida
como punho e vulgarmente chamada de pulso e do metacarpo. formado por oito
ossos, dispostos em duas fileiras de quatro ossos cada.
O metacarpo a poro mdia da mo, regio esta conhecida como palma
da mo. Corresponde ao conjunto de 5 ossos que articulam com os ossos do carpo
e com as falanges proximais.
As falanges so os ossos que compem os dedos. Cada dedo composto
por trs falanges, exceto o polegar, que possui apenas duas. As falanges possuem
nomes diferentes, de acordo com sua posio:

Falanges proximais: articulam com os ossos metacarpais;

Falanges mdias: articulam com as falanges proximais e as falanges


distais;

Falange distais: articulam com as falanges mdias e correspondem s


extremidades dos dedos.

Figura 10 - Ossos da mo humana.


Fonte: http://www.mundoeducacao.com.br/biologia/ossos-membro-superior.htm.

1 Mais prximo do centro do corpo.

35
4.1

DEDOS

Os dedos da mo humana so tambm conhecidos como quirodctilos. Cada


mo possui um total de 5 dedos, os quais so identificados atravs de um nome e
um nmero, a saber: polegar (1), indicador (2), mdio (3), anular (ou anelar) (4) e
mnimo (5), como ilustra a figura 11.

Figura 11 - Dedos da mo esquerda.


Fonte: http://www.oragoo.net/quais-os-nomes-dos-dedos-da-mao/.

4.2

MOVIMENTOS ARTICULARES

As articulaes das mos, punhos e dedos podem realizar uma srie de


movimentos.

Os

tipos

de

movimentos

possveis

hiperextenso, abduo, aduo, pronao e supinao.

so:

flexo,

extenso,

36
4.2.1 Flexo, Extenso e Hiperextenso

A flexo o movimento de dobra de um osso sobre outro, causando uma


diminuio do ngulo da articulao entre estes ossos. A extenso, por sua vez,
ocorre inversamente flexo, causando um aumento do ngulo da articulao,
geralmente trazendo uma parte do corpo sua posio anatmica aps esta ser
flexionada. Se uma articulao for estendida alm da posio anatmica, ocorre a
chamada hiperextenso.
Estes movimentos so realizados pelas articulaes dos dedos e do punho. A
figura 12 ilustra os movimentos de flexo e extenso do dedo indicador da mo
direita.

Figura 12 - Movimento de flexo e extenso do dedo indicador da mo direita.


Fonte: http://www.bioeng.nus.edu.sg/compbiolab/projects/hand-biomechanics.html.

4.2.2 Abduo

Movimento de afastamento em relao a linha mdia do corpo. Este


movimento realizado pela articulao do punho e dos dedos. Quando relacionado
ao movimento do punho, tambm chamado de desvio radial. No caso dos dedos, o
ponto de referncia o dedo mdio e no a linha mdia do corpo. uma tendncia
natural abduzir os dedos durante a extenso mesmos. A figura 13 ilustra o
movimento de abduo do dedo indicador da mo direita.

37
4.2.3 Aduo

Movimento de aproximao da linha mdia do corpo. Este movimento


realizado pela articulao do punho e dos dedos. Quando relacionado ao movimento
do punho, tambm chamado de desvio ulnar. No caso dos dedos, o ponto de
referncia o dedo mdio e no a linha mdia do corpo. uma tendncia natural
aduzir os dedos durante a flexo dos mesmos. A figura 13 ilustra o movimento de
aduo do dedo indicador da mo direita.

Figura 13 - Movimentos de aduo e abduo do dedo indicador da mo direita.


Fonte: http://www.bioeng.nus.edu.sg/compbiolab/projects/hand-biomechanics.html.

4.2.4 Pronao e Supinao

A pronao e supinao so movimentos no plano horizontal, sendo que a


pronao um movimento para longe da linha mdia do corpo, enquanto que a
supinao um movimento em direo a linha mdia do corpo. A pronao faz com
que a palma da mo fique virada para baixo, enquanto que a supinao faz com que
a palma da mo fique virada para cima.
A figura 14 ilustra os movimentos de pronao e supinao da mo direita.

Figura 14 - Movimentos de pronao e supinao da mo direita.


Fonte: http://www.bioeng.nus.edu.sg/compbiolab/projects/hand-biomechanics.html.

38
5

5.1

DEFINIO DO PROJETO

ESPECIFICAES INICIAIS

O projeto consiste no desenvolvimento de um dispositivo perifrico capaz de


capturar movimentos simples de uma mo humana. Para isso, sero utilizados
sensores de acelerao (acelermetros) dispostos em uma luva, os quais sero
responsveis por detectar os movimentos articulares dos cinco dedos e tambm o
movimento da articulao da prpria mo. Os sensores, por sua vez, sero
conectados a uma interface microcontrolada, responsvel por tratar os sinais
adquiridos dos acelermetros e envi-los para um computador. O diagrama de
blocos do projeto pode ser observado na figura 15.

Figura 15 - Diagrama de blocos simplificado do projeto.

Alguns detalhes devem ser observados, tais como:

Quantidade de acelermetros;

Graus de liberdade do acelermetro;

Disposio dos acelermetros na luva;

Caractersticas desejveis do microcontrolador;

Comunicao entre microcontrolador e computador.

A quantidade de acelermetros a ser utilizada ser de seis sensores. Este


nmero foi escolhido de forma a utilizar a menor quantidade de sensores possvel,
por razes de custo, e ao mesmo tempo poder captar os movimentos articulares
bsicos de uma mo. Dos seis acelermetros empregados, cinco deles estaro
posicionados nas falanges distais dos dedos, a fim de captar o movimento de cada

39
um destes, enquanto que o sensor restante ficar posicionado sobre a mo. A figura
16 ilustra a disposio dos sensores sobre a luva.
At o presente momento, o autor considera que esta a melhor configurao
para os sensores. Os acelermetros posicionados nas falanges distais, ou seja, nas
extremidades dos dedos, tm por objetivo detectar os movimentos de flexo e
extenso dos mesmos (dobrar e esticar, respectivamente). J o acelermetro
posicionado no centro da mo visa captar os movimentos de flexo, extenso e
hiperextenso do punho, bem como os movimentos de pronao e supinao da
mo. Apenas com os testes ao longo do desenvolvimento prtico do projeto poderse- determinar se essa configurao realmente a mais adequada.
Quanto aos graus de liberdade do acelermetro, considera-se que os
acelermetros utilizados em cada dedo devero realizar medidas em 2 eixos
enquanto que o sensor posicionado sobre a mo necessitar de 3 eixos. Isso se
deve aos movimentos que se deseja detectar. No caso dos dedos, deseja-se
detectar apenas os movimentos de flexo e extenso, ignorando os movimentos de
aduo e abduo. Dessa forma o movimento a ser detectado ocorrer apenas em
dois eixos. Para o movimento da mo, sero detectados flexo, extenso,
hiperextenso, pronao e supinao. Sero ignorados os movimentos de desvio
ulnar e radial. Essa escolha foi tomada com a finalidade de reduzir o nvel de
complexidade do projeto.

Figura 16 - Disposio dos acelermetros na luva (mo direita).

40
Em relao ao microcontrolador a ser utilizado, desejvel que este possua
algumas caractersticas, a saber:

Conversor A/D, para o caso de o acelermetro escolhido possuir sadas


analgicas, com tantos canais quanto for possvel, a fim de converter as
diversas sadas dos acelermetros, e uma resoluo de 8 ou 10 bits;

Interface RS-232 ou USB, para comunicao com o computador e


tambm para programao externa;

Memria de programa do tipo Flash, permitindo fcil reprogramao;

Fcil programao, permitindo o uso de linguagem de alto nvel.

No que diz respeito comunicao entre o microcontrolador e o computador,


considera-se a possibilidade da interface serial RS-232 ou USB. A interface RS-232
possibilita um meio de comunicao simples, eficiente e presente na grande maioria
dos microcontroladores, porm muitos desktops e notebooks mais novos no
possuem uma porta de comunicao deste tipo. J a porta USB amplamente
encontrada nos computadores modernos e nos microcontroladores mais completos,
porm sua utilizao mais complexa, se comparada com a RS-232.

5.2

METODOLOGIA

O projeto foi dividido em 8 etapas:

Etapa 1: escolha dos componentes (acelermetros, microcontrolador e


outros elementos que podem vir a ser necessrios) que sero utilizados
no projeto, tendo em vista o custo, acessibilidade e correspondncia com
as especificaes do projeto. Estudo das particularidades e operao dos
componentes.

Etapa

2: estudo

da

comunicao

entre

os acelermetros e

microcontrolador, mtodo de aquisio e converso dos dados (se


necessrio).

Realizao

de

testes

de

aquisio

de

dados

dos

acelermetros por parte do microcontrolador.

Etapa 3: escolha do mtodo de comunicao entre o microcontrolador e o

41
computador (a princpio RS-232 ou USB).

Etapa 4: desenvolvimento do software de captura de movimentos dos


acelermetros.

Etapa 5: comunicao entre microcontrolador e computador atravs da


tecnologia escolhida.

Etapa 6: realizao de testes funcionais.

Etapa 7: correo de problemas encontrados na etapa 6 e realizao de


novo teste para verificao das correes.

Etapa 8: coleta e anlise dos resultados obtidos e apresentao do


trabalho.

5.3

SELEO DE COMPONENTES

Num primeiro momento, foi realizada uma pesquisa com o objetivo de


selecionar os componentes para o desenvolvimento do projeto. Foram utilizados
como critrio para a seleo de componentes a adequao com os requisitos
estabelecidos na definio do projeto e tambm o custo de cada elemento. Portanto,
nem sempre o componente escolhido o que melhor atende aos requisitos, mas sim
o que possui o melhor custo-benefcio.

5.3.1 Acelermetro MMA7260

O acelermetro MMA7260, da Freescale Semiconductor, um acelermetro


capacitivo de baixo custo que permite detectar acelerao em trs eixos, alm de
possuir 4 nveis de sensibilidade selecionveis (1.5g, 2g, 4g e 6g). Suas principais
caractersticas so:

Baixo consumo de corrente (500A);

Modo sleep, para reduzir consumo (3A);

42

Baixa tenso de operao, entre 2,2V e 3,6V;

4 nveis de sensibilidade (1.5g, 2g, 4g e 6g);

A escolha deste modelo se deu principalmente devido ao seu baixo custo e


tambm devido a sua alta sensibilidade. A figura 17 mostra o acelermetro visto de
cima e por baixo.

Figura 17 Vista superior e inferior do acelermetro MMA7260.


Fonte: http://www.voti.nl/shop/catalog.html?IC-MMA7260.

O MMA7260 possui 16 pinos, dos quais apenas 8 so utilizados. A tabela 3


contm a relao de pinos do acelermetro, enquanto que a figura 18 ilustra a
disposio dos mesmos no chip.

N Pino

Tabela 3 Descrio dos pinos do acelermetro MMA7260.


Nome Pino
Descrio

g-Select1

Entrada lgica para seleo de sensibilidade.

g-Select2

Entrada lgica para seleo de sensibilidade.

Vdd

Entrada de alimentao.

Vss

Entrada de terra.

12

Sleep Mode

13

Zout

Sada de tenso do eixo Z.

14

Yout

Sada de tenso do eixo Y.

15

Entrada lgica que habilita/desabilita o Sleep Mode.

Xout
Sada de tenso do eixo X.
Fonte: Traduo livre do autor da tabela 4 do Data sheet do Acelermetro.

43

Figura 18 - Pinagem do MMA7260 (viso do topo).


Fonte: MMA7260QT Data sheet Rev 5.

Os pinos lgicos g-Select1 e gSelect2 permitem a seleo entre quatro nveis


de sensibilidade, podendo este nvel ser alterado durante a operao. A tabela 4
apresenta os estados dos pinos g-Select, a faixa de acelerao e a sensibilidade
para cada seleo.
O pino de Sleep Mode permite a reduo no consumo de energia do
acelermetro, o que um ponto forte para aplicaes que utilizem bateria,
aumentando sua autonomia. Quando o Sleep Mode esta ativado (nvel lgico alto,
pois sua entrada negada), todas as sadas do acelermetro so desativadas,
reduzindo o consumo de corrente para cerca de 3A. Ao receber um sinal em nvel
lgico alto, o acelermetro volta a operar normalmente, reativando as sadas. Para
um consumo ainda menor, h uma recomendao no data sheet do acelermetro
para colocar o g-Select para o nvel de sensibilidade de 1,5g.

g-Select2

Tabela 4 - Descrio dos pinos g-Select.


g-Select1
g-Range

Sensibilidade

1.5g

800mV/g

2g

600mV/g

4g

300mV/g

1
6g
Fonte: MMA7260QT Data sheet Rev 5.

200mV/g

44
Os pinos Zout, Yout e Xout exibem uma sada de tenso proporcional a
acelerao sofrida nos eixos Z, Y e X do acelermetro, respectivamente. Observa-se
na figura 19 os sentidos positivo e negativo em cada um dos eixos do acelermetro.
Isso significa que se o acelermetro for movimentado no sentido positivo do eixo x,
por exemplo, o valor de acelerao medido no acelermetro positivo, enquanto
que no sentido negativo, o valor ser, portanto, negativo.
Quando em repouso, o acelermetro sofre apenas a ao da acelerao da
gravidade. Os eixos do acelermetro MMA7260, quando em gravidade zero - ou
seja, formando um ngulo de 90 graus com a acelerao da gravidade -, exibem em
seus pinos de sada uma tenso de 1,65V, o que representa a metade do valor
mximo de tenso de sada nos eixos (3,3/2V). Quando sob ao direta da
gravidade, ou seja, quando encontram-se em paralelo com a acelerao da
gravidade, os eixos exibem uma tenso de 2,45V quando com o mesmo sentido, e
uma tenso de 0,85V quando com sentido contrrio gravidade, como pode-se
observar na figura 20.

Figura 19 - Sentido da acelerao em cada um dos eixos.


Fonte: MMA7260QT Data sheet Rev 5.

Conclui-se que o acelermetro pode ser utilizado de duas formas distintas:


captando a acelerao resultante de um movimento de translao (acelerao
decorrente de um movimento como, por exemplo, um soco) e a ao da fora g

45
sobre os eixos do acelermetro quando este rotacionado (movimento de rotao),
de forma que o acelermetro pode ser utilizado como um inclinmetro.

Figura 20 - Acelerao esttica nos eixos do acelermetro MMA7260 em posicionamentos diferentes.


Fonte: MMA7260QT Data sheet Rev 5.

Como pode-se observar na figura 17, o acelermetro MMA7260 possui um


encapsulamento QFN, o que dificulta a sua soldagem de forma manual. Encontramse venda placas com o acelermetro j soldado e pronto para uso, porm seu
custo relativamente alto.
Aps uma longa procura, o componente MMA7260 foi encontrado em
quantidade suficiente e a custo razovel. Os componentes obtidos encontravam-se
j soldados em uma placa, porm esta no pde ser aproveitada para o projeto, pois
seu circuito utilizava apenas um eixo e seu tamanho era grande para a aplicao no
projeto. Uma vez que tentar remover o acelermetro da placa poderia resultar na
inutilizao do mesmo, optou-se por cortar a placa, deixando apenas a parte
embaixo do chip do acelermetro e uma pequena parte ao redor do mesmo, com os
contatos para soldagem.
Uma vez que a placa na qual o acelermetro se encontrava no pde ser

46
aproveitada, fez-se necessrio projetar uma. No prprio data sheet do acelermetro
encontra-se um diagrama de conexo para o mesmo, que pode ser utilizado como
guia para a criao da placa. Este diagrama est ilustrado na figura 21.
Com base nesse diagrama, foi projetada uma PCB para abrigar o
acelermetro. O projeto da placa no ser abordado no trabalho, pois no foi
realizado pelo autor. A placa j pronta pode ser observada na figura 22.
Com a placa pronta, foi necessrio soldar os componentes SMD (capacitores
e resistores) e o acelermetro. A placa foi projetada de forma que os componentes
ficaro embaixo do acelermetro. Isso foi feito com o intuito de deixar a PCB com o
menor tamanho possvel, uma vez que a placa dever ser posicionada sobre o dedo.
Devido ao tamanho da placa e ao fato de sua fabricao ser caseira,
possuindo apenas uma camada, fez-se necessrio a utilizao de jump wires na
placa.

Figura 21 - Diagrama de conexes do acelermetro MMA7260QT.


Fonte: MMA7260QT Data sheet Rev 5.

Com relao a soldagem do acelermetro a placa, convm fazer as seguintes


observaes:

O pino de Sleep Mode foi soldado diretamente ao Vcc, de forma que nunca
ser habilitado este modo;

Os pinos de g-Select foram conectados direto ao GND, ou seja, o


acelermetro estar sempre na sensibilidade de 1,5g.

47

Figura 22 - PCB para o acelermetro MMA7260, vista superior (esquerda) e inferior (direita).

Estas decises foram tomadas pois acredita-se que essas funcionalidades


no sero necessrias, por dois motivos: no pretende-se utilizar bateria no projeto,
portanto no h tanta preocupao em relao ao consumo; os movimentos
realizados pela mo encontram-se dentro da faixa de 0-1,5g, sendo desnecessrio
aceleraes maiores (MMA7260QFS Rev 0). Alm disso, essas decises ajudam a
simplificar o projeto.

5.3.2 Arduino

O Arduino uma plataforma de prototipao open-source de desenvolvimento


fcil e rpido. Sua programao feita atravs da linguagem de programao
Arduino,

baseada

no

framework

open-source

Wiring,

no

ambiente

de

desenvolvimento Arduino, sendo este baseado no ambiente Processing. As placas


do projeto podem ser construdas ou adquiridas j prontas. O ambiente de
desenvolvimento pode ser adquirido via download gratuitamente. Existem vrios
modelos diferentes do Arduino, cada qual com um microcontrolador diferente e com
componentes especficos. Para este projeto, foi escolhido o Arduino Uno, devido ao
seu baixo custo e tamanho relativamente reduzido, alm das caractersticas que

48
sero descritas a seguir.

5.3.2.1 Arduino Uno

O Arduino Uno um kit que possui como microcontrolador o Atmega328, da


Atmel. Dentre suas caractersticas, pode-se destacar:

14 entradas/sadas digitais, das quais 6 podem ser utilizadas para PWM;

6 entradas analgicas;

Oscilador de cristal de 16MHz;

Conector de 2.1mm para alimentao DC

Conector USB tipo B fmea, para alimentao (seleo automtica entre


alimentao USB ou fonte externa) e comunicao serial (utiliza o
Atmega16U2 como conversor USB para serial).

Conversor AD de 10 bits de resoluo e 6 canais.


A figura 23 ilustra uma foto da placa do kit.

Figura 23: Arduino Uno.


Fonte: http://arduino.cc/en/uploads/Main/ArduinoUno_R3_Front.jpg.

49
5.3.2.2 Ambiente de Desenvolvimento Arduino

O Arduino possui um ambiente de desenvolvimento, composto por um editor


de texto, um rea de mensagens, um console de texto uma barra de ferramentas
com botes para diversas funes, alm de uma srie de menus, como pode-se
observar na figura 24. O ambiente pode ser utilizado para a escrita de programas e
alm disso atravs dele que os programas so enviados para o hardware do
arduino.
Os programas criados para o Arduino so chamados de sketches, e seu
cdigo possui a extenso .ino (em verses antigas do ambiente a extenso utilizada
era a .pde). Estes programas so escritos em linguagem prpria do Arduino,
linguagem esta baseada no framework Wiring, muito semelhante a sintaxe das
linguagens C e Java.

Figura 24 - Ambiente de Desenvolvimento Arduino.

50
A escolha do Arduino Uno deu-se devido ao seu baixo custo e simplicidade,
porm essa escolha acarretou uma modificao no projeto: o nmero de canais
menor que o numero de sinais de entrada dos eixos dos acelermetros. No entanto,
este problema pode ser resolvido com a utilizao de um multiplexador para
selecionar as sadas dos acelermetros que sero lidas.

5.3.3 Multiplexador CD4051B

O CD4051B um multiplexador de 8 canais, com 3 entradas binrias para


seleo do canal, alm de um entrada para inibio, impedindo a sada do sinal de
todas as entradas. Este multiplexador opera na faixa de tenso de 0,5V a 20V,
permitindo leitura de sinais analgicos de at 20V pico a pico. A pinagem do
multiplexador pode ser observada na figura 25.

Figura 25 - Pinagem do multiplexador CD4051B.


Fonte: CD4051B, CD4052B, CD4053B (Rev. G) [28].

51
6

IMPLEMENTAO DO PROJETO

Inicialmente foi realizado um teste para verificar o funcionamento dos


acelermetros. Para tal, foram utilizados os seguintes componentes: uma fonte de
alimentao estabilizada 0-30V, um osciloscpio e um protoboard, sendo este ltimo
utilizado para conectar todos os demais componentes. A fonte foi utilizada para
alimentar a placa do acelermetro com 3,3V, enquanto que o osciloscpio foi
conectado s sadas do acelermetro, a fim de verificar o sinal gerado por este. A
figura 26 ilustra o setup utilizado para o teste.
Com o setup preparado foram realizados movimentos com o acelermetro,
nos seus trs eixos, a fim de observar as alteraes nas suas sada por meio do
osciloscpio. Durante a movimentao pde-se observar alteraes no sinal (figura
27) semelhantes s de um sistema oscilante com amortecimento, como um sistema
massa-mola, conforme o comportamento esperado.

Figura 26 - Setup para teste do acelermetro.

52

Figura 27 - Sinal observado no osciloscpio ao causar movimento em um dos eixos do acelermetro.

Aps

teste,

assumindo

que

acelermetro

estava

funcionando

corretamente, foi dado incio ao processo de comunicao entre o acelermetro e o


kit do Arduino. Para tal, foi utilizado um cabo flat para fazer a ligao entre a placa
do kit e o acelermetro e conectores latch - removidos de uma PCB inutilizada foram soldados ao cabo e placa do acelermetro (figuras 28 e 29), a fim de
permitir que os elementos sejam desconectados.

Figura 28 - Acelermetro com conector fmea soldado.

53

Figura 29 - Conexo do acelermetro com o Arduino (fios de GND e VDD ainda no soldados).

Concluda a conexo fsica entre a placa do acelermetro e o arduino, foi


dado incio ao desenvolvimento do software para leitura dos dados do acelermetro.
Para o desenvolvimento deste programa, tomou-se como base um exemplo j
existente no ambiente do Arduino, chamado AnalogInput.ino. O programa
desenvolvido, que encontra-se no apndice A, l os dados dos pinos analgicos e
os envia para a porta serial qual o Arduino est conectado. Como ainda no foi
desenvolvido o programa para receber os dados no computador, foi utilizado um
software gratuito chamado Terminal, o qual l dados da porta serial, para testar a
comunicao com o Arduino. Ao clicar no boto Connect do software Terminal, o
mesmo passou a exibir as informaes vindas do Arduino, como pode-se observar
na figura 30.
Como pode ser observado na figura, os valores dos eixos x e y variam entre
331 e 337, enquanto que o valor do eixo z variou entre 492 e 503. Levando em conta
que o conversor AD do ATMega328 do Arduino possui uma resoluo de 10 bits e
uma tenso de referncia de 5V enquanto que a tenso de alimentao do
acelermetro de 3,3V o valor observado faz sentido. Aplicando a frmula 9
obtm-se:

V res =

5
=0,0048828125 .
210

54
Multiplicando esse valor pela mdia dos valores encontrados nos pinos do
acelermetro temos para os eixos x e y

V x e y=

335+331+336+334+337
0,0048828125=1,6337890625 ,
5

e para o eixo z

V z=

492+498+503+496+500
0,0048828125=2,4306640625 .
5

importante observar que durante esta leitura, o acelermetro encontrava-se


em repouso, ou seja, a placa do acelermetro estava na posio horizontal. Com
isso, infere-se que em repouso e em gravidade zero, o valor esperado na sada do
pino de um eixo do acelermetro neste caso os eixos x e y de uma tenso de
1,65V (de acordo com a figura 20). J o eixo z, que encontra-se diretamente sobre a
ao da gravidade, espera-se um valor equivalente a uma tenso de 2,45V. Sendo
assim, os valores lidos pelo Arduino e exibidos no terminal esto satisfatoriamente
prximos do esperado. Foram realizadas leituras com o acelermetro em diversas
posies diferentes, de modo a deixar sempre um eixo sob ao da acelerao da
gravidade (em ambos os sentidos) e os demais em gravidade zero. Em todos os
casos, os valores lidos aproximaram-se do valor esperado.

55

Figura 30 - Dados recebidos do Arduino pelo programa Terminal, com o acelermetro em repouso.

De posse dos resultados, foi dado andamento ao software de leitura do


acelermetro, no sentido de converter o valor lido em um valor real de tenso, para
ser exibido no terminal. Esse passo pode ser considerado bastante simples, pois
basta multiplicar os valores lidos pela tenso de resoluo, como feito anteriormente.
O cdigo resultante pode ser observado no apndice B. A sada exibida no Terminal,
resultante da execuo do programa pode ser observada na figura 31.
Para uma melhor visualizao dos resultados, foi utilizado um cdigo escrito
em Processing, linguagem idntica do Arduino e na qual esta baseada, com a
diferena de que o cdigo ser executado no computador, no no microcontrolador.
Esse cdigo foi desenvolvido por Daniel Gonalves e pode ser encontrado no
endereo http://lusorobotica.com/index.php/topic,902.0.html. O cdigo responsvel
por receber do microcontrolador via serial os dados lidos do acelermetro e exibi-los
graficamente. Para isso, tambm foi necessrio alterar o programa contido no
Arduino, que l os dados do acelermetro, o qual tambm foi obtido no mesmo
endereo. Apenas uma pequena alterao foi realizada no cdigo Processing, a fim
de deixar o plano de fundo do grfico na cor branca, em vez da cor preta do cdigo
original.

56

Figura 31 - Dados recebidos do Arduino pelo programa Terminal, com o acelermetro sendo
movimentado e com o valor lido convertido em tenso.

Ao executar o cdigo Processing - assumindo que o cdigo Arduino j foi


carregado para o kit e j est em execuo uma janela onde ser exibido o grfico
se abre. Ao serem pressionadas as teclas x, y ou z, o programa passa a exibir o
grfico correspondente ao eixo da letra, nas cores vermelha, verde e azul,
respectivamente. A figura 32 contm o grfico gerado durante a movimentao dos
eixos do acelermetro. No grfico, uma crista significa que o acelermetro foi
inclinado de forma que a acelerao da gravidade possui o mesmo sentido do eixo e
um vale representa uma inclinao no sentido contrrio ao eixo em relao
gravidade. A regio em vermelho corresponde ao eixo x, a regio em verde
corresponde ao eixo y e a regio em azul corresponde ao eixo z.
Os testes apresentaram resultados que representam de forma satisfatria o
comportamento do acelermetro MMA7260 nas condies especificadas no projeto.
Sendo assim, foi dado incio a montagem dos demais acelermetros necessrios ao
projeto em suas respectivas placas. Aps a soldagem nas PCBs, cada acelermetro
foi testado da mesma forma que o primeiro, de forma a garantir seu funcionamento.

57

Figura 32 - Grfico gerado pelo cdigo Processing relativo a tenso observada nas sadas dos
acelermetros.

Aps certificar-se de que os acelermetros se encontravam em pleno


funcionamento, iniciou-se a fixao dos mesmos sobre uma luva. Foi utilizada a mo
direita de um par de luvas de algodo comum, utilizando-se cola quente para fixar os
acelermetros sobre a mesma.

A figura 33 mostra a luva com um dos

acelermetros j fixado.

Figura 33 - Luva com acelermetro fixado.

Com todos os acelermetros fixados luva e devidamente conectados ao


Arduino, foi realizada uma modificao no programa do Arduino (apndice C) para
incorporar os eixos x dos dedos polegar, indicador e mdio nos pinos 2, 1 e 0,

58
respectivamente. As sadas dos eixos x dos acelermetros dos dedos anelar e
mnimo foram conectadas ao multiplexador CD4051B, nos pinos 1 e 2 do mesmo,
sendo que a sada do multiplexador foi conectada ao pino analgico 0 do Arduino. A
varivel que representa o eixo x do acelermetro do polegar foi chamada de x1,
enquanto que a do indicador foi chamada de x2, e assim por diante, em referncia a
numerao utilizada na anatomia (polegar o dedo 1, indicador o 2, mdio o 3
etc.). Em seguida executou-se o cdigo e, com o auxlio do software Terminal,
verificou-se os dados recebidos da serial, com a finalidade de verificar se os dados
exibidos pelos demais acelermetros eram semelhantes ao do primeiro acelermetro
utilizado. O teste mostrou que os demais acelermetros mostravam os mesmos
valores nas mesmas condies impostas (repouso, movimento, acelerao sobre
um determinado eixo no sentido positivo/negativo etc).
Apesar de todos os testes realizados indicarem o funcionamento correto dos
acelermetros consoante as informaes disponveis no data sheet, os valores lidos
esto na forma de tenso, enquanto que deseja-se obter a acelerao nos eixos.
Portanto, necessrio realizar a converso desse valor para acelerao. O valor da
acelerao em g pode ser obtido dividindo-se o valor de tenso lido pela
sensibilidade do acelermetro (que no configurao de 1,5g de 800mV/g).
importante lembrar que os valores de tenso lidos do acelermetro so sempre
positivos, portanto necessrio subtrair destes o valor tenso lido em zero g, a fim
de se obter os valores positivos e negativos da acelerao. A frmula resultante
observada na equao 11.

g=

V OUT V OFFSET
S 1,5g

(11)

Onde:
g a acelerao observada em um eixo do acelermetro, medida em
unidades g;
VOUT a tenso de sada de um eixo do acelermetro, medida em volts (V);
VOFFSET a tenso de sada a zero g, medida em volts (V);

59
S1,5g a sensibilidade do acelermetro na configurao para 1,5g (medida em
mV/g).
O cdigo do Arduino foi ento modificado para realizar a converso da tenso
em acelerao, conforme a equao 11, podendo ser observado no apndice D. No
programa, a tenso VOFFSET obtida atravs de uma funo que calcula uma mdia
entre 50 amostras, sendo o clculo feito individualmente para cada eixo de cada
acelermetro. A leitura dos valores de acelerao pelo programa Terminal para os
acelermetros pode ser observada na figura 34.

Figura 34 - Acelerao lida nos eixos dos acelermetros da mo e dos dedos.

Em seguida, o cdigo do apndice D foi ligeiramente alterado, de forma a


exibir apenas o valor da acelerao no eixo x de um dos dedos e, alm disso,
mostrar o valor de tenso para cada valor de acelerao. Utilizando o cdigo
alterado, foram capturados os movimentos do eixo x do acelermetro durante um
movimento de rotao, iniciado com o eixo x do acelermetro com o mesmo sentido
da fora g e finalizado com o eixo x com sentido inverso fora g, conforme ilustra a
figura 35. Os valores obtidos foram transportados para uma planilha do software
OpenOffice.org Calc, a fim de plot-los em um grfico. O grfico gerado pode ser
observado na figura 36.

60

Figura 35 - Movimento de rotao do eixo x.

Figura 36 - Grfico Tenso versus Acelerao para o eixo do acelermetro MM7260.

O movimento realizado no teste assemelha-se ao movimento de flexo e


extenso. Diferente do que se considerava no incio do projeto, no sero
necessrios dois eixos para capturar estes movimentos, mas apenas um (neste caso
o eixo x) pois, como pode-se observar, a acelerao altera-se de acordo com o
ngulo de inclinao do acelermetro. Pode-se, portanto, obter o ngulo de
inclinao do eixo do acelermetro em funo da fora g, fazendo com que o
acelermetro comporte-se com um inclinmetro. O mesmo vale para os movimentos
de pronao e supinao do punho da mo, que so essencialmente movimentos
rotacionais. Neste caso, pode-se usar apenas os eixos x e y do acelermetro

61
posicionado sobre a mo, excluindo-se o eixo z, utilizando o eixo x para captar os
movimentos de flexo e extenso e o eixo y para os movimentos de pronao e
supinao. Para obter-se o angulo de inclinao de um eixo do acelermetro em
funo da acelerao da gravidade, calcula-se o arco seno sobre o valor de
acelerao experimentado no eixo [12]:

=arcsin (

V OUT V OFFSET
)
S 1,5

(12)

O cdigo do Arduino foi novamente alterado, de forma a aplicar o clculo para


obter o ngulo de inclinao. O programa modificado encontra-se no apndice E. A
figura 37 mostra a leitura dos valores em graus atravs do Terminal.

Figura 37 - ngulos lidos nos eixos dos acelermetros da mo e dos dedos.

Com o objetivo de demonstrar o funcionamento do dispositivo de uma forma


mais intuitiva, foi utilizada a jMonkey Engine, um motor grfico feito em Java que
permite a manipulao de modelos tridimensionais. A ideia inicial era desenvolver o
modelo de uma mo em um software de modelagem. Em seguida, esse modelo
seria exportado para o jMonkey, onde seria desenvolvido um programa que leria os
dados da serial enviados pelo Arduino e os traduziria para movimentos no modelo

62
tridimensional da mo.
Para a modelagem da mo foi utilizado o software de modelagem Blender, o
qual foi escolhido por ser open source e gratuito. Usando o Blender e, com o auxlio
de tutoriais em vdeo na internet ([29], [30] e [31]), foi criado o modelo de uma mo,
o qual est ilustrado na figura 38. Aps a criao do modelo necessrio que o
mesmo seja exportado para o formato utilizado pelo jMonkey. Vrias tentativas de
exportar o modelo foram realizadas, mas no se obteve sucesso, pois o modelo no
era corretamente exportado, faltando sempre o esqueleto necessrio para fazer a
movimentao. As falhas talvez possam ser relacionadas a falta de familiaridade
com este tipo de software, porm optou-se por uma soluo mais simples: utilizar
um dos modelos tridimensionais j existentes no jMonkey.

Figura 38 - Modelo tridimensional de uma mo com esqueleto para animao.

O jMonkey possui formas geomtricas tridimensionais bsicas. Dentre elas,


foi escolhido o cubo para demonstrar o funcionamento do dispositivo. O objetivo
fazer com que o cubo se movimente de acordo com o movimento da mo,
traduzindo no espao virtual tridimensional os movimentos reais da mo.
importante lembrar que at o momento, todos os testes de leitura dos dados foram
realizados atravs do software Terminal ou de cdigo Processing. Sendo assim,

63
para o programa desenvolvido no jMonkey, ser necessrio estabelecer uma
comunicao serial com o Arduino atravs da linguagem Java. Portanto o software
deve ser dividido em pelo menos duas camadas: a camada grfica, a qual ser
responsvel por exibir o objeto tridimensional neste caso um cubo e traduzir os
valores recebidos em movimentos do mesmo; a camada de comunicao,
responsvel por estabelecer uma comunicao atravs da porta serial a qual o
Arduino est conectado, lendo os dados enviados por este e enviando-os para a
camada grfica. Para satisfazer esse requisito, foram criadas duas classes Java: a
classe HandCube, que utiliza a API do jMonkey para exibir um cubo tridimensional
na tela, e a classe Communicator, que utiliza a API RXTX para comunicao serial.
O diagrama de classes da aplicao pode ser observado na figura 39.

Figura 39 Diagrama de classes do programa HandCube.

64
O cdigo do Arduino foi mais uma vez modificado, para permitir a
comunicao com o programa desktop. Algumas das mudanas realizadas foram a
diminuio do delay entre os ciclos de leitura dos dados dos dados dos
acelermetros, alm de remover os textos que eram enviados juntos com estes
dados para fins de debug. O cdigo resultante encontra-se no apndice F. As
classes da implementao do programa grfico que executar no desktop,
Communicator e HandCube, encontram-se no apndice G e H, respectivamente.

65
7

RESULTADOS OBTIDOS

O dispositivo foi testado utilizando o software desenvolvido. Para tal, os


acelermetros foram conectados placa do arduino, a qual foi conectada ao
computador utilizando-se de um cabo USB A/B (figura 40). O teste foi executado em
um computador com processador Intel Pentium Dual Core de 3GHz, com 1GB de
memria, placa de vdeo ATI Radeon HD 4650 e sistema operacional Windows 7 32
bits. importante observar porm que tanto o dispositivo quanto o software podem
ser executados em outras plataformas, como o Linux, por exemplo, pois o dispositivo
independe de recursos especficos de plataforma e o software foi desenvolvido em
Java, de forma que tambm independente de plataforma. Aps conectar o
dispositivo no computador, foi carregado o software para o Arduino, o qual passa a
execut-lo imediatamente aps a carga.

Figura 40 - Dispositivo conectado ao computador.

O programa HandCube foi executado no desktop, abrindo sua tela inicial,


padro do jMonkey, que pode ser observada na figura 41. Nesta tela pode-se definir
algumas opes, tais como resoluo da tela do programa e modo de tela cheia,
entre outras.

66

Figura 41 - Tela inicial do software HandCube.

Clicando na opo Ok, o programa abre uma janela na resoluo


selecionada, com seis cubos de cores distintas. Cada um dos cubos move-se de
acordo com os movimentos da mo e dos dedos, a saber:

Movimento de flexo do dedo 1 (polegar) faz com que o cubo vermelho gire
para cima, enquanto que a extenso deste mesmo dedo faz com que este
cubo gire para baixo.

Movimento de flexo do dedo 2 (indicador) faz com que o cubo verde gire
para cima, enquanto que a extenso deste mesmo dedo faz com que este
cubo gire para baixo.

Movimento de flexo do dedo 3 (mdio) faz com que o cubo azul gire para
cima, enquanto que a extenso deste mesmo dedo faz com que este cubo
gire para baixo.

Movimento de flexo do dedo 4 (anelar) faz com que o cubo amarelo gire
para cima, enquanto que a extenso deste mesmo dedo faz com que este
cubo gire para baixo.

Movimento de flexo do dedo 5 (mnimo) faz com que o cubo rosa gire para
cima, enquanto que a extenso deste mesmo dedo faz com que este cubo
gire para baixo.

Movimento de flexo da mo faz com que o cubo branco gire para cima,
enquanto que a extenso faz com que este cubo gire para baixo.

Movimento de pronao da mo faz com que o cubo branco gire no sentido


anti-horrio, enquanto que a supinao faz com que este cubo gire no sentido

67
horrio.
Na figura 42, pode-se observar o programa HandCube em execuo, com os
cubos em movimentao.

Figura 42 - Cubos sendo movimentados com os movimentos da mo no HandCube.

68
8

IMPLEMENTAES FUTURAS

Novas funcionalidades e melhorias podero ser implementadas futuramente


no dispostivo, tais como:

Introduo de um mdulo de comunicao sem fio (Bluetooth, ZigBee ou


Xbee), para substituir a comunicao serial, dando maior liberdade nos
movimentos.

Utilizao de um nmero maior de acelermetros como, por exemplo, um


acelermetro por falange, para captar movimentos com maior preciso.

Captao de movimentos da mo decorrentes de movimentos do brao, tais


como acenar, arremessar, entre outros. Para tal, seria necessrio dois
sensores sobre a mo: um fazendo o papel de inclinmetro (tal como o
acelermetro atual o faz), captando movimentos de rotao, enquanto o outro
captaria movimentos de translao. O ideal seria a utilizao de um
giroscpio para rotao e o acelermetro para rotao.

Projetar uma PCB mais elaborada, que permita que o acelermetro seja
soldado diretamente na mesma, sem adaptaes, afim de reduzir erros.

Projetar um mdulo de controle especfico para o dispositivo, substituindo o


Arduino, a fim de obter uma reduo de tamanho e um hardware otimizado
para a aplicao.

Desenvolvimento de um protocolo de comunicao mais elaborado e robusto


para o dispositivo, com o objetivo de reduzir o acoplamento entre este e as
aplicaes para ele desenvolvidas.

69
9

CONCLUSO

O presente trabalho teve por objetivo desenvolver um dispositivo que


permitisse a interao com o computador atravs de movimentos da mo. Para
atingir este objetivo foram utilizados sensores capazes de detectar acelerao, os
acelermetros. Quando este projeto foi idealizado, os acelermetros ainda eram
pouco difundidos e restritos a poucos aparelhos. Atualmente so encontrados em
diversos dispositivos, principalmente smartphones e tablets, onde so utilizados para
definir a orientao da tela e para diversas outras aplicaes, dependendo da
criatividade dos desenvolvedores.
Com o desenvolvimento deste trabalho, foi dado um pequeno passo no
sentido de utilizar os acelermetros num dispositivo perifrico para interagir com o
computador. Espera-se que as informaes nele contidas possam ser teis para que
outros estudantes e pesquisadores possam ter maiores avanos, aplicando este
conhecimento em reas como robtica, fisioterapia, ou o que mais a criatividade dos
mesmos permitir.
Acredita-se que o objetivo do trabalho foi alcanado, que o mesmo permitiu a
aplicao de vrios conceitos adquiridos ao longo do curso e que o aprendizado com
ele adquirido ser importante no decorrer da carreira de engenharia.

70
REFERNCIAS

[1] Accelerometer. Disponvel em: <http://www.diy-contractor.com/wiki/tool/332measuring-instruments/20175-accelerometer.html>. Acesso em: 22 mai. 2011.


[2] Accelerometer (Analog Devices ADXL50). Disponvel em:
<https://ccrma.stanford.edu/CCRMA/Courses/252/sensors/node9.html>.
Acesso em: 4 jun. 2011.
[3] Arduino. Arduino Development Environment. Disponvel em:
<http://arduino.cc/en/Guide/Environment>. Acesso em: 14 mai. 2012.
[4] Arduino. Arduino Uno. Disponvel em:
<http://arduino.cc/en/Main/arduinoBoardUno>. Acesso em: 14 mai. 2012.
[5] Atmel Corporation. Atmega328 Data Sheet. Disponvel em:
<http://www.atmel.com/Images/doc8161.pdf>. Acesso em: 14 mai. 2012.
[6] Biomechanics of the Hand. Disponvel em:
<http://www.bioeng.nus.edu.sg/compbiolab/projects/hand-biomechanics.html>.
Acesso em: 20 jun. 2011.
[7] BONFIM, Marlio. Conversores Digital/Analgico (D/A) e Analgico/Digital
(A/D). Disponvel em: <www.eletrica.ufpr.br/marlio/medidas/apostila/apostila3a.pdf>.
Acesso em: 26 jun. 2011.
[8] BRITO, Ana Jlia Cunha. Planos e Eixos e Nomenclatura dos Movimentos
Humanos. Disponvel em: <http://www.nead.unama.br/site/bibdigital/pdf
%5Cartigos_revistas%5C111.pdf>. Acesso em: 11 jun. 2011.
[9] CALLISTER, William D. Cincia e Engenharia de Materiais: Uma Introduo.
Rio de Janeiro: LTC, 2002.

71
[10] CARNEIRO, Felipe Marcus. Levantamento Bibliogrfico das Tecnologias
dos Acelermetros Comerciais. 19f. Trabalho de Graduao (Graduao em
Engenharia Mecnica) - Departamento de Mecnica Computacional, Faculdade de
Engenharia Mecncia, Universidade Estadual de Campinas, Campinas.
[11] CESAR FILHO, Bento Alves Cerqueira. Microcontrolador Bsico. Disponvel
em: <http://pt.scribd.com/doc/8339182/Microcontrolador-Basico>.
Acesso em: 26 jun. 2011.
[12] CLIFFORD, Michelle; GOMEZ, Leticia. Measuring Tilt with Low-g
Accelerometers.
Disponvel em: <http://www.freescale.com/files/sensors/doc/app_note/AN3107.pdf>.
Acesso em: 9 jun. 2011.
[13] DUC, Tan Tran. Modeling and Simulation of the Capacitive Accelerometer:
Diploma Thesis. Nordestedt, Alemanha: GRIN Verlag, 2005.
[14] FIGUEIREDO, Lgia J. et al. Aplicaes de Acelermetros. 2007. 13f.
Monografia (Instrumentao e Aquisio de Sinais) Lisboa, Portugal, 2007.
FRADEN, Jacob. Handbook of Modern Sensors: Physics, Designs, and
Applications. 4. ed. Nova Iorque: Springer, 2004.
[15] HALLIDAY, David; RESNICK, Robert; WALKER, Jearl. Fundamentals of
Physics. 8. ed. LTC, 2009
[16] KAAJAKARI, Ville. Practical MEMS: Analysis and design of microsystems.
Small Gear Publishing, 2009.
[17] Freescale Inc. MMA7260QFS Rev 0. Disponvel em:
<http://www.freescale.com/files/sensors/doc/fact_sheet/MMA7260QFS.pdf >. Acesso
em: 3 abr. 2011.
[18] Freescale Inc. MMA7260QT Data Sheet Rev 5. Disponvel em:
<http://www.freescale.com/files/sensors/doc/data_sheet/MMA7260QT.pdf>. Acesso

72
em: 26 abr. 2011.
[19] GRANDI, C. et al. Orientaes para elaborao e apresentao de trabalhos e
relatrios acadmicos. Porto Alegre: UERGS, 2010. 96 p.

[20] JmonkeyEngine 3.0 | Java OpenGL Game Engine. Disponvel em:


<http://jmonkeyengine.com/>. Acesso em: 17 jun. 2011.
[21] Microcontroladores. Disponvel em:
<http://roboticafacil.blogspot.com/2010/04/microcontroladores.html>.
Acesso em: 26 jun. 2011.
[22] OKI, Nobuo. Microcontroladores e Microprocessadores. Disponvel em:
<http://www.dee.feis.unesp.br/graduacao/disciplinas/ele0671/curso_robo%20aula
%20microcontrol_rec_.pdf>. Acesso em: 25 jun. 2011.
[23] RIPKA, Pavel; TIPEK, Alois. Modern Sensors Handbook. Londres: ISTE, 2007.
[24] ROSA FILHO, Blair Jos. Biomecnica Global. Disponvel em:
<http://www.wgate.com.br/conteudo/medicinaesaude/fisioterapia/biomecanica.htm>.
Acesso em: 20 jun. 2011.
[25] RXTX: The Prescription for Trasmission. Disponvel em:
<http://users.frii.com/jarvi/rxtx>. Acesso em: 17 jun. 2011.
[26] SILVA, Emilio Carlos Nelli; IBRAHIM, Ricardo Cury. Projeto e Fabricao de
Sistemas Microeletromecnicos (MEMS). 2009. 8f. Departamento de Engenharia
Mecatrnica e de Sistemas Mecnicos, Escola Politcnica da Universidade de So
Paulo, So Paulo, 2009.
[27] STALLINGS, William. Arquitetura de Computadores. 5 ed. So Paulo: Prentice
Hall, 2003.
[28] Texas Instruments. CD4051B, CD4052B, CD4053B (Rev. G). Disponvel em:
<http://www.ti.com/lit/ds/symlink/cd4051b.pdf>. Acesso em: 21 abr. 2012;

73
[29] THOMAZINI, Daniel; ALBUQUERQUE, Pedro Urbano Braga de. Sensores
Industriais: Fundamentos e Aplicaes. 7. ed. So Paulo: rica, 2010.
[30] Tutorial Blender 2.59 - Mo Parte 1. Disponvel em:
<http://www.youtube.com/watch?v=NfjNg_fZ73o>. Acesso em: 27 mai. 2012.
[31] Tutorial Blender 2.59 - Mo Parte 2. Disponvel em:
<http://www.youtube.com/watch?v=c4DNMffXW3M>. Acesso em: 27 mai. 2012.
[32] Tutorial Blender 2.59 - Bone Mo Parte 3. Disponvel em:
<http://www.youtube.com/watch?v=pUQxknts0rw>. Acesso em: 27 mai. 2012.

74
APNDICE A PROGRAMA TESTESERIAL.INO

/* TesteSerial
* Teste de leitura de eixos do acelerometro.
*
*/
// Pinos analogicos conectados aos eixos do acelerometro
int x = A5;
int y = A4;
int z = A3;
void setup() {
Serial.begin(9600); // Seta o baud rate da comunicacao serial
}
void loop() {
// Leitura dos
float xValue =
float yValue =
float zValue =

valores dos pinos analogicos


analogRead(x);
analogRead(y);
analogRead(z);

// Escreve os dados na serial


Serial.print("x = ");
Serial.println(xValue);
Serial.print("y = ");
Serial.println(yValue);
Serial.print("z = ");
Serial.println(zValue);
// Delay alto para possibilitar visualizacao dos valores
delay(1000);
}

75
APNDICE B PROGRAMA TESTESERIAL2.INO

/* TesteSerial2
* Teste de leitura de eixos do acelerometro,
* convertendo os dados lidos para tensao em volts.
*/
// Pinos analgicos conectados aos eixos do acelermetro
int x = A5;
int y = A4;
int z = A3;
// Resolucao do conversor
const double vRes = 5.0 / 1024.0;
void setup() {
Serial.begin(9600); // Seta o baud rate da comunicao serial
}
void loop() {
// leitura dos valores dos pinos analgicos
double xValue = analogRead(x);
double yValue = analogRead(y);
double zValue = analogRead(z);
// Obtm o valor em Volts do sinal lido
double xVoltage = xValue * vRes;
double yVoltage = yValue * vRes;
double zVoltage = zValue * vRes;
// Escreve os dados na serial
Serial.print("x = ");
Serial.print(xVoltage);
Serial.print(" V (");
Serial.print(xValue);
Serial.println(")");
Serial.print("y = ");
Serial.print(yVoltage);
Serial.print(" V (");
Serial.print(yValue);
Serial.println(")");
Serial.print("z = ");
Serial.print(zVoltage);
Serial.print(" V (");
Serial.print(zValue);
Serial.println(")");
// Delay alto para possibilitar visualizao dos valores
delay(1000);
}

76
APNDICE C PROGRAMA TESTESERIAL3.INO

/* TesteSerial3
* Teste de leitura de eixos do acelerometro,
* convertendo os dados lidos para tensao em volts.
*/
// Pinos analogicos conectados aos eixos do acelerometro
int x = A5;
int y = A4;
int z = A3;
int x1 = A2;
int x2 = A1;
// Resolucao do conversor
const double vRes = 5.0 / 1024.0;
void setup() {
Serial.begin(9600); // Seta o baud rate da comunicacao serial
}
void loop() {
// Leitura dos valores dos pinos analogicos
double xValue = analogRead(x);
double yValue = analogRead(y);
double zValue = analogRead(z);
double x1Value = analogRead(x1);
double x2Value = analogRead(x2);
// Obtm o valor em Volts do sinal lido
double xVoltage = xValue * vRes;
double yVoltage = yValue * vRes;
double zVoltage = zValue * vRes;
double x1Voltage = x1Value * vRes;
double x2Voltage = x2Value * vRes;
// Escreve os dados na serial
Serial.print("x = ");
Serial.print(xVoltage);
Serial.print(" V (");
Serial.print(xValue);
Serial.println(")");
Serial.print("y = ");
Serial.print(yVoltage);
Serial.print(" V (");
Serial.print(yValue);
Serial.println(")");
Serial.print("z = ");
Serial.print(zVoltage);
Serial.print(" V (");
Serial.print(zValue);
Serial.println(")");
Serial.print("x1 = ");
Serial.print(x1Voltage);
Serial.print(" V (");
Serial.print(x1Value);
Serial.println(")");
Serial.print("x2 = ");
Serial.print(x2Voltage);

77
Serial.print(" V (");
Serial.print(x2Value);
Serial.println(")");

delay(1000); // Delay alto para possibilitar visualizacao dos


// valores

78
APNDICE D PROGRAMA TESTEACEL.INO

/* TesteAcel
* Teste de leitura de eixos do acelerometro,
* convertendo os dados lidos para acelerao em g.
*/
const float ZOUT_1G = 850.0;
const float V_OFFSET = 1650.0;

// Tenso em mV em Zout a 1G
// Tenso em mV em a 0G

const int N_AM = 50; // numero de amostras


// Entradas analgicas conectadas aos pinos dos acelermetros
const int xaxis = A5; // Eixo x do acelermetro do punho
const int yaxis = A4; // Eixo y do acelermetro do punho
const int zaxis = A3; // Eixo z do acelermetro do punho
const int x1axis = A2; // Eixo x do acelermetro do dedo 1 (polegar)
const int x2axis = A1; // Eixo x do acelermetro do
//dedo 2 (indicador)
const float MV_RES = 5000.0 / 1024.0; // resoluo do conversor,
//em mV
const float SENSIBILITY = 800.0; // Sensibilidade do acelerometro a
//1,5g, em milivolts/g
// Offset de tenso em zero g
float xOffset, yOffset, zOffset, x1Offset, x2Offset;
// Valores lidos dos pinos analgicos
float x, y, z, x1, x2;
// Acelerao nos eixos (em g)
float gx, gy, gz, gx1, gx2;
/* Funo que realiza a media entre 50 amostras
* de um eixo para calcular o offset. */
float AccelAdjust(int axis)
{
float acc = 0.0, readValue = 0.0;
int j;
for (j = 0; j < N_AM; j++)
{
readValue = analogRead(axis);
acc = acc + ((readValue * 5000) / 1024.0);
delay(11); //nmero primo para evitar ciclos de leitura
}
return acc / N_AM;
}
/* Configurao dos pinos, do baud rate e clculo
* do erro dos acelermetros */
void setup()
{
Serial.begin(9600); // Seta o baud rate da comunicacao serial,
// em bps
// Configura os pinos para entrada
pinMode(xaxis,INPUT);

79
pinMode(yaxis,INPUT);
pinMode(zaxis,INPUT);
pinMode(x1axis,INPUT);
pinMode(x2axis,INPUT);

// Leitura do offset para os eixos dos acelermetros


xOffset = AccelAdjust(xaxis);
yOffset = AccelAdjust(yaxis);
zOffset = AccelAdjust(zaxis);
zOffset = zOffset - ZOUT_1G;
x1Offset = AccelAdjust(x1axis);
x2Offset = AccelAdjust(x2axis);

// Programa principal
void loop()
{
// Leitura dos valores dos pinos analgicos
x = analogRead(xaxis);
y = analogRead(yaxis);
z = analogRead(zaxis);
x1 = analogRead(x1axis);
x2 = analogRead(x2axis);
// Converte o valor lido
float gx = (x * MV_RES float gy = (y * MV_RES float gz = (z * MV_RES float gx1 = (x1 * MV_RES
float gx2 = (x2 * MV_RES

para g
xOffset) / SENSIBILITY;
yOffset) / SENSIBILITY;
zOffset) / SENSIBILITY;
- x1Offset) / SENSIBILITY;
- x2Offset) / SENSIBILITY;

// Envia os dados pela serial


Serial.print("xMao = ");
Serial.print(gx);
Serial.println();
Serial.print("yMao = ");
Serial.print(gy);
Serial.println();
Serial.print("zMao = ");
Serial.print(gz);
Serial.println();
Serial.print("xDedo1 = ");
Serial.print(gx1);
Serial.println();
Serial.print("xDedo2 = ");
Serial.print(gx2);
Serial.println();

valores
}

// Delay entre cada ciclo de leitura


delay(2000); // Delay alto para possibilitar visualizacao dos

80
APNDICE E PROGRAMA TESTEACELANGULOS.INO

/* TesteAcelAngulos
* Teste de leitura de eixos do acelerometro,
* convertendo os dados lidos para angulos em graus.
*/
const float ZOUT_1G = 850.0;
const float V_OFFSET = 1650.0;

// Tenso em mV em Zout a 1G
// Tenso em mV em a 0G

const int N_AM = 50; // numero de amostras


// Entradas analgicas conectadas aos pinos dos acelermetros
const int xaxis = A5; // Eixo x do acelermetro do punho
const int yaxis = A4; // Eixo y do acelermetro do punho
//const int zaxis = A3; // Eixo z do acelermetro do punho
const int x1axis = A2; // Eixo x do acelermetro do dedo 1 (polegar)
const int x2axis = A1; // Eixo x do acelermetro
// do dedo 2 (indicador)
const float MV_RES = 5000.0 / 1024.0; // resoluo do conversor,
// em mV
const float SENSIBILITY = 800.0; // Sensibilidade do acelerometro a
// 1,5g, em milivolts/g
// Offset de tenso em zero g
float xOffset, yOffset, zOffset, x1Offset, x2Offset;
// Valores lidos dos pinos analgicos
float x, y, z, x1, x2;
// Acelerao nos eixos (em g)
float gx, gy, gz, gx1, gx2;
/* Calcula a media entre 50 amostras
* de um eixo para calcular o offset. */
float AccelAdjust(int axis)
{
float acc = 0.0, readValue = 0.0;
int j;

for (j = 0; j < N_AM; j++)


{
readValue = analogRead(axis);
acc = acc + ((readValue * 5000) / 1024.0);
delay(11); //nmero primo para evitar ciclos de leitura
}
return acc / N_AM;

/* Configurao dos pinos, do baud rate e clculo do erro dos


* acelermetros */
void setup()
{
// Seta baudrate para 9600
Serial.begin(9600); // Seta o baud rate da comunicacao serial,

81
// em bps
// Configura os pinos para entrada
pinMode(xaxis,INPUT);
pinMode(yaxis,INPUT);
//pinMode(zaxis,INPUT);
pinMode(x1axis,INPUT);
pinMode(x2axis,INPUT);

// Leitura do offset para os eixos dos acelermetros


xOffset = AccelAdjust(xaxis);
yOffset = AccelAdjust(yaxis);
//zOffset = AccelAdjust(zaxis);
//zOffset = zOffset;// - ZOUT_1G;
x1Offset = AccelAdjust(x1axis);
x2Offset = AccelAdjust(x2axis);

// Programa principal
void loop()
{
// Leitura dos valores dos pinos analgicos
x = analogRead(xaxis);
y = analogRead(yaxis);
//z = analogRead(zaxis);
x1 = analogRead(x1axis);
x2 = analogRead(x2axis);
// Converte o valor lido para g
gx = (x * MV_RES - xOffset) / SENSIBILITY;
gy = (y * MV_RES - yOffset) / SENSIBILITY;
//gz = (z * MV_RES - zOffset) / SENSIBILITY;
gx1 = (x1 * MV_RES - x1Offset) / SENSIBILITY;
gx2 = (x2 * MV_RES - x2Offset) / SENSIBILITY;
// Calcula o arco seno e envia os dados pela serial
Serial.print("xMao =");
Serial.print((int)(asin(gx) * RAD_TO_DEG));
Serial.println();
Serial.print("yMao =");
Serial.print((int)(asin(gy) * RAD_TO_DEG));
Serial.println();
//Serial.print("zMao =");
//Serial.print((int)(asin(gz) * RAD_TO_DEG));
//Serial.println();
Serial.print("xDedo1 =");
Serial.print((int)(asin(gx1) * RAD_TO_DEG));
Serial.println();
Serial.print("xDedo2 =");
Serial.print((int)(asin(gx2) * RAD_TO_DEG));
Serial.println();

// Delay entre cada ciclo de leitura


delay(2000);

82
APNDICE F PROGRAMA ACELEROMETRO.INO

/* Acelerometro
* Le dados do acelermetro, convertendo-os para graus
* e enviando pela serial.
*/
const float V_OFFSET = 1650.0;
// Tenso em mV em a 0G
const int N_AM = 50; // numero de amostras
// pinos digitais para seletor do mux
const int s0 = 8;
const int s1 = 9;
const int s2 = 10;
// Entradas analgicas conectadas aos pinos dos acelermetros
const int xaxis = A5; // Eixo x do acelermetro do punho
const int yaxis = A4; // Eixo y do acelermetro do punho
const int x1axis = A2; // Eixo x do acelermetro do dedo 1 (polegar)
const int x2axis = A1; // Eixo x do acelermetro do
// dedo 2 (indicador)
const int x3axis = A0; // Eixo x do acelermetro do dedo 3 (mdio)
const int x4x5axis = A3;
const float MV_RES = 5000.0 / 1024.0; // resoluo do conversor,
// em mV
const float SENSIBILITY = 800.0; // Sensibilidade do acelerometro
// a 1,5g, em milivolts/g
// Offset de tenso em zero g
float xOffset, yOffset, x1Offset, x2Offset, x3Offset,
x4Offset, x5Offset;
// Valores lidos dos pinos analgicos
float x, y, x1, x2, x3, x4, x5;
// Acelerao nos eixos (em g)
float gx, gy, gx1, gx2, gx3, gx4, gx5;
/* Calcula a media entre 50 amostras
* de um eixo para calcular o offset. */
float AccelAdjust(int axis)
{
float acc = 0.0, readValue = 0.0;
int j;
for (j = 0; j < N_AM; j++)
{
readValue = analogRead(axis);
acc = acc + ((readValue * 5000) / 1024.0);
delay(11); //nmero primo para evitar ciclos de leitura
}
return acc / N_AM;
}
// Configurao dos pinos, do baud rate e
// clculo do erro dos acelermetros
void setup()

83
{
// Seta baudrate para 9600
Serial.begin(9600); // Seta o baud rate da comunicacao
// serial, em bps
// Configura pinos para sada
pinMode(s0, OUTPUT);
pinMode(s1, OUTPUT);
pinMode(s2, OUTPUT);
// Configura os pinos para entrada
pinMode(xaxis,INPUT);
pinMode(yaxis,INPUT);
pinMode(x1axis,INPUT);
pinMode(x2axis,INPUT);
pinMode(x3axis,INPUT);
pinMode(x4x5axis,INPUT);

// Leitura do offset para os eixos dos acelermetros


xOffset = AccelAdjust(xaxis);
yOffset = AccelAdjust(yaxis);
x1Offset = AccelAdjust(x1axis);
x2Offset = AccelAdjust(x2axis);
x3Offset = AccelAdjust(x3axis);
// Seleciona pino do dedo 4
// (seleciona entrada 6 do MUX)
digitalWrite(s0, LOW);
digitalWrite(s1, HIGH);
digitalWrite(s2, HIGH);
delay(10);
x4Offset = AccelAdjust(x4x5axis);
// Seleciona pino do dedo 5
// (seleciona entrada 4 do MUX)
digitalWrite(s0, LOW);
digitalWrite(s1, LOW);
digitalWrite(s2, HIGH);
delay(10);
x5Offset = AccelAdjust(x4x5axis);

// Programa principal
void loop()
{
// Leitura dos valores dos pinos analgicos
x = analogRead(xaxis);
y = analogRead(yaxis);
x1 = analogRead(x1axis);
x2 = analogRead(x2axis);
x3 = analogRead(x3axis);
// Seleciona pino do dedo 4
// (seleciona entrada 6 do MUX)
digitalWrite(s0, LOW);
digitalWrite(s1, HIGH);
digitalWrite(s2, HIGH);
delay(10);
x4 = analogRead(x4x5axis);
// Seleciona pino do dedo 5
// (seleciona entrada 4 do MUX)
digitalWrite(s0, LOW);
digitalWrite(s1, LOW);
digitalWrite(s2, HIGH);

84
delay(10);
x5 = analogRead(x4x5axis);
// Converte o valor lido para g
gx = (x * MV_RES - xOffset) / SENSIBILITY;
gy = (y * MV_RES - yOffset) / SENSIBILITY;
gx1 = (x1 * MV_RES - x1Offset) / SENSIBILITY;
gx2 = (x2 * MV_RES - x2Offset) / SENSIBILITY;
gx3 = (x3 * MV_RES - x3Offset) / SENSIBILITY;
gx4 = (x4 * MV_RES - x4Offset) / SENSIBILITY;
gx5 = (x5 * MV_RES - x5Offset) / SENSIBILITY;
/* Calcula o arco seno, envia
* entre o dado de cada eixo,
* nova linha */
Serial.print((int)(asin(gx) *
Serial.print("\n");
Serial.print((int)(asin(gy) *
Serial.print("\n");
Serial.print((int)((asin(gx1)
Serial.print("\n");
Serial.print((int)((asin(gx2)
Serial.print("\n");
Serial.print((int)((asin(gx3)
Serial.print("\n");
Serial.print((int)((asin(gx4)
Serial.print("\n");
Serial.print((int)((asin(gx5)
Serial.print("\n");

os dados pela serial e,


envia um caracter de
RAD_TO_DEG));
RAD_TO_DEG));
- asin(gx)) * RAD_TO_DEG));
- asin(gx)) * RAD_TO_DEG));
- asin(gx)) * RAD_TO_DEG));
- asin(gx)) * RAD_TO_DEG));
- asin(gx)) * RAD_TO_DEG));

// Delay entre cada ciclo de leitura


delay(200);

85
APNDICE G CLASSE COMMUNICATOR.JAVA
package henriquetcc2.serialcom;
import
import
import
import
import
import
import
import
import
import
import
import
import

gnu.io.CommPort;
gnu.io.CommPortIdentifier;
gnu.io.PortInUseException;
gnu.io.SerialPort;
gnu.io.SerialPortEvent;
gnu.io.SerialPortEventListener;
java.io.IOException;
java.io.InputStream;
java.io.OutputStream;
java.util.ArrayList;
java.util.Enumeration;
java.util.HashMap;
java.util.TooManyListenersException;

/** Classe Communicator, responsvel por ler os dados da serial


* enviados pelo Arduino */
public class Communicator implements SerialPortEventListener {
//Contm as portas encontradas
private Enumeration ports = null;
// Mapeia os nomes das portas para CommPortIdentifiers
private HashMap portMap = new HashMap();
//Contm a porta aberta
private CommPortIdentifier selectedPortIdentifier = null;
private SerialPort serialPort = null;
//Stream para receber e enviar dados
private InputStream input = null;
private OutputStream output = null;
//Flag que informa se h ou no conexo
private boolean bConnected = false;
//Timeout para conexo com a porta
private final static int TIMEOUT = 2000;
//Valor ASCII para nova linha
private final static int NEW_LINE_ASCII = 10;
private
private
private
private
private
private
private
private
private

int serialCount = 0;
float aax;
float aax1;
float aax2;
float aax3;
float aax4;
float aax5;
float aay;
String data = "";

//Armazena as portas encontradas


private ArrayList<String> comPorts = new ArrayList<String>();
public float getAax() {
return aax;
}
public float getAax1() {

86
return aax1;
}
public float getAax2() {
return aax2;
}
public float getAax3() {
return aax2;
}
public float getAax4() {
return aax2;
}
public float getAax5() {
return aax2;
}
public float getAay() {
return aay;
}
/** Procura pelas portas seriais e coloca as portas no
* ArrayList comPorts */
public void searchForPorts() {
ports = CommPortIdentifier.getPortIdentifiers();
while (ports.hasMoreElements()) {
CommPortIdentifier curPort =
(CommPortIdentifier) ports.nextElement();

// Pega apenas portas seriais


if (curPort.getPortType() ==
CommPortIdentifier.PORT_SERIAL) {
comPorts.add(curPort.getName());
portMap.put(curPort.getName(), curPort);
}

}
/** Conecta porta selecionada */
public void connect() {
// Porta inserida hardcoded "COM3"
String selectedPort = (String)comPorts.get(1);
selectedPortIdentifier =
(CommPortIdentifier)portMap.get(selectedPort);
CommPort commPort = null;
try {
//Retorna um objeto do tipo CommPort
CommPort = selectedPortIdentifier.open(
"TigerControlPanel", TIMEOUT);
// feito um cast no objeto CommPort para SerialPort
serialPort = (SerialPort)commPort;
//Seta a flag conectado
setConnected(true);

87
//Logs
System.out.println(selectedPort +
" opened successfully.");

//TODO add logs


}
catch (PortInUseException e) {
//Porta j est em uso
System.out.println(selectedPort + " is in use. (" +
e.toString() + ")");
}
catch (Exception e) {
//Problema durante a abertura da porta
System.out.println("Failed to open " + selectedPort +
"(" + e.toString() + ")");
}

/** Abre os streams de input e output para comunicao */


public boolean initIOStream()
{
//Valor de retorno em caso de sucesso ou falha na abertura
boolean successful = false;
try {
input = serialPort.getInputStream();
output = serialPort.getOutputStream();
successful = true;
return successful;

}
catch (IOException e) {
// Falha na abertura
System.out.println("I/O Streams failed to open. (" +
e.toString() + ")");
return successful;
}
}
/** Inicia o eventListener para saber quando houver dados
* para serem lidos */
public void initListener() {
try {
serialPort.addEventListener(this);
serialPort.notifyOnDataAvailable(true);
}
catch (TooManyListenersException e) {
System.out.println("Too many listeners. (" +
e.toString() + ")");
}
}
/** Desconecta da porta serial e fecha os streams */
public void disconnect() {
try {
serialPort.removeEventListener();
serialPort.close();
input.close();
output.close();
setConnected(false);
}

88
catch (Exception e)
{
System.out.println("Failed to close " +
serialPort.getName() + "(" + e.toString() + ")");
}
}
final public boolean getConnected()
{
return bConnected;
}
public void setConnected(boolean bConnected)
{
this.bConnected = bConnected;
}
/** Evento disparado quando h dados na serial */
@Override
public void serialEvent(SerialPortEvent evt) {
if (evt.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
try {
// L o stream de input
byte singleData = (byte)input.read();
/* Pega o dado caso no seja um caracter de nova
* linha */
if (singleData != NEW_LINE_ASCII) {
data += new String(new byte[] {singleData});
}
else {
if (!(data.isEmpty() || data.equals(""))) {
switch(serialCount) {
case 0:
aax = Float.parseFloat(data);
serialCount++;
break;
case 1:
aay = Float.parseFloat(data);
serialCount++;
break;
case 2:
aax1 = Float.parseFloat(data);
serialCount++;
break;
case 3:
aax2 = Float.parseFloat(data);
serialCount = 0;
break;
case 4:
aax1 = Float.parseFloat(data);
serialCount = 0;
break;
case 5:
aax1 = Float.parseFloat(data);
serialCount = 0;
break;
case 6:
aax1 = Float.parseFloat(data);
serialCount++;
break;
}

89
data = "";
}

}
}
catch (Exception e) {
//Erro ao ler o dado da serial
System.out.println("Failed to read data. (" +
e.toString() + ")");
}
}
}

90
APNDICE H CLASSE HANDCUBE.JAVA

package heriquetcc2;
import
import
import
import
import
import
import
import
import

com.jme3.app.SimpleApplication;
com.jme3.material.Material;
com.jme3.math.Vector3f;
com.jme3.scene.Geometry;
com.jme3.scene.shape.Box;
com.jme3.math.ColorRGBA;
com.jme3.math.Quaternion;
com.jme3.system.AppSettings;
henriquetcc2.serialcom.Communicator;

/** Classe HandCube. Cria uma janela de aplicao


* com cubos 3D que se movem de acordo com os dados
* lidos da serial pela classe Communicator. */
public class HandCube extends SimpleApplication {
// Objeto da comunicao serial
Communicator communicator = null;
// Geometry para cada parte da mo
protected Geometry hand;
protected Geometry finger1;
protected Geometry finger2;
protected Geometry finger3;
protected Geometry finger4;
protected Geometry finger5;
// ngulos lidos pela serial
private float xAngle;
private float x1Angle;
private float x2Angle;
private float x3Angle;
private float x4Angle;
private float x5Angle;
private float yAngle;
private Quaternion qHand, qFinger1, qFinger2, qFinger3, qFinger4,
qFinger5;
/** Define configuraes da aplicao:
* -setFrameRate: define frame rate
* no valor especificado.
* -setTitle: define um ttulo na
* barra de ttulos da aplicao. */
public static void main(String[] args) {
HandCube app = new HandCube();
AppSettings settings = new AppSettings(true);
settings.setFrameRate(60);
settings.setTitle("HandCube TCC II");
settings.setUseInput(false);
app.setSettings(settings);
app.start();
}
/** Mtodo executado na inicializao do app.

91
* Cria um objeto communicator para estabelecer
* comunicao.
* Cria os cubos que sero exibidos na tela. */
@Override
public void simpleInitApp() {
communicator = new Communicator();
communicator.searchForPorts();
communicator.connect();
if (communicator.getConnected() == true) {
if (communicator.initIOStream() == true) {
communicator.initListener();
}
}
Box
Box
Box
Box
Box
Box

bHand = new Box(Vector3f.ZERO, 1, 1, 1);


bFinger1 = new Box(new Vector3f(-6, 3, 0), 1, 1, 1);
bFinger2 = new Box(new Vector3f(-3, 3, 0), 1, 1, 1);
bFinger3 = new Box(new Vector3f(0, 3, 0), 1, 1, 1);
bFinger4 = new Box(new Vector3f(3, 3, 0), 1, 1, 1);
bFinger5 = new Box(new Vector3f(6, 3, 0), 1, 1, 1);

hand = new Geometry("Player", bHand);


finger1 = new Geometry("Player1", bFinger1);
finger2 = new Geometry("Player2", bFinger2);
finger3 = new Geometry("Player3", bFinger3);
finger4 = new Geometry("Player4", bFinger4);
finger5 = new Geometry("Player5", bFinger5);
Material mat = new Material(assetManager,
"Common/MatDefs/Misc/Unshaded.j3md");
Material mat1 = new Material(assetManager,
"Common/MatDefs/Misc/Unshaded.j3md");
Material mat2 = new Material(assetManager,
"Common/MatDefs/Misc/Unshaded.j3md");
Material mat3 = new Material(assetManager,
"Common/MatDefs/Misc/Unshaded.j3md");
Material mat4 = new Material(assetManager,
"Common/MatDefs/Misc/Unshaded.j3md");
Material mat5 = new Material(assetManager,
"Common/MatDefs/Misc/Unshaded.j3md");
mat.setColor("Color", ColorRGBA.White);
mat1.setColor("Color", ColorRGBA.Red);
mat2.setColor("Color", ColorRGBA.Green);
mat3.setColor("Color", ColorRGBA.Blue);
mat4.setColor("Color", ColorRGBA.Yellow);
mat5.setColor("Color", ColorRGBA.Pink);
hand.setMaterial(mat);
finger1.setMaterial(mat1);
finger2.setMaterial(mat2);
finger3.setMaterial(mat3);
finger4.setMaterial(mat4);
finger5.setMaterial(mat5);
rootNode.attachChild(hand);
rootNode.attachChild(finger1);
rootNode.attachChild(finger2);
rootNode.attachChild(finger3);

92

rootNode.attachChild(finger4);
rootNode.attachChild(finger5);

/** Mtodo que realiza a movimentao dos cubos


*
com base nos dados lidos da serial */
@Override
public void simpleUpdate(float tpf) {
// L ngulo do eixo x da mo
xAngle = communicator.getAax() *
// L ngulo do eixo y da mo
yAngle = communicator.getAay() *
// L ngulo do eixo x do dedo 1
x1Angle = communicator.getAax1()
// L ngulo do eixo x do dedo 2
x2Angle = communicator.getAax2()
// L ngulo do eixo x do dedo 3
x3Angle = communicator.getAax3()
// L ngulo do eixo x do dedo 4
x4Angle = communicator.getAax4()
// L ngulo do eixo x do dedo 5
x5Angle = communicator.getAax5()

tpf;
tpf;
* tpf;
* tpf;
* tpf;
* tpf;
* tpf;

// Estabelece os eixos de rotao dos cubos


// Obs.: o sinal negativo foi utilizado pois o
// sistema de coordenadas no jMonkey esto em uma
// posio diferente.
qHand = new Quaternion().fromAngles(-xAngle, 0, -yAngle);
qFinger1 = new Quaternion().fromAngles(-x1Angle, 0, 0);
qFinger2 = new Quaternion().fromAngles(-x2Angle, 0, 0);
qFinger3 = new Quaternion().fromAngles(-x3Angle, 0, 0);
qFinger4 = new Quaternion().fromAngles(-x4Angle, 0, 0);
qFinger5 = new Quaternion().fromAngles(-x5Angle, 0, 0);

// Executa a rotao dos cubos


hand.setLocalRotation(qHand);
finger1.setLocalRotation(qFinger1);
finger2.setLocalRotation(qFinger2);
finger3.setLocalRotation(qFinger3);
finger4.setLocalRotation(qFinger4);
finger5.setLocalRotation(qFinger5);

/** Desconecta da serial ao fechar a janela */


@Override
public void stop() {
communicator.disconnect();
super.stop();
}