📄 本文档(EN051T04《基于AS7341自制可见光光谱仪》.docx)由原站嵌入文档解析而来(含配图 38 张)。
《基于AS7341自制可见光光谱仪》

目 录
TOC \o "1-3" \h \u HYPERLINK \l _Toc10128 1.项目作品概述 PAGEREF _Toc10128 \h 1
HYPERLINK \l _Toc11033 1.1作品背景 PAGEREF _Toc11033 \h 1
HYPERLINK \l _Toc21190 1.2作品主体结构 PAGEREF _Toc21190 \h 2
HYPERLINK \l _Toc17814 1.3实现功能与工程结构设计要求 PAGEREF _Toc17814 \h 2
HYPERLINK \l _Toc28048 1.3.1实现功能要求 PAGEREF _Toc28048 \h 2
HYPERLINK \l _Toc31375 1.3.2工程结构要求 PAGEREF _Toc31375 \h 2
HYPERLINK \l _Toc29243 2.主要工程结构设计与模型制作 PAGEREF _Toc29243 \h 2
HYPERLINK \l _Toc26345 3.硬件选用与连接 4
HYPERLINK \l _Toc3771 3.1硬件清单 4
4.数据对比分析 4
4.1 灯泡种类数据 4
4.2 LED系列对比 5
4.3 节能灯(荧光灯)系列对比 7
HYPERLINK \l _Toc4906 5. 制作过程 9
HYPERLINK \l _Toc18633 6. 创新设计说明 13
HYPERLINK \l _Toc516 7. 作品设计体会 13
《基于AS7341自制可见光光谱仪》
摘要:本作品基于AS7341自制可见光光谱仪,主要用于提供尽可能接近传统光谱仪的光线数据及其分析。本作品采用行空板与AS7341可见光传感器,运用3D打印,并用python编程,对采集所获得的数据进行分析。
关键词:可见光光谱 色温 数据分析 3D打印
1.项目作品概述
1.1作品背景

随着时代的发展,光谱仪应用范围越来越广,精度也逐渐提高,在农业、天文、汽车、生物、化学、镀膜、环境检测、薄膜工业、食品、印刷、造纸、成分检测、生物医学、氧浓度传感器、薄膜厚度测量、LED测量、发射光谱测量、紫外/可见吸收光谱测量、颜色测量、甚至半导体工业等领域应用广泛。
然而,伴随着性能逐渐提升,光谱仪的价格却居高不下。在各大电商平台,光谱仪的价格分别位于1000到几万人民币不等。高昂的价格让不少学校、科研机构和个人都望而却步。也在一定程度上制约了光谱仪的使用,进而降低了人们日常研究、教学的准确性。同时,目前市场上绝大多数光谱仪的体积较大,受场地限制使用不便。
基于以上情况,我们决定研制一款便携式平价调制光谱仪,并在其基础上进行调试的探究实验,使之尽可能地符合传统光谱仪的检测结果。
1.2作品主体结构
本作品采用硬件和软件结合的形式。硬件部分采用抽拉式结构,便于进行调试;设备主体安装在抽屉内部,抽屉在测试过程中有效遮挡光线,减少环境光对测量数据的影响;主体后方预留接线孔位,与软件部分相连,并利用主体遮挡该部分光线;通光孔位于抽屉尾部,外接通光隧道,避免多余光线进入;抽屉尾部加装卡槽,防止使用过程中移位;抽屉内部全黑,避免光线反射对测量结果造成干扰。
本实验探究侧重于对便携式平价光谱仪进行调试与优化。通过校准以及对常见光源的测定达到数据和设备间的平衡,尽量避免环境光、光线入射角度等因素对实验结果产生影响。
1.3实现功能与工程结构设计要求
1.3.1实现功能要求
可准确捕捉分析对象;
分析结果尽可能符合传统光谱仪的分析结果;
外型小巧,造价亲民;
1.3.2工程结构要求
结构合理,不影响光谱仪使用及数据分析;
结构牢固,不易脱落、损坏;
基于Theremino Spectormeter的调制光谱实验
2.1实验探究简易装置


2.2硬件选用清单
序号
名称
型号
数量
1
HIKVISION USB摄像机
DS-E12
1
2
灯座
1
3
VCD透明基片
1
4
LED灯球泡灯
2
5
节能灯(荧光灯)
3
6
白炽灯
1
2.3数据对比分析

编号
种类
功率
色温
光种
1
雷士LED球泡灯
3w
6500K
冷光
2
雷士LED球泡灯
5w
6500K
冷光
3
天子节能灯(荧光灯)
11w
6400K
冷光
4
天子节能灯(荧光灯)
13w
6400K
冷光
5
欧和节能灯(荧光灯)
15w
6500K
冷光
6
白炽灯
40W
2500K
暖光
2.3 LED系列光谱对比

