Exoesqueleto de uma mão controlado por Eletromiograma (EMG)

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
    • exomao

Infraestrutura

Desenvolvimento – Parte 1 (Hardware)

esquemaexomotortemperaturaleds

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.

appppppp

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s