爱折腾-创客智造实验室 - Arduino电机及驱动
通过Arduino电机及驱动学习，了解Arduino电机及驱动原理，使用说明
Arduino直流电机驱动-L298P Shield 2A大电流双路直流电机驱动扩展板
外观 简 介 L298 Shield是Arduino兼容的一款大电流电机驱动；控制端口为4个，减少对Arduino数字端口的开销，不但起到节约控制器端口，而且控制程序也更为简单。 电机供电采用跳线选择Arduino VIN供电还是外接电源供电。 L298 Shield大功率直流电机驱动器采用LGS公司优秀大功率电机专用驱动芯片L298P，可直接驱动2个直流电机，驱动电流最大达2A。 该电路线路布线合理、均采用贴元件片、体积小、方便安装，输出端采用高速肖特基二极管作为保护。 注意： IOREF引脚： 由于在V1.2版的设计中，添加了IOREF引脚，该引脚连接在5V口。因此，当DRI0009插在底层主控板上后，如果您的主控板的工作电压不是5V，如3.3V，建议您将DRI0009上的IOREF引脚用剪刀剪断，或者用用硬物划断PCB板上它们之间的接线，否则可能引起工作不正常或主控板烧坏等意外状况。如果主控板操作电压是5V，您可以放心使用。 产品参数 1．逻辑部分输入电压VD：5V 2．驱动部分输入电压VS：4.8～35V 3．逻辑部分工作电流Iss：≤36mA 4．驱动部分工作电流Io：≤2A 5．最大耗散功率：25W（T=75℃） 6．PWM、PLL两种驱动模式 7．控制信号输入电平： 高电平：2.3V≤Vin≤5V 低电平：-0.3V≤Vin≤1.5V 8．工作温度：-25℃～＋130℃ 9．驱动形式：双路大功率H桥驱动 Arduino控制端口：数字口4,5,6,7 11．模块重量：约29g 引脚说明 把L298 Shield插到Arduino控制器上，程序编写也很简单， M1、M2表示2个电机；电源分别使用9V电池和电机动力电池。 注意：控制器的电源地必须和电机驱动共地。 控制方式选择：分PWM模式和PLL模式。2种方式区别在于，PWM模式调速信号控制的是L298的 E1和E2使能端，PLL模式调速信号控制的是L298的M1和M2转向端。如下图所示，PLL和PWM都标注出了对应的控制引脚。出厂默认设置为PWM模式，短路帽在PWM端上。 电机端口：蓝色接线柱M1和M2分别可以接2个电机，插针1,2,3,4和蓝色接线柱功能一致。 外接电源端口：电机额定电压或电流大于Arduino最大输入时，可以使用外接电源单独给电机供电，VIN接电源正，GND接电源地。 控制信号真值表： E1 M1 E2 M2 L X 电机1控制禁止 H H 电机2控制禁止 H H 电机1反转 H H 电机2反转 H L 电机1正转 H L 电机2正转 PWM X 对电机1调速 PWM X 对电机2调速 注：H表示高电平1；L表示低电平0；PWM表示脉宽调制信号；X表示任意电平。 "PWM 模式" 引脚 功能 数字脚 4 电机1转动方向控制 数字脚 5 电机1转速控制 数字脚 6 电机2转速控制 数字脚 7 电机2转动方向控制 "PLL 模式" 引脚 功能 数字脚 4 电机1转动控制 数字脚 5 电机1转动方向控制 数字脚 6 电机2转动方向控制 数字脚 7 电机2转动控制 使用教程 连线图 外接电源与板内VIN电源选择端口：当2个短路帽插到右边时（VIN），电机电源就是使用Arduino板上VIN端输入的电源，如下图。 当2个短路帽插到左边时（PWRIN），就使用外接电源端口输入的电源，如下图。 我们可以控制M1和M2两个直流电机的正转，反转，停止，以及PWM调速。 样例代码 int E1 = 5; int M1 = 4; int E2 = 6; int M2 = 7; void setup() { pinMode(M1, OUTPUT); pinMode(M2, OUTPUT); } void loop() { int value; for(value = 0 ; value <= 255; value+=5) { digitalWrite(M1,HIGH); digitalWrite(M2, HIGH); analogWrite(E1, value); //PWM调速 analogWrite(E2, value); //PWM调速 delay(30); } } 结果 两个电机会同时慢慢地转动起来，而且速度越来越快。到达一定速度又会停下来，然后又会像之前一样。 疑难解答 PWM调速是通过调整空占比来模拟不同电压值，从而控制加到电机两端的电压高低来实现调速。 本文整理于DFRobot wiki
外观 简介 这个直流电机驱动模块是为了做ROBOT而开发的东东。当然，如果你有更好的想法，比如用于驱动步进电机也行。 我们做ROBOT的想法是：把大部分功能集成化，使得做机器人更加方便。 DF-MD V1.3是续DF-MD V1.0之后的第3次改版，每一次改版其性能方面有很大的提升，DF-MDV1.3在原来的基础上增加了散热器，可以承受更大的电流；控制端口由原来的6个改为4个，不但可以节约控制器端口，而且控制方式也更为简单。 DF-MD V1.3大功率直流电机驱动器采用LGS公司优秀大功率电机专用驱动芯片L298N，可直接驱动直流电机，驱动电流达2A。 该电路线路布线合理、均采用贴元件片、体积小、方便安装，输出端采用高速肖特基二极管作为保护。 产品参数 1．逻辑部分输入电压VD：6.5～12 V 2．驱动部分输入电压VS：4.8～35V 3．逻辑部分工作电流Iss：≤36mA 4．驱动部分工作电流Io：≤2A 5．最大耗散功率：25W（T=75℃） 6．控制信号输入电平： 高电平：2.3V≤Vin≤5V 低电平：-0.3V≤Vin≤1.5V 7．工作温度：-25℃～＋130℃ 8．驱动形式：双路大功率H桥驱动 9．模块尺寸：47 mm × 53mm 10．模块重量：约29g 引脚说明 引脚说明图 电机接口 M1，M2 可接入两个电机，其中标注了“+”、“-”表示两个电机的正负极。 指示灯 PWR: 电源指示灯 电机指示灯：电机正常工作，指示灯会亮起。 电源说明 VD: 逻辑电源输入，输入电压范围建议为6.5V～12V; VS: 电机驱动电源输入，输入电压范围建议为4.8～46V; GND: 逻辑电源和电机驱动电源的公共地。 电源切换跳帽 电源切换跳冒 当跳冒插上时，逻辑电源和电机驱动电源相通。 如果电机驱动电源(VS)输入小于12V时，就可以将此跳线短接。 如果电机驱动电源(VS)输入大于12V时，不可将此跳冒短接。 电机控制端口 E1,E2: 分别为两个电机控制的使能端(可使用PWM调速)。 M1,M2: 正反转控制信号输入端。比如，M1=0，M1电机正转;M1=1，M1电机反转。 E M 执行 LOW LOW/HIGH 电机禁止 HIGH HIGH 电机反转 HIGH LOW 电机正转 PWM LOW/HIGH 电机调速 注: LOW = 0; HIGH = 1; PWM = 0~255 使用教程 这个简单实例告诉你如何使用L298N双路电机驱动板驱动两个直流电机。 连线图 实例连线图 样例代码 int E1 = 6; int M1 = 7; int E2 = 5; int M2 = 4; void setup() { pinMode(M1, OUTPUT); pinMode(M2, OUTPUT); } void loop() { int value; for(value = 0 ; value <= 255; value+=5) { digitalWrite(M1,HIGH); digitalWrite(M2, HIGH); analogWrite(E1, value); //PWM调速 analogWrite(E2, value); //PWM调速 delay(30); } } PWM调速原理 PWM调速是通过调整空占比来模拟不同电压值，从而控制加到电机两端的电压高低来实现调速。 本文整理于DFRobot wiki
概述 Arduino控制器兼容的电机驱动扩展板,支持双路电机控制,单路最大电流可达1A。 Arduino标准插针设计接口,可与其他扩展板模块叠层配合使用。可应用于小型移动机器人的开发。 技术规格 驱动芯片：L293B 逻辑工作电压：5V DC 电机驱动电压：7-12V DC 最大驱动电流：1A（每路） 电机驱动使用引脚：PIN4/5/6/7（Arduino控制器） 平面尺寸：56x57mm 连线图 引脚分配图 Pin Function Digital 4 Motor 2 转向控制，高电平正转，低电平反转 Digital 5 Motor 2 PWM调速控制，范围0-255,0电机停转，255电机最大速度 Digital 6 Motor 1 PWM调速控制，范围0-255,0电机停转，255电机最大速度 Digital 7 Motor 1 转向控制，高电平正转，低电平反转 示例代码 //This motor shield use Pin 6,5,7,4 to control the motor // Simply connect your motors to M1+,M1-,M2+,M2- // Upload the code to Arduino/Roboduino // Through serial monitor, type 'a','s', 'w','d','x' to control the motor // www.dfrobot.com // Last modified on 24/12/2009 int EN1 = 6; int EN2 = 5; //Roboduino Motor shield uses Pin 9 int IN1 = 7; int IN2 = 4; //Latest version use pin 4 instead of pin 8 void Motor1(int pwm, boolean reverse) { analogWrite(EN1,pwm); //set pwm control, 0 for stop, and 255 for maximum speed if(reverse) { digitalWrite(IN1,HIGH); } else { digitalWrite(IN1,LOW); } } void Motor2(int pwm, boolean reverse) { analogWrite(EN2,pwm); if(reverse) { digitalWrite(IN2,HIGH); } else { digitalWrite(IN2,LOW); } } void setup() { int i; // for(i=6;i<=9;i++) //For Roboduino Motor Shield // pinMode(i, OUTPUT); //set pin 6,7,8,9 to output mode for(i=4;i<=7;i++) //For Arduino Motor Shield pinMode(i, OUTPUT); //set pin 4,5,6,7 to output mode Serial.begin(9600); } void loop() { int x,delay_en; char val; while(1) { val = Serial.read(); if(val!=-1) { switch(val) { case 'w'://Move ahead Motor1(100,true); //You can change the speed, such as Motor(50,true) Motor2(100,true); break; case 'x'://move back Motor1(100,false); Motor2(100,false); break; case 'a'://turn left Motor1(100,false); Motor2(100,true); break; case 'd'://turn right Motor1(100,true); Motor2(100,false); break; case 's'://stop Motor1(0,false); Motor2(0,false); break; } } } } 相关文档 原理图 示例代码 本文整理于DFRobot wiki
外观 概述 Veyron 威龙系列电机驱动器是DFRobot推出的新一代智能电机驱动器，产品线涵盖直流有刷电机驱动器、直流无刷电机驱动器及步进电机驱动器。 其中Veyron 2x25A为直流有刷电机驱动器。 拥有智能的接口方式：包含模拟电压（Analog）、脉宽信号（PPM）及UART接口。 完善的保护功能：欠电压、过电压、过电流、过热、短路、电压反接等保护功能。 简易的操作方式：一键接口选择、开/闭环自动识别、PID参数自整定等功能，极大程度简化了用户的操作。 电气特性 输入电压范围 ：DC 6~36V，极限电压为40V 使用镍氢或镍镉电池组 ：5节-30节 使用锂聚合物电池组 ：2节-8节 单路最大允许连续电流 ：25A 单路最大允许尖峰电流 ：30A 电源端子定义 M1A ：第1路电机引线A M1B ：第1路电机引线B B+ ：外部直流电源输入+ B- ：外部直流电源输入- M2A ：第2路电机引线A M2B ：第2路电机引线B 编码器端子定义 与MxA/MxB同侧的编码器端子为Mx电机编码器接口 A ：编码器A相脉冲信号输入 B ：编码器B相脉冲信号输入 GND ：驱动器逻辑地 VCC ：驱动器DC-5V电源输出 通讯端子定义 GND ：驱动器逻辑地 5V ：驱动器DC-5V/1A电源输出 S1 ： 在Analog接口模式下，为M1模拟电压量输入 在PPM接口模式下，为M1脉宽信号输入 在UART接口模式下，为驱动器Rx S2 ： 在Analog接口模式下，为M2模拟电压量输入 在PPM接口模式下，为M2脉宽信号输入 在UART接口模式下，为驱动器Tx 散热风扇端子定义 散热风扇仅有2PIN，分别为5V电源输出和可控连接的驱动器逻辑地。可直接连接5V的散热风扇（最大提供电流500mA），或通过继电器控制大功率的散热风扇。 指示灯定义 Reverse ：电源反接保护指示灯（红色） Set ：设置模式指示灯（绿色） Analog ：模拟模式指示灯（绿色） PPM ：脉宽模式指示灯（绿色） UART ：UART模式指示灯（绿色） Status1 ：（黄色） 在Analog和PPM模式下，该指示灯的亮度指示M1转速大小 在UART模式下，该指示灯在驱动器接收数据时亮，空闲时灭 Status2 ：（黄色） 在Analog和PPM模式下，该指示灯的亮度指示M2转速大小 在UART模式下，该指示灯在驱动器发送数据时亮，空闲时灭 Error ：故障指示灯（红色），并非只有指示故障的功能，下文将在应用时具体分析 KEY设置按键说明 可通过按该按键来调节驱动器的工作模式，可在Set、Analog、PPM、UART四个模式中切换，相应的指示灯指示将要进入的工作模式。在模式切换过程中，只有当前模式与驱动器内部保存的模式不一致时，驱动器才进行自动复位，进入新的工作模式。 接口类型 Analog（两路模拟电压信号输入）：电压范围0-5V（通常情况下外接电位器，在条件允许的前提下，建议用户在模拟电压输出端加一个电压跟随器；或使用PWM+滤波电路实现电压输出）。 PPM（两路脉宽信号输入）：信号源可由模型遥控接收机直接产生，或自行使用单片机产生。 UART：支持10种常用波特率，同时兼容3.3V及5V系统。 控制模式 速度开环控制模式：该模式适用于无编码器的电机控制，根据控制量定性控制电机的转速。 速度闭环控制模式：该模式适用于带编码器的电机控制，通过UART接口设置编码器及减速器的相关参数，实现速度闭环控制。 保护功能 在UART接口模式下，可通过“GER”获取故障信息指令，查询故障源，详情请参考驱动器指令集。 在PPM与Analog接口模式下，可通过Set、Analog、PPM、UART指示灯的组合判断故障源，如下表所示（注：发生任何一种故障，电机将停止工作，进入故障模式，此时，用户将无法控制电机。在UART接口模式下，可通过“CER”清除所有故障信息指令恢复正常工作模式，在PPM与Analog模式下，只能通过复位驱动器方可消除故障信息）： Set Analog PPM UART Error Error Sources Lower Voltage Over Voltage Over Temperature M1 Over Current M2 Over Current Control Signal Lost 电源反接保护功能，若电源反接，电源反接指示灯（Reverse）亮，以示故障源。 可设定阈值的欠电压和过电压保护，倘若输入电压超出设定范围，故障指示灯（Error）亮，驱动器进入故障模式。 可设定的最大允许连续电流保护功能。实际电流大于最大允许连续电流，且小于最大允许尖峰电流，允许持续时间为2s，大于2s，故障指示灯（Error）亮，驱动器将进入故障模式。 可设定的最大允许尖峰电流保护功能。实际电流大于最大允许尖峰电流，允许持续时间为400ms，大于400ms，故障指示灯（Error）亮，驱动器进入故障模式。 可设定的最大允许温度保护功能。监测驱动器内部的温度，当温度高于40℃而小于极限温度，驱动器在自动散热接口输出5V电源，直到温度降低至35℃。当内部温度超过设定的极限温度，故障指示灯（Error）亮，驱动器进入故障模式。 在UART和PPM模式下，可通过“SSM”设置控制信号模式指令将驱动器设置为间断模式，若在规定时间内无有效控制信号，故障指示灯（Error）亮，驱动器将进入故障模式。 驱动器可以运行在单向或双向控制模式，在单方向控制模式下，可通过“SSD”启动零信号检测与否指令使能驱动器的启动零信号检测功能，当驱动器重启后，若初始信号不为零信号（即零速度信号），驱动器将停止，直到将控制信号调至零信号，驱动器方可进入正常工作模式。 实践攻略 至此，或许您还不知该如何使用这款驱动器，或许您会觉得有点繁琐，或许……，那都只是“或许”罢了，接下来笔者将带您认识这款简单易用的智能双路直流有刷电机驱动器。在这部分内容的开始，先对几个控制相关的辅助参数做一简要说明，有个大致的了解，具体内容请参考指令集部分： 方向模式：该参数仅在PPM及Analog模式中有效，决定电机运行时，是单方向运行还是双方向运行。 启动零信号检测：该参数仅在PPM及Analog模式中，且方向模式为单方向时有效，决定驱动器在意外复位时，是否使能启动零信号检测保护。 控制信号模式：该参数仅在UART及PPM模式中有效，配合“间断模式时限”参数使用，决定电机运行过程中，丢失控制信号时，是否停止。 此外对驱动器出厂默认值也做一简要介绍： Common Parameters ID : 1（驱动器地址） BaudRate : 57600bps（波特率） Voltage Range : 6.0-36.0V（电压范围） Maximum Continuous Current : 25000mA（最大允许连续电流） Maximum Peaky Current : 30000mA（最大允许尖峰电流） Protected Temperature : 100C（最高允许温度） Signal Mode : Continuous（控制信号模式，默认为连续模式） PPM Signal Range : 500-2500us（PPM极值） PWM Type : Hpwm-Lpwm(on-off-on)（PWM产生方式） Direction Type : CW/CCW（方向模式，默认为双向模式） Discontinuous Timeout : 1000ms（间断模式时限） Start Detection Mode : Non Zero Detection（启动零信号检测，默认为不使能） Parameters Of Motor1 Reduction Gear Ratio : 1.00（减速比） Encoder Resolution : 1（编码器线数） Maximum Velocity : 1000（最高转速） Velocity Mode : Unloop（控制模式，默认为开环） Acceleration : 100（加速度） Deceleration : 100（减速度） PID_Kp : 0.000（比例项参数） PID_Ti : 0（积分项参数） PID_Td : 0（微分项参数） Parameters Of Motor2 Reduction Gear Ratio : 1.00（减速比） Encoder Resolution : 1（编码器线数） Maximum Velocity : 1000（最高转速） Velocity Mode : Unloop（控制模式，默认为开环） Acceleration : 100（加速度） Deceleration : 100（减速度） PID_Kp : 0.000（比例项参数） PID_Ti : 0（积分项参数） PID_Td : 0（微分项参数） UART接口 倘若您手头的驱动器是全新的驱动器，上电过程中，将看到如下现象：三个指示灯Set、UART、Error同时亮2s后，指示灯Set与Error熄灭。说明当前模式为UART模式。此前三个灯同时亮时，Error指示灯是为了指明当前的指示状态为波特率指示状态，非接口模式指示。波特率与指示灯状态的关系如下表所示： Set Analog PPM UART Error BaudRate(bps) 1200 2400 4800 9600 14400 19200 28800 38400 57600 115200 开环控制模式 连接好线缆，如下图所示（当然，若仅需控制一个电机，连接一个即可）： 在UART开环控制模式下，与实际控制相关的设置参数如下： 波特率、驱动器地址、PWM信号产生方式、同步转速、异步转速、执行异步转速、加速度、减速度、控制信号模式、间断模式时限、最大允许连续电流、最大允许尖峰电流、最高允许温度、极限电压。请结合指令集，根据需求予以配置，当配置结束后，就可以通过发送相关指令对电机进行控制。 闭环控制模式 连接好线缆，如下图所示（当然，若仅需控制一个电机，连接一个即可）： 在UART闭环控制模式下，与实际控制相关的设置参数如下：波特率、驱动器地址、编码器线数、减速比、PWM信号产生方式、最高转速、同步转速、异步转速、执行异步转速、加速度、减速度、控制信号模式、间断模式时限、PID参数、最大允许连续电流、最大允许尖峰电流、最高允许温度、极限电压。 配置好编码器线数、减速比等相关参数。 按几次侧面KEY按键，次数取决于当前模式，若当前模式为UART，只需按三次，Set指示灯亮，进入设置模式。此时，指示灯Status1闪烁（与UART模式无关），接着指示灯Status2闪烁（与UART模式无关）。 M1开始旋转（注意：由于控制速度的指令，是通过正负号区分电机旋转的方向，规定此时电机旋转的方向为正方向），当驱动器检测到编码器信号后，将自适应编码器A/B相序，接着对M1进行PID自整定，M1逐渐从振荡状态转向稳态，完成M1的PID参数自整定，接着，对M2进行PID参数自整定。 驱动器自动复位，进入默认的UART模式。 可以使用（RS232转UART或USB转UART），通过串口助手，发送 “RCONFIG” 读取驱动器配置参数指令，查询所有掉电保存在驱动器内部的参数，此时会发现，接有编码器的电机参数中Velocity Mode变为loop，此外，必须注意一点，在实际转速控制的过程中， 目标速度不得设为大于最高转速的值，否则指令将不予以响应。 请结合指令集，根据需求予以配置，当配置结束后，就可以通过发送相关指令对电机进行控制。 PPM接口 PPM接口，非常重要的一个参数就是PPM极值。 该极值的设定有两种方式：其一，是通过UART接口，发送指令予以设置；其二，是在Set设置模式下，当指示灯Status1与Status2闪烁过程中，使用模型遥控器控制的用户，将对应的摇杆在两个极限位置分别停留3s左右，驱动器将自动识别阈值，此过程中，若S1、S2均有正确的脉宽信号输入，驱动器将结合两路的信号，计算出可靠的极限值，若仅有一路有正确脉宽信号输入，则驱动器就使用该路信号作为最终的极限值依据。 当然也可以通过单片机发送两个极限位置的脉宽信号，不过，不论采用哪种方法，PPM的极限值都不得超出500us-2500us范围。由于PPM接口，除了PPM极值外，其它配置参数均不可直接设置，欲设置相关参数，需先使用UART接口进行配置。 所有的故障信息，需结合上文1.10 保护功能中的对照表查询故障源。 此外，不论开环或闭环控制模式，PPM信号与电机转速的关系都符合下图的描述（注：信号低于最小极限值或高于最大极限值，驱动器将不予以响应）。 开环控制模式 连接好线缆，如下图所示（当然，若仅需控制一个电机，连接一个即可，5V是否需要连接根据实际情况而定）： 在PPM开环控制模式下，与实际控制相关的参数如下：方向模式、PWM信号产生方式、启动零信号检测、PPM极值、控制信号模式、间断模式时限、最大允许连续电流、最大允许尖峰电流、最高允许温度、极限电压。 请结合指令集，根据需求予以配置，当配置结束后，即可通过发送脉宽信号，对电机进行控制。 闭环控制模式 连接好线缆，如下图所示（当然，若仅需控制一个电机，连接一个即可，5V是否需要连接根据实际情况而定）： 在PPM闭环控制模式下，与实际控制相关的参数如下：编码器线数、减速比、方向模式、PWM信号产生方式、启动零信号检测、PPM极值、控制信号模式、间断模式时限、PID参数、最大允许连续电流、最大允许尖峰电流、最高允许温度、极限电压。 使用UART接口配置好编码器线数、减速比等相关参数。 通过侧面KEY按键，进入Set设置模式（Set指示灯亮）。接着，指示灯Status1和Status2相继闪烁（具体如何设置PPM极值，在PPM接口开始部分已说明）。 M1开始旋转（注意：将当前方向规定为正方向，若方向模式为双向模式，当PPM信号介于S_Middle~S_Max电机正方向运行，当PPM信号介于S_Min~S_Middle则反方向运行），当驱动器检测到编码器信号后，将自适应编码器A/B相序，接着对M1进行PID自整定，M1逐渐从振荡状态转向稳态，完成M1的PID参数自整定，紧接着，对M2进行PID参数自整定。 驱动器自动复位，进入默认的UART模式，再通过KEY按键，将模式切换到PPM模式。 最后，确认所有参数都配置完毕后，即可通过发送符合要求的脉宽信号，对电机进行控制。 Analog接口 Analog是最为简单的接口模式，常作为测试驱动电路是否良好的方法。 相比以上两种接口，唯一需要注意的一个细节就是，若用户使用电位器调节电机转速，方向模式为双向，并且要求电位器机械位置对称性高（即电位器可旋转的机械范围内，一半为正方向运行，另一半反方向运行），此时电位器的输出端建议采用电压跟随器输出，当然，用户也可以通过单片机产生PWM信号+滤波电路，或者采用专用的DAC芯片实现电压信号的可控输出。 此外，不论开环或闭环模式，控制电压值与电机转速的关系都符合下图的描述。 开环控制模式 连接好线缆，如下图所示（当然，若仅需控制一个电机，连接一个即可，5V是否需要连接根据实际情况而定）： 在Analog开环控制模式下，与实际控制相关的参数如下：方向模式、PWM信号产生方式、启动零信号检测、控制信号模式、间断模式时限、最大允许连续电流、最大允许尖峰电流、最高允许温度、极限电压。 请结合指令集，根据需求予以配置，当配置结束后，即可通过电压信号，对电机进行控制。 闭环控制模式 连接好线缆，如下图所示（当然，若仅需控制一个电机，连接一个即可，5V是否需要连接根据实际情况而定）： 在Analog闭环控制模式下，与实际控制相关的参数如下：编码器线数、减速比、方向模式、PWM信号产生方式、启动零信号检测、控制信号模式、间断模式时限、PID参数、最大允许连续电流、最大允许尖峰电流、最高允许温度、极限电压。 使用UART接口配置好编码器线数、减速比等相关参数。 通过侧面KEY按键，进入Set设置模式（Set指示灯亮）。接着，指示灯Status1和Status2相继闪烁（与Analog接口模式无关）。 M1开始旋转（注意：将当前方向规定为正方向，若方向模式为双向模式，当电压信号介于2.5~5V电机正方向运行，当电压信号介于0~2.5V则反方向运行），当驱动器检测到编码器信号后，将自适应编码器A/B相序，接着对M1进行PID自整定，M1逐渐从振荡状态转向稳态，完成M1的PID参数自整定，紧接着，对M2进行PID参数自整定。 驱动器自动复位，进入默认的UART模式，再通过KEY按键，将模式切换到Analog模式。 最后，确认所有参数都配置完毕后，即可通过0~5V电压信号，对电机进行控制。 指令集 V1.0 该版本指令集系统，共44条指令，不区分大小写，所有的指令，不论发送或者返回，都将以“回车+换行符（\r\n）”作为指令结束符。所有的系统参数可归纳为即变参数和非即变参数，这些参数，在响应“读取驱动器配置参数”指令时返回的，掉电均会保存（EEPROM），其余的参数掉电均会丢失（RAM）。 即变参数是指用户一旦设置将立即生效（注：需执行“EEPSAV”保存当前所有配置参数指令，方可保证掉电不会丢失），具体包括每路电机的加/减速度、PID参数、同步转速以及异步转速（注：同步转速和异步转速将在下文进行详细说明）。 非即变参数是指只有将设置的参数保存到EEPROM中， 并且系统重新复位后，方可生效的参数。 为便于用户程序解析返回指令包，纵观该驱动器的指令集，除“读取驱动器配置参数”指令外，所有的配置参数读取，均为单参数形式。下文将以地址为1的驱动器对每条指令进行较为细致地分析： 查询驱动器类型（ID,PING\r\n） Veyron系列电机驱动器，均可通过该指令查询驱动器的类型，例如：对直流有刷电机驱动器发送该指令，将返回“BDC\r\n”。 *发送：1,PING\r\n *返回：BDC\r\n 读取驱动器配置参数（ID,RCONFIG\r\n） 通过该指令，将获得驱动器的所有配置参数，在对参数进行设置后，可通过该指令查询参数是否已按要求更改，若已更改，且需将当前参数保存在EEPROM中，便可通过下文提到的“保存当前所有配置参数”指令进行参数保存。 *发送：1,RCONFIG\r\n *返回：（驱动器所有配置参数） 恢复出厂设置（ID,FCONFIG\r\n） 通过该指令将驱动器所有配置参数还原为出厂设定值，驱动器收到该指令后将自动复位，并使能出厂配置参数。 *发送：1,FCONFIG\r\n *返回：无 查询帮助（ID,HELP\r\n） 通过该指令获取DFRobot产品线的wiki地址，用户在该页面搜索驱动器的型号，即可查阅对应的使用文档。 *发送：1,HELP\r\n *返回：（DFRobot产品线的wiki地址） 保存当前所有配置参数（ID,EEPSAV\r\n） 通过该指令保存当前配置参数，在保存之前，请使用“读取驱动器配置参数”指令确认驱动器当前配置参数是否为设定值，当驱动器收到该指令后将自动复位，并使能最新配置参数。 *发送：1,EEPSAV\r\n *返回：无 设置波特率（ID,SBR,******\r\n） 该驱动器支持10种常用波特率，分别为1200、2400、4800、9600、14400、19200、28800、38400、57600、115200，出厂默认值为57600。 例如将波特率设置为115200 *发送：1,SBR,115200\r\n *返回：无 设置驱动器地址（ID,SNA,\r\n）* 驱动器地址的取值范围为1~126，出厂默认值为1。当多个驱动器并行使用时，不允许总线中存在两个相同地址。不同的地址的驱动器，同时接收主机发送的指令，只有跟自身地址相同或为0（广播）才响应。 例如将驱动器的地址设置为8 *发送：1,SNA,8\r\n *返回：无 **获取编码器累计脉冲数（ID,GEP,\r\n）* 通过该指令可获取编码器的累积脉冲数，范围为：-2147483648~2147483647，驱动器对相位相差90°的编码器脉冲信号进行4倍频处理，即实际编码器若为200线，驱动器通过内部的硬件会将其变为200x4=800线，目前该驱动器仅支持增量式编码器。 例如获取M1的编码器累计脉冲数 *发送：1,GEP,1\r\n *返回：（实际累计脉冲数，注意有正负之分，符号即为方向） **清零编码器累计脉冲数（ID,CEP,\r\n）* 通过该指令可将指定的某一路电机编码器累计脉冲数清零。 例如将M1的编码器累计脉冲数清零 *发送：1,CEP,1\r\n *返回：无 设置编码器线数（ID,SER,****,####\r\n） 通过该指令可设定两路电机（M1/M2）的编码器线数，注意：设置编码器线数时，两路必须同时设定，不能单独设定某一路。出厂默认值为1。 例如将M1的编码器线数设为100，将M2的编码器线数设为200 *发送：1,SER,100,200\r\n *返回：无 设置减速比（ID,SGR,****,####\r\n） 通过该指令可设置两路电机（M1/M2）减速器的减速比，实际控制及输出的转速即为实际负载转速。用户亦可将其设置为1，以获取电机最真实的转速信息。此外，驱动器支持小数的减速比，精确到小数点后2位。出厂默认值为1。 例如将M1的减速比设置为12.34，将M2的减速比设置为23.45 *发送：1,SGR,12.34,23.45 *返回：无 **设置方向模式（ID,SDIR,\r\n）* 在大多数的应用中，电机有时需要顺时针旋转，有时却需要逆时针旋转，我们成之为双向控制模式。 然而，在一些工程应用中，仅需一个方向旋转，我们称之为单向控制模式。 其实这两种模式在UART接口中是一样的，然而在PPM及Analog模式中却大相径庭，一方面很容易出现人为的误操作，另一方面输入信号的控制精度也降低一半。 该驱动器可以很容易地将驱动器设置为其中一种方向模式，配置参数为0时表示单向控制模式，为1时表示双向控制模式。 该配置参数仅在PPM及Analog模式中有效，出厂默认值为1。 例如将驱动器的方向模式设置为单向模式 *发送：1,SDIR,0\r\n *返回：无 **设置PWM信号产生方式（ID,SPWM,\r\n）* 驱动器内部拥有两路独立的全N-Mosfet全桥驱动电路，大多数驱动器Mosfet栅极驱动信号对用户而言是不可设定的，为了满足不同用户的需求，我们设定了三种模式可待选择，配置参数与PWM生成方式的对应关系如下： 0：Hpwm-Lon 1：Hpwm-Lpwm(on-off) 2：Hpwm-Lpwm(on-off-on，出厂默认值) 例如将Mosfet驱动信号设为Hpwm-Lpwm(on-off)（注：该模式为完全互补模式） *发送：1,SPWM,1\r\n *返回：无 **设置启动零信号检测与否（ID,SSD,\r\n）* 启动零信号检测仅对方向模式为单向模式且接口模式为PPM或Analog时有效。 绝大多数的单向控制模式应用中，对安全性要求更为严格，譬如，接口模式为PPM或Analog时，由于这两种模式无内部加减速功能，均为随动控制，系统突然的复位将引起负载剧烈的冲击，当电机带动具有危险性的负载时，将对人身安全造成威胁。 在这种情况下，可以通过使能启动零信号检测，增强安全性。 当系统突然复位时，电机处于静止状态，只有将控制信号调至接近停止状态后，方可进行正常控制。 配置参数为0时表示失能零信号检测功能，为1时表示使能零信号检测功能，出厂默认值为0。 例如使能启动零信号检测 *发送：1,SSD,1\r\n *返回：无 **获取当前转速（ID,GVC,\r\n）* 该指令需要注意的一点是：在闭环控制模式下，返回的转速值为当前减速后的输出转速，单位为r/min；在开环控制模式下，返回的参数为之前设定的量化速度。 例如获取M1的当前转速 *发送：1,GVC,1\r\n *返回：（当前实际输出转速） **获取最高转速（ID,GVM,\r\n）* 在闭环控制模式下，电机的最高转速是在SET模式下自动检测的减速后最高转速，单位为r/min，当用户设定的转速高于该值时，指令将不予以响应；在开环控制模式下，最高转速为量化的参数，固定为1000。 例如获取M1的最高转速 *发送：1,GVM,1\r\n *返回：（该路电机的最高转速） **设置同步转速（ID,SVS,,*****\r\n）* 所谓同步转速，是指转速一旦设定，驱动器立即根据该参数调节电机转速，注意设定的同步转速不应高于最高转速，否则驱动器将不响应该指令。 例如将M1的同步转速设定为100r/min *发送：1,SVS,1,100\r\n *返回：无 **设置异步转速（ID,SVR,,*****\r\n）* 所谓异步转速，是指转速设定后，驱动器不立即根据该参数调节电机转速，只有在接收到执行异步转速指令时，方可生效。 该指令组合，对多个电机需要同时控制时，可通过对每一路电机设定异步转速，然后通过广播方式发送执行异步转速指令。 例如将M1的异步转速设为100r/min *发送：1,SVR,1,100\r\n *返回：无 **执行异步转速（ID,AVR,,#\r\n）* 该指令应与“设置异步转速”指令结合使用，实现多电机严格的同步。 其中的两个参数并非与上文所述的M1对应1，M2对应2一致，这两个参数只能在0或1中取值，0表示该路不执行异步转速，1表示该路执行异步转速。*位置的参数控制M1，#位置的参数控制M2。 例如M1执行异步转速，M2不执行异步转速 *发送：1,AVR,1,0\r\n *返回：无 **获取加速度（ID,GACC,\r\n）* 在闭环控制模式下，加速度的单位为r/min/s；在开环模式下，则为一个量化的参数，不论开环或闭环控制，加速度均作用于电机端的转速。该驱动器在速度绝对值增大或速度方向相反时，速度变化率的绝对值均为加速度的值，并非如常规驱动器一样，在速度方向改变时，速度变化率的绝对值先以减速度的值，减速到0，再以加速度的值加速到目标速度。 例如获取M1的加速度值 *发送：1,GACC,1\r\n *返回：（该路电机的加速度值） **获取减速度（ID,GDEC,\r\n）* 在闭环控制模式下，减速度的单位为r/min/s；在开环模式下，则为一个量化的参数，不论开环或闭环控制，加速度均作用于电机端的转速。速度的方向一致，绝对值减小时，速度的变化率均为减速度的值。 例如获取M1的减速度值 *发送：1,GDEC,1\r\n *返回：（该路电机的减速度值） **设置加减速度（ID,SAD,,*****,#####\r\n）* 该指令同时设置一路电机的加/减速度值。在闭环控制模式下，加/减速度的单位为r/min/s；在开环模式下，则为一个量化的参数。 例如将M1的加速度设为50，减速度设为100 *发送：1,SAD,1,50,100\r\n *返回：无 获取PPM最大值（ID,GPA\r\n） PPM最大值出厂默认为2500us。 *发送：1,GPA\r\n *返回：（PPM最大值） 获取PPM最小值（ID,GPI\r\n） PPM最小值出厂默认为500us。 *发送：1,GPI\r\n *返回：（PPM最小值） 设置PPM极值（ID,SPPM,****,####\r\n） 驱动器可通过两种方式设定PPM极值，其一：是在SET模式下，自动识别PPM极值，具体的方法将在PPM接口中予以介绍。其二：用户也可在UART接口下，通过指令重置PPM极值。不论哪种方法，都必须保证PPM最小值不小于500us，PPM最大值不大于2500us。 例如将驱动器PPM控制信号的最小值和最大值分别设定为1000us和2000us *发送：1,SPPM,1000,2000\r\n *返回：无 获取控制信号模式（ID,GSM\r\n） 驱动器的控制信号模式分为持续模式和间断模式，所谓持续模式是指驱动器一旦接收到有效的控制信号，驱动器将一直保持之前设定的参数运行，直至接收到新的参数才发生改变。 间断模式是指一旦驱动器在规定的时间内未收到有效的控制信号，驱动器将停止工作，同时指示信号丢失故障（具体的时间，请参考“设置间断模式时限”指令）。 此外，控制信号模式仅对UART和PPM接口有效，返回的参数为0表示持续模式，1表示间断模式，出厂默认值为0。 *发送：1,GSM\r\n *返回：（当前控制信号模式） **设置控制信号模式（ID,SSM,\r\n）* 例如将控制信号模式设置为间断模式 *发送：1,SSM,1\r\n *返回：无 设置间断模式时限（ID,SDCT,****\r\n） 间断模式时限，最大可设置为10s，其时间基数为10ms。 例如将间断模式时限设置为1s *发送：1,SDCT,100\r\n *返回：无 **获取PID参数Kp（ID,GKP,\r\n）* 例如获取M1速度环PID的比例参数Kp *发送：1,GKP,1\r\n *返回：（当前M1的Kp值） **获取PID参数Ti（ID,GTI,\r\n）* 例如获取M1速度环PID的积分参数Ti *发送：1,GTI,1\r\n *返回：（当前M1的Ti值） **获取PID参数Td（ID,GTD,\r\n）* 例如获取M1速度环PID的微分参数Td *发送：1,GTD,1\r\n *返回：（当前M1的Td值） **设置PID参数（ID,SPID,,*******,##,&&\r\n）* 该驱动器M1和M2的速度环PID参数是完全独立的，分为比例参数、积分参数、微分参数。 这三个参数可在SET模式下，驱动器将根据电机的负载情况，进行自整定，得出较为理想的参数值，极大方便了用户的使用。 当然，该驱动器并没有剥夺用户自行配置的权利，可通过该指令进行三个参数的设定，同时结合“输出电机实时转速”指令及相关软件观测速度伺服的实际效果。 例如将M1的PID参数Kp、Ti、Td分别设置为0.2、4、1 *发送：1,SPID,1,0.2,4,1\r\n *返回：无 获取最大允许连续电流（ID,GMCC\r\n） 实际电流大于最大允许连续电流，且小于最大允许尖峰电流，允许持续时间为2s，大于2s电机将自动停止，并指示过电流故障，出厂默认值为25000，单位mA。 *发送：1,GMCC\r\n *返回：（最大允许连续电流） 获取最大允许尖峰电流（ID,GMPC\r\n） 实际电流大于最大允许尖峰电流，允许持续时间为400ms，大于400ms电机将自动停止，并指示过电流故障，出厂默认值为30000，单位mA。 *发送：1,GMPC\r\n *返回：（最大允许尖峰电流） **获取当前电流（ID,GCC,\r\n）* 例如获取M1的当前电流 *发送：1,GCC,1\r\n *返回：（M1当前电流，单位为mA） 设置最大允许连续电流和最大允许尖峰电流（ID,SMLC,*****,#####\r\n） 最大允许连续电流不得超过25000，最大允许尖峰电流不得超过30000。值得注意的是，两路电机共享同一参数。 例如将驱动器的最大允许连续电流和最大允许尖峰电流分别设置为12000mA和15000mA *发送：1,SMLC,12000,15000\r\n *返回：无 获取最高允许温度（ID,GMT\r\n） 驱动器温度检测范围为：-10~100℃，分辨率为1℃。 *发送：1,GMT\r\n *返回：（最大允许温度，单位为℃） 获取当前温度（ID,GCT\r\n） 若当前温度大于40℃，驱动器风扇接口将输出5V/500mA电源，用户可外接一个5V风扇或者通过继电器控制大功率的风扇，对驱动器进行散热，当温度降到35摄氏度时，将断开电源输出。 若没有散热措施或散热措施不起作用，当内部温度大于最大允许温度时，电机停止，同时指示过温故障。 *发送：1,GCT\r\n *返回：（驱动器当前功率驱动芯片附近温度，单位为℃） 设置最高允许温度（ID,SMT,,\r\n）* 最大允许温度值不能大于100℃，若大于该值，驱动器将不响应该设置指令。 例如将最大允许温度设置为50℃ *发送：1,SMT,50\r\n *返回：无 获取系统电压（ID,GSV\r\n） 若当系统电压超出极限电压范围，电机将停止，同时指示欠电压或过电压故障。 *发送：1,GSV\r\n *返回：（当前系统电压*10，分辨率为0.1V） 设置极限电压（ID,SLV,,###\r\n）* 该驱动器推荐电压范围为DC 12~36V，下限设定值应不小于6V，上限设定值不大于40V，否则，驱动器将不予以响应。 例如将驱动器的下限和上限电压阈值分别设为10V和24V *发送：1,SLV,100,240\r\n *返回：无 获取故障信息（ID,GER\r\n） 故障信息应转换为十六进制数值型，结合下表查询故障源： Bit Error Sources 0 Reserved 1 Lower Voltage 2 Over Voltage 3 Over Temperature 4 M1 Over Current 5 M2 Over Current 6 Control Signal Lost 7 Reserved 8 Reserved 9 Reserved 10 Reserved 11 Reserved 12 Reserved 13 Reserved 14 Reserved 15 Reserved Lower Voltage ：欠电压保护 Over Voltage ：过电压保护 Over Temperature ：过温保护 M1 Over Current ：M1过电流保护 M2 Over Current ：M2过电流保护 Control Signal Lost ：控制信号丢失（当控制信号模式为间断模式时，主控制器需在设定的时间内发送控制指令，若在设定的时间内无控制信号，驱动器将认为控制信号丢失） *发送：1,GER\r\n *返回：（故障信息，如返回2，则为欠电压保护） 清除所有故障信息（ID,CER\r\n） 当出现故障后，驱动器进入保护模式，电机将无法驱动。在UART接口下，可通过清除故障信息以进入正常模式；在PPM和Analog接口下，只能重新上电，复位驱动器，方可进入正常模式。 *发送：1,CER\r\n *返回：无 输出电机实时转速（ID,OUT,* \r\n） 电机实时转速输出主要是为了调节PID参数，若需要停止输出，只需输入一条空指令“\r\n”，即可。值得注意的是，为了更好地监测PID参数调节结果，该指令返回的电机实时转速为电机端转速。 例如获取M1实时转速 *发送：1,OUT,1\r\n *返回：X,Y,Z\r\n（此处的X、Y、Z为实际数据的抽象表示，X表示驱动器内部第X次转速测量，取值范围为：0~4294967295；Y表示电机实际转速；Z表示电机目标转速。） 外形尺寸 长=67mm 宽=57mm 高=30mm 本文整理于 DFRobot wiki
外观 简介 该大功率电机驱动模块除了可用于4WD移动机器人平台，战斗机器人，智能车竞赛等场合还可用于驱动水泵，电风扇，传送带等。有了它，您可以搭建很多与电机相关的项目。 该模块采用了4块高性能大电流的驱动芯片BTS7960，具有短路过温过压保护功能。 只需4个数字IO口便可同时控制2路电机运转。经实测单路最大输出电流可达15A@13.8V，响应性好，制动性能强。 同时两路电机都具有正反转指示灯， 方便您在不接电机的情况下进行调试。 该大功率电机驱动模块直接兼容Arduino。 产品参数 驱动部分输入电压：4.8-35V 最大输出电流：单路15A@13.8V 单路峰值电流：20A@13.8V PWM最高输出频率：25KHZ 驱动输出接口：5.08mm间距接线柱 控制接口：4路数字信号（其中2路PWM信号） 驱动形式：双路大功率H桥驱动 尺寸:73x68x14mm 保护功能： 电流隔离功能，保护单片机 双路电流检测诊断功能 短路，过热，过压保护 使用教程 连线图 LA_IS,LB_IS,RA_IS和RB_IS这几个引脚是用于电流检测的。正常情况下，IS引脚输出是一个低电平。非正常情况下，输出的高电平。下面的样例代码会详细指出如何操作。 样例代码 PWM 模式 /* # 这个样例代码用来测试DC Motor Driver 2x15A_lite module. # Editor : Phoebe # Date : 2012.11.6 # Ver : 0.1 # Product: DC Motor Driver 2x15A_lite # SKU : DRI0018 # 描述: # 用DC Motor Driver module驱动2个电机 # 硬件: 1. Arduino UNO 2. DC Motor Driver 2x15A_lite 3. DC motors x2 步骤: 1.M1_PWM & M2_PWM --> digital 5 & 6 2.M1_EN & M2_EN --> digital 4 & 7 3.+5V --> 5V 4.GND --> GND 下面代码中注释掉的部分是用来电流检测的，如需检测连接： 1.LA_IS 和 RA_IS 同时连接 数字口2 2.LB_IS 和 RB_IS 同时连接 数字口3 */ int E1 = 5; //M1 速度控制 int E2 = 6; //M2 速度控制 int M1 = 4; //M1 方向控制 int M2 = 7; //M1 方向控制 int counter=0; void stop(void) { //停止 digitalWrite(E1,0); digitalWrite(M1,LOW); digitalWrite(E2,0); digitalWrite(M2,LOW); } void advance(char a,char b) //前进 { analogWrite (E1,a); //PWM 速度控制 digitalWrite(M1,HIGH); analogWrite (E2,b); digitalWrite(M2,HIGH); } void back_off (char a,char b) //后退 { analogWrite (E1,a); digitalWrite(M1,LOW); analogWrite (E2,b); digitalWrite(M2,LOW); } void turn_L (char a,char b) //左转 { analogWrite (E1,a); digitalWrite(M1,LOW); analogWrite (E2,b); digitalWrite(M2,HIGH); } void turn_R (char a,char b) //右转 { analogWrite (E1,a); digitalWrite(M1,HIGH); analogWrite (E2,b); digitalWrite(M2,LOW); } void current_sense() // 电流检测 { int val1=digitalRead(2); int val2=digitalRead(3); if(val1==HIGH || val2==HIGH){ counter++; if(counter==3){ counter=0; Serial.println("Warning"); } } } void setup(void) { int i; for(i=4;i<=7;i++) pinMode(i, OUTPUT); Serial.begin(19200); //Set Baud Rate设置波特率 Serial.println("Run keyboard control"); digitalWrite(E1,LOW); digitalWrite(E2,LOW); } void loop(void) { /* static unsigned long timePoint = 0; // 如需电流检测，不要忘记引脚连接 if(millis() - timePoint > 1000){ current_sense(); timePoint = millis(); } */ if(Serial.available()){ char val = Serial.read(); if(val != -1) { switch(val) { case 'w'://Move Forward advance (255,255); //以最大速度前进 break; case 's'://Move Backward back_off (255,255); //以最大速度后退 break; case 'a'://Turn Left turn_L (100,100); break; case 'd'://Turn Right turn_R (100,100); break; case 'z': Serial.println("Hello"); break; case 'x': stop(); break; } } else stop(); } } PLL控制模式 PLL模式 DRI0018电机驱动也支持PLL相位锁相环控制模式。电机连线与PWM控制一样。程序代码如下： "PLL模式" 引脚 功能 4 电机1启用控制 5 电机1方向控制 6 电机2方向控制 7 电机2启用控制 演示代码： //Standard DLL Speed control int E1 = 4; //M1 Speed Control int E2 = 7; //M2 Speed Control int M1 = 5; //M1 Direction Control int M2 = 6; //M1 Direction Control //When m1p/m2p is 127, it stops the motor //when m1p/m2p is 255, it gives the maximum speed for one direction //When m1p/m2p is 0, it gives the maximum speed for reverse direction void DriveMotorP(byte m1p, byte m2p)//Drive Motor Power Mode { digitalWrite(E1, HIGH); analogWrite(M1, (m1p)); digitalWrite(E2, HIGH); analogWrite(M2, (m2p)); } void setup(void) { int i; for(i=4;i<=7;i++) pinMode(i, OUTPUT); Serial.begin(19200); //Set Baud Rate } void loop(void) { if(Serial.available()){ char val = Serial.read(); if(val!=-1){ switch(val){ case 'w'://Move Forward DriveMotorP(0xff,0xff); // Max speed break; case 'x'://Move Backward DriveMotorP(0x00,0x00); ; // Max speed break; case 's'://Stop DriveMotorP(0x7f,0x7f); break; } } } } 程序功能：串口输入"w","x","s",电机会有相应的动作。 本文整理于DFRobot wiki
Arduino直流电机驱动-L298P-Twin 2x2A电机驱动Arduino扩展板
外观 简介 这是一款基于L298芯片的Arduino平台双路电机驱动扩展板，可以直接插入Arudino控制板使用。 控制端口为4个，减少了对Arduino数字端口的开销，而且控制程序也更为简单。 扩展板采用跳线选择Arduino VIN供电还是外接电源供电。 产品参数 驱动工作电压：4.8 ～ 35V 最大输出电流：单路2A 最大耗散功率：25W（T=75℃） 驱动形式：双路H桥驱动 驱动电源接口：一路外部电源端子 / Arduino-VIN 驱动输出接口：两路电机接线端子 / 排针 Arduino控制端口：数字口10,11,12,13 工作温度：-25℃ ～ 130℃ 模块尺寸：56x57mm 应用 电动小车 引脚说明 驱动电源选择跳线：用于选择驱动电源，一路是外部驱动电源（PWMIN），一路是来自于母板（比如使用Arduino UNO）的VIN；根据驱动电机的电压和电流要求选择使用。默认是选择VIN，即图示的方式。 注意：这里的两组跳线是并联的，两个跳线帽需要同步使用以满足大电流通过的要求。 外部电源端子（PWMIN）：用于连接外部电源给驱动供电。 驱动输出接口：用于连接2路直流电机；提供接线端子和排针两种连接方式，接线端子（M1- M1+ M2- M2+）和排针（1 2 3 4）相对应，根据实际情况选择使用。 模拟3PIN接口：用于连接3PIN接口的传感器、执行器等模块。 注意：这里线序是(+ - S)。 Mn指示灯：Mn+为正时红色灯亮，反之绿色灯亮，用于调试。注意：电机工作时有反电动势，因此存在两个灯同时亮的情况。 控制端口：用于控制电机的转速和方向。在模块上印刷有“控制表”方便查看端口功能，其中En用于控制电机转速(PWM调速)，Mn用于控制电机旋转方向。控制端口的真值表为： En Mn 状态 L X Mn禁止 H L Mn正转（Mn+为正） H H Mn反转（Mn+为负） 注1：n=1,2。 注2：H表示高电平1；L表示低电平0；X表示任意电平。 使用教程 控制直流电机 目标：对直流电机进行调速和方向控制 步骤一：硬件清单 UNO 1 直流电机 2 稳压电源 1 本模块 1 导线 步骤二：软件清单 Arduino IDE 步骤三：连线图 步骤四：操作步骤 打开Arduino IDE 将下面的代码上传到UNO 库安装 /**set control port**/ const int E1Pin = 10; const int M1Pin = 12; const int E2Pin = 11; const int M2Pin = 13; /**inner definition**/ typedef struct { byte enPin; byte directionPin; }MotorContrl; const int M1 = 0; const int M2 = 1; const int MotorNum = 2; const MotorContrl MotorPin[] ={ {E1Pin,M1Pin}, {E2Pin,M2Pin} } ; const int Forward = LOW; const int Backward = HIGH; /**program**/ void setup() { initMotor(); } void loop() { int value; /**test M1 **/ setMotorDirection( M1, Forward ); setMotorSpeed( M1, 100 ); delay(1000); setMotorSpeed( M1, 0 ); delay(100); setMotorDirection( M1, Backward ); setMotorSpeed( M1, 50 ); delay(1000); setMotorSpeed( M1, 0 ); delay(100); /**test M2**/ setMotorDirection( M2, Backward ); for(value = 0 ; value <= 100; value+=5) { setMotorSpeed( M2, value ); delay(100); } setMotorSpeed( M2, 0 ); setMotorDirection( M2, Forward ); for(value = 0 ; value <= 100; value+=5) { setMotorSpeed( M2, value ); delay(100); } setMotorSpeed( M2, 0 ); } /**functions**/ void initMotor( ) { int i; for ( i = 0; i < MotorNum; i++ ) { digitalWrite(MotorPin[i].enPin, LOW); pinMode(MotorPin[i].enPin, OUTPUT); pinMode(MotorPin[i].directionPin, OUTPUT); } } /** motorNumber: M1, M2 direction: Forward, Backward **/ void setMotorDirection( int motorNumber, int direction ) { digitalWrite( MotorPin[motorNumber].directionPin, direction); } /** speed: 0-100 * */ inline void setMotorSpeed( int motorNumber, int speed ) { analogWrite(MotorPin[motorNumber].enPin, 255.0 * (speed/100.0) ); //PWM } 步骤五：实验结果 M1将全速正转，然后半速反转； M2速度由大到小，先反转，然后正转。 注意：电机的旋转方向是相对的，其转速大小也是相对的。 本文整理于 DFRobot wiki
Arduino直流电机驱动-Micro DC Motor with Encoder-SJ02 微型直流带编码器L型减速电机
外观 简介 DFRobot新款微型直流减速电机，专为机器人DIY爱好者设计，减速比高达120:1。 带两相正交霍尔编码器输出，单圈可输出16个脉冲信号。配合减速箱，单圈可输出高达1920个脉冲信号。 配合Arduino控制器和电机驱动器或者直接使用RoMeo主控器就能够完成闭环PID控制、测速、PWM调速等功能。 电机采用纯铜输出轴，内嵌螺纹，加强的连接接头，极大的延长电机的使用寿命，连接也更加方便。 搭配我们的移动平台，您可以非常方便的实现速度和方向的精确控制。 产品参数 齿轮齿数比：120:1 无负载转速(6V)：160rpm 无负载转速(3V)：90rpm 电机最大无负载电流（6V）：170mA 电机最大无负载电流（3V）：140mA 最大堵转电流：2.8A 最大输出力矩(6V)：0.8kgf.cm 编码器电压：4.5~7.5V 电机工作电压：3~7.5V（额定电压6V） 额定力矩：0.2kgf.cm 操作环境温度：-10~+60℃ 引脚说明 标号 名称 功能描述 1 电机电源引脚+ 3-7.5V，额定电压6V 2 电机电源引脚- 3 编码器A相输出 随电机转速的变化输出频率变化的方波 4 编码器B相输出 随电机转速的变化输出频率变化的方波(接中断口) 5 编码器电源GND 6 编码器电源正极 4.5-7.5V 使用教程 所需硬件 DFRduino UNO x1 直流电源 x1 L298电机驱动板 x1 所需软件 Arduino IDE 点击下载Arduino IDE 接线图 本次教程意在编码器的使用上，选用D2和D3两个管脚，其中D2作为了中端口，D3作为信号输入引脚。在实际应用中只需要确保两个管脚中有一个必须是中断管脚即可，另一个可自行定义（参见下图主控的中断管脚） Interrupt Port with Different Board Notcie:attachInterrupt() 举个例子，当你想在UNO上面使用中断管脚0（中断0），你可以连接2号数字管脚（D2）;使用中断管脚1（中断1），你可以连接3号数字管脚（D3） 详细情况请查看 http://arduino.cc/en/Reference/AttachInterrupt 样例代码 示例代码1： //The sample code for driving one way motor encoder const byte encoder0pinA = 2;//A pin -> the interrupt pin 0 const byte encoder0pinB = 3;//B pin -> the digital pin 3 byte encoder0PinALast; int duration;//the number of the pulses boolean Direction;//the rotation direction void setup() { Serial.begin(57600);//Initialize the serial port EncoderInit();//Initialize the module } void loop() { Serial.print("Pulse:"); Serial.println(duration); duration = 0; delay(100); } void EncoderInit() { Direction = true;//default -> Forward pinMode(encoder0pinB,INPUT); attachInterrupt(0, wheelSpeed, CHANGE); } void wheelSpeed() { int Lstate = digitalRead(encoder0pinA); if((encoder0PinALast == LOW) && Lstate==HIGH) { int val = digitalRead(encoder0pinB); if(val == LOW && Direction) { Direction = false; //Reverse } else if(val == HIGH && !Direction) { Direction = true; //Forward } } encoder0PinALast = Lstate; if(!Direction) duration++; else duration--; } 代码1运行现象: 说明：数据不断的从串口输出，当电机正转时，输出的数值>0, 电机反向转时，输出数字<0。并且电机速度越快，数字的绝对值越大，反之越小。 示例代码2(PID控制)： 通过L298P直流电机驱动板驱动直流电机，PID算法控制电机的转速。 电机电源口连接至L298电机驱动M1口 下载并安装Arduino PID库。 //The sample code for driving one way motor encoder #include <PID_v1.h> const byte encoder0pinA = 2;//A pin -> the interrupt pin 0 const byte encoder0pinB = 3;//B pin -> the digital pin 3 int E_left =5; //L298P直流电机驱动板的使能端口连接到数字接口5 int M_left =4; //L298P直流电机驱动板的转向端口连接到数字接口4 byte encoder0PinALast; double duration,abs_duration;//the number of the pulses boolean Direction;//the rotation direction boolean result; double val_output;//用于提供给电机PWM功率值。 double Setpoint; double Kp=0.6, Ki=5, Kd=0; PID myPID(&abs_duration, &val_output, &Setpoint, Kp, Ki, Kd, DIRECT); void setup() { Serial.begin(9600);//Initialize the serial port pinMode(M_left, OUTPUT); //L298P直流电机驱动板的控制端口设置为输出模式 pinMode(E_left, OUTPUT); Setpoint =80; //设置PID的输出值 myPID.SetMode(AUTOMATIC);//设置PID为自动模式 myPID.SetSampleTime(100);//设置PID采样频率为100ms EncoderInit();//Initialize the module } void loop() { advance();//电机正转 abs_duration=abs(duration); result=myPID.Compute();//PID转换完成返回值为1 if(result) { Serial.print("Pluse: "); Serial.println(duration); duration = 0; //计数清零等待下次计数 } } void EncoderInit() { Direction = true;//default -> Forward pinMode(encoder0pinB,INPUT); attachInterrupt(0, wheelSpeed, CHANGE); } void wheelSpeed() { int Lstate = digitalRead(encoder0pinA); if((encoder0PinALast == LOW) && Lstate==HIGH) { int val = digitalRead(encoder0pinB); if(val == LOW && Direction) { Direction = false; //Reverse } else if(val == HIGH && !Direction) { Direction = true; //Forward } } encoder0PinALast = Lstate; if(!Direction) duration++; else duration--; } void advance()//电机正转 { digitalWrite(M_left,LOW); analogWrite(E_left,val_output); } void back()//电机反转 { digitalWrite(M_left,HIGH); analogWrite(E_left,val_output); } void Stop()//电机停止 { digitalWrite(E_left, LOW); } 代码2运行现象: 因为程序设定的PID值为80，所以电机会稳定转速在80左右，当外界的力量（比如电机的驱动电压变化，电机受到的阻力变大等）迫使转速改变时，程序会通过PWM调节，使转速稳定在80左右。 比如增大电机驱动电压，电机转速会短暂的上升后下降到80，减小电机驱动电压，电机转速会短暂下降后，上升到80。 更多 电机尺寸图 本文整理于DFRobot wiki
Arduino直流电机驱动-Quad Motor Driver Shield for Arduino四路直流电机驱动扩展板
简介 Quad Motor Shield for Arduino是Arduino兼容的一款直流电机驱动，最多可以同时驱动4个直流电机。 控制端口为8个，控制程序很简单。该电路线路布线合理、均采用贴元件片、体积小、方便安装，即插即用。 Quad Motor Shield for Arduino采用TB6612FNG电机驱动芯片。 TB6612FNG是东芝半导体公司生产的一款直流电机驱动器件，它具有大电流MOSFET-H桥结构，双通道电路输出，可同时驱动2个电机。 TB6612FNG每通道输出最高1.2 A的连续驱动电流，启动峰值电流达2A/3.2 A(连续脉冲/单脉冲);PWM支持频率高达100 kHz; 片内低压检测电路与热停机保护电路;工作温度：-20～85℃;SSOP24小型贴片封装。 产品参数 工作电压 2.5V-13.5V 工作电流 每通道最高1.2 A的连续驱动电流，启动峰值电流达2A/3.2 A(连续脉冲/单脉冲) Arduino控制端口：数字口3,4,5,6,7,8,11,12 尺寸 52mm X 53mm 引脚说明 使用教程 简单编程实现电机的控制。 控制电机对应的IO口 电机 方向控制脚 正转 反转 速度控制脚 速度范围 M1 4 LOW HIGH 3 0-255 M2 12 HIGH LOW 11 0-255 M3 8 LOW HIGH 5 0-255 M4 7 HIGH LOW 6 0-255 所需硬件 UNO x1 Quad Motor Shield for Arduino x1 直流电机 x 4 杜邦线 若干 所需软件 Arduino IDE点击下载Arduino IDE 连线图 样例代码 /*! * @file QuadMotorDriverShield.ino * @brief QuadMotorDriverShield.ino Motor control program * * Every 2 seconds to control motor positive inversion * * @author linfeng(490289303@qq.com) * @version V1.0 * @date 2016-4-5 */ const int E1 = 3; ///<Motor1 Speed const int E2 = 11;///<Motor2 Speed const int E3 = 5; ///<Motor3 Speed const int E4 = 6; ///<Motor4 Speed const int M1 = 4; ///<Motor1 Direction const int M2 = 12;///<Motor2 Direction const int M3 = 8; ///<Motor3 Direction const int M4 = 7; ///<Motor4 Direction void M1_advance(char Speed) ///<Motor1 Advance { digitalWrite(M1,LOW); analogWrite(E1,Speed); } void M2_advance(char Speed) ///<Motor2 Advance { digitalWrite(M2,HIGH); analogWrite(E2,Speed); } void M3_advance(char Speed) ///<Motor3 Advance { digitalWrite(M3,LOW); analogWrite(E3,Speed); } void M4_advance(char Speed) ///<Motor4 Advance { digitalWrite(M4,HIGH); analogWrite(E4,Speed); } void M1_back(char Speed) ///<Motor1 Back off { digitalWrite(M1,HIGH); analogWrite(E1,Speed); } void M2_back(char Speed) ///<Motor2 Back off { digitalWrite(M2,LOW); analogWrite(E2,Speed); } void M3_back(char Speed) ///<Motor3 Back off { digitalWrite(M3,HIGH); analogWrite(E3,Speed); } void M4_back(char Speed) ///<Motor4 Back off { digitalWrite(M4,LOW); analogWrite(E4,Speed); } void setup() { for(int i=3;i<9;i++) pinMode(i,OUTPUT); for(int i=11;i<13;i++) pinMode(i,OUTPUT); } void loop() { M1_advance(100); M2_advance(100); M3_advance(100); M4_advance(100); delay(2000); ///<Delay 2S M1_back(100); M2_back(100); M3_back(100); M4_back(100); delay(2000); ///<Delay 2S } 结果 电机每隔2S实现正反转。 本文整理于 DFRobot wiki
Arduino直流电机驱动-Motor driver-HR8833 双路直流电机驱动模块
简介 Motor driver-HR8833 双路直流电机驱动模块，体积小，可以在面包板上使用，对于空间上有要求的的DIY作品也是个不错的选择。 产品参数 工作电压VCC：3.3V – 5V（或者单片机IO输出高电平） 工作电压VM：3.3V – 10V 最大持续工作电流：1500mA（单路） 尺寸：18mm*13mm 引脚说明 标号 名称 功能描述 1 VCC 电源3.3V-5V或者IO口输出高电平 2 GND 电源负极 3 IB2 B路逻辑输入端2 4 IB1 B路逻辑输入端1 5 IA2 A路逻辑输入端2 6 IA1 A路逻辑输入端1 7 VM 电机驱动电源3.3V-10V 8 GND 电源负极 9 MB1 B路输出1 10 MB2 B路输出2 11 MA2 A路输出2 12 MA1 A路输出1 使用教程 IA1接数字口10；IA2接数字口12；IB1接数字口11；IB2接数字口13。 所需硬件 UNO x1 Motor driver-HR8833 x1 杜邦线 若干 所需软件 Arduino IDE 版本1.6.8 点击下载Arduino IDE 接线图 样例代码 /* * @file Motor driver HR8833-Test.ino * @brief HR8833-Test.ino Motor control program * * control motor positive inversion * * @author lei.wu@dfrobot.com * @version V1.0 * @date 2016-4-13 */ const int IA1=10; const int IA2=12; const int IB1=11; const int IB2=13; void setup() { pinMode(IA1, OUTPUT); pinMode(IA2, OUTPUT); pinMode(IB1, OUTPUT); pinMode(IB2, OUTPUT); } void loop() { MA1_Forward(200); delay(1000); MA2_Backward(200); delay(1000); } void MA1_Forward(int Speed1) { analogWrite(IA1,Speed1); digitalWrite(IA2,LOW); } void MA2_Backward(int Speed1) { int Speed2=255-Speed1; analogWrite(IA1,Speed2); digitalWrite(IA2,HIGH); } void MB1_Forward(int Speed1) { analogWrite(IB1,Speed1); digitalWrite(IB2,LOW); } void MB2_Backward(int Speed1) { int Speed2=255-Speed1; analogWrite(IB1,Speed2); digitalWrite(IB2,HIGH); } 结果 电机正反转 本文整理于 DFRobot wiki
Arduino伺服电机驱动-Veyron Servo Driver 24-Channel
简介 注意： 1.在没有认真阅读本说明之前，请勿给模块加电！错误接线将导致模块永久性损坏或烧毁微控制器； 2.请认真查看引脚功能说明，正确接线！请勿将电源反接，否则将导致模块永久性损坏； 3.请勿使用超出额定电压的电源！保证电源的稳定，如果出现高压脉冲，可能会导致微控制器永久性损坏； 4.本产品无防水防潮功能，请在干燥环境下保存或使用！不可将重物堆积在上面； 5.请勿给Maple RET6芯片烧写任何程序，否则预装的程序将会丢失，无法读取任何指令。 Veyron Servo Driver 24-Channel是专为人形机器人、蜘蛛机器人、机械手等多舵机使用而量身定做的多路舵机控制器。 控制器还增加了无线数传接口，兼容DFRobot出品的蓝牙模块和APC220无线数传以及Xbee模块，可实现无线远程控制。 Veyron Servo Driver 24-Channel控制方式包括实时、定时、定速控制等。 技术参数 输出通道：24路（脉冲调制输出或TTL电平输出）； 舵机供电：DC4.8V~6V； 逻辑供电：DC6V~12V或USB供电（具有自恢复保险丝，调试时使用）； 驱动分辨率：1uS, 0.09°； 驱动速度分辨率：1uS/秒，0.09°/秒； 通讯接口：MicroUSB/TTL串口接口； 串口波特率：2400、9600、38.4k、115.2k可设置； 电路板尺寸：57.3 x 72.3mm； 重量：26g 性能描述 目前市面上功能最强、可靠性最高的MicroUSB版Veyron Servo Driver 24-Channel舵机控制器，核心控制部件采用了高性能、低功耗的STM32F103单片机，具有功能强大、命令执行速度快、控制精度极高、I/O 端口驱动能力强等特点； 电路布局紧凑合理，采用贴片式设计使电路板体积大大缩小，同时具有很强的抗干扰性能； 目前市面上的电脑都很少提供串口，而较多的是USB接口，所以本产品采用了USB接口，方便没有串口的台式电脑和笔记本使用； 使用2位DIP拨码开关设置波特率； 提供蓝牙模块、Xbee模块和APC220无线数传接口，可实现远程控制； 支持Futaba、Hitec、辉盛以及大部分常见舵机； 舵机可控范围：0~180°（360° 连续旋转需对舵机进行改装）； 舵机模式：单舵机控制，群舵机控制，群控制中，被编入同一群的舵机可以在旋转角度大小不同的时候能做到自动协调速度，同启同止，此功能在设计多自由度仿生机器人时非常实用，可使动作平滑、流畅； 控制方式包括：即时、定时、定速控制等。 引脚定义 控制器测试的基本示例 这一个章节注重于Veyron Servo Driver 24-Channel的基本功能。通过这个示例，你可以很方便的搭建你自己的舵机控制应用. 准备材料 Veyron Servo Driver 24-Channel ×1 Micro USB 线 ×1 TowerPro SG90舵机 ×3 5V舵机供电电源 ×1 串口工具软件 ×1 详细教程 1.初次使用Veyron Servo Driver 24-Channel，都需要为其安装DFU和虚拟串口两个驱动程序。首先按照如下步骤安装DFU驱动程序： 在windos环境下安装： 1） 将Veyron Servo Driver 24-Channel连接到计算机的USB接口。 2） 按下左下角的复位键（印有“RET”的按键），这时蓝色指示灯会快速闪烁6次，然后慢闪烁几次。 3） 再次按下复位键，这次在蓝色指示灯快速闪烁6次期间按下另一个键（右上角，印有“BOOT0”）并保持不放，直到指示灯开始慢闪烁时放开。蓝色指示灯会一直闪烁，使你有机会安装DFU驱动程序。 4） Windows会提示你需要驱动程序，人工指定驱动程序所在目录位置，选择DFservo文件夹中的mapleDrv\dfu。下一步安装虚拟串口驱动程序： 5） 复位Veyron Servo Driver 24-Channel的RET按键，等待蓝色指示灯停止闪烁。此时Windows会提示安装驱动程序，同样，人工指定驱动程序所在目录为DFservo文件夹中的mapleDrv\serial。 在Linux环境下安装步骤如下： 1）首先确认是否已经安装了JRE，如果没有，可以通过如下命令安装： sudo aptitude install openjdk-6-jre 2）解压压缩文件到合适的位置（例如桌面）。 3）打开解压压缩文件得到的文件夹，运行其中的install-udev-rules.sh，出现要求输入用于获得管理员权限的密码的提示。 4）用“sudo restart udev”命令重启udev即可。 在Mac环境下安装步骤如下： 1）双击你所下载的DMG文件使该镜像被加载即可。 2.连接Micro USB电缆到Veyron Servo Driver 24-Channel，即使用USB电源给控制器逻辑部分供电，这是控制器上的逻辑电源指示灯5V/3.3V和舵机控制器指示灯L都会亮。将TowerPro SG90舵机接上0、1、2号口，舵机供电使用外部5V舵机供电电源接到VS与GND上，拨码开关3拨到SERIAL处，USB波特率已默认为57600（不可更改），需要和软件一致。 3.安装 Arduino IDE. (Arduino 1.0.x 或 Arduino 1.5.x)。我们需要一个串口工具用来发送指令来控制舵机，常用的串口工具很多如Arduino IDE 串口监视器、CoolTerm等，这里我们选择Arduino IDE 串口监视器来演示打开串口助手软件，在菜单-》工具-》串口中选择正确的设备,开启串口监视器 (点击窗口的右上角的按键)。连接成功后，测试就正式开始了，在发送区框中输入命令： #0 P1500 #1 P1500 #2 P1500<cr> <cr>表示回车 回车后，你会看见L指示灯会闪烁，同时通道0，1，2上的舵机会转动到中间位置。 #0 P750 #1 P1000 #2 P2000 T3000 <cr> <cr>表示回车 回车后，你会看见通道0比通道1和2运动的慢一些，但不管他们的初始位置相差多远，都会同时到达指定位置。 现在来测试查询运动状态，在发送区框中输入命令： #0 P750 <cr> 回车后，通道0舵机转到接近最小位置，接着输入下面的命令，使通道0舵机花10秒转到接近最大位置。 #0 P2250 T10000 <cr> 舵机正在运动时，输入下面的命令： Q <cr> 如果舵机正在运动，将返回“+”，如果舵机到达指定位置将返回“。”。 接下来测试舵机的运动速度，在黑色框中输入命令： #0 P750 S1000 <cr> 这条命令将使舵机从2250us移动到750us（大概170度），一共耗时1.5秒。 接着输入后面的命令： #0 P2250 S750 <cr> 这条命令将使舵机从750us移动到2250us（大概170度），一共耗时2秒。 Arduino与Veyron_Servo_Driver_24-Channel串口通讯实例 使用Arduino的串口和Veyron_Servo_Driver_24-Channel的串口通讯，实现舵机动作控制。 准备材料 DFRduino UNO R3 ×1 USB电缆 ×1 Veyron Servo Driver 24-Channel ×1 5V舵机供电电源 ×1 9V逻辑供电电源 ×1 TowerPro SG90舵机 ×1 测试代码： void setup() { Serial.begin(115200);//Set the baudrate to 115200 A:1 B:1 delay(100);//wait for baudrate setting finished } void loop() { Serial.print("#5 P750");// Channel 5 will move to 750us within 500ms delay(5); //wait for first comand transmission done, if you send // a long command, you'd better extend it Serial.print("\r"); // send Carriage Return <CR> delay(1000); //wait for servo go to the set position Serial.print("#5 P2200");// Channel 5 will move to 2200us within 500ms delay(5); Serial.print("\r"); delay(1000); } Arduino&XBee与Veyron_Servo_Driver_24-Channel无线通讯实例 使用XBee无线模块和Veyron_Servo_Driver_24-Channel的XBee无线模块通讯，实现舵机动作控制。 准备材料 DFRduino UNO R3 ×1 IO 传感器扩展板 V7 ×1 XBee 1mW Zigbee 无线数传模块 ×2 USB电缆 ×1 Veyron Servo Driver 24-Channel ×1 5V舵机供电电源 ×1 9V逻辑供电电源 ×1 TowerPro SG90舵机 ×1 测试代码： void setup() { Serial.begin(115200);//Set the baudrate to 115200 A:1 B:1 delay(100);//wait for baudrate setting finished } void loop() { Serial.print("#5 P750");// Channel 5 will move to 750us within 500ms delay(5); //wait for first comand transmission done, if you send // a long command, you'd better extend it Serial.print("\r"); // send Carriage Return <CR> delay(1000); //wait for servo go to the set position Serial.print("#5 P2200");// Channel 5 will move to 2200us within 500ms delay(5); Serial.print("\r"); delay(1000); } Arduino&APC220与Veyron_Servo_Driver_24-Channel无线通讯实例 使用APC220无线模块和Veyron_Servo_Driver_24-Channel的APC220无线模块通讯，实现舵机动作控制。 准备材料 DFRduino UNO R3 ×1 IO 传感器扩展板 V7 ×1 APC220无线数传 ×1 USB电缆 ×1 Veyron Servo Driver 24-Channel ×1 5V舵机供电电源 ×1 9V逻辑供电电源 ×1 TowerPro SG90舵机 ×1 测试代码： void setup() { Serial.begin(115200);//Set the baudrate to 115200 A:1 B:1 delay(100);//wait for baudrate setting finished } void loop() { Serial.print("#5 P750");// Channel 5 will move to 750us within 500ms delay(5); //wait for first comand transmission done, if you send // a long command, you'd better extend it Serial.print("\r"); // send Carriage Return <CR> delay(1000); //wait for servo go to the set position Serial.print("#5 P2200");// Channel 5 will move to 2200us within 500ms delay(5); Serial.print("\r"); delay(1000); } Veyron_Servo_Driver_24-Channel 软件使用说明 1.快速参考图 先发一张图，所谓一图胜千言。。。 2.软件界面说明 Open可以打开一个已保存的文件（该软件是用xml格式存储数据的） Save可以将制作好的程序保存到电脑 Clear将会清空时间轴，也就是删除时间轴上所有的舵机 Undo从当前时间轴上删除最后添加的舵机 Redo恢复最后删除的舵机到当前时间轴 Sample同时添加24路舵机,每行一个,以方便用户调试，这将会清除时间轴上已添加的舵机 Drag to add添加一个新的舵机，注意，它的操作方法比较特殊，当光标移到它上面时，按住鼠标左键不要放开，然后拖动鼠标到下面的时间轴上，在合适的位置再放开鼠标，一个新的舵机就添加完成了，你可以在接下来了步骤中修改它的参数 Play Mode播放模式选择，有三种： 1.play only once 仅播放一次 2.back and forth 往复播放 3.loop playback 循环播放 Connect打开串口，就是与舵机控制器连接 COM29串口选择，要选择你的舵机控制器对应的串口，如果没有发现串口，则会显示No Port 57600波特率选择，当前默认值就是57600，一般不需要改动 设置时间轴总时间 在时间轴游标底部的拖动手柄，点击可拖动，从而改变当前的时间 播放控制区，分别是：回到起始位置，播放，暂停，停止 基本操作步骤： 1.首先下载安装程序 2.打开桌面上的程序 3.点击并拖到时间轴区域的合适位置，这就增加了一个新的舵机： 4.鼠标分别指向舵机的左右两边和中间部分按下并拖动，可以分别改变舵机的起始时间和结束时间 5.鼠标分别指向舵机的中间部分按下并拖动，可以改变舵机的位置 6.鼠标分别指向舵机的左右两边并右击，可以精确输入舵机的起始时间和结束时间 7.鼠标分别指向舵机的左右两边并双击，可以分别输入舵机的起始角度和结束角度 8.鼠标指向舵机中间部分右击或双击，可以改变舵机号 9.鼠标在时间轴空白处点击并左右拖动，可以改变时间轴当前视图位置 以上就是基本的操作方法，调试完成后就可以保存到电脑以便下次使用 3.一个简单的例程 这个例程的解释： 时间轴总时长是4秒； 在第0至1.5秒，舵机0 从0度转到100度，在第1.5至4秒，舵机0从100度转到0度； 在第0至4秒，舵机1从0度转到180度； 在第0至4秒，舵机2从180度转到0度。 舵机角度与PWM信号的关系 控制器命令集 1． 单个舵机和舵机群运动命令 # <ch> P <pw> S <spd>... # <ch> P <pw> S <spd> T <cr> <ch> ：舵机通道号，0 – 23。 <pw> ：脉冲宽度，单位微秒（us），500 – 2500。 <spd> ：单通道的运动速度，单位us/秒。(可选) ：所有通道的速度，单位毫秒（ms），最大65535。(可选) <cr> ：结束回车符，ASCII码中的13。(必选) <esc> ：取消当前的命令，ASCI码中的27。 单个舵机运动实例： #5 P1600 S750 <cr> 通道5将以750us/秒的速度移动到1600us位置。为了更好的理解速度这个概念，举个例子，如上图所示的舵机与脉冲信号（PWM）的关系，当舵机从-90度到0度时，脉冲宽度为1ms时间即1000us，也就是说1000us脉冲宽度舵机就会转90度，那么100us/秒的速度就表示舵机花10秒的时间就可以转到90度，2000us/秒的速度就表示舵机花0.5秒的时间就可以转到90度。公式：运行时间（秒）=脉冲宽度（us）/速度（us/秒）。 #5 P1600 T1000 <cr> 通道5将在1秒内从任何位置移动到1600us位置。 #5 P1600 #10 P750 T2500 <cr> 通道5移动到1600us位置，通道10移动到750us的位置，2个都同时在2500ms内完成，这个命令能协调多个舵机的速度，即使2个舵机的初始位置相差很远，都可以使他们同时开始转动并同时停止到指定位置上。这条命令非常适合人形双足机器人多舵机同时运动，可自动协调所有舵机的速度，完成复杂步态的同步。 你可以使用该命令进行速度和时间组合，组合必须根据下面的规则： A． 所有通道的开始和结束将同时完成。 B． 如果某个通道指定了速度，那么它将不会快于指定速度（可以根据需要调节移动速度）。 C． 如果某个通道指定了时间，那么它将在指定的时间移动到指定位置（可根据需要调节移动时间）。 #5 P1600 #17 P750 S500 #2 P2250 T2000 <cr> 通道5移动到1600us位置，通道17移动到750us的位置，通道2机移动到2250us的位置，整个动作需要2000us，但是通道17的舵机不会按500us/秒的速度运行，这个需要取决于通道17的初始位置。假设通道17的初始位置在2000us，它被指定移动1250us，超过500us/秒的限制，那么他将至少花2500ms完成动作，再假设通道17初始位置在1000us，只需要它移动250us，那么在500us/秒以内，那么他将花2000ms完成动作。 注意：第一条定位命令不能包含速度和时间的，格式为“# P ”，因为在初始状态下，控制器不知道舵机当前位置在什么地方，所以必须这样做 。 2． 脉冲偏移： # <ch>PO <offset value> … # <ch> PO <offset value> <cr> <ch> ：舵机通道号，0 – 23。 <offset value> ： 100 到 -100us. <cr> ：结束回车符，ASCII码中的13。 对某个通道的脉冲宽度进行校正，这样人形机器人就可以不用通过机械硬件来进行位置校正。 3． 数字输出： # <ch><lvl> ... # <ch> <lvl><cr> <ch> ：舵机通道号，0 – 23。 <lvl> ：通道输出逻辑电平，高‘H’或低‘L’。 <cr> ：结束回车符，ASCII码中的13。 该通道将在接受到回车指令20ms内输出电平。 数字输出实例： #3H #4L <cr> 该命令使通道3输出高电平（+3.3V），通道4输出低电平（0V）。 4． 字节输出： # <bank> : <value><cr> <bank> ：0 = 通道0-7，1 = 通道8-15，2 = 通道16-23。 <value> ：十进制输出 (0-255)，Bit0=LSB。 该命令允许一次性写入8位二进制，并将同时更新bank里的所有通道，更新将在接受到回车符号后20ms内完成 字节输出实例： #1:123 <cr> 该命令使bank 1输出十进制123，123（十进制）= 01111011（二进制），bank 1为通道8-15，那么bank 1中通道8和13为0，其他通道为1。 5．查询运动状态： Q <cr> 如果舵机正在转动，返回值为“+”，如果移动到指定位置，返回“.”。 这条命令的返回值可能延迟50us至5ms。 6． 查询脉冲宽度： QP <ch><cr> <ch> ：舵机通道号，0 – 23。 返回值为一个字节（二进制），表示舵机当前的脉冲宽度，分辨率10us，比如脉冲宽度是1500us，那么返回为150（二进制）。 该命令可查询多个舵机的脉冲宽度，每个舵机一个字节，返回值将延迟50us至5ms，典型为100us。 疑难解答 问： 在用arduino控制舵机的实验中，我按照图示的接线，外部电源供电也没问题，但舵机一直不转，请问怎么解决？ 答： 您好！是由于波特率设置的问题，请检查板子上的波特率设置开关以及控制方式的选择开关。如果您代码中用的是115200，请将开关置于：A1 B1的位置，另外一个开关置于SERIAL一边。另外，开关存在接触不良的情况，请将开关先拨到0，0的位置，再稍微用点力拨到另一端。即可解决！ 相关文档 Veyron Windows驱动和DFServo软件下载 本文整理于 DFRobot wiki