想象一下,在炎热的夏日午后,一台能够自动左右摆头的小风扇为你带来阵阵凉风——这不仅是个实用的消暑工具,更是展示Arduino与舵机协同工作的完美案例。SG90舵机以其低廉的价格和可靠的性能,成为入门级创客项目的首选执行器。这个项目将带你从零开始,完成一个会自主摇头的风扇装置。
你需要准备以下材料:
提示:选择风扇时建议优先考虑USB供电型,其工作电压与舵机匹配,且噪音较低。若使用传统电机,需注意额外配备电机驱动模块。
这个9克重的微型舵机有三根彩色连线:
将组件按以下方式连接:
| 舵机引脚 | Arduino接口 | 备注 |
|---|---|---|
| 棕色线 | GND | 建议使用电源侧的GND |
| 红色线 | 5V | 避免使用Vin引脚 |
| 黄色线 | D9 | 必须选择带~的PWM引脚 |
风扇模块的连接更为简单:
重要提醒:当同时驱动舵机和风扇时,建议使用外部5V电源供电。Arduino板载的5V稳压器可能无法提供足够电流,导致板子重启或舵机抖动。
打开Arduino IDE,输入以下智能摇头程序:
cpp复制#include <Servo.h>
Servo myservo; // 创建舵机对象
int pos = 0; // 存储当前角度变量
void setup() {
myservo.attach(9); // 将舵机连接到D9引脚
Serial.begin(9600); // 初始化串口监控
}
void loop() {
// 从0度到180度缓慢转动
for (pos = 0; pos <= 180; pos += 1) {
myservo.write(pos); // 设置舵机角度
delay(15); // 给舵机转动时间
Serial.print("Current angle: ");
Serial.println(pos); // 打印当前角度
}
// 从180度返回0度
for (pos = 180; pos >= 0; pos -= 1) {
myservo.write(pos);
delay(15);
Serial.print("Current angle: ");
Serial.println(pos);
}
}
这个基础版本实现了舵机0-180度的匀速摆动。通过串口监视器(工具→串口监视器),你可以实时查看舵机的转动角度。
让风扇在不同区域以不同速度摆动,模拟自然风效果:
cpp复制void loop() {
// 快速扫过中间区域(60-120度)
for (pos = 0; pos <= 60; pos += 2) {
myservo.write(pos);
delay(30);
}
for (pos = 60; pos <= 120; pos += 4) {
myservo.write(pos);
delay(15);
}
for (pos = 120; pos <= 180; pos += 2) {
myservo.write(pos);
delay(30);
}
// 返回时采用相同模式
for (pos = 180; pos >= 120; pos -= 2) {
myservo.write(pos);
delay(30);
}
for (pos = 120; pos >= 60; pos -= 4) {
myservo.write(pos);
delay(15);
}
for (pos = 60; pos >= 0; pos -= 2) {
myservo.write(pos);
delay(30);
}
}
添加DHT11温湿度传感器,实现智能温控:
cpp复制#include <Servo.h>
#include <DHT.h>
#define DHTPIN 2
#define DHTTYPE DHT11
Servo myservo;
DHT dht(DHTPIN, DHTTYPE);
int pos = 0;
bool fanRunning = false;
void setup() {
myservo.attach(9);
dht.begin();
Serial.begin(9600);
}
void loop() {
float temp = dht.readTemperature();
if (isnan(temp)) {
Serial.println("Failed to read temperature!");
return;
}
Serial.print("Temperature: ");
Serial.print(temp);
Serial.println("°C");
if (temp > 28 && !fanRunning) { // 温度高于28度启动
fanRunning = true;
Serial.println("Fan activated");
} else if (temp <= 26 && fanRunning) { // 温度低于26度停止
fanRunning = false;
Serial.println("Fan deactivated");
}
if (fanRunning) {
for (pos = 0; pos <= 180; pos += 1) {
myservo.write(pos);
delay(15);
}
for (pos = 180; pos >= 0; pos -= 1) {
myservo.write(pos);
delay(15);
}
} else {
myservo.write(90); // 停在中间位置
delay(1000);
}
}
没有3D打印机?试试这些替代方案:
纸板固定法:
乐高积木方案:
木制支架:
追求更稳定的表现?注意这些细节:
遇到问题?试试这些解决方案:
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
| 舵机不转动 | 电源供电不足 | 改用独立5V电源供电 |
| 舵机发热严重 | 机械阻力过大 | 检查支架是否卡死舵机运动 |
| 风扇不转 | 极性接反 | 调换风扇电源线 |
| 舵机抖动不稳定 | 信号干扰 | 在舵机电源端并联100μF电容 |
| 角度控制不准确 | 机械安装存在虚位 | 使用舵机臂延长杆增加力矩 |
调试时,建议分阶段验证:
掌握了基础摇头风扇后,可以尝试这些进阶玩法:
手机蓝牙遥控:
人脸追踪送风:
风速智能调节:
多舵机联动系统:
cpp复制// 双舵机控制示例代码
#include <Servo.h>
Servo servoH; // 水平舵机
Servo servoV; // 垂直舵机
void setup() {
servoH.attach(9);
servoV.attach(10);
}
void loop() {
// 实现圆形扫描模式
for (int angle = 0; angle < 360; angle++) {
int hPos = 90 + 60 * sin(radians(angle));
int vPos = 90 + 30 * cos(radians(angle));
servoH.write(hPos);
servoV.write(vPos);
delay(20);
}
}
这个项目最令人满意的部分是看到简单的电子元件通过创意编程实现实用功能的过程。在实际调试中发现,给舵机运动轨迹添加缓动算法能显著降低机械噪音,而适当增加支架重量则能提高整体稳定性。