一起玩儿物联网人工智能小车(ESP32)——55. 利用光敏电阻实现追光小车(一)

摘要:本文介绍使用光敏电阻实现追光小车

要想实现追光小车,首先需要找到可以反应光强的传感器。测量光强最常使用且价格便宜的就是光敏电阻和光敏二极管了。

光敏电阻器常用的制作材料为硫化镉,另外还有硒、硫化铝、硫化铅和硫化铋等材料。这些制作材料具有在特定波长的光照射下,其阻值迅速减小的特性。这是由于光照产生的载流子都参与导电,在外加电场的作用下作漂移运动,电子奔向电源的正极,空穴奔向电源的负极,从而使光敏电阻器的阻值迅速下降。光敏电阻器的阻值随入射光线(可见光)的强弱变化而变化,在黑暗条件下,它的阻值(暗阻)可达1~10M欧,在强光条件(100LX)下,它阻值(亮阻)仅有几百至数千欧姆。光敏电阻器对光的敏感性(即光谱特性)与人眼对可见光(0.4~0.76)μm的响应很接近,只要人眼可感受的光,都会引起它的阻值变化。常见的光敏电阻如下图所示:

光敏电阻属半导体光敏器件,除具灵敏度高,反应速度快,光谱特性及阻值一致性好等特点外,在高温,多湿的恶劣环境下,还能保持高度的稳定性和可靠性,可广泛应用于照相机,太阳能庭院灯、草坪灯、路灯自动开关以及各种光控玩具,光控灯饰,灯具等光自动开关控制领域。

这次用在追光小车上使用的是光敏电阻模块,该模块如下图所示。

这种光敏电阻模块通常有两种,一种是3个引脚的,另一种是4个引脚的。两者的区别在于,3引脚的只有一个数字量输出,也就是只能输出高低电平两种状态,而4引脚的多了一个模拟量输出引脚,通过该引脚能够得到光敏电阻在光敏电阻前端分压电路中的电压值,通过这个电压值,可以得到光强的变化情况。因此,3引脚的通常用于根据光线控制灯亮灭的场合,而4引脚的则可以用在需要测量光线变化情况的场景。

我们在这里使用的是4引脚的光敏电阻模块,如下图所示:

在上图中可以看到,最左侧为一个光敏电阻,中部有一个灵敏度调节电位器,这个电位器的作用就是调节后端数字量输出口DO的变化的阈值,也就是当照射在光敏电阻上的光强达到多少时,DO的输出进行高低电平的切换。在控制路灯的应用中,可以通过调节此电位器来调节亮灯的时机。光敏电阻模块靠右侧还有两个LED指示灯,上面的是电源指示灯,下面的是DO输出指示灯。当光敏电阻接收到的光强大于事先的设定时,该LED会点亮。模块的最右侧为外接引脚,具体定义说明如下:

序号

标识

名称

说明

1

VCC

电源正极

3.3V~5V

2

GND

电源负极

3

DO

开关信号输出

表示光强是否大于事先设定值

4

AO

模拟信号输出

光敏电阻两端的电压输出,光强越强,电压值越小。

下面就来把光敏电阻模块与ESP32开发板连接起来,先来测试一下基本功能吧。在这里要使用的是模拟量接口AO,因为我们需要读取光强的变化以及进行多个光敏电阻模块采集到的光强进行比较,以此来决定小车的运动方向。具体的连接方式如下表所示:

光敏电阻模块

ESP32扩展板

VCC

+3.3V(注意这里别接错了)

GND

GND

AO

P34

这里的模拟量读取其实就是电压值的读取,这个在之前已经介绍过了,使用Arduino提供的标准函数analogRead()就可以了。具体程序代码如下所示:

void setup() {

  // put your setup code here, to run once:

  Serial.begin(115200);

}

void loop() {

  // put your main code here, to run repeatedly:

  Serial.println( analogRead(34) );

  delay(1000);

}

编译、运行该程序,就可以看到读入电压的数值了。如下图所示:

可以看到这个输出值,并不是具体的电压值,是要经过转换之后才会得到光敏电阻模块模拟输出引脚的电压值。由于这个转换是线性的,而我们只需要得到光强的变化情况,所以在后边的程序中,我们并不会转化为电压值再进行比较,而是直接使用这个值就可以进行各种比较、判断的操作了。

