[实验] 普通LED作为传感器 (附 原理图 源代码) <<<视频已上传
视频文件点击此处下载ourdev_183176.rar(文件大小:1.06M)
/////////////////////////////原理图////////////////////////////////////
-
- -
- -
-
- -
-
////////////////////////////源代码/////////////////////////////////////
/*********************************************************************
项目名称 LED TOUCH
项目目的 LED作为传感器实验
*********************************************************************/
//头文件///////////////////////
#include <avr/io.h>
#include <avr/interrupt.h>
#include "global.h"
#include "delay.h"
#include "ad.h"
//IO端口操作///////////////////
#define LED_P_O() DDRD|=0x01 //输出
#define LED_P_H() PORTD|=0x01 //高电平
#define LED_P_L() PORTD&=~0x01 //低电平
#define LED_N_O() DDRA|=0x01 //输出
#define LED_N_I() DDRA&=~0x01 //输入
#define LED_N_H() PORTA|=0x01 //高电平 或上拉
#define LED_N_L() PORTA&=~0x01 //低电平 或无上拉
#define LED_N_S() (PINA&0x01) //状态
#define LED2_O() DDRA|=0x02
#define LED2_H() PORTA|=0x02
#define LED2_L() PORTA&=~0x02
#define LED3_O() DDRA|=0x04
#define LED3_H() PORTA|=0x04
#define LED3_L() PORTA&=~0x04
volatile UINT the_ad_value;
volatile UINT the_ad_value0;
/**********************************************************************
概述: 主函数
**********************************************************************/
int main(void)
{
//
cli(); //关中断
LED2_O();
LED3_O();
UCHAR i;
for(i=0;i<10;i++)
{
LED_P_O();
LED_P_H();
LED_N_O();
LED_N_L();
delay_ms(1);
//
LED_P_O();
LED_P_L();
LED_N_O();
LED_N_H();
delay_ms(1);
//
LED_P_O();
LED_P_L();
LED_N_I();
LED_N_L();
//
the_ad_value0 = ad_get_value(AD_SE_ADC0,AD_REF_AVCC);
}
//sei(); //开中断
while(1)
{
LED_P_O();
LED_P_H();
LED_N_O();
LED_N_L();
delay_ms(1);
//
LED_P_O();
LED_P_L();
LED_N_O();
LED_N_H();
delay_ms(1);
//
LED_P_O();
LED_P_L();
LED_N_I();
LED_N_L();
//
the_ad_value = ad_get_value(AD_SE_ADC0,AD_REF_AVCC);
//NOP();
//
if( (the_ad_value<(the_ad_value0+1)) && (the_ad_value>(the_ad_value0-1)) )
{
LED2_L();
LED3_H();
}
else
{
LED3_L();
LED2_H();
}
//
delay_ms(10);
}
return 0;
} 顶,很感兴趣 ding~~~~~ 顶!视频很棒!
楼主能再做些文字说明就更好啦! 用430好像也有这方面的应用,在ti网站上有下载。。。。。。 有人能讲下大概的原理吗? mtheory能否给个连接,研究的透彻一点。 代码是根据lanshuitianxia贴的图片写的
http://www.ouravr.com/bbs/bbs_upload19801/files_8/ourdev_182870.jpg 有人能讲下大概的原理吗? 恭喜楼主做成功了 呵呵 我晚上也回去试试看./emotion/em018.gif./emotion/em018.gif./emotion/em018.gif./emotion/em018.gif./emotion/em018.gif
./emotion/em018.gif./emotion/em018.gif./emotion/em018.gif./emotion/em018.gif 我算基本看懂了。
首先把发光二级管施加正向电压(P->N)使其发光;之后施加反向电压(N->P),这时发光二极管相当于光敏二极管;之后再测量N级电压。
这应该是利用PN结电容吧,我想。 10楼分析的有道理
要想办法提高稳定性才比较实用
大家一起来实验实验。。。。 喜欢 好极了! 慢慢研究 有什么神奇的事情啊。。。偶要看看了,可靠性怎样? 我的代码可靠性还是欠佳的
大家一起来完善它 做着先玩玩看,再慢慢改善
LZ你的#include "global.h"
#include "delay.h"
#include "ad.h"
3个头文件上传下,我烧个到M16里去试试看 global.h只是#define UINT unsigned int
其它是winavr里面的文件复制出来改了一下函数名字而已
根据自己习惯写就可以了
没什么花头的,呵呵
实在需要的话等我回去再发 楼主指点一下,既然#define UINT unsigned int,那么(the_ad_value<(the_ad_value0+1)) && (the_ad_value>(the_ad_value0-1))是不是和(the_ad_value != the_ad_value0)是等效的? +1 -1的话是等效
我的写法是为了方便调节灵敏度
+ - 的数字变大的话灵敏度变小 还是不太明白,文字性叙述太少了。 ./emotion/em007.gif
先看视频 再看7楼的图 再看代码 就明白了 楼主试过这个程序对其他颜色的LED有效吗?并且效果一样吗? 其他颜色到没试过,有空试试,呵呵。。。。 突然想起来在永乐看到的油烟机上的按键,可能也是这个原理。
那是蓝色LED 注释太少了 这个实验好玩。
不过发光管还要耗一点电。 关注 我怎么下来的都解压不了呢
C:\Documents and Settings\树树\桌面\ourdev_183176.rar: 不可预料的压缩文件末端
.... 我也遇到过,可以再下载一次试试 为什么要先点亮LED再施加反向电压? 楼主贴出来的程序和视频里的程序不一样吧?
贴出来的程序里没有跟随检测量而快慢闪烁的部分! 如此可以做很漂亮的触摸感应按键不是? 在这里,不过要挂代理才能上
http://projects.dimension-x.net/technology-and-projects/ledsensors/
还有这个
http://www.techeblog.com/index.php/tech-gadget/led-touch-sensor
牛B 试了一下,手不靠近也是乱闪,不知道倒底感应到没有。 不错,试试! 不错,试试! 视频里面的程序就是这个程序
程序中没有处理闪的快慢
现实中确实有闪的快慢的效果(估计是因为靠的近的时候超出阈值概率比较大) 另外,用普通的绿色发光管试过了,没有红色的发光二极管效果好
我用的红色发光管是8x8LED块中的一个点。 手不靠近也乱闪的话估计是阈值太小了,把+1,-1的地方改大点试试 像那个油烟机上那种用蓝色发光管,前面用透明面板印刷镂空字的话,视觉效果还是很不错的。
可惜手头没有蓝色发光管
哪位有可以测试一下。 记号 先点亮可能只是发光效果,也可能是靠这个作为光源。
我也不确定,我实现下来感觉两个效果都有的可能性最大。 老外做的那个带3310屏幕的东东好像没有用到AD吧?IO口的AD通道不对。 我一开始也没用ad检测,直接io检测电平也能检测到
我实验时要按住led才有反应 哦!我还以为视频里的程序和贴出来的程序不一样,原来是这样的!误会了,不好意思!
这么说来的话,外部光源对它的干忧也是很大的,这个要问题解决才实用! 我一开始也没用ad检测,直接io检测电平也能检测到
我实验时要按住led才有反应
什么意思哦,就是说按住LED才能检测到IO口电平变化么? 有意思,等下试试! 记号。。有空实验下 是怎么过原理? 我一开始也没用ad检测,直接io检测电平也能检测到
我实验时要按住led才有反应
》》》
什么意思哦,就是说按住LED才能检测到IO口电平变化么?
》》》
用ad的话可以电平有细微变化就能检查到,检查io电平的要电平变化大才行(与avr的io输入高低电平判断阈值有关) 7楼的图就是原理 外部光源的干扰确实比较大
这个要处理的号估计也是有一定难度的 先设定输出,发光管亮
再反转,把原先的引脚设定为输入,再检测引脚状态
是不是这样的?个人愚见! 实验LED的光伏特性和反不反转无关,直接那二极管通过示波器或万用表测量其电压.
灯光下遮挡和不遮挡通常在10mV-100mV间变化(和二极管,光强度有关).如此以来好象必须要AD转换.
通电的意思可能是为了让它发光,反通电就不明白了.会不会是这样就不用管LED正负了呢? 哈哈,我成功了,真的很神奇哦,空的时候好好研究一下,想不到led还有这个用处.不过程序好像不太稳定,呵呵,如果可靠性做好点就更好玩了,大家一起努力吧:-) 就是光敏二极管吧,
用光敏二极管灵敏度在加点光不是更好吗,而且还省电
另外,在黑暗中和在阳光下的差距应该很大吧
没有仔细考虑,不对的请指正 用光敏二极管还有什么意思! 留个记号先! 高亮度LED效果如何?有空试试。 先设定输出,发光管亮
再反转,把原先的引脚设定为输入,再检测引脚状态
是不是这样的?个人愚见!
>>>>>>>>>>>>>>>>>
目前的程序就是这样的 实验LED的光伏特性和反不反转无关,直接那二极管通过示波器或万用表测量其电压.
灯光下遮挡和不遮挡通常在10mV-100mV间变化(和二极管,光强度有关).如此以来好象必须要AD转换.
通电的意思可能是为了让它发光,反通电就不明白了.会不会是这样就不用管LED正负了呢?
》》》》》》
实际使用的话通电发光效果要好一点
比如发光的时候表示这个LED按键有效
反通电应该是给结电容充电 就是光敏二极管吧,
用光敏二极管灵敏度在加点光不是更好吗,而且还省电
另外,在黑暗中和在阳光下的差距应该很大吧
没有仔细考虑,不对的请指正
》》》》》》
用光敏管的话就不好玩了,呵呵
发光管如果能做到稳定,产品外壳外观设计比较方便 http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=858550&bbs_page_no=1&search_mode=4&search_text=Forever&bbs_id=9999
这个帖里面有相关的资料介绍的 高亮度LED效果如何?有空试试。
》》》》》
没试过 哈哈,我成功了,真的很神奇哦,空的时候好好研究一下,想不到led还有这个用处.不过程序好像不太稳定,呵呵,如果可靠性做好点就更好玩了,大家一起努力吧:-)
》》》》
能否把你成功经验分享一下,比如用的什么发光管等等。。。。 用示波器看了一下信号,发现一个优化程序的方法也许可行
检测的时候的电压是逐步下降的,而且手指是否靠近时的下降速度不同
设置一个比较宽的阈值,多次检测,判断达到这个阈值的时间
估计效果更好
大家一起试试 64楼的帖子不错,看这个帖子后才做这个实验的,呵呵。
光看别人的不够,还是自己干一下比较有趣。。。。。。 真神奇!我也打算试一试。 好贴,有空试一下 回66楼的兄弟,我用的是普通的贴片红色led灯,程序用的就是楼主的,只是要换成codeversion编译环境及led位置不同的缘故,稍稍做了修改.呵呵,winavr一直没空学:) 有创意! 好人啊 看了老外的视频
真的很NBhttp://cache.amobbs.com/bbs_upload782111/files_9/ourdev_244281.JPG
(原文件名:LED点阵输入.JPG) 记录! 留个记号,有空研究 记录..... 不错,不错!! 太厉害了 thanks 看来LED很有搞头。顶 ehe哦呵呵,研究 强! 有点电容式触摸屏的味道。现在有些电器和手机用的,不过没有用LED,电容直接做在PCB上. 酷 现在很多笔记本和mp4上的触摸控制按钮,不知道是不是这个原理。 不错。。。 如果用贴片led做一个比较密的矩阵就可以当电脑触摸板吧 记号 我也想做一个,可惜不会AVR 对这里有点小困惑,初始化建立基本阈值时:
LED_P_O(); <----设定端口为输出
LED_P_H();
LED_N_O();
LED_N_L();
delay_ms(1);
//
LED_P_O(); <----设定端口为输出
LED_P_L();
为什么要设定两次呢?
------------------------------------------------
还有一个小疑惑:
建立初始阈值时,一般算法应该是取10次求平均或者中值等等,而此处是简单的取第10次的值,不知有何奥秘? 刚才试验了一下,AD只有1个BIT的跳动,很不准确,继续试验中。。。 这个喜欢。。。。。。。。。 记录! mark! 有时间试试 LS 这个牛!
http://www.cs.nyu.edu/~jhan/
原理:
http://blog.makezine.com/archive/2006/06/led_touch_sensor.html /*
对这里有点小困惑,初始化建立基本阈值时:
LED_P_O(); <----设定端口为输出
LED_P_H();
LED_N_O();
LED_N_L();
delay_ms(1);
//
LED_P_O(); <----设定端口为输出
LED_P_L();
为什么要设定两次呢?
*/
不需要设定两次,只是测试代码。
------------------------------------------------
/*
还有一个小疑惑:
建立初始阈值时,一般算法应该是取10次求平均或者中值等等,而此处是简单的取第10次的值,不知有何奥秘?
*/
取第10次只是为了等这个值进入稳定期。
可用用更好的算法,例如,自动判断出一段稳定期,取平均值。 mark~~