回到首页 返回首页
回到顶部 回到顶部
返回上一页 返回上一页

【雕爷学编程】Arduino动手做(154)---AFMotor电机扩展板模块2 中等

头像 驴友花雕 2023.07.07 46 5

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞不掂的问题,希望能够抛砖引玉。

 

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百五十四:L293D四路电机驱动扩展板 motor control shield 马达板 Adafruit Motor Shield模块 Arduino AFMotor 电机扩展板

 

00.jpg

实验之二:引擎测试—用串口查看2号直流电机运转情况

Arduino实验开源代码


 

代码
/*

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

实验一百五十四:L293D四路电机驱动扩展板 motor control shield 马达板 

Adafruit Motor Shield模块 Arduino AFMotor 电机扩展板

 1、安装库:百度搜索“AFMotor库”— 下载 — 拷贝到Arduino-libraries 文件夹中

 2、实验之二:引擎测试—用串口查看2号直流电机运转情况

*/



#include "AFMotor.h"

AF_DCMotor motor(2);

void setup() {

 Serial.begin(9600);      // set up Serial library at 9600 bps

 Serial.println("引擎测试 Motor test!");

 // turn on motor

 motor.setSpeed(200);

 motor.run(RELEASE);

}

void loop() {

 uint8_t i;

 Serial.println("向前 FORWARD!");

 motor.run(FORWARD);

 for (i = 0; i < 255; i++) {

  motor.setSpeed(i);

  delay(10);

 }

 for (i = 255; i != 0; i--) {

  motor.setSpeed(i);

  delay(10);

 }

 Serial.println("向后 BACKWARD!");

 motor.run(BACKWARD);

 for (i = 0; i < 255; i++) {

  motor.setSpeed(i);

  delay(10);

 }

 for (i = 255; i != 0; i--) {

  motor.setSpeed(i);

  delay(10);

 }

 Serial.println("停止 RELEASE!");

 motor.run(RELEASE);

 delay(1000);

}

实验串口返回情况


19.jpg

AF_DCMotor 类函数

AFMotor类配合Adafruit Motor Shied可以最多同时控制4个直流电机的速度和方向。要使用这些功能,首先要在开头添加库文件:

#include <AFMotor.h>

AF_DCMotor motorname(portnum,freq)

这是一个建立一个直流电机的函数。在程序中需要声明每个电机各一次。像下面的例子中一样,每个电机必须使用不同的名字。

参数:

port num - 选择你的电机连接到电机驱动板上的接口(1-4)

freq - 选择PWM频率。如果你没有选择这个选项,默认设置为1KHZ。

适用于通道1和2的频率:

MOTOR12_64KHZ

MOTOR12_8KHZ

MOTOR12_2KHZ

MOTOR12_1KHZ

适用于通道3和4的频率:

MOTOR34_64KHZ

MOTOR34_8KHZ

MOTOR34_1KHZ

例如:

AF_DCMotor motor4(4);//通道4,默认1KHZ频率

AF_DCMotor left_motor(1,MOTOR12_64KHZ);//通道1,64KHZ频率

注意:更高的频率会减小电机在运动过程中的噪音,但同时也会降低扭矩。

setSpeed(speed)

设置电机的速度

参数:

speed-范围为0到255,0代表停止,255代表全速。

注意:直流电机的回馈并不是典型线性的,所以真正的转速并不会与程序中设定的速度成正比。

run(cmd)

设置电机的运转模式

参数:

cmd - 选择你想要的电机运转模式

可选择的模式:

FORWARD - 正转(真正的转动方向取决于你电机的连线)

BACKWARD - 反转 (转动方向与正转相反)

RELEASE - 停止。使电机断电,与setSpeed(0)函数功能相同。调用了这个函数后,电机需要一定时间才能彻底停止。

 

AFMotor电机扩展板模块使用,需要重视电机干扰,每个电机上加3只0.1u(104)的小电容,具体连接见下图


16.jpg

驱动直流电机

 

