Demo entry 2936073

adquisicion_IMU.py

   

Submitted by anonymous on Nov 03, 2015 at 20:40
Language: Python. Code size: 2.7 kB.

#!/usr/bin/python 
''' 
Descripcion: inicializa la comunicaion serial con el arduino, adquiere la informacion sincronizada con una segnal para gatillar un evento y almacena los datos en un archivo de salida.
Archivos: genera una archivos.txt con el nombre especificado.
Formato de salida: ax[i],ay[i],az[i],gX[i],gX[i],gX[i],sinc[i]\n 
Sintaxis: adquisicion_IMU.py [nombre del archivo de salida]
'''
import serial
import sys
import time

nombreArchivo = sys.argv[1]+'.txt'

puerto = serial.Serial('COM3', 128000)
time.sleep(3) # tiempo para que la comunicacion serial se establezca.

# Limpieza del puerto serial antes de comenzar a adquirir
datos = ''
caracter = puerto.read(1)
while caracter != 'N':
   datos += caracter
   caracter = puerto.read(1)
   while puerto.inWaiting() == 0:
      pass
datos += caracter
caracter = puerto.read(1)
datos += caracter

if datos != 'SYNC':
   print datos
   print 'datos desincronizados'

# Lectura y decodificacion de bytes enviados por arduino.
def readInts(puerto):
   datos = []
   for i in range(10):
      datos.append(puerto.read())
   datos = map(ord, datos)
   ax = (datos[0] << 2) | (datos[1] >> 6) # datos[0] corresponde al primer byte
   ay = ((datos[1] & 0x3F) << 4) | (datos[2] >> 4) 
   az = ((datos[2] & 0x0F) << 6) | (datos[3] >> 2)
   sinc = datos[3] & 0x01 # sinc = sincronizacion de los datos del IMU con una 
                          #. segnal que puede ser ocupada para gatillar un evento, 
                          #.. en este caso la microestimulacion electrica.
   
   gx = (datos[4] << 8) | datos[5]
   gy = (datos[6] << 8) | datos[7]
   gz = (datos[8] << 8) | datos[9]

   if gx >= 32768:   # guarda lo numeros negativos con el metodo de complemento de 2
      gx -= 32768*2  # "
   if gy >= 32768:   # "
      gy -= 32768*2  # "
   if gz >= 32768:   # "
      gz -= 32768*2  # "

   return (ax, ay, az, gx, gy, gz, sinc)

# Inicializacion de variables
iteracion = True
buffer = []

# Limpieza del puerto serial antes de comenzar a adquirir
while puerto.inWaiting() != 0:
   print puerto.read()
print 'Presione ENTER para iniciar adquisicion'
raw_input()
puerto.write('b')

# Adquisicion
try:
   while iteracion:   
      t0 = time.time()
      for i in range(1500):
         (ax, ay, az, gx, gy, gz, sinc) = readInts(puerto)
         buffer.append(','.join(map(str, (ax, ay, az, gx, gy, gz, sinc))))
         if sinc == 1:
            print 'Evento gatillado'
      print 1.0/((time.time()-t0)/1500.0), 'Hz'
      
# Termino del registro con Ctrl+c      
except KeyboardInterrupt:
   salida = open(nombreArchivo, 'w')
   salida.write('\n'.join(buffer))
   salida.close()
   sys.exit()

This snippet took 0.01 seconds to highlight.

Back to the Entry List or Home.

Delete this entry (admin only).