如何使用WiringPi在ODROID C2开发板上通过Python读取模拟输入?
在ODROID C2上用Python读取模拟输入的解决方案
嘿,我刚好在ODROID C2上折腾过模拟输入的需求,给你分享两个可行的解决方案~首先得明确:ODROID C2本身的GPIO没有原生模拟输入引脚,所以我们需要外接一个ADC(模数转换)模块,比如常用的MCP3008(8通道10位SPI ADC),下面是具体步骤:
一、硬件准备与连接
以MCP3008为例,和ODROID C2的引脚对应关系如下(可参考你提供的wPi编号或物理引脚):
- MCP3008的VDD、VREF接ODROID C2的3.3V(物理引脚1)
- MCP3008的AGND、DGND接ODROID C2的GND(比如物理引脚6)
- MCP3008的CLK接ODROID C2的SPI CLK(wPi 14,物理引脚23)
- MCP3008的DOUT接ODROID C2的SPI MISO(wPi 12,物理引脚21)
- MCP3008的DIN接ODROID C2的SPI MOSI(wPi 13,物理引脚19)
- MCP3008的CS接ODROID C2的SPI CE0(wPi 10,物理引脚24)
- 你的模拟输入信号(比如传感器输出)接MCP3008的CH0-CH7任意通道
二、启用ODROID C2的SPI总线
ODROID C2默认可能没开启SPI,需要先配置:
- 编辑boot配置文件:
sudo nano /boot/config.ini - 找到或添加
spi_enable=true这一行,确保前面没有注释符号# - 保存退出后重启开发板:
sudo reboot - 重启后检查SPI设备是否存在:
ls /dev/spi*,能看到/dev/spidev0.0和/dev/spidev0.1就说明配置成功
三、方案1:用WiringPi的Python绑定读取
既然你已经安装了WiringPi,直接用它的Python包就很方便:
- 安装WiringPi的Python模块:
sudo pip install wiringpi - 编写测试代码:
import wiringpi import time # 初始化WiringPi,使用wPi编号规则 wiringpi.wiringPiSetup() # 初始化SPI总线,CE0通道(对应/dev/spidev0.0),速度1MHz spi_channel = 0 spi_speed = 1000000 wiringpi.wiringPiSPISetup(spi_channel, spi_speed) def read_mcp3008(channel): # 构造MCP3008的读取命令:起始位1 + 单端输入标志 + 通道编号 cmd = 0b11000000 | (channel << 3) # 发送命令并读取返回数据 buffer = wiringpi.wiringPiSPIDataRW(spi_channel, [cmd, 0, 0]) # 解析10位的模拟值 analog_value = ((buffer[1] & 0x03) << 8) | buffer[2] return analog_value try: while True: # 读取CH0通道的模拟值 value = read_mcp3008(0) # 转换成实际电压(参考电压3.3V) voltage = value * (3.3 / 1023.0) print(f"CH0模拟值: {value}, 对应电压: {voltage:.2f}V") time.sleep(1) except KeyboardInterrupt: print("\n程序已退出")
四、方案2:用纯Python的spidev库读取
如果不想依赖WiringPi,用轻量的spidev库也能实现:
- 安装spidev库:
sudo pip install spidev - 编写测试代码:
import spidev import time # 初始化SPI设备 spi = spidev.SpiDev() spi.open(0, 0) # 对应bus 0,CE0通道 spi.max_speed_hz = 1000000 def read_mcp3008(channel): # 发送读取命令帧 adc_data = spi.xfer2([1, (8 + channel) << 4, 0]) # 计算10位模拟值 analog_value = ((adc_data[1] & 3) << 8) + adc_data[2] return analog_value try: while True: value = read_mcp3008(0) voltage = value * (3.3 / 1023.0) print(f"CH0模拟值: {value}, 对应电压: {voltage:.2f}V") time.sleep(1) except KeyboardInterrupt: spi.close() print("\n程序已退出")
注意事项
- 模拟输入信号的电压必须控制在0-3.3V之间,超过范围会损坏ADC模块或开发板
- 如果使用其他ADC模块(比如12位的MCP3208),需要把代码中的
1023换成对应最大数值(比如4095) - 确保你的WiringPi是ODROID官方版本,如果遇到兼容性问题,可以重新编译安装:
git clone https://github.com/hardkernel/wiringPi.git && cd wiringPi && ./build
内容的提问来源于stack exchange,提问作者www139
相关产品推荐
相关产品推荐

