Jetson nano python3.6操控pca9685出现From adafruit_servokit_ import ServoKit问题解决办法

博客介绍了特定程序运行的操作步骤。先进行路径替换,用指定路径替换原路径,之后按课程继续操作。接着执行一系列程序安装命令,安装多个相关库,完成后程序即可运行成功。

首先路径是有变化用如下路径替换cp /lib/udev/rules.d/60-jetson-gpio-common.rules /etc/udev/rules.d/99-gpio.rules之后根据课程的往下操作

然后执行以下程序

sudo pip3 install -U \ adafruit-circuitpython-busdevice==5.1.2 \ adafruit-circuitpython-motor==3.3.5 \ adafruit-circuitpython-pca9685==3.4.1 \ adafruit-circuitpython-register==1.9.8 \ adafruit-circuitpython-servokit==1.3.8 \ Adafruit-Blinka==6.11.1 \ Adafruit-GPIO==1.0.3 \ Adafruit-MotorHAT==1.4.0 \ Adafruit-PlatformDetect==3.19.6 \ Adafruit-PureIO==1.1.9 \ Adafruit-SSD1306==1.6.2

即可运行成功

WARNING: Carrier board is not from a Jetson Developer Kit. WARNNIG: Jetson.GPIO library has not been verified with this carrier board, WARNING: and in fact is unlikely to work correctly. Traceback (most recent call last): File "/usr/local/lib/python3.6/dist-packages/adafruit_bus_device/i2c_device.py", line 172, in __probe_for_device self.i2c.writeto(self.device_address, b"") File "/usr/local/lib/python3.6/dist-packages/busio.py", line 116, in writeto return self._i2c.writeto(address, buffer, stop=stop) File "/usr/local/lib/python3.6/dist-packages/adafruit_blinka/microcontroller/generic_linux/i2c.py", line 49, in writeto self._i2c_bus.write_bytes(address, buffer[start:end]) File "/usr/local/lib/python3.6/dist-packages/Adafruit_PureIO/smbus.py", line 308, in write_bytes self._device.write(buf) OSError: [Errno 121] Remote I/O error During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/usr/local/lib/python3.6/dist-packages/adafruit_bus_device/i2c_device.py", line 178, in __probe_for_device self.i2c.readfrom_into(self.device_address, result) File "/usr/local/lib/python3.6/dist-packages/busio.py", line 106, in readfrom_into return self._i2c.readfrom_into(address, buffer, stop=stop) File "/usr/local/lib/python3.6/dist-packages/adafruit_blinka/microcontroller/generic_linux/i2c.py", line 56, in readfrom_into readin = self._i2c_bus.read_bytes(address, end - start) File "/usr/local/lib/python3.6/dist-packages/Adafruit_PureIO/smbus.py", line 179, in read_bytes return self._device.read(number) OSError: [Errno 121] Remote I/O error During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/home/nvidia/cgai_ws/src/mission/scripts/duoji_test.py", line 8, in <module> kit=ServoKit(channels=16) File "/usr/local/lib/python3.6/dist-packages/adafruit_servokit.py", line 98, in init i2c, address=address, reference_clock_speed=reference_clock_speed File "/usr/local/lib/python3.6/di
05-11
<think>好的,我现在需要帮助用户解决在Jetson开发板上使用Adafruit_servokit时遇到的I/O错误,具体是OSError [Errno 121]。这个问题看起来和I2C通信有关。让我先回顾一下用户提供的引用内容,看看有没有相关的线索。 首先,用户提到之前修改了i2c总线2的0x50地址数据,导致无法开机,后来通过修复EEPROM解决了这个问题[^1]。这可能意味着用户之前操作过I2C总线,可能配置有问题或者总线被占用。另外,引用[2]中提到了开启I2C的步骤,比如修改blacklist.conf和/etc/modules,安装i2c-tools等。引用[3]中有使用Adafruit库控制舵机的代码示例,涉及到I2C总线的初始化。 现在用户的问题是使用Adafruit_servokit时出现Remote I/O错误,错误代码121,这通常表示I2C设备无法访问。可能的原因包括总线未启用、权限问题、物理连接错误、地址不正确或者总线冲突。 首先,我应该检查I2C是否已正确启用。根据引用[2],用户需要确保在/etc/modprobe.d/blacklist.conf中注释掉i2c_i801的blacklist,并在/etc/modules中添加i2c-dev。可能用户之前修改过这些配置,但需要确认是否生效,或者是否在修改后重启了系统。 其次,用户可能需要检查物理连接是否正确。比如,舵机是否正确连接到Jetson的I2C总线,特别是SDA和SCL引脚是否正确。根据引用[3],示例中使用的是总线0,对应引脚27和28。如果用户连接到其他总线,比如总线1,可能需要调整代码中的引脚定义。 另外,权限问题也是一个常见原因。用户可能需要将当前用户添加到i2c组,或者使用sudo运行程序。引用[3]中的代码示例使用了sudo pip3安装库,可能涉及到权限设置。 还有可能是I2C地址不正确。Adafruit_servokit默认可能使用0x40地址,但用户的舵机模块可能地址不同,需要确认。使用i2cdetect工具扫描总线可以查看设备是否存在。 此外,用户之前修改过总线2的EEPROM,可能导致其他总线的问题,比如总线0是否正常工作。需要确保当前使用的总线没有被之前的操作影响。 步骤总结: 1. 确认I2C配置正确,已启用所需总线。 2. 检查物理连接,确保SDA/SCL正确连接到对应的总线引脚。 3. 检查用户权限,是否在i2c组。 4. 使用i2cdetect检测设备是否存在。 5. 确认代码中使用的I2C总线和设备地址正确。 6. 检查是否有其他进程占用I2C总线。 7. 检查电源是否稳定,舵机是否耗电过大影响通信。 可能还需要查看具体的错误日志,确认是哪个步骤导致的I/O错误。比如,初始化i2c对象时是否正确指定了总线号,例如board.SCL_1和board.SDA_1对应的是总线1,而如果硬件连接在总线0,可能需要调整。 根据引用[3]中的示例,用户可能在使用不同的总线,比如如果代码中使用的是i2c = busio.I2C(board.SCL_1, board.SDA_1),则对应总线1,而硬件连接可能在总线0,这时需要修改为board.SCL和board.SDA。或者在Jetson的不同版本上,引脚映射可能不同,需要确认具体板子的文档。 另外,错误121(Remote I/O error)可能意味着设备没有响应,可能地址错误或者设备未正确连接。需要确保舵机控制器正确连接到I2C总线,并且地址正确。 最后,可能需要更新Adafruit库或尝试不同的版本,有时库的兼容性问题也会导致通信错误。</think>在Jetson开发板上解决Adafruit_servokit的I/O错误需要系统级调试,以下是分步骤解决方案: ### 一、检查I2C总线状态 1. **确认I2C总线已启用** 通过命令`ls /dev/i2c*`查看可用总线,若缺少`/dev/i2c-1`需修改配置文件: ```bash sudo nano /etc/modprobe.d/blacklist.conf # 注释掉blacklist i2c_i801 sudo nano /etc/modules # 追加i2c-dev sudo reboot ``` 验证I2C设备加载情况: ```bash i2cdetect -l # 应显示i2c-0/i2c-1总线[^2] 2. **检测舵机控制器地址** 使用以下命令扫描总线(以总线1为例): ```bash sudo i2cdetect -y -r 1 # 确认0x40地址设备存在[^3] ``` ### 二、硬件连接验证 | Jetson引脚 | I2C总线 | 舵机控制器引脚 | |-----------|---------|---------------| | 27/28 | i2c-0 | SDA/SCL | | 3/5 | i2c-1 | SDA/SCL | ```python # 根据实际接线选择总线初始化方式 i2c = busio.I2C(board.SCL, board.SDA) # 总线0(引脚27/28) i2c = busio.I2C(board.SCL_1, board.SDA_1) # 总线1(引脚3/5)[^3] ``` ### 三、权限与驱动配置 1. **添加用户到i2c组** ```bash sudo usermod -aG i2c $USER sudo reboot ``` 2. **强制重新加载驱动** ```bash sudo modprobe -r i2c_dev && sudo modprobe i2c_dev ``` ### 四、代码层调试 ```python from board import SCL, SDA import busio i2c = busio.I2C(SCL, SDA, frequency=100_000) # 显式设置频率 while not i2c.try_lock(): pass # 增加锁检测 print("I2C addresses:", i2c.scan()) # 应包含0x40 i2c.unlock() ``` ### 五、电源干扰排查 若使用PWM舵机,需独立供电并共地: ``` Jetson GPIO ----> 舵机控制器 | | 5V电源+ ---[分线板]--- 电源+ | | GND ----------------- GND ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值