Hello,
I have manually setup a clean version of Jetpack 4.5 and performed the docker install of the JetBot code. I then performed pip3 install sparkfun-qwiic, prior to realizing I should have just run the jetbot/setup.py (which I performed immediately after).
Now, I am unable to initialize an instance of the Robot() class and I think I have narrowed it down to the i2c communication. When I attempt to scan for the OLED and motor driver, I getting the following:
import qwiic
The qwiic drivers are not installed - please check your installation
import qwiic_i2c
import qwiic
qwiic.scan()
qwiic.list_devices()
but when I do a pip3 list I DO see the correct packages installed… any ideas of what I would need to do to resolve this?
sparkfun-pi-servo-hat (0.9.0)
sparkfun-qwiic (1.1.7)
sparkfun-qwiic-adxl313 (0.0.7)
sparkfun-qwiic-alphanumeric (0.0.1)
sparkfun-qwiic-as6212 (0.0.2)
sparkfun-qwiic-bme280 (0.9.0)
sparkfun-qwiic-button (2.0.1)
sparkfun-qwiic-ccs811 (0.9.4)
sparkfun-qwiic-dual-encoder-reader (0.0.2)
sparkfun-qwiic-eeprom (0.0.1)
sparkfun-qwiic-gpio (0.0.2)
sparkfun-qwiic-i2c (1.0.0)
sparkfun-qwiic-icm20948 (0.0.1)
sparkfun-qwiic-joystick (0.9.0)
sparkfun-qwiic-keypad (0.9.0)
sparkfun-qwiic-kx13x (1.0.0)
sparkfun-qwiic-large-oled (0.0.1)
sparkfun-qwiic-led-stick (0.0.1)
sparkfun-qwiic-max3010x (0.0.2)
sparkfun-qwiic-micro-oled (0.10.0)
sparkfun-qwiic-oled-base (0.0.2)
sparkfun-qwiic-oled-display (0.0.2)
sparkfun-qwiic-pca9685 (0.9.1)
sparkfun-qwiic-pir (0.0.4)
sparkfun-qwiic-proximity (0.9.0)
sparkfun-qwiic-relay (0.0.2)
sparkfun-qwiic-rfid (2.0.0)
sparkfun-qwiic-scmd (0.9.1)
sparkfun-qwiic-serlcd (0.0.1)
sparkfun-qwiic-sgp40 (0.0.4)
sparkfun-qwiic-soil-moisture-sensor (0.0.2)
sparkfun-qwiic-tca9548a (0.9.0)
sparkfun-qwiic-titan-gps (0.1.1)
sparkfun-qwiic-twist (0.9.0)
sparkfun-qwiic-vl53l1x (1.0.1)
sparkfun-top-phat-button (0.0.2)
sparkfun-ublox-gps (1.1.5)
Note that the jetson DOES see the i2c devices, per command line output:
$ i2cdetect -r -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- 3d -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- 5d -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
Also for reference, here is the error output when I try to initialize the Robot() class instance:
Note that I have the SparkFun hardware installed, but because it is not recognizing any i2c devices, I think it’s trying to setup an adafruit motor driver.
robot = Robot()
OSErrorTraceback (most recent call last)
<ipython-input-5-b418ad9f6ab3> in <module>
----> 1 robot = Robot()
/usr/local/lib/python3.6/dist-packages/jetbot-0.4.3-py3.6.egg/jetbot/robot.py in __init__(self, *args, **kwargs)
     20     def __init__(self, *args, **kwargs):
     21         super(Robot, self).__init__(*args, **kwargs)
---> 22         self.motor_driver = Adafruit_MotorHAT(i2c_bus=self.i2c_bus)
     23         self.left_motor = Motor(self.motor_driver, channel=self.left_motor_channel, alpha=self.left_motor_alpha)
     24         self.right_motor = Motor(self.motor_driver, channel=self.right_motor_channel, alpha=self.right_motor_alpha)
/usr/local/lib/python3.6/dist-packages/Adafruit_MotorHAT-1.4.0-py3.6.egg/Adafruit_MotorHAT/Adafruit_MotorHAT_Motors.py in __init__(self, addr, freq, i2c, i2c_bus)
    229         self.motors = [ Adafruit_DCMotor(self, m) for m in range(4) ]
    230         self.steppers = [ Adafruit_StepperMotor(self, 1), Adafruit_StepperMotor(self, 2) ]
--> 231         self._pwm = PWM(addr, debug=False, i2c=i2c, i2c_bus=i2c_bus)
    232         self._pwm.setPWMFreq(self._frequency)
    233 
/usr/local/lib/python3.6/dist-packages/Adafruit_MotorHAT-1.4.0-py3.6.egg/Adafruit_MotorHAT/Adafruit_PWM_Servo_Driver.py in __init__(self, address, debug, i2c, i2c_bus)
     57         self.i2c = get_i2c_device(address, i2c, i2c_bus)
     58         logger.debug("Reseting PCA9685 MODE1 (without SLEEP) and MODE2")
---> 59         self.setAllPWM(0, 0)
     60         self.i2c.write8(self.__MODE2, self.__OUTDRV)
     61         self.i2c.write8(self.__MODE1, self.__ALLCALL)
/usr/local/lib/python3.6/dist-packages/Adafruit_MotorHAT-1.4.0-py3.6.egg/Adafruit_MotorHAT/Adafruit_PWM_Servo_Driver.py in setAllPWM(self, on, off)
     93     def setAllPWM(self, on, off):
     94         "Sets a all PWM channels"
---> 95         self.i2c.write8(self.__ALL_LED_ON_L, on & 0xFF)
     96         self.i2c.write8(self.__ALL_LED_ON_H, on >> 8)
     97         self.i2c.write8(self.__ALL_LED_OFF_L, off & 0xFF)
/usr/local/lib/python3.6/dist-packages/Adafruit_GPIO-1.0.4-py3.6.egg/Adafruit_GPIO/I2C.py in write8(self, register, value)
    114         """Write an 8-bit value to the specified register."""
    115         value = value & 0xFF
--> 116         self._bus.write_byte_data(self._address, register, value)
    117         self._logger.debug("Wrote 0x%02X to register 0x%02X",
    118                      value, register)
/usr/local/lib/python3.6/dist-packages/Adafruit_PureIO-1.1.8-py3.6.egg/Adafruit_PureIO/smbus.py in write_byte_data(self, addr, cmd, val)
    320         # Send the data to the device.
    321         self._select_device(addr)
--> 322         self._device.write(data)
    323 
    324     def write_word_data(self, addr, cmd, val):
OSError: [Errno 121] Remote I/O error