3瓦雷士LED球泡灯光谱图

5瓦雷士LED球泡灯光谱图

对照光谱图
经分析,测量结果中红光值偏高,且远超预期。蓝光值较为准确。根据参考值,不同色温对成像影响极为明显,主要体现在冷光的蓝色峰值大于暖光。但本实验所获的数据并未直接反映这一点。反而体现出灯泡瓦数与蓝色峰值趋势并无直接联系。虽然峰值相近,但趋势走向仍有不同。
2.4节能灯(荧光灯)系列对比

11瓦节能灯(荧光灯)光谱图

13瓦节能灯(荧光灯)光谱图

15瓦节能灯(荧光灯)光谱图1

15瓦节能灯(荧光灯)光谱图2
(由于节能灯(荧光灯)组缺少参考数据,仅能进行结果归纳。)
随着瓦数增加,功率增大,灯泡光谱的红色峰值以增加2单位的速度缓慢增加。三种灯泡蓝色峰值基本接近。但蓝色峰值部分的趋势略有不同。此外,15瓦节能灯(荧光灯)两次成像整体趋势有较大差异。从以上实验得出该实验装置,不稳定性大,受外界因素影响较大,可操作性不强。以上方案被放弃,开始重新设计。
3、制作过程
1)初步构思:采用行空板与AS7341可见光谱传感器,设计成分体式,主体光谱分析仪,加装一个可调节的LED光源;光谱传感器前开一个比色皿插口;
分析图

组合图

2)外形结构讨论:通过观察分析,比色皿会透光,光谱仍然受环境光的影响;可调节光源没有多大作用,有时反而对实验的拓展有局限。 重新设计作品外观。
3)设计定位:外观小巧,便携方便,可商用化设计;

尺寸设计


分拆图 组装图
4)模型制作:3D打印,材料PLA

5)硬件连接设计


开机测试,发现红色光谱过强,分析可能是机壳颜色影响,只好重新用黑色的PLA打印一个,面板打印灰色,好看一点。

室内LED顶灯照明,开机与虹谱光色光谱对照,感觉不错,准确性较高。
虹谱光色HPCS3000,可测量光波长380-780nm;
AS7341可见光传感器:8个可见光通道,405-690nm;但是F1、F2通道没有数值,说明不如厂家的描述。毕竟AS7341可见光传感器,在DF售价只有145元,加上行空板,合计544元,换上ESP8266 D1,加2.8TFT触摸彩色SPI串口液晶屏显示模块,成本不足200元,有空我们再手搓一个;虹谱光色HPCS3000在天猫商城售价达1974元。我们主打平价够用就好。

序号
名称
型号
数量
价格(元)
1
行空板
M10
1
399
2
可见光传感器
AS7341
1
145
3
3D打印
1
0
4
合计
544
逻辑设计

