15961| 12
|
[项目] 夏季的灵感——自制窗帘升降机详解 |
原文作者:Dany 原载于:DFRobot 坐在窗边有个好处,就是能够尽情的享受阳光。可是随着夏季的到来,享受变成了煎熬,Barry就是承受煎熬者之一。不过公司有个不成文的规定,下班得把所有的窗帘拉起来,据说是根据飞机起飞降落时需要拉起遮阳板的说法。因此,Barry每次上班的时候都必须要将窗帘拉上。但是,每天都做这种重复的事情很烦恼。而且每次拉窗帘的时候都很费劲,一点都不高效。做为一个机器人工程师的Barry,用现有的资源完全能够做一个窗帘遥控升降的设备。 经过一段时间的努力和实验,Barry终于完成了这个系统。 图1 窗帘自动遥控升降系统设备终极版 制作的过程首先得需要一个电机,其次还需要一个特制的能让电机带动窗帘升降的齿轮。两个电机很容易找到,但齿轮需要定制。Barry 用3D打印机打印了一个所需齿轮的样品模型,让工厂根据样品制造了一个金属的齿轮。在这个齿轮的中间做出一个圆槽,这样就可以嵌入窗帘拉绳。于是,一个执行机构就完成了。 图2 Romeo 完成了执行机构并不是最终的目标,还需要控制电机的正反转才能让窗帘顺利的升降运行。Barry搞定了Romeo( Romeo是一块Arduino,不过DFRobot设计的这块Romeo集成了电机驱动,可以直接将电机接入Romeo,不用再去找电机驱动板。)和电机的连接后,通过编程成功的将Romeo上的按键控制了窗帘的上下拉动,不过这样也出现了新的问题。虽然Barry可以用开发板上面的按键来控制电机,但是这样比较麻烦是,每次不得不走近窗口并且按住按键才能控制。想要更便捷的控制窗帘,还需要一套IR Receiver Module红外遥控器(DFR0094)和一个迷你遥控器来实现远程控制。 本来以为这样就很完美了,但是还是出了问题。一次Barry用遥控器将窗帘关上后去饮水,但是窗帘没有关闭,而是不停的运动,最后整个窗帘差点报废。通过这件事说明,这个系统还不够智能稳定。于是berry在原有设备的基础上增加两个限位开关,让整个系统能够在开关后完全自动,不用再考虑任何问题。此时的窗帘升降系统就能够在任何时候都能安全到达限位后自动停止,防止意外的出现。 需要的部件 【硬件列表】 2、 IR kit红外遥控套件 4、 电线若干 5、 电机两个 6、12v适配器 【软件代码】 [mw_shl_code=cpp,false]#include <IRremote.h> const int InfraredSensorPin1 = 7; const int InfraredSensorPin2 =8; int RECV_PIN = 11; int E1 = 5; //M1 Speed Control int M1 = 4; //M1 Direction Control IRrecv irrecv(RECV_PIN); decode_results results; void setup() { pinMode(InfraredSensorPin1,INPUT); pinMode(InfraredSensorPin2,INPUT); pinMode(M1, OUTPUT); pinMode(E1, OUTPUT); Serial.begin(9600); irrecv.enableIRIn(); // Start the receiver } void loop() { if(digitalRead(InfraredSensorPin1) ==LOW&&digitalRead(InfraredSensorPin2) ==LOW) { digitalWrite(E1,LOW); if(results.value==0xFD807F) { analogWrite (E1,255); digitalWrite(M1,LOW); } delay(1000); } if(digitalRead(InfraredSensorPin1) ==HIGH&&digitalRead(InfraredSensorPin2) == HIGH) { digitalWrite(E1,LOW); if(results.value==0xFD906F) { analogWrite (E1,255); digitalWrite(M1,HIGH); } delay(1000); } if (irrecv.decode(&results)) { Serial.println(results.value, HEX); if(digitalRead(InfraredSensorPin1) ==LOW&&digitalRead(InfraredSensorPin2) ==HIGH) { if(results.value==0xFD807F) { analogWrite (E1,255); digitalWrite(M1,LOW); } if(results.value==0xFD906F) { analogWrite (E1,255); digitalWrite(M1,HIGH); } if(results.value==0xFDA05F) { digitalWrite(M1,LOW); analogWrite (E1,0); } } irrecv.resume(); // Receive the next value } }[/mw_shl_code] tutorials |
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed