
衡山派D133EBS开发板雨滴传感器模块移植与驱动开发实战最近在做一个智能车窗的项目需要检测是否下雨于是就用上了雨滴传感器。市面上常见的雨滴传感器模块基于LM393价格便宜使用也简单但当我把它接到衡山派D133EBS开发板上时却遇到了一个不大不小的坑ADC读数不对折腾了半天才发现原来是D133EBS芯片的ADC参考电压和模块输出电压不匹配导致的。今天我就把整个移植和驱动开发的过程包括怎么填这个“电压坑”手把手地分享给大家。如果你也在用衡山派开发板想接入雨滴传感器跟着这篇教程走就能少走很多弯路。1. 认识我们的“侦察兵”雨滴传感器模块雨滴传感器顾名思义就是用来侦察有没有下雨、雨大不大的。它主要用在汽车智能灯光、自动雨刷、智能车窗这些系统里。咱们用的这个模块其实挺简单的。它怎么工作呢你可以把它想象成一块“特制电路板”上面用导电材料比如镍画了很多线。当这块板子是干的时候这些线之间是“断路”的不导电。一旦有雨滴落上去水是导电的它就像一座“导电桥”把两条线给连起来了。这样一来两条线之间的电阻就变小了电流就能流过去模块就能检测到这个变化。模块长啥样咱们用的这个模块工作电压是3.3V到5V探测距离大概1米。它有两个关键输出口AO (Analog Output)模拟量输出。直接输出一个电压值雨滴越多、面积越大导电性越好输出的电压就越高。这个电压值可以反映雨量的大小。DO (Digital Output)数字量输出。模块内部有个比较器LM393它会比较AO的电压和一个可调的阈值。当雨量达到一定程度电压超过阈值DO就输出低电平0否则输出高电平1。板子上那个蓝色的电位器就是调这个灵敏度的。简单来说AO告诉你“雨有多大”DO告诉你“有没有下雨”。模块上还有个DO-LED指示灯DO输出低电平时它会亮非常直观。2. 硬件连接与关键“电压坑”模块有4个引脚VCC接电源、GND接地、AO模拟输出、DO数字输出。接线本身很简单但这里有个必须特别注意的地方也是移植的核心难点。⚠️ 特别注意D133EBS的ADC参考电压是2.5V衡山派开发板的核心芯片D133EBS其ADC模块的参考电压是2.5V。这意味着ADC引脚输入电压最高只能测到2.5V。如果你直接把模块的AO脚最高可能输出3.3V接上去当电压超过2.5V时ADC读数会一直显示最大值对应2.5V实际电压就测不准了。怎么办分压我们需要在AO引脚和开发板的ADC输入引脚之间加一个简单的分压电路把最高3.3V的电压“压缩”到2.5V以内。一个最常用的办法是用两个相同阻值的电阻比如10kΩ串联分压。分压原理模块AO (最高3.3V) ---[电阻R1]--- ADC引脚 ---[电阻R2]--- GND当R1和R2阻值相等时ADC引脚测到的电压 模块AO电压 × (R2 / (R1R2)) 模块AO电压 × 1/2。所以我们的操作是硬件上用两个10kΩ电阻串联从模块AO取电中间点接到开发板的ADC引脚。这样ADC引脚实际接收到的电压是模块输出电压的一半。软件上我们在程序里读取到ADC转换后的电压值后需要再乘以2才能还原出模块AO脚的真实电压。虽然分压会损失一点点精度但这是保证测量准确的必要操作。我们的引脚接线如下表所示传感器模块引脚连接到衡山派开发板说明VCC3.3V 电源引脚提供工作电压GNDGND 引脚共地AO通过分压电路连接到 GPAI6 (ADC通道6)模拟信号输出需分压DOPE.14 (GPIO引脚)数字信号输出直接连接3. 软件驱动移植全流程硬件接好了接下来就是让软件跑起来。我们需要把驱动代码集成到你的RT-Thread工程里。3.1 获取并放置驱动文件首先你需要下载驱动代码包。可以在相关资料下载中心找到名为rain-sensor的驱动文件夹。下载后将这个rain-sensor文件夹完整地复制到你的工程目录下luban-lite\application\rt-thread\helloworld\user-bsp\如果找不到user-bsp文件夹说明你还没做模块移植的前置配置需要先去完成必要的工程设置。3.2 修改工程配置文件 (Kconfig)为了让系统知道我们新增了这个模块并能在图形化配置菜单里选中它需要修改Kconfig文件。用VSCode打开工程里的这个文件application\rt-thread\helloworld\Kconfig。在文件末尾#endif语句的前面添加下面这行# 雨滴传感器 source application/rt-thread/helloworld/user-bsp/rain-sensor/Kconfig这行代码的作用是告诉构建系统“去rain-sensor文件夹里找它的配置信息”。3.3 使用 menuconfig 启用模块接下来我们要在配置菜单里把雨滴传感器模块“点亮”。双击工程根目录下的win_env.bat打开RT-Thread的Env配置工具。在Env命令行中先应用我们开发板的默认配置scons --apply-defd13x_JLC_rt-thread_helloworld_defconfig输入命令进入图形化配置界面scons --menuconfig在出现的菜单中按上下键找到Porting code using the LCKFB module这一项按Y键选中它前面会出现[*]。按回车键进入这个子菜单。在里面找到USing rain sensor选项按Y键选中它。按左右键将底部菜单焦点移到Save上回车保存配置然后一路退出 menuconfig。3.4 编译与烧录配置保存好后就可以编译了。在Env命令行中输入scons或者使用多核编译加快速度数字根据你的CPU核心数调整scons -j8编译成功后在output\d13x_JLC_rt-thread_helloworld\images目录下会生成d13x_JLC_v1.0.0.img镜像文件。用你熟悉的烧录工具如PhoenixSuit将这个镜像烧录到开发板即可。4. 驱动代码解析烧录完成系统就跑起来了。现在我们来深入看看驱动代码是怎么工作的。核心文件都在rain-sensor文件夹里。4.1 核心驱动头文件 (bsp_raindrop.h)这个文件很简单就是声明了我们要用到的几个函数像是一个功能清单。#ifndef __BSP_RAINDROP_SENSOR_H__ #define __BSP_RAINDROP_SENSOR_H__ #include stdio.h int RAIN_Init(void); // 初始化传感器 int RAIN_DeInit(void); // 反初始化关闭 float RAIN_Get_Value(void); // 读取AO电压值 int RAIN_Get_Percentage_value(float value); // 将电压值转换为百分比 int RAIN_Get_DO_In(void); // 读取DO引脚状态0有雨1无雨 #endif4.2 核心驱动源文件 (bsp_raindrop.c)这里是所有功能的实现我们挑重点看。首先是一些关键定义#define ADC_DEVICE_NAME gpai // ADC设备名 #define ADC_CHANNEL 6 // 使用的ADC通道号对应硬件连接的GPAI6 #define VREF_ADC_HSPI 2.5 // D133EBS的ADC参考电压关键 #define DO_PIN rt_pin_get(PE.14) // DO引脚定义 #define GET_DO_IN rt_pin_read(DO_PIN) // 读取DO引脚的宏注意VREF_ADC_HSPI被定义为2.5这就是我们芯片ADC的参考电压上限。初始化函数RAIN_Init这个函数做了三件事查找并打开名为gpai的ADC设备。使能我们所用的第6通道。将连接DO信号的PE.14引脚设置为输入模式准备读取数字信号。读取电压函数RAIN_Get_Value这是最核心的函数它负责读取AO的电压并处理分压问题。float RAIN_Get_Value(void) { int value 0; // 累计读取的数据 int count 5; // 计划采集5次 int valid_count 0; // 实际有效采集次数 while(count--) { uint32_t temp rt_adc_read(adc_dev, ADC_CHANNEL); // 读取一次ADC原始值 if((temp ! 0) (temp 4096)) // 过滤无效数据12位ADC范围0-4095 { value temp; // 累加 valid_count; // 有效次数1 } aicos_mdelay(5); // 延时5ms再读下一次避免干扰 } if(!valid_count) return -RT_ERROR; // 如果一次都没读成功报错 int return_Value value / valid_count; // 计算平均值 // 将ADC原始值转换为电压电压 (参考电压 / 最大ADC值) * 原始值 float voltage_calculation ( VREF_ADC_HSPI / 4095.0 ) * return_Value; // 关键步骤乘以2还原因分压电路减半的真实电压 return voltage_calculation * 2; }这里就是处理“电压坑”的核心逻辑voltage_calculation * 2。因为我们硬件上用了分压电路ADC实际测到的电压是模块输出电压的一半所以软件上需要乘2来还原。辅助函数RAIN_Get_Percentage_value把读取到的电压值比如1.2V换算成相对于最大电压3.3V的百分比更直观。RAIN_Get_DO_In直接读取DO引脚的电平。返回0表示检测到雨滴DO输出低电平返回1表示无雨。4.3 测试与验证代码 (test_rain_sensor.c)驱动写好了怎么用呢这个文件提供了一个完整的测试示例。它创建了一个线程循环打印传感器信息。启动测试的命令是test_rain_sensor执行后线程会每隔1秒打印一次信息包括Read AO x.xxVAO引脚的真实电压值已经乘2还原。Percentage xx%电压值对应的百分比。如果DO引脚检测到低电平会打印DO!!!作为警报。停止测试的命令是test_exit_rain_sensor5. 上机验证给开发板和传感器都上电并通过USB转TTL模块连接电脑串口波特率115200。在串口终端里输入test_rain_sensor命令并回车。你会看到终端开始周期性地打印电压和百分比信息。现在你可以尝试在雨滴传感器的感应板上滴几滴水观察AO电压值和百分比是否会上升。DO指示灯是否会亮起同时串口是否会打印出DO!!!的警告信息。如果一切正常恭喜你雨滴传感器已经在衡山派开发板上成功安家落户了你可以基于这些函数去开发你的自动雨刷、智能关窗等应用了。