树莓派扩展板文档: emakefun

RaspberryPi-Sensor-Board V4.0

深圳市易创空间科技有限公司设计树莓派扩展板, 适用于 Raspberry Pi Zero~4B。 可以通过5.5-2.1mm的DC头或接线柱可以给树莓派供电。预留了RF24L01模块,HC-SR04超声波模块,I2C接口,UART接口,支持8路ADC。同时空出摄像头和显示屏排线接口。

树莓派扩展板上面标注了丝印为信号引脚的BCM编码和功能名,如下图:

特点

  • 内置10bit ADC MCU,支持8路ADC检测,ADC值范围为0 ~ 1023;
  • 支持树莓派 2B/3B/3B+/4B/zero;
  • 5.5x2.1DC头与接线端子外部供电,输入范围7~30V;
  • 外接传感器供电电压3V3与5V切换;
  • 板载DC-DC降压芯片最大输出5V3A给树莓派直接供电

MCU规格

  • 工作电压:3.3V和5V 根据跳线帽选择ADC检测电压;
  • 与树莓派通信方式: I2C 速率 1~400K;
  • I2C地址: 0x24,背面可以配置地址;
  • IO: 8路ADC检测 对应引脚A0~A7;
  • 8路扩展模式支持ADC输入,GPIO,PWM(只A1-A2支持)

寄存器

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

0x01寄存器为模式设置

如下模式可以设置

|--------------|----------|-----------------------------------------------------------------------------------------------|
| 命令 | 模式 | 功能描述 |
| 0x01 | 输入上拉 | MCU内置上拉电阻使能 |
| 0x02 | 输入下拉 | MCU内置下拉电阻使能 |
| 0x04 | 浮空输入模式 | 浮空输入 |
| 0x08 | 输出模式 | 可把引脚配置为高低电平输出模式,然后使引脚输出高电平或者低电平 |
| 0x10 | ADC模式 | 可把引脚配置为ADC模式,然后读取引脚的ADC值,精度10位,ADC值范围为0 ~ 1023 |
| 0x20 | PWM 输出模式 | 可配置扩展板的PWM输出频率(1 ~ 10000Hz),然后把引脚为PWM输出模式,再配置引脚PWM输出的占空比(12位精度:0 ~ 4095),然后使引脚输出PWM,可用于驱动舵机 |
| 0x10 ~ 0x17 | | 读取ADC原始数据 |
| 0x20 ~ 0x27 | | 读取输入电压,单位是mv |
| 0x30 ~ 0x37 | | 读取输入电压与输出电压的比,输入电压/输出电压(0~100) |
| 0x40 ~ 0x47 | | 读取或者是设置A0-A7的数字值 |
| 0x51 ~ 0x52 | | 设置A1-A2的PWM占空比 |
| 0x61 ~ 0x62 | | 设置A1-A2的PWM的频率 |

树莓派I2C库安装

打开树莓派终端输入"sudo raspi-config"命令,然后按照下图顺序依次操作即可。

以上就是开启树莓派I2C,接下来我们安装树莓I2C库在终端输入"sudo apt-get install i2c-tools",输入完成后就可以看到正在下载I2C库,安装完成之后可以在终端输入"sudo i2cdetect -l"检测是否安装正确,若出现类似于下面的信息就说明安装正常。

在终端输入"sudo i2cdetect -y 1"命令即可扫描接在I2C总线上的所有I2C设备,并打印出该设备的I2C总线地址,且我们的扩展板的I2C地址为0x24。

bash 复制代码
sudo nano /boot/config.txt

查找包含"dtparam=i2c_arm=on"的行,添加",i2c_arm_baudrate=100000",其中100000是新设置的速度(100kbit /s),注意i2c前面的逗号。完整代码如下:

bash 复制代码
dtparam=i2c_arm=on,i2c_arm_baudrate=100000

这样可以启用I2C总线的同时,也完成了新波特率的设置。编辑完成后,使用CTRL-X,然后选择Y,再按下回车键,保存文件并退出。

重新启动树莓派,使新的设置生效:

