搜索
bottom↓
回复: 214

[实验] 普通LED作为传感器 (附 原理图 源代码) <<<视频已上传

[复制链接]

出0入0汤圆

发表于 2007-11-28 11:10:41 | 显示全部楼层 |阅读模式
视频文件
点击此处下载ourdev_183176.rar(文件大小:1.06M)




/////////////////////////////原理图////////////////////////////////////
[LED+] - [PD0]
[LED-] - [R391] - [PA0]

[VCC] - [R102] - [LED2+]
[LED2-] - [PA1]

[VCC] - [R102] - [LED3+]
[LED3-] - [PA2]




////////////////////////////源代码/////////////////////////////////////



/*********************************************************************
项目名称        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;
}

出0入0汤圆

发表于 2007-11-28 11:20:18 | 显示全部楼层
顶,很感兴趣

出0入0汤圆

发表于 2007-11-28 11:28:20 | 显示全部楼层
ding~~~~~

出0入0汤圆

发表于 2007-11-28 12:06:24 | 显示全部楼层
顶!视频很棒!
楼主能再做些文字说明就更好啦!

出0入0汤圆

发表于 2007-11-28 12:12:09 | 显示全部楼层
用430好像也有这方面的应用,在ti网站上有下载。。。。。。

出0入0汤圆

发表于 2007-11-28 12:15:57 | 显示全部楼层
有人能讲下大概的原理吗?

出0入0汤圆

 楼主| 发表于 2007-11-28 12:18:09 | 显示全部楼层
mtheory能否给个连接,研究的透彻一点。

出0入0汤圆

 楼主| 发表于 2007-11-28 12:20:20 | 显示全部楼层
代码是根据lanshuitianxia贴的图片写的
http://www.ouravr.com/bbs/bbs_upload19801/files_8/ourdev_182870.jpg

出0入0汤圆

发表于 2007-11-28 12:32:37 | 显示全部楼层
有人能讲下大概的原理吗?

出0入0汤圆

发表于 2007-11-28 12:40:34 | 显示全部楼层
恭喜楼主做成功了 呵呵 我晚上也回去试试看

出0入0汤圆

发表于 2007-11-28 12:50:42 | 显示全部楼层
我算基本看懂了。
首先把发光二级管施加正向电压(P->N)使其发光;之后施加反向电压(N->P),这时发光二极管相当于光敏二极管;之后再测量N级电压。
这应该是利用PN结电容吧,我想。

出0入0汤圆

 楼主| 发表于 2007-11-28 12:56:24 | 显示全部楼层
10楼分析的有道理
要想办法提高稳定性才比较实用
大家一起来实验实验。。。。

出0入0汤圆

发表于 2007-11-28 12:57:57 | 显示全部楼层
喜欢

出0入4汤圆

发表于 2007-11-28 13:12:23 | 显示全部楼层
好极了!

出0入0汤圆

发表于 2007-11-28 13:21:51 | 显示全部楼层
慢慢研究

出0入0汤圆

发表于 2007-11-28 13:30:22 | 显示全部楼层
有什么神奇的事情啊。。。偶要看看了,可靠性怎样?

出0入0汤圆

 楼主| 发表于 2007-11-28 13:32:59 | 显示全部楼层
我的代码可靠性还是欠佳的
大家一起来完善它

出0入0汤圆

发表于 2007-11-28 13:36:11 | 显示全部楼层
做着先玩玩看,再慢慢改善
LZ你的#include "global.h"
#include "delay.h"
#include "ad.h"
3个头文件上传下,我烧个到M16里去试试看

出0入0汤圆

 楼主| 发表于 2007-11-28 15:15:03 | 显示全部楼层
global.h只是#define UINT unsigned int
其它是winavr里面的文件复制出来改了一下函数名字而已
根据自己习惯写就可以了
没什么花头的,呵呵
实在需要的话等我回去再发

出0入0汤圆

发表于 2007-11-28 15:30:51 | 显示全部楼层
楼主指点一下,既然#define UINT unsigned int,那么(the_ad_value<(the_ad_value0+1)) && (the_ad_value>(the_ad_value0-1))是不是和(the_ad_value != the_ad_value0)是等效的?

出0入0汤圆

 楼主| 发表于 2007-11-28 16:25:00 | 显示全部楼层
+1 -1的话是等效
我的写法是为了方便调节灵敏度
+ - 的数字变大的话灵敏度变小

出0入0汤圆

发表于 2007-11-28 16:33:45 | 显示全部楼层
还是不太明白,文字性叙述太少了。

出0入0汤圆

 楼主| 发表于 2007-11-28 16:40:20 | 显示全部楼层

先看视频 再看7楼的图 再看代码 就明白了

出0入0汤圆

发表于 2007-11-28 17:12:44 | 显示全部楼层
楼主试过这个程序对其他颜色的LED有效吗?并且效果一样吗?

出0入0汤圆

 楼主| 发表于 2007-11-28 17:35:40 | 显示全部楼层
其他颜色到没试过,有空试试,呵呵。。。。

出0入0汤圆

 楼主| 发表于 2007-11-28 17:38:01 | 显示全部楼层
突然想起来在永乐看到的油烟机上的按键,可能也是这个原理。
那是蓝色LED

出0入0汤圆

发表于 2007-11-28 19:09:25 | 显示全部楼层
注释太少了

出0入0汤圆

发表于 2007-11-28 19:17:46 | 显示全部楼层
这个实验好玩。
不过发光管还要耗一点电。

出0入0汤圆

发表于 2007-11-28 21:45:37 | 显示全部楼层
关注

出0入0汤圆

发表于 2007-11-28 21:54:58 | 显示全部楼层
我怎么下来的都解压不了呢
C:\Documents and Settings\树树\桌面\ourdev_183176.rar: 不可预料的压缩文件末端
....

出0入0汤圆

发表于 2007-11-28 21:58:58 | 显示全部楼层
我也遇到过,可以再下载一次试试

出0入0汤圆

发表于 2007-11-28 23:55:27 | 显示全部楼层
为什么要先点亮LED再施加反向电压?

出0入0汤圆

发表于 2007-11-29 02:42:38 | 显示全部楼层
楼主贴出来的程序和视频里的程序不一样吧?
贴出来的程序里没有跟随检测量而快慢闪烁的部分!

出0入0汤圆

发表于 2007-11-29 07:42:32 | 显示全部楼层
如此可以做很漂亮的触摸感应按键不是?

出0入4汤圆

发表于 2007-11-29 09:14:05 | 显示全部楼层
在这里,不过要挂代理才能上
http://projects.dimension-x.net/technology-and-projects/ledsensors/

还有这个
http://www.techeblog.com/index.php/tech-gadget/led-touch-sensor
牛B

出0入0汤圆

发表于 2007-11-29 09:34:37 | 显示全部楼层
试了一下,手不靠近也是乱闪,不知道倒底感应到没有。

出0入0汤圆

发表于 2007-11-29 10:01:01 | 显示全部楼层
不错,试试!

出0入0汤圆

发表于 2007-11-29 12:54:03 | 显示全部楼层
不错,试试!

出0入0汤圆

 楼主| 发表于 2007-11-29 13:00:09 | 显示全部楼层
视频里面的程序就是这个程序
程序中没有处理闪的快慢
现实中确实有闪的快慢的效果(估计是因为靠的近的时候超出阈值概率比较大)

出0入0汤圆

 楼主| 发表于 2007-11-29 13:03:09 | 显示全部楼层
另外,用普通的绿色发光管试过了,没有红色的发光二极管效果好
我用的红色发光管是8x8LED块中的一个点。

出0入0汤圆

 楼主| 发表于 2007-11-29 13:04:57 | 显示全部楼层
手不靠近也乱闪的话估计是阈值太小了,把+1,-1的地方改大点试试

出0入0汤圆

 楼主| 发表于 2007-11-29 13:08:36 | 显示全部楼层
像那个油烟机上那种用蓝色发光管,前面用透明面板印刷镂空字的话,视觉效果还是很不错的。
可惜手头没有蓝色发光管
哪位有可以测试一下。

出0入0汤圆

发表于 2007-11-29 13:09:26 | 显示全部楼层
记号

出0入0汤圆

 楼主| 发表于 2007-11-29 13:10:12 | 显示全部楼层
先点亮可能只是发光效果,也可能是靠这个作为光源。
我也不确定,我实现下来感觉两个效果都有的可能性最大。

出0入0汤圆

发表于 2007-11-29 13:18:46 | 显示全部楼层
老外做的那个带3310屏幕的东东好像没有用到AD吧?IO口的AD通道不对。

出0入0汤圆

 楼主| 发表于 2007-11-29 13:26:10 | 显示全部楼层
我一开始也没用ad检测,直接io检测电平也能检测到
我实验时要按住led才有反应

出0入0汤圆

发表于 2007-11-29 13:35:52 | 显示全部楼层
哦!我还以为视频里的程序和贴出来的程序不一样,原来是这样的!误会了,不好意思!
这么说来的话,外部光源对它的干忧也是很大的,这个要问题解决才实用!

出0入0汤圆

发表于 2007-11-29 13:37:32 | 显示全部楼层
我一开始也没用ad检测,直接io检测电平也能检测到
我实验时要按住led才有反应

什么意思哦,就是说按住LED才能检测到IO口电平变化么?

出0入0汤圆

发表于 2007-11-29 13:57:24 | 显示全部楼层
有意思,等下试试!

出0入0汤圆

发表于 2007-11-29 17:12:11 | 显示全部楼层
记号。。有空实验下

出0入0汤圆

发表于 2007-11-29 17:15:29 | 显示全部楼层
是怎么过原理?

出0入0汤圆

 楼主| 发表于 2007-11-29 20:35:32 | 显示全部楼层
我一开始也没用ad检测,直接io检测电平也能检测到  
我实验时要按住led才有反应  

》》》
什么意思哦,就是说按住LED才能检测到IO口电平变化么?

》》》
用ad的话可以电平有细微变化就能检查到,检查io电平的要电平变化大才行(与avr的io输入高低电平判断阈值有关)

出0入0汤圆

 楼主| 发表于 2007-11-29 20:36:07 | 显示全部楼层
7楼的图就是原理

出0入0汤圆

 楼主| 发表于 2007-11-29 20:37:03 | 显示全部楼层
外部光源的干扰确实比较大
这个要处理的号估计也是有一定难度的

出0入0汤圆

发表于 2007-11-29 20:44:36 | 显示全部楼层
先设定输出,发光管亮
再反转,把原先的引脚设定为输入,再检测引脚状态


是不是这样的?个人愚见!

出0入0汤圆

发表于 2007-11-29 21:56:55 | 显示全部楼层
实验LED的光伏特性和反不反转无关,直接那二极管通过示波器或万用表测量其电压.

灯光下遮挡和不遮挡通常在10mV-100mV间变化(和二极管,光强度有关).如此以来好象必须要AD转换.

通电的意思可能是为了让它发光,反通电就不明白了.会不会是这样就不用管LED正负了呢?

出0入0汤圆

发表于 2007-11-29 23:45:24 | 显示全部楼层
哈哈,我成功了,真的很神奇哦,空的时候好好研究一下,想不到led还有这个用处.不过程序好像不太稳定,呵呵,如果可靠性做好点就更好玩了,大家一起努力吧:-)

出0入12汤圆

发表于 2007-11-30 06:43:59 | 显示全部楼层
就是光敏二极管吧,
用光敏二极管灵敏度在加点光不是更好吗,而且还省电
另外,在黑暗中和在阳光下的差距应该很大吧

没有仔细考虑,不对的请指正

出0入0汤圆

发表于 2007-11-30 09:34:23 | 显示全部楼层
用光敏二极管还有什么意思!

出0入0汤圆

发表于 2007-11-30 09:52:50 | 显示全部楼层
留个记号先!

出0入0汤圆

发表于 2007-11-30 09:57:09 | 显示全部楼层
高亮度LED效果如何?有空试试。

出0入0汤圆

 楼主| 发表于 2007-11-30 10:29:55 | 显示全部楼层
先设定输出,发光管亮
再反转,把原先的引脚设定为输入,再检测引脚状态


是不是这样的?个人愚见!

>>>>>>>>>>>>>>>>>
目前的程序就是这样的

出0入0汤圆

 楼主| 发表于 2007-11-30 10:32:21 | 显示全部楼层
实验LED的光伏特性和反不反转无关,直接那二极管通过示波器或万用表测量其电压.

灯光下遮挡和不遮挡通常在10mV-100mV间变化(和二极管,光强度有关).如此以来好象必须要AD转换.

通电的意思可能是为了让它发光,反通电就不明白了.会不会是这样就不用管LED正负了呢?

》》》》》》
实际使用的话通电发光效果要好一点
比如发光的时候表示这个LED按键有效

反通电应该是给结电容充电

出0入0汤圆

 楼主| 发表于 2007-11-30 10:34:08 | 显示全部楼层
就是光敏二极管吧,
用光敏二极管灵敏度在加点光不是更好吗,而且还省电
另外,在黑暗中和在阳光下的差距应该很大吧

没有仔细考虑,不对的请指正
》》》》》》
用光敏管的话就不好玩了,呵呵
发光管如果能做到稳定,产品外壳外观设计比较方便

出0入0汤圆

发表于 2007-11-30 10:34:32 | 显示全部楼层
http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=858550&bbs_page_no=1&search_mode=4&search_text=Forever&bbs_id=9999
这个帖里面有相关的资料介绍的

出0入0汤圆

 楼主| 发表于 2007-11-30 10:34:50 | 显示全部楼层
高亮度LED效果如何?有空试试。
》》》》》
没试过

出0入0汤圆

 楼主| 发表于 2007-11-30 10:36:06 | 显示全部楼层
哈哈,我成功了,真的很神奇哦,空的时候好好研究一下,想不到led还有这个用处.不过程序好像不太稳定,呵呵,如果可靠性做好点就更好玩了,大家一起努力吧:-)


》》》》
能否把你成功经验分享一下,比如用的什么发光管等等。。。。

出0入0汤圆

 楼主| 发表于 2007-11-30 10:39:32 | 显示全部楼层
用示波器看了一下信号,发现一个优化程序的方法也许可行
检测的时候的电压是逐步下降的,而且手指是否靠近时的下降速度不同
设置一个比较宽的阈值,多次检测,判断达到这个阈值的时间
估计效果更好
大家一起试试

出0入0汤圆

 楼主| 发表于 2007-11-30 11:01:37 | 显示全部楼层
64楼的帖子不错,看这个帖子后才做这个实验的,呵呵。
光看别人的不够,还是自己干一下比较有趣。。。。。。

出0入0汤圆

发表于 2007-11-30 11:15:54 | 显示全部楼层
真神奇!我也打算试一试。

出0入4汤圆

发表于 2007-11-30 11:19:21 | 显示全部楼层
好贴,有空试一下

出0入0汤圆

发表于 2007-11-30 11:28:48 | 显示全部楼层
回66楼的兄弟,我用的是普通的贴片红色led灯,程序用的就是楼主的,只是要换成codeversion编译环境及led位置不同的缘故,稍稍做了修改.呵呵,winavr一直没空学:)

出0入0汤圆

发表于 2007-11-30 15:31:14 | 显示全部楼层
有创意!

出0入0汤圆

发表于 2008-4-3 17:46:47 | 显示全部楼层
好人啊

出0入0汤圆

发表于 2008-4-3 22:13:00 | 显示全部楼层
看了老外的视频
真的很NB
(原文件名:LED点阵输入.JPG)

出0入0汤圆

发表于 2008-4-4 00:54:50 | 显示全部楼层
记录!

出0入0汤圆

发表于 2008-4-4 15:28:52 | 显示全部楼层
留个记号,有空研究

出0入0汤圆

发表于 2008-4-4 17:50:37 | 显示全部楼层
记录.....

出0入0汤圆

发表于 2008-4-4 18:28:36 | 显示全部楼层
不错,不错!!

出0入0汤圆

发表于 2008-4-4 20:09:16 | 显示全部楼层
太厉害了

出0入0汤圆

发表于 2008-4-5 10:00:23 | 显示全部楼层
thanks

出0入0汤圆

发表于 2008-4-5 10:30:34 | 显示全部楼层
看来LED很有搞头。顶

出0入0汤圆

发表于 2008-4-5 16:20:09 | 显示全部楼层
ehe哦呵呵,研究

出0入0汤圆

发表于 2008-4-5 18:13:15 | 显示全部楼层
强!

出0入0汤圆

发表于 2008-4-6 06:08:35 | 显示全部楼层
有点电容式触摸屏的味道。现在有些电器和手机用的,不过没有用LED,电容直接做在PCB上.

出0入0汤圆

发表于 2008-4-6 08:22:55 | 显示全部楼层

出0入0汤圆

发表于 2008-4-8 15:03:56 | 显示全部楼层
现在很多笔记本和mp4上的触摸控制按钮,不知道是不是这个原理。

出0入0汤圆

发表于 2008-8-7 15:35:58 | 显示全部楼层
不错。。。

出0入0汤圆

发表于 2008-8-7 17:03:48 | 显示全部楼层
如果用贴片led做一个比较密的矩阵就可以当电脑触摸板吧

出0入4汤圆

发表于 2008-8-7 18:28:44 | 显示全部楼层
记号

出0入0汤圆

发表于 2008-8-9 10:19:53 | 显示全部楼层
我也想做一个,可惜不会AVR

出0入0汤圆

发表于 2008-8-9 22:40:12 | 显示全部楼层
对这里有点小困惑,初始化建立基本阈值时:
LED_P_O(); <----设定端口为输出
LED_P_H();
LED_N_O();
LED_N_L();
delay_ms(1);
  //
LED_P_O(); <----设定端口为输出
LED_P_L();

为什么要设定两次呢?
------------------------------------------------
还有一个小疑惑:
建立初始阈值时,一般算法应该是取10次求平均或者中值等等,而此处是简单的取第10次的值,不知有何奥秘?

出0入0汤圆

发表于 2008-8-9 23:55:20 | 显示全部楼层
刚才试验了一下,AD只有1个BIT的跳动,很不准确,继续试验中。。。

出0入0汤圆

发表于 2008-8-17 11:01:37 | 显示全部楼层
这个喜欢。。。。。。。。。

出0入0汤圆

发表于 2008-9-4 23:30:06 | 显示全部楼层
记录!

出0入0汤圆

发表于 2008-9-5 08:42:43 | 显示全部楼层
mark! 有时间试试

出0入0汤圆

发表于 2008-9-5 17:01:03 | 显示全部楼层
LS

出0入0汤圆

发表于 2008-9-7 09:03:00 | 显示全部楼层
这个牛!
http://www.cs.nyu.edu/~jhan/

原理:
http://blog.makezine.com/archive/2006/06/led_touch_sensor.html

出0入0汤圆

 楼主| 发表于 2008-9-7 19:11:59 | 显示全部楼层
/*
对这里有点小困惑,初始化建立基本阈值时:
LED_P_O(); <----设定端口为输出
LED_P_H();  
LED_N_O();  
LED_N_L();  
delay_ms(1);  
  //  
LED_P_O(); <----设定端口为输出
LED_P_L();  

为什么要设定两次呢?
*/
不需要设定两次,只是测试代码。


------------------------------------------------
/*
还有一个小疑惑:
建立初始阈值时,一般算法应该是取10次求平均或者中值等等,而此处是简单的取第10次的值,不知有何奥秘?
*/
取第10次只是为了等这个值进入稳定期。
可用用更好的算法,例如,自动判断出一段稳定期,取平均值。

出0入0汤圆

发表于 2008-9-9 17:01:23 | 显示全部楼层
mark~~
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-9 06:18

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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