allenjoe 发表于 2007-11-28 11:10:41

[实验] 普通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;
}

Feeling_MCU 发表于 2007-11-28 11:20:18

顶,很感兴趣

avr_c 发表于 2007-11-28 11:28:20

ding~~~~~

avruser 发表于 2007-11-28 12:06:24

顶!视频很棒!
楼主能再做些文字说明就更好啦!

mtheory 发表于 2007-11-28 12:12:09

用430好像也有这方面的应用,在ti网站上有下载。。。。。。

christmas108 发表于 2007-11-28 12:15:57

有人能讲下大概的原理吗?

allenjoe 发表于 2007-11-28 12:18:09

mtheory能否给个连接,研究的透彻一点。

allenjoe 发表于 2007-11-28 12:20:20

代码是根据lanshuitianxia贴的图片写的
http://www.ouravr.com/bbs/bbs_upload19801/files_8/ourdev_182870.jpg

christmas108 发表于 2007-11-28 12:32:37

有人能讲下大概的原理吗?

lanshuitianxia 发表于 2007-11-28 12:40:34

恭喜楼主做成功了 呵呵 我晚上也回去试试看./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

hackerboygn 发表于 2007-11-28 12:50:42

我算基本看懂了。
首先把发光二级管施加正向电压(P->N)使其发光;之后施加反向电压(N->P),这时发光二极管相当于光敏二极管;之后再测量N级电压。
这应该是利用PN结电容吧,我想。

allenjoe 发表于 2007-11-28 12:56:24

10楼分析的有道理
要想办法提高稳定性才比较实用
大家一起来实验实验。。。。

mljda 发表于 2007-11-28 12:57:57

喜欢

atommann 发表于 2007-11-28 13:12:23

好极了!

kkk215215 发表于 2007-11-28 13:21:51

慢慢研究

fugeone 发表于 2007-11-28 13:30:22

有什么神奇的事情啊。。。偶要看看了,可靠性怎样?

allenjoe 发表于 2007-11-28 13:32:59

我的代码可靠性还是欠佳的
大家一起来完善它

kkk215215 发表于 2007-11-28 13:36:11

做着先玩玩看,再慢慢改善
LZ你的#include "global.h"
#include "delay.h"
#include "ad.h"
3个头文件上传下,我烧个到M16里去试试看

allenjoe 发表于 2007-11-28 15:15:03

global.h只是#define UINT unsigned int
其它是winavr里面的文件复制出来改了一下函数名字而已
根据自己习惯写就可以了
没什么花头的,呵呵
实在需要的话等我回去再发

hackerboygn 发表于 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)是等效的?

allenjoe 发表于 2007-11-28 16:25:00

+1 -1的话是等效
我的写法是为了方便调节灵敏度
+ - 的数字变大的话灵敏度变小

yy945 发表于 2007-11-28 16:33:45

还是不太明白,文字性叙述太少了。

allenjoe 发表于 2007-11-28 16:40:20

./emotion/em007.gif
先看视频 再看7楼的图 再看代码 就明白了

changjing 发表于 2007-11-28 17:12:44

楼主试过这个程序对其他颜色的LED有效吗?并且效果一样吗?

allenjoe 发表于 2007-11-28 17:35:40

其他颜色到没试过,有空试试,呵呵。。。。

allenjoe 发表于 2007-11-28 17:38:01

突然想起来在永乐看到的油烟机上的按键,可能也是这个原理。
那是蓝色LED

HZZCL 发表于 2007-11-28 19:09:25

注释太少了

bozai 发表于 2007-11-28 19:17:46

这个实验好玩。
不过发光管还要耗一点电。

chengjia535 发表于 2007-11-28 21:45:37

关注

shiqianwei 发表于 2007-11-28 21:54:58

我怎么下来的都解压不了呢
C:\Documents and Settings\树树\桌面\ourdev_183176.rar: 不可预料的压缩文件末端
....

chengjia535 发表于 2007-11-28 21:58:58

我也遇到过,可以再下载一次试试

donkey 发表于 2007-11-28 23:55:27

为什么要先点亮LED再施加反向电压?

supersai 发表于 2007-11-29 02:42:38

楼主贴出来的程序和视频里的程序不一样吧?
贴出来的程序里没有跟随检测量而快慢闪烁的部分!