7)软件编程
# -*- coding:utf-8 -*-
import time
from pinpong.board import Board
from pinpong.libs.dfrobot_as7341 import AS7341
from PIL import Image, ImageDraw
from unihiker import GUI
# 设定颜色区块信息
x0 = 50
y0 = 220
wh = 90
lwh = 34
# 设定屏幕宽高
W = 240
H = 320
# 初始化板子
Board("UNIHIKER").begin()
# 实例化GUI对象
gui=GUI()
# 打开AS7341 FLICKER图片
flicker_image = Image.open("AS7341_Flicker.jpg")
# 设定F1-F8的顺序
colors_where = dict()
colors_where['F1'] = (0,0)
colors_where['F2'] = (2,1)
colors_where['F3'] = (1,0)
colors_where['F4'] = (3,1)
colors_where['F5'] = (2,0)
colors_where['F6'] = (0,1)
colors_where['F7'] = (3,0)
colors_where['F8'] = (1,1)
# 预设定颜色
colors = dict()
# 显示图片
flicker_image_obj = gui.draw_image(x=0, y=0, w=160, h=160, image=flicker_image)
# 获取背景颜色
bgc = flicker_image.getpixel((10, 100))
# 创建新的图像,用于显示获取的颜色值
tile_img = Image.new('RGB', flicker_image.size, bgc)
# 在新图像上,创建画板
tile_img1 = ImageDraw.Draw(tile_img)
# 按位置复刻颜色区块
if False:
for i in range(0,4):
for j in range(0,4):
# 计算坐标
x = x0 + i * (wh+lwh)
y = y0 + j * (wh+lwh)
# 获取颜色
c = flicker_image.getpixel((x+10, y+10))
# 设置要显示的区块大小
shape = [(x, y), (x+wh, y+wh)]
# 绘制区块
tile_img1.rectangle(shape, fill =c, outline =c)
# 获取各颜色区块的颜色值,并复刻区块
if True:
for f in colors_where:
# 获取顺序值
i = colors_where[f][0]
j = colors_where[f][1]
# 计算坐标
x = x0 + i * (wh+lwh)
y = y0 + j * (wh+lwh)
# 获取颜色
c = flicker_image.getpixel((x+10, y+10))
# 设置要显示的区块大小
shape = [(x, y), (x+wh, y+wh)]
# 绘制区块
tile_img1.rectangle(shape, fill =c, outline =c)
# 记录F1-F8对应的颜色值
colors[f] = c
# 显示绘制区块后的图片
tile_img_obj = gui.draw_image(x=0, y=160, w=160, h=160, image=tile_img)
# 演示
time.sleep(3)
# 清屏
gui.clear()
# 绘制黑色背景
result_img = Image.new('RGB', (W, H), bgc)
gui.draw_image(x=0, y=0, w=W, h=H, image=result_img)
gui.draw_text(x=40,y=0,text="可见光光谱分析仪",color=colors[f])
# 显示标签和初始值0
y = 15
bars_obj = dict()
nums_obj = dict()
for f in colors:
y = y + 30
c = colors[f]
# f_img = Image.new('RGB', (180,20), c)
gui.draw_text(x=2,y=y,text=f,color=colors[f], font_size=12)
# bars_obj[f] = gui.draw_image(x=30, y=y+5, w=160, h=20, image=f_img)
bars_obj[f] = gui.fill_round_rect(x=30, y=y+5, w=0, h=0, r=2, color=c)
nums_obj[f] = gui.draw_text(x=195,y=y,text="%d" % 100,color=colors[f], font_size=12)
# 显示时间
time_obj = gui.draw_digit(x=2, y=300, color="red", font_size=12, text=time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
# led数值
gui.draw_text(x=202,y=300,text="L",color="red", font_size=12)
led_obj = gui.draw_digit(x=210, y=300, color="red", font_size=12, text="L:%d" % 0)
# led处理
led_val = 0
let_done = True
def led_set(val):
global as7341, led_val, let_done
if let_done == False:
return
let_done = False
led_val = led_val + val
if led_val <= 0:
led_val = 0
as7341.enable_led(False)
else:
led_val = led_val if led_val <= 250 else 250
as7341.enable_led(True)
as7341.control_led(led_val)
led_obj.config(text="%d" % led_val)
let_done = True
# 初始化化AS7341
as7341 = AS7341()
gui.on_key_click('a', lambda: led_set(10))
gui.on_key_click('b', lambda: led_set(-10))
led_set(0)
while(as7341.begin() != True):
# Detect if IIC can communicate properly
print("IIC init failed, please check if the wire connection is correct")
time.sleep(1)
# Integration time = (ATIME + 1) x (ASTEP + 1) x 2.78µs
# Set the value of register ATIME, through which the value of Integration time can be calculated. The value represents the time that must be spent during data reading.
# as7341.set_a_time(29)
# Set the value of register ASTEP, through which the value of Integration time can be calculated. The value represents the time that must be spent during data reading.
# as7341.set_a_step(599)
# Set gain value(0~10 corresponds to X0.5,X1,X2,X4,X8,X16,X32,X64,X128,X256,X512)
# as7341.set_again(7)
# Enable LED
# as7341.enable_led(True)
# Set pin current to control brightness (1~20 corresponds to current 4mA,6mA,8mA,10mA,12mA,......,42mA)
# as7341.control_led(10)
while True:
if let_done == False:
continue
#开启f1_f2__f3_f4_clear_nir的测量
as7341.start_measure(0)
data1 = as7341.read_spectral_data_one()
data1 = type('dict', (object,), data1)
print("F1(405-425nm):",data1.adf1)
print("F2(435-455nm):",data1.adf2)
print("F3(470-490nm):",data1.adf3)
print("F4(505-525nm):",data1.adf4)
#开启f5_f6_f7_f8_clear_nir的测量
as7341.start_measure(1)
data2 = as7341.read_spectral_data_two()
data2 = type('dict', (object,), data2)
print("F5(545-565nm):",data2.adf5)
print("F6(580-600nm):",data2.adf6)
print("F7(620-640nm):",data2.adf7)
print("F8(670-690nm):",data2.adf8)
print("Clear:",data2.adclear)
print("NIR:" ,data2.adnir)
time_obj.config(text=time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
nums = dict()
for f in colors:
key = "ad%s" % f.lower()
num = 0
if hasattr(data1, key):
num = getattr(data1, key)
elif hasattr(data2, key):
num = getattr(data2, key)
nums[f] = int(num)
max_num = max(nums.values())
for f in colors:
key = "ad%s" % f.lower()
num = nums[f]
bar_width = 160 * nums[f]/max_num
bar_height = bar_width * 20 / 160
bars_obj[f].config(w = int(bar_width), h = int(bar_height))
nums_obj[f].config(text="%d" % num)
time.sleep(0.1)
7)作品呈现

8)调试