16- (1) (1).jpg

驱动伺服电机(舵机)

首先需要安装库:IDE—工具—管理库—搜索“servo”—安装

 

20 (1).jpg

实验之三:驱动单只伺服电机(2号舵机)

Arduino实验开源代码


 

代码
/*

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

实验一百五十四:L293D四路电机驱动扩展板 motor control shield 马达板 

Adafruit Motor Shield模块 Arduino AFMotor 电机扩展板

 1、安装库:IDE—工具—管理库—搜索“Servo”—安装

 2、实验之三:驱动单只伺服电机(2号舵机)

*/



#include <Servo.h>

Servo myservo; // create servo object to control a servo

// twelve servo objects can be created on most boards

int pos = 0;  // variable to store the servo position

void setup() {

 myservo.attach(9); // attaches the servo on pin 9 to the servo object

}

void loop() {

 for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees

  // in steps of 1 degree

  myservo.write(pos);       // tell servo to go to position in variable 'pos'

  delay(15);            // waits 15ms for the servo to reach the position

 }

 for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees

  myservo.write(pos);       // tell servo to go to position in variable 'pos'

  delay(15);            // waits 15ms for the servo to reach the position

 }

}

实验之四:驱动二只伺服电机(1号与2号舵机)

Arduino实验开源代码


 

代码
/*

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

实验一百五十四:L293D四路电机驱动扩展板 motor control shield 马达板 

Adafruit Motor Shield模块 Arduino AFMotor 电机扩展板

 1、安装库:IDE—工具—管理库—搜索“Servo”—安装

 2、实验之四:驱动二只伺服电机(1号与2号舵机)

*/



#include <Servo.h>

Servo servo1;  //建立舵机对象servo1

Servo servo2;  //建立舵机对象servo2

 

int pos = 0;   

void setup() {

 servo1.attach(10);  //servo1对象接在扩展板servo1端口。

            //servo1端口是由Arduino的10号引脚来控制的。

 servo2.attach(9);   //servo2对象接在扩展板servo2端口。

            //servo2端口是由Arduino的9号引脚来控制的。 

}

 

void loop() {

 //以下程序将控制servo1输出轴左右旋转180度

 for (pos = 0; pos <= 180; pos += 1) { 

  servo1.write(pos);        

  delay(15);            

 }

 for (pos = 180; pos >= 0; pos -= 1) { 

  servo1.write(pos);   

  delay(15);    

 }

  

 //以下程序将控制servo2输出轴左右旋转180度

 for (pos = 0; pos <= 180; pos += 1) { 

  servo2.write(pos);        

  delay(15);            

 }

 for (pos = 180; pos >= 0; pos -= 1) { 

  servo2.write(pos);   

  delay(15);    

 }  

}

Servo库

允许Arduino / Genuino开发板控制各种伺服电机(舵机)。 该库可以控制大量的伺服器。它仔细使用了计时器:该库仅使用1个计时器就可以控制12个伺服器。在Arduino Due上,最多可以控制60个伺服器。

该库与avr,megaavr,sam,samd,nrf52,stm32f4,mbed 架构兼容。要使用此库,请在Arduino IDE中打开库管理器,然后从那里安装它。

该库允许Arduino开发板控制RC(业余)伺服电机。伺服系统具有集成的齿轮和可精确控制的轴。标准伺服器允许将轴以各种角度定位,通常在0到180度之间。连续旋转伺服器允许将轴的旋转设置为各种速度。

伺服库在大多数Arduino板上最多支持12个电机,在Arduino Mega上最多支持48个电机。在Mega以外的板上,使用该库会禁用analogWrite()引脚9和10上的(PWM)功能,无论这些引脚上是否有Servo。在Mega上,最多可以使用12个伺服器,而不会影响PWM功能。使用12到23个电机将禁用引脚11和12上的PWM。

要使用此库:

#include <Servo.h>

电路图

