eagler8 发表于 2020-11-11 11:03:32

驱动直流电机

eagler8 发表于 2020-11-11 11:25:58


驱动伺服电机(舵机)

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

eagler8 发表于 2020-11-11 16:37:41

本帖最后由 eagler8 于 2020-11-11 16:52 编辑

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

/*
【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
}
}

eagler8 发表于 2020-11-11 16:55:37

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

/*
【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);      
}
}

eagler8 发表于 2020-11-11 17:11:29

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的接地和外部电源连接在一起。

eagler8 发表于 2020-11-11 17:11:52

本帖最后由 eagler8 于 2020-11-11 18:39 编辑

使用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() {}

eagler8 发表于 2020-11-11 18:40:23

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

eagler8 发表于 2020-11-11 19:16:02

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

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

eagler8 发表于 2020-11-11 19:29:54

/*
【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步
}

eagler8 发表于 2020-11-11 19:37:26

与步进电机有关的函数
确保导入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,这个库带有电机加减速度功能。

eagler8 发表于 2020-11-12 19:38:03

/*
【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);
}

eagler8 发表于 2020-11-12 19:40:48

eagler8 发表于 2020-11-12 20:27:14

使用Arduino AFMotor驱动四只直流电机

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

1、安装库:百度搜索“AFMotor库”— 下载 — 拷贝到Arduino-libraries 文件夹中
2、实验之七:使用Arduino AFMotor驱动四只直流电机
*/

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

AF_DCMotor motor1(1); // 这4条语句的作用是建立4个直流电机对象,它们的名称分别是:motor1/2/3/4.
AF_DCMotor motor2(2); // 这四条语句括号中的数字代表各个电机对象所连接在AFMotor扩展板的电机端口号码。
AF_DCMotor motor3(3); // AF_DCMotor motor1(1); 代表motor1对象连接在AFMotor扩展板的M1端口上。
AF_DCMotor motor4(4); // AFMotor电机扩展板最多可以驱动4个直流电机,最少可以驱动1个直流电机。

void setup() {
motor1.setSpeed(200); // 这4条语句的作用是通过setSpped库函数设置电机运行速度。
motor2.setSpeed(200); // setSpped库函数中的参数是运行速度参数。
motor3.setSpeed(200); // 运行速度参数允许范围是0~255。
motor4.setSpeed(200); // 速度参数越大,运转速度越快。参数为0时电机停止转动。

motor1.run(RELEASE); // 这4条语句的作用是让4个电机在启动时停止转动
motor2.run(RELEASE); // run库函数允许使用的关键字参数有RELEASE、FORWARD、BACKWARD
motor3.run(RELEASE); // 使用关键字RELEASE作为参数使用时,run库函数将会让扩展板停止提供电机运转动力
motor4.run(RELEASE); // 电机旋转一旦失去动力就会自然的停止转动。
}

void loop() {
motor1.run(FORWARD); // 这4条语句的作用是利用run库函数控制4个电机"正向"旋转。
motor2.run(FORWARD); // 这里所谓的“正向”旋转只是一种说法,假如您发现电机旋转方向和您所要的“正向”不一致。
motor3.run(FORWARD); // 您可以将电机的两个引线从扩展板上断开,然后交换顺序再接到扩展板接口上
motor4.run(FORWARD); // 这时您会看到同样使用FORWARD关键字作为run库函数的参数,电机的旋转方向却反过来了。

for (int i = 0; i <= 255; i++) { // 这里使用for循环语句控制4个电机速度由停止逐步加速,最终电机运转达到最大速度。
    motor1.setSpeed(i);          // 在for循环语句的作用下,setSpeed库函数的速度参数i由0逐渐增大,最终达到255。
    motor2.setSpeed(i);          // 因此电机运行速度也是由停止逐渐加速,最终达到最大速度。
    motor3.setSpeed(i);          // 对于一些模型电机来说,当速度参数小于一定数值以后就不能转动了。也就是说,也许您的电机
    motor4.setSpeed(i);          // 在速度参数在小于某一个速度参数数值的时候就无法转动了。这属于正常现象。
    delay(10);                   // 具体这个最小值是多少,对于不同的电机来说是不同的。有的可能是50也有的可能是100。
}                               // 换句话说,很可能您的某一个直流电机在速度参数小于50的情况下就无法转动了。
// 也可能您的另一个直流电机在参数100以下的情况下就无法转动了。

for (int i = 255; i >= 0; i--) { // 这里使用for循环语句控制4个电机由最大旋转速度逐步减速最终停止旋转。
    motor1.setSpeed(i);          // 这一系列语句的操作与上一段for循环语句类似。唯一区别是上一段for循环控制速度参数i由0涨到255
    motor2.setSpeed(i);          // 而这一段语句控制速度参数i由255减小到0。同样您可能会发现当速度参数没有减小到零的时候,电机就已经
    motor3.setSpeed(i);          // 停止旋转了。这其中的原因在上一段for循环语句中已经介绍了。不在这里赘述了。
    motor4.setSpeed(i);
    delay(10);
}

motor1.run(BACKWARD); // 这4条语句的作用是利用run库函数控制4个电机"反向"旋转。
motor2.run(BACKWARD); // 同样的,这里所谓的“反向”旋转也只是一种说法。这部分程序内容
motor3.run(BACKWARD); // 与本程序33-36行中的内容十分类似。唯一区别就是使用了“BACKWARD”
motor4.run(BACKWARD); // 关键字参数来通过库函数run控制电机“反向”旋转。

for (int i = 0; i <= 255; i++) { // 利用for循环语句控制速度参数i由小到大
    motor1.setSpeed(i);          // 电机也会以“反向”旋转的方式由停止逐步达到最大速度
    motor2.setSpeed(i);
    motor3.setSpeed(i);
    motor4.setSpeed(i);
    delay(10);
}

for (int i = 255; i >= 0; i--) { // 利用for循环语句控制速度参数i由大到小
    motor1.setSpeed(i);          // 电机也会以“反向”旋转的方式由最大速度逐步减小到停止
    motor2.setSpeed(i);
    motor3.setSpeed(i);
    motor4.setSpeed(i);
    delay(10);
}

motor1.run(RELEASE);   // 这四条语句作用是使用关键字RELEASE作为run函数的参数。
motor2.run(RELEASE);   // 在这种情况下,AFMotor扩展板将会停止为电机旋转提供动力。
motor3.run(RELEASE);   // 电机也就会自然的停止转动。
motor4.run(RELEASE);   // 本段程序后面的delay(1000)的作用就是让4个电机保持无旋转动力状态1秒钟

delay(1000);
}

eagler8 发表于 2020-11-13 08:06:42

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

msold5 发表于 2020-11-13 08:22:51

早鸟的连续剧越来越丰富了
页: 1 2 [3] 4 5
查看完整版本: 【Arduino】168种传感器系列实验(170)---L293D四路电机驱动板