bash 复制代码
sudo reboot

例程

运行python demo前,一定要用如下命名安装smbus2

bash 复制代码
pi@raspberrypi: pip3 install smbus2 

1. 读取ADC模拟值

众所周知,Raspberry Pi中没有ADC,因此不能直接通过树莓派的引脚读取模拟值。本扩展板内置一颗I2C协议 10bit精度的ADC MCU,树莓派可以通过这个ADC MCU获取模拟值,扩展板上一共有8个可用的模拟输入接口,对应板子丝印A0A7,ADC读取值范围为01023。

python 复制代码
#coding=utf-8
from sensor_expansion_board_i2c import IoExpansionBoardI2c
from smbus2 import SMBus
import time

# 初始化I2C总线
i2c_bus = 1  # 树莓派上的I2C总线号,通常是1
i2c_address = 0x24  # I2C设备地址

# 创建IoExpansionBoardI2c对象
io_expansion_board_i2c = IoExpansionBoardI2c(i2c_bus, i2c_address)

# 设置所有引脚为ADC模式
for i in range(8):
    io_expansion_board_i2c[i].mode = IoExpansionBoardI2c.ADC_MODE

# 循环读取ADC值
try:
    while True:
        print('A0:',io_expansion_board_i2c[0].adc_value) 
        print('A1:',io_expansion_board_i2c[1].adc_value) 
        print('A2:',io_expansion_board_i2c[2].adc_value) 
        print('A3:',io_expansion_board_i2c[3].adc_value)
        print('A4:',io_expansion_board_i2c[4].adc_value)
        print('A5:',io_expansion_board_i2c[5].adc_value) 
        print('A6:',io_expansion_board_i2c[6].adc_value) 
        print('A7:',io_expansion_board_i2c[7].adc_value)
        time.sleep(1)  # 延时1秒
except KeyboardInterrupt:
    # print("程序已停止")
    pass

用python3运行demo

bash 复制代码
pi@raspberrypi:~/$ python3 adc.py 

2. 数字GPIO测试

树莓派扩展板上丝印A0~A7引脚的每个单独引脚都可以独立设置成输入或者输出功能,输入可以设置 上拉、下拉或者浮空输入 。

python 复制代码
#coding=utf-8
from sensor_expansion_board_i2c import IoExpansionBoardI2c
from smbus2 import SMBus
import time

# 初始化I2C总线
i2c_bus = 1  # 树莓派上的I2C总线号,通常是1
i2c_address = 0x24  # I2C设备地址

# 创建IoExpansionBoardI2c对象
io_expansion_board_i2c = IoExpansionBoardI2c(i2c_bus, i2c_address)

# Set pin mode
io_expansion_board_i2c[0].mode = IoExpansionBoardI2c.OUTPUT_DIGITAL_MODE  # Pin 0 set as digital output mode
io_expansion_board_i2c[1].mode = IoExpansionBoardI2c.INPUT_PULL_UP_MODE   # Pin 1 set as input pull up mode

try:
    while True:
        digital_value = io_expansion_board_i2c[1].value  # reads pin 1 value
        print('digital value:', digital_value)
        io_expansion_board_i2c[0].value = digital_value  # write pin 1 value into pin 0
except KeyboardInterrupt:
    print("The programme has been stopped")

3. PWM输出

树莓派原本的硬件pwm只有GPIO1、GPIO26、GIPIO23、GPIO24对应的WiringPi就是1,26,23,24但是不同库支持的输出不一样,使用和树莓派本身的硬件资源冲突,比如声卡,定时器等。所以本扩展板外扩2路pwm可以很好解决这个问题。但是只有A1和A2两个引脚支持

python 复制代码
#coding=utf-8
from sensor_expansion_board_i2c import IoExpansionBoardI2c
import time

# 初始化I2C总线
i2c_bus = 1  # 树莓派上的I2C总线号,通常是1
i2c_address = 0x24  # I2C设备地址

