Introdução
O pai de uma grande amiga tem ELA (Esclerose Lateral Amiotrófica) e recentemente as coisas se complicaram, com uma grande perda nos movimentos dele. Eu quis ajudar, então pesquisei maneiras de permitir que ele continuasse se comunicando com sua família.
Eu tenho algum conhecimento de eletrônica, então pensei que poderia usar alguns componentes comuns que tenho aqui em casa, e o resultado é este projeto. O projeto é aberto e se precisar de ajuda para montar é só pedir.
Software de comunicação
O software de comunicação escolhido é o mesmo utilizado por Stephen Hawking, gentilmente desenvolvido e disponibilizado como código livre pela Intel.
O nome do software é ACAT e ele pode ser baixado aqui. Além do suporte para o Português, ele possui suporte para diversas línguas, como Inglês, Francês e Espanhol.
O programa é de fato simples, há dois tipos de interação com ele:
- com uma webcam, detectando movimentos mínimos na bochecha, ou;
- com um atuador, representado pela tecla F12 no teclado.
Eu testei a detecção pela webcam e funciona bem, mas eu queria algo que ele pudesse utilizar enquanto ainda tivesse alguns movimentos, como no pé ou em outra parte do corpo. O que eu percebi na minha pesquisa é que cada pessoa possui as suas necessidades, então esteja preparado para adaptá-lo a cada situação. O software é simples e usável. As palavras e frases mais comuns são mais acessíveis, tornando tudo mais fácil.
A única configuração com que você deve se preocupar é a temporização da seleção de palavras e caracteres, para que não seja rápido demais para o paciente.
Eletrônica
Quando eu estava pesquisando e testando como fazer, testei diferentes tipos de sensores, de toque, de ângulo, etc, mas a maioria deles não era sensível o suficiente. Eu finalmente testei a ideia com um acelerômetro e funcionou muito bem.
Sensor
Eu testei três tipos de acelerômetros: o MMA8452, o MPU6050 e o ADXL377. Eu escolhi o MMA8452 porque ele é muito fácil de programar, é barato, e este projeto não precisava de um acelerômetro muito avançado.
Componentes
- Arduino UNO Rev 3;
- Acelerômetro MMA8452;
- Potenciômetro de 10k;
- Led verde;
- Resistor de 1k;
- Interruptor;
- Cabo USB;
- Caixa Plástica PB-112/2 – 36 x 85 x 124 mm.
Circuito


Programação do Arduino
O programa de Arduino que eu desenvolvi é relativamente simples. Tudo que ele faz é tentar se houve muita movimentação, utilizando a mediana dos valores medidos do acelerômetro e uma margem definida pelo potenciômetro. Quando ele detecta o movimento, envia um pressionamento de tecla F12 e espera 500 milissegundos para “debounce” (limpar espúrios).
#include "elapsedMillis.h"
#include "RunningMedian.h"
#include "Wire.h"
#include "SFE_MMA8452Q.h"
int potPin = 2;
int ledPin = 13;
int enabledPin = 12;
int tolerance = 100;
int val = 0;
bool blocked = false;
bool pressed = false;
MMA8452Q acelerometro(0x1C);
RunningMedian samplesx = RunningMedian(15);
RunningMedian samplesy = RunningMedian(15);
RunningMedian samplesz = RunningMedian(15);
elapsedMillis timeElapsed;
uint8_t buf[8] = { 0 }; /* Keyboard report buffer */
void setup()
{
pinMode(ledPin, OUTPUT);
pinMode(enabledPin, INPUT_PULLUP);
digitalWrite(ledPin, LOW);
Serial.begin(9600);
acelerometro.init();
}
void loop()
{
bool enabled = digitalRead(enabledPin);
if (enabled) {
val = analogRead(potPin); // read the value from the sensor
tolerance = val * 2;
if (acelerometro.available()) {
acelerometro.read();
samplesx.add(acelerometro.x);
samplesy.add(acelerometro.y);
samplesz.add(acelerometro.z);
if (!blocked) {
bool tmpx = (acelerometro.x > (samplesx.getAverage() + tolerance)) || (acelerometro.x < (samplesx.getAverage() - tolerance));
bool tmpy = (acelerometro.y > (samplesy.getAverage() + tolerance)) || (acelerometro.y < (samplesy.getAverage() - tolerance));
bool tmpz = (acelerometro.z > (samplesz.getAverage() + tolerance)) || (acelerometro.z < (samplesz.getAverage() - tolerance));
if (tmpx || tmpy || tmpz) {
buf[2] = 0x45; // F12
Serial.write(buf, 8); // Send keypress
digitalWrite(ledPin, HIGH);
blocked = true;
pressed = true;
timeElapsed = 0;
}
}
}
}
if (pressed && (timeElapsed > 100) ) {
buf[0] = 0;
buf[2] = 0;
Serial.write(buf, 8); // Release key
pressed = false;
}
if (blocked && (timeElapsed > 500) ) {
digitalWrite(ledPin, LOW);
blocked = false;
}
}
Bibliotecas Arduino
Foram utilizadas três bibliotecas neste projeto. Duas podem ser instaladas diretamente pela IDE e uma tem que ser instalada manualmente através de um arquivo zip:
Programação do Arduino
Esta é a única parte um pouco mais trabalhosa do projeto. Eu uso o Arduino UNO porque eu já o tinha aqui disponível, e é um dispositivo barato, mas o firmware original dele não suporta emulação HID (falar com o computador como se fosse um teclado e gerar o pressionamento da tecla F12). Por esta razão você tem que executar uma sequência específica de ações para programar o Arduino com outro firmware. Estes passos não são difíceis, mas devem ser executados em ordem.
Você precisará destes softwares:
- Arduino IDE
- Atmel’s FLIP programmer
- Firmware original do Arduino Uno -> Arduino-usbserial-uno.hex
- Firmware para habilitar o teclado -> Arduino-keyboard-0.3.hex
Sequência de programação
- Programe o software no Arduino utilizando a IDE, como você faz normalmente;
- Habilite o modo de programação de chip do Arduino (DFU) curto circuitando os dois pinos descritos na imagem abaixo;
- Execute o FLIP programmer, pressione CTRL+U e clique “Open”. Clique no ícone com o tooltip “Load Hex File” e escolha o arquivo “Arduino-keyboard-0.3.hex”. Clique no ícone com o tooltip “Program Target Device Memory”.
É isso! Desplugue o Arduino e plugue novamente que ele deve estar funcionando.
Nota: Se você tiver qualquer problema durante a programação, você pode curto-circuitar os pinos, entrar no modo DFU e restaurar o firmware original do Arduino UNO utilizando o FLIP programmer, carregando o arquivo de firmware original e atualizando-o. Não se esqueça de clicar no “open” da interface no FLIP programmer. É fácil esquecer este detalhe.
Conclusão
O resultado final é um sistema barato, com uma sensibilidade muito boa, e que eu espero que ajude muitas pessoas, com ELA ou quaisquer outras dificuldades.
Se você gostou deste projeto, pense um pouco mais sobre como você gasta o seu tempo livre, e lembre-se que não importa a sua religião, suas crenças, você muitas vezes pode ver que as boas ações sempre voltam para você de maneiras diferentes.
Se precisar de ajuda basta me contatar.
Ricardo Andere de Mello
quilombodigital@gmail.com






