Arduino驱动直流电机风扇

  时隔多年,重拾Arduino,先拿直流电机风扇找一下手感。配套的东西如下图所示:直流电机、控制板、风扇、架子。
在这里插入图片描述
  装好之后的效果如下图所示。
在这里插入图片描述
  本文参照参考文献中的示例代码进行测试。参考文献中的代码主要通过按钮控制风扇的不同转速,本文中对代码进行了简化,为了测试程序的有效性,先在代码中写死转速,代码如下所示:


const int motorIn1=9;
const int motorIn2=10;

#define rank 150

void setup() {
  // put your setup code here, to run once:
  pinMode(motorIn1,OUTPUT);
  pinMode(motorIn2,OUTPUT);

  Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  clockwise(rank);
}

void clockwise(int Speed)
{
  analogWrite(motorIn1,0);
  analogWrite(motorIn2,Speed);
}

  程序效果如下所示,代码上传到到Arduino后,风扇即开始转动。
在这里插入图片描述
  为了能控制转速,对上述代码进行改造,可以通过串口与Arduino进行通信,设置电机的转速。详细的代码如下所示。需要注意的是,使用Arduino IDE中的串口监视器进行通信时,需要设置成没有结束符模式。
在这里插入图片描述

#define SPEED_COMMAND "SPD"
#define NUM_LENGTH 3
#define SPLIT_CHAR ';'

#define RECEIVE_STAGE 0   // 接收命令阶段
#define EXECUTE_STAGE 1   // 执行命令阶段
#define OBSERVE_STAGE 2   // 观察阶段

#define MAX_CHARS 49

char buffer[MAX_CHARS + 1];
int charIndex = 0;

int currentStage;
int curSpeed=0;

const int motorIn1=9;
const int motorIn2=10;

#define rank 150

void setup() {
  // put your setup code here, to run once:
  pinMode(motorIn1,OUTPUT);
  pinMode(motorIn2,OUTPUT);

  Serial.begin(9600);

  currentStage = RECEIVE_STAGE;
  Serial.println("Ready");
}

void loop() {
  // put your main code here, to run repeatedly:
  

  switch (currentStage)
  {
    case RECEIVE_STAGE:
      ReceiveCommand();
      break;

    case EXECUTE_STAGE:      
      if (Serial.available() > 0)
      {
        currentStage = RECEIVE_STAGE;
      }
      else if (strncmp(buffer, SPEED_COMMAND, NUM_LENGTH) == 0)
      {
        char* pInt = &buffer[NUM_LENGTH + 1];
        curSpeed=atoi(pInt);
        currentStage = OBSERVE_STAGE;        
      }
      break;
      

    case OBSERVE_STAGE:      
      if (Serial.available() > 0)
      {
        currentStage = RECEIVE_STAGE;
      }
      else
      {
        clockwise(curSpeed);
      }      
      break;
  }  
}

void clockwise(int Speed)
{
  analogWrite(motorIn1,0);
  analogWrite(motorIn2,Speed);
}

void ReceiveCommand()
{
  if (Serial.available() > 0)
  {
    char ch = Serial.read();

    if ((charIndex < MAX_CHARS) && (ch != SPLIT_CHAR))
    {
      buffer[charIndex++] = ch;
    }
    else
    {
      buffer[charIndex] = 0;
      charIndex = 0;
      currentStage = EXECUTE_STAGE;

      Serial.print("received command is ");
      Serial.println(buffer);
    }
  }
}

  本文主要是初步介绍直流电机风扇的驱动方式,如果更深入的控制直流电机,可以在百度中自行搜索了解。

参考文献:
[1]《基于传感器开发套件玩转Arduino编程》

  • 15
    点赞
  • 131
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值