Introducción
Para el reporte de la entrega final de proyecto explicaré denuevo de que trata mi proyecto, la idea del proyecto fue hacer una red neuronal que por medio de unos electrodos en el antebrazo de una persona determine los movimientos que quiere realizar en el brazo, esto se puede por medio de frecuencias que manda el cerebro hacia el brazo, y lo que se busca es interceptar esas frecuencias en el antebrazo para poder controlar un brazo robótico.
Al final se optó por usar un EEG debido a problemas con la Aduana al creer que los eléctrodos del sensor de músculo se podían tomar.
Donde podemos ver en la imagen de lado derecho separado por comas lo siguiente: "Intensidad de señal, atención, meditación, delta, theta, low alpha, high alpha, low beta, high beta, low gamma, high gamma".
Componentes
Los componentes que se usaron en el proyecto son los siguientes:
Arduino
EEG
Brazo robótico
MotorShield
¿ Cómo funciona?
Primero se toman las entradas del EEG para que luego sean preprocesadas, en el preprocesamiento se limpian los valores que nos importan donde mala intensidad de señal se ignora.
Al final obtenemos los valores que nos importan que son 10 entradas ignorando la intesidad de señal del EEG, estos valores irán dentro de una lista que entrarán a nuestra red neuronal la cual nos devolverá una salida binaria (1 ó 0) donde 1 hará que el brazo se mueva hacía la derecha y 0 que el brazo se mueva hacía la izquierda, esto ocurre gracias a que se establece una comunicación por medio del puerto serial y cuando se establece la comunicación este podrá recibir los valores antes mencionados, según los datos procesados.
Movimiento del brazo
El motor DC del brazo a controlar se mueve de 0 a 180 grados y de 180 a 0 grados osea derecha o izquierda. Para tomar el valor de la posición del brazo se utilizaron potenciómetros que fueron colocados a lado del motor DC para que nos digan por medio de ellos en que posición se encuentran.
Código del arduino:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Se usa para almacenar el valor tomado en el puerto serial | |
char val; | |
//Puerto analogico que obtendra la posicion del potenciometro | |
int potPin = 1; | |
//SALIDAS para motores DC E1,E2, M1 y M2 | |
int E1 = 10; | |
int M1 = 12; | |
int E2 = 11; | |
int M2 = 13; | |
//Se almacena el valor del potenciometro | |
int potLectura = 0; | |
void setup() | |
{ | |
//Se configuran como salidas los puertos que dan corriente a los motores DC | |
pinMode(M1, OUTPUT); | |
pinMode(M2, OUTPUT); | |
pinMode(E1, OUTPUT); | |
pinMode(E2, OUTPUT); | |
// Comenzar comunicacion serial en 115200bps | |
Serial.begin(115200); | |
} | |
void loop() { | |
//Almacena el valor del potenciometro del puerto A1 | |
potLectura = analogRead(potPin); | |
//Imprime en el puerto serial el valor del potenciometro | |
Serial.println(potLectura); | |
//Almacena el valor que recibe en el puerto serial | |
val = Serial.read(); | |
//Imprime el valor que recibe en el puerto serial | |
Serial.println(val); | |
// Si se recibe 1 hara un giro a la derecha | |
if(val == '1'){ | |
//bandera que sirve para identificar | |
Serial.println("entre der"); | |
//Se coloca un umbral para no mover el brazo mas de lo debido para no lastimarlo | |
if(potLectura >= 600){ | |
//Motores van de 0 a 180 grados | |
digitalWrite(M1,HIGH); | |
digitalWrite(M2,HIGH); | |
digitalWrite(E1, HIGH); | |
digitalWrite(E2, HIGH); | |
//Bandera para saber que entro | |
Serial.println("Derecha"); | |
//Una espera de 2 segundos | |
delay(2000); | |
//Detiene motores | |
digitalWrite(M1,LOW); | |
digitalWrite(M2,LOW); | |
digitalWrite(E1, LOW); | |
digitalWrite(E2, LOW); | |
//Bandera para saber que esta apagado | |
Serial.println("Apagado"); | |
} | |
} | |
// Si se recibe 0 hara un giro a la izquierda | |
if(val == '0'){ | |
//Bandera que sirve para identificar | |
Serial.println("entre izq"); | |
//Se coloca un umbral para no mover el brazo mas de lo debido para no lastimarlo | |
if(potLectura <= 1000){ | |
//Motores van de 180 a 0 grados | |
digitalWrite(M1,LOW); | |
digitalWrite(M2,LOW); | |
digitalWrite(E1, HIGH); | |
digitalWrite(E2, HIGH); | |
//Imprime bandera | |
Serial.println("Izquierda"); | |
//Una espera de 2 segundos | |
delay(2000); | |
//Detiene motores | |
digitalWrite(M1,LOW); | |
digitalWrite(M2,LOW); | |
digitalWrite(E1, LOW); | |
digitalWrite(E2, LOW); | |
//Bandera para saber que esta apagado | |
Serial.println("Apagado"); | |
} | |
} | |
//Espera medio segundo | |
delay(500); | |
} | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from sys import argv | |
def preprocesamiento(archivo): | |
file = open(archivo,'r') | |
datos = list() | |
a = list() | |
fileLines = file.readlines() | |
file.close() | |
for i in fileLines: | |
i = i.strip() | |
a = i.split(',') | |
datos.append(a) | |
#print datos | |
newFile = open('%s.prc' % archivo ,'w') | |
bandera = True | |
goodData = list() | |
for d in datos: | |
for n in xrange(len(datos[0])): | |
#print d[n] | |
if int(d[0]) >= 100: | |
# print "Mori" | |
bandera = False | |
break | |
bandera = True | |
if bandera: | |
goodData.append(d) | |
data = '' | |
for l in goodData: | |
for n in xrange(len(datos[0])): | |
if n == 0: | |
continue | |
data+= '%s ' %l[n] | |
print >>newFile, data | |
data = '' | |
newFile.close() | |
return | |
def generatesEntries(archivo): | |
file = open(archivo,'r') | |
lista = list() | |
fileLines = file.readlines() | |
file.close() | |
for i in fileLines: | |
i = i.strip() | |
lista = i | |
print lista | |
def main(): | |
archivo = argv[1] | |
print "Preprocesando ..." | |
preprocesamiento(archivo) | |
print "Preprocesamiento listo ..." | |
print "Generando entradas" | |
generatesEntries('%s.prc'%archivo) | |
print "Entradas generadas..." | |
main() |
Código de prueba de comunicación con arduino:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import serial,time,csv | |
ser = serial.Serial('/dev/tty.usbmodem12341',9600) | |
while(True): | |
for row in csv.reader(iter(ser.readline, None)): | |
#print row[5],row[3] | |
print row | |
Control de versiones
Casi te quito un punto por errores en la redacción; cuida más en el futuro. Van los 10 + 20.
ResponderEliminar