找回密码
 马上注册

QQ登录

只需一步,快速开始

查看: 10675|回复: 10

可以用家电遥控器(空调遥控除外)控制NXT了(搜索关键词:红外 遥控 NXC I2C Slave)

[复制链接]
发表于 2013-10-15 22:51:45 | 显示全部楼层 |阅读模式
内容涉及 硬件、NXCNXG都不知放那个板块好,随便放了。
设计思想:用单片机解码,如果解码成功则对1-4口上的6P6C1analog信号发送一个低电平,
模拟触感的快速按下和松开(时间稍长让NXT能够检测到)。
NXT检测到触感动作,对同一端口进行I2C读,读出地址码、地址反码、数据码、数据反码。
单片机程序流程
单片机流程.jpg
NXT 流程
NXT流程.jpg
NXC程序:
//===========================================================================================
#define IRPORT   IN_1   //定义红外接收使用的端口
task main()
{
   unsigned char x,y;
   ClearScreen();  //启动程序清屏
   TextOut(0, LCD_LINE1,"---- NXT IR ----");  //显示前2
   TextOut(0, LCD_LINE2,"RECEIVING ......");
   while (TRUE)
   {
         SetSensor(IN_1,SENSOR_TOUCH);  //端口1设置为 触感
         while(SensorValue(S1)==0)      //等待接收代码
         {
             ;
         }
         
         SetSensorLowspeed(IRPORT);     //端口1设置为 I2C
         
         y=ReadI2CRegister(IRPORT,0xa0,12,x);  //读取遥控器地址码,放在12位置
         TextOut(0,LCD_LINE4,"                 "); //擦除显示行
         TextOut(0,LCD_LINE4,"IRADD:");            //显示提示文本
         NumOut(64,LCD_LINE4,x);                   //显示读取数据 ,下同
         
         y=ReadI2CRegister(IRPORT,0xa0,13,x);  //读取遥控器地址码反码
         TextOut(0,LCD_LINE5,"                 ");
         TextOut(0,LCD_LINE5,"IRADDN:");
         NumOut(64,LCD_LINE5,x);
         
         y=ReadI2CRegister(IRPORT,0xa0,14,x);  //读取按键码
         TextOut(0,LCD_LINE6,"                ");
         TextOut(0,LCD_LINE6,"IRDATA:");
         NumOut(64,LCD_LINE6,x);
         y=ReadI2CRegister(IRPORT,0xa0,15,x);  //读取按键码反码
         TextOut(0,LCD_LINE7,"               ");
         TextOut(0,LCD_LINE7,"IRDATAN:");
         NumOut(64,LCD_LINE7,x);
         PlayToneEx(1000,100,1,false);  //播放声音
         Wait(100);
         PlayToneEx(1200,100,1,false);
         Wait(100);
         PlayToneEx(1400,100,1,false);
         Wait(100);
   }
}
//============================== end =================================================
测试照片
硬件.jpg
数据.jpg

地址码+地址吗反码=255
数据码+数据吗反码=255
单片机部分PCB(做了几块,测试完美)
PCB.jpg
使用遥控器
遥控器.jpg
只要使用单片机将各种传感器的数据放到指定的I2C数据数组地址上
(所以只要单片机读到数据,任何物理量都可传输到NXT),
就可以使用I2C接口读取到NXT中,读取后怎么处理就是NXT的事情了
超声波传感器就是不停读取测距数据,其实当数据不变的时候可以不读,
变化了才读,关键NXT不知道变了没有,只好不停地读。
本实验实现了一个端口 2种传感器的效果,并且具有类似中断的原理,
利用analog电平变化通知NXT读取数据,提高了NXT的效率。
如果不是远程,尽量使用I2C,而不是485.
I2C是飞利浦发明的,现在的芯片以NXP(恩智浦)冠名,
飞利浦的51有I2C slave
常见的51是没有硬件I2C的,软件模拟slave很耗资源。
到AVR中更名为TWI(2线接口),PIC有,ST的有,大家去选用吧。
使用NXG也比较好弄
I2CIR.rbt (859.21 KB, 下载次数: 43)
  
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
发表于 2013-10-16 09:12:44 | 显示全部楼层
很不错,收藏了!
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2013-10-16 10:06:08 | 显示全部楼层
赞一个
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2013-10-16 21:08:22 | 显示全部楼层
厉害!佩服!
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2013-10-20 08:35:08 | 显示全部楼层
赞!
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2013-11-10 21:25:39 | 显示全部楼层
这样给NXT扩展传感器就方便多了。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2013-12-23 08:48:35 | 显示全部楼层
楼主历害。
1,NXT的I2C无法实现高速,9600的速度在实时的控制系统中,速度是不够的!
2,NXT的485总线,经过我试验,点对点时,速度可以拉到很高。但不稳定,特别是NXT的485口作为接收时不稳定,很奇怪,NXT485作为发送主机时,高速率下也很正常........

如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2013-12-23 17:17:31 | 显示全部楼层
blackblue 发表于 2013-12-23 08:48
楼主历害。
1,NXT的I2C无法实现高速,9600的速度在实时的控制系统中,速度是不够的!
2,NXT的485总线, ...

有时间我来试试485
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2015-11-13 00:07:08 | 显示全部楼层
我滴个神
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2015-12-15 11:16:08 | 显示全部楼层
好东西 真心赞
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2017-8-31 09:38:35 | 显示全部楼层
求单片机代码
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

手机版|中文乐高 ( 桂ICP备13001575号-7 )

GMT+8, 2025-6-21 11:52 , Processed in 1.281935 second(s), 27 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表