You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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,需要先配置:

  1. 编辑boot配置文件:sudo nano /boot/config.ini
  2. 找到或添加spi_enable=true这一行,确保前面没有注释符号#
  3. 保存退出后重启开发板:sudo reboot
  4. 重启后检查SPI设备是否存在:ls /dev/spi*,能看到/dev/spidev0.0和/dev/spidev0.1就说明配置成功

三、方案1:用WiringPi的Python绑定读取

既然你已经安装了WiringPi,直接用它的Python包就很方便:

  1. 安装WiringPi的Python模块:sudo pip install wiringpi
  2. 编写测试代码:
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库也能实现:

  1. 安装spidev库:sudo pip install spidev
  2. 编写测试代码:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:17:57