Así que uso MPU6050 para obtener la aceleración del movimiento del riel lineal del motor paso a paso (motor paso a paso que trabaja en la rosca, uso pigpio para el motor) al hacer que el MPU6050 funcione en el enhebrado y puede mostrar datos en el gráfico gui (uso pyqt para crear GUI dan pyqtgraph para crear un gráfico) con un retardo de tiempo 0,1. El problema es que de repente recibo un mensaje de error cuando la secuencia de comandos se está ejecutando por el momento OSError: [Errno 121] Remote I/O error
cuando uso la biblioteca smbus, así que la cambio a pigpio pero obtengo un mensaje de error pigpio.error: 'I2C read failed'
mensaje de error de smbus:
Traceback (most recent call last):
File "/home/pi/Desktop/mejaGetar/ThreadAccelerator.py", line 33, in run
self.startAccelerator()
File "/home/pi/Desktop/mejaGetar/ThreadAccelerator.py", line 22, in startAccelerator
getData = ThreadAccelerator.accelerator.get_accelerator()
File "/home/pi/Desktop/mejaGetar/accel.py", line 43, in get_accelerator
x = self.read_i2c_word(self.ACCEL_XOUT0)
File "/home/pi/Desktop/mejaGetar/accel.py", line 32, in read_i2c_word
high = self.bus.read_byte_data(self.address,register)
OSError: [Errno 121] Remote I/O error
mensaje de error de pgpio:
Traceback (most recent call last):
File "/home/pi/Desktop/mejaGetar/ThreadAccelerator.py", line 33, in run
self.startAccelerator()
File "/home/pi/Desktop/mejaGetar/ThreadAccelerator.py", line 22, in startAccelerator
getData = ThreadAccelerator.accelerator.get_accelerator()
File "/home/pi/Desktop/mejaGetar/mmpu.py", line 48, in get_accelerator
z = self.read_i2c_word(self.ACCEL_ZOUT0)
File "/home/pi/Desktop/mejaGetar/mmpu.py", line 36, in read_i2c_word
low = self.pi.i2c_read_byte_data(self.h,register + 1)
File "/usr/local/lib/python3.4/dist-packages/pigpio.py", line 2792, in i2c_read_byte_data
return _u2i(_pigpio_command(self.sl, _PI_CMD_I2CRB, handle, reg))
File "/usr/local/lib/python3.4/dist-packages/pigpio.py", line 975, in _u2i
raise error(error_text(v))
pigpio.error: 'I2C read failed'
y este es mi código (usando smbus): accel.py
import smbus
class accel:
ACCEL_SCALE_MODIFIER_2G = 16384.0
GRAVITIY_CMS2 = 980.665
address = None
bus = None
#register MPU-6050
PWR_MGMT_1 = 0x6B
PWR_MGMT_2 = 0x6C
#register accelerator
ACCEL_CONFIG = 0x1C
ACCEL_XOUT0 = 0x3B
ACCEL_YOUT0 = 0x3D
ACCEL_ZOUT0 = 0x3F
CONFIG = 0x1A
INT_ENABLE = 0x38
def __init__(self,address,bus = 1):
self.address = address
self.bus = smbus.SMBus(bus)
self.bus.write_byte_data(self.address,self.PWR_MGMT_1,0x00)
self.bus.write_byte_data(self.address, self.ACCEL_CONFIG, 0x00)
def read_i2c_word(self,register):
high = self.bus.read_byte_data(self.address,register)
low = self.bus.read_byte_data(self.address,register + 1)
value = (high << 8) + low
if(value > 32768):
return -((65535 - value) + 1)
else:
return value
def get_accelerator(self):
x = self.read_i2c_word(self.ACCEL_XOUT0)
y = self.read_i2c_word(self.ACCEL_YOUT0)
z = self.read_i2c_word(self.ACCEL_ZOUT0)
scale_modifier = self.ACCEL_SCALE_MODIFIER_2G
x = x/scale_modifier
y = y/scale_modifier
z = z/scale_modifier
x = x * self.GRAVITIY_CMS2
y = y * self.GRAVITIY_CMS2
z = z * self.GRAVITIY_CMS2
return {'x': x, 'y': y, 'z': z}
implementación de subprocesos ThreadAccelerator.py
import time
import sys
from accel import accel
from PyQt4 import QtGui, QtCore
from PyQt4.QtCore import QTime, QTimer
from write import write
import datetime
class ThreadAccelerator(QtCore.QThread):
dataAccelerator = QtCore.pyqtSignal(object)
accelerator = accel()
time.sleep(1)
collectData = []
tulisRecord = write()
run = False
def __init__(self,parent=None):
QtCore.QThread.__init__(self,parent)
def startAccelerator(self):
self.accelerator.setup()
x = 0
while self.run == True:
getData = self.accelerator.get_accelerator()
self.dataAccelerator.emit({'x': getData['x'],'xx':x})
print("hasil ",abs(getData['x']))
x = x + 1
time.sleep(0.1)
def run(self):
self.startAccelerator()
def start(self):
self.run = True
super(ThreadAccelerator,self).start()
def stop(self):
self.run = False
y esta es la versión pigpio: mmpu.py
import time
import sys
import pigpio
class mmpu:
#default accell adalah 2G
ACCEL_SCALE_MODIFIER_2G = 16384.0
GRAVITIY_CMS2 = 980.665
address = 0x68
bus = None
#register MPU-6050
PWR_MGMT_1 = 0x6B
PWR_MGMT_2 = 0x6C
#register accelerator
ACCEL_CONFIG = 0x1C
ACCEL_XOUT0 = 0x3B
ACCEL_YOUT0 = 0x3D
ACCEL_ZOUT0 = 0x3F
h = None
pi=None
def __init__(self):
self.pi = pigpio.pi()
def setup(self):
self.h = self.pi.i2c_open(1, self.address)
self.pi.i2c_write_byte_data(self.h,self.PWR_MGMT_1,0x00)
self.pi.i2c_write_byte_data(self.h,self.ACCEL_CONFIG, 0x00)
time.sleep(1)
def read_i2c_word(self,register):
high = self.pi.i2c_read_byte_data(self.h,register)
low = self.pi.i2c_read_byte_data(self.h,register + 1)
value = (high << 8) + low
if(value > 32768):
return -((65535 - value) + 1)
else:
return value
def get_accelerator(self):
x = self.read_i2c_word(self.ACCEL_XOUT0)
y = self.read_i2c_word(self.ACCEL_YOUT0)
z = self.read_i2c_word(self.ACCEL_ZOUT0)
scale_modifier = self.ACCEL_SCALE_MODIFIER_2G
x = x/scale_modifier
y = y/scale_modifier
z = z/scale_modifier
x = x * self.GRAVITIY_CMS2
y = y * self.GRAVITIY_CMS2
z = z * self.GRAVITIY_CMS2
return {'x': x, 'y': y, 'z': z}
def close(self):
self.pi.i2c_close(self.h)
time.sleep(1)
implementación de subprocesos ThreadAccelerator.py
import time
import sys
from mmpu import mmpu
from PyQt4 import QtGui, QtCore
from PyQt4.QtCore import QTime, QTimer
from write import write
import datetime
class ThreadAccelerator(QtCore.QThread):
dataAccelerator = QtCore.pyqtSignal(object)
accelerator = mmpu()
time.sleep(1)
collectData = []
tulisRecord = write()
run = False
def __init__(self,parent=None):
QtCore.QThread.__init__(self,parent)
def startAccelerator(self):
self.accelerator.setup()
x = 0
while self.run == True:
getData = self.accelerator.get_accelerator()
self.dataAccelerator.emit({'x': getData['x'],'xx':x})
print("hasil ",abs(getData['x']))
x = x + 1
time.sleep(0.1)
self.accelerator.close()
def run(self):
self.startAccelerator()
def start(self):
self.run = True
super(ThreadAccelerator,self).start()
def stop(self):
self.run = False
y esta es la imagen de mi sensor conectado con la frambuesa pi (se ha conectado correctamente)
Entonces, ¿qué causa el error? ¿Eso se debe al uso excesivo de hilos (hay alrededor de 3 hilos: uno para el motor paso a paso, uno para el acelerómetro mpu6050 y el último para algunos programas)? ¿O por la mala calidad del cable? ¿O el retraso en el acelerador de enhebrado MPU6050 es demasiado rápido? Si el elay en el acelerador de enhebrado MPU6050 es demasiado rápido, ¿qué debo hacer? Lo necesito para generar rápidamente datos a grapic. Esa es toda mi pregunta, gracias. (Lo ejecuto en jessie raspbian, la biblioteca pigpio ya está actualizada)