树莓派 4B 使用拓展板的四声音传感器AO模块连接

这篇文档介绍了Raspberry Pi Sensor Board的特性,包括8路ADC检测、内置MCU以及与树莓派的I2C通信。通过扩展板上的STM32/STC8G MCU,用户能够在树莓派上读取模拟传感器的数据。文中还提供了一个Python示例,用于读取PCF8591 ADC芯片的4通道声音强度数据,实现声音检测并设置阈值触发功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

RaspberryPi-Sensor-Board使用文档

 

RaspberryPi-Sensor-Board - emakefun文档中心 (test-doc-zh-cn.readthedocs.io)

特点

  • 支持8路ADC检测
  • 内置MCU
  • 支持树莓派 2B/3B/3B+/4/zero
  • 5.5x2.1DC头与接线端子供电
  • 外接传感器电压3V3与5V自由切换
  • 板载DC-DC降压芯片 宽电压输入:6~36V 电压输出:5V 最大电流输出: 3A

MCU规格

  • 工作电压:3.3V
  • MCU :STM32/STC8G
  • IO: 8路ADC检测
  • 与树莓派通信方式: I2C
  • I2C地址: 0x04

硬件概述

 

寄存器

    扩展板MCU I2C地址为0x04,寄存地址说明如下:

 

  • 0x10 ~ 0x17: 读取ADC原始数据

  • 0x20 ~ 0x27: 读取输入电压

  • 0x30 ~ 0x37: 读取输入电压与输出电压的比 输入电压/输出电压

读取ADC模拟值

    众所周知,Raspberry Pi中没有ADC,因此不能直接读取传感器的模拟值。在扩展板内置的MCU 的帮助下可以读取10位ADC这就意味着可以在树莓派上使用模拟传感器,且一共有8个可用的接口。

    模拟传感器将模拟电压输入10位模数转换器。模数转换器将模拟数据转换成数字数据后,通过I2C将数字数据输入到树莓派中。

   

在终端输入“sudo i2cdetect -y 1”命令即可扫描接在I2C总线上的所有I2C设备,并打印出该设备的I2C总线地址(这里使用的是PCF8591)0x48

import time
import RPi.GPIO as GPIO
import smbus

GPIO.setmode(GPIO.BCM)

address=0x48

delta=20

time_list=[0,0,0,0]
threshold=[0,0,0,0]
basic_value_1=[]
basic_value_2=[]
basic_value_3=[]
basic_value_4=[]

bus=smbus.SMBus(1)
def loop_print():
    flag1=0
    flag2=0
    flag3=0
    flag4=0
    while True:
        
        bus.write_byte(address,0x40)
        bus.write_byte(address,0x41)
        bus.write_byte(address,0x42)
        bus.write_byte(address,0x43)
        
        sound1=bus.read_byte_data(address,0x40)
        sound2=bus.read_byte_data(address,0x41)
        sound3=bus.read_byte_data(address,0x42)
        sound4=bus.read_byte_data(address,0x43)
        
        if sound1:
            print("the NO.1 power of the sound is %lf"%sound1)
            
            if len(basic_value_1)<=10:
                basic_value_1.append(sound1)
                if len(basic_value_1)==10:
                    value=0
                    for i in range(10):
                        value+=basic_value_1[i]
                    threshold[0]=(value/10)+delta
                    
            if 0 not in threshold:
                if sound1>threshold[0] and flag1==0:
                    time_list[0]=time.time_ns()/10**9
                    flag1=1
                    
            time.sleep(0.0)
            
        if sound2:
            print("the NO.2 power of the sound is %lf"%sound2)
            
            if len(basic_value_2)<=10:
                basic_value_2.append(sound2)
                if len(basic_value_2)==10:
                    value=0
                    for i in range(10):
                        value+=basic_value_2[i]
                    threshold[1]=(value/10)+delta
                    
            if 0 not in threshold:
                if sound2>threshold[1] and flag2==0:
                    time_list[1]=time.time_ns()/10**9
                    flag2=1
                    
            time.sleep(0.0)
        
        if sound3:
            print("the NO.3 power of the sound is %lf"%sound3)
            
            if len(basic_value_3)<=10:
                basic_value_3.append(sound3)
                if len(basic_value_3)==10:
                    value=0
                    for i in range(10):
                        value+=basic_value_3[i]
                    threshold[2]=(value/10)+delta
                    
            if 0 not in threshold:
                if sound3>threshold[2] and flag3==0:
                    time_list[2]=time.time_ns()/10**9
                    flag3=1
                    
            time.sleep(0.0)
            
        if sound4:
            print("the NO.4 power of the sound is %lf"%sound4)
            
            if len(basic_value_4)<=10:
                basic_value_4.append(sound4)
                if len(basic_value_4)==10:
                    value=0
                    for i in range(10):
                        value+=basic_value_4[i]
                    threshold[3]=(value/10)+delta
                    
            if 0 not in threshold:
                if sound4>threshold[3] and flag4==0:
                    time_list[3]=time.time_ns()/10**9
                    flag4=1
                    
            time.sleep(0.0)
        
        if (0 not in time_list) and (0 not in threshold):
            print(threshold)
            print(time_list)
            break

loop_print()

 

 

 

### 关于树莓派4B的5G扩展板兼容性和购买建议 #### 兼容性分析 树莓派4B是一款功能强大的单板计算机(SBC),其硬件配置包括4GB LPDDR4内存和16GB eMMC存储[^2],并支持多种外设接口。然而,原生设计并未直接集成5G通信模块的支持。为了实现5G连接,通常需要通过USB3.0或PCIe M.2接口来接入外部5G模组。 目前市场上存在一些第三方厂商生产的5G USB适配器或PCIe扩展卡,这些设备可以满足树莓派4B的需求。需要注意的是,由于树莓派4B仅提供USB3.0接口而无标准PCIe插槽,因此大多数情况下会选择基于USB3.0的解决方案。这类方案能够充分利用USB3.0高达5Gbps的数据传输速率,从而保障良好的网络性能。 对于FR1频谱下的5G应用而言,最大带宽可达100Mbit/s,这远低于USB3.0的实际吞吐能力,因而不会成为瓶颈[^1]。不过,在实际部署过程中仍需注意驱动程序的兼容性以及操作系统版本是否支持特定型号的5G模块。 #### 购买推荐 以下是几款适合搭配树莓派4B使用的5G扩展板/适配器: 1. **Quectel RM500Q-GL**: 这是一款广泛应用于工业物联网领域的5G模块,支持Sub-6GHz频段,并可通过USB接口轻松连接树莓派4B上。此外,该产品还提供了详尽的技术文档和支持论坛以便开发者快速启动项目开发工作。 2. **Fibocom FG100系列**: Fibocom推出的FG100系列产品同样定位于嵌入式市场,除了常规的5G联网功能之外,部分型号额外集成了GNSS定位服务,非常适合户外应用场景需求较高的用户群体考虑选用此类产品作为自己的首选目标之一。 3. **Telit FN980V-W**: Telit品牌的FN980V-W也是另一项不错的选择对象;它不仅完全符合上述提到的各项技术指标要求,而且凭借小巧轻便的设计风格特别契合那些追求极致空间利用率的应用场合的要求。 无论选择哪一种具体型号的产品之前都应该仔细查阅官方发布的规格说明书确认它们确实能够在所期望的操作环境下正常运作起来才行哦! ```bash # 示例命令:检测已安装的5G模块状态 (Linux环境) sudo mmcli --modem 0 ``` 以上脚本可以帮助验证新添置好的5G组件是否已被正确识别出来并且处于就绪待命的状态之中。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Programmer__C

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值