天气炎热,想吹一下风扇,刚好最近在玩儿Arduino,不如手搓一个小风扇(转速转向可调),研究思路整理如下,仅供参考。对于Arduino开发涉及到的基础知识,在这里已经说明,可帮助你马上零基础起步!Arduino编程解密:原来硬件可以这么“软

目录

一、所需硬件/设备

二、舵机模块

1.舵机的介绍

2.舵机模块引脚及接法

3.舵机的摆动

(1)参考程序

(2)风扇的初级摆动

三、操纵杆模块

1.Joystick操纵杆的介绍

2.Joystick操纵杆模块引脚及接法

3.初步实验

实验1:测试Joystick操纵杆X轴的输出范围

实验2:Joystick操纵杆控制风扇的转速

实验3:Joystick操纵杆控制风扇的转向

四、最终效果

实验4:Joystick操纵杆同时控制风扇的转速和转向


一、所需硬件/设备

Arduino开发板1块、USB数据线1根、杜邦线若干(双公头、公对母)、(风扇)叶片、直流电机、舵机、Joystick摇杆、皮筋(以上所需,某东上均有卖,相当便宜)。

二、舵机模块

1.舵机的介绍

首先考虑如何调控风扇的转向。

舵机是一种位置(角度)控制的直流电机驱动器,用于位置、角度等定位与变化的控制系统(即对风扇的方向能进行调控)。其主要由外壳、电路板、马达、齿轮与位置检测器组成。G-90伺服电机(如下图所示)是一款低成本、高输出功率的伺服电机。它足够小,可以轻松融入机器人或单片机项目。最重要的是,它只需要一个输出脉冲信号来控制其运动。

 2.舵机模块引脚及接法

普通舵机有3根线:GND(棕)、VCC(红)、Signal(橘)。红色线:接5V;棕色线:接GND;橘色线:接3号引脚(当然接数字引脚5、6、9、10、11也可以,这些引脚口的旁边均会标有“~”的标识,代表PWM信号输出口),实际连接图如下:

3.舵机的摆动

(1)参考程序

 若使用模块化编程(Mind+),则需首先在左下角“扩展”中,找到“执行器”中的“舵机模块”并添加。

示例如下:

Arduino IDE代码如下:

#include <Servo.h>  // 引入舵机库
Servo myservo;       // 实例化舵机对象
int angle = 0;       // 定义角度变量

void setup() {
  myservo.attach(3); // 绑定舵机到3号引脚
}

void loop() {
  // 0°→180°循环旋转
  for(angle=0; angle<=180; angle++) {
    myservo.write(angle);  // 写入角度值
    delay(10);             // 延时10ms保证转动到位
  }
  // 180°→0°反向旋转
  for(angle=180; angle>=0; angle--) {
    myservo.write(angle);
    delay(10);
  }
}

实验效果如下:

(2)风扇的初级摆动

如若能够顺利完成上一步,则只需要将风扇固定到舵机上方即可(这里选用皮筋,没完全固定)。

最终效果如下:

三、操纵杆模块

1.Joystick操纵杆的介绍

通常用于游戏控制器(游戏厅的街霸游戏玩儿过没有?)、模拟杆或需要模拟输入的DIY项目中,实物图如下所示。

该操纵杆模块通常包含以下部分: ‌

1.操纵杆‌:用于接收用户的输入,拨动即可传递不同信号。 ‌

2.电位计‌:内部有一个或多个电位计,用于将操纵杆的物理位置转换为模拟电压信号。

3.按键感应:可在竖直方向上直接下压,感应并产生按键信号。

2.Joystick操纵杆模块引脚及接法

VCC‌:电源正极,通常接5V。 ‌

GND‌:电源负极,接地。 ‌

X, Y‌:这两个引脚通常连接电位计的X和Y轴, 提供模拟信号(A0-A5), 表示操纵杆在平面直角坐标系中的位置。 ‌

SW‌:按键引脚,用于连接操纵杆按键,提供数字信号(2-13)。

3.初步实验

实验1:测试Joystick操纵杆X轴的输出范围

 硬件连接图如下(这里画出了Joystick操纵杆的操控方向,水平方向向右为X轴正方向,在水平面上且垂直于水平方向的为Y轴,以下不做重复说明):

模块化程序(Mind+)如下:

Arduino IDE代码如下:

void setup() {
	Serial.begin(9600);
    pinMode(A0, INPUT);
}
void loop() {
	Serial.print("X轴");
	Serial.println(analogRead(A0));
}

实验效果如下(Mind+中):

(当然,通过Arduino IDE也可以实现这样的效果,但需要在“工具”菜单栏中打开“串口监视器”)

