【花雕学编程】Arduino动手做(232)---ESP32-S3 CAM旋转增量编码器模块带防抖的中断计数器

在这里插入图片描述

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来——小小的进步或是搞不掂的问题,希望能够抛砖引玉。

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百三十二:ESP32-S3 WROOM N16R8 CAM开发板WiFi+蓝牙模块OV2640/5640摄像头

在这里插入图片描述
在这里插入图片描述

ESP32-S3 WROOM N16R8 CAM 是一款集成了Wi-Fi、蓝牙和摄像头接口的高性能模块,适用于各种物联网(IoT)、AI视觉和嵌入式应用。以下是对其主要组成部分和功能的详细介绍:

1、ESP32-S3 系列芯片
处理器:ESP32-S3 系列芯片采用 Xtensa® 双核 32 位 LX7 微处理器,支持单精度浮点运算单元,最高时钟频率可达 240 MHz。
存储:集成 384KB ROM、512KB SRAM 和 16KB RTC SRAM,支持最大 16MB 的外部 PSRAM。
2、无线通信
Wi-Fi:支持 2.4 GHz 频段的 802.11 b/g/n 协议,数据速率最高可达 150 Mbps。
蓝牙:支持低功耗蓝牙(Bluetooth LE)5.0,支持多种速率(125Kbps、500Kbps、1Mbps、2Mbps)和广播扩展。
3、存储配置
Flash:ESP32-S3 WROOM N16R8 配置了 16MB 的 Quad SPI Flash。
PSRAM:集成了 8MB 的 Octal SPI PSRAM,用于扩展存储和提高数据处理能力。
4、外设接口
GPIO:提供多达 36 个通用输入输出引脚(GPIO),支持多种外设接口。
摄像头接口:支持连接摄像头模块,如 OV2640 和 OV5640,适用于图像处理和视频流应用2。
其他接口:包括 SPI、I2C、I2S、UART、PWM、ADC、DAC 等,适用于各种传感器和外设的连接。
5、电源和工作条件
电源电压:工作电压范围为 3.0V 至 3.6V。
工作温度:标准工作温度范围为 -40°C 至 85°C,某些型号可支持更高的温度范围。
6、应用场景
AIoT:适用于人工智能物联网(AIoT)应用,如语音识别、图像处理和智能家居。
智能设备:广泛应用于智能家电、智能控制面板、智能扬声器等设备。
工业控制:适用于工业自动化和控制系统,提供高可靠性和稳定性。
7、其他特性
神经网络运算能力:支持神经网络和信号处理,适用于复杂的AI应用。
低功耗设计:优化的电源管理,适用于电池供电的设备。

ESP32-S3 WROOM N16R8 CAM 模块凭借其强大的处理能力、丰富的外设接口和灵活的存储配置,成为物联网、AI视觉和嵌入式应用的理想选择。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

EC11旋转编码器
也叫开关编码器、旋转编码器,EC11系列编码器有直插编码器、贴片式编码器、沉板式编码器、侧插式编码器,EC11A为直插式编码器。因广泛用于车载DVD、车载导航、汽车影音上,也经常被人称为汽车编码器。EC11编码器在各类仪器设备中用于频率、音量、速度、温度、电压、菜单选择、光线强弱等参数的控制。此款编码器有做20脉冲20定位点、15脉冲30定位点两种。调节轴有金属柄和塑胶柄,轴长区间9-30mm,调节轴有全柄、半柄、螺纹柄等类型供您选择。EC11系列编码器主要用于汽车电子、多媒体音响、仪器仪表、家用电器、智能家居、计算机周边、医疗器械等领域。主要用于频率调节、亮度调节、温度调节、音量调节的参数控制等。

