Welcome to the Pycom forum Forum
    • \[\[global:header.categories\]\]
    • \[\[global:header.recent\]\]
    • \[\[global:header.tags\]\]
    • \[\[global:header.popular\]\]
    • Login

    Explore Pybytes | Official Documentation | Report a Firmware Bug/Issue | GitHub

    I2C Bus Error

    Scheduled Pinned Locked Moved Issues & Bugs
    5 Posts 3 Posters 39 Views 3 Watching
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • G Offline
      Guendalina Neuro
      last edited by

      Good evening,
      I'm new in pycom programming. What I have to do is to acquire data from an IMU BNO055 with my WiPy 3.0.
      Here you may find the library I'm using:

      #IMU LIBRARY
      #This is a library for the BNO055 orientation sensor
      import pycom
      import struct
      import time
      from machine import I2C
      
      
      #configure the I2C bus: use default PIN assignments (SDA = P09, SCL = P10)
      i2c = I2C(0)  # configure the I2C bus
      i2c.init(I2C.MASTER, baudrate=15000) # init as a master baudrate = freq di lettura del dato
      
      # I2C addresses
      ADDRESS_B = 0x28 #This is the alternative I2C address; 0101000b
      DEFAULT_ADDRESS = 0x29 #This is the default I2C address of the BNO055 device; 0101001b
      BNO055_ID = 0xA0
      
      #Page id register definition
      PAGE_ID_ADDR = 0x07 #Read: Number of currently selected page; Write: Change page, 0x00 or 0x01
      
      #Registrer Descriprion
      """The entire communication with the device is performed by reading from and writing to register. 
      Regoster have width of 8 bits. 
      There are several registers which are either completely or partially  marked as 'reserved'. 
      It is recommended not to use register at all which are completely marked as 'reserved'. 
      The register map is separated into two logical pages, 
      Page 1 contains sensor specific configuration data and Page 0 contais all other cofiguration 
      parameters and output data.
      """
      #PAGE 0 REGISTER DEFINITION
      CHIP_ID_ADDR = 0X00 #BNO055 CHIP ID, chip identification chip, read only fixed value 0x0A
      ACC_ID_ADDR = 0X01 #ACC CHIP ID, chip identification accelerometer device, read only fixed value oxFB
      MAG_ID_ADDR = 0x02 #MAG CHiP ID, chip id of the magnetometer device, read only fixed value 0x32
      GYR_ID_ADDR = 0x03 #GYRO CHiP ID, chip id of the gyroscope device, read only fixed value 0x0F
      SW_REV_LSB_ADDR = 0X04 #Lower byte of SW Revision ID, read only fixed value depending on SW revision programmed on microcontroller
      SW_REV_MSB_ADDR = 0X05 #Upper byte of SW Revision ID, read only fixed value depending on SW revision programmed on microcontroller
      BL_REV_ID_ADDR = 0x06 #Bootloader version, identifies the version of the bootloader in the microcontroller, read only
      
      #Acceleration Data Registers
      """In fusion mode the fusion algorithm outpt offset compensated acceleration data for each axis X/Y/Z,
      the output data can be read from the appropriate ACC_DATA_<axis>_LSB and ACC_DATA_<axis>_MSB register.
      """
      ACC_DATA_X_LSB = 0X08 #Lower byte of X axis Acceleration data, read only
      ACC_DATA_X_MSB = 0X09 #Upper byte of X axis Acceleration data, read only
      ACC_DATA_y_LSB = 0X0A #Lower byte of Y axis Acceleration data, read only
      ACC_DATA_Y_MSB = 0X0B #Upper byte of Y axis Acceleration data, read only
      ACC_DATA_Z_LSB = 0X0C #Lower byte of Z axis Acceleration data, read only
      ACC_DATA_Z_MSB = 0X0D #Upper byte of Z axis Acceleration data, read only
      
      #Magnetometer Data Registers
      """In fusion mode the fusion algorithm output offset compensated magnetic field streght data for each 
      axis X/Y/Z, the output data can be read from the appropriate MAG_DATA_<axis>_LSB 
      and MAG_DATA_<axis>_MSB register. 
      """
      MAG_DATA_X_LSB = 0X0E #Lower byte of X axis Magnetometer data, read only
      MAG_DATA_X_MSB = 0X0F #Upper byte of X axis Magnetometer data, read only
      MAG_DATA_Y_LSB = 0X10 #Lower byte of Y axis Magnetometer data, read only
      MAG_DATA_Y_MSB = 0X11 #Upper byte of Y axis Magnetometer data, read only
      MAG_DATA_Z_LSB = 0X12 #Lower byte of Z axis Magnetometer data, read only
      MAG_DATA_Z_MSB = 0X13 #Upper byte of Z axis Magnetometer data, read only
      
      #Gyro Data Registers
      """In fusion mode the fusion algorithm output offset compensated angular velocity data for each axis X/Y/Z, 
      the output data can be read from the appropriate GYR_DATA_<axis>_LSB and GYR_DATA_<axis>_MSB register.
      """
      GYR_DATA_X_LSB = 0X14 #Lower byte of X axis Gyroscope data, read only
      GYR_DATA_X_MSB = 0X15 #Upper byte of X axis Gyroscope data, read only
      GYR_DATA_Y_LSB = 0X16 #Lower byte of Y axis Gyroscope data, read only
      GYR_DATA_Y_MSB = 0X17 #Upper byte of Y axis Gyroscope data, read only
      GYR_DATA_Z_LSB = 0X18 #Lower byte of Z axis Gyroscope data, read only
      GYR_DATA_Z_MSB = 0X19 #Upper byte of Z axis Gyroscope data, read only
      
      #Orientation: orientation output only available in fusion operation modes.
      
      #Euler Angles Data Registers
      """The fusion algorithm output offset and tilt compensated orientation data in Euler angles format 
      for each DOF Heading/Roll/Pitch, the output data can be read from the appropriate EUL<dof>_LSB 
      and EUL_<dof>_MSB registers.
      """
      EUL_DATA_X_LSB = 0X1A #Lower byte of heading data, read only
      EUL_DATA_X_MSB = 0X1B #Upper byte of heading data, read only
      EUL_DATA_Y_LSB = 0X1C #Lower byte of roll data, read only
      EUL_DATA_Y_MSB = 0X1D #Upper byte of roll data, read only
      EUL_DATA_Z_LSB = 0X1E #Lower byte of pitch data, read only
      EUL_DATA_Z_MSB = 0X1F #Upper byte of pitch data, read only
      
      #Quaternion Data Registers
      """The fusion algorithm output offset and tilt compensated orientation data in Euler angles format 
      for each DOF Heading/Roll/Pitch, the output data can be read from the appropriate EUL<dof>_LSB 
      and EUL_<dof>_MSB registers.
      """
      QUA_DATA_W_LSB = 0X20 #Lower byte of w axis quaternion data, read only
      QUA_DATA_W_MSB = 0X21 #Upper byte of w axis quaternion data, read only
      QUA_DATA_X_LSB = 0X22 #Lower byte of X axis quaternion data, read only
      QUA_DATA_X_MSB = 0X23 #Upper byte of X axis quaternion data, read only
      QUA_DATA_Y_LSB = 0X24 #Lower byte of Y axis quaternion data, read only
      QUA_DATA_Y_MSB = 0X25 #Upper byte of Y axis quaternion data, read only
      QUA_DATA_Z_LSB = 0X26 #Lower byte of Z axis quaternion data, read only
      QUA_DATA_Z_MSB = 0X27 #Upper byte of Z axis quaternion data, read only
      
      #Linear Acceleration Data Registers 
      """Linear acceleration output only available in fusion operating modes. 
      The fusion algorithm output linear acceleration data for each axis x/y/z, 
      the output data can be read from the appropriate LIA_DATA_<axis>_LSB and LIA_DATA_<axis>_MSB registers.
      """
      LIA_DATA_X_LSB = 0X28 #Lower byte of X axis Linear Acceleration data, read only
      LIA_DATA_X_MSB = 0X29 #Upper byte of X axis Linear Acceleration data, read only
      LIA_DATA_Y_LSB = 0X2A #Lower byte of Y axis Linear Acceleration data, read only
      LIA_DATA_Y_MSB = 0X2B #Upper byte of Y axis Linear Acceleration data, read only
      LIA_DATA_Z_LSB = 0X2C #Lower byte of Z axis Linear Acceleration data, read only
      LIA_DATA_Z_MSB = 0X2D #Upper byte of Z axis Linear Acceleration data, read only
      
      #Gravity Vector Data Registers
      """Gravity Vector output only available in fusion operating modes. 
      The fusion algorithm output gravity vector data for each axis x/y/z, the output data
      can be read from the appropriate GRV_DATA_<axis>_LSB and GRV_DATA_<axis>_MSB registers.
      """
      GRV_DATA_X_LSB = 0X2E #Lower byte of X axis gravity vector data, read only
      GRV_DATA_X_MSB = 0X2F #Upper byte of X axis gravity vector data, read only
      GRV_DATA_Y_LSB = 0X30 #Lower byte of Y axis gravity vector data, read only
      GRV_DATA_Y_MSB = 0X31 #Upper byte of Y axis gravity vector data, read only
      GRV_DATA_Z_LSB = 0X32 #Lower byte of Z axis gravity vector data, read only
      GRV_DATA_Z_MSB = 0X33 #Upper byte of Z axis gravity vector data, read only
      
      #Temperature Data Register
      TEMP = 0x34 #Read only, data output source can be selectednby updating the TEMP_SOURCE register
      TEMP_SOURCE = 0X40 #The temperature source can be selected by writing to this register.
      TEMP_SOURCE_ACC = 0x00 #xxxxxx00b, the source is the accelerometer
      TEMP_SOURCE_GYR = 0x01 #xxxxxx01b, the source is the gyroscope
      
      #Status Registers
      CALIB_STAT = 0X35 #The register can be read to see the calibration status of the gyro, the acc and the magn
      SELFTEST_RESULT = 0X36
      INTR_STAT = 0X37
      SYS_CLK_STAT = 0X38
      SYS_STAT = 0X39
      SYS_ERR = 0X3A
      
      #Unit selection Register
      UNIT = 0x3B 
      """"The measurement units for the various data outputs can be configured by writing to the UNIT_SEL register
          -bit 0 select acceleration units, xxxxxxx0b m/s^2, xxxxxxx1b mg
          -bit 1 select angular rate units, xxxxxx0xb Dps, xxxxxx1xb RPS
          -bit 2 select euler units, xxxxx0xxb Degrees, xxxxx1xxb Radians
          -bit 3 reserved
          -bit 4 select temperature units, xxx0xxxxb Celsius, xxx1xxxx Fhahrenheit
          -bit 5-6 reserved
          -bit 7 select orentation mode. 
      The data output format can be selectedby writing to the UNIT_SEL register, this allows user to switch 
      between the orentation definition described by Windows and Android operating system.
      """
      
      #Mode Registers
      OPR_MODE = 0x3D #Register to configure the operation mode. Bits <7:4> reserved
      PWR_MODE = 0x3E #Register to configure the power modes. Bits <7:2> reserved
      SYS_TRIGGER = 0x3F 
      
      #Axis Remap Registers
      """The axis  of the device can be re-configured to the new reference axis.
          -Bit <7:3> are reserved.
          -Bit <2> remapped X axis sign.
          -Bit <1> remapped Y axis sign. 
          -Bit <0> remapped Z axis sign. 
      Value 0 = positive, value 1 = negative.
      """
      AXIS_MAP_CONFIG = 0x41 #bit<7:6> are reserved, 00b X-Axis bit<0:1>, 01b Y-Axis bit<2:3>, 10b Z-Axis bit<4:5>.
      AXIS_MAP_SIGN = 0x42 #Remapped axis signed. 
      
      #Axis Remap Values
      AXIS_DEFAULT = 0x24 #The default value is: Xaxis = X, Y axis =m Y, Z axis = Z; xx100100b 
      REMAP_X = 0x00
      REMAP_Y = 0x01
      REMAP_Z = 0x02
      REMAP_POSITIVE = 0x00
      REMAP_NEGATIVE = 0x01
      
      #Accelerometer Offset registers
      """There are 6 bytes required to configre the accelerometer offset.
      Configuration will take place only when the user writes the last byte.
      """
      ACCEL_OFFSET_X_LSB = 0X55
      ACCEL_OFFSET_X_MSB = 0X56
      ACCEL_OFFSET_Y_LSB = 0X57
      ACCEL_OFFSET_Y_MSB = 0X58
      ACCEL_OFFSET_Z_LSB = 0X59
      ACCEL_OFFSET_Z_MSB = 0X5A
      
      # Magnetometer Offset registers
      """There are 6 bytes required to configre the magnetometer offset.
      Configuration will take place only when the user writes the last byte.
      """
      MAG_OFFSET_X_LSB = 0X5B
      MAG_OFFSET_X_MSB = 0X5C
      MAG_OFFSET_Y_LSB = 0X5D
      MAG_OFFSET_Y_MSB = 0X5E
      MAG_OFFSET_Z_LSB = 0X5F
      MAG_OFFSET_Z_MSB = 0X60
      
      # Gyroscope Offset registers
      """There are 6 bytes required to configre the gyroscope offset.
      Configuration will take place only when the user writes the last byte.
      """
      GYRO_OFFSET_X_LSB = 0X61
      GYRO_OFFSET_X_MSB = 0X62
      GYRO_OFFSET_Y_LSB = 0X63
      GYRO_OFFSET_Y_MSB = 0X64
      GYRO_OFFSET_Z_LSB = 0X65
      GYRO_OFFSET_Z_MSB = 0X66
      
      # Radius registers
      """ The radius of accelerometer, magnetometer and gyroscope can be configured in the following registers.
      There are 4 bytes (2 bytes for each accelerometer and magnetometer) to configure the radius.
      Configuration will take place only when user writes to the last byte.
      """
      ACCEL_RADIUS_LSB = 0X67
      ACCEL_RADIUS_MSB = 0X68
      MAG_RADIUS_LSB = 0X69
      MAG_RADIUS_MSB = 0X6A
      
      #Operation Mode 
      #The default operation mode after power-on (or RESET) is CONFIGMODE, this mode is used to configure BNO.
      #CONFFIGMODE is the only mode in which all the writable register map entries can be changed.
      #The operating mode can be selected by writing to the OPR_MODE register.
      CONFIGMODE = 0X00 
      ACCONLY = 0X01 #Non-Fusion Mode
      MAGONLY = 0X02 #Non-Fusion Mode
      GYRONLY = 0X03 #Non-Fusion Mode
      ACCMAG = 0X04 #Non-Fusion Mode
      ACCGYRO = 0X05 #Non-Fusion Mode
      MAGGYRO = 0X06 #Non-Fusion Mode
      AMG = 0X07 #Non-Fusion Mode
      IMUPLUS = 0X08 #Fusion Mode
      COMPASS = 0X09 #Fusion Mode
      M4G = 0X0A #Fusion Mode
      NDOF_FMC_OFF = 0X0B #Fusion Mode
      NDOF = 0x0C #Operation mode that use accel, gyro and mag. Reg Value xxxx1100b. There are some different types.
      
      #Power Modes 
      #The power mode can be selected by writing to the PWR_MODE register. 
      #As default at start-up the BNO055 will run in Normal mode.
      #If no activity is detected for a configurable duration (5 seconds), the BNO055 enters the low power mode. 
      #In normal mode all sensors required fot the selected operating mode are always switched ON.
      NormalMode = 0x00 #It is the default mode. Reg Value xxxxxx00b 
      LowPowerMode = 0x01 #In this mode only accelerometer is active. Reg Value xxxxxx01b
      SuspendMode = 0x02 #THe system is paused and all the sensor and the microcontroller are put into sleep mode.
      
      #PAGE 1 REGISTER DEFINITION
      #Sensor configuration
      ACC_CONFIG = 0x08 #The accelerometer configuration can be changed by writing to the ACC_CONFIG register
      MAG_CONFIG = 0x09 #The magnetometer configuration can be changed by writing to the MAG_CONFIG register
      #The gyroscope configuration can be changed by writing to the GYR_CONFIG register
      GYR_CONFIG_0 = 0x0A #Bit <5:3> GYR-Bandwidth, bit <2:0> GYR-Range
      GYR_CONFIG_1 = 0x0B #Bit <2:0> GYR-power-mode
      
      #VALUES
      ACC_DATA = ACC_DATA_X_LSB
      MAG_DATA = MAG_DATA_X_LSB
      GYR_DATA = GYR_DATA_X_LSB 
      EUL_DATA = EUL_DATA_X_LSB
      LIA_DATA = LIA_DATA_X_LSB
      GRV_DATA = GRV_DATA_X_LSB
      QUA_DATA = QUA_DATA_W_LSB
      
      #Operation Modes
      _modes = {
          "acc" : ACCONLY,
          "magn": MAGONLY,
          "gyro": GYRONLY,
          "accmag": ACCMAG,
          "accgyro": ACCGYRO,
          "maggyro": MAGGYRO,
          "amg": AMG,
          "imu": IMUPLUS,
          "comp": COMPASS,
          "m4g": M4G,
          "ndof_off": NDOF_FMC_OFF,
          "ndof": NDOF
      }
      
      #Power Modes
      _power ={
          "normal" : NormalMode,
          "low" : LowPowerMode,
          "suspend" : SuspendMode
      }
      
      def set_configmode():
          #make sure we are on page 0
          i2c.writeto_mem(DEFAULT_ADDRESS, PAGE_ID_ADDR, 0)
          #Enter config mode
          i2c.writeto_mem(DEFAULT_ADDRESS, OPR_MODE, CONFIGMODE)
          time.sleep(0.03) #Delay for 30 milliseconds
      
      #Enter operation mode with ' '
      def set_mode(mode):
          if mode not in _modes:
              raise ValueError
          set_configmode()
          time.sleep(0.03) #Delay for 30 milliseconds
          i2c.writeto_mem(DEFAULT_ADDRESS, OPR_MODE, _modes[mode])
          time.sleep(0.02) #Delay for 20 milliseconds
      
      #configure different power mode
      def set_power(power):
          if power not in _power:
              raise ValueError
          i2c.writeto_mem(DEFAULT_ADDRESS, OPR_MODE, CONFIGMODE)
          time.sleep(0.03) #Delay for 30 milliseconds
          i2c.writeto_mem(DEFAULT_ADDRESS, PWR_MODE, _power[power])
      
      #configure default units
      def set_units():
          i2c.writeto_mem(DEFAULT_ADDRESS, UNIT, 0)
      
      def set_acc():
          i2c.writeto_mem(DEFAULT_ADDRESS, PAGE_ID_ADDR, 0x01)
          i2c.writeto_mem(DEFAULT_ADDRESS, OPR_MODE, ACC_CONFIG)
          time.sleep(0.03)
          i2c.writeto_mem(DEFAULT_ADDRESS, ACCEL_OFFSET_X_LSB, 0x00)
      #Read Vector
      def read_vector(address, count=3):
          # Read count number of 16-bit signed values starting from the provided
          # address. Returns a tuple of the values that were read.
          data = i2c.readfrom_mem(DEFAULT_ADDRESS, address, count*2)
          result = [0]*count
          for i in range(count):
              result[i] = ((data[i*2+1] << 8) | data[i*2]) & 0xFFFF
              if result[i] > 32767:
                  result[i] -=65536
          return result
      
      def read_vector_int(adress, count=3):
          data = i2c.readfrom_mem(DEFAULT_ADDRESS, address, count*2)
          # result = [0]*count
          # for i in range(count):
          #     result[i] = ((data[i*2+1] << 8) | data[i*2]) & 0xFFFF
          return data
          
      
      def get_calibration():
          """Return the sensor's calibration data and return it as an array of
          22 bytes. Can be saved and then reloaded with the set_calibration function
          to quickly calibrate from a previously calculated set of calibration data.
          """
          # Switch to configuration mode
          set_configmode()
          # Read the 22 bytes of calibration data and convert it to a list (from
          # a bytearray) so it's more easily serialized should the caller want to
          # store it.
          cal_data = list(i2c.readfrom_mem(DEFAULT_ADDRESS, ACCEL_OFFSET_X_LSB, 22))
          # Go back to normal operation mode.
          set_mode('ndof') # CAMBIARE MODALITà
          return cal_data
         
      def set_calibration(data):
          """Set the sensor's calibration data using a list of 22 bytes that
          represent the sensor offsets and calibration data.  This data should be
          a value that was previously retrieved with get_calibration (and then
          perhaps persisted to disk or other location until needed again).
          """
          # Check that 22 bytes were passed in with calibration data.
          if data is None or len(data) != 22:
              raise ValueError('Expected a list of 22 bytes for calibration data.')
          # Switch to configuration mode, as mentioned in section 3.10.4 of datasheet.
          set_configmode()
          # Set the 22 bytes of calibration data.
          i2c.writeto_mem(DEFAULT_ADDRESS, ACCEL_OFFSET_X_LSB, data)
          # Go back to normal operation mode.
          set_mode('ndof') 
      
      #Read accelerometer
      def get_accelerometer():
          #Return the current accelerometer reading as a tuple of X, Y, Z values in maters/second^2
          #print("funzione get accelerometer")
          x, y, z = read_vector(ACC_DATA)
          return (x/100.0, y/100.0,z/100.0)
      
      #Read magnetometer
      def get_magnetometer():
          #Return the current magnetometer reading as a tuple of X, Y, Z values in micro-Tesla
          x, y, z = read_vector(MAG_DATA)
          return (x/16.0, y/16.0, z/16.0)
      
      #Read gyroscope
      def get_gyroscope():
          #Return the current gyroscope (angular velocity) reading as a tuple of X, Y, Z values in degrees per second
          print("funzione get gyroscope")
          x, y, z = read_vector(GYR_DATA)
          return (x/900.0, y/900.0, z/900.0)
      
      #Read euler
      def get_euler():
          #Return the current absolute orientation as a tuple of heading, roll, and pitch euler angles in degrees
          #print("funzione get euler")
          heading, roll, pitch = read_vector(EUL_DATA)
          return (heading/16.0, roll/16.0, pitch/16.0)
      
      def get_euler_int():
          data = i2c.readfrom_mem(DEFAULT_ADDRESS, EUL_DATA, 3*2)
          return data
      #Read linear acceleration
      def get_linear_acceleration():
          #Return the current linear acceleration (acceleration from movement, not from gravity) 
          #reading as a tuple of X, Y, Z values in meters/second^2
          print("funzione get linear acceleration")
          x, y, z = read_vector(LIA_DATA)
          return (x/100.0, y/100.0, z/100.0)
      
      #Read gravity
      def get_gravity():
          #Return the current gravity acceleration reading as a tuple of X, Y, Z values in meters/second^2
          print("funzione get gravity")
          x, y, z = read_vector(GRV_DATA)
          return (x/100.0, y/100.0, z/100.0)
      
      #Read quaternion
      def get_quaternion():
          #Return the current orientation as a tuple of X, Y, Z, W quaternion values
          print("funzione get quaternion")
          w, x, y, z = read_vector(QUA_DATA, 4)
          # Scale values
          scale = (1.0 / (1<<14))
          return (x*scale, y*scale, z*scale, w*scale)
      
      #Read temperature
      def get_temperature():
          #Retrieves the current temperature in Celtius.
          print("funzione get temperature")
          temp = i2c.readfrom_mem(DEFAULT_ADDRESS, TEMP, 1)[0]
          if temp > 127:
              return temp - 256
          else:
              return temp
      
      

      And here you may find the code I'm running:

      import machine
      import pycom
      from machine import Timer
      from machine import idle
      import time
      #import lib_imu
      import lib_imu2
      from machine import I2C
      from math import sqrt
      from machine import PWM
      from machine import SD
      import gc
      import os
      #sd = SD()
      # os.chdir('/sd')
      from machine import idle
      #
      # add the other imports here that you need
      
      #
      # acquire  values. The paramters of the constructor are:
      #
      
      
      class Acquire:
          def __init__(self, filename_imu1, period=0.02, runtime=60):
              self.fileIMU1 = open(filename_imu1, "w")
              self.temp = Timer.Chrono()
              self.busy = True
              self.runtime = runtime
              self.temp.start()
              self.alarm = Timer.Alarm(self.sample_and_write, period, periodic=True)
              # and add all other init tasks you need
      
          def stop(self):
              self.alarm.cancel()
              self.fileIMU1.close()
      
          def sample_and_write(self, alarm):
              passed = self.temp.read()
              # check, if done, if the time for sampling is expired, then stop
              if passed >= self.runtime:
                  self.stop()
                  self.busy = False
                  print('end')
              else:
                  # get data and write
                  #acc =  lib_imu.get_accelerometer()
                  #eul = lib_imu.get_euler()
                  #acc2 =  lib_imu2.get_accelerometer()
                  eul2 = lib_imu2.get_euler()
                  self.fileIMU1.write(repr(passed) + repr(eul2) + "\n")
                  # Esercizi Romberg Imu 1- 0x29 - l5 - accelerometro
      
                  # and what else you have to do.
      
      # now here the skeleton main_
      #
      #sd = SD()
      # os.chdir('/sd')
      
      
      # set up the hardware
      # Scala Berg: imu L5 - lib_imu - acc
      # lib_imu.set_acc()
      # time.sleep(0.01)
      # lib_imu.set_configmode()
      # time.sleep(0.01)
      # lib_imu.set_units()
      # time.sleep(0.01)
      # lib_imu.set_mode('ndof')
      # time.sleep(0.01)
      # scala Romberg
      time.sleep(1)
      lib_imu2.set_acc()
      time.sleep(0.01)
      lib_imu2.set_configmode()
      time.sleep(0.01)
      lib_imu2.set_units()
      time.sleep(0.01)
      lib_imu2.set_mode('ndof')
      time.sleep(0.01)
      print('start')
      acquire = Acquire('eulonly.txt', 0.015, 30)
      # dati_Tandem.txt 30 s
      # dati_LegUp.txt 10 s
      
      #
      # now get the data, until it's done
      #
      while acquire.busy:
          idle()
      #
      # whatever you have to do for cleanup, do it here
      #
      

      The error I'm obtaining is the following one:

      ♦Traceback (most recent call last):
        File "<stdin>", line 76, in <module>
        File "lib_imu2.py", line 303, in set_acc
      OSError: I2C bus error
      

      The IMU I'm using has a pullup resistor. Can someone help me?

      1 Reply Last reply Reply Quote 0
      • L Offline
        livius
        last edited by

        @Guendalina-Neuro

        did you connected i2c to SDA = P09, SCL = P10?

        PS. i really hate library written in this way ;-)
        It should be class with methods and propertie, and i2c should be as parameter, only when ommited it should use defaults...

        think about people first, then computers

        G 1 Reply Last reply Reply Quote 0
        • G Offline
          Guendalina Neuro @livius
          last edited by

          @livius yes, they are connected correctly. Do you have other suggestions?

          robert-hhR 1 Reply Last reply Reply Quote 0
          • robert-hhR Offline
            robert-hh @Guendalina Neuro
            last edited by

            @Guendalina-Neuro As @livius said, it's usually a connection problem:

            so:

            • wires: GND -> GND, Vcc->3V3, SDA -> P9, SCL to P10.
            • Pull-Up: Check that the BN055 board has pull-up resistors.
            • I2C Address. The default of the lib is 0x29 or 41 decimal. But it may be different.

            You can check that by connecting the BNO055 and run:

            from machine import I2C
            i2c=I2C(0)
            i2c.scan()
            

            That should return a list with the detected I2C devices on the bus. The numbers are decimal, so you might see 41 or 40. If you get an empty list, then there is a communication problem. Then start over checking the wiring.

            G 1 Reply Last reply Reply Quote 0
            • G Offline
              Guendalina Neuro @robert-hh
              last edited by

              @robert-hh I'm sorry for the delayed response. The error was due to the fact I was using a 3.0 WiPy version, by changing it to the previous (2.0) it works!!
              Thank you for the support!

              1 Reply Last reply Reply Quote 0

              Hello! It looks like you're interested in this conversation, but you don't have an account yet.

              Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.

              With your input, this post could be even better 💗

              Register Login
              • 1 / 1
              • First post
                Last post

              Pycom on Twitter

              Pycom