Caneta Inteligente: Rastreamento de Escrita e Movimento em Tempo Real com Raspberry Pi e IMU
Introdução
Na era digital atual, capturar entrada manuscrita geralmente requer telas capacitivas ou canetas stylus. Embora precisas, essas soluções são limitadas por requisitos de superfície e carecem de verdadeira liberdade espacial. Nossa Caneta Inteligente elimina essas restrições combinando um Raspberry Pi com uma unidade de medida inercial (IMU) para rastrear movimento e reconstruir trajetórias instantaneamente. O sistema baseia-se exclusivamente no giroscópio e acelerômetro da IMU, transmitindo dados sem fio para o Pi. Algoritmos personalizados recuperam a orientação e posição do dispositivo, armazenam os dados e os renderizam em tempo real no display TFT do Pi via pygame. Um único botão inicia e para a gravação, permitindo uso flexível em canetas, robôs ou aplicações vestíveis. Esta abordagem oferece uma solução versátil e independente de superfície para captura de escrita, análise de movimento e além.
Objetivo
O objetivo central é desenvolver uma unidade de rastreamento modular que possa ser fixada a canetas, robôs ou até membros humanos. Quando o hospedeiro se move, o módulo registra sua trajetória e projeta o caminho num referencial horizontal mundial na tela. Diferente de sistemas stylus convencionais, nosso design opera independentemente de qualquer plano predefinido, permitindo rastrear movimento no ar livre ou em superfícies irregulares. O desempenho insensível à orientação do módulo garante resultados consistentes independentemente de inclinação ou posicionamento.
Calibração da IMU
Tolerâncias de fabricação frequentemente desalinham os eixos do acelerômetro e giroscópio da IMU, gerando discrepâncias nos ângulos de Euler calculados. Empregamos uma rotina de calibração de seis posições para quantificar e corrigir esses desvios. Um gabarito de calibração personalizado (Figura XX) mantém a IMU em cada orientação, registrando leituras brutas dos sensores. A matriz de calibração derivada dessas seis amostras é então aplicada a cada medição do acelerômetro:
\[\mathbf{A}_{\text{cal}} = \begin{bmatrix}A_x\\A_y\\A_z\end{bmatrix}, \quad \mathbf{a}_{\text{raw}} = \begin{bmatrix}a_x\\a_y\\a_z\end{bmatrix}\]
Após calibração, o vetor de aceleração corrigido \(\mathbf{A}_{\text{cal}}\) substitui os dados brutos para processamento subsequente.
Fusão de Sensores para Dados Brutos
Para obter uma estimativa robusta de orientação, fundimos saídas do giroscópio e acelerômetro usando matemática de quaternions. Quaternions oferecem representação de rotação sem singularidades e simplificam transformações vetoriais. A conversão entre quaternion \(q\) e ângulos de Euler \((\alpha,\beta,\gamma)\) é dada por:
\[\displaystyle q = \cos\frac{\theta}{2} + \sin\frac{\theta}{2}\bigl(\cos\alpha\,\mathbf{i} + \cos\beta\,\mathbf{j} + \cos\gamma\,\mathbf{k}\bigr)\]
Para um vetor fixo \(\mathbf{V} = V_x\mathbf{i} + V_y\mathbf{j} + V_z\mathbf{k}\), rotação por quaternion é realizada como \(\mathbf{V}' = q \circ \mathbf{V} \circ q^{-1}\).
Como o giroscópio sozinho deriva com o tempo, continuamente corrigimos seu viés comparando o vetor gravidade medido pelo acelerômetro com a estimativa de gravidade derivada do giroscópio. A rotina UpdateIMU executa 2.000 iterações enquanto o sensor está parado, construindo um laço de realimentação proporcional-integral (PI) que minimiza erro angular. O núcleo do algoritmo é mostrado abaixo:
def UpdateIMU(self, Gyr, Acc): if np.linalg.norm(Acc) == 0: warnings.warn("Magnitude do acelerômetro é zero. Atualização do algoritmo abortada.") return Acc = np.array(Acc / np.linalg.norm(Acc)) v = np.array([[2*(self.q[1]*self.q[3] - self.q[0]*self.q[2])], [2*(self.q[0]*self.q[1] + self.q[2]*self.q[3])], [self.q[0]**2 - self.q[1]**2 - self.q[2]**2 + self.q[3]**2]]) error = np.cross(v, np.transpose([Acc]), axis=0) self.IntError += error Ref = Gyr - np.transpose(self.Kp*error + self.Ki*self.IntError) pDot = 0.5 * self.quaternProd_single(self.q, [0, Ref[0,0], Ref[0,1], Ref[0,2]]) self.q += pDot * self.SamplePeriod self.q /= np.linalg.norm(self.q) self.Quaternion = self.quaternConj(self.q) Os dados do giroscópio corrigidos (Ref) alimentam a atualização do quaternion, gerando uma estimativa de orientação estável que impulsiona a reconstrução de trajetória exibida no Pi.
Leia mais: Caneta Inteligente: Projeto Final para ECE5725
Processo de manufatura
- Ideias de Projetos Baseados em Sensores para Estudantes de Engenharia do Último Ano
- Manufatura Inteligente 2021: 10 Tendências Emergentes Remodelando a Produção
- Iluminação Inteligente: A Pedra Angular de uma Cidade Verdadeiramente Conectada
- Log do Projeto FirePick Delta: Construindo uma MicroFactory Open-Source com OpenPnP
- Construa um Robô 'Vá Embora' – Kit Inicial Arduino Fácil para Crianças
- Health Band: Pulseira Inteligente para Monitoramento de Idosos com Arduino Nano e DPS310
- Principais Upgrades de Casa Inteligente para Modernizar seu Espaço
- Maximizando o ROI na Manufatura Inteligente: Payback e Sucesso Baseado em Dados
- Sensor Ultra-Fino Revolucionário Melhora Funcionalidade de Lentes de Contato Inteligentes
- Como Escolher o Projeto de Automação Certo: Um Guia Estratégico