O objetivo deste tutorial é mostrar como pode ser feito um sistema para controle de um exoesqueleto de mão direita, através de sensores musculares para auxiliar pessoas com dificuldade motora do membro, além de realizar o sensoriamento de temperatura de um objeto tocado e por fim enviar os dados para a nuvem, onde tais informações podem ser acessadas por meio de qualquer dispositivo móvel que possua um sistema operacional Android.
Funcionalidades
- Movimentar servomotores para executar movimento de abrir e fechar a mão
- Alerta luminoso para temperatura
- Comunicação com o servidor para enviar informações do desenvolvimento do paciente e gerar gráfico de acompanhamento
Tecnologia Utilizada
- Hardware
- Arduino
- Servomotores
- LEDs
- Sensor de Temperatura (LM35)
- Sensor Muscular – Myo
- Software
- Conta no ThingSpeak
- App Mobile ThingSpeak para acompanhamento
- Interface de comunicação Serial
- Software Eletromiograma
- Exoesqueleto
- Exoesqueleto (mão) desenvolvido em impressora 3D

Infraestrutura
Desenvolvimento – Parte 1 (Hardware)

Podemos observar na figura acima o esquema do hardware projetado. O hardware foi desenvolvido utilizando o Arduino como plataforma de prototipação. Foram utilizados quatro servomotores para fazer com que o exoesqueleto execute os movimentos de abrir e fechar os dedos. Os servos motores possuem três pinos, sendo um ligado ao VCC, um ligado ao GND e o último ligado a uma saída digital PWM do Arduino.
Utilizamos o sensor de temperatura LM35 para verificar a temperatura do objeto tocado pelo exoesqueleto. Esse sensor é ligado no arduino através de três pinos, sendo um VCC e um GND e o terceiro é ligado a uma porta analógica. Por fim, o feedback da temperatura é feito por meio de três leds (verde, amarelo e vermelho). Esses leds tem seus lados positivos ligados cada um em uma porta digital do Arduino e os lados negativos ligados a um transistor de 1k, que por sua vez é ligado ao GND do Arduino.
Podemos ver logo abaixo o exemplo do código que lê a temperatura por meio do sensor e dá ao usuário o feedback acendendo os LEDs.
temperatura = (float(analogRead(LM35))*5/(1023))/0.01;
Serial.println(temperatura);
delay(1000);
digitalWrite(VERDE,LOW);
digitalWrite(AMARELO,LOW);
digitalWrite(VERMELHO,LOW);
if(temperatura <29){
digitalWrite(VERDE,HIGH);
}else if(temperatura <30){
digitalWrite(AMARELO,HIGH);
}else{
digitalWrite(VERMELHO,HIGH);
}
Desenvolvimento – Parte 2 (Software)
Para a aquisição dos sinais da atividade muscular através da detecção de seu potencial elétrico, utilizamos o equipamento chamado Myo Gesture Control Armband, ele dispõe de 8 eletrodos que captam os sinais elétricos musculares simultaneamente, porém para realização deste projeto, utilizaremos os sinais captados apenas de um eletrodo por vez. O SDK disponibilizado pelo fabricante permite captar os sinais de cada sensor com um código Java utilizando a IDE Eclipse.
Segue um exemplo de código abaixo, já disponibilizado pelo fabricante, que mostra como é feita a aquisição dos dados do Myo com código Java:
package com.thalmic.myo.example;
import com.thalmic.myo.DeviceListener;
import com.thalmic.myo.Hub;
import com.thalmic.myo.Myo;
import com.thalmic.myo.enums.StreamEmgType;
public class EmgDataSample {
public static void main(String[] args) {
try {
Hub hub = new Hub("com.example.emg-data-sample");
System.out.println("Attempting to find a Myo...");
Myo myo = hub.waitForMyo(10000);
if (myo == null) {
throw new RuntimeException("Unable to find a Myo!");
}
System.out.println("Connected to a Myo armband!");
myo.setStreamEmg(StreamEmgType.STREAM_EMG_ENABLED);
DeviceListener dataCollector = new EmgDataCollector();
hub.addListener(dataCollector);
while (true) {
hub.run(1000 / 20);
System.out.println(dataCollector.toString());
}
} catch (Exception e) {
System.err.println("Error: ");
e.printStackTrace();
System.exit(1);
}
}
}
Foi utilizada a biblioteca RXTX do JAVA para realizar a comunicação serial entre o sistema e o Arduino. É por meio dessa comunicação que o sistema envia comandos para abrir e fechar a mão e recebe a informação da temperatura lida pelo sensor LM35 acoplado ao Arduino.
Abaixo temos um exemplo do código utilizando a biblioteca citada.
package com.neurobots.controller;
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.util.Observable;
public class ArduinoDAO extends Observable implements SerialPortEventListener {
private OutputStream serialOut;
private String portaCOM;
private int taxa;
private BufferedReader input;
private SerialPort serialPort;
private String inputLine;
public ArduinoDAO(String portaCOM, int taxa) {
this.portaCOM = portaCOM;
this.taxa = taxa;
this.initialize();
}
//INICIALIZANDO COMUNICAÇÃO COM O ARDUINO
public void initialize() {
try {
CommPortIdentifier portaId = null;
try {
portaId = CommPortIdentifier.getPortIdentifier(portaCOM);
} catch (Exception e) {
e.printStackTrace();
}
serialPort = (SerialPort) portaId.open("Comunicação", taxa);
serialPort.setSerialPortParams(this.taxa, SerialPort.DATABITS_8, SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE);
input = new BufferedReader(new InputStreamReader(serialPort.getInputStream()));
serialOut = serialPort.getOutputStream();
serialPort.addEventListener(this);
serialPort.notifyOnDataAvailable(true);
} catch (Exception e) {
e.printStackTrace();
}
}
//FECHAR COMUNICAÇÃO COM O ARDUINO
public void close() {
try {
serialPort.removeEventListener();
serialPort.close();
} catch (Exception e) {
e.printStackTrace();
}
}
//ENVIAR DADOS PARA O ARDUINO
public void enviarDados(Byte opcao) {
try {
serialOut.write(opcao);
serialOut.flush();
serialOut.close();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void serialEvent(SerialPortEvent oEvent) {
if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
try {
inputLine = input.readLine();
} catch (Exception e) {
//e.printStackTrace();
}
}
}
public String getInputLine() {
return inputLine;
}
public void setInputLine(String inputLine) {
this.inputLine = inputLine;
}
}
Desenvolvimento – Parte 3 (Telemetria)
Utilizaremos a ferramenta ThinkSpeak para trabalhar com as informações na nuvem. Deve-se cadastrar uma conta no ThingSpeak e criar um novo canal. Esse canal servirá para receber as informações do sistema e disponibilizar gráficos de acompanhamento. Além do nome e da descrição do canal, insira os campos: Acompanhamento e Temperatura. Esses campos serão alimentados com base nas informações repassadas pelo sistema.
Vemos abaixo um exemplo de código em JAVA que envia as informações para o ThinkSpeak.
package com.neurobots.controller;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class HttpURLConnectionExample {
private final String USER_AGENT = "Mozilla/5.0";
// HTTP GET request
public void enviar_para_nuvem_quantExecucao(int valor) throws Exception {
String url = "https://api.thingspeak.com/update?api_key=WNBJ2XX6AJ7I2TWZ&field1="+valor;
URL obj = new URL(url);
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
// optional default is GET
con.setRequestMethod("GET");
//add request header
con.setRequestProperty("User-Agent", USER_AGENT);
int responseCode = con.getResponseCode();
System.out.println("\nSending 'GET' request to URL : " + url);
System.out.println("Response Code : " + responseCode);
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
//print result
System.out.println(response.toString());
}
public void enviar_para_nuvem_temperatura(double valor) throws Exception {
String url = "https://api.thingspeak.com/update?api_key=WNBJ2XX6AJ7I2TWZ&field2="+valor;
URL obj = new URL(url);
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
// optional default is GET
con.setRequestMethod("GET");
//add request header
con.setRequestProperty("User-Agent", USER_AGENT);
int responseCode = con.getResponseCode();
System.out.println("\nSending 'GET' request to URL : " + url);
System.out.println("Response Code : " + responseCode);
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
//print result
System.out.println(response.toString());
}
}
É disponibilizado gratuitamente o aplicativo ThingView onde podemos cadastrar canais do ThinkSpeak e observar os gráficos gerados.


Bom dia tudo, parabéns pelo projeto!
Você ainda teria o desenho da impressora 3d da sua prótese?
CurtirCurtir