可以看出,在X方向上推动摇杆,不同位置产生的数值不一样,且向X轴正方向数值逐渐增大,范围是0-1023。为避免操作重复性,“测试Joystick操纵杆Y轴的输出范围”这一实验就不做了,得到的结论是:在Y方向上推动摇杆,不同位置产生的数值不一样,且向Y轴正方向数值逐渐增大,范围是0-1023。

实验2:Joystick操纵杆控制风扇的转速

接下来考虑如何调控风扇的转速。

由实验1得到:操作杆所处不同位置,在X/Y方向上产生的数值也不同。如若可以利用这个数值,对其加以处理后再作为直流电机的输入信号,则可对风扇进行调速。硬件连接图如下:

从joystickPin引脚读入的信号(0-1023),不能直接写入到motorPin引脚,原因是PWM信号适用范围是0-255,所以需要通过map()函数进行范围转换。Arduino IDE代码如下:

const int motorPin = 6;  // 使用数字引脚6来控制风扇马达
const int joystickPin = A0;// 定义摇杆模块的模拟输入引脚

void setup() {
  pinMode(motorPin, OUTPUT); 
  }

void loop() {
  int joystickValue = analogRead(joystickPin);
  int motorSpeed = map(joystickValue, 0, 1023, 0, 255);
// 将摇杆模块的模拟值映射到0到255的范围
  analogWrite(motorPin, motorSpeed);
 // 使用PWM信号控制马达的转速
  
  delay(10);// 稍作延迟,防止CPU过载
  }

实验效果如下:

说明:硬件连接正常,程序已下载至开发板,但拨动操纵杆,小风扇就是不转。其原因是:初始输入值太低,不能完全带动小风扇。当操纵杆位于初始位置,返回值应是0-1023的中间值(512),若将512映射到0-255范围后,返回值应是0-255的中间值(128)。所以,对于小风扇来说,不能满足其正常工作,需要用手稍微拨动一下叶片,给小风扇一个力,其才会持续旋转,接着就可以使用操纵杆控制小风扇的转速了(还有一个明显标志:当左手手持小风扇时,能明显感受到直流电机的震动,证明其确实在工作,只不过并未处于正常工作)。

实验3:Joystick操纵杆控制风扇的转向

对于舵机的使用,在上文中已经实现了的简单的自动转动(正向接反向循环旋转180度),接下来考虑能否使用Joystick操纵杆实现手动控制方向。实验2证明“利用Joystick操纵杆的X轴信号控制风扇的转速”是可行的,同理也可利用操纵杆Y轴信号控制风扇的转向。

硬件连接图如下:

注意:控制风扇的转向和转速,这两者本质上是一样的,唯一区别在于map()函数的映射范围,不是0-255了,而是0-180。原因是:G-90伺服电机最大旋转角度是180。

Arduino IDE程序如下:

#include <Servo.h>  // 引入舵机库
Servo myservo;       // 实例化舵机对象
const int joystickPin = A1 ;// 定义摇杆模块的模拟输入引脚

void setup() {
  myservo.attach(9); // 绑定舵机到9号引脚
}

void loop() {
  int joystickValue = analogRead(joystickPin);
  int angle = map(joystickValue, 0, 1023, 0, 180);
// 将摇杆模块的模拟值映射到0到180的范围
  myservo.write(angle);  // 写入角度值
  delay(10);             // 延时10ms保证转动到位

}

实验效果如下:

四、最终效果

实验4:Joystick操纵杆同时控制风扇的转速和转向

结合实验2和实验3,考虑能否将两者进行结合,做一个“使用Joystick操纵杆同时控制风扇的转速和转向”的综合性实验。

硬件连接如下:

 

参考Arduino IDE程序:

#include <Servo.h>  // 引入舵机库
Servo myservo;       // 实例化舵机对象
const int motorPin = 6;  // 使用数字引脚6来控制风扇马达
const int joystickPinx = A0;// 定义摇杆模块的模拟输入引脚(控制风扇转速)
const int joystickPiny = A1 ;// 定义摇杆模块的模拟输入引脚(控制舵机转向)
int joystickValuex,joystickValuey;

void setup() {
  pinMode(motorPin, OUTPUT); 
  myservo.attach(9); // 绑定舵机到9号引脚
  }

void loop() {
  joystickValuex = analogRead(joystickPinx);
  int motorSpeed = map(joystickValuex, 0, 1023, 0, 255);
  analogWrite(motorPin, motorSpeed);

  joystickValuey = analogRead(joystickPiny);
  int angle = map(joystickValuey, 0, 1023, 0, 180);
  myservo.write(angle);  // 写入角度值

  delay(5);
  }

最终实验效果如下:

欢迎留言/私信沟通交流!

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