第8课 风扇#

8.1 项目介绍#

130电机控制模块采用HR1124S电机控制芯片。HR1124S是应用于直流电机方案的单通道H桥驱动器芯片。HR1124S的H桥驱动部分采用低导通电阻的PMOS和NMOS功率管。低导通电阻保证芯片低的功率损耗,使得芯片安全工作更长时间。此外HR1124S拥有低待机电流,低静态工作电流,这些性能使HR1124S易用于玩具方案。

该模块兼容各种单片机控制板,如arduino系列单片机。模块上自带的防反插红色端子间距为2.54mm,实验中,我们可通过输出到两个信号端IN+和IN-的电压方向来控制电机的转动方向,使用PWM输出控制风扇的转速,让电机转动起来。

8.2. 模块相关资料#

(1)元件知识:

130电机控制模块采用HR1124S电机控制芯片。HR1124S是应用于直流电机方案的单通道H桥驱动器芯片。HR1124S的H桥驱动部分采用低导通电阻的PMOS和NMOS功率管。低导通电阻保证芯片低的功率损耗,使得芯片安全工作更长时间。此外HR1124S拥有低待机电流,低静态工作电流,这些性能使HR1124S易用于玩具方案。

该模块兼容各种单片机控制板,如arduino系列单片机。模块上自带的防反插红色端子间距为2.54mm,实验中,我们可通过输出到两个信号端IN+和IN-的电压方向来控制电机的转动方向,使用PWM输出控制风扇的转速,让电机转动起来。

工作电压:

3.3-5V(DC)

最大电流:

200mA (DC5V)

最大功率:

1W

控制接口:

双数字口(数字输入)

工作温度:

-10°C ~+50°C

环保属性:

ROHS

(2)控制方法

需要两个引脚控制风扇的电机,一引脚为IN+,二引脚为IN-。PWM值范围是0~255,当两个引脚的PWM输出一定差值时,风扇就能转动。

IN+ - INB- = -45

顺时针转动

IN± IN- ;= 45

逆时针转动

IN+ == 0 , IN- == 0

停止

8.3 实验组件#

ESP32 Plus主板 *1

按键 *2

130电机模块 *1

风扇叶 *1

4P线 *1

3P线 *2

USB线 *1

8.4 模块接线图#

木板房子⑦处(左侧)按键1,木板房子⑨处(右侧)按键2和130电机模块的控制引脚:

木板房子⑦处(左侧)按键1(S引脚)

io4

木板房子⑨处(右侧)按键2(S引脚)

io32

电机模块的IN+引脚

io19

电机模块的IN-引脚

io18

⚠️ 特别注意:智能家居已经组装好了,这里不需要把按键模块和130电机模块拆下来又重新组装和接线,这里再次提供接线图,是为了方便您编写代码!

8.5 控制风扇转动的实验代码1#

控制风扇的正反转和速度。

/*  
 * 项目: Fan
 * 描述: 风扇转动
 * 编译IDE:ARDUINO IDE
 * 作者: http//www.keyes-robot.com
*/
#define fanPin1 19
#define fanPin2 18

void setup() {
  pinMode(fanPin1, OUTPUT);
  pinMode(fanPin2, OUTPUT);
}

void loop() {
  digitalWrite(fanPin1, LOW); //pwm = 0
  analogWrite(fanPin2, 180);
  delay(3000);
  digitalWrite(fanPin1, LOW);
  digitalWrite(fanPin2, LOW);
  delay(1000);
  digitalWrite(fanPin1, HIGH); //pwm = 255
  analogWrite(fanPin2, 210);
  delay(3000);
  digitalWrite(fanPin1, LOW);
  digitalWrite(fanPin2, LOW);
  delay(1000);
}

8.6 实验结果1#

按照接线图接好线,外接电源,选择好正确的开发板板型(ESP32 Dev Module)和 适当的串口端口(COMxx),然后单击按钮上传示例代码至ESP32主控板。示例代码上传成功后,上电后,可以看到顺时针和逆时针不同转速转动。