由于这是光电转换器件,在生产的时候会有一些离散性,或者模块采用了不同型号的光敏电阻,或者是产品质量的原因,导致不同的光敏电阻模块输出的电压相差较大,不利于后边进行比较、判断工作。因此最好是提前把每一个光敏电阻都接到ESP32开发板上,测试一下电压输出的情况,找一些一致性比较好的光敏电阻模块来使用,否则会影响小车的追光效果。

在选择光敏电阻模块的时候,需要注意以下几点:

  1. 最好在相对比较暗的环境中进行,周边环境不要太明亮,尤其不要阳光直射。因为光越强,光的变化越不明显。
  2. 通常情况下,在完全黑暗的时候,ESP32开发板采集到的数据应该是模数转换的最大值——4095,因为这个时候,光敏电阻的阻值应该是1M欧到10M欧。
  3. 在光线最强的时候,光敏电阻的采集值应该只有100左右,甚至更低,因为这个时候光敏电阻的阻值只有几百到几千欧。

4. 在剔除了最大和最小值偏离太大的光敏电阻模块之后,同时将这些光敏电阻模块接到ESP32开发板上,然后测试不同的光强下,输出保持基本一致的几个光敏电阻模块作为下一步的实验使用。

选择合适的光敏电阻模块非常的重要,对下一步实验的成功起着非常关键的作用。好了,本篇文章就到这里了,下一篇将完成追光小车的开发工作。

  • 44
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
双轴追光电路可以通过两个舵机控制相机的上下和左右移动,实现自动追踪光源的功能。下面是使用51单片机、两个舵机、四个光敏电阻和PCF8591模块实现双轴追光的程序和原理。 硬件电路: 将四个光敏电阻分别连接到PCF8591模块的AIN0-AIN3输入端口上,连接两个舵机分别控制相机的上下和左右移动。PCF8591模块的输出端口连接到51单片机的I2C总线上。 程序实现: 程序采用C语言编写,使用I2C库函数和PWM输出函数来控制舵机和PCF8591模块。 ``` #include <reg51.h> #include <i2c.h> #include <pwm.h> #define PCF8591_ADDR 0x90 // PCF8591模块地址 sbit Servo1 = P1^0; // 舵机1控制引脚 sbit Servo2 = P1^1; // 舵机2控制引脚 unsigned char adc_val[4]; // 保存光敏电阻的ADC值 // 函数声明 void ADCRead(); void ServoControl(int angle1, int angle2); // 主函数 void main() { // 初始化I2C总线和PWM输出 I2CInit(); PWMInit(); // 循环读取光敏电阻ADC值并控制舵机 while(1) { ADCRead(); // 读取光敏电阻ADC值 ServoControl(adc_val[0], adc_val[1]); // 控制舵机 delay(100); // 延时一段时间,等待舵机运动到位 ServoControl(adc_val[2], adc_val[3]); // 控制舵机 delay(100); // 延时一段时间,等待舵机运动到位 } } // 读取光敏电阻ADC值 void ADCRead() { int i; I2CStart(); // 发送启动信号 I2CWrite(PCF8591_ADDR); // 发送PCF8591地址 I2CWrite(0x40); // 发送控制字节,选择AIN0-AIN3通道和自动增量模式 I2CStop(); // 发送停止信号 I2CStart(); // 发送启动信号 I2CWrite(PCF8591_ADDR+1); // 发送PCF8591地址,读取模式 for(i=0; i<4; i++) { adc_val[i] = I2CReadACK(); // 读取ADC值,需要ACK } adc_val[3] = I2CReadNAK(); // 读取最后一个字节,不需要ACK I2CStop(); // 发送停止信号 } // 控制舵机 void ServoControl(int angle1, int angle2) { int pulse1, pulse2; // 计算舵机PWM输出脉宽 pulse1 = 500 + angle1 * 10 / 9; // 舵机1脉宽范围为500-2500 pulse2 = 500 + angle2 * 10 / 9; // 舵机2脉宽范围为500-2500 // 控制舵机 PWMOut1(pulse1); // 舵机1控制 PWMOut2(pulse2); // 舵机2控制 } ``` 原理: 光敏电阻产生的电压信号经过PCF8591模块的模数转换后,通过I2C总线传输到51单片机。程序读取ADC值后,计算出舵机的控制角度并输出PWM信号,通过调整PWM信号的占空比来控制舵机的转动角度。舵机的转动角度与光敏电阻的ADC值呈线性关系,由程序根据不同的光照条件计算出舵机应该转动的角度,从而实现相机的自动追踪光源的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一起玩儿科技

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值