一、任务
设计并制作可见光室内定位装置,其构成示意图如图 1 所示。参赛者自行搭建不小于 80cm×80cm×80cm 的立方空间(包含顶部、底部和 3 个侧面)。顶部平面放置 3 个白光 LED,其位置和角度自行设置,由 LED 控制电路进行控制和驱动;底部平面绘制纵横坐标线(间隔 5cm),并分为 A、B、C、D、E 五个区域,如图 2 所示。要求在 3 个 LED 正常照明(无明显闪烁)的情况下,测量电路根据传感器检测的信号判定传感器的位置。
二、要求
1.基本要求
(1)传感器位于 B、D 区域,测量电路能正确区分其位于横坐标轴的上、下区域。
(2)传感器位于 C、E 区域,测量电路能正确区分其位于纵坐标轴的左、右区域。
(3)传感器位于 A 区域,测量显示其位置坐标值,绝对误差不大于 10cm。
(4)传感器位于 B、C、D、E 区域,测量显示其位置坐标值,绝对误差不大于 10cm。
(5)测量电路 LCD 显示坐标值,显示分辨率为 0.1cm。
2.发挥部分
(1)传感器位于底部平面任意区域,测量显示其位置坐标值,绝对误差不大于 3cm。
(2)LED 控制电路可由键盘输入阿拉伯数字,在正常照明和定位(误差满足基本要求(3)或(4))的情况下,测量电路能接收并显示 3 个 LED 发送的数字信息。
(3)LED 控制电路外接 3 路音频信号源,在正常照明和定位的情况下,测量电路能从 3 个 LED 发送的语音信号中,选择任意一路进行播放,且接收的语音信号均无明显失真。
(4)LED 控制电路采用+12V 单电源供电,供电功率不大于 5W。
(5)其他。
三、说明
1.LED 控制电路和测量电路相互独立。
2.顶部平面不可放置摄像头等传感器件。
3. 传感器部件体积不大于 5cm×5cm×3cm,用“┼”表示检测中心位置。
4. 信号发生器或 MP3 的信号可作为音频信号源。
5. 在 LED 控制电路的 3 个音频输入端、测量电路的扬声器输入端和供电电路端预留测试端口。
6. 位置绝对误差:式中x 、 y为测得坐标值,x0、y0 为实际坐标值。
7. 每次位置测量开始后,要求 5s 内将测得的坐标值锁定显示。
8. 测试环境:关闭照明灯,打开窗帘,自然采光,避免阳光直射。
GPT-4o给出的设计方案:
LED控制电路:
传感器系统:
测量电路:
LED控制电路设计:
传感器系统设计:
测量电路设计:
显示电路设计:
安装和调试:
通过单片机或微控制器来实现实时读取ADC(模数转换器)数据,并在LCD上显示框架坐标及光强读数,以下是实现这个过程的详细步骤和示例代码。
硬件连接
编程实现步骤:
(示例代码)以Arduino为例:
#include <LiquidCrystal.h>
// 引脚定义
const int sensorPin = A0; // 光传感器接入ADC0引脚
const int lcdRs = 7, lcdEn = 8, lcdD4 = 9, lcdD5 = 10, lcdD6 = 11, lcdD7 = 12; // LCD引脚定义
// 初始化LiquidCrystal库(使用LCD的适当引脚)
LiquidCrystal lcd(lcdRs, lcdEn, lcdD4, lcdD5, lcdD6, lcdD7);
void setup() {
// 初始化LCD, 设置显示行数和列数
lcd.begin(16, 2);
// 初始化串口通信
Serial.begin(9600);
// 配置传感器引脚为输入模式
pinMode(sensorPin, INPUT);
}
void loop() {
// 读取ADC值并进行处理
int adcValue = analogRead(sensorPin);
float voltage = adcValue * (5.0 / 1023.0); // 将ADC值转换为电压
float lightIntensity = map(voltage, 0.0, 5.0, 0, 100); // 假设光强度为0-100的范围
// 显示读取的ADC值和相应的光强度数值
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("ADC Value: ");
lcd.print(adcValue);
lcd.setCursor(0, 1);
lcd.print("Light Int: ");
lcd.print(lightIntensity);
lcd.print("%");
// 打印到串口监视器(可选)
Serial.print("ADC Value: ");
Serial.print(adcValue);
Serial.print(", Light Intensity: ");
Serial.print(lightIntensity);
Serial.println("%");
// 每秒更新一次显示
delay(1000);
}
本题考察的知识点: