查看: 7252|回复: 4

家用型移动机器人制作教程 电机驱动篇

[复制链接]
作者:Pepin@DFRobot 转载请注明来源
GMR板简介

GMR板全称 通用机器人扩展板, 是一块专为家用机器人平台(HCR) 设计的集成电路板。
在这块集成版上需要插入3 个微处理器(单片机):2块Arduino Nano和1块Arduino Mega ADK。 3块处理器之前均已通过I2C链接勿需另外连线。
其中一块Nano作为电机控制以及数据采集,另一块nano用来驱动超声波传感器。Arduino Mega ADK 作为主控板,采集传输数据以及其他扩展模块,另外还有2个无线通讯槽可使用Xbee,蓝牙以及其他通讯模块。另外有8个I/O端口以及8个模拟口3个i2c通讯接口作为Mega ADK 的输入输出。 nano板留有电机驱动的专用端口以及可调旋钮电压输出。
电机驱动篇
用一块Arduino Nano板在GMR板中作为链接电机驱动和电机以及编码器作为动作执行板。我们可以根据不同需求选用不同的电机驱动器,本文将以Dfrobot 双路2X15A 电机驱动板作为电机驱动。

1 电机测试
第一步我们要测试电机,学着使用电机驱动来驱动电机,并调试好正确的正反方向在正式安装电子系统之前,这里我建议先用连个空电机作为测试,不提倡直接在装配好的HCR上测试。
首先如下图所示链接电路,注意电机驱动板需要外接电源,所以如果需要使用其他的电机驱动以及电机时注意GMR的最低供电电压为12V。

电机驱动

电机驱动

其中要注意的是电机的正负,两个电机在实际安装中方向是相反的,但在程序中做这个调整可能会比较混乱,所以我们在连线的时候注意吧两个电机的连线反过来。
然后在Arduino Nano板上烧入电机测试程序 motor_test.ino

int E1 = 9;     //M1 Speed Control
int E2 = 10;    //M2 Speed Control
int M1 = 8;     //M1 Direction Control
int M2 = 11;    //M1 Direction Control

这些变量和电机驱动连线相对应。

digitalWrite(E1,a);
digitalWrite(M1,LOW);    //High and Low determine the direction offthe motor
digitalWrite(E2,b);   
digitalWrite(M2,LOW);

a,b是控制电机转速的变量,最大255,最小0.
HIGH 和LOW控制电机的方向。

在测试电机驱动的同时测试电机的方向为HIGH时电机方向使得车前进为LOW时电机方向使得车后退。两个电机分开测试。

2 霍尔编码器

编码器是一个用来实现电机乃至整个HCR能够精确控制的重要传感器,HCR配套的直流电机提供了一个高精度的霍尔编码器,脉冲数13,可提供输出轴每转663个反馈的脉冲信号。
如下图所示链接电路。

encoder

encoder

然后在 Arduino Nano板上烧入编码器测试程序 encoder_test.ino

const byte encoder0pinA = 2;//A pin ->the interrupt pin 0
const byte encoder0pinB = 4;//B pin ->the digital pin 4

定义编码器2个数字输出的引脚可以根据实际连线调整

void wheelSpeed()

在这个函数中,根据霍尔传感器的特点根据 2个引脚的不同读数以及状态变化判断电机的正反转。

如图连线之后给电机装上轮子,正反装转动轮子,判断编码器程序是否工作以及读数时候正确(正反转)正确的读书是当你轮子为你定义的正转时,编码器读数为正,反之为负,两个电机分开测试,然后结合你的电机驱动程序测试,即电机驱动后正前进时编码器读数为正,反之为负。在这里不列出编码器结合电机驱动的程序。

这一步的驱动十分重要,将直接影响之后的PID电机控制程序工作能否正常。

3 PID 电机控制
结合编码器了得电机驱动程序,利用PID算法之后,一个连续的顺滑的精确电机控制程序就可以实现HCR的定速度运行了,定距离、定角度控制也可以实现。

PID控制器(比例-积分-微分控制器),由比例单元P、积分单元I和微分单元D组成。通过Kp,Ki和Kd三个参数的设定。PID控制器主要适用于基本上线性,且动态特性不随时间变化的系统。

