Arduino智能小车——小车测速

Arduino智能小车——小车测速

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

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

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

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

固定铜柱

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

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

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

测速模块的安装

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

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

测速模块讲解

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

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

  由表中可以知道在此我们使用的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 4

int 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); // 关闭外部中断0
    detachInterrupt(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); // 重新开放外部中断0
    attachInterrupt(1, LeftCount_CallBack,FALLING); // 重新开放外部中断0
    return 1;
  }
  else
    return 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点评、交流

  • 81
    点赞
  • 529
    收藏
    觉得还不错? 一键收藏
  • 36
    评论
学习Arduino有段时间了,也看了很多东西,所以打算最近做了一辆3轮的智能车。 Arduino智能车制作配件 3轮小车底盘(能安装UNO、带其他配件) 1块 UNO控制板 1块 Arduino电机驱动 1块 UNO扩展板 1块 7.4V充电锂电池(充电器) 1块 电源端转DC端口线 1块 超声波云台(包含超声波、舵机及固定支架) 1块 LCD12864液晶显示器 1块 测速模块 2块 杜邦线(连接模块) 20根左右 焊接导线(连接电机及点击驱动) 6根左右 铜柱螺丝(必要时加高) 热缩管+扎带+黑胶布 工具:烙铁、锡丝、斜口钳或者剪刀、打火机(热缩管用)、螺丝刀 小车所用到的装备: 1、首先当然是小车底盘了,我用的是3轮小车底盘,带开关(很方便); 2、控制板(我用的是UNO兼容版),电机驱动,扩展板(方便用杜邦线,VCC及GND也很多);3块板子可以直接插在一起,节省了很多空间,如下图: 3、供电电源,我使用的是7.4V充电锂电池加DC转接头,当然还有充电器~~如下图: 4、超声波舵机云台,如图: 5、显示模块LCD12864,我的买回来后又加工了一次,原来是直排针(不太还接线),将它改成弯排针了,如下图: 6、最后就是测速模块,现在还没调试到它,但是已经将它安装在小车上;还有些配件:螺丝、铜柱、杜邦线等,还有些简单的工具:烙铁、螺丝刀什么的;我还有用扎带,热缩管,这样小车看起来会更美观! 超声波使用的是 A2 和A3脚,这个自行定义也可以的!我使用的扩展板上就有这个接口舵机使用的是D13 12864 使用的是杜邦线连接的,引脚使用下面也有! 所有的连接方式都有写到程序中,打开一看就知道了! Arduino避障小车 電路連接: D3、D4和D6、D7分别连接左右电机,控制电机 超聲波連接: VCC ---- +5V;Trig ---- A2;Echo ---- A3;GND ---- GND; 舵機控制:D13 LCD12864引脚连接: RS ---- D2;R/W ---- D8;E ---- D9;PCB ---- GND;VSS ---- GND;VDD ---- VCC;LED+ ---- VCC;LED- ---- GND;
### 回答1: Arduino智能小车是一种基于Arduino控制板的小型智能车辆,它可以通过编程实现自主移动、避障、跟随等功能。一般来说,它主要由Arduino控制板、电机驱动模块、电机、传感器和外壳组成。 在制作Arduino智能小车时,可以通过编程控制电机的转动方向和速度,从而实现小车的前进、后退、左转、右转等运动方式。同时,可以通过超声波传感器等感知模块获取周围环境信息,从而实现避障、跟随等功能。 如果你想进一步了解如何制作Arduino智能小车,可以查看一些相关的教程和视频,了解所需硬件和软件,以及如何进行编程。 ### 回答2: Arduino智能小车是一种基于Arduino开发板的智能车辆,它结合了传感器、电机和编程控制,能够实现多种智能功能和自主导航。 首先,Arduino智能小车通过搭载各种传感器来感知周围环境。通常会使用红外线传感器、超声波传感器、灰度传感器等来检测障碍物、距离和地面颜色等信息。这些传感器可以在遇到障碍物时及时发出信号,避免碰撞,并根据传感器数据做出相应的动作。 其次,Arduino智能小车的动力系统通过电机来驱动。它通常配备直流电机和舵机,可以实现前进、后退、转弯等动作。借助编程控制,可以根据传感器的反馈信号,实现智能巡线、自动避障等功能。 最后,Arduino智能小车的核心是基于Arduino开发板的编程控制。使用Arduino编程语言,可以编写控制逻辑和算法,对小车的各个功能进行编程。通过编程,可以实现自动避障、巡线跟踪、遥控操控、声音和光线控制等多种智能功能。 总结来说,Arduino智能小车是一款结合了传感器、电机和编程控制的智能车辆。它具备感知周围环境、移动驱动和智能控制等功能。这种小车可以在教育、实验和娱乐等领域广泛应用,是学习和体验智能技术的绝佳平台。 ### 回答3: Arduino智能小车是一种基于Arduino控制板的智能机器人小车。它主要由车体、电机、传感器和Arduino板组成。通过编写程序,可以实现小车的自主避障、遥控驾驶、跟随等功能。 首先,小车的车体是由底盘、轮子和电机组成。电机通过Arduino板上的电机驱动模块控制。通过编写代码,可以实现小车的前进、后退、左转、右转等动作。 另外,小车上安装了各种传感器,如红外线传感器、超声波传感器和巡线传感器。红外线传感器可以用于检测前方的障碍物,实现自主避障功能。超声波传感器可以测量小车与障碍物的距离,可以在遥控驾驶模式下帮助驾驶员避免碰撞。巡线传感器可以用于检测地面上的黑线,实现小车的自动跟随功能。 在编写程序方面,可以利用Arduino开发环境进行编程。通过使用Arduino的库函数和API,可以轻松地控制小车的各种动作和功能。例如,使用Serial库可以实现小车与电脑的串口通信,通过模拟信号控制小车的运动。 总之,Arduino智能小车是一个具有自主避障、遥控驾驶和跟随功能的智能机器人。通过编写合适的程序,可以轻松地实现各种有趣的操作和应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 36
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值