目录
1 实用光敏电阻
1.1 什么是LDR/光敏电阻?
1.2 您将要学习的内容
2 示例电路
2.1 模拟黑暗缓解器
2.1.1 BOM
2.1.2 开始构建!
2.2 数字黑暗缓解器
2.2.1 BOM
2.2.2 开始构建!
1 实用光敏电阻
1.1 什么是光敏电阻(LDR)?
LDR依赖于光电导性,就本项目来说,光电导性可以概括光敏电阻受到光线照射时具有低电阻值,没有受到光线照射时具有高电阻值。
在这两个临界点之间,有很大的空间来感知LDR所受到的实际光照强度。我使用的型号在完全无光的条件下电阻仅为~500千欧,在强烈的中午阳光下为~100欧姆。LDR的特点是其本身的温度会影响环境的温度,这导致光敏电阻不适合用于高精度光测量,但是还是可以用于很多应用程序中。
此外,请注意光敏电阻对光线变化的响应时间为~10ms,这也许会成为您应用中的影响因素。
另一个值得注意的事情是,LDR在较暗的环境下具有很高的电阻值,这种情况下您无法用手握住它们进行准确测量。您自身身体的电阻值相当高,约为2-3 兆欧,如果您用一只手握住一个万用表探头,触摸一根导线,同时与另外一个导线上的探头有皮肤接触,LDR将与您的身体并联连接。如果LDR会从手中滑脱,请使用灵活的钳形夹具。
在示例电路部分,我将演示路灯驱动的原理(在集中控制出现之前),以及许多其他需要感知光照强度的系统。需要提前说明的一点是,在一个复杂电路中,LDR无法只依靠自身来发挥作用,经常需要使用分压器,以在驱动FET和读取光照强度(例如使用了Arduino)时提供更好的粒度。分压器由两个串联的电阻组成。在这两个电阻之间,我们会测量出一个有用的电压值。尝试测量R1和R2之间的点,其中R1是串联电路中的第一个电阻,R2是第二个电阻。使用以下公式:
- V_out = V_in * ( R2 / ( R1 + R2 ) )
- For example:
- V_out = 5 * ( 330 / ( 1000 + 330 ) ) = 1.24V
实际上,如果您向该分压器输入5V,并测量从R1(1000欧姆)和R2(330欧姆)之间的点到接地点之间的点位,您将在万用表上读到~1.24V。
更有趣的是,如果R1像LDR那样在不同光照条件下具有可变电阻,并且R2是一个10千欧的电位计,那么您可以对分压器的输出电压进行微调,从而使输出电压在FET栅极/BJT基极或微控制器ADC的耐受电压范围内,并将保持足够的分辨率来确定LDR上的光照强度。
这有时候非常有用,比如使用耐压为1V的ESP8266 ADC的时候。基于atmega328p的Arduinos耐压不超过5V,而基于atmega168的Arduinos耐压不超过3.3V。如果您想通过Arduino 读取一个12V的信号,请使用分压器。
请注意,分压器不适合用于负载,仅可用于信号控制和测量。过大的负载将会对分压器产生影响并使电阻升温,好的方法是使用稳压器或降压转换器来降压,从而为负载提供稳定的电压。
红外Raspberry Pi NoIR相机模块使用了一个简单的分压器电路。它仅在环境光照强度达到一定值时才会打开其红外LED。您需要一个P沟道MOSFET或PNP晶体管以一种尽可能简单的方式来使用它。
实际应用中,您只需要知道P沟道MOSFET或PNP晶体管在其栅极或基极为高电平时会关闭就可以了。高电平的电压值是可变的,但是在Arduinos上,通常施加5V或3V的电压就足以断开电路以及中断电子流动了。当拉至低电平时(0V),P沟道MOSFET或PNP晶体管会接通电路,电子可以流动。通常会需要使用一个上拉电阻来防止此类晶体管一直导通!
1.2 您将要学习的内容
在第2节中,您将学习如何构建模拟LDR电路以及数字LDR电路。2.1中的模拟LDR电路可以被构建为一个插件硬件模块,来对现有硬件的行为进行修改(将会是很小幅度的修改),并且可以很容易地驱动继电器或其他类似的部件,而2.2中的电路和代码可以用作您使用Arduino创建的任何类型电路的模板。后者仅可以通过一个分压器读取LDR,但是可以轻松实现扩展。一个广泛使用的电路是部署太阳能电池板之前使用的光记录器,您可以在其中构建一个带有microSD的电池供电Arduino,设置为在特定位置以及特定角度记录光照强度。
对于下面的电路,虽然P 沟道MOSFET使用起来会更简洁,但是我们会使用PNP晶体管。需要注意的是,在实际应用中,虽然MOSFET消耗的电流要少得多,而且开关取决于所提供的电压,而非电流,但是关键性的区别在于PNP会对流向其基极的电流作出响应。
这意味着必须始终有一个限流电阻与PNP基极串联,否则它将会被烧毁。在使用Arduino的情况下,具有5V的数字引脚输出,那么一个220欧姆的电阻就足够了(5V / 220R = ~23mA),或者,如果您想更保险一点的话,可以使用一个270欧姆的电阻(5V/270R = ~18mA)。通常,您只能从一个Arduino(atmega328p 以及atmega168)获取~20mA电流,虽然获取~40mA的情况也并不少见,但是这样会大大缩短电路板的寿命。建议不要这样做。
除了这些技术层面的特点,LDR电路还可以以低成本、易操作的方式部署在几乎所有电路中以控制其行为。在以下内容中,为了延长电池寿命,对新型LED灯(3个 LR44 1.5V电池、一个LED、一个电阻和一个开关)进行修改。可以通过电位计调节光敏度,同时LDR放置于面对窗户的位置。
还可以使用LDR为太阳能电池板构建简单的导向系统,来使其能够尽可能垂直于太阳光线(电池板在90°的角度上可以产生最大功率)。
为了实现这一点,可以在单轴和双轴太阳能追踪机器人的交叉配置中使用两个或四个LDR。
这里确实需要一个带有ADC的微控制器,虽然它是从面板获取所有可用功率的可靠方法,但是代价是有时会需要几个步进电机微步。在其它时间,微控制器会处于休眠状态。可以试试能够在此类中等复杂的电路中实现电机完美控制的A4988电机驱动器。
2 示例电路
当LDR受到~400nm至~600nm范围内的光照射时,它的电阻会大大降低,而在没有光照的情况下,它的电阻会变得非常高,我们甚至可以认为是不导电的。当然,它仍然是导电的,但是只能流通5V / 1000000R = 1uA的电流,也就是1兆欧电阻时是1微安。这个电流值太小了,以至于需要一个运算放大器才能对该电流加以利用。如果您不熟悉欧姆定律,请阅读本指南。
观察LED手电筒(非全光谱光源)光照下以及遮蔽该光照下的电阻差异。
2.1 模拟黑暗缓解器
2.1.1 BOM
您将需要以下部件:
1x BC557 PNP 晶体管 | https://www.newark.com/multicomp/bc557b/bipolar-bjt-single-transistor/dp/04X5933 |
4x ROHM SLR343BC4TT32 3mm LEDs | https://www.avnet.com/shop/us/products/rohm/slr343bc4tt32-3074457345627700657?CMP=EMA_ECIA_inventoryfeed_VSE?aka_re=1 |
10 千欧电位计 | https://www.newark.com/bourns/3296w-1-103lf/pot-trimmer-10k-25turn-10/dp/39K2049 |
4x 330欧姆电阻 | https://www.newark.com/multicomp/mccfr0w4j0331a50/carbon-film-resistor-330-ohm-250mw/dp/58K5042 |
面包板 | https://www.newark.com/multicomp/mcbb830/breadboard-solderless-abs/dp/99W1760 |
跳线 | https://www.newark.com/adafruit/758/kit-contents/dp/88W2570 |
LDR | https://www.newark.com/lprs/n5ac501085/ldr-5mohm-50mw-ng-series/dp/14J5050 |
2.1.2 开始构建!
如图所示,将所有部件连接起来。
四个ROHM SLR343BC4TT32 3mm LED使用LDR和电位计进行控制,电位计依次切换BC557 PNP晶体管。因为它不依赖于任何数字设备,所以具有小尺寸、易于实施的特点,您可以将其很轻松地安装在诸如您花园或车库的灯光系统这样的电路中。
将一个220欧姆电阻与BC557基极串联的电气原理是为了防止在10千欧电位计调低到接近0欧,而您的LDR具有超低电阻值时烧坏您的晶体管。这是可以省略的。当LDR的头部受到正常强度的光线照射时,LED会打开。
将电路连接到面包板上,将10千欧电位计调整到所需的灵敏度。把LDR暴露在不同强度的光照下,直到您满意为止。
请注意负载的位置。在NPN晶体管上,负载通常与集电极串联,而在N沟道MOSFET上,负载通常与漏极串联。PNP和N沟道MOSFET的这些极性是相反的,在上面的电路图中,负载在发射极一侧,集电极直接连接到了5V上。
在过去,这种电路用于路灯驱动,而现在也完全没有过时。也就是说,您可以将其用作继电器驱动电路,并且可以替换掉LED,使用5V继电器来启用更大的负载,例如交流电灯或者灭虫器。夏天的时候,会飞的咬人虫子会经常困扰你。可以使用这种灭虫器来对付它们:这就是完美的用于消灭蚊虫的“Hello World”电路!
2.2 数字黑暗缓解器
虽然上述电路是很有用的,但是您还是应该学习使用ADC(数模转换器)来读取光照强度。在本项目中,我们使用Arduino Uno或Nano。
2.2.1 BOM
您将会需要以下部件:
Arduino Uno 或 Arduino Nano | https://store.arduino.cc/arduino-uno-rev3https://store.arduino.cc/arduino-nano |
10千欧电位计 | https://www.newark.com/bourns/3296w-1-103lf/pot-trimmer-10k-25turn-10/dp/39K2049 |
LDR | https://www.newark.com/lprs/n5ac501085/ldr-5mohm-50mw-ng-series/dp/14J5050 |
面包板 | https://www.newark.com/multicomp/mcbb830/breadboard-solderless-abs/dp/99W1760 |
跳线 | https://www.newark.com/adafruit/758/kit-contents/dp/88W2570 |
2.2.2 开始构建!
将10千欧电位计和LDR连接到您的Arduino Uno 或 Nano,形成一个分压器,方法如下:
然后,在此处(https://www.arduino.cc/en/Guide)下载最新的Arduino IDE,并按照适用于您系统的相关说明进行操作,在安装Arduino Desktop IDE下面的章节。(https://www.arduino.cc/en/software/)
Arduino IDE不在本教程范围内,您只需要按下CTRL+U组合键进行上传,按下CTRL+SHIFT+M组合键查看串行输出即可。
请将以下内容粘贴到一个新草图中,并将其另存为LDR_analogRead.ino。然后上传草图,并打开您的串行监视器。
- void setup( void ) {
- Serial.begin( 9600 ) ;
- // Declaring this an input is
- // only to keep
- // track of pin usage in setup().
- pinMode( A0, INPUT ) ;
- }
- void loop( void ) {
- delay( 100 ) ;
- //Serial.println( F( "[!] Looping" ) ) ;
- }
- void serialEvent( void ) {
- Serial.print(
- F( "[!] analogRead( A0 ) => " ) ) ;
- Serial.println( analogRead( A0 ) ) ;
- // Flush the Serial buffer ...
- while ( Serial.available() )
- Serial.read() ;
- }
- [!] analogRead( A0 ) => 607
- [!] analogRead( A0 ) => 610
- [!] analogRead( A0 ) => 604
- [!] analogRead( A0 ) => 610
- [!] analogRead( A0 ) => 597
在这个小程序中,Arduino将读取A0引脚上的电压,分辨率为10位,在0到1023范围内产生1024(2**10)个可能值。每一个值对应于一个0到5V之间的电压。每一步约为~0.0048V,因此读数为512时电压为~2.46V。
现在您已经学会了如何使用LDR,以及一些关于晶体管和Arduino的知识,尝试将光感测功能添加到现有的电路中,或者从头开始构建您自己的电路。