Arduino 智能小车-电机控制(20180504实训课--华清远见)

1.Arduino 电机驱动模块

  • Arduino 小车使用的电机驱动模块为 L298N,模块如下图: 

  • L298N 引脚描述如下:

    • +12V:该引脚接的电压是驱动模块所能输出给电机的最大电压,一般 直接接电池
    • GND: 在该项目中 GND 即为 电源的负极,同时要保证Arduino开发板,驱动模块等所有模块的GND连在一起才可以正常工作 .
    • +5V: L298N模块(注意不是L298N芯片)内含稳压电路(将高电压转换为低电压的电路),在模块内部将 +12V 引脚输入的电压转化为可供开发板使用的+5V电压,一般将次输出接入到开发板为开发板供电.
  • L298N 模块有两路输出,可以控制小车的前进,后退,转弯.

    • ENA : 代表第一路输出的电压大小,驱动模块输出电压越高,电机转速越快。 
      • 当其输入为0V的时候,驱动模块输出对第一路电机输出电压为0V.
      • 当其输入为3.3V的时候,驱动模块对第一路电机输出电压为+12V 引脚的输入电压。
      • 由于 ENA 输入电压的高低控制驱动对电机的输出电压,因此当我们需要对小车运动速度进行控制的时候,一般通过PWM对 ENA 引脚进行控制
    • IN1/IN2 : 这两个引脚控制电机正反转方向,具体控制表:
ENA IN1 IN2 直流电机状态
0 X X 停止
1 0 0 制动
1 0 1 正转
1 1 0 反转
1 1 1 制动

2.L298N 工作原理

  • L298N 电机驱动模块使用的 H 桥电路, H 桥电路典型的原理图如下:

  • H 桥由2个P型场效应管Q1、Q2与2个N型场效应管Q3、Q3组成,所以它叫P-NMOS管H桥.
  • 桥臂上的4个场效应管相当于四个开关,P型管在栅极为低电平时导通,高电平时关闭N型管在栅极为高电平时导通,低电平时关闭
  • 场效应管是电压控制型元件,栅极通过的电流几乎为  

  • 在 H 桥电路中具体的控制如下:

    • 控制臂1置高电平(U=VCC)、控制臂2置低电平(U=0)时,Q1、Q4关闭,Q2、Q3导通,电机左端低电平,右端高电平,所以电流沿箭头方向流动。设为电机正转

    • 控制臂1置低电平、控制臂2置高电平时,Q2、Q3关闭,Q1、Q4导通,电机左端高电平,右端低电平,所以电流沿箭头方向流动。设为电机反转 
    • 当控制臂1、2均为低电平时,Q1、Q2导通,Q3、Q4关闭,电机两端均为高电平,电机不转
    • 当控制臂1、2均为高电平时,Q1、Q2关闭,Q3、Q4导通,电机两端均为低电平,电机也不转

3.Arduino 开发板与 L298N

3.1 电路连接

  • L298 N 内部的稳压电路的输出为 5v 提高给 Arduino 作为电源.
  • L298 N 的 IN1 - IN4 分别与 Arduino 的 IO 引脚相连,我选择的是 4 ,5,6,7,具体分布如下:

    • 引脚 4 - 5 : 控制右边的电机
    • 引脚 6 - 7 : 控制左边的电机
  • 将左边的两个电机与 L298N IN3/IN4 连接,将右边的两个电机与 L298N IN1/IN2 连接.

  • L298N 的 +12v 与电池相连,提供电机驱动电源
  • 具体的连线参考图如下: 

3.2 编程实现

  • 建立 Arduino 工程文件,并编写如下代码:

    • step 1 : 定义5种运动状态,具体程序如下

       
            
      1. #define STOP 0 //停止
      2. #define FORWARD 1 //前进
      3. #define BACKWARD 2 //后退
      4. #define TURNLEFT 3 //左转
      5. #define TURNRIGHT 4 //右转
    • step 2 : 定义左右电机控制引脚

       
            
      1. //左边的电机控制引脚
      2. int leftMotor_1 = 6;
      3. int leftMotor_2 = 7;
      4. //右边的电机控制引脚
      5. int rightMotor_1 = 4;
      6. int rightMotor_2 = 5;
    • step 3 : 在 setup() 函数中,设置相关控制引脚为 output 功能,具体代码如下:

       
            
      1. void setup() {
      2. // put your setup code here, to run once:
      3. //设置控制电机的引脚为输出状态
      4. pinMode(leftMotor_1, OUTPUT);
      5. pinMode(leftMotor_2, OUTPUT);
      6. pinMode(rightMotor_1, OUTPUT);
      7. pinMode(rightMotor_2, OUTPUT);
      8. }
    • step 4 : 在 loop() 函数中,添加电机控制代码,实现小车向前,向后,向左,向右的控制,可以调用以下函数完成.

    • 相应的函数封装如下:

       
            
      1. //控制小车左转,左边电机停止,右边电机正转
      2. void moveLeft(void)
      3. {
      4. digitalWrite(leftMotor_1, LOW);
      5. digitalWrite(leftMotor_2, LOW);
      6. digitalWrite(rightMotor_1, LOW);
      7. digitalWrite(rightMotor_2, HIGH);
      8. }
     
        
    1. //控制小车右转,左边电机正转,右边电机停止
    2. void moveRight(void)
    3. {
    4. digitalWrite(leftMotor_1,LOW);
    5. digitalWrite(leftMotor_2, HIGH);
    6. digitalWrite(rightMotor_1, LOW);
    7. digitalWrite(rightMotor_2, LOW);
    8. }
     
        
    1. //控制小车前进,左边电机正转,右边电机正转
    2. void moveForward(void)
    3. {
    4. digitalWrite(leftMotor_1, LOW);
    5. digitalWrite(leftMotor_2, HIGH);
    6. digitalWrite(rightMotor_1, LOW);
    7. digitalWrite(rightMotor_2, HIGH);
    8. }
     
        
    1. //控制小车反转,左边电机反转,右边电机反转
    2. void moveBackward(void)
    3. {
    4. digitalWrite(leftMotor_1, HIGH);
    5. digitalWrite(leftMotor_2, LOW);
    6. digitalWrite(rightMotor_1, HIGH);
    7. digitalWrite(rightMotor_2, LOW);
    8. }
     
        
    1. //控制小车停止,左边电机停止,右边电机停止
    2. void stopCar(void)
    3. {
    4. digitalWrite(leftMotor_1, LOW);
    5. digitalWrite(leftMotor_2, LOW);
    6. digitalWrite(rightMotor_1, LOW);
    7. digitalWrite(rightMotor_2, LOW);
    8. }

4.相关 Arduino API

  • digitalWrite() 函数:

     
        
    1. digitalWrite(pin, value)
    2. 功能 : 通过指定引脚输出电平信号
    3. 参数 :
    4. @param pin : 引脚编号
    5. @param value : 输出电平信号值
    6. HIGH : 高电平信号
    7. LOW : 低电平信号
  • delay() 函数:

     
        
    1. delay(ms)
    2. 功能 : 延时函数
    3. 参数 :
    4. @param ms : 延时时间,单位为 ms

你可能感兴趣的:(Arduino)