一起玩儿物联网人工智能小车(ESP32)——27. 旋转编码器的使用方法

本文主要是介绍一起玩儿物联网人工智能小车(ESP32)——27. 旋转编码器的使用方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

摘要:本文介绍旋转编码器的使用方法

旋转编码器是一种机电设备,可将轴或轴的角位置或运动转换为模拟或数字输出信号,在工业控制中发挥着举足轻重的作用。旋转编码器目前被广泛的应用在数控机床、印刷设备、包装机械、输送带、电梯、机器人、风力发电、起重机、家用电器等领域,主要用于频率调节、速度调节、高度调节、温度调节及音量调节等的参数控制。

旋转编码器主要有两种类型:绝对编码器和增量编码器。

绝对编码器通过提供与运动相关的数据输出来反馈速度和位置信息。即使编码器断电,它们也能保持位置信息。编码器的位置在通电时立即可用。绝对编码器具有多个不同二进制权重的码环,然后通过多个不同位置和权重的码环的组合,就可以确定旋钮的当前位置。绝对编码器由机械位置决定的每个位置的唯一性,它无需记忆,无需找参考点,而且不用一直计数,什么时候需要知道位置,什么时候就去读取它的位置。这样,编码器的抗干扰特性、数据的可靠性大大提高了。需要注意的是,绝对编码器只能在一圈之内给出绝对位置。

增量编码器通过读取角位移的变化而不是读取编码轴的绝对角度来工作,在发生旋转时增量编码器将立即报告位置的变化情况。旋转增量式编码器以转动时输出脉冲,通过计数设备来知道其位置,当编码器不动或停电时,则需要依靠计数设备的内部记忆来记住位置。增量编码器不跟踪绝对位置。它们可能需要移动到固定参考点才能开始位置测量。旋转增量式编码器有两个信号A和B,当编码器轴旋转时发出方波两组脉冲信号。通过这两组脉冲不仅可以测量转速,还可以判断旋转的方向。

下图即为几种常用在家用电器中的旋转编码器。都是增量编码器。

下面就以上图中的第三种来介绍一下引脚的功能说明。其他的增量式旋转编码器和这个也是类似。

引脚

功能

CLK

脉冲信号输出A

DT

脉冲信号输出B

SW

中间按键状态

+

电源正极。通常为+5V

GND

电源负极。

下面就来将旋转编码器连接到ESP32开发板上,然后用Mixly测试一下它的功能吧。这次要实现的功能是利用旋转编码器实现对舵机的控制。让舵机可以随着旋转编码器中间轴的旋转左右摆动,当按下中间按键的时候,舵机复位,回到90度的位置。旋转编码器电源的连接就不用说了,找到扩展板上的输出引脚,接上就行了。CLK和DT分别接到了P23和P22引脚。SW则接到了P21引脚。舵机在前面也讲过了,电源接好后,将其控制线接到P19引脚就行了。

下面就打开Mixly软件,选择“Arduino ESP32”。因为这种增量式的旋转编码器本身是无法记录码盘位置的,因此,先定义一个全局变量degree,用来记录编码器的位置,初始值为90度。如下所示:

在初始化的时候,需要完成2件事情。一件是初始化一个旋转编码器对象,指名其使用的引脚。然后是将管脚21设置为上拉输入的模式,用来获取旋转编码器中心轴的按下状态。在这里,之所以不选择普通的输入状态,是因为我的旋转编码器没有焊接上拉电阻,因此要使用上拉模式,才能正确的读取按键的状态(如果有上拉电阻,那么直接设置为输入就可以了)。旋转编码器的背部如下图所示:

初始化部分的功能实现如下图所示。

接下来就是定义旋转编码器的事件处理方法。当向右旋转时,degree增大,当向左旋转时,degree减小。当按键按下时,degree变成90度,让舵机回到中间位置。如下图所示:

最后,就是在主循环程序中,控制舵机转到degree指定的位置了。如下所示:

接下来,编译和上传程序,看看舵机是不是在旋转编码器的控制下可以左右摇摆了?

下面就来学习一下Mixly为自动生成的源代码,如下所示:

#include <ESPRotary.h>

#include <OneButton.h>

#include <ESP32_Servo.h>

volatile int degree;

ESPRotary encoder1;

OneButton button21(21,true);

Servo servo_19;

void encoder1OnRightRotation(ESPRotary& encoder1) {

    degree = degree + 1;

}

void encoder1OnLeftRotation(ESPRotary& encoder1) {

    degree = degree - 1;

}

void attachClick21() {

  degree = 90;

}

