Upload
others
View
6
Download
0
Embed Size (px)
Citation preview
1
PONTIFÍCIA UNIVERSIDADE CATÓLICA DO RIO GRANDE DO SUL
FACULDADE DE ENGENHARIA
INSTRUMENTAÇÃO ELETRÔNICA DE EXERCITADOR MANUAL
(HANDGRIP)
Porto Alegre, 09 de dezembro de 2017.
Autor: Lineker Schossler da Silva
Pontifícia Universidade Católica do Rio Grande do Sul
Curso de Engenharia Elétrica
Av. Ipiranga 6681, - Prédio 30 - CEP: 90619-900 - Porto Alegre - RS - Brasil
Email: [email protected]
Orientador: Prof. Júlio César Marques de Lima
Pontifícia Universidade Católica do Rio Grande do Sul
Av. Ipiranga 6681, - Prédio 30 - CEP: 90619-900 - Porto Alegre - RS- Brasil
Email: [email protected]
RESUMO
O tema deste Trabalho de Conclusão de Curso (TCC) é a instrumentação eletrônica
de um exercitador manual, também chamado de Handgrip. O objetivo deste trabalho é
tornar possível o monitoramento e registro de todos os dados úteis durante a execução de
atividades de preensão manual por diversos usuários. Para tal, foram aplicados métodos
como a adaptação de sensores ao equipamento e desenvolvimento de circuitos elétricos de
alimentação, processamento, comunicação e registro em memória dos dados coletados.
Como resultado, o monitoramento e armazenamento das atividades realizadas com o
Handgrip foi efetivo. Conclui-se que é viável instrumentar eletrônicamente o equipamento e
gerar relatórios individuais de desempenho, uma vez que as informações coletadas são
válidas e importantes para o acompanhamento do paciente e avaliação da efetividade da
terapia.
Palavras-chave: handgrip. instrumentação. monitoramento. registro.
2
ABSTRACT
The subject of this Term paper is electronic instrumentation of manual exerciser, also
called Handgrip. The objective of this paper is to make it possible to monitor and record all
useful data during the execution of manual gripping activities by several users. To do so,
some methods were applied such as the adaptation of sensors to the equipment and the
development of electrical circuits for supply, processing, communication and collected data
storage in memory. As a result, the monitoring and storaging of activities performed with
the Handgrip was effective. It has been concluded that it is feasible to electronically
instrument the equipment and generate individual performance reports, since the
information collected is valid and important for the follow-up of the patient and evaluation
of the effectiveness of the therapy..
Key-words: handgrip, instrumentation. monitoring. storage.
1 INTRODUÇÃO
É possível observar um crescimento exponencial de novas tecnologias atualmente, o
que proporciona à sociedade inúmeros benefícios. Consequentemente, diversas áreas do
conhecimento usufruem cada vez mais de artifícios tecnológicos para o seu próprio
aprimoramento. Tal fato abre portas para o desenvolvimento da Engenharia em setores como
o da Biomedicina.
O objeto da pesquisa deste TCC consiste na instrumentação eletrônica de um
equipamento utilizado na área biomédica em atividades fisioterápicas. Este instrumento,
conhecido como exercitador manual, ou Handgrip, proporciona ao usuário exercícios físicos
de preensão manual. A adaptação desse equipamento envolve a utilização de diferentes
tecnologias de sensoriamento e alimentação elétrica para os circuitos elétricos implementados,
além de um processamento das informações coletadas durante o ato do exercício físico e seu
posterior armazenamento.
A necessidade de realizar esse artigo surge de uma demanda do setor de Fisioterapia
da Pontifícia Universidade Católica do Rio Grande do Sul (PUCRS). Pacientes que realizam
terapia de reposição renal através de Hemodiálise (HD) têm, em exercícios com o Handgrip,
um treinamento de reabilitação eficaz da musculatura do antebraço.
Para que os resultados esperados com esse modelo de atividade física sejam atingidos,
é importante manter um acompanhamento da carga aplicada e da frequência que o
equipamento é utilizado. Como o equipamento atual apresenta apenas uma configuração
mecânica sem nenhum monitoramento interno, é difícil controlar a sua utilização. Tal fato
3
justifica a necessidade de uma instrumentação aprimorada do exercitador manual,
principalmente quando utilizado por diversos usuários.
A instrumentação eletrônica do Handgrip tem como objetivos principais o
monitoramento, processamento, e registro de informações úteis durante a execução da
atividade de preensão manual. Tais informações incluem a carga utilizada e o volume de
treinamento, bem como sua eficácia. O sistema implementado também deve manter a
autonomia e mobilidade do instrumento, possuir uma interface simples de operação, além de
proporcionar conectividade com o usuário e/ou instrutor, por meio de comunicação em rede
sem fio Bluetooth. Tais requisitos configuram o nível de sistemas do projeto.
O foco deste estudo está na adaptação do instrumento às tecnologias de sensoriamento
e processamento necessárias, além do desenvolvimento de circuito elétrico e programação de
Firmware (FW) que sustentem essas funcionalidades propostas. Tais requisitos abrangem
principalmente a área eletrônica, mecânica e de sistemas embarcados.
4
2 REFERENCIAL TEÓRICO
Neste capítulo, é apresentado as referências teóricas utilizadas como base para a
execução deste estudo. Os tópicos a seguir referem-se a todos os aspectos técnicos necessários
para sustentar o desenvolvimento da metodologia e encontro com os objetivos finais do
trabalho.
2.1 Exercitadores manuais
É possível relacionar os benefícios de exercícios manuais na maturação de vasos
sanguíneos e na recuperação após o procedimento cirúrgico na fístula arteriovenosa (FAV).
Tal procedimento é requerido para a realização de HD em pessoas que sofrem da Doença
Renal Crônica (DRC). É importante destacar que a taxa de mortalidade após a cirurgia da
FAV diminui com o tratamento através desse modelo de exercício. Exercícios com o
Handgrip aumentam o dimensionamento da veia cefálica e também o volume de fluxo
sanguíneo (KONG S, LEE KS, KIM J, JANG SH, 2014).
Pacientes que são submetidos a HD apresentam, como um dos principais efeitos
colaterais, sintomas ligados a anemia. A anemia também pode ser considerada capaz de afetar
a força muscular e de preensão manual. É possível inferir, através destes dados, que a
medição dessa força pode ser utilizada como parâmetro na classificação do estado nutricional
(PEDRUZZI, L. M. ET.AL, 2012).
2.2 Extensômetro de resistência elétrica
O princípio básico de funcionamento está na utilização de pequenas tiras de liga
resistiva (ex.: Cobre-Níquel) adesivamente ligadas a uma estrutura para medir sua tensão
superficial. Por possuir alta precisão e sensibilidade, combinado com um baixo custo e
aplicações em diferentes faixas de temperatura, o extensômetro de resistência elétrica é uma
das ferramentas mais utilizada no campo de análise de estresse de materiais. Sua primeira
utilização data da década de 1930, nos Estados Unidos da América.
Todo material condutivo apresenta uma relativa variação em sua resistência elétrica de
acordo com variações em seu comprimento. Logo, existe uma sensibilidade a tensão do
material conforme ele é deformado de forma elástica. Essa resistência elétrica do material é
encontrada pela equação 1:
5
𝑅 = 𝜌. 𝑙/𝐴 (Equação 1)
Onde:
R = resistência; l = comprimento; A = área transversal e ρ = resistividade.
A sensibilidade à deformação pode ser expressa como indicado na equação 2:
𝐹 = 𝛥𝑅
𝑅.
𝑙
𝛥𝑙 (Equação 2)
Onde:
F = sensibilidade à deformação; R = resistência inicial; 𝛥𝑅 = variação na resistência;
l = comprimento inicial e 𝛥𝑙 = variação do comprimento.
Para que o extensômetro proporcione um desempenho satisfatório, é importante que o
material não possua uma resistência elétrica muito baixa, usualmente 350Ω. Por limitações
práticas, o comprimento necessário para que a tira condutora do extensômetro assuma uma
resistência significativa geralmente é maior que o comprimento que se deseja medir na
estrutura (A.L.WINDOW, G.S.HOLIESTER, 1982). Para contornar essa limitação, o
extensômetro é constituído em forma de uma grade formada pela mesma tira, como mostra a
figura 1:
Fonte: A.L.WINDOW, G.S.HOLIESTER [1982]
Embora apresente comportamento linear e alta sensibilidade, a tensão medida com
extensômetros é, geralmente, muito pequena. Isso faz com que as alterações de resistência do
material não possam ser aferidas diretamente. Para encontrar uma medição satisfatória, é
necessário implementar um sistema de medição em algumas etapas, como ilustrado na figura
2:
Figura 1- Extensômetro de resistência elétrica
6
Fonte: KARL HOFFMANN [1987]
O extensômetro deve ser conectado a uma ponte de Wheatstone, que traduz a variação
na resistência pela deformação mecânica em uma variação de tensão elétrica, referenciada a
uma fonte de energia externa. Esse sinal elétrico deve ser amplificado por um circuito
amplificador para que então, possua amplitude suficiente para medição. Por fim, essa medição
pode ser lida de diversas formas, digital e analogicamente (KARL HOFFMANN, 1987).
2.3 Ponte de Wheatstone
Circuito em ponte criado pelo físico inglês Sir Charles Wheatstone, em 1843, para a
medição de resistências elétricas. Basicamente, uma ponte é criada utilizando resistências
elétricas de valores conhecidos ligadas a uma resistência desconhecida, como mostra a figura
3. Na entrada desse circuito, é aplicada uma tensão elétrica conhecida, e sua variação na saída
é diretamente relacionada com o valor da resistência que se pretende determinar (KARL
HOFFMANN, 1986).
Figura 2 - Processo de medição de extensômetro
7
Fonte: KARL HOFFMANN [1986]
Por traduzir uma variação de resistência em tensão elétrica, o circuito de ponte de
Wheatstone é comumente utilizado na leitura de extensômetros, onde é possível relacionar a
tensão de saída em função da deformação, como mostrado na equação 3:
𝑈𝐴 = 𝐾.Ɛ.𝑁.𝑈𝐸
4 (Equação 3)
Onde:
UA = tensão de saída; UE = tensão de entrada; K = fator gauge; Ɛ = deformação; N =
número braços ativos da ponte (A.L.WINDOW, G.S.HOLIESTER, 1982).
2.4 Amplificador
Em circuitos eletrônicos, muitas vezes o sinal gerado por transdutores possui uma
amplitude e/ou potência muito baixa, necessitando a sua amplificação antes de ser
transmitidos ou analisados de forma digital ou analógica (ERNEST O. DOEBELIN, 1983).
Fonte: ERNEST O. DOEBELIN [1983]
Amplificadores de pequeno sinal são projetados para amplificar esses sinais, em geral
menores que 1V, melhorando a relação sinal/ruído. Uma característica importante dos
amplificadores é o chamado ganho, ou seja, o quanto o sinal de entrada é amplificado. O
Figura 4 - Amplificador
Figura 3 - Ponte de Wheatstone
8
ganho pode ser calculado como a relação entre a tensão de entrada com a tensão de saída,
corrente de entrada em relação a corrente de saída, ou a relação entre a potência de entrada
com a potência de saída do circuito, como indicado nas equações 4, 5 e 6:
Ganho de tensão: 𝐴𝑣 = 𝑉𝑜𝑢𝑡
𝑉𝑖𝑛 (Equação 4)
Ganho de corrente: 𝐴𝑖 = 𝐼𝑜𝑢𝑡
𝐼𝑖𝑛 (Equação 5)
Ganho de potência: 𝑃𝑣 = 𝑃𝑜𝑢𝑡
𝑃𝑖𝑛 (Equação 6)
(MIKE TOOLEY, 2006)
2.5 Microcontrolador
Sistema constituído por um Hardware (HW) controlado por um Software (SW). Trata-
se de um computador de único chip (ver figura 5), consistindo em CPU, memória RAM e
memória ROM, que geralmente estão conectados a periféricos internos, como osciladores,
conversores analógico/digital (A/D) e digital/analógico (D/A), timers, etc. Esses componentes
básicos são interligados por barramentos (conexão de múltiplas vias), cujas funções são as
seguintes:
Barramento de endereço: para localizações de memória;
Barramento de dados: para transferência de dados entre dispositivos;
Barramento de controle: para a conexão de sinais de temporização e controle para o
sistema.
9
Figura 5 - Arquitetura de microcontrolador
Fonte: MIKE TOOLEY [2006]
Todo o sistema se baseia em linguagem binária, onde cada bit de dado apresenta
estado lógico 0 (baixo) ou 1 (alto). Sua função primária é executar instruções residentes na
memória, através de uma sequência contínua de busca e execução de instrução. Cada ciclo de
operação da CPU do microcontrolador é conhecido como ciclo de máquina. Uma instrução do
programa pode requerer diversos ciclos, executados com frequência de acordo com sua base
de tempo, determinada por um relógio (oscilador). (MIKE TOOLEY, 2006)
2.6 Sensor de efeito Hall
O efeito Hall foi descoberto em 1879 pelo Dr. Edwin Herbert Hall e consiste no
surgimento de uma diferença de potencial elétrico causada por um campo eletromagnético
incidente em um condutor. Tal efeito é amplamente utilizado na aplicação de sensores, na
identificação de presença de objetos ou sua posição. Sensores magnéticos, como também são
conhecidos, são ideais para esse tipo de aplicação, pois não são significantemente afetados por
materiais não magnéticos. Além disso, campos magnéticos de grande intensidade são
incomuns na natureza, geralmente causados pelo homem, o que diminui a probabilidade de
interferência (EDWARD RAMSDEN, 2006).
10
3 METODOLOGIA
Para o desenvolvimento deste TCC, foi seguido um planejamento base para organizar
as etapas a serem executadas e proporcionar uma análise contínua durante a realização do
projeto. A figura 6 ilustra essas etapas:
Fonte: AUTORAL [2017]
Validação da instrumentação eletrônica do Handgrip
Integração entre HW do Handgrip e SW de aplicação externa
Desenvolvimento de SW para aplicação externa de troca de dados
Desenvolvimento de FW para o microprocessador
Validação do HW da PCI
Desenvolvimento da Placa de Circuito Impresso (PCI)
Validação dos sensores
Desenvolvimento do circuito elétrico e definição dos componentes
Definição da comunicação disponível no dispositivo
Definição da interface com o usuário
Definição dos métodos de sensoriamento
Definição de requisitos de HW para o projeto
Figura 6 - Etapas da Metodologia
11
3.1 Definição de requisitos de HW para o projeto
Como primeiro passo, deve-se identificar quais são os requisitos de HW que o projeto
deve possuir. Isso é definido através da análise dos requisitos em nível de sistemas e quais são
os atributos necessários ao equipamento para atingi-los de forma satisfatória. Esses seriam os
requisitos fundamentais para dar continuidade ao desenvolvimento das próximas etapas.
3.2 Definição dos métodos de sensoriamento
Devem-se definir quais métodos de sensoriamento serão utilizados para garantir as
funcionalidades desejadas. Como existem diversos modelos de transdutores que se aplicam
aos requisitos, deve-se encontrar aqueles com melhor viabilidade, levando em consideração
fatores como a adaptação na estrutura do equipamento e parâmetros elétricos de alimentação e
interpretação dos sinais.
3.3 Definição da interface com o usuário
É importante definir maneiras de o usuário final interagir com o Handgrip e ser capaz
de utilizar as novas funcionalidades implementadas após sua instrumentação. Para isso, é
necessária a criação de uma interface simples, intuitiva e objetiva, por meio na qual o usuário
poderá acessar todas as informações pertinentes e estar apto a atuar nas configurações
requeridas para a utilização dos recursos inseridos.
3.4 Definição da comunicação disponível no dispositivo
Deve-se definir qual padrão de comunicação deve ser utilizado para que o dispositivo
troque dados com dispositivos externos, de acordo com suas funcionalidades previamente
definidas. Leva-se em consideração o formato dos dados transmitidos, os componentes
eletrônicos necessários e seus parâmetros elétricos, além da compatibilidade com os
dispositivos que se deseja comunicar.
3.5 Desenvolvimento do circuito elétrico e definição dos componentes
Para a implementação de todas as funcionalidades desejadas na instrumentação do
Handgrip, é necessário definir e listar todos os componentes que serão necessários para o
desenvolvimento da parte eletroeletrônica do projeto. O circuito elétrico deve, então, ser
projetado paralelamente com base nos recursos necessários e no material disponível, tornando
12
possível o dimensionando dos componentes específicos para a alimentação, processamento,
comunicação e memória do dispositivo.
3.6 Validação dos sensores
É de grande importância validar o bom funcionamento dos sensores escolhidos
previamente por meio de testes práticos. Antes da montagem de todo o circuito elétrico
projetado na etapa anterior, é necessário desenvolver um circuito básico para testar e validar o
sensoriamento do Handgrip.
Para tal, instalam-se os sensores na maneira idealizada e realizam-se testes de medição e
desempenho para verificar o correto processo de leitura e variação dos dados fornecidos. Caso
algum sensor não se comporte como o esperado, podem-se testar alternativas nessa etapa,
definindo novos componentes e atualizando o circuito elétrico.
3.7 Desenvolvimento da PCI
Terminados a validação dos sensores e finalização do circuito elétrico completo, deve-
se traduzir esse circuito em um layout de PCI. Observam-se, para este fim, os níveis de
corrente elétrica e frequência de operação dos componentes utilizados, para que não ocorra
mal dimensionamento de trilhas, evitando problemas no desempenho do circuito.
Após o layout, a PCI deve ser confeccionada juntamente com a soldagem de todos os
componentes elétricos que a compõem, definidos pelo circuito desenvolvido nas etapas
anteriores. Todos os passos dessa etapa são cruciais para evitar retrabalhos e problemas na
validação do próximo item.
3.8 Validação do HW da PCI
Com a PCI pronta, devem ser iniciados os processos de validação do circuito
desenvolvido e da integridade do HW como um todo. A PCI só deve ser alimentada com
tensão elétrica após a verificação das principais conexões do circuito, evitando possíveis
curtos-circuitos que possam danificar os componentes. Após essa verificação, já com a PCI
alimentada, todas as partes do circuito devem ser verificadas e testadas, validando seu estado
de operação.
13
3.9 Desenvolvimento de FW para o microprocessador
Com todo o circuito pronto e validado, se deve desenvolver a programação, em
linguagem C, do FW e inseri-lo no microprocessador da PCI. Esse programa controlará todo o
comportamento do circuito, uma vez que o microprocessador deve gerenciar todas as
operações necessárias. Seja na coleta de dados dos sensores, no registro das atividades dos
usuários com o Handgrip ou na troca de dados com dispositivos externos, o FW do
microprocessador deve ser responsável por monitorar e solicitar cada tarefa.
3.10 Desenvolvimento de SW para aplicação externa de troca de dados
Deve-se desenvolver um SW em uma aplicação externa que contemple a funcionalidade
de troca de dados com o Handgrip. Esse tráfego de informações ocorrerá por meio de um
padrão de comunicação previamente estabelecido, identificando os usuários e
disponibilizando os registros de suas atividades com o equipamento. Essa aplicação também
deve ser considerada como parte da interface entre o usuário e o Handgrip.
3.11 Integração entre HW do Handgrip e SW de aplicação externa
Para todas as funcionalidades propostas, é necessário que o Handgrip esteja apto a
realizar a troca de dados de forma satisfatória com a aplicação externa, previamente definida.
Para isso, deve-se verificar a estrutura de comunicação entre os dispositivos e testar sua
eficiência, integrando as duas partes. Nesta etapa, serão feitos os ajustes finais para que haja
sincronia na transmissão e recepção de dados.
3.12 Validação da instrumentação eletrônica do Handgrip
Após todas as etapas de desenvolvimento anterior serem concluídas, é necessário validar
o sistema embarcado e todos seus requisitos. Para isso, devem ser realizados diversos testes
com todos os recursos operando normalmente, coletando dados de exercícios com diversos
usuários, intensidade de força e frequência de repetição. Todos esses dados devem ser
armazenados para a análise dos resultados obtidos com a instrumentação eletrônica do
Handgrip.
14
4 APLICAÇÃO DA METODOLOGIA PROPOSTA
Após a metodologia ter sido definida, foi necessária a aplicação de cada etapa do projeto
e registro dos resultados obtidos durante seu desenvolvimento. Juntamente com estes
resultados, estão descritos neste capítulo todos os passos e decisões tomadas em cada etapa,
além das ferramentas utilizadas.
4.1 Definição de requisitos de HW para o projeto
Para a instrumentação eletrônica do Handgrip, foram considerados os seguintes
requisitos em nível de sistemas:
Leitura do nível de carga utilizado nos exercícios
Contabilização da quantidade de movimentos realizados (efetivos)
Registro individual das atividades para diversos usuários
Autonomia e mobilidade do equipamento
Interface de simples acesso e operação
Conectividade por rede de comunicação sem fio Bluetooth
Para suportar esses recursos, foi realizada uma breve análise do que o equipamento
necessitaria. Os seguintes requisitos de HW foram definidos, possibilitando integrar as
funcionalidades do sistema ao Handgrip:
1. O nível de carga aplicado e a indicação de movimento finalizado devem ser
indicados por sensores instalados diretamente no exercitador manual.
2. Todo registro de exercício no Handgrip deve ser armazenado em um Circuito
Integrado (CI) de memória dedicado a esse propósito.
3. O equipamento deve possuir uma base de tempo que garanta o registro de data e
horário na memória.
4. Toda a alimentação elétrica do dispositivo deve ser feita por meio de uma bateria
que forneça a tensão e corrente elétrica necessárias por tempo adequado,
propiciando autonomia e mobilidade ao sistema.
5. Um circuito carregador de bateria deve ser adotado.
6. A interface entre usuário e sistema de monitoramento deve ser feita diretamente no
equipamento ou através de aplicação móvel em rede sem fio.
7. A interface entre usuário e sistema de registradores deve ser feita somente por
aplicação móvel em rede sem fio.
15
8. O equipamento deve possuir um módulo integrado dedicado a comunicação em rede
sem fio, responsável por criar a conexão e manter a troca de dados com outro
dispositivo e aplicação compatíveis.
9. O equipamento deve possuir uma unidade de processamento embarcado compatível
com todos os recursos necessários e que faça o gerenciamento de todas as operações
que envolvam o monitoramento e registro das atividades com o Handgrip, além da
interface com o usuário.
4.2 Definição dos métodos de sensoriamento
Para realizar a leitura do nível de carga aplicado e indicação de movimento finalizado,
foram fixados sensores diretamente na estrutura do Handgrip. Os métodos de sensoriamento
adotados para tais leituras foram extensômetros de resistência elétrica e sensor de efeito Hall,
respectivamente.
4.2.1 Sensoriamento da carga aplicada
O equipamento possui um sistema manual que permite regular a carga do exercício.
Esse ajuste acontece por meio de um fuso mecânico, alterando a inclinação da mola que
proporciona o movimento, como identificado nas figuras 7 e 8. Para o registro das atividades
com o Handgrip, foi necessário que este nível de carga aplicada fosse medido.
Fonte: AUTORAL [2017]
Figura 7 - Handgrip configurado para carga mínima
Ajuste da
carga
16
Fonte: AUTORAL [2017]
O método utilizado foi a instalação de dois extensômetros para uma variação maior de
resistência. Estes foram fixados na estrutura que sustenta a mola, a fim de sofrerem
deformações elásticas proporcionais a carga aplicada, como indicado nas figuras 9 e 10.
Fonte: AUTORAL [2017]
Fonte: AUTORAL [2017]
Figura 8 - Handgrip configurado para carga máxima
Figura 9 - Extensômetro superior
Figura 10 - Extensômetro inferior
17
Dessa forma, o nível de força mecânica aplicada durante o exercício pôde ser
convertido em níveis de resistência elétrica. Para utilizar essa variação na resistência dos
extensômetros, foi desenvolvido um circuito elétrico em ponte de Wheatstone, que transforma
essa variação de força em níveis proporcionais de tensão elétrica. Contudo, a tensão gerada
situa-se na faixa dos milivolts [mV], necessitando a utilização de um amplificador de sinal.
Para este fim, foi utilizado o CI HX710, da fabricante Avia Semiconductor (Xiamen), capaz de
amplificar a tensão com um ganho de 128 vezes, além de converter esse sinal analógico em
digital, com resolução de 24 bits. A figura 11 ilustra o circuito elétrico aplicado.
Fonte: EAGLE 7.5.0 LIGHT EDITION [2017]
4.2.2 Indicação de movimento finalizado
É fundamental, para a instrumentação eficaz do Handgrip, que seja possível determinar
a quantidade de exercícios que o usuário realiza (efetivamente). Para isso, foi necessário um
método de sensoriamento que indicasse o fim de cada movimento válido.
A alternativa adotada foi o uso de um sensor de efeito Hall, fixado em uma das hastes
do equipamento, ver figura 12. Na haste oposta, foi fixado um imã permanente, indicado na
figura 13. Toda vez que as hastes se encontrem, o imã induz um campo magnético ao redor do
sensor, intenso suficiente para o sensor detectar sua presença. Esse encontro das hastes indica
um movimento finalizado.
Figura 11- Circuito elétrico para leitura de carga
18
Fonte: AUTORAL [2017]
Fonte: AUTORAL [2017]
O sensor de efeito Hall utilizado foi o CI modelo A3144, da fabricante Allegro
MicroSystems®. Alimentado diretamente por uma tensão de 3,3V, a saída do sensor apresenta
nível lógico alto (1) enquanto seu campo magnético não é detectado, ou seja, sem a presença
do imã. Assim que o imã se aproxima do sensor, a saída é alterada para nível lógico baixo (0).
4.3 Definição da interface com o usuário
Para que o usuário do Handgrip utilize as funcionalidades de monitoramento e registro
dos exercícios, foi definida uma Interface Homem Máquina (IHM) para essa nova parte do
equipamento. Para manter uma interface simples e objetiva, foi adotado um sistema de IHM
com apenas um botão e um LCD (Liquid Crystal Display), modelo 1112 da fabricante Nokia,
indicado na figura 14, além de uma chave liga/desliga. Esse display recebe comandos por
protocolo SPI. Complementando esse sistema, também foi definido o desenvolvimento de
uma aplicação móvel para smartphone, como mostra a figura 15, que se comunicará por meio
de uma rede Bluetooth com o Handgrip.
Figura 13 - Imã permanente
Figura 12 - Sensor de efeito Hall
19
Fonte: AUTORAL [2017]
Figura 15- Aplicação móvel para smartphone
Fonte: MIT APP INVENTOR [2017]
Em ambas as interfaces, o usuário pode escolher seu número de identificação e
monitorar sua atividade em tempo real. Porém, só é possível acessar o registro de atividades
por meio da aplicação móvel, que importa os dados do Handgrip e os armazena no
smartphone para compartilhamento com outras plataformas.
Figura 14 - LCD do Handgrip
20
4.3.1 Princípios de utilização da interface
Através da chave liga/desliga do equipamento, o usuário deve inicializar o sistema,
ligando a instrumentação do Handgrip. Após isso, é necessário escolher o número do usuário,
clicando múltiplas vezes no botão até que seja seu número o apresentado no LCD. Se for
desejada a utilização da aplicação móvel, o usuário deve conectar seu smartphone ao
equipamento por meio de comunicação sem fio.
Posteriormente, o usuário pode realizar seu exercício, visualizando a quantidade de
repetições para a intensidade da carga que está utilizando. Sua atividade é salva
automaticamente a cada minuto na memória do equipamento. Para exportar seu registro de
atividades, é necessário clicar no botão “Salvar dados” da aplicação móvel. Assim que
finalizar o processo, basta desligar o equipamento por meio da chave liga/desliga.
4.4 Definição da comunicação disponível no dispositivo
A partir da necessidade de uma comunicação entre o equipamento Handgrip com uma
aplicação móvel em smartphone, foi determinada a utilização de uma rede sem fio. Os
requisitos para esta rede foram o baixo consumo de energia, mantendo a autonomia do
equipamento, e o fato de que a comunicação com o smartphone do usuário não requer longas
distâncias.
Considerando tais características, foi adotado o padrão Bluetooth na criação da rede de
comunicação sem fio disponível para troca de dados com o equipamento. Para implementá-lo,
foi utilizado o módulo SPBT3.0DP2, da fabricante STMicroelectronics, indicado na figura 16.
Fonte: STMICROELECTRONICS [2017]
Tal dispositivo é responsável pelo pareamento, transmissão e recepção de dados entre o
equipamento e a aplicação móvel, disponibilizando essas informações e recebendo comandos
Figura 16- Módulo Bluetooth
21
por meio de uma porta serial assíncrona. Essa porta foi configurada para uma taxa de
transmissão de 19200bps, formando pacotes de 8 bits, sem paridade e com 1 stop bit.
4.5 Desenvolvimento do circuito elétrico e definição dos componentes
Com base em todas as especificações previamente apresentadas, foi projetado um
circuito elétrico que integra todas as funcionalidades do equipamento. Este circuito engloba a
alimentação de todos periféricos, unidade de processamento, métodos de sensoriamento,
comunicação em rede sem fio, interface com o usuário e registro das atividades.
Para o seu desenvolvimento, foi utilizada a ferramenta computacional EAGLE 7.5.0
Light Edition, onde é possível desenhar o circuito e, posteriormente, desenvolver seu layout
de circuito impresso. Os componentes elétricos como capacitores e resistores, salvo em
exceções descritas a seguir, foram dimensionados de acordo com as especificações dos
fabricantes dos demais CIs. O circuito elétrico completo, bem como sua lista de componentes,
pode ser encontrado no anexo 1.
4.5.1 Circuito de alimentação
Para o fornecimento de energia elétrica a toda instrumentação do equipamento, foi
utilizada uma bateria de 4,2V / 1Ah. Também foi instalado um módulo carregador de bateria,
figura 17, com o CI TP4056, da fabricante Top Power ASIC, que possui o circuito indicado na
figura 18.
Fonte: TOP POWER ASIC [2017]
Figura 17- Módulo carregador de bateria
22
Fonte: Top Power ASIC
Além disso, foi necessária a adição de um regulador de tensão para converter a saída de
4,2V para 3,3V, gerando a tensão correta de operação dos principais componentes do circuito.
Este regulador de tensão é o CI TLV2217-33, da fabricante Texas Instruments.
Para garantir a estabilidade na medição das variações de tensão geradas nos
extensômetros, também foi instalado um regulador de tensão de precisão. Este regulador de
precisão é o CI REF3230, também da fabricante Texas Instruments, que converte a entrada de
3,3V para 3,0V.
Para monitorar o nível de tensão da bateria pela unidade de processamento, foi utilizado
um divisor de tensão, convertendo a tensão da bateria em uma tensão compatível com a
leitura do conversor A/D interno do microprocessador, de 3,3V. A equação 7 demonstra o
cálculo utilizado para encontrar o valor de um dos resistores, uma vez que o resistor ligado ao
terra deveria ser de 10kΩ, para manter um baixo consumo de energia:
𝑉𝑜𝑢𝑡 =𝑅2
𝑅1+𝑅2. 𝑉𝑖𝑛 → 𝑅1 = 2,73𝑘𝛺 (Equação 7)
Onde:
Vout = 3,3V; R2 = 10kΩ; Vin = 4,2V
4.5.2 CI de memória
No processo de registro das atividades para cada usuário do Handgrip, foi utilizado um
CI de memória, modelo M24M02, da fabricante STMicroelectronics. Esse componente
contém 256kBytes de memória, dividida em registradores de 8 bits, suficientes para registrar
Figura 18 - Circuito do carregador de bateria
23
as atividades de múltiplos usuários em diversas sessões de exercício. Sua comunicação é por
meio do protocolo I2C.
4.5.3 Microprocessador
Como unidade de processamento interna, foi adotada a utilização de um
microprocessador capaz de gerenciar todas as funcionalidades do equipamento. O
componente utilizado foi o CI STM32F030, da fabricante STMicroelectronics. É um
microprocessador com core ARM® 32-bit Cortex® -M0, configurado para uma frequência de
operação de 48MHz. Também foi inserido no circuito um oscilador local de 8MHz, que
fornece uma base de tempo estável ao microprocessador.
4.5.4 Interface de debug
Durante o desenvolvimento do FW e testes com a PCI, foi necessária uma interface de
debug que facilitou o processo. Para isso, foi incluído previamente no circuito elétrico um
botão de reset para o microprocessador e dois LEDs, um vermelho e outro verde, para
sinalizar etapas durante a operação do equipamento.
4.6 Validação dos sensores
Antes de montar o circuito elétrico final, foi decidido realizar testes com os sensores
inseridos no equipamento, a fim de validar seu funcionamento e garantir que esses métodos
seriam eficazes. Para isso, foi montado apenas o circuito base para a leitura dos extensômetros
de resistência elétrica e do sensor de efeito Hall, como já descrito no capítulo 4.2. A figura 19
apresenta o circuito montado.
Fonte: AUTORAL [2017]
Figura 19 - Circuito de validação dos sensores
24
Para processar as leituras, foi utilizado um kit Arduino, com microcontrolador Atmel
AVR, onde foi implementada uma rotina em FW que cria o protocolo específico de coleta de
dados do conversor A/D HX710, como indicado na figura 20. O código foi criado através da
ferramenta de compilação Arduino, e pode ser encontrado no anexo 2.
Fonte: AVIA SEMICONDUCTOR (XIAMEN) [2017]
Durante os testes, foi possível identificar que o sensor de efeito Hall é afetado apenas
por materiais magnetizados, sinalizando de forma rápida a presença ou não desses materiais.
Os extensômetros apresentaram uma deformação elástica proporcional ao nível da carga
selecionado no equipamento, indicando níveis de variação de tensão para uma interpretação
da atividade. Através de medições com um osciloscópio digital, foi possível validar o
protocolo entre o microcontrolador e o conversor A/D, como indicado na figura 21.
Fonte: AUTORAL [2017]
Figura 21- Leitura do osciloscópio
Figura 20- Protocolo A/D HX710
25
4.7 Desenvolvimento da PCI
Após a escolha dos componentes e desenvolvimento do circuito elétrico, passando pela
validação dos sensores, foi necessário a confecção de uma PCI para implementar o circuito
completo projetado. Para o desenvolvimento do layout, foi utilizada a ferramenta
computacional EAGLE 7.5.0 Light Edition, a partir dos arquivos do circuito previamente
criado na mesma ferramenta.
Foi optado pela confecção de duas PCIs: uma com a maior parte do circuito, contendo
alimentação, processamento, memória e comunicação; e outra com o circuito que permite a
interface com o usuário, com o botão e LCD. A figura 22 e 23 mostram ambos layouts
finalizados.
Figura 22- Layout da PCI principal
Fonte: AUTORAL [2017]
26
Fonte: AUTORAL [2017]
Após a etapa de layout estar finalizada, foi necessário confeccionar as PCIs. Para isso,
utilizou-se do método de corrosão para a placa principal. Porém, para a placa de interface, foi
necessário o método de usinagem por fresadora, já que o circuito possui um conector muito
pequeno que requer alta precisão no traçado do circuito impresso. Por fim, todos os
componentes foram soldados às PCIs, de acordo com o layout predefinido. As figuras 24 e 25
mostram as PCIs, principal e de interface, finalizadas.
Fonte: AUTORAL [2017]
Figura 24 - PCI principal
Figura 23 - Layout da PCI de interface
27
Fonte: AUTORAL [2017]
4.8 Validação do HW da PCI
Com as PCIs montadas e prontas para serem utilizadas, foi importante realizar uma
depuração em todas as partes do circuito, com o intuito de validar as conexões em geral.
Antes de alimentar o circuito com a bateria, todas as conexões críticas que envolvem a
alimentação direta dos componentes foram verificadas através de um ohmimetro digital,
avaliando a existência de curto-circuito.
Com a garantia de que não existiam mais potenciais curtos-circuitos nas PCIs, iniciou-
se os testes com a alimentação da bateria. Primeiramente, foi verificado que todas as tensões
estavam apresentando os níveis desejados. Em seguida, o carregador foi alimentado por uma
fonte externa de 5V e conexão USB, indicando através de seus LEDs de interface que a
bateria estava sendo carregada corretamente.
Figura 25 - PCI de interface
28
4.9 Desenvolvimento de FW para o microprocessador
Após o HW ser verificado, iniciou-se o desenvolvimento do FW que, posteriormente,
foi carregado para o microprocessador do equipamento, contendo todas as instruções
necessárias para o funcionamento estabelecido nos capítulos anteriores. Para essa tarefa, foi
utilizada, primeiramente, a ferramenta computacional STM32CubeMX, que permitiu a criação
automática de diversas bibliotecas e drivers padrões na configuração do microprocessador. A
figura 26 demonstra sua utilização.
Fonte: STM32Cube V1.0 [2017]
Por meio desta ferramenta, todos os pinos e portas de comunicação foram definidos,
bem como seus parâmetros. Em seguida, foi utilizada a ferramenta computacional Keil
µVision 5 para o desenvolvimento do código de programação em linguagem C. A figura 27
demonstra sua utilização.
Figura 26 - STM32CubeMX
29
Fonte: Keil µVision 5 [2017]
Nesta etapa, foram implementadas as rotinas que comandam e gerenciam todas as
funcionalidades do equipamento, tais como:
Leitura da carga por meio do CI HX710;
Comunicação Bluetooth entre equipamento e aplicação móvel;
Armazenamento das atividades no CI de memória;
Leitura do sensor de efeito Hall;
Controle do LCD e leitura do botão de interface com o usuário;
Relógio de tempo real para registro de data e hora.
Inicialmente, cada funcionalidade foi desenvolvida e testada individualmente. Após seu
funcionamento estar de acordo com os requisitos, todas as funcionalidades foram reunidas na
mesma rotina, estabelecendo todos os recursos do equipamento. O código principal, com
todas essas funções, pode ser encontrado no anexo 3.
Figura 27 - Programação em linguagem C
30
4.9.1 Mapeamento da memória
Para o registro de todas as atividades do Handgrip, a memória do equipamento foi
organizada por meio do FW para armazenar até 8 usuários. Cada usuário pode ocupar até
27622 Bytes da memória, onde cada sessão de exercícios com mesma carga ocupa 8 Bytes.
Destes 27622 Bytes, os dois primeiros Bytes sempre armazenam o último endereço
salvo do respectivo usuário, a fim de facilitar a leitura e os próximos registros. Isso resulta
em, no máximo, 3452 registros de atividade por usuário. Cada registro contém as seguintes
informações: Data e hora iniciais, quantidade de repetições, carga aplicada e duração do
exercício.
4.10 Desenvolvimento de SW para aplicação externa de troca de dados
Como definido anteriormente, foi necessário o desenvolvimento de uma aplicação
móvel para smartphone, com o intuito de fornecer uma interface ao usuário para, além de
monitorar os exercícios, também salvar seu registro de atividades. A ferramenta utilizada
nessa etapa foi a plataforma online MIT App Inventor, como indicado na figura 28.
Fonte: MIT App Inventor [2017]
Figura 28 - Aplicação móvel
31
Tal ferramenta possibilitou o desenvolvimento de um aplicativo móvel para
smartphones com sistema operacional Android, através de uma linguagem de programação
em blocos funcionais. Nela, foi implementada a comunicação Bluetooth com o Handgrip,
apresentando o monitoramento das atividades em tempo real, além de possibilitar a
exportação do histórico de atividades do usuário. É também a partir dessa aplicação que o
equipamento atualiza automaticamente suas configurações de data e hora.
4.10.1 Registro das atividades do usuário
Por meio da aplicação móvel, o usuário pode salvar o histórico de uso do equipamento
em seu smartphone. Tal recurso é realizado pela conversão das informações contidas na
memória do Handgrip em um arquivo de extensão CSV (Comma-separated values). Esse
arquivo é salvo na memória local do smartphone e pode ser compartilhado diretamente pela
aplicação com outras plataformas, como serviços em nuvem, por exemplo. Usualmente, essa
extensão de arquivo é interpretada em forma de tabela, como demonstrado na figura 29.
Fonte: AUTORAL [2017]
4.11 Integração entre HW do Handgrip e SW de aplicação externa
Após o desenvolvimento de todo HW e da aplicação móvel para smartphone, foi
necessário realizar a integração dos dois sistemas, validando sua comunicação e troca de
dados. Para isso, foram feitos testes de funcionalidade do equipamento, sempre conectado a
aplicação móvel.
Durante os testes, foram necessários alguns ajustes, tanto no SW da aplicação como no
FW do microprocessador. Tais ajustes tiveram o intuito de manter uma troca de dados
sincronizada e criar rotinas para a confirmação do recebimento de pacotes enviados via
Bluetooth, o que apresentava erros em casos específicos que não haviam sido previstos
originalmente.
Figura 29- Arquivo CSV
32
4.12 Validação da instrumentação eletrônica do Handgrip
Como última etapa de desenvolvimento deste projeto, foram realizados testes que
exploraram todas as funcionalidades propostas na instrumentação do Handgrip. Esse processo
foi responsável pela validação do equipamento e possibilitou uma análise final dos resultados
obtidos. O principal teste empregado foi a execução de exercícios com o Handgrip, simulando
todos os oito possíveis usuários, alternando a carga aplicada na atividade entre 10% e 90% da
capacidade do equipamento.
5 CONCLUSÃO
Durante a aplicação da metodologia adotada incialmente no projeto, foi possível
desenvolver a instrumentação eletrônica do Handgrip. Foram definidos requisitos necessários
para que o sistema fosse capaz de monitorar os exercícios realizados com o equipamento e
armazená-los para análise posterior, de forma a facilitar o acompanhamento desse modelo de
atividade fisioterápica.
Os métodos de sensoriamento adotados, através da leitura do nível de carga aplicada e da
indicação de movimento finalizado, foram efetivos durante os testes com o equipamento. Isso
demonstra a validade do método.
Porém, foi identificada a necessidade futura de uma calibração do equipamento para
definir o real valor de força aplicado pelo usuário em relação a posição da mola configurada
pelo fuso mecânico. Para o desenvolvimento deste artigo, os extensômetros aplicados são
utilizados apenas na relação direta com a posição do mola, indicando o nível de carga
proporcional a possível variação do fuso mecânico.
A interface com o usuário, por sua vez, se mostrou simples e objetiva, conforme
planejado. A utilização de uma aplicação móvel foi fundamental para manter a mobilidade do
equipamento, uma vez que é cada vez mais disseminado o uso de smartphones pela
socieadade atual.
A comunicação via Bluetooth entre o equipamento e a aplicação móvel também trouxe
vantagens ao sistema. Um exemplo foi a possibilidade de transferência do registro de
atividades do usuário em rede sem fio, sem a necessidade do smartphone conectado perder
conexão com a internet, possibilitando o compartilhamento dessas informações de forma
simples e rápida.
33
O fornecimento de energia elétrica ao sistema por meio de uma bateria permitiu que o
equipamento mantivesse sua autonomia e mobilidade, junto com um circuito carregador que
possibilita a recarga da bateria de forma segura. Contudo, é importante ressaltar que não é
possível alimentar o circuito somente com o carregador. É necessário que a bateria esteja
permanentemente conectada junto ao circuito.
Outra característica importante foi a memória interna do equipamento. Com 256kBytes
disponíveis, foi adotado uma configuração de armazenamento de até 8 usuários. Além disso, é
possível armazenar mais de 3400 sessões de exercício por usuário, possibilitando registros
completos da terapia.
Em geral, a instrumentação eletrônica do excercitador manual, também chamado de
Handgrip, teve êxito em relação as funcionalidades incialmente propostas. Embora o sistema
possa passar por aprimoramentos, principalmente na questão de interpretação da carga
aplicada, já é possível, com o sistema atual, criar registros confiáveis sobre as atividades de
cada usuário. Tal fato proporciona uma melhora significativa no acompanhamento do
paciente e avaliação da efetividade da terapia através de exercícios de preensão manual.
6 REFERÊNCIAS
KONG S, LEE KS, KIM J, JANG SH. The effect of two different hand exercises on grip
strength, forearm circumference, and vascular maturation in patients who underwent
arteriovenous fistula surgery. Annals of rehabilitation medicine. 2014.
PEDRUZZI, L. M.; LEAL, V. O.; BARROS, A. F.; LOBO, J. C.; MAFRA, D. Factors
related to handgrip strength in patients undergoing hemodialysis: emphasis on anemia.
Nutrire: rev. Soc. Bras. Alim. Nutr. = J. Brazilian Soc. Food Nutr., São Paulo, SP, abr. 2012.
WINDOW, A.L. and HOLISTER, G.S. Strain Gauge Technology. ed. Elsevier Applied
Science: Inglaterra, 1982. 356 p, il.
HOFFMANN, Karl. An Introduction to Measurements using Strain Gages. ed. Hottinger
Baldwin Messtechnik GmbH: Alemanha, 1987. 257 p, il.
34
HOFFMANN, Karl. Applying the Wheatstone Bridge Circuit. ed. Hottinger Baldwin
Messtechnik GmbH: Alemanha, 1988. 27 p, il.
DOEBELIN , Ernest O. Measurement Systems: Application and Design. ed. McGraw-Hill :
EUA, 1983, 876 p, il.
TOOLEY, Mike. Electronic Circuits: Fundamentals and Applications. ed. Newnes:
Inglaterra, 2006. 417 p, il.
RAMSDEN, Edward. Hall-Effect Sensors Theory and Applications. ed. Newnes: Inglaterra,
2006. 250 p, il.
35
ANEXO 1 – Circuito elétrico e lista de componentes
36
37
Componente Valor / Modelo
B_1 Push Button
BAT 4,2V / 1Ah
CB1 100nF
CD1 100nF
CE1 100nF
CE2 100nF
CE3 100nF
CM1 100nF
CP1 100nF
CP2 100nF
CP3 100nF
CP4 12pF
CP5 12pF
CR1 470nF
CV1 100nF
CV2 22uF
EXT 350Ω
HALL A3144
HX710 HX710B
IC1 TLV2217-33
LCD1 NOKIA1112
LED_1 Verde
LED_2 Vermelho
P1 1kΩ
Q1 8MHz
R1 2.7kΩ
R2 10kΩ
RB1 10kΩ
RE1 200Ω
RE2 200Ω
RL1 330Ω
RL2 330Ω
RP1 10kΩ
RP2 470Ω
RP3 10Ω
S1 Push Button
U$2 M24M02-DR
U$3 TP4056
U$4 STM32F030K6T6
U1 SPBT2632C2A
U2 REF3230AIDBVT
38
ANEXO 2 – Código em Arduino para testes
#include "Arduino.h"
#define DOUT 4
#define PD_SCK 5
#define HALL 6
#define S_OUT 7
unsigned long valor;
long carga;
long leitura()
digitalWrite(PD_SCK, LOW);
delayMicroseconds(1);
while (digitalRead(DOUT) == HIGH);
valor = 0;
for (int i = 23; i > -1; i--)
digitalWrite(PD_SCK, HIGH);
delayMicroseconds(1);
digitalWrite(PD_SCK, LOW);
if (digitalRead(DOUT) == HIGH)
bitSet(valor, i);
digitalWrite(PD_SCK, HIGH);
delayMicroseconds(1);
digitalWrite(PD_SCK, LOW);
delayMicroseconds(1);
return valor;
void setup()
Serial.begin(9600);
pinMode(DOUT, INPUT);
pinMode(PD_SCK, OUTPUT);
void loop()
carga = leitura();
float l;
l = round(carga);
delay(200);
Serial.println(l,0);
if (digitalRead(HALL) == LOW)
digitalWrite(S_OUT, HIGH);
else
digitalWrite(S_OUT, LOW);
39
ANEXO 3 – Código principal em C do FW
/**
***************************************************************************
***
* File Name : main.c
* Description : Main program body
***************************************************************************
***
** This notice applies to any and all portions of this file
* that are not between comment pairs USER CODE BEGIN and
* USER CODE END. Other portions of this file, whether
* inserted by the user or by software development tools
* are owned by their respective copyright owners.
*
* COPYRIGHT(c) 2017 STMicroelectronics
*
* Redistribution and use in source and binary forms, with or without
modification,
* are permitted provided that the following conditions are met:
* 1. Redistributions of source code must retain the above copyright
notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
notice,
* this list of conditions and the following disclaimer in the
documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of STMicroelectronics nor the names of its
contributors
* may be used to endorse or promote products derived from this
software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
40
***************************************************************************
***
*/
/* Includes ---------------------------------------------------------------
---*/
#include "main.h"
#include "stm32f0xx_hal.h"
#include "adc.h"
#include "i2c.h"
#include "rtc.h"
#include "usart.h"
#include "gpio.h"
/* USER CODE BEGIN Includes */
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
//LCD
#include "Fonts.h"
//Range
#define load_min 10
#define load_max 95
#define qtd_max 255
#define user_max 7
#define time_max 127
//Comunicação Bluetooth com App
#define sUser 1000
#define sHall 2000
#define sLoad 3000
//Registradores da memória
#define U_step 0x8000 //32768
#define U_mem 0xEBE7 //256999
#define U_S_step 0x0008
#define U0_pg 0x50
#define U1_pg 0x50
#define U2_pg 0x51
#define U3_pg 0x51
#define U4_pg 0x52
#define U5_pg 0x52
#define U6_pg 0x53
#define U7_pg 0x53
#define U_day 0x02
#define U_month 0x03
#define U_year 0x04
#define U_hour 0x05
#define U_min 0x06
#define U_qty 0x07
#define U_load 0x08
#define U_time 0x09
#define NewLine 1
#define UpdateLine 0
41
#define i2c_delay 100
#define DataBytes 8
#define Begin_st 0
#define BT_st 1
#define Wait_noBT_st 2
#define Wait_BT_st 3
#define Exer_BT_st 4
#define Exer_noBT_st 5
#define Log_st 6
#define Erase_st 7
//LCD
#define LCD_NCHAR 16
#define LCD_NLINE 8
#define _graus 128
#define _up 129
#define _down 130
#define _left 131
#define _right 132
#define _enter 133
#define CR 0x0d
#define LF 0x0a
#define virado 1
#define nao_virado 0
#define bit0 0x01
#define bit1 0x02
#define bit2 0x04
#define bit3 0x08
#define bit4 0x10
#define bit5 0x20
#define bit6 0x40
#define bit7 0x80
#define RESX_on GPIOA->BSRR = 1<<15
#define RESX_off GPIOA->BRR = 1<<15
#define SDA_on GPIOB->BSRR = 1<<5
#define SDA_off GPIOB->BRR = 1<<5
#define SCLK_on GPIOB->BSRR = 1<<4
#define SCLK_off GPIOB->BRR = 1<<4
#define CSX_on GPIOB->BSRR = 1<<3
#define CSX_off GPIOB->BRR = 1<<3
/* USER CODE END Includes */
/* Private variables ------------------------------------------------------
---*/
/* USER CODE BEGIN PV */
/* Private variables ------------------------------------------------------
---*/
uint8_t vetor[30] = "";
uint8_t state_g = 0;
uint8_t data_valid = 0;
uint8_t user = 0;
uint32_t load_v = 0;
42
uint8_t time_spent = 0;
uint8_t u_pg = 0x00;
uint32_t s_addr = 0x00;
uint8_t watchdog = 0;
char porc = '%';
typedef struct
uint8_t day;
uint8_t month;
uint8_t year;
uint8_t hour;
uint8_t min;
uint8_t qtd;
uint8_t load;
uint8_t time_spent;
DATA_struct;
DATA_struct user_data;
//LCD
const unsigned char mask[8] = 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02,
0x01;
unsigned char LCD_linecount;
unsigned char LCD_charcount;
//RTC
RTC_TimeTypeDef sTime; // estrutura que recebe hora
RTC_DateTypeDef sDate; // estrutura que recebe data
/* USER CODE END PV */
/* Private function prototypes --------------------------------------------
---*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
/* Private function prototypes --------------------------------------------
---*/
//Bluetooth
char init_bt(void);
void connect_bt(void);
void check_bt(void);
void data_bt(void);
void log_bt(void);
void erase_log_bt(void);
//Debounce
uint8_t debounce_button(void);
uint8_t debounce_hall(void);
//Delay (us)
void u_delay(void);
void delay_us(uint8_t t);
//Load
void read_load(void);
//Others
void sel_user(void);
void wait_exercise(void);
43
void exercise(void);
void save_exercise(uint8_t s_mode);
void update_user(void);
//LCD
void lcd_wrcommand(unsigned char cmd);
void lcd_wrdata(unsigned char dat);
void lcd_wrvec(uint8_t* s);
void lcd_initmodule(unsigned char state);
void lcd_setcontraste(unsigned char v);
void lcd_clrscr(void);
void lcd_on(void);
void lcd_off(void);
void lcd_reverse(void);
void lcd_normal(void);
void lcd_newline(void);
void lcd_goto(unsigned char x, unsigned char y);
void lcd_wrchar(unsigned char c);
void lcd_wrcharvec(unsigned char* c);
void lcd_putchar(unsigned char c);
void lcd_putlogo(const unsigned char *p);
/* USER CODE END PFP */
/* USER CODE BEGIN 0 */
/* USER CODE END 0 */
int main(void)
/* USER CODE BEGIN 1 */
uint8_t z[2];
user_data.day = 0;
user_data.month = 0;
user_data.year = 0;
user_data.hour = 0;
user_data.min = 0;
user_data.qtd = 0;
user_data.load = 0;
user_data.time_spent = 0;
/* USER CODE END 1 */
/* MCU Configuration-----------------------------------------------------
-----*/
/* Reset of all peripherals, Initializes the Flash interface and the
Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
44
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_I2C1_Init();
MX_USART1_UART_Init();
MX_ADC_Init();
MX_RTC_Init();
/* USER CODE BEGIN 2 */
HAL_GPIO_WritePin(LED_1_GPIO_Port, LED_1_Pin, 1); //Vd
HAL_GPIO_WritePin(LED_2_GPIO_Port, LED_2_Pin, 1); //Vm
//Bluetooth
//init_bt();
//HAL_GPIO_WritePin(BT_RST_GPIO_Port, BT_RST_Pin, 1);
//RTC
HAL_RTC_GetDate(&hrtc, &sDate, RTC_FORMAT_BIN);
HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
//Last user
HAL_I2C_Mem_Read(&hi2c1,(U7_pg <<
1),U_mem,I2C_MEMADD_SIZE_16BIT,&user,1,1500);
HAL_Delay(i2c_delay);
update_user();
//LCD
lcd_initmodule(nao_virado);
lcd_clrscr();
HAL_Delay(100);
lcd_goto(1, 1);
sprintf(vetor,"Usuario: %02d\r\n", user);
lcd_wrcharvec(vetor);
//Memory
HAL_GPIO_WritePin(MEM_WC_GPIO_Port, MEM_WC_Pin, 0);
HAL_Delay(i2c_delay);
HAL_GPIO_WritePin(LED_2_GPIO_Port, LED_2_Pin, 0); //Vm
HAL_GPIO_WritePin(LED_1_GPIO_Port, LED_1_Pin, 0); //Vd
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
//lcd_putchar('a');
switch (state_g)
case Begin_st:
HAL_GPIO_WritePin(LED_2_GPIO_Port, LED_2_Pin, 0);
//Vm
HAL_GPIO_WritePin(LED_1_GPIO_Port, LED_1_Pin, 0);
//Vd
sel_user();
45
connect_bt();
break;
case BT_st:
HAL_GPIO_WritePin(LED_2_GPIO_Port, LED_2_Pin, 1);
//Vm
HAL_GPIO_WritePin(LED_1_GPIO_Port, LED_1_Pin, 1);
//Vd
sel_user();
check_bt();
break;
case Wait_noBT_st:
HAL_GPIO_WritePin(LED_2_GPIO_Port, LED_2_Pin, 0);
//Vm
HAL_GPIO_WritePin(LED_1_GPIO_Port, LED_1_Pin, 0);
//Vd
wait_exercise();
break;
case Wait_BT_st:
HAL_GPIO_WritePin(LED_2_GPIO_Port, LED_2_Pin, 0);
//Vm
HAL_GPIO_WritePin(LED_1_GPIO_Port, LED_1_Pin, 0);
//Vd
wait_exercise();
check_bt();
break;
case Exer_BT_st:
HAL_GPIO_WritePin(LED_2_GPIO_Port, LED_2_Pin, 1);
//Vm
HAL_GPIO_WritePin(LED_1_GPIO_Port, LED_1_Pin, 0);
//Vd
exercise();
data_bt();
break;
case Exer_noBT_st:
HAL_GPIO_WritePin(LED_2_GPIO_Port, LED_2_Pin, 1);
//Vm
HAL_GPIO_WritePin(LED_1_GPIO_Port, LED_1_Pin, 0);
//Vd
exercise();
break;
case Log_st:
HAL_GPIO_WritePin(LED_2_GPIO_Port, LED_2_Pin, 0);
//Vm
HAL_GPIO_WritePin(LED_1_GPIO_Port, LED_1_Pin, 1);
//Vd
log_bt();
while(vetor[0] != 'O' && watchdog < 25)
sprintf(vetor,"R\r\n");
HAL_UART_Transmit(&huart1,vetor,3,200);
HAL_UART_Receive(&huart1,vetor,1,200);
HAL_Delay(1);
watchdog++;
46
watchdog = 0;
vetor[0] = '1';
state_g = BT_st;
break;
case Erase_st:
HAL_GPIO_WritePin(LED_2_GPIO_Port, LED_2_Pin, 0);
//Vm
HAL_GPIO_WritePin(LED_1_GPIO_Port, LED_1_Pin, 1);
//Vd
update_user();
z[0] = 0;
z[1] = 0;
HAL_I2C_Mem_Write(&hi2c1,(u_pg <<
1),s_addr,I2C_MEMADD_SIZE_16BIT,z,2,2000);
HAL_Delay(i2c_delay);
while(vetor[0] != 'O' && watchdog < 25)
sprintf(vetor,"E\r\n");
HAL_UART_Transmit(&huart1,vetor,3,500);
HAL_UART_Receive(&huart1,vetor,1,200);
HAL_Delay(1);
watchdog++;
watchdog = 0;
vetor[0] = '1';
state_g = BT_st;
break;
default:
break;
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
/* USER CODE END 3 */
/** System Clock Configuration
*/
void SystemClock_Config(void)
RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct;
RCC_PeriphCLKInitTypeDef PeriphClkInit;
/**Initializes the CPU, AHB and APB busses clocks
*/
RCC_OscInitStruct.OscillatorType =
RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSI14
|RCC_OSCILLATORTYPE_LSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSI14State = RCC_HSI14_ON;
RCC_OscInitStruct.HSICalibrationValue = 16;
47
RCC_OscInitStruct.HSI14CalibrationValue = 16;
RCC_OscInitStruct.LSIState = RCC_LSI_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL12;
RCC_OscInitStruct.PLL.PREDIV = RCC_PREDIV_DIV1;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
_Error_Handler(__FILE__, __LINE__);
/**Initializes the CPU, AHB and APB busses clocks
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
_Error_Handler(__FILE__, __LINE__);
PeriphClkInit.PeriphClockSelection =
RCC_PERIPHCLK_USART1|RCC_PERIPHCLK_I2C1
|RCC_PERIPHCLK_RTC;
PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK1;
PeriphClkInit.I2c1ClockSelection = RCC_I2C1CLKSOURCE_HSI;
PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSI;
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
_Error_Handler(__FILE__, __LINE__);
/**Configure the Systick interrupt time
*/
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
/**Configure the Systick
*/
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
/* SysTick_IRQn interrupt configuration */
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
/* USER CODE BEGIN 4 */
//RTC
void HAL_SYSTICK_Callback(void) // interrupção do timer
static int cont=0;
if(cont<1000)
cont++;
else
cont=0;
if(sTime.Seconds<59)
sTime.Seconds++;
48
else
sTime.Seconds=0;
if(time_spent < time_max)
time_spent++;
if(sTime.Minutes<59)
sTime.Minutes++;
else
sTime.Minutes=0;
if(sTime.Hours<23)
sTime.Hours++;
else
sTime.Hours=0;
if(sDate.WeekDay<7)
sDate.WeekDay++;
else
sDate.WeekDay=0;
if(sDate.Date<31)
sDate.Date++;
else
sDate.Date=1;
if(sDate.Month<12)
sDate.Month++;
else
sDate.Month=1;
if(sDate.Year<98)
sDate.Year++;
else
sDate.Year=0;
if(sTime.Seconds == 0)
HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN);
//HAL_RTC_GetDate(&hrtc, &sDate, RTC_FORMAT_BIN);
HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
//HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
//Bluetooth
char init_bt(void)
uint8_t BT_v[50] = "";
char r = 0;
HAL_GPIO_WritePin(BT_RST_GPIO_Port, BT_RST_Pin, 1);
HAL_Delay(500);
49
//Name 'HndGrp'
sprintf(BT_v,"AT DefaultLocalName HndGrp");
HAL_UART_Transmit(&huart1,BT_v,strlen(BT_v),1000);
HAL_UART_Receive(&huart1,BT_v,strlen(BT_v),2000);
HAL_Delay(100);
HAL_GPIO_WritePin(BT_RST_GPIO_Port, BT_RST_Pin, 0);
HAL_Delay(200);
HAL_GPIO_WritePin(BT_RST_GPIO_Port, BT_RST_Pin, 1);
HAL_Delay(100);
return r;
void connect_bt(void)
uint8_t BT_v[17] = "";
uint8_t Data_v[6] = "";
HAL_UART_Receive(&huart1,BT_v,17,1000);
if(BT_v[0] == 'P')
//RTC
//.. BT_v[1:2]; //mm
//.. BT_v[4:5]; //dd
//.. BT_v[7:10]; //yyyy
//.. BT_v[12:13]; //hh
//.. BT_v[15:16]; //mm
sDate.Month = (BT_v[1]-0x30)*10 +(BT_v[2] - 0x30);
sDate.Date = (BT_v[4]-0x30)*10 +(BT_v[5] - 0x30);
sDate.Year = (BT_v[9]-0x30)*10 +(BT_v[10] - 0x30);
HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN);
//HAL_RTC_GetDate(&hrtc, &sDate, RTC_FORMAT_BIN);
sTime.Hours = (BT_v[12]-0x30)*10 +(BT_v[13] - 0x30);
sTime.Minutes = (BT_v[15]-0x30)*10 +(BT_v[16] - 0x30);
HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
//HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
HAL_Delay(10);
while(BT_v[0] != 'O' && watchdog < 50)
sprintf(Data_v,"%04d\r\n", user + sUser);
HAL_UART_Transmit(&huart1,Data_v,6,1000);
HAL_UART_Receive(&huart1,BT_v,1,200);
HAL_Delay(1);
watchdog++;
watchdog = 0;
update_user();
if(state_g == Begin_st)
state_g = BT_st;
return;
50
void check_bt(void)
uint8_t BT_v[1] = "";
HAL_UART_Receive(&huart1,BT_v,1,200);
if(BT_v[0] == 'N' && state_g == BT_st)
state_g = Begin_st;
else if(BT_v[0] == 'N' && state_g == Wait_BT_st)
state_g = Wait_noBT_st;
else if(BT_v[0] == 'R')
update_user();
state_g = Log_st;
else if(BT_v[0] == 'E')
update_user();
state_g = Erase_st;
return;
void data_bt(void)
uint8_t BT_v[1] = "";
uint8_t Data_v[6] = "";
HAL_UART_Receive(&huart1,BT_v,1,200);
if(BT_v[0] == 'N')
state_g = Exer_noBT_st;
else if(BT_v[0] == 'R')
state_g = Log_st;
else if(BT_v[0] == 'E')
state_g = Erase_st;
else if(data_valid)
while(BT_v[0] != 'O' && watchdog < 50)
HAL_Delay(1);
sprintf(Data_v,"%04d\r\n", user_data.load + sLoad);
HAL_UART_Transmit(&huart1,Data_v,6,1000);
HAL_UART_Receive(&huart1,BT_v,1,200);
sprintf(Data_v,"%04d\r\n", user_data.qtd + sHall);
HAL_UART_Transmit(&huart1,Data_v,6,1000);
HAL_UART_Receive(&huart1,BT_v,1,200);
sprintf(Data_v,"%04d\r\n", user + sUser);
HAL_UART_Transmit(&huart1,Data_v,6,1000);
HAL_UART_Receive(&huart1,BT_v,1,200);
HAL_Delay(1);
watchdog++;
watchdog = 0;
void log_bt(void)
51
uint8_t BT_v[10] = "";
uint8_t DATALOG_v[80] = "";
uint8_t dia,mes,ano,hora,minuto;
uint8_t i2c_leitura[2] = "";
uint32_t n_addr = 0;
uint32_t i = 0;
uint8_t m_read = 0;
uint8_t limit = 0;
HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN);
//HAL_RTC_GetDate(&hrtc, &sDate, RTC_FORMAT_BIN);
mes = sDate.Month;
dia = sDate.Date;
ano = sDate.Year;
HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
//HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
hora = sTime.Hours;
minuto = sTime.Minutes;
sprintf(DATALOG_v,"%03d;%02d/%02d/%02d;%02dh%02dmin;\r\n", user, dia,
mes, ano, hora, minuto);
sprintf(DATALOG_v,"%sData;Hora;Qtd;Carga[%c];Tempo[min];\r\n",
DATALOG_v, porc);
HAL_UART_Transmit(&huart1,DATALOG_v,strlen(DATALOG_v),2000);
HAL_Delay(i2c_delay);
HAL_I2C_Mem_Read(&hi2c1,(u_pg <<
1),s_addr,I2C_MEMADD_SIZE_16BIT,&i2c_leitura[0],1,2000);
HAL_Delay(i2c_delay);
HAL_I2C_Mem_Read(&hi2c1,(u_pg << 1),(s_addr +
1),I2C_MEMADD_SIZE_16BIT,&i2c_leitura[1],1,2000);
HAL_Delay(i2c_delay);
n_addr = (i2c_leitura[0]<<8) | i2c_leitura[1];
i = (s_addr + 2) & 0xFFFF;
while(i <= n_addr && limit < 20)
//Date
HAL_I2C_Mem_Read(&hi2c1,(u_pg <<
1),i++,I2C_MEMADD_SIZE_16BIT,&m_read,1,2000);
sprintf(DATALOG_v, "%02d/", m_read);
HAL_Delay(i2c_delay);
HAL_I2C_Mem_Read(&hi2c1,(u_pg <<
1),i++,I2C_MEMADD_SIZE_16BIT,&m_read,1,2000);
sprintf(DATALOG_v, "%s%02d/", DATALOG_v, m_read);
HAL_Delay(i2c_delay);
HAL_I2C_Mem_Read(&hi2c1,(u_pg <<
1),i++,I2C_MEMADD_SIZE_16BIT,&m_read,1,2000);
sprintf(DATALOG_v, "%s%02d;", DATALOG_v, m_read);
HAL_Delay(i2c_delay);
//Time
HAL_I2C_Mem_Read(&hi2c1,(u_pg <<
1),i++,I2C_MEMADD_SIZE_16BIT,&m_read,1,2000);
sprintf(DATALOG_v, "%s%02dh", DATALOG_v, m_read);
HAL_Delay(i2c_delay);
52
HAL_I2C_Mem_Read(&hi2c1,(u_pg <<
1),i++,I2C_MEMADD_SIZE_16BIT,&m_read,1,2000);
sprintf(DATALOG_v, "%s%02dmin;", DATALOG_v, m_read);
HAL_Delay(i2c_delay);
//Qtd
HAL_I2C_Mem_Read(&hi2c1,(u_pg <<
1),i++,I2C_MEMADD_SIZE_16BIT,&m_read,1,2000);
sprintf(DATALOG_v, "%s%03d;", DATALOG_v, m_read);
HAL_Delay(i2c_delay);
//Load
HAL_I2C_Mem_Read(&hi2c1,(u_pg <<
1),i++,I2C_MEMADD_SIZE_16BIT,&m_read,1,2000);
sprintf(DATALOG_v, "%s%02d;", DATALOG_v, m_read);
HAL_Delay(i2c_delay);
//Spent time
HAL_I2C_Mem_Read(&hi2c1,(u_pg <<
1),i++,I2C_MEMADD_SIZE_16BIT,&m_read,1,2000);
sprintf(DATALOG_v, "%s%03d;\r\n", DATALOG_v, m_read);
HAL_Delay(i2c_delay);
HAL_UART_Transmit(&huart1,DATALOG_v,strlen(DATALOG_v),2000);
limit++;
HAL_Delay(200);
return;
//Debounce
uint8_t debounce_button(void)
uint8_t db = 0;
while(HAL_GPIO_ReadPin(B_1_GPIO_Port,B_1_Pin))
HAL_Delay(10); //10ms
if(db < 3000)
db++;
if(db >= 100) // 1s
return 2;
else
db = 0;
if(db >= 3) // 30ms
return 1;
else
return 0;
uint8_t debounce_hall(void)
uint16_t db = 0;
uint16_t l = 0;
uint8_t i = 0;
while(!HAL_GPIO_ReadPin(HALL_GPIO_Port,HALL_Pin))
53
HAL_Delay(10); //10ms
if(db < 1000)
db++;
else
db = 0;
if(db >= 5) //50ms
HAL_Delay(25);
read_load();
return 1;
else
return 0;
//Delay (us)
void u_delay(void)
uint8_t t = 10;
while(t--);
return;
void delay_us(uint8_t t)
while(t--)
u_delay();
return;
//Load
void read_load(void)
int8_t i;
uint32_t watch_dog = 0;
load_v = 0;
HAL_GPIO_WritePin(HX_PD_SCK_GPIO_Port,HX_PD_SCK_Pin,0);
delay_us(1);
//wait falling edge from HX_DOUT pin or watchdog
while(HAL_GPIO_ReadPin(HX_DOUT_GPIO_Port,HX_DOUT_Pin))
if(++watch_dog > 200000) return;
for(i = 23; i >= 0; i--)
HAL_GPIO_WritePin(HX_PD_SCK_GPIO_Port,HX_PD_SCK_Pin,1);
delay_us(1);
HAL_GPIO_WritePin(HX_PD_SCK_GPIO_Port,HX_PD_SCK_Pin,0);
delay_us(1);
if(HAL_GPIO_ReadPin(HX_DOUT_GPIO_Port,HX_DOUT_Pin))
load_v |= (1 << i);
HAL_GPIO_WritePin(HX_PD_SCK_GPIO_Port,HX_PD_SCK_Pin,1);
delay_us(1);
54
HAL_GPIO_WritePin(HX_PD_SCK_GPIO_Port,HX_PD_SCK_Pin,0);
delay_us(1);
load_v = ((load_v / 167772) - 50)*(100/22);
if(load_v < load_min)
load_v = load_min;
else if(load_v > load_max)
load_v = load_max;
load_v = (load_v / 10)*10;
//Others
void sel_user(void)
uint8_t db = 0;
uint8_t Data_v[6];
db = debounce_button();
if(db == 1)
if(user < user_max)
user++;
else
user = 0;
if(state_g == BT_st)
while(Data_v[0] != 'O' && watchdog < 50)
sprintf(Data_v,"%04d\r\n", user + sUser);
HAL_UART_Transmit(&huart1,Data_v,6,300);
HAL_UART_Receive(&huart1,Data_v,6,200);
HAL_Delay(1);
watchdog++;
watchdog = 0;
lcd_clrscr();
lcd_goto(1, 1);
sprintf(vetor,"Usuario: %02d\r\n", user);
lcd_wrcharvec(vetor);
update_user();
else if(db == 2)
HAL_I2C_Mem_Write(&hi2c1,(U7_pg <<
1),U_mem,I2C_MEMADD_SIZE_16BIT,&user,1,1500);
HAL_Delay(i2c_delay);
update_user();
lcd_clrscr();
lcd_goto(1, 1);
sprintf(vetor,"Usuario: %02d", user);
lcd_wrcharvec(vetor);
lcd_goto(1, 2);
sprintf(vetor,"Inicar...");
lcd_wrcharvec(vetor);
55
if(state_g == Begin_st)
state_g = Wait_noBT_st;
else if(state_g == BT_st)
state_g = Wait_BT_st;
return;
void wait_exercise(void)
if(debounce_hall())
data_valid = 1;
user_data.day = sDate.Date;
user_data.month = sDate.Month;
user_data.year = sDate.Year;
user_data.hour = sTime.Hours;
user_data.min = sTime.Minutes;
user_data.time_spent = 0;
time_spent = 0;
//user_data.load = load_v;
user_data.qtd = 1;
lcd_clrscr();
lcd_goto(1, 1);
sprintf(vetor,"Usuario: %02d", user);
lcd_wrcharvec(vetor);
lcd_goto(1, 2);
sprintf(vetor,"Carga: --%c", porc);
lcd_wrcharvec(vetor);
lcd_goto(1, 3);
sprintf(vetor,"Qtd: %03d", user_data.qtd);
lcd_wrcharvec(vetor);
if(state_g == Wait_noBT_st)
state_g = Exer_noBT_st;
else if(state_g == Wait_BT_st)
data_bt();
state_g = Exer_BT_st;
user_data.load = 0;
return;
void exercise(void)
static uint8_t qtd = 1;
if(debounce_hall())
data_valid = 1;
if(user_data.load == 0 && qtd == 1)
user_data.load = load_v;
qtd++;
user_data.qtd = qtd;
save_exercise(NewLine);
56
else if(user_data.load != load_v)
user_data.time_spent = time_spent;
user_data.day = sDate.Date;
user_data.month = sDate.Month;
user_data.year = sDate.Year;
user_data.hour = sTime.Hours;
user_data.min = sTime.Minutes;
user_data.time_spent = 0;
time_spent = 0;
user_data.load = load_v;
qtd = 1;
user_data.qtd = qtd;
save_exercise(NewLine);
else
if(qtd < qtd_max)
qtd++;
user_data.load = load_v;
user_data.qtd = qtd;
lcd_clrscr();
lcd_goto(1, 1);
sprintf(vetor,"Usuario: %02d", user);
lcd_wrcharvec(vetor);
lcd_goto(1, 2);
sprintf(vetor,"Carga: %02d%c", user_data.load, porc);
lcd_wrcharvec(vetor);
lcd_goto(1, 3);
sprintf(vetor,"Qtd: %03d", user_data.qtd);
lcd_wrcharvec(vetor);
else
data_valid = 0;
if(time_spent != user_data.time_spent || debounce_button())
user_data.time_spent = time_spent;
save_exercise(UpdateLine);
return;
void save_exercise(uint8_t s_mode)
uint8_t i2c_read[2] = "";
uint32_t address = 0;
uint8_t v = 0;
HAL_GPIO_TogglePin(LED_1_GPIO_Port, LED_1_Pin);
HAL_GPIO_TogglePin(LED_2_GPIO_Port, LED_2_Pin);
//Memory UnLock
HAL_GPIO_WritePin(MEM_WC_GPIO_Port, MEM_WC_Pin, 0);
HAL_Delay(i2c_delay);
HAL_I2C_Mem_Read(&hi2c1,(u_pg <<
1),s_addr,I2C_MEMADD_SIZE_16BIT,i2c_read,2,1500);
57
HAL_Delay(i2c_delay);
address = (i2c_read[0]<<8) | i2c_read[1];
switch (s_mode)
case NewLine:
if(address == 0)
address += 2;
else
address++;
v = user_data.day;
HAL_I2C_Mem_Write(&hi2c1,(u_pg <<
1),address,I2C_MEMADD_SIZE_16BIT,&v,1,2000);
HAL_Delay(i2c_delay);
address++;
v = user_data.month;
HAL_I2C_Mem_Write(&hi2c1,(u_pg <<
1),address,I2C_MEMADD_SIZE_16BIT,&v,1,2000);
HAL_Delay(i2c_delay);
address++;
v = user_data.year;
HAL_I2C_Mem_Write(&hi2c1,(u_pg <<
1),address,I2C_MEMADD_SIZE_16BIT,&v,1,2000);
HAL_Delay(i2c_delay);
address++;
v = user_data.hour;
HAL_I2C_Mem_Write(&hi2c1,(u_pg <<
1),address,I2C_MEMADD_SIZE_16BIT,&v,1,2000);
HAL_Delay(i2c_delay);
address++;
v = user_data.min;
HAL_I2C_Mem_Write(&hi2c1,(u_pg <<
1),address,I2C_MEMADD_SIZE_16BIT,&v,1,2000);
HAL_Delay(i2c_delay);
address++;
v = user_data.qtd;
HAL_I2C_Mem_Write(&hi2c1,(u_pg <<
1),address,I2C_MEMADD_SIZE_16BIT,&v,1,2000);
HAL_Delay(i2c_delay);
address++;
v = user_data.load;
HAL_I2C_Mem_Write(&hi2c1,(u_pg <<
1),address,I2C_MEMADD_SIZE_16BIT,&v,1,2000);
HAL_Delay(i2c_delay);
address++;
v = user_data.time_spent;
HAL_I2C_Mem_Write(&hi2c1,(u_pg <<
1),address,I2C_MEMADD_SIZE_16BIT,&v,1,2000);
HAL_Delay(i2c_delay);
i2c_read[0] = address>>8;
i2c_read[1] = address & 0xFF;
HAL_I2C_Mem_Write(&hi2c1,(u_pg <<
1),s_addr,I2C_MEMADD_SIZE_16BIT,i2c_read,2,2000);
HAL_Delay(i2c_delay);
break;
case UpdateLine:
58
address -= 2;
HAL_I2C_Mem_Write(&hi2c1,(u_pg <<
1),address,I2C_MEMADD_SIZE_16BIT,&user_data.qtd,1,2000);
HAL_Delay(i2c_delay);
address++;
HAL_I2C_Mem_Write(&hi2c1,(u_pg <<
1),address,I2C_MEMADD_SIZE_16BIT,&user_data.load,1,2000);
HAL_Delay(i2c_delay);
address++;
HAL_I2C_Mem_Write(&hi2c1,(u_pg <<
1),address,I2C_MEMADD_SIZE_16BIT,&user_data.time_spent,1,2000);
HAL_Delay(i2c_delay);
break;
default:
break;
HAL_GPIO_TogglePin(LED_1_GPIO_Port, LED_1_Pin);
HAL_GPIO_TogglePin(LED_2_GPIO_Port, LED_2_Pin);
return;
void update_user(void)
if(user < 2) u_pg = U1_pg;
else if(user < 4) u_pg = U3_pg;
else if(user < 6) u_pg = U5_pg;
else u_pg = U7_pg;
s_addr = U_step * user;
return;
//LCD
// Implementa a temporização da interface SPI de 3 fios para
// envio de um comando (A0 = 0).
//
void lcd_wrcommand(unsigned char cmd)
unsigned char i;
CSX_off;
SDA_off;
SCLK_on;
SCLK_off;
for (i=0; i<8; i++)
if (cmd & mask[i]) SDA_on; else SDA_off;
SCLK_on;
SCLK_off;
CSX_on;
// Implementa a temporização da interface SPI de 3 fios para
// escrita de 8 pixeis no display (A0 = 1)
//
void lcd_wrdata(unsigned char dat)
59
unsigned char i;
CSX_off;
SDA_on;
SCLK_on;
SCLK_off;
for (i=0; i<8; i++)
if (dat & mask[i]) SDA_on; else SDA_off;
SCLK_on;
SCLK_off;
CSX_on;
void lcd_wrvec(uint8_t* s)
unsigned char i;
unsigned char k;
for (k = 0; k < strlen(s); k++)
CSX_off;
SDA_on;
SCLK_on;
SCLK_off;
for (i=0; i<8; i++)
if (s[k] & mask[i]) SDA_on; else SDA_off;
SCLK_on;
SCLK_off;
CSX_on;
void lcd_initmodule(unsigned char state)
unsigned int i;
CSX_on;
SDA_off;
SCLK_off;
RESX_off;
HAL_Delay(20);
RESX_on;
HAL_Delay(20);
lcd_wrcommand(0x24); // VOR
lcd_wrcommand(0x90); // Electronic Volume
lcd_wrcommand(0xa4); // All off
lcd_wrcommand(0x2f); // Power Boost on
lcd_wrcommand(0xb0); // Page 0
60
lcd_wrcommand(0x10); // Column 0
lcd_wrcommand(0x00);
// Zera o conteúdo da RAM
for(i=0; i<864; i++) lcd_wrdata(0x00);
if(state == virado) lcd_wrcommand(0xc8); else lcd_wrcommand(0xa1);
lcd_wrcommand(0xaf); // display on
LCD_linecount = 0;
LCD_charcount = 0;
void lcd_setcontraste(unsigned char v)
lcd_wrcommand(0xe1);
lcd_wrcommand(v);
void lcd_clrscr(void)
unsigned int i;
lcd_wrcommand(0xb0); // Page 0
lcd_wrcommand(0x10); // Column 0
lcd_wrcommand(0x00);
// Zera o conteúdo da RAM
for(i=0; i<864; i++) lcd_wrdata(0x00);
LCD_linecount = 0;
LCD_charcount = 0;
void lcd_on(void)
lcd_wrcommand(0xaf);
void lcd_off(void)
lcd_wrcommand(0xae);
void lcd_reverse(void)
lcd_wrcommand(0xa7);
void lcd_normal(void)
lcd_wrcommand(0xa6);
void lcd_newline(void)
if (++LCD_linecount == LCD_NLINE) LCD_linecount = 0;
LCD_charcount = 0;
61
lcd_wrcommand(0xb0+LCD_linecount);
lcd_wrcommand(0x10);
lcd_wrcommand(0x00);
void lcd_goto(unsigned char x, unsigned char y)
unsigned char k;
if (x > LCD_NCHAR-1) x = 0;
if (y > LCD_NLINE-1) y = 0;
LCD_charcount = x;
LCD_linecount = y;
lcd_wrcommand(0xb0+LCD_linecount);
k = LCD_charcount*6;
lcd_wrcommand(0x10+(k/16));
lcd_wrcommand(0x00+(k%16));
void lcd_wrchar(unsigned char c)
unsigned int j;
unsigned char i, v;
j = (unsigned int) c * 5;
for (i=0; i<5; i++)
v = asciitable[j];
lcd_wrdata(v);
j += 1;
lcd_wrdata(0x00);
void lcd_wrcharvec(unsigned char* c)
unsigned int j, k;
unsigned char i, v;
for(k=0; k < strlen(c); k++)
j = (unsigned int) c[k] * 5;
for (i=0; i<5; i++)
v = asciitable[j];
lcd_wrdata(v);
j += 1;
lcd_wrdata(0x00);
void lcd_putchar(unsigned char c)
switch (c)
case 13 : lcd_newline();
62
break;
case 10 : LCD_charcount = 0;
lcd_goto(LCD_charcount, LCD_linecount);
break;
default : if (LCD_charcount++ < LCD_NCHAR) lcd_wrchar(c);
else
lcd_newline();
lcd_wrchar(c);
LCD_charcount++;
void lcd_putlogo(const unsigned char *p)
unsigned int i;
for(i=0; i<864; i++) lcd_wrdata(*(p+i));
/* USER CODE END 4 */
/**
* @brief This function is executed in case of error occurrence.
* @param None
* @retval None
*/
void _Error_Handler(char * file, int line)
/* USER CODE BEGIN Error_Handler_Debug */
/* User can add his own implementation to report the HAL error return
state */
while(1)
/* USER CODE END Error_Handler_Debug */
#ifdef USE_FULL_ASSERT
/**
* @brief Reports the name of the source file and the source line number
* where the assert_param error has occurred.
* @param file: pointer to the source file name
* @param line: assert_param error line source number
* @retval None
*/
void assert_failed(uint8_t* file, uint32_t line)
/* USER CODE BEGIN 6 */
/* User can add his own implementation to report the file name and line
number,
ex: printf("Wrong parameters value: file %s on line %d\r\n", file,
line) */
/* USER CODE END 6 */
#endif
63
/**
* @
*/
/**
* @
*/
/************************ (C) COPYRIGHT STMicroelectronics *****END OF
FILE****/