从零造风:Arduino全向调速风扇实战
天气炎热,想吹一下风扇,刚好最近在玩儿Arduino,不如手搓一个小风扇(转速转向可调)。
天气炎热,想吹一下风扇,刚好最近在玩儿Arduino,不如手搓一个小风扇(转速转向可调),研究思路整理如下,仅供参考。(对于Arduino开发涉及到的基础知识,在这里已经说明,可帮助你马上零基础起步!Arduino编程解密:原来硬件可以这么“软)
目录
一、所需硬件/设备
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);
}
最终实验效果如下:
欢迎留言/私信沟通交流!
更多推荐



所有评论(0)