Social Icons

twitterfacebookgoogle plusemail

lunes, 19 de noviembre de 2012

Reporte de Proyecto

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:
// 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);
}
Código del preprocesamiento:
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:
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
view raw arduino_test.py hosted with ❤ by GitHub


Control de versiones

1 comentarios:

  1. Casi te quito un punto por errores en la redacción; cuida más en el futuro. Van los 10 + 20.

    ResponderEliminar