通过arduino制作简单的红外控制直流电机的舵机模拟红外控制风扇的开光和转动。
一实验准备
1.arduino主板1
2.数据线1
3.直流电机1
4.风扇1
5.舵机1
6.红外接收模块1
7.红外遥控器1
8.ULN2003驱动模块1
9.继电器*1
10.跳线若干
11.9V电池
****二硬件安装及接线
1.1:舵机和风扇的安装
首先把舵机调节到如图1所示的角度:
2.1舵机接线
舵机 Arduino
橙色线 数字脚位9
红色线 3.3V
棕色线 GND
2.2 ULN2003驱动模块:
ULN2003模块 Arduino 开发板
1 GND
2 5V
IN1 D7
注:ULN2003在舵机风扇中作用防止直流电机干扰红外接收器接收红外信号
2.3红外接模块
红外模块 arduino
-脚位 GND
中间脚位 VCC
S脚位 D11
2.4继电器
继电器 Arduino
VCC 5V
GND GND
IN ULN2003模块3号脚位
COM 接外电源负极
NO 直流电机
2.5直流电机
直流电机一脚外电源正极,一脚接继电器NO端
三库的准备及操作说明
3.1库下载链接:http://note.youdao.com/noteshare?id=c7fafd03017e033313014fd44420273b&sub=275F7A86B86343469BE0BE1023AE19E9
3.2库操作
四.程序代码:
/注:按键 CH+开启直流电机
按键 CH关闭直流电机
按键NEXT关闭舵机
按键PLAY/PAUSE开启舵机/
#include
#include
Servo myservo; //舵机起个名字
int pos = 0; //定义舵机的角度
#define MAX 22
int RECV_PIN =11; //定义红外接收模块输出口接arduino数字引脚11
IRrecv irrecv(RECV_PIN); //开启红外
decode_results results;
unsigned long rremote_code[MAX] = {
0xFFA25D,0xFF629D,0xFFE21D,//CH- CH CH+
0xFF22DD,0xFF02FD,0xFFC23D,//PREV NEXT PLAY
0xFFE01F,0xFFA857,0xFF906F,//VOL- VOL+ EQ
0xFF6897,0xFF9867,0xFFB04F,// 0 100+ 200+
0xFF30CF,0xFF18E7,0xFF7A85,// 1 2 3
0xFF10EF,0xFF38C7,0xFF5AA5,// 4 5 6
0xFF42BD,0xFF4AB5,0xFF52AD, // 7 8 9
0xFFFFFFFF//长按
}; //各按键对应的遥控红外接收码
//Car mp3对应的字符串
String rremote_string[MAX] = {
“CH-”,“CH”,“CH+”,
“PREV”,“NEXT”,“PLAY/PAUSE”,
“VOL-”,“VOL+”,“EQ”,
“0”,“100+”,“200+”,
“1”,“2”,“3”,
“4”,“5”,“6”,
“7”,“8”,“9”,
“longPress”
};
String ServoEn=“OFF”;
void getRemoteDo();
void ServoCtr();
void setup()
{
Serial.begin(9600); //开启串口监视器
irrecv.enableIRIn(); //初始化红外遥控
pinMode(7, OUTPUT); //定义LUN2003脚位
myservo.attach(9); //舵机脚位
}
void loop()
{
ServoCtr();
}
void ServoCtr()
{
for(pos = 0; pos <= 120; pos += 1) // 舵机的转动范围0-120度
{
getRemoteDo();
while(ServoEn==“OFF”)
{
getRemoteDo();
}
myservo.write(pos); // tell servo to go to position in variable ‘pos’
delay(15); // waits 15ms for the servo to reach the position
}
for(pos = 120; pos>=0; pos-=1) // 舵机的转动范围0-120度
{
getRemoteDo();
while(ServoEn==“OFF”)
{
getRemoteDo();
}
myservo.write(pos);
delay(15); // 延时15ms
}
}
/判断红外接收信息/
void getRemoteDo()
{
String codeString;
if (irrecv.decode(&results))
{
//打印字符串
codeString = getRremoteString(results.value);
if(codeString.length()!=0)
Serial.println(codeString);
irrecv.resume(); // 接收下一个值
}
if (codeString==“CH”)
{
digitalWrite(7, LOW);
}
if (codeString==“CH+”)
{
digitalWrite(7, HIGH);
}
if (codeString==“PLAY/PAUSE”) //按键为PLAY/PAUSE关闭舵机
{
ServoEn="On";
}
if (codeString=="NEXT") //按键为NEXT开启舵机
{
ServoEn="OFF";
}
}
/**
五.成果图:
在这里插入图片描述
](https://img-blog.csdnimg.cn/20190903224535469.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDYzNjQwOQ==,size_16,color_FFFFFF,t_70)