技术参数
使用温度范围:-30℃ to+80℃
保存温度范围: -40℃ to+85℃
额定电压:DC 5V(最高12V)
全回转角度:360度(无止档点)
回转寿命:30000+200 Cycles
接触电阻:≤100mΩ
绝缘阻抗:100MΩ 以上
振荡:≤10mS 按压(开关SW)
寿命:20,000±200次.(0.5行程)
15,000±200次.(1.5行程)
在这里插入图片描述
工作原理
增量式编码器是将位移转换成周期性的电信号,再把这个电信号转变成计数脉冲,用脉冲的个数表明位移的巨细。编码器是把角位移或直线位移转换成电信号的一种设备。依照读出办法编码器能够分为机械式和非机械式两种:机械式选用电刷输出,一电刷触摸导电区或绝缘区来表明代码的状况是“1”仍是“0”;非机械式的承受灵敏元件是光敏元件或磁敏元件,选用光敏元件时以透光区和不透光区来表明代码的状况是“1”仍是“0”。旋转增量式编码器以转变时输出脉冲,通过计数设备来晓得其方位,当编码器不动或停电时,依托计数设备的内部回忆来记住方位。这样,当停电后,编码器不能有任何的移动,当来电作业时,编码器输出脉冲进程中,也不能有搅扰而丢掉脉冲,否则,计数设备回忆的零点就会偏移,并且这种偏移的量是无从晓得的,只要过错的出产成果呈现后才晓得。目前常用的增量式编码器全部为机械式编码器,好用且成本低,高端的一般为非机械光电式的。

旋转编码器
可通过旋转可以计数正方向和反方向转动过程中输出脉冲的次数,旋转计数不像电位计,这种转动计数是没有限制的。配合旋转编码器上的按键,可以复位到初始状态,即从 0 开始计数。增量编码器是一种将旋转位移转换为一连串数字脉冲信号的旋转式传感器。这些脉冲用来控制角位移。在 Eltra 编码器中角位移的转换采用了光电扫描原理。读数系统以由交替的透光窗口和不透光窗口构成的径向分度盘(码盘)的旋转为依据,同时被一个红外光源垂直照射,光把码盘的图像投射到接收器表面上。接收器覆盖着一层衍射光栅,它具有和码盘相同的窗口宽度。接收器的工作是感受光盘转动所产生的变化,然后将光变化转换成相应的电变化。再使低电平信号上升到较高电平,并产生没有任何干扰的方形脉冲,这就必须用电子电路来处理。读数系统通常采用差分方式,即将两个波形一样但相位差为180°的不同信号进行比较,以便提高输出信号的质量和稳定性。读数是再两个信号的差别基础上形成的,从而消除了干扰。

在这里插入图片描述

我手头的旋转编码器模块有5个引脚,分别是VCC, GND, SW, CLK, DT。其中VCC和GND用来接电源和地,按缩写SW应该是Switch(开关)、CLK是Clock(时钟)、DT是Data(数据)。两个引脚那一端为普通的按键,也就是圆柄按下去的那个按键,当做普通按键使用即可。右边三个引脚中间的为GND,两边为两路脉冲信号CLK和DT。旋转编码器的操作是旋转和按压转轴,在按下转轴的时候SW引脚的电平会变化,旋转的时候每转动一步CLK和DT的电平是有规律的变化。

引脚接线
ESP32-S3-CAM 旋转传感器模块
D1 CLK(Clock 时钟)
D2 DT (Data 数据)
D42 SW (按钮开关)
5V +VCC
GND GND

在这里插入图片描述
在这里插入图片描述

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百三十二:ESP32-S3 WROOM N16R8 CAM开发板WiFi+蓝牙模块
OV2640/5640摄像头模组
{花雕动手做}项目之三十四:ESP32-S3 CAM旋转增量编码器模块带防抖的中断计数器

实验开源代码

/*
  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
   实验二百三十二:ESP32-S3 WROOM N16R8 CAM开发板WiFi+蓝牙模块
   OV2640/5640摄像头模组
  {花雕动手做}项目之三十四:ESP32-S3 CAM旋转增量编码器模块带防抖的中断计数器
*/