void setup(){

  degree = 90;

  encoder1.begin(22, 23);

  encoder1.setStepsPerClick(2);

  pinMode(21, INPUT_PULLUP);

  encoder1.setRightRotationHandler(encoder1OnRightRotation);

  encoder1.setLeftRotationHandler(encoder1OnLeftRotation);

  button21.attachClick(attachClick21);

  servo_19.attach(19,500,2500);

}

void loop(){

  encoder1.loop();

  button21.tick();

  servo_19.write(degree);

  delay(10);

}

在这里遇到了一个高级编程语言中很常见的一种事件处理机制——回调函数。回调函数是在中断的基础上演变而来的。其工作原理就是,事先定义一个事件处理函数,然后将该函数与触发的事件绑定到一起,之后,当该事件发生的时候,由系统自动的调用事件处理函数来。也就是在某个事件发生的时候,被系统自动调用的函数就是回调函数。

接下来看一下源代码的setup()函数中的如下3句代码:

  encoder1.setRightRotationHandler(encoder1OnRightRotation);

  encoder1.setLeftRotationHandler(encoder1OnLeftRotation);

  button21.attachClick(attachClick21);

就是指定当旋转编码器向右旋转时,执行encoder1OnRightRotation()函数,当旋转编码器向左旋转时,执行encoder1OnLeftRotation()函数,当按键按下时,执行attachClick21()函数。对于其他的代码,这里就不再进行解释了,之前应该都见过了。

这篇关于一起玩儿物联网人工智能小车(ESP32)——27. 旋转编码器的使用方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/576106

相关文章

PHP轻松处理千万行数据的方法详解

《PHP轻松处理千万行数据的方法详解》说到处理大数据集,PHP通常不是第一个想到的语言,但如果你曾经需要处理数百万行数据而不让服务器崩溃或内存耗尽,你就会知道PHP用对了工具有多强大,下面小编就... 目录问题的本质php 中的数据流处理:为什么必不可少生成器:内存高效的迭代方式流量控制:避免系统过载一次性

Python使用FastAPI实现大文件分片上传与断点续传功能

《Python使用FastAPI实现大文件分片上传与断点续传功能》大文件直传常遇到超时、网络抖动失败、失败后只能重传的问题,分片上传+断点续传可以把大文件拆成若干小块逐个上传,并在中断后从已完成分片继... 目录一、接口设计二、服务端实现(FastAPI)2.1 运行环境2.2 目录结构建议2.3 serv

Spring Security简介、使用与最佳实践

《SpringSecurity简介、使用与最佳实践》SpringSecurity是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架,本文给大家介绍SpringSec... 目录一、如何理解 Spring Security?—— 核心思想二、如何在 Java 项目中使用?——

springboot中使用okhttp3的小结

《springboot中使用okhttp3的小结》OkHttp3是一个JavaHTTP客户端,可以处理各种请求类型,比如GET、POST、PUT等,并且支持高效的HTTP连接池、请求和响应缓存、以及异... 在 Spring Boot 项目中使用 OkHttp3 进行 HTTP 请求是一个高效且流行的方式。

python获取指定名字的程序的文件路径的两种方法

《python获取指定名字的程序的文件路径的两种方法》本文主要介绍了python获取指定名字的程序的文件路径的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 最近在做项目,需要用到给定一个程序名字就可以自动获取到这个程序在Windows系统下的绝对路径,以下

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

JavaScript中的高级调试方法全攻略指南

《JavaScript中的高级调试方法全攻略指南》什么是高级JavaScript调试技巧,它比console.log有何优势,如何使用断点调试定位问题,通过本文,我们将深入解答这些问题,带您从理论到实... 目录观点与案例结合观点1观点2观点3观点4观点5高级调试技巧详解实战案例断点调试:定位变量错误性能分

使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解

《使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解》本文详细介绍了如何使用Python通过ncmdump工具批量将.ncm音频转换为.mp3的步骤,包括安装、配置ffmpeg环... 目录1. 前言2. 安装 ncmdump3. 实现 .ncm 转 .mp34. 执行过程5. 执行结

Python中 try / except / else / finally 异常处理方法详解

《Python中try/except/else/finally异常处理方法详解》:本文主要介绍Python中try/except/else/finally异常处理方法的相关资料,涵... 目录1. 基本结构2. 各部分的作用tryexceptelsefinally3. 执行流程总结4. 常见用法(1)多个e

Java使用jar命令配置服务器端口的完整指南

《Java使用jar命令配置服务器端口的完整指南》本文将详细介绍如何使用java-jar命令启动应用,并重点讲解如何配置服务器端口,同时提供一个实用的Web工具来简化这一过程,希望对大家有所帮助... 目录1. Java Jar文件简介1.1 什么是Jar文件1.2 创建可执行Jar文件2. 使用java