4、实验结果(光谱对照)
灯型
自制光谱仪
(可测量光波长405-690nm)
虹谱光色
(可测量光波长380-780nm)
对比结果
雷士LED球泡灯3W(色温6500K)


虹谱光色显示色温5906K,出现780nm红光,其他光谱大致机同
雷士LED球泡灯5W(色温6500K)


虹谱光色显示色温5967K光照强度增加,其它光谱大致相同,与预期相符
天子节能灯(荧光灯)11w6400K


虹谱光色显示色温7069K偏蓝光,出现780nm红光,其它光谱大致相同,与预期相符
天子节能灯(荧光灯)13w6400K


虹谱光色显示色温6761K偏黄光,出现780nm红光,其它光谱大致相同,与预期相符
欧和节能灯(荧光灯)
15w6400K


虹谱光色显示色温6601K,出现780nm红光,其他光谱差不多相同
白炽灯
40w2800K


虹谱光色显示色温2416K,其它光谱大致相同,红光多,暖光,与预期相符
结论:
虹谱光色显然测量的光谱波长更宽,灵敏度更高,但价格昂贵;
自制的光谱仪采用AS7341可见光传感器:
可测8个可见光通道,
F1(405-425nm)、F2(435-455nm)、F3(470-490nm)、F4(505-525nm)
F5(545-565nm)、F6(580-600nm)、F7(620-640nm)、F9(670-690nm)
405-690nm;光波窄了一点,中间还有断带,灵敏度虽然不够,但在中学教学中使用已经足够,换上ESP8266 D1,加2.8TFT触摸彩色SPI串口液晶屏显示模块,成本不足200元,主打便宜,可以人手一架。
5、创新设计说明
1)配置简单,行空板连接一个AS7341可见光传感器,用python就可能DIY,结合信息学、生物学科、物理学科、通用技术,跨学科融合教学;
2)可见光谱分析的功能,应用场景很多,比如可以分析可溶于水的不同颜料的光谱,还可以分析水质的光谱,来监测污染程度,具有很好的实用价值。
6、作品设计体会
本作品从查找资料,材料购买一直目的清晰,富有条理,在作品创作前期一路畅通无阻,在后期的外观设计也没有遇到过多难题。但在开源软件的使用与采集数据的分析及优化上却遇到了极大的困难。
由于本作品使用的开源软件原版本采用英文,所用词汇多为专业术语,且内置的中文版本翻译度几乎为零,在使用过程中需要不断的搜索资料、翻译单词,使熟悉软件的难度大大增加。但经过我们不懈努力、不断摸索,还是熟练掌握了开源软件的使用方法。然而,采集数据的优化同样困难重重。例如:由于光栅片的角度问题,在制作的初期我们始终无法获得规范的彩虹状图像。好在经过不断打磨,这一问题得到了解决。
除却数据,作品功能上也有部分缺陷,例如测量结果中的红色值偏高,由于没有找到合适的材料,安装通光隧道的想法无法实现……此作品距离正式投入使用还有很长一段距离。但我们在作品创作的过程中不仅学到了许多新的有关知识,还锻炼了自己的动手能力与合作技能,虽然作品缺陷诸多,但作品成型的那一刻我们都感到无比自豪。后续我们也会参考相关资料,进一步提高光谱仪的测量精度。
每一次尽心尽力的创作,都会使我们学到珍贵的知识和技能,获得无比宝贵的经验与体验,让我们受益终生。
参考文献
1.朱晓东, & 王伟. (2018). 《光谱仪的原理与应用》. 北京: 科学出版社.
2.李明, & 张华. (2020). 《基于AS7341的可见光光谱仪设计与实现》. 现代科技, 30(5), 45-50.
3.王小丽. (2019). 《光谱仪在教育中的应用》. 物理教学, 38(3), 12-15.
4.陈刚, & 刘洋. (2021). 《DIY光谱仪的设计与实验研究》. 电子科技, 29(2), 78-82.
5.张强. (2022). 《光谱仪的市场现状与发展趋势》. 教育信息化, 25(4), 34-39.
6.何伟, & 赵敏. (2017). 《光谱分析技术的进展与应用》. 计算机与教育, 35(6), 56-60.
7. 施伟. (2020). 《基于开源软件的光谱仪数据分析方法》. 电子技术与软件工程, 12(1), 22-25.
——
原文档链接:https://ai-gtmaker.com/wp-content/uploads/EN051T04《基于AS7341自制可见光光谱仪》.docx