OSError: [Errno 121] Error de E / S remotas o pigpio.error: 'Error de lectura de I2C' en MPU6050

0

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)

    
pregunta Jan sebastian

0 respuestas

Lea otras preguntas en las etiquetas