// 定义引脚
int CLK = 1; // 编码器CLK引脚
int DT = 2;  // 编码器DT引脚
int count = 0; // 计数器
int lastCLK = 0; // 上一次CLK的状态
volatile bool updateFlag = false; // 标志位,指示计数器是否更新
unsigned long lastDebounceTime = 0; // 上一次去抖动时间
unsigned long debounceDelay = 5; // 去抖动延迟时间(毫秒)

// 函数原型声明
void IRAM_ATTR ClockChanged();

void setup() {
  // 设置引脚模式
  pinMode(CLK, INPUT); // 设置CLK为输入模式
  pinMode(DT, INPUT); // 设置DT为输入模式
  
  // 附加中断服务程序
  attachInterrupt(digitalPinToInterrupt(CLK), ClockChanged, CHANGE); // 当CLK引脚状态变化时调用ClockChanged函数
  
  // 初始化串口通信
  Serial.begin(115200); // 设置串口波特率为115200
  Serial.println("编码器准备就绪");
}

void loop() {
  // 检查标志位
  if (updateFlag) {
    noInterrupts(); // 禁用中断
    updateFlag = false; // 重置标志位
    interrupts(); // 启用中断
    Serial.print("count: "); // 打印计数器值
    Serial.println(count);
  }
}

// 中断服务程序
void IRAM_ATTR ClockChanged() {
  unsigned long currentTime = millis();
  // 检查是否超过去抖动延迟时间
  if ((currentTime - lastDebounceTime) > debounceDelay) {
    int clkValue = digitalRead(CLK); // 读取当前CLK引脚状态
    int dtValue = digitalRead(DT); // 读取当前DT引脚状态
    
    // 检查CLK状态是否变化
    if (clkValue != lastCLK) {
      lastCLK = clkValue; // 更新lastCLK状态
      // 根据CLK和DT状态变化更新计数器
      count += (clkValue == dtValue) ? 1 : -1;
      updateFlag = true; // 设置标志位,指示计数器已更新
    }
    lastDebounceTime = currentTime; // 更新去抖动时间
  }
}

代码解读
1、引脚定义和变量声明:
CLK 和 DT 分别定义为编码器的时钟引脚和数据引脚。
count 用于记录编码器的计数值。
lastCLK 用于存储上一次读取的CLK引脚状态。
updateFlag 是一个标志位,用于指示计数器是否更新。
lastDebounceTime 和 debounceDelay 用于去抖动处理,防止由于抖动导致的重复计数。

2、函数原型声明:
void IRAM_ATTR ClockChanged(); 声明了中断服务程序的原型,确保在setup函数中调用时能够找到该函数。

3、setup函数:
设置CLK和DT引脚为输入模式。
使用attachInterrupt函数将ClockChanged函数附加到CLK引脚的状态变化中断上。
初始化串口通信,设置波特率为115200,并打印“编码器准备就绪”以确认初始化成功。

4、loop函数:
检查updateFlag标志位,如果为true,表示计数器已更新。
禁用中断,重置updateFlag标志位,启用中断,确保在访问共享变量时的数据一致性。
打印当前计数器值。

5、中断服务程序 ClockChanged:
读取当前时间currentTime。
检查当前时间与上一次去抖动时间lastDebounceTime的差值是否超过去抖动延迟时间debounceDelay。
读取当前CLK和DT引脚的状态。
如果CLK状态发生变化,更新lastCLK状态。
根据CLK和DT状态的变化更新计数器值,并设置updateFlag标志位。
更新去抖动时间lastDebounceTime。

6、关键点总结
去抖动处理:通过检查时间间隔来防止由于抖动导致的重复计数。
中断处理:使用中断服务程序实时响应编码器的状态变化,确保计数器的准确性。
标志位机制:在中断服务程序中设置标志位,在主循环中处理计数器更新,避免在中断中进行阻塞操作。
串口通信:通过串口打印计数器值,便于调试和监控编码器的工作状态。
数据一致性:在访问共享变量时禁用中断,确保数据一致性。

实验串口返回情况

在这里插入图片描述
实验场景图

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

驴友花雕

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

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

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

打赏作者

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

抵扣说明:

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

余额充值