伺服电机(舵机)有三根电线:电源线,地线和信号线。电源线通常为红色,应连接至Arduino板上的5V引脚。接地线通常为黑色或棕色,应连接至Arduino板上的接地引脚。信号引脚通常为黄色,橙色或白色,应连接至Arduino板上的数字引脚。请注意,伺服器消耗的功率很大,因此如果需要驱动一两个以上,则可能需要使用单独的电源(即,不是Arduino上的+ 5V引脚)为它们供电。确保将Arduino的接地和外部电源连接在一起。


16-- (1).jpg

使用Servo库

1、Servo-attach()函数(连接)

将伺服变量附加到引脚上。请注意,在Arduino 0016及更早版本中,Servo库仅在两个引脚上仅支持舵机:9和10。

句法

servo.attach(pin)

servo.attach(pin, min, max)

参量

伺服:类型变量Servo

pin:伺服器连接的引脚号

min(可选):脉冲宽度(以微秒为单位),对应于伺服器上的最小(0度)角度(默认为544)

最大(可选):脉冲宽度(以微秒为单位),对应于伺服器上的最大(180度)角度(默认为2400)

#include <Servo.h>

Servo myservo;

void setup()

{

  myservo.attach(9);

}

void loop() {}

2、Servo-write(x)函数(写入)

将值写入伺服器,从而相应地控制轴。在标准伺服器上,这将设置轴的角度(以度为单位),将轴移动到该方向。在连续旋转伺服系统(360度舵机)上,这将设置伺服系统的速度(0表示一个方向的全速,180表示另一方向的全速,而90左右的值表示无运动)。

句法

servo.write(angle)

参量

伺服:伺服类型的变量

angle:写入伺服的值,从0到180

#include <Servo.h>

Servo myservo;

void setup()

{

  myservo.attach(9);

  myservo.write(90);  // set servo to mid-point

}

void loop() {}

 

3、Servo-writeMicroseconds()函数(精确控制)

以微秒(uS)为单位写入一个值,从而相应地控制轴。在标准伺服系统上,这将设置轴的角度。在标准伺服器上,参数值1000完全是逆时针方向,2000完全是顺时针方向,中间是1500。

请注意,某些制造商并未非常严格地遵循此标准,因此,伺服器通常会对700到2300之间的值做出响应。可以随意增加这些端点,直到伺服器不再继续增加其范围为止。但是请注意,尝试将伺服驱动器驱动通过其端点(通常由嘶嘶声表示)是高电流状态,应避免使用。连续旋转伺服器将以类似于写入功能的方式响应writeMicrosecond功能。

句法

servo.writeMicroseconds(uS)

参量

伺服:伺服类型的变量

us:参数值(以微秒为单位)(int)

#include <Servo.h>

Servo myservo;

void setup()

{

  myservo.attach(9);

  myservo.writeMicroseconds(1500);  // set servo to mid-point

}

void loop() {}

4、Servo-read()函数(读取)

读取伺服器的当前角度(该值传递给对write()的最后一次调用)。

句法

servo.read()

参量

伺服:类型变量Servo

反馈

伺服角度为0到180度。

5、Servo-Attached()函数(附加)

检查是否将Servo变量附加到引脚上。

句法

servo.attached()

参量

伺服:类型变量Servo

反馈

true如果伺服系统连接到引脚上;false除此以外。

6、Servo-detach()函数(分离)

从其引脚上拆下伺服变量。如果所有伺服变量均已分离,则可以使用AnalogWrite()将引脚9和10用于PWM输出。

句法

servo.detach()

参量

伺服:类型变量Servo

 


 

驱动28BYJ-48步进电机

AFMotor电机扩展板最多可以驱动2个28BYJ-48步进电机。以下我们将给您介绍两种电机扩展板的使用方法。第一种是在您开发项目时的使用方法,第二种是项目开发完毕后,在使用扩展板驱动电机工作时的方法。这两种方法最大的区别在于:开发时的Arduino开发板是通过USB数据线连接在电脑上的。但是在工作时开发板是不连接电脑的。