xiaobendan 发表于 2007-11-29 07:42:32

如此可以做很漂亮的触摸感应按键不是?

liuqian 发表于 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

yy945 发表于 2007-11-29 09:34:37

试了一下,手不靠近也是乱闪,不知道倒底感应到没有。

Forever 发表于 2007-11-29 10:01:01

不错,试试!

renxupeng 发表于 2007-11-29 12:54:03

不错,试试!

allenjoe 发表于 2007-11-29 13:00:09

视频里面的程序就是这个程序
程序中没有处理闪的快慢
现实中确实有闪的快慢的效果(估计是因为靠的近的时候超出阈值概率比较大)

allenjoe 发表于 2007-11-29 13:03:09

另外,用普通的绿色发光管试过了,没有红色的发光二极管效果好
我用的红色发光管是8x8LED块中的一个点。

allenjoe 发表于 2007-11-29 13:04:57

手不靠近也乱闪的话估计是阈值太小了,把+1,-1的地方改大点试试

allenjoe 发表于 2007-11-29 13:08:36

像那个油烟机上那种用蓝色发光管,前面用透明面板印刷镂空字的话,视觉效果还是很不错的。
可惜手头没有蓝色发光管
哪位有可以测试一下。

xuepeng2000 发表于 2007-11-29 13:09:26

记号

allenjoe 发表于 2007-11-29 13:10:12

先点亮可能只是发光效果,也可能是靠这个作为光源。
我也不确定,我实现下来感觉两个效果都有的可能性最大。

shabby 发表于 2007-11-29 13:18:46

老外做的那个带3310屏幕的东东好像没有用到AD吧?IO口的AD通道不对。

allenjoe 发表于 2007-11-29 13:26:10

我一开始也没用ad检测,直接io检测电平也能检测到
我实验时要按住led才有反应

supersai 发表于 2007-11-29 13:35:52

哦!我还以为视频里的程序和贴出来的程序不一样,原来是这样的!误会了,不好意思!
这么说来的话,外部光源对它的干忧也是很大的,这个要问题解决才实用!

shabby 发表于 2007-11-29 13:37:32

我一开始也没用ad检测,直接io检测电平也能检测到
我实验时要按住led才有反应

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

langeliu 发表于 2007-11-29 13:57:24

有意思,等下试试!

onorg 发表于 2007-11-29 17:12:11

记号。。有空实验下

cjbcjb 发表于 2007-11-29 17:15:29

是怎么过原理?

allenjoe 发表于 2007-11-29 20:35:32

我一开始也没用ad检测,直接io检测电平也能检测到
我实验时要按住led才有反应

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

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

allenjoe 发表于 2007-11-29 20:36:07

7楼的图就是原理

allenjoe 发表于 2007-11-29 20:37:03

外部光源的干扰确实比较大
这个要处理的号估计也是有一定难度的

langeliu 发表于 2007-11-29 20:44:36

先设定输出,发光管亮
再反转,把原先的引脚设定为输入,再检测引脚状态


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

Oliver 发表于 2007-11-29 21:56:55

实验LED的光伏特性和反不反转无关,直接那二极管通过示波器或万用表测量其电压.

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

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

lucky_000 发表于 2007-11-29 23:45:24

哈哈,我成功了,真的很神奇哦,空的时候好好研究一下,想不到led还有这个用处.不过程序好像不太稳定,呵呵,如果可靠性做好点就更好玩了,大家一起努力吧:-)

kv2004 发表于 2007-11-30 06:43:59

就是光敏二极管吧,
用光敏二极管灵敏度在加点光不是更好吗,而且还省电
另外,在黑暗中和在阳光下的差距应该很大吧

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

chengjia535 发表于 2007-11-30 09:34:23

用光敏二极管还有什么意思!

whoami 发表于 2007-11-30 09:52:50

留个记号先!

huangdongle 发表于 2007-11-30 09:57:09

高亮度LED效果如何?有空试试。

allenjoe 发表于 2007-11-30 10:29:55

先设定输出,发光管亮
再反转,把原先的引脚设定为输入,再检测引脚状态


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

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

allenjoe 发表于 2007-11-30 10:32:21

实验LED的光伏特性和反不反转无关,直接那二极管通过示波器或万用表测量其电压.

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

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

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

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

