|
本帖最后由 simatic_net 于 2012-11-28 16:16 编辑
乐高科技系列是非常好的机械平台。
乐高也有自己的电气配套系统。
但是我想用arduino红外控制乐高。
首先我来介绍一下乐高的PF组件。
乐高PF套件
它由电池盒、红外接收器、电机、和红外发射器组成。
我的目的就是利用arduino接红外二极管,代替红外遥控发射器。
因为这个红外发射器不能编程,只能通过操纵杆来发出指令。如果可以代替成功,我们就可以通过在arduino上编程,将乐高做的更加智能。
乐高采用自己的红外线编码体系。好在这是公开的,大家可以在此下载详细的技术规范:
乐高红外规范LEGO_Power_Functions_RC_v110.pdf
(312.07 KB, 下载次数: 82)
从这个红外规范中你可以看出,和普通电视遥控器的编码区别比较大,所以根本无法使用IRremote库,我只能自己编写红外发射代码。
经过研究乐高提供的这个红外编码规范,并且参考了坛子中的帖子:
http://www.arduino.cn/forum.php?mod=viewthread&tid=1394
我编写了如下程序:可惜无效。请大家帮忙看看,有什么不妥?
int IR = 5;
void setup()
{
pinMode(IR, OUTPUT);
}
void loop()
{
IR_SS();
IR_S0();
IR_S0();
IR_S0();
IR_S0();
IR_S0();
IR_S0();
IR_S0();
IR_S1();
IR_S0();
IR_S1();
IR_S0();
IR_S1();
IR_S1();
IR_S0();
IR_S1();
IR_S1();
IR_SS();
delay(200);
IR_SS();
IR_S1();
IR_S0();
IR_S0();
IR_S0();
IR_S0();
IR_S0();
IR_S0();
IR_S1();
IR_S0();
IR_S1();
IR_S0();
IR_S1();
IR_S0();
IR_S0();
IR_S1();
IR_S1();
IR_SS();
delay(200);
}
void IR_Send38KHZ(int x,int y) //产生38KHZ红外脉冲
{
for(int i=0;i<x;i++)//15=386US
{
if(y==1)
{
digitalWrite(IR,1);
delayMicroseconds(9);
digitalWrite(IR,0);
delayMicroseconds(9);
}
else
{
digitalWrite(IR,0);
delayMicroseconds(20);
}
}
}
void IR_SS() //开始与停止
{
IR_Send38KHZ(6,1);
IR_Send38KHZ(39,0);
}
void IR_S0() //发射0
{
IR_Send38KHZ(6,1);
IR_Send38KHZ(10,0);
}
void IR_S1() //发射1
{
IR_Send38KHZ(6,1);
IR_Send38KHZ(21,0);
}
我利用arduino在第5引脚接了个红外发射管。对准乐高红外接收器:
我这个程序比较简单,发射的编码含义就是让电机正转,并且不停的发射。可惜接收器没有任何反应,电机也不转。
求帮助!!!!!!!!!!
另外我回答一下大家的疑问:
1、为什么要做这个。
原来的遥控器只能通过拨动操纵杆来控制乐高小车或者机器人等。
如果用arduino代替,由于其可编程的特性,可将作品做成智能车等,同事也可以添加更多传感器,比如可以实现语音控制等。
2、乐高有自己的可编程控制器,并且非常好,你为什么不用。
是呀,乐高的NXT非常好。但是最多只能连接4个传感器、3个伺服电机,限制了作品的规模和复杂性。
如果您有其他问题,也可以回帖提出,欢迎交流! |
|