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.