allenjoe 发表于 2007-11-30 10:34:08

就是光敏二极管吧,
用光敏二极管灵敏度在加点光不是更好吗,而且还省电
另外,在黑暗中和在阳光下的差距应该很大吧

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

Forever 发表于 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
这个帖里面有相关的资料介绍的

allenjoe 发表于 2007-11-30 10:34:50

高亮度LED效果如何?有空试试。
》》》》》
没试过

allenjoe 发表于 2007-11-30 10:36:06

哈哈,我成功了,真的很神奇哦,空的时候好好研究一下,想不到led还有这个用处.不过程序好像不太稳定,呵呵,如果可靠性做好点就更好玩了,大家一起努力吧:-)


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

allenjoe 发表于 2007-11-30 10:39:32

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

allenjoe 发表于 2007-11-30 11:01:37

64楼的帖子不错,看这个帖子后才做这个实验的,呵呵。
光看别人的不够,还是自己干一下比较有趣。。。。。。

scwxb 发表于 2007-11-30 11:15:54

真神奇!我也打算试一试。

chendaon 发表于 2007-11-30 11:19:21

好贴,有空试一下

lucky_000 发表于 2007-11-30 11:28:48

回66楼的兄弟,我用的是普通的贴片红色led灯,程序用的就是楼主的,只是要换成codeversion编译环境及led位置不同的缘故,稍稍做了修改.呵呵,winavr一直没空学:)

ym_avr 发表于 2007-11-30 15:31:14

有创意!

jizzll 发表于 2008-4-3 17:46:47

好人啊

AVR-BIN 发表于 2008-4-3 22:13:00

看了老外的视频
真的很NBhttp://cache.amobbs.com/bbs_upload782111/files_9/ourdev_244281.JPG
(原文件名:LED点阵输入.JPG)

sciencehero 发表于 2008-4-4 00:54:50

记录!

firegl99 发表于 2008-4-4 15:28:52

留个记号,有空研究

jaky80000 发表于 2008-4-4 17:50:37

记录.....

kaif_w 发表于 2008-4-4 18:28:36

不错,不错!!

notalklu 发表于 2008-4-4 20:09:16

太厉害了

charliexp 发表于 2008-4-5 10:00:23

thanks

ivws 发表于 2008-4-5 10:30:34

看来LED很有搞头。顶

jizzll 发表于 2008-4-5 16:20:09

ehe哦呵呵,研究

zhongguoren 发表于 2008-4-5 18:13:15

强!

njchenmin 发表于 2008-4-6 06:08:35

有点电容式触摸屏的味道。现在有些电器和手机用的,不过没有用LED,电容直接做在PCB上.

yzlyear 发表于 2008-4-6 08:22:55

ghosthd 发表于 2008-4-8 15:03:56

现在很多笔记本和mp4上的触摸控制按钮,不知道是不是这个原理。

349242603 发表于 2008-8-7 15:35:58

不错。。。

aviator 发表于 2008-8-7 17:03:48

如果用贴片led做一个比较密的矩阵就可以当电脑触摸板吧

wajlh 发表于 2008-8-7 18:28:44

记号

yuhang 发表于 2008-8-9 10:19:53

我也想做一个,可惜不会AVR

LRNAVR 发表于 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次的值,不知有何奥秘?

LRNAVR 发表于 2008-8-9 23:55:20

刚才试验了一下,AD只有1个BIT的跳动,很不准确,继续试验中。。。

63553183 发表于 2008-8-17 11:01:37

这个喜欢。。。。。。。。。

sws222 发表于 2008-9-4 23:30:06

记录!

ajoe 发表于 2008-9-5 08:42:43

mark! 有时间试试

dovebird 发表于 2008-9-5 17:01:03

LS

xiaoao360 发表于 2008-9-7 09:03:00

这个牛!
http://www.cs.nyu.edu/~jhan/

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

allenjoe 发表于 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次只是为了等这个值进入稳定期。
可用用更好的算法,例如,自动判断出一段稳定期,取平均值。

pally2004 发表于 2008-9-9 17:01:23

mark~~
页: [1] 2 3
查看完整版本: [实验] 普通LED作为传感器 (附 原理图 源代码) &lt;&lt;&lt;视频已上传