# 创建IoExpansionBoardI2c对象
io_expansion_board_i2c = IoExpansionBoardI2c(i2c_bus, i2c_address)
io_expansion_board_i2c.pwm_frequency = 1000 # Setting PWM frequency

# Setting pin mode as PWM output mode
io_expansion_board_i2c[1].mode = IoExpansionBoardI2c.OUTPUT_PWM_MODE
io_expansion_board_i2c[2].mode = IoExpansionBoardI2c.OUTPUT_PWM_MODE

print('only A1 A2 support pwm output')

try:
while True:
	io_expansion_board_i2c[1].pwm_duty = 100 # Setting the PWM duty ratio of pin 1 as 100
	io_expansion_board_i2c[2].pwm_duty = 1023 # Setting the PWM duty ratio of pin 2 as 1023
	print('A1 pwm_duty:', io_expansion_board_i2c[1].pwm_duty, 'A2 pwm_duty:', io_expansion_board_i2c[2].pwm_duty)
	time.sleep(1)
	io_expansion_board_i2c[1].pwm_duty = 2048 # Setting the PWM duty ratio of pin 1 as 2048
	io_expansion_board_i2c[2].pwm_duty = 4096 # Setting the PWM duty ratio of pin 2 as 1023
	print('A1 pwm_duty:', io_expansion_board_i2c[1].pwm_duty, 'A2 pwm_duty:', io_expansion_board_i2c[2].pwm_duty)
	time.sleep(1)
except KeyboardInterrupt:
	print("The programme has been stopped")

4. 舵机控制

有了PWM的支持,那么意味着也可以将此pwm扩展成驱动舵机的接口,如下代码就是驱动SG90舵机测试代码。其他非标准协议的脉冲宽度舵机,可以自行修改驱动实现。

python 复制代码
#coding=utf-8
from sensor_expansion_board_i2c import IoExpansionBoardI2c
import time

# 初始化I2C总线
i2c_bus = 1  # 树莓派上的I2C总线号,通常是1
i2c_address = 0x24  # I2C设备地址

# 创建IoExpansionBoardI2c对象
io_expansion_board_i2c = IoExpansionBoardI2c(i2c_bus, i2c_address)

io_expansion_board_i2c.pwm_frequency = 50 # Setting PWM frequency as 50Hz

# Setting pin mode as PWM output mode
io_expansion_board_i2c[1].mode = IoExpansionBoardI2c.OUTPUT_PWM_MODE
io_expansion_board_i2c[2].mode = IoExpansionBoardI2c.OUTPUT_PWM_MODE

try:
    while True:
        io_expansion_board_i2c[1].servo_angle = 0
        io_expansion_board_i2c[2].servo_angle = 90
        print('angle:', io_expansion_board_i2c[1].servo_angle, ",",
              io_expansion_board_i2c[2].servo_angle)
        time.sleep(1)

        io_expansion_board_i2c[1].servo_angle = 90
        io_expansion_board_i2c[2].servo_angle = 0
        print('angle:', io_expansion_board_i2c[1].servo_angle, ",",
              io_expansion_board_i2c[2].servo_angle)
        time.sleep(1)

        io_expansion_board_i2c[1].servo_angle = 180
        io_expansion_board_i2c[2].servo_angle = 180
        print('angle:', io_expansion_board_i2c[1].servo_angle, ",",
              io_expansion_board_i2c[2].servo_angle)
        time.sleep(1)

        io_expansion_board_i2c[1].servo_angle = 90
        io_expansion_board_i2c[2].servo_angle = 90
        print('angle:', io_expansion_board_i2c[1].servo_angle, ",",
              io_expansion_board_i2c[2].servo_angle)
        time.sleep(1)
except KeyboardInterrupt:
    print("The programme has been stopped")

**下载树莓派C++示例程序:**本例程为树莓派使用c++语言编写,引脚A0输出高低电平,间隔100ms

cpp 复制代码
#include <iostream>
#include <chrono>
#include <thread>
#include "gpio_expansion_board.h"

 // 创建 GpioExpansionBoard 实例
GpioExpansionBoard gpio_expansion_board;

