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












Alguém sabe onde eu posso baixar o Flip Programer, pois eu não encontro ele no link deixado no artigo
Opa, o link atualizado para o flip programmer é https://www.microchip.com/developmenttools/ProductDetails/FLIP
Otimo trabalho, estou criando um aplicativo para tablete e sem duvida vou usar esse sistema.
Legal, com um tablet, talvez seja interessante você usar um módulo de bluetooth, ou até mesmo um ESP32 para facilitar
BOA NOITE.TENHO UM AMIGO COM ELA,GOSTARIA DE PODER AJUDAR ELE A SE COMUNICAR .VOCE TEM ALGUMA DICA DE ONDE EU POSSA ENCONTRAR UM APARELHO PARA COMPRAR.
Parabéns pelo projeto. Tenho um primo que tem E.L.A mas o estágio da doença está muito avançado. Ele mal mexe os olhos.
Nossa, que bárbaro seu projeto. Bem, trabalho numa Secretaria de Educação e nós possuímos uma escola de especiais. Vou tentar aplicar essas informações em algum projeto pra gente e ver o que rola.
Em breve você vai ver sua sementinha frutificando.
Que bom! Se precisar de ajuda para desenvolver mais soluções é só dar um toque. Abração. 🙂
Excelente iniciativa, parabéns. Precisamos pensar mais no próximo.
Que coincidência, a uma semana eu publiquei um projeto muito parecido no grupo de arduino do Facebook e teve um alcance enorme. Muita gente pediu o projeto para ajudar familiares e conhecidos, pq não divulga por lá?
Que bom, não conhecia o grupo, de noite vou dar uma olhada, 🙂 Abraços.
Que maravilhosa iniciativa estimado Ricardo Andere de Mello.
Parabéns, o Brasil mais do que nunca precisa de pessoas como você, descoladas do “Tudo EU” ou de “Levar vantagem em tudo”, e que se dediquem mais ao próximo.
3 abrçs