Post on 11-Nov-2018
UNIVERSIDADE POSITIVO
NÚCLEO DE CIÊNCIAS EXATAS E TECNOLÓGICAS
CURSO DE ENGENHARIA DA COMPUTAÇÃO
MARCOS ANTONIO BRESSAN
AUTOMODELO CONTROLADO POR ACELERÔMETRO DE
CELULAR PARA TRATAMENTO DE REABILITAÇÃO DE
COORDENAÇÃO MOTORA EM CRIANÇAS
Trabalho de Conclusão de Curso.
Prof. Amarildo Geraldo Reichel
Orientador
Curitiba, novembro de 2011.
2
UNIVERSIDADE POSITIVO
Reitor: Prof. José Pio Martins
Pró-Reitor de Administração: Prof. Arno Antonio Gnoatto
Pró-reitor Acadêmico: Prof.ª Márcia Sebastiani
Coordenador do Curso de Engenharia da Computação: Prof. Leandro Henrique de Souza
3
Agradecimentos
A
Daiane
pela contribuição e encorajamento.
Ao pai, Antonio, pela contribuição.
À mãe, Verônica, pelo apoio.
Ao irmão, Julio, pelo apoio.
Professor Amarildo, pelas dicas e sugestões.
4
SUMÁRIO
LISTA DE ABREVIATURAS E SIGLAS ................................................................... 5
LISTA DE FIGURAS ..................................................................................................... 6
LISTA DE TABELAS .................................................................................................... 7
RESUMO ......................................................................................................................... 8
ABSTRACT .................................................................................................................... 9
1 INTRODUÇÃO .................................................................................................... 10
2 FUNDAMENTAÇÃO TEÓRICA ....................................................................... 11
2.1 Sensor de movimento ou acelerômetro ........................................................... 11
2.2 Microcontrolador.............................................................................................. 12
2.3 Módulo Bluetooth .............................................................................................. 13
3 DESENVOLVIMENTO ....................................................................................... 14
3.1 Especificação de Hardware .............................................................................. 14
3.2 Especificação de Firmware ............................................................................... 16
3.3 Especificação de Software ................................................................................ 18
3.4 Especificação de Comunicação ........................................................................ 21
4 TESTES E RESULTADOS ................................................................................. 24
4.1 Testes com crianças .......................................................................................... 25
4.2 Personalização para pacientes ......................................................................... 25
5 EVOLUÇÕES ....................................................................................................... 26
6 CONCLUSÃO ....................................................................................................... 24
REFERÊNCIAS ........................................................................................................... 28
ANEXO A <CÓDIGOS EM C PARA FIRMWARE> .............................................. 31
ANEXO B <CÓDIGO PYTHON PARA APLICATIVO> ...................................... 35
5
LISTA DE ABREVIATURAS E SIGLAS
1 MEMS – Micro electro-mechanical systems – Dispositivos eletromecânicos ..................... 11
2 MCU, µC, uC – Microcontroller Unit – Unidade microcontroladora ................................... 12
3 OS – Operation System – Sistema Operacional .................................................................... 14
4 PWM – Pulse-width modulation – Modulação de largura de pulso...................................... 14
6
LISTA DE FIGURAS
Figura 2.1.1: Celular Nokia N95 mudando a orientação da tela .................................... 12
Figura 2.3.1: Módulo Bluetooth AMB2300 ................................................................... 13
Figura 3.1.1: Sinais digitais em forma de pulso de onda quadrada ................................ 15
Figura 3.1.2: Hardware em versão final ......................................................................... 16
Figura 3.3.1: Passos de utilização do aplicativo ............................................................. 20
Figura 3.3.2: Valores capturados pelo aplicativo nos movimentos do aparelho celular 20
Figura 3.4.1: Circuito do microcontrolador MSP430F449 ............................................ 21
Figura 3.4.2: Diagrama em blocos do adaptador de comunicação entre o módulo
Bluetooth e o microcontrolador ...................................................................................... 22
Figura 3.4.3: Circuito adaptador de comunicação entre o módulo Bluetooth e o
microcontrolador ............................................................................................................ 22
7
LISTA DE TABELAS
Tabela 1: ID de controle dos dispositivos ...................................................................... 17
Tabela 2: Mensagens de controle ................................................................................... 17
8
RESUMO
Para o desenvolvimento de um projeto atraente para crianças que facilite o seu
aproveitamento no tratamento de coordenação motora é necessário que leve-se em
consideração as limitações de quem está passando pelo tratamento. Para isso, a idéia de
criar um equipamento mais atraente aos olhos infantis exige que ele tenha um sistema
mais prático e simples de controle. Sendo assim, é necessário transformar um
automodelo radiocontrolado em um aparelho de reabilitação controlado de forma
intuitiva por celular, da mesma forma como se controla um volante de automóvel. Para
isso foi necessário desenvolver um controle a partir do sensor de movimento do
aparelho celular capaz de simular um volante de automóvel que fosse capaz de conduzir
o aparelho com movimentos intuitivos e simples.
O aparelho celular com sensor de movimento substitui o controle remoto enviando
sinais para o automodelo rádio-controlado que se movimenta de forma intuitiva e
natural.
Palavras-Chave: Automodelo, crianças, radiocontrolado, sensor de movimento.
9
AUTOMODEL CONTROLLED BY PHONE ACCELEROMETER
DESIGNED FOR MOTOR SKILLS TREATMENT IN INFANTS
ABSTRACT
Developing an attractive project for children that would enhance their motor skills
treatment performance is essential considering their physical conditions. In order to
achieve that idea it would be necessary to build equipment more attractive to the
children’s eyes. Designing a radio-controlled car into a phone’s accelerometer-
controlled car would be more natural as it would control the car as if it were a real car
wheel. Starting to build it from an accelerometer inside a phone and building the
reception circuit will allow the phone to simulate a car wheel with intuitive and simple
movements. The phone replaces the original remote control sending signals to the
receiver that generates intuitive movements.
Keywords: Automodel, infants, radiocontrolled, accelerometer.
10
1 INTRODUÇÃO
O tratamento de reabilitação em coordenação motora é a capacidade de usar de
forma mais eficiente os músculos esqueléticos, também conhecidos como grandes
músculos. Ele visa o desenvolvimento da coordenação motora específica, responsável
pela realização de determinados movimentos, como chutar uma bola ou conduzir um
brinquedo. No desenvolvimento da coordenação motora em crianças é essencial que
haja um estímulo que desperte o interesse da criança em realizar determinado exercício
físico. O desenvolvimento de um automodelo controlado por acelerômetro de celular,
por ser um controle intuitivo e na forma de um brinquedo, procura despertar esse
interesse infantil ao desenvolvimento de exercícios de coordenação motora.
Este trabalho teve como objetivo o desenvolvimento de um sistema de controle
utilizando os acelerômetros de celular capaz de realizar os movimentos básicos de um
automodelo controlado. Para o desenvolvimento do projeto o sistema de controle
original por radiofrequência de um automodelo foi substituído por um controle com
comunicação via Bluetooth. O dispositivo de controle é composto por um celular com
conexão via Bluetooth e sensores acelerométricos internos. O módulo de recepção e
acionamento do automodelo é composto por um dispositivo de comunicação Bluetooth
e um microcontrolador que executa a interpretação dos comandos recebidos do celular e
coordena o acionamento dos motores. Neste componente são realizadas as ações de
controle de velocidade dos motores via modulação por largura de pulso – PWM,
proporcionais às intensidades de aceleração enviadas pelos acelerômetros do celular de
controle. O celular de controle utiliza sistema operacional Symbian OS.
11
2 FUNDAMENTAÇÃO TEÓRICA
O objetivo do trabalho é transformar um sistema rádio-controlado em um sistema
intuitivo por meio de um aparelho celular capaz de reproduzir movimentos naturais de
direção e sentido. Para o êxito do trabalho é necessário acrescentar ao sistema de sensor
de movimento do celular, um sistema microcontrolado capaz de interpretar e
transformar comandos enviados pelo acelerômetro em sinais reconhecíveis pelo
aparelho rádio-controlado. Esses sinais são enviados através de ondas de rádio para um
módulo Bluetooth fazendo a comunicação entre o celular e o microcontrolador. A
utilização de sensor de movimento e microcontrolador é fundamental para a realização
do projeto.
2.1 Sensor de movimento ou acelerômetro
O sensor de movimento, ou acelerômetro, é um instrumento para medir a aceleração.
Segundo a primeira Lei de Newton: “Todo corpo permanece em repouso até que
alguma força externa seja exercida sobre ele.” Já a segunda Lei de Newton define a
força aplicada como o produto da massa do corpo pela sua aceleração. Logo, medindo a
aceleração aplicada sobre um corpo (e seu peso), é possível determinar a força aplicada
sobre ele. (Halliday, 2004)
Um acelerômetro é um instrumento capaz de medir a aceleração sobre objetos. Ao
invés de posicionar diversos dinamômetros (instrumento de medição de força) em
lugares diferentes do objeto, um único acelerômetro calcula qualquer força exercida
sobre ele.
Para entender seu funcionamento, supoem-se um copo com água até a metade. Se o
copo for colocado sobre uma superfície plana e empurrado para frente, observa-se que a
água se move. Quanto mais forte for o movimento, mais a água se move. O
acelerômetro mede esse movimento através do ângulo que o líquido forma em relação
ao seu estado inicial e assim fornece a aceleração aplicada ao copo. (aXYZ 1.0.0, 2011)
O acelerômetro é outro componente que está se tornando um item de série nos novos
aparelhos celulares, como mostrado na figura 2.1. Existem vários tipos de
acelerômetros: os mais simples são dispositivos eletro-mecânicos (“micro electro-
mechanical systems” ou MEMS), que incluem uma série de estruturas similares a
agulhas, que detectam os movimentos, gerando as leituras que são então transmitidas ao
circuito principal. (Ville, 2009)
Muitas câmeras filmadoras utilizam acelerômetros para controlar a estabilização da
imagem.
12
Figura 2.1.1: Celular Nokia N95 mudando a orientação da tela com o sensor de
movimento. (http://www.nokia.com, 2011)
A aplicação mais usada para o sensor de movimento é a mudança da orientação da
tela ao girar o aparelho. Quase todos os aparelhos utilizam telas com orientação vertical,
mas, atividades como navegar na internet ou assistir vídeos, exigem uma tela com
orientação horizontal. Normalmente, é necessário ativar uma opção para alterar o modo
e com um acelerômetro isso pode ser feito automaticamente.
Essa tecnologia será fundamental para o desenvolvimento do projeto pois será
utilizado o celular para captar os movimentos do acelerômetro e transformá-los em
mensagens a serem enviadas ao receptor que efetuará a transformação dessas
mensagens em sinais digitais capazes de realizar os movimentos do automodelo.
2.2 Microcontrolador
Um microcontrolador é um computador dentro de um circuito integrado. É
conhecido como: µC, uC ou MCU (microcontroller unit – unidade microcontrolada).
Ele contém dispositivos de memória, centro de processamento e periféricos de entrada e
saída, sendo programáveis através de diferentes linguagens de programação.
Os microcontroladores são usados em produtos e aparelhos controlados
automaticamente. Exemplos de utilização do microcontrolador envolvem o motor de um
veículo, dispositivos médicos implantáveis, controles remoto, máquinas de café
expresso, ferramentas elétricas, brinquedos e outros sistemas embarcados (sistemas de
computador criados para realizar tarefas dedicadas e funções diversas). (Texas
Instruments, 2011)
Seu papel nesse projeto é essencial para que haja a movimentação dos motores
elétricos no automodelo. Ele será o responsável por captar os sinais enviados pelo
aparelho celular, também fará a transformação dessas mensagens em sinais digitais e
13
finalmente realizará a transmissão desses sinais para os motores que conduzirão o
automodelo de acordo com a posição do aparelho celular.
2.3 Módulo Bluetooth
Bluetooth é a tecnologia sem fio padrão para troca de dados em pequenas distâncias
por meio de ondas curtas de rádio na faixa de 2400 a 2480 MHz e com alto grau de
segurança. A utilização de um sistema Bluetooth é necessária para efetuar a
comunicação entre o aparelho celular com o sensor de movimento e o microcontrolador
responsável por gerar os sinais que fazem o controle do automodelo, uma vez que não
há ligação com fios. Na figura 2.3.1 pode ser visto o módulo Bluetooth utilizado no
projeto.
Figura 2.3.1: Módulo Bluetooth AMB 2300 da Amber Wireless (http://www.amber-
wireless.de, 2011)
A finalidade de um módulo de comunicação é estabelecer conexão entre o aparelho
celular e o receptor do automodelo de forma sem fio. A tecnologia Bluetooth foi a
escolhida por oferecer baixo custo e alcance suficiente.
14
3 DESENVOLVIMENTO
O projeto de criação de um automodelo, para tratamento de reabilitação de
coordenação motora em crianças, envolve o desenvolvimento de três partes distintas e
igualmente fundamentais. A primeira parte é o hardware responsável por gerar os sinais
elétricos que são reconhecidos pelo automodelo. A segunda envolve o desenvolvimento
de um software interpretador de movimentos do celular e transmissor desses sinais. A
terceira trata do desenvolvimento de um sistema de comunicação entre hardware e
software a fim de obter o resultado satisfatório de controle intuitivo do automodelo.
3.1 Especificação de Hardware
O desenvolvimento do projeto começou pela escolha do automodelo que teve o
hardware adaptado para o movimento com o aparelho celular. O modelo escolhido foi o
Cross Country Race, elétrico e com escala de 1:10.
O aparelho celular com acelerômetro definido foi o Nokia N95, que utiliza sistema
operacional Symbian OS. (http://www.nokia.com, 2011)
O microcontrolador selecionado foi o MSP430F449 montado em uma placa de
desenvolvimento da Olimex. (http://www.olimex.com, 2011). Esse microcontrolador foi
selecionado pela capacidade de memória flash igual a 61440 bytes.
Para a comunicação entre o aparelho celular e o microcontrolador foi usado o
módulo Bluetooth 2300 da Amber Wireless, baseado no módulo 2.0 de porta serial
LMX9830 da National Semiconductor, devido ao menor custo e com alcance de 20
metros. A escolha desse módulo deve-se a seu alcance e custo baixo.
Para mudar a forma de controle do automodelo, que originalmente utilizava um
controle remoto com ondas de rádio em frequência de 27,9 MHz, para uma forma de
controle com ondas de rádio Bluetooth foi necessário substituir o receptor original por
outro para receber os sinais vindos do aparelho celular.
Os sinais de controle enviados pelo microcontrolador ao motor e ao servo motor
(motor interno baseado em sistema de transmissão) são sinais PWM (Pulse-width
modulation – Modulação por largura de pulso). Para o controle dos movimentos do
automodelo é necessário enviar sinais digitais ao controle do motor. O sinal é enviado
em forma de onda quadrada para o motor, onde a largura da onda em nível alto ajusta o
ângulo de deslocamento do servo motor, e por consequência o movimento para a
esquerda e para a direita das rodas dianteiras. A figura 3.1.1 demonstra o processo.
15
Figura 3.1.1: Sinais digitais em forma de pulso de onda quadrada enviados em
milisegundos para o servo motor. Variando o valor do período, obtém-se a posição
desejada do motor.
As medições em osciloscópio no sistema receptor original do automodelo mostram o
período total como sendo de 20ms. Ao mudar a posição para a esquerda, o sinal captado
fica entre 1ms a 1,49 ms. Para a direita o sinal captado fica entre 1,51 ms e 2 ms. Para o
retorno ao ângulo inicial o valor medido foi de 1,5 ms, ou seja, para o automodelo
seguir reto em frente o sinal recebido pelo servomotor deve ser de 1,5 ms. Esses valores
devem ser gerados pelo microcontrolador e enviados para o novo sistema receptor a fim
de obter os mesmos resultados que o sistema de controle original.
Para a direção foram utilizados os valores máximos de -127 (esquerda) a 127
(direita), valores que são enviados através de mensagens do aparelho celular para o
receptor com módulo Bluetooth. A velocidade máxima utilizada é a de 35% da potência
do motor DC.
O desenvolvimento desse hardware proporcionará um novo receptor capaz de
receber sinais digitais vindos do aparelho celular com conexão Bluetooth. A figura 3.1.2
representa o projeto em fase final.
16
Figura 3.1.2: Hardware em versão final.
3.2 Especificação de Firmware
O microcontrolador necessita de uma programação interna em forma de estrutura de
dados chamada de firmware, que determina as funções a serem desempenhadas. Para o
desenvolvimento do firmware utilizou-se a linguagem de programação C, por ser
abrangente e de fácil entendimento. O Anexo A apresenta os códigos que compoem o
firmware.
A estrutura de comunicação do microcontrolador mantida pelo firmware com o
motor do automodelo segue o formato das mensagens enviadas em código binário (um
byte com oito bits).
Preamble Identificador Bluetooth Identificador mensagem Tamanho dos
dados Dados Checksum
Preamble: 1 Byte, sempre 0xFF, usado para identificar o começo
Identificador: 1 Byte, identifica o dispositivo, tabela 1.
17
ID da mensagem: 1 Byte, identifica a mensagem que o dispositivo manda ou recebe,
tabela 2.
TamanhoDados: 1 Byte, indica quantos bytes são enviados em seguida (0 – 255)
Dados: 0 – 255 Bytes
Checksum: 1 Byte, calculado realizando a soma do módulo 256 no pacote todo
Dispositivos usados
Tabela 1: ID de controle dos dispositivos
ID O que faz
3 Direção
4 Acelerador
Tabela 2: Mensagens de controle
ID dispositivo
ID mensagem
Descrição TamanhoDados
Dados
3 1 Direção 1 8-bit signed char
Complemento de 2
0: pra frente
+1 .. + 127: esquerda
–1 .. – 128: direita
4 1 Acelerador 1 8-bit signed char
Complemento de 2
0: pra frente
+1 .. + 127: frente
–1 .. – 128: tras
O controle do funcionamento do motor DC do automodelo necessita da geração de
sinais digitais em forma de pulso de onda quadrada. Os valores limites de operação do
Automodelo são gerados dentro do código de criação de sinal PWM. O seguinte pedaço
de código em linguagem C, descreve esses limites:
TBCCR0 = 600;
// motor 2
TBCCTL2 = OUTMOD_7;
TBCCR2 = 50;
// motor 1
18
TBCCTL1 = OUTMOD_7;
TBCCR1 = 50;
Esse pedaço de código realiza a função de geração de modulação de largura de pulso
e faz parte do conjunto de códigos que formam o firmware, responsável pelo
funcionamento do microcontrolador.
O valor de TBCCR0 é o valor da frequência de funcionamento dos servo motores
dividida pela frequência de clock. Na maioria dos casos, o alcance da frequência está
entre 40 e 60 Hz. Para o Automodelo, a frequência de funcionamento é de 50 Hz, ou
período de 20 ms. O valor de TBCCR0 foi obtido dividindo o a frequência de clock pela
frequência do servo motor.
O valor de TBCCR1 e TBCCR2 são os valores de movimento dos servo motores
para a realização dos movimentos para a direita ou esquerda, respectivamente.
O desenvolvimento dessa estrutura de dados permitirá que o microcontrolador
controle os motores do automodelo a partir dos sinais digitais, transformados das
mensagens recebidas do aparelho celular.
3.3 Especificação de Software
Os movimentos do aparelho celular são reconhecidos quando captadas as variadas
posições através de um software que faz a interpretação e o envio dos movimentos para
o hardware. Ao desenvolver o sistema de controle, foi escolhida a linguagem Python
por ser uma linguagem de programação linear e rápido aprendizado e com comandos
acessíveis.
Na utilização da interface do usuário do celular e outras funções para a interpretação
e funcionamento é necessário fazer a importação de determinadas funções do aparelho
através de chamadas no código fonte do software, entre elas:
• import appuifw é a função que permite a utilização da interface do sistema
operacional s60 do aparelho N95 da Nokia, dessa forma o utilizador do sistema pode
fornecer informações ao sistema, como por exemplo, procurar um módulo bluetooth
ativo para realizar a comunicação.
• import socket é a função responsável por ativar o sistema bluetooth para
reconhecimento e comunicação entre o aparelho celular e o automodelo.
• import audio é a função que permite utilizar o áudio do aparelho celular para
emitir algum som, caso necessário.
• import miso é a função que permite deixar aceso o visor do celular quando o
software é carregado, assim na ausência de luz externa, o utilizador pode verificar o
funcionamento do sistema sem precisar fechar e abrir novamente o aplicativo.
• import struct é a função responsável por formatar os dados em bytes a serem
enviados para o microcontrolador.
19
• import sensor é a função responsável por fazer a leitura do sensor de
movimento (acelerômetro) do aparelho celular e também armazenamento desses dados
em variáveis x, y e z que representam a posição atual do aparelho celular. A forma
como é feita a leitura é descrita a seguir:
def get_sensor_data(status):
global value_cache,cache_pos
value_cache[cache_pos][0] = status['x']
value_cache[cache_pos][1] = status['y']
value_cache[cache_pos][2] = status['z']
sensor_type = sensor.sensors()['Sensoraceleracao']
acc_sensor = sensor.Sensor(sensor_type['id'],sensor_type['categoria'])
acc_sensor.connect(get_sensor_data)
A forma como o celular envia a mensagem de movimento ao microcontrolador
precisa estar no formato de código binário, gerado da seguinte forma pela linguagem
Python:
checksum = (255+3+1+1+direcao)
msg = ubytecmd(255, 3, 1, 1)
msg += bytecmd(direcao)
msg += ubytecmd(checksum)
if usabluetooth == 1:
sock.send(msg)
Checksum é o comando verificador de integridade da mensagem a ser enviada. 255
representa o valor máximo que o microcontrolador recebe para o envio de sinal para o
servo motor, que realiza o movimento de aceleração ou direção. O número 3 representa
o comando de direção do Automodelo e na geração do comando de aceleração esse
valor seria representado pelo número 4.
O commando “msg” forma a mensagem no padrão de comunicação estabelecido
pelo dispositivo Bluetooth e o comando “sock.send” envia a mensagem através do
socket do celular conectado ao módulo Bluetooth.
Esses sinais gerados acima são enviados pelo celular através do módulo Bluetooth
para o microcontrolador que faz a sua interpretação através do firmware e efetua o
movimento desejado no Automodelo.
Através do desenvolvimento desse aplicativo é possível estabelecer a comunicação e
realizar os movimentos desejados. O aplicativo se encarrega de captar as posições do
aparelho celular e enviá-las ao microcontrolador. A figura 3.3.2 demonstra o processo
de captura dos valores das posições X, Y e Z para cada movimentação do aparelho, em
cada intervalo de 500ms. O Anexo B apresenta o código em Python representando o
aplicativo.
20
Figura 3.3.1: Passos de utilização do aplicativo.
Figura 3.3.2: Valores capturados pelo aplicativo nos movimentos do aparelho
celular.
21
3.4 Especificação de Comunicação
Para o envio de informações do celular para o microcontrolador é necessário um
padrão de comunicação sem fio confiável, de fácil aquisição e baixo custo. A tecnologia
Bluetooth foi a selecionada por satisfazer essas condições.
O circuito desenvolvido para efetuar a comunicação entre o microcontrolador e o
módulo Bluetooth, responsável pela comunicação com o celular é demonstrado na
figura 3.4.1:
Figura 3.4.1: Circuito do microcontrolador MSP430F449 (Texas Instruments, 2011).
22
O módulo Bluetooth precisa ser ligado ao microcontrolador através de uma
adaptação de hardware feita com uma placa de circuito impresso, como mostram as
figuras 3.4.2 e 3.4.3.
Figura 3.4.2: Diagrama em blocos do adaptador de comunicação entre o módulo
Bluetooth e o microcontrolador. O motor 1 controla as rodas dianteiras (esquerda ou
direita) e o motor 2 o sentido de rotação para frente ou para trás.
Figura 3.4.3: Circuito adaptador de comunicação entre o módulo Bluetooth e o
microcontrolador.
23
Após a implantação desse hardware de comunicação o aparelho celular é capaz de
identificar o módulo Bluetooth e efetuar a comunicação com o microcontrolador. Esse,
por sua vez, realiza os processos de movimentação dos motores do automodelo. Para os
controles de potência foram utilizados os originais do automodelo radiocontrolado.
24
4 TESTES E RESULTADOS
Testes foram realizados para identificar problemas de funcionamento, instalação e
condução do automodelo. As soluções encontradas para os problemas foram suficientes
para permitir o funcionamento satisfatório do projeto.
Inicialmente os testes realizados apresentaram resultados insatisfatórios com relação
à comunicação do aparelho celular com o módulo Bluetooth devido a impossibilidade
de testar previamente a comunicação entre o módulo e o microcontrolador sem a
implementação do software ter sido concluída. Após essa implementação foi detectada a
falha no recebimento dos dados pelo microcontrolador a partir do módulo Bluetooth
devido ao fornecimento insuficiente de energia para o funcionamento do módulo.
Quando o módulo estava sendo reconhecido e recebia os sinais do aparelho celular,
ele não enviava os dados recebidos de forma correta ao microcontrolador. Isso foi
corrigido com a implantação do interpretador de comandos que passou a fazer parte do
firmware. A partir dessa implantação, o microcontrolador passou a captar corretamente
os sinais enviados pelo aparelho celular.
Em geração de sinais digitais o microcontrolador funcionou de forma satisfatória. As
correções necessárias foram apenas realizadas nos valores de PWM a serem enviados
por sinais digitais para os motores. Para o controle de velocidade observou-se que em
baixas rotações o automodelo não apresenta boa resposta, sendo necessária a
implementação de um pequeno atraso para o melhor controle.
Para a comunicação entre o celular e o módulo Bluetooth funcionar em 100% das
tentativas, é necessário que a fonte de energia forneça para o módulo Bluetooth, valor
de tensão entre o mínimo de 2,9V e o máximo de 3,3V e corrente mínima de 65mA.
Mantendo essas condições de fornecimento de energia e a distância máxima de 20
metros exigida pelo fabricante. A comunicação não foi interrompida nos testes
realizados.
A busca pelo sinal do módulo Bluetooth feita pelo celular pode ser comprometida se
o ambiente possuir diversos módulos Bluetooth ativados, como em outros celulares e
aparelhos notebook. Nesse caso é necessário mais de uma tentativa para captar o sinal.
Nos testes realizados sob essas condições, o máximo de três tentativas foram exigidas.
O software do celular teve problemas para ser instalado por falta de atualização do
firmware do celular. Esse problema foi solucionado com a instalação de uma versão
mais recente disponível no website do fabricante.
O controle de velocidade apresentou resultados insatisfatórios por apresentar
sensibilidade na leitura dos sinais do aparelho celular. Os movimentos para a frente e
para trás estavam muito rápidos e dificultaram o controle. Para crianças com
necessidades especiais, esse problema se agrava impedindo o controle do automodelo.
A solução para o problema da velocidade foi reduzir os valores de sinais digitais
enviados pelo microcontrolador aos motores. Foi necessário o cálculo do valor PWM a
ser gerado baseado no valor de clock do automodelo. Esse valor, dividido pela
frequência de funcionamento do receptor, proporcionou encontrar o número correto a
ser enviado pelo microcontrolador aos motores. Dessa forma, foi melhorado o controle
sobre a velocidade.
25
4.1 Testes com crianças
Os testes em crianças com necessidade de tratamento de reabilitação de coordenação
motora serão feitos nas dependências da Clínica de Fisioterapia da Universidade
Positivo quando essa puder atender as crianças para esse tratamento. O teste será
conduzido e orientado pelo profissional que acompanha o tratamento.
Os testes com crianças sem problemas físicos foi realizado na presença do
desenvolvedor do projeto que ofereceu instrução passo a passo para a utilização do
aparelho. O resultado foi satisfatório devido ao interesse positivo e do rápido
aprendizado de funcionamento por parte da criança, proporcionado pela facilidade do
processo de abertura do aplicativo e movimentos necessários para movimentação do
automodelo.
4.2 Personalização para pacientes
Os testes em crianças com necessidade de tratamento de reabilitação de coordenação
motora necessitam ser trabalhados de forma individual, afinal cada paciente tem o seu
grau de dificuldade e precisa de um aparelho melhor adaptado para casos individuais. O
projeto precisa adaptar um aplicativo que estabeleça diferentes níveis de sensibildade
para controle, permitindo que todos os diferentes níveis de necessidade sejam atendidos
de forma satisfatória.
26
5 EVOLUÇÕES
Para o futuro, esse projeto passará por modificações e melhorias para satisfazer
diferentes públicos e diversas funcionalidades. Alguns casos envolvem melhorias a
curto, médio e longo prazo.
Inicialmente será adaptado um sistema de controle menos sensível e com maior
flexibilidade de adaptação para ser direcionado para crianças com diferentes níveis de
deficiência.
Posteriormente o objetivo será implementar controle em luvas adaptadas com
sensores de movimento para levar esse projeto a controlar máquinas pesadas e veículos.
Futuramente, dependendo da disponibilidade de redes de internet sem fio, deverá ser
implementado um controle de diversos equipamentos em longas distâncias controlados
por movimentos intuitivos.
Finalmente poderá ser implementado um sistema de controle de veículos de carga e
passageiros através da Internet.
27
6 CONCLUSÃO
A proposta de criação de um aparelho de reabilitação da coordenação motora para
crianças foi pensada a partir da necessidade de atrair as crianças para o tratamento. Um
aparelho com forma de brinquedo parece ser bastante atraente aos olhos infantis e o
desenvolvimento desse projeto tem como objetivo gerar essa atração pelo tratamento.
O método de desenvolvimento proposto foi transformar um automodelo
radiocontrolado em um modelo controlado por aparelho celular de forma intuitiva, isso
facilita o controle de forma a eliminar a dificuldade de entendimento de um processo
complexo presente em um controle remoto padrão, com diversos botões e comandos
que são demorados de serem assimilados por uma criança com dificuldades de
coordenação motora.
Esse trabalho proporcionou incorporar o conhecimento de novas linguagens de
programação. O estudo de microcontroladores e de tecnologia de radiofrequência ficou
mais aprofundado.
Todos os estudos foram determinantes para aumentar a capacidade de
desenvolvimento de hardware e software, objetivos absolutos da engenharia da
computação.
28
REFERÊNCIAS
GRIFFITHS, David; BARRY, Paul. A Learner’s Guide to Programming Using the
Python Language. O’Reilly Media Inc., Estados Unidos, 2009.
HALLIDAY, David; RESNICK, Robert; WALKER, Jearl. Fundamentals of
Physics. John Wiley and Sons, Estados Unidos, 2004.
TEXAS INSTRUMENTS. MSP430x4xx Family User’s Guide: Texas Instruments,
Estados Unidos, 2011.
DAVIES, John. MSP430 Microcontroller Basics. Elsevier Ltd., 2008.
LABAKI, Josué. Introdução a Python – Módulo A. Universidade Estadual Paulista
Julio de Mesquita Filho, 2009.
TOCCI, Ronald J.; WIDMER, Neal S.; MOSS, Gregory L.. Sistemas Digitais –
princípios e aplicações. 10ª Edição. São Paulo – Brasil: Pearson Prentice Hall, 2007.
BOYLESTAD, Robert L.; NASHELSKY, Louis. Dispositivos Eletrônicos e teoria
de circuitos. 8ª Edição. São Paulo – Brasil: Pearson Prentice Hall, 2004.
MOREIRA, Ana. Desafio de uma vida – Reabilitação motora. Portal da Saúde.
Disponível em: <http://reabilitacaomotora.blogspot.com/2011/01/reabilitacao-motora-o-
que-e.html>. Acesso em: 29 de Dezembro de 2010 as 22h51min.
aXYZ 1.0.0 USING XYZ AXES OF THE N95 ACCELEROMETER. Disponível
em:
<http://www.developer.nokia.com/Community/Discussion/showthread.php?120394-
announce-aXYZ-1.0.0-using-XYZ-axes-of-the-N95-accelerometer-!>. Acesso em: 12
de janeiro de 2011 as 14h18min.
29
HOW TO BLUETOOTH-ENABLE YOUR REMOTE CONTROLLED CAR.
Disponível em: <http://alex.seewald.at/BlueCar/>. Acesso em: 12 de janeiro de 2011 as
14h12min.
TEST INTERACTIVE PYTHON EXAMPLES. Disponível em:
<http://docs.python.org/library/doctest.html>. Acesso em: 14 de janeiro de 2011 as
8h46min.
A SIMPLE TEXT PARSE. Disponível em:
<http://www.dreamincode.net/code/snippet488.htm>. Acesso em: 25 de março de 2011
as 21h08min.
KAAJAKARI, Ville. Practical MEMS: Design of microsystems, accelerometers,
gyroscopes, RF MEMS, optical MEMS and microfluidic systems. Estados Unidos:
Small Gear Publishing, 2009.
HOW TO MAKE .PY TO .SYS FOR 3RD EDITION DEVICES. Disponível em:
<http://www.developer.nokia.com/Community/Wiki/How_to_make_py_to_sis_for_3rd
_Editon_devices>. Acesso em: 19 de abril de 2011 as 11h21min.
TRANSFER TEXT FROM ONE MOBILE TO OTHER MOBILE. Disponível em:
<http://sites.google.com/site/croozeus/socket_module>. Acesso em: 19 de abril de 2011
as 11h45min.
GET AVAILABLE SERVER CHANNEL. Disponível em:
<http://nullege.com/codes/search/socket.bt_rfcomm_get_available_server_channel>.
Acesso em: 25 de abril de 2011 as 2h10min.
BLUETOOTH PROGRAMMING STEP-BY-STEP. Disponível em:
<http://www.devshed.com/c/a/Python/Bluetooth-Programming-using-Python/2/>.
Acesso em: 20 de abril de 2011 as 10h14min.
DRIVING A DC MOTOR USING PWM. Disponível em:
<http://hades.mech.northwestern.edu/index.php/Driving_a_DC_Motor_using_PWM>.
Acesso em: 20 de abril de 2011 as 10h25min.
TYSON, Jeff. Como funcionam os brinquedos controlados por rádio. Disponível
em: < http://eletronicos.hsw.uol.com.br/brinquedos-radio-controlados.htm>. Acesso em:
2 de maio de 2011 as 20h18min.
30
PULSE WIDTH MODULATION. Disponível em:
<http://www.oreillynet.com/network/synd/2003/07/02/pwm.html>. Acesso em: 2 de
maio de 2011 as 20h36min.
REAR MOTOR DRIVE. Disponível em: <http://henrytherobot.com/?page_id=53>.
Acesso em: 8 de maio de 2011 as 10h16min.
31
ANEXO A <CÓDIGOS EM C PARA O FIRMWARE>
Abaixo encontram-se os códigos que formam a estrutura de dados firmware
gravados no microcontrolador. Primeiro aparece o código principal. Em seguida os
códigos de verificação de distância e finalmente o código de geração de sinais digitais.
#include <signal.h>
#include <io.h>
#include <msp430x44x.h>
#include "uart.h"
#include "mth.h"
int main()
{
WDTCTL = WDTPW + WDTHOLD; // desliga o watchdog
_BIS_SR(GIE); // habilita as interrupções globais
initUART0(); // inicializa o UART que é conectado ao módulo Bluetooth
initMortinha(); // ajusta a mortinha
initPWMGeneration(); // inicializa o timer para gerar o PWM para os servos
}
32
#include <signal.h>
#include <io.h>
#include <msp430x44x.h>
#include "mth.h"
void initMortinha()
{
// setup do timer básico - 2 Hz (0.5 ms)
BTCTL = 0x25;
IE2 |= 0x80;
P1DIR |= 0x8; //output - LED vermelho indica timeout
}
// timer básico expirou - desliga a geração de PWM
interrupt (BASICTIMER_VECTOR) onBasicTimerInterrupt(void)
//#pragma vector=BASICTIMER_VECTOR
//__interrupt void onBasicTimerInterrupt(void)
{
P1OUT &= ~0x8; // liga o LED vermelho
P2DIR &= ~0x0c; // P2.2 - P2.3 input (alta impedância) - nenhum PWM é gerado
}
// reseta o timer, outputs liga
void serveMortinha()
{
BTCNT2 = 0; // reseta o timeout
P1OUT |= 0x8; // desliga o LED vermelho
P2DIR |= 0x0c; // P2.2 - P2.3 output
}
33
#include <msp430x44x.h>
#include "pwm.h"
void initPWMGeneration()
{
unsigned int i, j;
// setup da geração do PWM
FLL_CTL0 |= XCAP18PF; // Configura load caps
P2DIR |= 0x0c; // P2.2 - P2.3 output
P2SEL |= 0x0c; // P2.3 - P2.3 opções TBx
TBCCR0 = 200; // Período PWM
// servo 1
TBCCTL1 = OUTMOD_7; // CCR1 reset/set
TBCCR1 = 18; // CCR1 ciclo do serviço do PWM
TBCTL = 0x0111; // SMCLK, modo up - letra D no mapa unicode
// servo 2
TBCCTL2 = OUTMOD_7; // CCR1 reset/set
TBCCR2 = 12; // CCR1 ciclo do serviço do PWM
// todas as saídas 0 para que o controlador do motor calibre, indicando com flash do
LED
TBCCR1 = ((((signed char)0) * 10) / 54) + 45;
TBCCR2 = ((((signed char)0) * 10) / 54) + 45;
for (j = 0; j != 20; j++)
{
P1OUT ^= 0x8; // liga o LED vermelho
for (i = 0; i != 0xFFFF; i++)
{
__no_operation();
}
34
}
}
void setServo(unsigned int no, signed char value)
{
switch (no)
{
case 1:
TBCCR1 = ((value * 10) / 54) + 45;
break;
case 2:
TBCCR2 = ((value * 10) / 74) + 45;
break;
default:
break;
}
}
35
ANEXO B < CÓDIGO PYTHON PARA O APLICATIVO>
# Automodelo
# v1.0 - 20.2.2011
# Desenvolvido por:
# Marcos Bressan @sigaieu
import appuifw # interface de usuario s60
import socket # bluetooth
import miso # deixa aceso o backlight //instalar o MISO
import struct # formatando saida de bytes
# funcao que manuseia o modulo bluetooth:
def bt_connect():
global sock
# cria socket do bluetooth
sock=socket.socket(socket.AF_BT,socket.SOCK_STREAM)
target=''# endereco do modulo Bluetooth movel
if not target:
# scaneia dispositivos bluetooth
address,services=socket.bt_discover()
print "Descoberto: %s, %s"%(address,services)
if len(services)>1:
choices=services.keys()
choices.sort()
# abre popup e mostra os modulos disponiveis para selecionar
choice=appuifw.popup_menu([unicode(services[x])+": "+x
for x in choices],u'Escolher porta:')
target=(address,services[choices[choice]])
else:
36
target=(address,services.values()[0])
print "Conectando a "+str(target)
# Offset para acrescentar ao (ou subtrair) valor de aceleracao dependendo do sinal
do carro- calibracao
acc_offset = 0
# Modo Debug : -1 = desativado, 1 = ativado
debug = -1
# Usar Bluetooth ou nao mandar dados: -1 = sem dados, 1 = bluetooth
usabluetooth = 1
# Modo grafico: -1 = desativado, 1 = ativado
desenhagrafico = 1
# Limite de velocidade: -1 = desativado, 1 = ativado
limitedevelocidade = 1
maxvelofrente = 35
maxveloreversa = -30
# Tamanho do ponteiro que mostra o valor da aceleracao (nao precisa ser maior que
10 acho)
tamanhoponteiro = 10
# Modo paisagem: -1 = retrato, 1 = paisagem
paisagem = 1
# Aceleracao invertida (homenagem ao Elinton): -1 = off, 1 = on
aceleracaoinvertida = -1
# Tamanho da tela: GRANDE mostra nomes das teclas, CHEIA a tela inteira
appuifw.app.screen='large'
# 1 = Usa sensor API oficial da Nokia(5500, N95 8GB, ...), -1 = Usa aXYZ (N95 <
FW20, N93i)
usar_sensor_api = 1
if usar_sensor_api == 1:
import sensor
ignora_max = 4 # Nao processar todos os valores -> vai dar pau no Bluetooth
else:
import axyz
ignora_max = 3
# Cuida dos dados do teclado
if keyboard.is_down(EScancodeRightSoftkey): # Vaza
37
exit_key_handler()
elif keyboard.pressed(EScancodeStar): # Ativa (desativa) tela de debug
debug *= -1
elif keyboard.pressed(EScancodeHash): # Ativa (desativa) modo paisagem
paisagem *= -1
elif keyboard.pressed(EScancode0): # Ativa (desativa) aceleracao invertida
aceleracaoinvertida *= -1
elif keyboard.pressed(EScancode3): # Ativa (desativa) o limite de
velocidade
limitedevelocidade *= -1
elif keyboard.pressed(EScancodeSelect): # Ativa (desativa) a parada de
emergencia
paradadeemergencia *= -1
raw_x = x
raw_y = y
raw_z = z
# Processa aceleracao e sentido
# Parada de emergencia
if paradadeemergencia == 1:
x = 0
y = 0
z = 0
# Modo de controle
if paisagem == -1: #retrato
steering = -x
acceleration = -y
else: #paisagem
steering = -y
acceleration = z
# Aceleracao invertida
if aceleracaoinvertida == 1:
acceleration = -acceleration
# Usa todo o alcance de -127 a 127
steering *= 3
acceleration *= 2
38
if (atualmodoaceleracao > -1) and (acceleration > 0): # Recebeu aceleracao
reversa mas ainda nao em modo reverso
acceleration = 0 # Manter aceleracao no 0 a partir daqui
atualmodoaceleracao -= 1 # Diminui aceleracao modo o
Decrement ate chegar a -1
elif (atualmodoaceleracao < 0) and (acceleration <= 0): # Recebeu aceleracao
dianteira mas ainda nao em modo dianteira
atualmodoaceleracao = 1 # Muda para dianteira
# Verifica valor maximo (multiplo g)
steering = crop_value(steering, -127, 127)
acceleration = crop_value(acceleration, -127, 127)
# Cuidar dos dados de aceleracao
# Chamar em intervalos regulares
def cuidar_dados_sensor(x,y,z):
global ignorar_dados, ignora_max
# Desenhando
# limpa a imagem
img.clear(0x000000)
global res_x, res_y
# Define o texto titulo mede para poder centralizar na tela
title_text = u" "
text_rect = img.measure_text(title_text,font='title')[0]
top_offset_y = -text_rect[1]
# Desenha o grid de fundo
# esquerda para direita
img.line((0, (res_y - top_offset_y) / 2 + top_offset_y, res_x, (res_y - top_offset_y)
/ 2 + top_offset_y),0x7f0000)
# de cima pra baixo
img.line((res_x / 2, top_offset_y, res_x / 2, res_y),0x7f0000)
# Define um ponto e soma na imagem, define seus: coordenada x e y atual, e cor e
tamanho
if paisagem == -1: #retrato
img.point((normalize_value(steering, -127, 127, 0 + tamanhoponteiro / 2, res_x
- tamanhoponteiro / 2), normalize_value(acceleration, -127, 127, top_offset_y +
tamanhoponteiro / 2, res_y - tamanhoponteiro / 2)), 0xff0000,width=tamanhoponteiro)
else: #paisagem
39
img.point((normalize_value(acceleration, -127, 127, 0 + tamanhoponteiro / 2,
res_x - tamanhoponteiro / 2), normalize_value(steering, -127, 127, top_offset_y +
tamanhoponteiro / 2, res_y - tamanhoponteiro / 2)), 0xff0000,width=tamanhoponteiro)
# Desenha o texto titulo
img.text((res_x / 2 - text_rect[2] / 2, -text_rect[1]),title_text,0xffff00,font="title")
# Debug: mostra dados numericos
if debug == 1:
img.text((5, 50),u"Eixo x: %d"%raw_x,0x0060ff)
img.text((5, 65),u"Eixo y: %d"%raw_y,0x0060ff)
img.text((5, 80),u"Eixo z: %d"%raw_z,0x0060ff)
img.text((5, 95),u"Acelerador: %d"%acceleration,0x0000ff)
img.text((5, 110),u"Envia acelerador: %d"%send_acceleration,0x0000ff)
img.text((5, 125),u"Volante: %d"%steering,0x0000ff)
img.text((5, 140),u"Offset de acelerador: %d"%acc_offset,0x0000ff)
img.text((5, 155),u"Paisagem: %d"%landscape,0x6000ff)
img.text((5, 170),u"Acelerador invertido:
%d"%inverted_acceleration,0x6000ff)
img.text((5, 185),u"Limite de velocidade: %d"%speed_limit,0x6000ff)
# desenhar outra vez a imagem
if desenhagrafico == 1:
handle_redraw(())
# Enviar somente alguns dados, senao o bluetooth nao aguenta (nth)
# e gerando excecoes que eu nao quero
ignorar_dados += 1
if ignorar_dados < ignora_max:
return
ignorar_dados = 0
global sock
global debug, paradadeemergencia, desenhagrafico, paisagem,
aceleracaoinvertida, limitedevelocidade, maxvelofrente, maxveloreversa
global ultimaaceleracao, ultimavirada, atualmodoaceleracao, acc_offset
# Enviar novas mensagens para o carro
# Construir mensagem de sentido (direita esquerda)
# so manda se o novo valor e diferente do antigo
if ultimavirada != steering:
ultimavirada = steering
40
# Construir mensagem de sentido
checksum = (255+3+1+1+steering) % 256 # checksum
#imprime "st: %i ck: %i"%(sentido,checksum)
msg = ubytecmd(255, 3, 1, 1)
msg += bytecmd(steering)
msg += ubytecmd(checksum)
if usabluetooth == 1:
sock.send(msg)
# Construir mensagem de aceleracao
# Somente envia se o novo valor for diferente do antigo ou se o carro esta
mudando de dianteiro para reverso
if (ultimaaceleracao != acceleration) or ((atualmodoaceleracao != 1) and
(atualmodoaceleracao != -1)):
ultimaaceleracao = acceleration
send_acceleration = acceleration
# Normaliza a aceleracao para os valores restritos se o limite de velocidade eh
ativado
if limitedevelocidade == 1:
if send_acceleration > 0:
# Reverso
send_acceleration = normalize_value(send_acceleration, 0, 64, 0,
maxveloreversa)
else:
# aceleracao Dianteira
send_acceleration = normalize_value(send_acceleration, -64, 0,
maxvelofrente, 0)
# Soma o offset da aceleracao para o valor enviado e ter certeza de que nao
excede o limite
send_acceleration = crop_value(send_acceleration + acc_offset, -127, 127)
checksum = (255+4+1+1+send_acceleration) % 256 # checksum
msg = ubytecmd(255, 4, 1, 1)
msg += bytecmd(send_acceleration)
msg += ubytecmd(checksum)
if usabluetooth == 1:
sock.send(msg)
41
# ------------------------------------------------------------------------------------------------
-
# Processamento diverso
# Deixar o visor aceso Lembrar de instalar o MISO
miso.reset_inactivity_time()
class Keyboard(object):
def __init__(self,onevent=lambda:None):
self._keyboard_state={}
self._downs={}
self._onevent=onevent
def handle_event(self,event):
if event['type'] == appuifw.EEventKeyDown:
code=event['scancode']
if not self.is_down(code):
self._downs[code]=self._downs.get(code,0)+1
self._keyboard_state[code]=1
elif event['type'] == appuifw.EEventKeyUp:
self._keyboard_state[event['scancode']]=0
self._onevent()
def is_down(self,scancode):
return self._keyboard_state.get(scancode,0)
def pressed(self,scancode):
if self._downs.get(scancode,0):
self._downs[scancode]-=1
return True
return False
# define uma funcao que redesenha a tela, nesse caso a imagem deveria
# ser desenhada de novo e de novo (usar a funcao .blit)
def handle_redraw(rect):
global img
canvas.blit(img)
def exit_key_handler():
global sock,usabluetooth,usar_sensor_api
# Desregistra para parar a aquisicao dos dados do sensor.
if usar_sensor_api == 1:
42
global acc_sensor
acc_sensor.disconnect()
else:
axyz.disconnect()
if usabluetooth == 1:
sock.close()
app_lock.signal()
appuifw.app.set_exit()
# Normaliza o valor para caber no tamanho especificado
# Requer a especificacao do maximo alcance anterior
def normalize_value(val,min_val,max_val,min_new,max_new):
# Certifica-se que o valor nao ultrapasse seu valor maximo ou minimo
val = crop_value(val, min_val, max_val)
# Normaliza o valor para que seja restringido ao novo alcance
# e usa todo o valor para o novo alcance no caso de ser usado todo o alcance
anterior.
return int(((float(val) - min_val) / (max_val - min_val)) * (max_new - min_new)
+ min_new)
def bytecmd(cmd,*args): # Argumentos sao bytes assinados
return struct.pack("b%db" % len(args), cmd, *args)
def ubytecmd(cmd,*args): # Argumentos nao sao bytes assinados
return struct.pack("B%dB" % len(args), cmd, *args)
# Recorta o valor entre o minimo e maximo
def crop_value(val,min_val,max_val):
if (val < min_val):
val = min_val
elif (val > max_val):
val = max_val
return val
def menu_about():
appuifw.note(u"Marcos Bressan, 2011 @sigaieu", "info")
def menu_exit():
exit_key_handler()
def get_sensor_data(status):
global value_cache,cache_pos
43
# Calcula a media para os dados do sensor oficial API
# o celu já faz alguma filtragem interna
value_cache[cache_pos][0] = status['data_1']
value_cache[cache_pos][1] = status['data_2']
value_cache[cache_pos][2] = status['data_3']
cache_pos += 1
if cache_pos == 5:
cache_pos = 0
cur_data = [0,0,0]
for i in range(5):
cur_data[0] += value_cache[i][0]
cur_data[1] += value_cache[i][1]
cur_data[2] += value_cache[i][2]
for i in range(3):
cur_data[i] /= 5
cuidar_dados_sensor(-cur_data[1]/5,-cur_data[0]/5,-cur_data[2]/5)
# Inicializa a aplicacao e inicia o sensor
appuifw.app.title = u"Automodelo"
appuifw.app.exit_key_handler = exit_key_handler
appuifw.app.menu = [(u"Sobre", menu_about),(u"Sair", menu_exit)]
keyboard=Keyboard()
if desenhagrafico == 1:
# Usa a visualizacao grafica
canvas=appuifw.Canvas(event_callback=keyboard.handle_event,
redraw_callback=handle_redraw)
# Estabelece o corpo do aplicativo como "canvas"
appuifw.app.body=canvas
else:
# Ajusta o controlador do teclado e nao desenha mais nada assim as mensagens
podem ser vistas no console
canvas=appuifw.Canvas(event_callback=keyboard.handle_event)
# cria uma imagem vazia (aparece como imagem branca)
res_x, res_y = sysinfo.display_pixels()
img=Image.new((res_x,res_y))
paradadeemergencia = -1 # Parada de emergencia e desativada
44
ultimaaceleracao = 0
ultimavirada = 0
ignorar_dados = 0
atualmodoaceleracao = 1 # 1... dianteiro, -1... reverso
# chama a funcao que controla a conexao bluetooth
if usabluetooth == 1:
bt_connect()
# media proxima
value_cache = [[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0]]
cache_pos = 0
# conecta ao sensor
if usar_sensor_api == 1:
# Usa o Sensor API da Nokia
sensor_type = sensor.sensors()['Sensoraceleracao']
acc_sensor = sensor.Sensor(sensor_type['id'],sensor_type['categoria'])
acc_sensor.connect(get_sensor_data)
else:
# Usa modulo AXYZ
axyz.connect(cuidar_dados_sensor)
app_lock = e32.Ao_lock()
app_lock.wait()