Img

8.7 代码流程图#

8.8 按钮开关风扇的实验代码2#

一台简易的风扇,通过木板房子⑦处(左侧)按键1开关风扇,木板房子⑨处(右侧)按键2控制风扇的速度。

/*  
 * 项目: btn_fan
 * 描述: 按键控制风扇,模拟换档风扇
 * 编译IDE:ARDUINO IDE
 * 作者: http//www.keyes-robot.com
*/
#define fanPin1 19    // 风扇控制引脚1
#define fanPin2 18    // 风扇控制引脚2
#define btn1 4       // 按钮引脚1
#define btn2 32       // 按钮引脚2

int btn_count = 0;    // 计数器按钮1按下
int btn_count2 = 0;   // 计数器按钮2按下
int speed_val = 130;  // 风扇初始转速(PWM值)

void setup() {
  Serial.begin(9600);
  pinMode(btn1, INPUT);
  pinMode(btn2, INPUT);
  pinMode(fanPin1, OUTPUT);
  pinMode(fanPin2, OUTPUT);
}

void loop() {
  boolean btn1_val = digitalRead(btn1);
  
  // 按钮1(功率/速度控制)处理
  if(btn1_val == 0) // 如果按下按钮
  {
    delay(10);  // 防反跳延迟
    if(btn1_val == 0) // 确认按下按钮
    {
      boolean btn_state = 1;
      while(btn_state == 1) // 等待松开按键
      {
        boolean btn_val = digitalRead(btn1);
        if(btn_val == 1)  // 如果松开按键
        {
          btn_count++;    // 增量压计数器
          Serial.println(btn_count);
          btn_state = 0;  // 退出循环
        }
      }
    }
    
    boolean power_state = btn_count % 2; // 切换电源状态(0或1)
    
    while(power_state == 1) // 当风扇打开时
    {
      digitalWrite(fanPin1, LOW);  // 设置方向
      analogWrite(fanPin2, speed_val); // 设置速度
      
      // 按钮2(速度调节)处理
      boolean btn2_val = digitalRead(btn2);
      if(btn2_val == 0) // 如果按下速度键
      {
        delay(10); // 防反跳延迟
        if(btn2_val == 0) // 确认按下
        {
          boolean btn_state2 = 1;
          while(btn_state2 == 1) // 等待释放
          {
            boolean btn2_val = digitalRead(btn2);
            if(btn2_val == 1) // 如果松开
            {
              btn_count2++; // 递增速度等级
              if(btn_count2 > 3) // 循环1-3
              {
                btn_count2 = 1;
              }
              
              // 根据计数设置速度
              switch(btn_count2)
              {
                case 1: 
                  speed_val = 130; // 低速
                  Serial.println(speed_val);
                  break;
                case 2: 
                  speed_val = 180; // 中速
                  Serial.println(speed_val);
                  break;
                case 3: 
                  speed_val = 230; // 高速
                  Serial.println(speed_val);
                  break;
              }
              btn_state2 = 0;
            }
          }
        }
      }
      
      // 检查是否断电
      btn1_val = digitalRead(btn1);
      if(btn1_val == 0) // 如果按下电源按钮
      {
        delay(10); // 防反跳延迟
        if(btn1_val == 0) // 确认按下
        {
          digitalWrite(fanPin1, LOW); // 关闭风扇
          analogWrite(fanPin2, 0);
          power_state = 0;  // 退出控制风扇循环
        }
      }
    }
  }
}

8.9 实验结果2#

按照接线图接好线,外接电源,选择好正确的开发板板型(ESP32 Dev Module)和 适当的串口端口(COMxx),然后单击按钮上传示例代码至ESP32主控板。示例代码上传成功后,上电后,先点击一下木板房子⑦处(左侧)按键1,风扇开始转动,再点击木板房子⑨处(右侧)按键2进行调速,可以调节风扇不同的转速,最后按一下木板房子⑦处(左侧)按键1,风扇停止。

Img