PID控制器是一个在工业控制应用中常见的反馈回路部件。这个控制器把收集到的数据和一个参考值进行比较,然后把这个差别用于计算新的输入值,这个新的输入值的目的是可以让系统的数据达到或者保持在参考值。PID控制器可以根据历史数据和差别的出现率来调整输入值,使系统更加准确而稳定。

PID

PID
根据图1 和图2 链接GMR和电机驱动,电机以及编码器,我们得到了整个电机控制的闭环控制。从代码中仔细核对引脚定义与实际连线,否则在之后的测试中会有错误。
在PID中,一个控制回路包括三个部分:
1.     系统的传感器得到的测量结果
2.     控制器作出决定
3.     通过一个输出设备来作出反应

传感器就是霍尔编码器,控制器就是 Nano,输出设备就是两个电机。

在Arduino Nano中烧入PID电机控制程序Nano_motor_2X15A.ino这个代码包含了I2C部分这部分内容会在之后的章节提及。(2.5 Mega 与 Nano通讯)
从代码中仔细核对引脚定义与实际连线,否则在之后的测试中会有错误。

首先我们会给出一个目标速度,这个就是PID算法中的需求结果。
_speedtarget[LF],_speedtarget[RT]
Nano从霍尔编码器得到脉冲值Lduration和Rduration通过轮子直径等常数带入计算得到实际速度prevspeed。   void ResentSpeed()以及lastspeed()这两个个函数用来计算实际速度。具体可查看代码。
然后我们可以用目标速度减去测量结果来得到误差。

int error = _speedtarget - prevspeed;
用这个误差来计算出对系统纠正值来作为电机输出,这样就可以消除误差。
这个纠正值有三种算法,消除目前的误差,平均过去的误差,和透过误差的改变来预测将来的误差。即PID

比例- 来控制当前,误差值和一个正值的常数P(表示比例)相乘。
在代码中我们只使用_proportion 误差值是 error
error = _speedtarget - prevspeed;
积分 - 来控制过去,将误差值过去一段时间和(误差和)乘以一个正值的常数I。
在代码中我们只使用_integral 误差和sumerror
sumerror += error;
sumerror = min(_maximum,sumerror);//limit the range of intergral segment
sumerror = max(_minimum,sumerror);
微分 - 来控制将来,计算误差的一阶导,并和一个正值的常数D相乘。
在代码中我们只使用_derivative 误差的一阶导 derror
derror = _lasterror - _preverror;
_preverror = _lasterror;
_lasterror = error;

这样我们就得到了纠正值
_proportion*error+_integral*sumerror+_derivative*derror
float TVPIDcal(float prevspeed,booleantarget)这个函数计算了整个过程

int TVAffect(float pidpara)请注意这个函数,他是用来计算最大纠正输出的,使得整个输出在1000到2000的PWM输出范围内
void Motor(int value,byte whichwheel)是纠正输出函数也就是实际的电机控制。
注意有些电机驱动是Pwm=1500时候电机转速为0 小于1500和大于1500的值为不同的转向,Dfrobot的双路电机驱动方式需要由此进行些改变。

PID的三个经验常数已经在代码中给出。

PS:感谢Amber绘图

motor_test.ino

663 Bytes, 下载次数: 1134

encoder_test.ino

1.04 KB, 下载次数: 891

Nano_motor_2X15A.ino

9.18 KB, 下载次数: 889

ambersea  初级技师

发表于 2014-3-10 13:42:53

楼主辛苦了~我能说我厚颜无耻的开始坐等避障部分了么……
回复

使用道具 举报

合乎  初级技匠
 楼主|

发表于 2014-3-10 18:08:17

一天一贴,本周发完
回复

使用道具 举报

Angelo  初级技匠

发表于 2014-3-11 12:20:01

这图画得,太给力了~~
简单明了
回复

使用道具 举报

Holiday  初级技匠

发表于 2014-3-12 10:05:14

这。。。一天一个这么大的帖子,这么强大
:L
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2021 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail