设计一个封闭环境内的眼刺激系统
一个人完整的视角
人在水平面的视野,单眼视野界限为标准视线每侧94°~104°。双眼视区大约在每侧62°以内的区域,在这个区域里还包括辨别字的视线角度为10°~20°,辨别字母的视线角度为5°~30°,在各自的视线范围以外,字和字母趋于消失。对于特定的颜色的辨别,视线角度为30°~60°。
垂直平面的视野是:假定标准视线是水平的,定为0°,则最大视区为视平线以上50°和视平线以下70°。颜色辨别界限为视平线以上30°,视平线以下40°,实际上人的自然视线是低于标准视线的,在一般状态下,站立时自然视线低于水平线10°,坐着时自然视线低于水平视线15°。
眼垂直视野可以看到标准视线上约50°、下约70°的范围,水平视野可以左右104°的范围。人在眼睛不转动的情况下视野是十分有限的,能够集中注意力水平视野是40°,垂直视野15°。
我再补充一个纵深视野:
1、0.2-11m之间,我们能获得一个“真实”3D的视野,这也是我们的舒适景深;
2、11-20m间,我们依然能够通过双眼在视网膜上成像的差别,获得一个“边缘”的3D视野;
3、而20米之外的事物,我们只能得到一个“扁平”的2D视野,因为景象通过双眼的成像差别太小,无法分辨。
其实这说的更没说一样
- 主要刺激光源(3000-3500K):
- 将主要刺激光源安置在眼罩内部,以确保照明均匀且集中在用户的视野中。
- 尽量避免直接光照用户的眼睛,可以考虑使用漫射器材或将光源隐藏在眼罩的设计中,以防止强烈光线对用户眼睛的刺激。
- 背景光源(850纳米):
- 背景光源可以被用来模拟夜视或者在VR场景中提供某种环境信息。
- 与主光源相比,背景光源的亮度可以相对较低,以确保不会对用户体验造成干扰。
- 考虑采用柔和的背景照明,以避免过于刺眼或不自然的效果。
- 灯光布局和均匀性:
- 确保灯光布局均匀,以避免在眼罩内产生不均匀的亮度或阴影。
- 考虑使用多个光源来增加照明的均匀性,特别是在眼罩内覆盖范围较大的情况下。
对背景光源和刺激光源进行不同的光学评价可能是基于实验、应用或观察需求而定的。以下是一些常见的因素,这些因素可能导致对它们的光学评价存在差异:
- 感知效果:
- 刺激光源通常是实验中要引起注意的主要光源,其颜色、强度和变化可能对实验结果产生直接影响。因此,对刺激光源的评价可能更关注其在实验中产生的感知效果。
- 背景光源可能更侧重于提供一种环境、背景或辅助信息,其颜色和亮度可能被调整以创造某种氛围,而不是成为实验的主要焦点。
- 颜色温度:
- 刺激光源的颜色温度可能会更直接地影响观察者的认知和情绪。在许多实验和应用中,颜色的选择对于调查不同条件下的感知和行为反应非常重要。
- 背景光源的颜色温度则可能更多地取决于设计的整体氛围和实验的目的。它通常被设计成辅助刺激光源,以创造更逼真的环境。
- 亮度和对比度:
- 刺激光源可能需要更高的亮度和对比度,以确保在实验中引起足够的关注和反应。
- 背景光源通常会以相对较低的亮度出现,以避免干扰实验者或观察者对刺激光源的关注。
3000-3500K,表示这个 LED 灯泡的光的色温在3000到3500开尔文之间。这对应于暖白色光,适合用于舒适的环境照明。
850纳米(NM),表示这个光源的波长为850纳米。这是红外光谱中的近红外范围。
刺激光源和背景光源对瞳孔测量有一定的影响,这取决于它们的亮度、颜色和变化。
- 刺激光源的影响:
- 亮度:刺激光源的高亮度可能导致瞳孔收缩,尤其是在较暗的环境中。这可能会对瞳孔测量的基线产生影响。
- 颜色:不同颜色的光源可能会导致瞳孔有不同的反应。一些颜色可能引起更强烈或更迅速的瞳孔反应。
- 背景光源的影响:
- 亮度:背景光源的高亮度可能导致瞳孔收缩,尤其是在相对较暗的环境中。背景光源的亮度水平与刺激光源的亮度之间的对比可能影响瞳孔测量的灵敏性。
- 颜色:背景光源的颜色可能影响瞳孔的基础大小和对刺激光源颜色变化的响应。一些颜色可能导致瞳孔对刺激光源的反应更为显著。
- 光源变化的影响:
- 变化频率:如果刺激光源或背景光源有频繁的变化(例如闪烁),这可能导致瞳孔的相应变化。这在进行某些类型的瞳孔反应实验时需要特别注意。
- 持续性变化:长时间的光源变化可能导致瞳孔适应,使其在测量过程中产生动态的响应。
里面控制的参数就是亮度和闪烁了,接下来就是写一些代码:
代码语言:javascript复制const int warmWhiteLED = 9; // 连接暖白LED的引脚
const int infraredLED = 10; // 连接红外LED的引脚
void setup() {
pinMode(warmWhiteLED, OUTPUT);
pinMode(infraredLED, OUTPUT);
}
void loop() {
// 控制暖白LED
analogWrite(warmWhiteLED, 128); // 设置PWM值来调整亮度
delay(1000); // 延时1秒
// 控制红外LED
digitalWrite(infraredLED, HIGH); // 开启LED
delay(500); // 延时0.5秒
digitalWrite(infraredLED, LOW); // 关闭LED
delay(500); // 延时0.5秒
}
最简单的Arduino
代码语言:javascript复制const int warmWhiteLED = 9; // 连接暖白LED的引脚
const int infraredLED = 10; // 连接红外LED的引脚
void setup() {
pinMode(warmWhiteLED, OUTPUT);
pinMode(infraredLED, OUTPUT);
}
void loop() {
// 控制暖白LED的亮度
for (int brightness = 0; brightness <= 255; brightness ) {
analogWrite(warmWhiteLED, brightness); // 设置PWM值来调整亮度
delay(10); // 延时10毫秒,可调整过渡的速度
}
delay(1000); // 延时1秒
// 控制红外LED的亮度和闪烁
for (int brightness = 0; brightness <= 255; brightness ) {
analogWrite(infraredLED, brightness); // 设置PWM值来调整亮度
delay(10); // 延时10毫秒,可调整过渡的速度
}
delay(1000); // 延时1秒
for (int brightness = 255; brightness >= 0; brightness--) {
analogWrite(infraredLED, brightness); // 设置PWM值来调整亮度
delay(10); // 延时10毫秒,可调整过渡的速度
}
delay(1000); // 延时1秒
}
使用for循环变得更丝滑一些。
这里就是想着也可以提前预设一些刺激的规则,在树莓派上面可以这样写:
代码语言:javascript复制import RPi.GPIO as GPIO
import time
# 定义LED引脚
warm_white_led_pin = 17 # 适应您的硬件设置
infrared_led_pin = 18 # 适应您的硬件设置
# 初始化GPIO设置
GPIO.setmode(GPIO.BCM)
GPIO.setup(warm_white_led_pin, GPIO.OUT)
GPIO.setup(infrared_led_pin, GPIO.OUT)
# 定义LED控制函数
def set_led_brightness(pin, brightness):
# 控制LED亮度,brightness范围0-100
pwm = GPIO.PWM(pin, 100) # 频率设置为100Hz
pwm.start(brightness)
def blink_led(pin, frequency, duration):
# 控制LED闪烁,frequency为频率,duration为持续时间
pwm = GPIO.PWM(pin, frequency)
pwm.start(50) # 亮度设置为50%
time.sleep(duration)
pwm.stop()
# 定义预先设计好的刺激规则
def apply_stimulus_rule(rule):
if rule == "rule1":
set_led_brightness(warm_white_led_pin, 50)
blink_led(infrared_led_pin, 2, 5)
elif rule == "rule2":
set_led_brightness(warm_white_led_pin, 75)
blink_led(infrared_led_pin, 5, 7)
# 添加其他规则...
# 测试
apply_stimulus_rule("rule1")
# 清理GPIO设置
GPIO.cleanup()
可能对于所以树莓派控制这样简单的功能性价比不高,可以在MCU上面实现:
代码语言:javascript复制import machine
import time
# 定义LED引脚
warm_white_led_pin = 19 # 适应您的硬件设置
infrared_led_pin = 18 # 适应您的硬件设置
# 初始化LED引脚
warm_white_led = machine.PWM(machine.Pin(warm_white_led_pin), freq=1000, duty=0)
infrared_led = machine.PWM(machine.Pin(infrared_led_pin), freq=1000, duty=0)
# 定义LED控制函数
def set_led_brightness(led, brightness):
# 控制LED亮度,brightness范围0-1023
led.duty(brightness)
def blink_led(led, frequency, duration):
# 控制LED闪烁,frequency为频率,duration为持续时间
led.freq(frequency)
time.sleep(duration)
led.freq(0)
# 定义预先设计好的刺激规则
def apply_stimulus_rule(rule):
if rule == "rule1":
set_led_brightness(warm_white_led, 512)
blink_led(infrared_led, 2, 5)
elif rule == "rule2":
set_led_brightness(warm_white_led, 768)
blink_led(infrared_led, 5, 7)
# 添加其他规则...
# 测试
apply_stimulus_rule("rule1")
# 清理
warm_white_led.deinit()
infrared_led.deinit()
那么也可以加入一些远程控制的功能,使用串口:
代码语言:javascript复制import machine
import time
import ustruct
# 定义LED引脚
warm_white_led_pin = 19 # 适应您的硬件设置
infrared_led_pin = 18 # 适应您的硬件设置
# 初始化LED引脚
warm_white_led = machine.PWM(machine.Pin(warm_white_led_pin), freq=1000, duty=0)
infrared_led = machine.PWM(machine.Pin(infrared_led_pin), freq=1000, duty=0)
# 初始化串口
uart = machine.UART(0, baudrate=115200, tx=17, rx=16) # 适应您的硬件设置
# 定义LED控制函数
def set_led_brightness(led, brightness):
# 控制LED亮度,brightness范围0-1023
led.duty(brightness)
def blink_led(led, frequency, duration):
# 控制LED闪烁,frequency为频率,duration为持续时间
led.freq(frequency)
time.sleep(duration)
led.freq(0)
# 定义通过串口控制LED的函数
def control_led_via_serial():
while True:
if uart.any():
data = uart.read(4) # 期望接收4字节数据
if data:
brightness, frequency = ustruct.unpack('hh', data)
set_led_brightness(warm_white_led, brightness)
blink_led(infrared_led, frequency, 1) # 1秒的闪烁示例
# 启动串口控制
control_led_via_serial()
过串口接收两个16位整数,分别代表LED的亮度和频率。
这两个值使用ustruct.unpack
解包。可以通过串口发送相应的二进制数据来控制LED。
import struct
brightness = 512
frequency = 2
data = struct.pack('hh', brightness, frequency)
uart.write(data)
上位机这里可以这样写,这篇文章写的很仓促,很多功能没有考虑到,如果有需要的或者更加专业的建议可以告诉我。
代码语言:javascript复制http://www.zhengshili.com/news/?4554.html
代码语言:javascript复制https://zhuanlan.zhihu.com/p/28138243