步进电机可以用来精确控制,很适合用于许多机器人或者CNC制作。这个电机驱动板做多支持2个步进电机。双极性和单极性电机都适合这个库。对于双极性电机(42二相四线电机):其中由两相,相1的两线连接到驱动板上的M1或者M3,相2的两线连接到驱动板上对于的M2或者M4上。运转一个步进电机比运转一个直流电机稍微复杂些,但总体还是比较简单的。


16--- (1).jpg

代码
/*

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

实验一百五十四:L293D四路电机驱动扩展板 motor control shield 马达板 

Adafruit Motor Shield模块 Arduino AFMotor 电机扩展板

 1、安装库:百度搜索“AFMotor库”— 下载 — 拷贝到Arduino-libraries 文件夹中

 2、实验之五:驱动28BYJ-48步进电机

*/

#include <AFMotor.h> // 本程序中使用AFMotor库

 

AF_Stepper motor1(2048, 1); // 这2条语句的作用是建立2个步进电机对象,它们的名称分别是:motor1/2。

AF_Stepper motor2(2048, 2); // 对象名称后面括号中的两个参数分别代表了步进电机旋转一周的步数以及

               // 步进电机连接在扩展板上的端口号。如AF_Stepper motor1(2048, 1)语句中

               // 参数2048代表motor1旋转一周需要走2048步。假如您的电机旋转一周需要32步,

               // 那么请在第一个参数位置输入32这一数字参数。

               // 括号中第二个参数1代表motor1连接在M1和M2端口。

               // 对于motor2对象,它括号中的参数2代表该电机连接在M3和M4端口。

 

void setup() {

 Serial.begin(9600);     //启动串口通讯

  

 motor1.setSpeed(10);    // 这2条语句的作用是通过setSpped库函数设置电机运行速度。

 motor2.setSpeed(10);    // setSpped库函数中的参数是运行速度参数。

               // 速度参数越大,运转速度越快。参数为0时电机停止转动。

}

 

/*

以下的loop函数中有4段程序语句。它们的内容十分类似,主要语句都是是通过step库函数来控制

步进电机的运行模式。step库函数一共有3个参数。如loop函数的第二行语句:motor1.step(2048, FORWARD, SINGLE)。

括号中的第一个参数是控制电机走的步数,这里的参数2048就是让电机走2048步。

接下来的关键字参数"FORWARD"作用是控制电机旋转方向。"FORWARD"是控制电机"正转",

这里也可以使用关键字"BACKWARD"让电机"反转"。

最后一个关键字参数是用于控制步进电机运转模式的。这里可选的关键字参数有:

SINGLE - 全步进模式(单线圈)。电机每走一步,扩展板只给一相线圈供电。

DOUBLE - 全步进模式(双线圈)。电机每走一步,扩展板会同时给两相线圈供电。

     此模式运行的电机比SINGLE模式下的扭矩要更大,但是电机耗电也会更多。

INTERLEAVE - 半步进模式。这种模式是SINGLE和DOUBLE的混合。电机每走一步,扩展板对线圈供电方式

       在一相和两相之间交替切换。举例来说,电机走第一步时,只有一相线圈通电。

       走第二步时,会有两相线圈供电,然后又是一相,再两相......这样交替通电。

       这种控制模式的优点是电机运行更流畅,但是缺点是运行速度大打折扣。

MICROSTEP - 微步进模式。此模式下的电机运行更光滑,但缺点是扭矩会打折扣。   

*/

 

