步骤1 功能需求
在我们看动漫的时候,动漫里里的人物,晕了之后,有时候,为了效果喜感,会让眼睛在那转啊转,正好之前也做过一个类似的,灯光效果的眼镜,不如,我们也整个活,改造一个这个眼镜。
所以,这个眼镜的功能需求大致为2个方面:
(1)镜片部分雕刻螺旋纹,可以旋转,我晕你也晕;
(2)镜框花里胡哨,灯光乱闪。
步骤2 功能原理
为了实现我们的功能需求,我们必须确认这个项目的可行性,至少原理上是行得通的。
(1)旋转的眩晕效果
lasermaker的网站上有成型的眼镜的开源的图纸,我们只需要稍加改进即可,lasermaker软件的图库里有螺旋线,如果我们采用圆形的镜框,刚好可以保证旋转的效果,怎样让螺旋线转起来呢?如果有形状扁平的减速电机更好,首先想到的是,电脑散热风扇用的电机,手里也恰好有几个,可惜转速太快,pwm调速效果也不咋好,于是退而求其次,选择了体积小,转速慢的N20减速电机,配合齿轮减速,效果刚刚好。
(2)镜框花里胡哨的灯光效果
有之前项目的经验,直接采用2个环装的12位全彩LED即可,随机颜色的流水灯,效果花里胡哨。
步骤3 项目的创作过程
(1)选定主题,理清项目的功能需求
(2)根据功能需求,列出简单的材料清单
(3)简单试验,确定项目的可行性
(4)图纸的设计
(5)组装测试
(6)最终测试
步骤4 结构设计
(1)根据lasermaker网站上已有的开源的图纸(https://www.laserblock.cn/forum.php?mod=viewthread&tid=158&highlight=%D1%DB%BE%B5)进行改进;
(2)确定镜框的形状为圆形
(3)镶嵌环状12位全彩LED灯和螺旋线的设计
(4)齿轮传动设计
(5)眼镜腿的改进和垫片的设计
(6)最终调整,形成图纸
材料清单
- 掌控板 X1
- 拓展板 X1
- 环状12位全彩LED X2
- N20减速电机 X2
- 2路L9110电机驱动模块 X1
- 杜邦线 X1
- M2*16螺丝 X1
- M2螺母 X1
- N20电机座 X2
- 2.5mm亚克力 X1
- 2.5mm奥松板 X1
- 1.5mm椴木层板 X1
# MindPlus
# mpython
from mpython import *
import neopixel
import random
import time
def neopixel_hsl(h, s, l):
h = (abs(h) % 360)*(-1 if h < 0 else 1)
s = max(s, 0); s = min(s, 99); l = max(l, 0); l = min(l, 99)
c = (((100 - abs(2 * l - 100)) * s) << 8) // 10000
h1 = h // 60; h2 = (h - h1 * 60) * 256 // 60;
temp = abs((((h1 % 2) << 8) + h2) - 256);
x = (c * (256 - (temp))) >> 8; _r = _g = _b = 0
if h1 == 0:
_r = c; _g = x; _b = 0
elif h1 == 1:
_r = x; _g = c; _b = 0
elif h1 == 2:
_r = 0; _g = c; _b = x
elif h1 == 3:
_r = 0; _g = x; _b = c
elif h1 == 4:
_r = x; _g = 0; _b = c
elif h1 == 5:
_r = c; _g = 0; _b = x
m = ((l * 2 << 8) // 100 - c) // 2
r = _r + m; g = _g + m; b = _b + m
return (r, g, b)
def neopixel_rainbow(rgb, start, end, start_hue, end_hue):
steps = rgb.n
if steps == 0:
return
if end < start:
num = end; end = start; start = num
start = max(start, 0); start = min(start, steps)
end = max(end, 0); end = min(end, steps)
steps = end - start + 1
saturation = 100; luminance = 50; h1 = start_hue; h2 = end_hue
hDistCW = (abs((h2 + 360) - h1) % 360)*(-1 if ((h2 + 360) - h1) < 0 else 1)
hStepCW = (hDistCW * 100) // steps; hStep = hStepCW
h1_100 = h1 * 100; s1 = saturation; s2 = saturation; sDist = s2 - s1
sStep = sDist // steps; s1_100 = s1 * 100; l1 = luminance; l2 = luminance
lDist = l2 - l1; lStep = lDist // steps; l1_100 = l1 * 100
if steps == 1:
rgb[start] = neopixel_hsl(h1 + hStep, s1 + sStep, l1 + lStep)
else:
rgb[start] = neopixel_hsl(start_hue, saturation, luminance)
for i in range(start + 1, start + steps - 1):
h = (h1_100 + i * hStep) // 100 + 360
s = (s1_100 + i * sStep) // 100
l = (l1_100 + i * lStep) // 100
rgb[i] = neopixel_hsl(h, s, l)
rgb[start + steps - 1] = neopixel_hsl(end_hue, saturation, luminance)
rgb.write()
def neopixel_range(rgb, start, end, color):
trend = -1 if end < start else 1
for i in range(start, end-1 if trend < 0 else end+1, trend):
rgb[i] = (color)
rgb.write()
touch_threshold = {'P': 400, 'Y': 400, 'T': 400, 'H': 400, 'O': 400, 'N': 400}
p13=MPythonPin(13,PinMode.OUT)
p14=MPythonPin(14,PinMode.OUT)
p15=MPythonPin(15,PinMode.OUT)
p16=MPythonPin(16,PinMode.OUT)
ws2812_P7 = neopixel.NeoPixel(Pin(Pin.P7), n=24, bpp=3, timing=1)
ws2812_P7.brightness(120 / 255)
ws2812_P7.fill((0, 0, 0))
ws2812_P7.write()
neopixel_rainbow(ws2812_P7, 0, 23, 1, 360)
time.sleep(5)
DengHao = 0
while True:
p13.write_digital(0)
p14.write_digital(1)
p15.write_digital(1)
p16.write_digital(0)
for DengHao in range(0, 12):
neopixel_range(ws2812_P7, DengHao, DengHao, ((random.randint(0, 255)), (random.randint(0, 255)), (random.randint(0, 255))))
neopixel_range(ws2812_P7, (23 - DengHao), (23 - DengHao), ((random.randint(0, 255)), (random.randint(0, 255)), (random.randint(0, 255))))
time.sleep_ms(50)
if touchPad_N.read() < touch_threshold['N']:
for index in range(10):
p13.write_digital(1)
p14.write_digital(0)
p15.write_digital(0)
p16.write_digital(1)
for DengHao in range(0, 12):
neopixel_range(ws2812_P7, (11 - DengHao), (11 - DengHao), ((random.randint(0, 255)), (random.randint(0, 255)), (random.randint(0, 255))))
neopixel_range(ws2812_P7, (11 + DengHao), (11 + DengHao), ((random.randint(0, 255)), (random.randint(0, 255)), (random.randint(0, 255))))
time.sleep_ms(50)
附件
尹萍2021.10.10
闪亮登场,炫酷的眼镜。
王大毛导演2021.09.26
真棒!