这一节我们编写代码来尝试下是否能够读取到电机上编码器的脉冲数,并通过实验测试出小车的输出轴转速和编码器脉冲的比值。
一、新建工程并导入开源库
新建example25_encoder
添加依赖
[env:featheresp32] ; 这是一个环境配置标签,指定了代码将运行的硬件平台和框架 platform = espressif32 ; 指定了使用的平台为Espressif 32 board = featheresp32 ; 指定使用的硬件板为Feather ESP32 framework = arduino ; 指定使用的框架为Arduino lib_deps = ; 列出所有依赖库的URL,这些库将被下载和安装 https://github.com/fishros/Esp32PcntEncoder.git ; ESP32 编码器驱动库
这里我们使用的是Esp32PcntEncoder开源库,这个库调用了ESP32的脉冲计算外设进行编码器脉冲的计算,使用非常简单。
二、代码实现
编写代码
#include <Arduino.h> #include <Esp32PcntEncoder.h> Esp32PcntEncoder encoders[2]; // 创建一个数组用于存储两个编码器 void setup() { // 1.初始化串口 Serial.begin(115200); // 初始化串口通信,设置通信速率为115200 // 2.设置编码器 encoders[0].init(0, 32, 33); // 初始化第一个编码器,使用GPIO 32和33连接 encoders[1].init(1, 26, 25); // 初始化第二个编码器,使用GPIO 26和25连接 } void loop() { delay(10); // 等待10毫秒 // 读取并打印两个编码器的计数器数值 Serial.printf("tick1=%d,tick2=%d\n", encoders[0].getTicks(), encoders[1].getTicks()); }
上面这段代码使用了ESP32PcntEncoder库来读取两个旋转编码器的计数器数值。其中,函数setup()用于初始化串口和编码器;函数loop()用于读取并打印两个编码器的计数器数值。以下是代码的详细解释:
首先包含了两个头文件Arduino.h和Esp32PcntEncoder.h,用于编写Arduino程序和使用ESP32PcntEncoder库。
在全局变量中创建了一个长度为2的Esp32PcntEncoder数组,用于存储两个编码器。
函数setup()用于初始化串口和编码器。在本代码中,首先通过Serial.begin()函数初始化串口,设置通信速率为115200。然后通过encoders[0].init()和encoders[1].init()函数分别初始化了两个编码器。其中,函数init()需要传入三个参数,分别是编码器的ID、引脚A的GPIO编号和引脚B的GPIO编号。在本代码中,第一个编码器的ID为0,引脚A连接的GPIO为32,引脚B连接的GPIO为33;第二个编码器的ID为1,引脚A连接的GPIO为26,引脚B连接的GPIO为25。
函数loop()用于读取并打印两个编码器的计数器数值。在本代码中,首先通过delay()函数等待10毫秒。然后通过encoders[0].getTicks()和encoders[1].getTicks()函数分别读取了两个编码器的计数器数值。最后通过Serial.printf()函数将这两个数值打印。
三、下载测试
将代码下载进入开发板,打开串口监视器,查看输出。
四、脉冲/圈计算
为了计算一个脉冲轮子前进的距离,我们可以通过手动将轮子旋转10圈,然后利用前面的公式进行计算。
这里小鱼将轮子转动10圈后得到脉冲数为19419,也就是说当前电机1941.8个脉冲/圈
根据公式可以算出,一个脉冲轮子前进的距离为:
接着我们可以利用公式计算速度。
标签:初始化,编码器,encoders,引脚,slam,串口,GPIO,ros2 From: https://www.cnblogs.com/ai-ldj/p/18279680