设计一个封闭环境内的眼刺激系统
一个人完整的视角
人在水平面的视野,单眼视野界限为标准视线每侧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,表示这个 LED 灯泡的光的色温在3000到3500开尔文之间。这对应于暖白色光,适合用于舒适的环境照明。
850纳米(NM),表示这个光源的波长为850纳米。这是红外光谱中的近红外范围。
刺激光源和背景光源对瞳孔测量有一定的影响,这取决于它们的亮度、颜色和变化。
里面控制的参数就是亮度和闪烁了,接下来就是写一些代码:
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
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循环变得更丝滑一些。
这里就是想着也可以提前预设一些刺激的规则,在树莓派上面可以这样写:
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上面实现:
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()
那么也可以加入一些远程控制的功能,使用串口:
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)
上位机这里可以这样写,这篇文章写的很仓促,很多功能没有考虑到,如果有需要的或者更加专业的建议可以告诉我。
http://www.zhengshili.com/news/?4554.html
https://zhuanlan.zhihu.com/p/28138243