void loop() {

 Serial.println("Single Mode");    //串口监视器输出当前运行模式为“Single”

 motor1.step(2048, FORWARD, SINGLE);  //步进电机以SINGLE模式"正转"2048步

 motor1.step(2048, BACKWARD, SINGLE);  //步进电机以SINGLE模式"反转"2048步

 

 Serial.println("Double Mode");    //串口监视器输出当前运行模式为“Double”

 motor2.step(2048, FORWARD, DOUBLE);  //步进电机以DOUBLE模式"正转"2048步

 motor2.step(2048, BACKWARD, DOUBLE);  //步进电机以DOUBLE模式"反转"2048步

 

 Serial.println("Interleave Mode");    //串口监视器输出当前运行模式为“Interleave”

 motor1.step(2048, FORWARD, INTERLEAVE);  //步进电机以INTERLEAVE模式"正转"2048步

 motor1.step(2048, BACKWARD, INTERLEAVE);  //步进电机以INTERLEAVE模式"反转"2048步

 

 Serial.println("Micrsostep Mode");     //串口监视器输出当前运行模式为“Micrsostep”

 motor2.step(2048, FORWARD, MICROSTEP);   //步进电机以MICROSTEP模式"正转"2048步

 motor2.step(2048, BACKWARD, MICROSTEP);   //步进电机以MICROSTEP模式"反转"2048步

}

与步进电机有关的函数
确保导入AFMotor库文件并#include < AFMotor.h>后,有这么几个函数需要用到

1、AF_Stepper steppername(steps,portnumber)
(1)steppername
给电机起个名字,然后这个名字就是此电机在程序中的代号了
(2)steps
设置电机每转的步数,比如设置36,则每步走1/36转
(3)portnumber
选择电机的通道,范围为1(通道1,2)和2(通道3和4)

2、Step(steps,direction,style)
(1)step
转动的步数
(2)direction
转动的方向FORWARD 或者 BACKWARD
(3)style
步进的模式,可以选择的参数:
a\SINGLE - 一次只给一相线圈供电
b\DOUBLE - 一次给两项项圈都供电,得到更大的扭矩
c\INTERLEAVE - 电机会运转得更柔滑,因为步数增加了一倍,同时速度也减小一半
d\MICROSTEP - 电机会运转的更柔滑,精度更高,但扭矩也会减小

如果想更精细地控制步进电机,可以使用AccelStepper library,这个库带有电机加减速度功能。

代码
/*

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

实验一百五十四:L293D四路电机驱动扩展板 motor control shield 马达板 

Adafruit Motor Shield模块 Arduino AFMotor 电机扩展板

 1、安装库:百度搜索“AFMotor库”— 下载 — 拷贝到Arduino-libraries 文件夹中

 2、实验之六:连接每转48步(7.5度)的步进电机,电机端口2#(M3和M4)

*/

#include <AFMotor.h>

// Connect a stepper motor with 48 steps per revolution (7.5 degree)

// to motor port #2 (M3 and M4)

AF_Stepper motor(48, 2);

void setup() {

 Serial.begin(9600);      // set up Serial library at 9600 bps

 Serial.println("Stepper test! 测试步进电机!");

 motor.setSpeed(10); // 10 rpm

}

void loop() {

 Serial.println("Single coil steps 单线圈步");

 motor.step(100, FORWARD, SINGLE);

 motor.step(100, BACKWARD, SINGLE);

 Serial.println("Double coil steps 双线圈步");

 motor.step(100, FORWARD, DOUBLE);

 motor.step(100, BACKWARD, DOUBLE);

 Serial.println("Interleave coil steps 交错线圈台阶");

 motor.step(100, FORWARD, INTERLEAVE);

 motor.step(100, BACKWARD, INTERLEAVE);

 Serial.println("Micrsostep steps 微步前进");

 motor.step(100, FORWARD, MICROSTEP);

 motor.step(100, BACKWARD, MICROSTEP);

}

实验串口返回情况


22.jpg

Arduino AFMotor 电机扩展板实验场景图


 21.jpg

评论

user-avatar
  • 花生编程

    花生编程2024.04.05

    赞赞赞

    0
    • 花生编程

      花生编程2024.04.05

      厉害

      0
      • 三春牛-创客

        三春牛-创客2023.08.29

        不错不错

        0
        • 三春牛-创客

          三春牛-创客2023.08.29

          厉害厉害

          0
          • hacker_

            hacker_2023.08.22

            666

            0
            icon 他的勋章
              展开更多