Arduino 鶸鷄 • 实战篇

请注意,本文编写于 209 天前,最后修改于 1 天前,其中某些信息可能已经过时。

前言

学校共青团联合学生科技协会组织了不放过全校学生的科技创新训练项目,听说这也算是学校的一项传统了,年年都有,帮助学生了解科技立项流程。活动针对文理不同方向涵盖了5个类型:A.概念创意类;B.发明制作类;C.方案设计类;D.学科专业类;E.哲学社会类论文或调查报告。还正正规规的整了五六页的项目申报书,时间为一学年(应该是到大一结束)。我和两个室友组队报了一个发明制作类项目“基于 Arduino 单片机的 mini 遥控风扇”,神特么写了得有千字的一大段一大段的“项目目的与意义”“项目主要实施的内容”“项目结题指标”“项目实施预计困难”等等。虽然听学长说这个创新引导立项实际很水,但我还是想好好做点什么,至少不能折个纸飞机上报吧。正好想学单片机很久了,教程手边买有一堆,Arduino 开发套装也早就入手了——万事俱备,只欠一次下发任务的机会,于是我就想了这个项目,一来现成的资料多。二来还能锻炼自己提升对单片机的了解。

继承前两篇 Arduino 入门的帖子,这篇就算小结了。当然并不是探索就到这结束了,以后还有大把时光练习 Arduino 项目。

材料

Arduino UNO 开发板、直流电机、ULN2003 步进电机、轻触开关按键、风扇组件、面包板、亚克力板、螺丝、螺母、跳线若干

原理

电机驱动电流较大,单片机不能直接驱动,这里使用 ULN2003 达林顿阵列驱动。ULN2003 是一个包含7个单元的非门电路,单独每个单元驱动电流最大可达 500mA 。该模块与开发板和电机连接时原理图大致如下:

ULN2003 模块原理图
ULN2003 模块原理图

将轻触按键开关模块接线到引脚 D2 通过编程按钮实现按下次数的计数。第一次按下按钮时电机转速为 rank1=150 ;第二次按下时电机转速为 rank2=200 ;第三次按下时电机转速为 rank3=250 ;第四次按下时计数归零,风扇停止转动。此后再次按下按钮时从1开始计数。以上就是模拟风扇的档位控制过程。

布线

Arduino 简易调速风扇布线图
Arduino 简易调速风扇布线图

代码

/*
 * Small Fan powered by Arduino
 */
// set pin numbers.
const int buttonPin = 2;
const int ledPin = 13;
const int motorIn1 = 9;
const int motorIn2 = 10;
int fanspeed = 0;
#define rank1 150
#define rank2 200
#define rank3 250

// some changeable variables.
int btState;
int lastbtState = LOW;
// the time measured in milisecounds will quickly become a bigger number,
// which can't be stored in an int.
long lastDebounceTime = 0;
long debounceDelay = 50;

void setup() {
  // put your steup code here, to run once:
  // set the LED motors as OUTPUT and botton as INPUT.
  pinMode(buttonPin,INPUT);
  pinMode(ledPin,OUTPUT);
  pinMode(motorIn1,OUTPUT);
  pinMode(motorIn2,OUTPUT);
  Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  // read the state of the switch into a local variable:
  int reading = digitalRead(buttonPin);
  // if the button state is different from last time,
  // reset the debouncing timer.
  if (reading != lastbtState)
  {
    lastDebounceTime = millis();
  }
  // debounce treatment.
  if ((millis() - lastDebounceTime) > debounceDelay)
  {
    if (reading != btState)
    {
      // store the state of button in btState.
      btState = reading;
      if (btState == HIGH)
      {
        // only toggle the LED if the new button state is HIGH.
        digitalWrite(ledPin,HIGH);
        // codes for controlling the fan speed.
        fanspeed = fanspeed + 1;
        if (fanspeed >= 4)
        {
          fanspeed = 0;
        }
      }
      else
        digitalWrite(ledPin,LOW);
    }
  }
  // fan speed is divided into different grades.
  switch(fanspeed)
  {
    case 1:
      // when fanspeed=1 set the rotate speed of the motor as rank1=150.
      clockwise(rank1);
      break;
    case 2:
      // when fanspeed=2 set the rotate speed of the motor as rank1=200.
      clockwise(rank2);
      break;
    case 3:
      // when fanspeed=3 set the rotate speed of the motor as rank1=250.
      clockwise(rank3);
      break;
    default:
      // in default situation set the rotate speed of the motor as rank1=150.
      clockwise(0);
  }
  // save the reading and through the loop next time.
  lastbtState = reading;
}

// extra function clockwise() to control the motor's rotation.
void clockwise(int Speed)
{
  analogWrite(motorIn1,0);
  analogWrite(motorIn2,Speed);
}

效果

接通电源,Arduino 开发板电源灯与 L13 灯亮起,轻触开关按键模块电源指示灯亮起,ULN2003 步进电机 LED 灯熄灭,风扇不转。按下轻触开关按键,ULN2003 步进电机 LED 灯亮起,风扇慢速转动。再次按下轻触开关按键,风扇转速增加,其他组件状态基本不变。再次按下轻触开关按键,风扇高速转动,其他组件状态基本不变。第四次按下轻触开关按键,风扇停止转动,ULN2003 步进电机 LED 灯熄灭。

视频已上传腾讯云COS加速(标清版【15.08MB】& 4K 版【300.74MB】),请放心食用。。。建议将声音开到一半以上感受风扇转速(光速逃...

播放器载入中...


弱鸡的小风扇就制作好啦,下一步是添加遥控功能,敬请期待喔!

添加新评论