int main() {
    std::cout << "Setup" << std::endl;

    // 配置A0为输出模式
    if (!gpio_expansion_board.SetGpioMode(GpioExpansionBoard::kGpioPinE0, 
                                        GpioExpansionBoard::kOutput)) {
        std::cerr << "Failed to set GPIO mode" << std::endl;
        return -1;
    }

    // 主循环
    while (true) {
        // 设置A0的输出高电平
        std::cout << "Setting GPIO A0 to HIGH" << std::endl;
        if (!gpio_expansion_board.SetGpioLevel(GpioExpansionBoard::kGpioPinE0, 1)) {
            std::cerr << "Failed to set GPIO level HIGH" << std::endl;
            return -1;
        }
        
        // 延时100毫秒
        std::this_thread::sleep_for(std::chrono::milliseconds(100));

        // 设置A0的输出低电平
        std::cout << "Setting GPIO A0 to LOW" << std::endl;
        if (!gpio_expansion_board.SetGpioLevel(GpioExpansionBoard::kGpioPinE0, 0)) {
            std::cerr << "Failed to set GPIO level LOW" << std::endl;
            return -1;
        }
        
        // 延时100毫秒
        std::this_thread::sleep_for(std::chrono::milliseconds(100));
    }

    // 程序结束前将GPIO设置为低电平
    gpio_expansion_board.SetGpioLevel(GpioExpansionBoard::kGpioPinE0, 0);
    std::cout << "Program terminated" << std::endl;
    return 0;
}

树莓派环境下的直接使用g++命令行编译

bash 复制代码
pi@raspberrypi:~/sensor_expansion_board_python_demo/src
g++ -lwiringPi -I./ digital_output/digital_output.cpp gpio_expansion_board.cpp -o gpio_out
pi@raspberrypi:~/sensor_expansion_board_python_demo/src
./gpio_out
Setup
Setting GPIO A0 to HIGH
Setting GPIO A0 to LOW
Setting GPIO A0 to HIGH
Setting GPIO A0 to LOW

其他demo程序编译方法类似,不再冗述。

|----|---------------|------------------------|
| 序号 | 文件名字 | 功能描述 |
| 1 | adc | 模拟输入,A0~A7支持 |
| 2 | digital_input | 数字输入,A0~A7支持 |
| 3 | digital_out | 数字输出,A0~A7支持 |
| 4 | pwm | 可输出pwm波,只有A1-A2两个引脚支持 |
| 5 | servo | 控制sg90舵机,只有A1-A2两个引脚支持 |

相关推荐
我先去打把游戏先11 小时前
TCP、TLS、HTTP、HTTPS、MQTT、MQTTS几种网络协议的对比与解释
嵌入式硬件·mcu·物联网·网络协议·tcp/ip·http·aws
IT方大同11 小时前
实时时钟RTC
嵌入式硬件·实时音视频
点灯小铭11 小时前
基于单片机的社区医院小型高压蒸汽灭菌自动控制器设计
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
youcans_12 小时前
【动手学STM32G4】(3)STM32G431之定时器
stm32·单片机·嵌入式硬件·定时器
悠哉悠哉愿意12 小时前
【嵌入式学习笔记】AD/DA
笔记·单片机·嵌入式硬件·学习
阿凉070212 小时前
新版本JLink安装目录中缺失JLinkDevices.xml添加方法
xml·嵌入式硬件
范纹杉想快点毕业12 小时前
《嵌入式通信与数据管理:从状态机到环形队列的完整实战指南》
单片机·嵌入式硬件
点灯小铭13 小时前
基于单片机的硫化氢、氨气、甲烷、一氧化碳气体多种有害气体检测与声光报警系统设计
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
小李做物联网13 小时前
【单片机毕设】c24基于单片机stm32蓝牙温室大棚物联网毕业设计
stm32·单片机·嵌入式硬件·物联网
电子工程师成长日记-C5113 小时前
51单片机厨房环境参数监测(温湿度、烟雾、燃气、CO、甲醛)
单片机·嵌入式硬件·51单片机