本次学习内容
1、认识并了解舵机的基本原理
2、舵机的接线与编程控制
3、遥控摇头换挡风扇程序设计
舵机
舵机,其工作过程是把所接收到的电信号转换成电动机轴上的角位移或角速度输出,适用于那些需要角度不断变化并可以保持的控制系统。
根据转动范围,舵机又可分为180度舵机和360度舵机。
舵机的接线
引脚定义:
棕色线—— GND
红色线—— 5V
橙色线——信号线
摇头风扇接线
舵机缓慢地循环转动
// 引入Servo库,用于控制舵机动作
#include <Servo.h>
// 创建一个名为servo_2的舵机对象,连接到第2个数字引脚(通常GPIO 2)
Servo servo_2;
// 函数setup() 初始化舵机
void setup() {
servo_2.attach(2); // 舵机连接到指定引脚,并设置其工作范围
}
// 主循环函数loop()
void loop() {
// 一个完整的周期运动,从0度开始顺时针旋转
for (int i = 0; i <= 180; i = i + 1) { // 遍历角度范围,每次加1度
servo_2.write(i); // 设置舵机当前的角度为i度
delay(5); // 延迟5毫秒,以便舵机有足够的时间响应
}
// 反向运动,从180度逆时针旋转回0度
for (int i = 180; i >= 0; i = i - 1) { // 逆序遍历角度,每次减1度
servo_2.write(i); // 再次设置角度
delay(5); // 保持延时
}
// 这段代码实现了舵机的正反转运动,重复此过程
}
遥控摇头风扇
结合上次学习的红外遥控,制作一个可以遥控换挡,又可以遥控摇头
的风扇。
// 包含必要的库文件,servo用于控制舵机,IRremote用于接收红外遥控信号
#include <Servo.h> // Servo.h
#include <IRremote.h> // IRremote.h
// 定义全局变量,用于存储接收到的红外编码值
long ir_item;
// 初始化舵机连接到pin 8
Servo servo_8;
// 创建IR接收模块,连接到GPIO 0
IRrecv irrecv_0(0);
// 存储解码结果
decode_results results_0;
// 程序开始初始化阶段
void setup() {
// 将舵机连接到指定引脚并启用接收模式
servo_8.attach(8);
// 启动红外接收模块的红外输入
irrecv_0.enableIRIn();
}
// 主程序循环,持续监听红外遥控信号
void loop() {
// 当接收到红外信号时进入判断
if (irrecv_0.decode(&results_0)) {
// 获取接收到的红外码对应的数值,并确定其类型
ir_item = results_0.value;
// 判断红外码属于哪种类型,并将类型名打印出来
String type = "UNKNOWN";
String typelist[] = {"UNKNOWN", "NEC", "SONY", "RC5", "RC6", "DISH", "SHARP", "PANASONIC", "JVC", "SANYO", "MITSUBISHI", "SAMSUNG", "LG", "WHYNTER"};
if (results_0.decode_type >= 1 && results_0.decode_type <= 13) {
type = typelist[results_0.decode_type];
}
Serial.println("IR TYPE: " + type + " ");
// 根据接收到的特定红外码执行相应的操作
if (ir_item == "0xFFA25D") { // 如果是对应第一个编码
analogWrite(5, 127); // 对数字引脚5设置模拟电压127
}
if (ir_item == "0xFF629D") { // 其他类似条件判断...
analogWrite(5, 255); // 设置模拟电压255
}
if (ir_item == "0xFF9867") { // 另一种情况...
analogWrite(5, 0); // 设置模拟电压0(关闭)
}
if (ir_item == "0xFFE21D") { // 更复杂的动作,如转动舵机
for (int jiaodu = 0; jiaodu <= 180; jiaodu = jiaodu + 1) {
servo_8.write(jiaodu);
delay(10); // 每步延时10ms
}
for (int jiaodu = 180; jiaodu >= 0; jiaodu = jiaodu - 1) {
servo_8.write(jiaodu);
delay(10);
}
}
// 无论成功与否,都继续监听
irrecv_0.resume();
} else {
// 没有接收到红外信号时,让舵机返回到90度位置
servo_8.write(90);
delay(0); // 立即返回
}
}
// 相关问题--
1. 这段代码主要用于做什么?
2. 遥控信号的编码是如何影响伺服电机的行为的?
3. 如果要添加更多类型的红外遥控指令,应该如何修改代码?