|
在本篇文章中,您将学习到如何通过使用Arduino开发板和L293D驱动器控制直流电机、步进电机和伺服电机。在本文结束时,您可以实现控制旋转方向、加速度、速度、功率和轴位置。
为什么用L293D驱动电机? 驱动电动机需要大电流。另外,旋转方向和速度是两个需要控制的重要参数。这些要求可以通过使用微控制器(或像Arduino这样的开发板)来处理。但有个问题;微控制器无法提供足够的电流来运行电机,如果直接将电机连接到微控制器,可能会损坏微控制器。例如,Arduino UNO引脚限制为40mA电流,远小于控制小型电机所需的100-200mA电流。要解决这个问题,我们应该使用电机驱动器。电机驱动器可以连接到微控制器以接收命令并以高电流运行电机。
L293D是最受欢迎的电机驱动器之一,可驱动直流电机,电流负载高达1A.L293D有4个输出,适用于4线步进电机。 L293D也可用于驱动伺服电机。在本项目中,您将学习如何使用L293和Arduino UNO作为控制器来驱动电机。
所需的组件 ● Arduino UNO R3开发板 ● 公USB A对公USB B线 ● L293D驱动器 ● 迷你面包板 ● 面包板跳线 ● 30V 3A可调电源 ● 直流减速电机 ● BYGH403 1.65A步进电机 ● TowerPro MG995 55G金属齿轮伺服电机
控制直流电动机
有几种类型的直流电机,但在这里我们将使用简单的有刷直流电机。它有小塑料齿轮,很容易驾驶。该电机适用于小型机器人和玩具。
电路
在此电路中,可调电源可以用9V电池或电源适配器替换。确保所有电线和电缆连接正确,然后上传代码。
代码 这是一个非常简单的代码。 您可以添加更多代码行以提高电机性能。 - // Basic sketch for trying out the L293D by www.Electropeak.com
- // Running single DC motor by L293D
- // 20/08/2018
-
-
- #define MOTOR_EN_1_2 10
- #define MOTOR_IN1 9
- #define MOTOR_IN2 8
-
- #define slow 64
- #define normal 128
- #define fast 255
-
- int Speed;
-
- void Forward_Rev(void){
- analogWrite(MOTOR_EN_1_2, Speed);
- digitalWrite(MOTOR_IN1, HIGH);
- digitalWrite(MOTOR_IN2, LOW);
- }
-
- void Backward_Rev(void){
- analogWrite(MOTOR_EN_1_2, Speed);
- digitalWrite(MOTOR_IN1, LOW);
- digitalWrite(MOTOR_IN2, HIGH);
- }
-
- void Forward_ramp_up(void){
- digitalWrite(MOTOR_IN1, HIGH);
- digitalWrite(MOTOR_IN2, LOW);
- for (int i=0; i<255; i++) { analogWrite(MOTOR_EN_1_2, i); delay(10); } } void Forward_ramp_down(void){ digitalWrite(MOTOR_IN1, HIGH); digitalWrite(MOTOR_IN2, LOW); for (int i=255; i>=0; i--) {
- analogWrite(MOTOR_EN_1_2, i);
- delay(10);
- }
- }
-
- void Backward_ramp_up(void){
- digitalWrite(MOTOR_IN1, LOW);
- digitalWrite(MOTOR_IN2, HIGH);
- for (int i=0; i<255; i++) { analogWrite(MOTOR_EN_1_2, i); delay(10); } } void Backward_ramp_down(void){ digitalWrite(MOTOR_IN1, LOW); digitalWrite(MOTOR_IN2, HIGH); for (int i=255; i>=0; i--) {
- analogWrite(MOTOR_EN_1_2, i);
- delay(10);
- }
- }
-
- void Brake(void){
- digitalWrite(MOTOR_IN1, HIGH);
- digitalWrite(MOTOR_IN2, HIGH);
- }
-
- void setup() {
-
- Serial.begin(9600);
- Serial.println("L293D DC motor test");
-
- pinMode(MOTOR_EN_1_2, OUTPUT);
- pinMode(MOTOR_IN1, OUTPUT);
- pinMode(MOTOR_IN2, OUTPUT);
- }
-
- void loop() {
-
- Speed=normal; // Normal Speed
-
- Forward_Rev();
- delay(1000);
- Brake();
- delay(500);
- Backward_Rev();
- delay(1000);
- Brake();
- delay(500);
- Forward_ramp_up();
- Forward_ramp_down();
- Backward_ramp_up();
- Backward_ramp_down();
-
- }
复制代码
控制步进电机 在这个项目中,我们使用四线步进电机。 您可以在三种模式下控制步进电机。 单步、半步和功率步。 您应该知道步进电机的接线连接。 如果不这样做,请使用欧姆表来查找。
电路 有时,步进电机会在电路中产生一些噪音。 你可以并联一些电容来移除它们。
代码 此代码仅适用于首次运行。 要提高电机的性能,可以使用Arduino库的示例代码
控制伺服电机 微型伺服电机(也称为9g伺服电机)在机器人手臂等小机器人项目中非常有用。 您应该生成PWM信号来控制伺服电机。 伺服电机根据其类型和尺寸可以非常快速和强大。
电路
代码 以下是Arduino库的代码 - #include
-
- 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() {
- digitalWrite(10,HIGH
- );
- myservo.attach(9); // attaches the servo on pin 9 to the servo object
- }
-
- void loop() {
- for (pos = 0; pos <= 180; pos += 3) { // 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(5); // waits 15ms for the servo to reach the position } for (pos = 180; pos >= 0; pos -= 3) { // goes from 180 degrees to 0 degrees
- myservo.write(pos); // tell servo to go to position in variable 'pos'
- delay(5); // waits 15ms for the servo to reach the position
- }
- }
复制代码
|