Arduino智能小车——小车测速

Arduino智能小车系列教程时空门:

  1. Arduino智能小车——拼装篇 点击跳转
  2. Arduino智能小车——测试篇 点击跳转
  3. Arduino智能小车——调速篇 点击跳转
  4. Arduino智能小车——超声波避障 点击跳转
  5. Arduino智能小车——蓝牙小车 点击跳转
  6. Arduino智能小车——循迹篇 点击跳转
  7. Arduino智能小车——小车测速 点击跳转

文章目录

  • Arduino智能小车——小车测速
    • 测速模块的安装
    • 测速模块讲解
    • 测试代码如下
    • 测速效果

  可以用于测速的模块很多,比如加速度计、激光、超声波、编码器等等,由于我们对小车速度的测量精度要求不高,因此我们可以借助小车套件里面的码盘配上测速模块对其速度进行测量。
##准备材料
测速模块
  网上的测速模块有很多种外观,但是其工作原理类似,下面列出来了几种常见的测速模块,这些测速模块接线类似。

  以上两种模块只能对一路电机的速度进行测量,下面这个可以同时测量两路电机,但是由于其间距固定,在安装时可能不兼容不同小车底盘,因此为了安装方便,在此篇教程中使用第一种模块。

固定铜柱

  建议铜柱长度30CM,大小为M3

  由于铜柱导电,有些电路板如果固定孔设计不当的话很容易导致电路板烧坏,尤其是在以后的项目中可能会用到更高的电压,因此在这里我建议大家可以准备一些尼龙柱来固定电路板。尼龙柱的尺寸跟铜柱尺寸相同M3,30CM。大家也可以顺便买一点尼龙螺丝。

  除此之外还需要准备杜邦线

测速模块的安装

  驱动模块的安装需要由尼龙柱支撑

  驱动模块安装时需要注意,不能影响轮子的正常工作,不能触碰到轮轴上的码盘。
  编码器上有三个引脚分别是“VCC”,“GND”,“OUT”。左右两边两个测速模块的“VCC”引脚接电源或开发板的“5V”或“3.3V”引脚,“GND”接电源或开发板的“GND”引脚,左边测速模块“OUT”接开发板的“3”引脚,右边测速模块“OUT”接开发板的“2”引脚。引脚接错的话可以再随后调试过程中换过来,也可以在代码里更改。
  最终接线图如下:

测速模块讲解

  测速模块的工作原理比较简单,如下图所示,在于电机同轴的码盘上有很多开孔(光栅),编码器相当于光敏元件。码盘随着小车轮子的运动转动时,码盘(光栅)会不断遮挡光敏元件发出的光波,这时候编码器就会根据光栅的遮挡不断的产生方波信号,方波信号会从“OUT”引脚输出,我们只需不断检测“OUT”引脚的输出,根据方波信号的周期简介计算出小车运行的速度。小车上使用的码盘(光栅)精度不高,在某些高精度的编码器上光栅会更加密集,测量效果会更好。

  由于要不断检测编码器输出端的输出,因此我们需要借助Arduino的外部中断来读取编码器的输出。Arduino开发板外部中断对应的引脚如下:

型号 int0 int1 int2 int3 int4 int5
UNO\Ethernet 2 3
Mega2560 2 3 21 20 19 18
Leonardo 3 2 0 1
Due All All All All All All

  由表中可以知道在此我们使用的Arduino UNO只有“2”,“3”引脚可以触发外部中断,因此在接线的时候我们便将左右两边的输出“OUT”引脚分别接在“2”“3”引脚上。
  在程序初始化阶段中调用函数attachInterrupt(interrupt, function, mode)可以对中断引脚初始化,其中
interrupt: 要初始化的外部中断编号,由上表可知我们Arduino UNO只能使用外部中断0和外部中断1;
function: 中断服务函数的名字,即当外部中断被触发时,将会自动调用这个函数;
mode: 中断触发的方式,可选方式如下

mode 含义
LOW 低电平触发
CHANGE 电平变化,高电平变低电平、低电平变高电平
RISING 上升沿触发
FALLING 下降沿触发
HIGH 高电平触发(该中断模式仅适用于Arduino due)

测试代码如下

