English 中文版
MotorDriverBoard是由 深圳市易创空间科技有限公司,专门针对Arduino Uno(兼容Mega2560)机器人,电机驱动,多路舵机控制而研发的一款多功能电机驱动扩展板。本驱动板采用I2C方式控制PCA9685(16路PWM输出芯片)。所以本驱动板电机或者舵机和arduino主板IO口不存在对应关系,是通过I2C扩展PWM控制,详情请见驱动板原理图。
MotorDriverBoard for Arduino Uno(Arduino Mega2560)
- 支持4路直流电机,最大驱动电流3A
- 支持驱动8路舵机,带自恢复保险丝,防止舵机堵转
- 支持驱动2路4线步进电机
- 支持4路编码电机
- 板载无源蜂鸣器(A0)
- 板载1个RGB全彩灯(A1)
- 1个 i2c接口 、1个PS2X接口、1个Uart(蓝牙/wifi模块)接口 、1个NRF24L01无线模块接口
- 1个超声波模块接口
- 舵机电源可切换到外部供电
- 软件支持Arduino IDE,Mixly,Mind+,Mblock5,MagicBlock(基于Scratch3.0可定制)
为了将本驱动板做到使用更加灵活,适应不同电机,舵机驱动要求,以及整个板子能够稳定运行
我们设计了如下几种供电方案,注意驱动板必须通过锂电池或者8.4V 3A以上的UPS电源供电,不能只Uno主板usb供电或者干电池供电
应用场景:
a、驱动9V以下得直流电机比如TT马达积木电机灯,外加sg90/mg90这种舵机;
b、PS2控制9V~12V的电机时,为了确保PS2不断连,建议使用航模电池或者大电流21700锂电池,两节18650供电不稳定。
c、电源切换开关达到IN(DC)位置,跳线帽短接5V位置
适应场景
a、驱动4路12V以上的电机时比如370电机,520电机,此时舵机为sg90/mg90这种小功率舵机;
b、供电超过Uno DC头12V电压,所以我们需要用接线柱供电,供电范围6~25V;
c、电源切换开关打到EX,跳线帽短接到5V位置,需要短接背面R24电阻位。
a、外部使用MG995/MG996/DS3235/DS3238等大力矩舵机时,数量超过2个时(需要根据实际情况测试),我们需要给舵机独立供电
b、舵机供电电压电流根据舵机参数提供
c、电源切换开关达到IN(DC)位置,跳线帽短接EX位置
下载Arduino库 解压放置Arduino IDE安装目录下的libraries目录下,然后通过点击文件-->示例-->Emakefun_MotorDriverBoard,打开示例程序。
Gpio_test 控制PCA9685输出口当作普通IO口输出高低电平
Emakefun_MotorDriver gpio = Emakefun_MotorDriver(0x60);
gpio.begin(1000); /*初始化io口的输出频率为1KHz*/
gpio.setPin(S1, HIGH); /*引脚S1(S1~S8)输出高电平*/
gpio.setPin(S1, LOW); /*引脚S1(S1~S8)输出低电平*/
PWM_test 这个示例程序为控制PCA9685输出口输出PWM波形
Emakefun_MotorDriver pwm = Emakefun_MotorDriver(0x60);
pwm.begin(1500); /*初始化io口的输出频率为1500Hz*/
pwm.setPin(S1, 1024); /*引脚1输出占空比为 1024/4096 的PWM波(0~4096)*/
PS2_testPS2手柄测试程序
PS2手柄引脚说明:
PS2手柄引脚 | Arduino引脚 |
---|---|
DAT | D12 |
CMD | D11 |
SEL/ATT | D10 |
CLK | D13 |
PS2安装请勿接反,左边是正确安装,右边为PS2接收器接反
DC四路直流电机测试程序
Emakefun_MotorDriver mMotor = Emakefun_MotorDriver(0x60);
Emakefun_DCMotor *DCMotor_1 = mMotor.getMotor(M1);
void setup()
{
Serial.begin(9600);
mMotor.begin(50); /*初始化io口的输出频率为50Hz*/
}
void loop()
{
// 前进
DCMotor_1->setSpeed(200); /*设置速度为200 范围0~255 */
DCMotor_1->run(FORWARD); // 总共FORWARD前进,BACKWARD后退,BRAKE刹车 RELEASE释放四个状态
}
Servo八路舵机测试程序
Emakefun_MotorDriver mMotorDriver = Emakefun_MotorDriver(0x60);
Emakefun_Servo *mServo1 = mMotorDriver.getServo(1);
mMotorDriver.begin(50); /*初始化io口的输出频率为50Hz*/
mServo1->writeServo(S1); /*设置舵机角度 0~180*/
Stepper 步进电机测试程序
Emakefun_MotorDriver mMotorDriver = Emakefun_MotorDriver(0x60);
Emakefun_StepperMotor *StepperMotor_1 = mMotorDriver.getStepper(1, 200);
/*初始化步进电机1,42步进电机走一步是1.8度,所以一圈的步数为200*/
mMotorDriver.begin(1600); /*设置频率为最大 1600*/
StepperMotor_1->setSpeed(400); /*设置步进电机每分钟转的圈数为400圈, 速度越快力矩越小,这个速度不能太低,否则会抖动严重*/
StepperMotor_1->step(200, FORWARD, SINGLE);
/*驱动步进电机按 SINGLE(单步)的方式,FORWARD(前进)200步。*/
/*步进电机的驱动方式 全步DOUBLE、单步SINGLE、1/2步进INTERLEAVE这三种驱动方式(步进电机的驱动原理请查阅相关资料)*/
接线图
不同步进电机的参数接线不一定一样,请一定要先确定步进电机每根线的颜色和对应A+ A- B+ B-相位(或者是A B C D)关系
下图仅供接线参考
Encoder四路编码电机测试程序
编码器关键参数如下:
类型 | 参数 |
---|---|
转速 | 电压6V 空载电流70mA 空载轮轴转速90RPM 电压9V 空载电流150mA 空载轮轴转速140RPM 电压12V 空载电流190mA 空载轮轴转速190RPM |
输出方波类型 | AB相方波 |
基础脉冲 | 12PPR(电机转动一圈输出12个脉冲) |
减速比 | 1:90(转轴转动一圈电机转动90圈) |
通过上面参数可知,轮子旋转一圈,总共需要计数90x12=1080个脉冲
mMotorDriver.begin(); /*初始化io口的输出频率默认为最大*/
EncodeMotor_1->setSpeed(100); /*设置速度为100*/
EncodeMotor_1->run(BACKWARD);
/*控制电机运行状态(FORWARD(前)、BACKWARD(后)、BRAKE(停止))*/
测试四个编码电机都都能够旋转,打开串口我们要能打印出Encoder1Pulse,Encoder2Pulse,Encoder3Pulse,Encoder4Pulse四个脉冲值如下,证明编码电机都是正常工作的。
start
Encoder1Pulse:1
Encoder2Pulse:1
Encoder3Pulse:1
Encoder4Pulse:1
Encoder1Pulse:2
Encoder2Pulse:2
Encoder1Pulse:3
Encoder_pid编码电机PID控制电机速度
PID myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd, DIRECT);
- Input:PID的输入(编码电机速度)
- Output:PID的输出(编码电机速度)
- Setpoint:PID的目标值
- Kp:PID的比例系数
- Ki:PID的积分系数
- Kd:PID的微分系数
- DIRECT:方向参数,编码电机正转
- REVERSE:方向参数,编码电机反转
myPID.SetSampleTime(100); /*设置PID采样时间为100ms*/
myPID.SetMode(AUTOMATIC); /*设置PID模式为AUTOMATIC*/
Emakefun_EncoderMotor *EncodeMotor_1 = mMotorDriver.getEncoderMotor(1); /*获取编码电机1*/
mMotorDriver.begin(); /*初始化io口的输出频率默认为最大*/
EncodeMotor_1->init(encoder1); /*初始化encoder1为编码电机1的回调函数(计算编码盘的脉冲)*/
MsTimer2::set(100, EncoderSpeed); /*定时器2定时获取编码电机速度*/
MsTimer2::start(); /*启动定时器2*/
注意
由于我们测试使用的是8.4V锂电池,大部分电池电压在7~8V之间,我们实际测速只有100RPM,采样时间为100ms,那么计算出每个周采样周期的最大采样脉冲数为100x90x12x(0.1s)/60=180Pluse/samptime。被控制量的范围为0~255,得出采样比例系数为ratio = 255/180 = 1.5。这个比例参数是可以自己定义的,你们可以根据自己的习惯来定义,我这个测试程序为了方便理解,把目标值和PWM控制量0~255关联起来,即控制目标范围也为0~255。
第一步:纯比例作用整定
由于是第一次进行PID参数整定,电机速度整定到100为目标,在程序中输入设定值。先把系统设定为纯比例作用,即只有比例增益Kp不为0,积分增益Ki和微分增益Kd都暂时设定为0。因为是这个小车第一次整定参数,也不知道什么比例增益比较好。比例作用从弱到强调节,随便写了个自认为不大的值3,打开工具-->串口绘图器。运行结果令我大吃一惊,电机以一定的周期在转和不转之间震荡。根据现象得知,肯定是比例作用已经非常大了,因此赶紧将比例增益调整为2,小车的电机不再出现剧烈的“抽搐”,开始以一种比较缓慢的姿态转动,但通过观察输出波形,还是存在较小的波动,并且经过1,2分钟之后,还是会有大幅度震荡。但与之前较大比例作用下的震荡相比,显然“温柔”多了。于是继续降低比例作用,直至Kp = 1时,输出波形已经相较其他参数下稳定很多了,如下图:
第二步:比例积分作用
由上图可看出,一个适合的比例作用可以使系统趋于稳定,但却无法消除静态偏差,因此需要引入积分作用,其最大的好处就是可以消除静态偏差。笔者继续采用由小逐渐加大积分增益的方式。当设定Ki = 5时,由图可见
静态偏差逐渐减小,输出的速度越来越接近设定的速度100的目标,不过调节速度太慢,还是不能满足需求。 于是还需要继续加积分作用,当Ki = 6时,可以看出,系统反应速度已经很快,可以在0.1秒内
接线图
编码电机我们使用的是6pin的GH1.25转PH2.0线材接线如下:
蓝牙或者wifi模块请使用数据透传模块,连接到arduino的硬件串口引脚上(0-RXD,1-TXD)
-
Mixly云端安装(只适合mixly2.0)
第一步
第二步
第三步
第四步 当看到一下界面,就证明安装成功。
-
本地安装
2.1 下载Mixly扩展包,解压;
2.2 导入本地库;步骤如下:
步骤一
步骤二
步骤三
当看到一下界面,就证明安装成功。
2.积木描述
注: PS2、RGB灯、蜂鸣器等模块请使用Mixly自带的模块。
-
Mblock5库安装
1.1 下载Mblock5库,解压
1.2 将解压后的ext_motordriverboard.mext扩展包拖到Mblock5软件里面,能看到以下界面,证明安装成功。
- 积木描述
注: PS2、RGB灯、蜂鸣器等模块可以去Mblock扩展库找对应的扩展,这里不做解释。
-
将解压后的emakefun-motordriverboard-thirdex-V0.0.3.mpext扩展包导入到Mind+软件里面
第一步:点击扩展 第二步:选择主控板 第三步:导入用户库 第四步:加载并返回 第五步:查看并使用用户库,看到如下界面,说明已成功导入电机驱动板扩展包。 -
积木描述
敬请期待
A :本驱动板采用I2C方式控制PCA9685(16路PWM输出芯片)。所以本驱动板电机或者舵机和arduino主板IO口不存在对应关系,是通过I2C扩展PWM控制
A :如果用Uno的DC头供电,最大能够驱动12V 3A的电机,如果是驱动板上的接线柱供电,可以最大驱动16V 3A的电机。我们供电必须要先知道电机的额定电压是多少,比如额点电压是6V-1A,那么我们供电就只能是8.4V锂电池供电(如果用用12V供电有概率会烧电机),如果额定电压是12V的电机,那么供电也要用三节锂电池11.1V的电池。总之电机额定电压和电流不要和实际供电电源相差很大,否则驱动不了电机。
a、驱动板是否使用7V以上锂电池供电且正常,板子上Power灯是否亮起 b、下载直流电机驱动测试程序确保要上传成功,电机接线正确,来确定板子驱动正常 c、直接把锂电池的电压加到直流电机上,来证明电机是好的。 d、通过上传PS2接收测试程序,来证明PS2遥控器是好的 e、前面正确后下载PS2控制四驱小车程序,并按按键控制电机
A :有,点击这里驱动板原理图。
1、电源切换开关接触不良,用万用表点一下确定,检测是否有5V电源输出
2、4个直流电机里面其中一部分转,一部分不转,有可能对应的驱动芯片烧坏
3、四个电机,舵机都不转,使用I2C 扫描程序测试,看是否能扫描到PCA968A的I2C地址,如果扫描不到PCA8685损坏
技术 + 合作:WX: null-lab