2-Arduino小车测速模板安装与测试

本文介绍了如何使用Arduino UNO搭建小车测速系统,包括测速模块的选择、安装注意事项以及编码器的工作原理。文章详细阐述了接线方法、中断引脚配置,并提供了代码示例,讲解了如何通过编码器计算小车速度,以及如何通过PWM调整电机速度。
摘要由CSDN通过智能技术生成

Arduino智能小车——小车测速

准备材料

1.     测速模块

2.     

3.     固定铜柱

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

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

c)       

4.     准备杜邦线

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

6.     

7.     驱动模块安装时需要注意,不能影响轮子的正常工作,不能触碰到轮轴上的码盘。

  编码器上有三个引脚分别是“VCC”,“GND”,“OUT”。左右两边两个测速模块的“VCC”引脚接电源或开发板的“5V”或“3.3V”引脚,“GND”接电源或开发板的“GND”引脚,左边测速模块“OUT”接开发板的“3”引脚,右边测速模块“OUT”接开发板的“2”引脚。引脚接错的话可以再随后调试过程中换过来,也可以在代码里更改。

8.     

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

10.  

11.  我们使用的Arduino UNO只有“2”,“3”引脚可以触发外部中断,因此在接线的时候我们便将左右两边的输出“OUT”引脚分别接在“2”“3”引脚上。

12.  在程序初始化阶段中调用函数attachInterrupt(interrupt,function, mode)可以对中断引脚初始化,其中

13.  interrupt:要初始化的外部中断编号,由上表可知我们Arduino UNO只能使用外部中断0和外部中断1;

14.  function:中断服务函数的名字,即当外部中断被触发时,将会自动调用这个函数;

15.  mode:中断触发的方式,可选方式如下


16.  脉宽调制(PWM)基本原理:控制方式就是对逆变电路开关器件的通断进行控制,使输出端得到一系列幅值相等的脉冲,用这些脉冲来代替正弦波或所需要的波形。也就是在输出波形的半个周期中产生多个脉冲,使各脉冲的等值电压为正弦波形,所获得的输出平滑且低次谐波少。按一定的规则对各脉冲的宽度进行调制,即可改变逆变电路输出电压的大小,也可改变输出频率。

17.  

18.   通俗一点讲那,就是当如果我们想输出5V电压时,只需一直输出高电平即可;当我们想输出3.75V电压时,那我们就需要在一个周期内(一个高电平和一个低电平为一个周期)3.75÷5=75%时间输出高电平,25%时间输出低电平;同理,如果想输出2.5V电压时,我们需要在一个周期内50%时间输出高电平,50%时间输出低电平。

19.  

当然,我可以帮你提供一个简单的Arduino小车测速程序代码。请注意,以下代码仅为参考,具体实现可能会因不同的硬件和需求而有所变化。 ```cpp // 引入库 #include <Wire.h> #include <Adafruit_MotorShield.h> #include "utility/Adafruit_MS_PWMServoDriver.h" // 创建马达盾对象 Adafruit_MotorShield AFMS = Adafruit_MotorShield(); // 定义电机对象 Adafruit_DCMotor *motorA = AFMS.getMotor(1); Adafruit_DCMotor *motorB = AFMS.getMotor(2); // 定义编码器引脚 const int encoderPinA = 2; const int encoderPinB = 3; // 初始化编码器变量 volatile long encoderCount = 0; int lastEncoded = 0; void setup() { // 初始化串口 Serial.begin(9600); // 设置编码器引脚为输入模式 pinMode(encoderPinA, INPUT); pinMode(encoderPinB, INPUT); // 当编码器引脚发生状态变化时触发中断 attachInterrupt(digitalPinToInterrupt(encoderPinA), updateEncoder, CHANGE); // 启动马达盾 AFMS.begin(); // 设置马达速度 motorA->setSpeed(255); motorB->setSpeed(255); } void loop() { // 获取当前编码器计数 long currentCount = encoderCount; // 清零编码器计数 encoderCount = 0; // 计算小车速度(这里假设编码器的每个脉冲对应车轮的一个单位距离) float speed = (float)currentCount / 10; // 例如,每个脉冲对应0.1cm // 输出速度值 Serial.print("Speed: "); Serial.print(speed); Serial.println(" cm/s"); // 延迟一段时间 delay(100); } // 编码器中断处理函数 void updateEncoder() { int MSB = digitalRead(encoderPinA); // 获取A引脚状态 int LSB = digitalRead(encoderPinB); // 获取B引脚状态 int encoded = (MSB << 1) | LSB; // 将A、B引脚状态合并为一个值 int sum = (lastEncoded << 2) | encoded; // 上一次和当前状态合并 if (sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011) { encoderCount++; } else if (sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000) { encoderCount--; } lastEncoded = encoded; // 更新上一次状态 } ``` 以上代码使用了Adafruit_MotorShield库进行马达控制,并使用两个编码器引脚来测量小车的速度。编码器每次计数时触发中断,然后通过计算编码器计数的变化来计算小车的速度。 请注意,这只是一个简单的示例代码,具体的实现可能会根据你的硬件配置和需求进行调整。希望对你有所帮助!如果你有更多问题,请随时提问。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值