int leftCounter=0,  rightCounter=0;
unsigned long time = 0, old_time = 0; // 时间标记
unsigned long time1 = 0; // 时间标记
float lv,rv;//左、右轮速度#define STOP      0
#define FORWARD   1
#define BACKWARD  2
#define TURNLEFT  3
#define TURNRIGHT 4int leftMotor1 = 4;
int leftMotor2 = 5;
int rightMotor1 = 6;
int rightMotor2 = 7;void setup() {// put your setup code here, to run once:Serial.begin(9600); attachInterrupt(0,RightCount_CallBack, FALLING);attachInterrupt(1,LeftCount_CallBack, FALLING);pinMode(leftMotor1, OUTPUT);pinMode(leftMotor2, OUTPUT);pinMode(rightMotor1, OUTPUT);pinMode(rightMotor2, OUTPUT);
}void loop() {// put your main code here, to run repeatedly:SpeedDetection();if(Serial.available()>0){char cmd = Serial.read();Serial.print(cmd);motorRun(cmd);}
}
/** *速度计算*/
bool SpeedDetection()
{time = millis();//以毫秒为单位,计算当前时间 if(abs(time - old_time) >= 1000) // 如果计时时间已达1秒{  detachInterrupt(0); // 关闭外部中断0detachInterrupt(1); // 关闭外部中断1//把每一秒钟编码器码盘计得的脉冲数,换算为当前转速值//转速单位是每分钟多少转,即r/min。这个编码器码盘为20个空洞。lv =(float)leftCounter*60/20;//小车车轮电机转速rv =(float)rightCounter*60/20;//小车车轮电机转速Serial.print("left:");Serial.print(lv);//向上位计算机上传左车轮电机当前转速的高、低字节Serial.print("     right:");Serial.println(rv);//向上位计算机上传左车轮电机当前转速的高、低字节//恢复到编码器测速的初始状态leftCounter = 0;   //把脉冲计数值清零,以便计算下一秒的脉冲计数rightCounter = 0;old_time=  millis();     // 记录每秒测速时的时间节点   attachInterrupt(0, RightCount_CallBack,FALLING); // 重新开放外部中断0attachInterrupt(1, LeftCount_CallBack,FALLING); // 重新开放外部中断0return 1;}elsereturn 0;
}
/** *右轮编码器中断服务函数*/
void RightCount_CallBack()
{rightCounter++;
}
/** *左轮编码器中断服务函数*/
void LeftCount_CallBack()
{leftCounter++;
}
/** *小车运动控制函数*/
void motorRun(int cmd)
{switch(cmd){case FORWARD:Serial.println("FORWARD"); //输出状态digitalWrite(leftMotor1, HIGH);digitalWrite(leftMotor2, LOW);digitalWrite(rightMotor1, HIGH);digitalWrite(rightMotor2, LOW);break;case BACKWARD:Serial.println("BACKWARD"); //输出状态digitalWrite(leftMotor1, LOW);digitalWrite(leftMotor2, HIGH);digitalWrite(rightMotor1, LOW);digitalWrite(rightMotor2, HIGH);break;case TURNLEFT:Serial.println("TURN  LEFT"); //输出状态digitalWrite(leftMotor1, HIGH);digitalWrite(leftMotor2, LOW);digitalWrite(rightMotor1, LOW);digitalWrite(rightMotor2, HIGH);break;case TURNRIGHT:Serial.println("TURN  RIGHT"); //输出状态digitalWrite(leftMotor1, LOW);digitalWrite(leftMotor2, HIGH);digitalWrite(rightMotor1, HIGH);digitalWrite(rightMotor2, LOW);break;default:Serial.println("STOP"); //输出状态digitalWrite(leftMotor1, LOW);digitalWrite(leftMotor2, LOW);digitalWrite(rightMotor1, LOW);digitalWrite(rightMotor2, LOW);}
}

  看了这个代码大家应该就明白为什么之前我建议大家将每个功能都封装成函数了,封装成函数很利于程序的移植。

测速效果

  借助于蓝牙串口助手我们可以清楚的看到小车左右轮的转速如图,由于电机自身的误差和摩擦力的作用,因此两个轮子的转速不相等,但是差别不是很大。

欢迎各位有兴趣的朋友加入Q群1:789127261点评、交流

Arduino智能小车——小车测速相关推荐

  1. STM32应用开发实践教程:智能小车电机测速模块的应用开发

    3.4.1 任务分析 本任务要求设计一个可实现智能小车电机测速的应用程序,具体要点如下. ① 取一个电机作为测速对象. ② 支持按键控制,使用 4 个按键,功能描述如下:  Key1 控制电机正转, ...

  2. Arduino智能物流小车项目(MEGA2560)

    因为这是我做的第一个项目,然后平时也不太喜欢拍照.再加上有强迫症,没事喜欢清理文件相册.导致这个项目的材料照片文件十分匮乏(其实几乎都没了).这是用的一些仅存残余文件,来写本人的第一篇博客,算是留作纪 ...

  3. Arduino智能物流小车各部分功能代码详解(省工程训练能力综合竞赛)

    文章目录 前言 测试部分 循迹部分 超声波测距部分 避障部分 机械臂控制部分 扫码部分 初赛部分 前言 考虑到之前那篇博客写的太简略,也只给了一个最终代码,比较容易让人看不懂.本篇主要写一些不同功能函 ...

  4. arduino 蓝牙 android 小车,arduino智能蓝牙小车

    大家好!这是小编第二次做小项目~ 小编目前专业是电气自动化的,不搞点硬件方面的东西,不学点控制技术,有点对不起自己所学的专业. 小编这次打算做arduino多功能智能小车~ 首先,为啥选择arduin ...

  5. Arduino学习笔记(14)-- Arduino使用增量编码器测速

    原理参考:https://www.arduino.cn/thread-42559-1-1.html https://blog.csdn.net/qq_42795251/article/details/ ...

  6. 使用Arduino制作自动车测速

    参考的文章:https://blog.csdn.net/qq_39097425/article/details/85245668 测速原理:使用干簧管或霍尔传感器,两个性质相同,有磁铁接近时进行触发, ...

  7. arduino智能跟随小车

    前言 目前,"机器人"已经成为生活中频繁出现的词汇.本课设所做的智能跟随机器人,属于反馈型移动机器人. 反馈型移动机器人: 可以简单定义为一种对外界信号进行处理反馈最终实现的方式将感知和动作 ...

  8. Mind+上传模式自定义用户库实现光电测速模块测速

    文章目录 前言 一.实施过程 1.获取模板库 2.修改config.json 3.编辑资源文件 4.修改-main.ts描述文件 二.测试 1.导入用户库 2.连接硬件测试 导出分享 前言 Mind+ ...

  9. Arduino智能小车——调速篇

    Arduino智能小车--调速篇 Arduino智能小车系列教程时空门: Arduino智能小车--拼装篇 点击跳转 Arduino智能小车--测试篇 点击跳转 Arduino智能小车--调速篇 点击 ...

  10. 智能小车运行及测速原理

    光电码盘测速原理 如何求解小车速度参数(大小与方向)? 测量速度方向的方法 根据A.B两相脉冲的超前滞后关系确定电机旋转方向: 假定A相超前于B相时,为电机正方向:则当A相滞后于B相,当前电机为反向旋 ...

最新文章

  1. 使用EHPC实现“完美并行”的高效批处理方案
  2. Linux内存申请机制
  3. 计算机组成原理 陈泽,江西师范大学-计算机组成原理的期末复习.doc
  4. 学霸网站-Beta版本发布说明
  5. 打入硅谷的局外人|Decode the Week
  6. 项目启动QRTZ_LOCKS‘ doesn‘t exist
  7. 考前一个月,不,只剩29天
  8. mongodb删除文档
  9. 判定2022年是否闰年c语言_闰年的来历
  10. 程序员怎样练出倒三角身材
  11. ORA-01501: CREATE DATABASE failed
  12. 三码合一方法 制作QQ、微信、支付宝收款码合一
  13. 回调函数及其应用案例
  14. 2021计算机组装视频,2021年做影视后期电脑配置单推荐PR AE软件视频后期电脑组装...
  15. 数理统计复习笔记九——正态性检验
  16. linux ftp中文乱码方块,ubuntu14.04下手工编译texmacs,解决中文显示为方块及输入法问题...
  17. CSS——文字溢出省略成点点点
  18. JAVA计算机毕业设计的问卷调查系统设计与实现源码+数据库+系统+lw文档
  19. UVA11584---区间DP
  20. 天翼云主攻“5G+云+AI”,新生态革命的冲锋

热门文章

  1. 禅道怎样添加开发人员
  2. 常用链接cg 和game
  3. GIS基础知识 - 坐标系、投影、EPSG:4326、EPSG:3857
  4. SCI文献参考基本格式(全)
  5. Python新世界(14)-14行Python代码即可去除抖音水印
  6. 统计学之偏度系数和峰度系数
  7. [渝粤教育] 四川大学 新生研讨课 参考 资料
  8. java hdporn,docs/java/concurrent/SynBottom.md · wt1814/wt-note - Gitee.com
  9. vue 综合案例todos----重要
  10. 网上流行护眼色的RGB值和颜色代码(豆沙绿:RGB颜色 红:199,绿:237,蓝:204)