所有分类
主题 主题
平台 平台
我的工作台
userHead
注册时间 [[userInfo.create_time]]
创造力 [[userInfo.creativity]]
[[userInfo.remark]]
[[d.project_title]]
articleThumb
[[d.material_name]]
timelineThumb
进入工作台
折叠
所有分类 我的工作台
展开

【Mind+Python】“我晕了”眼镜

隋小白 隋小白 2021-09-22 17:27:02
步骤1 步骤1
功能需求

在我们看动漫的时候,动漫里里的人物,晕了之后,有时候,为了效果喜感,会让眼睛在那转啊转,正好之前也做过一个类似的,灯光效果的眼镜,不如,我们也整个活,改造一个这个眼镜。

所以,这个眼镜的功能需求大致为2个方面:

(1)镜片部分雕刻螺旋纹,可以旋转,我晕你也晕;

(2)镜框花里胡哨,灯光乱闪。

步骤2 步骤2
功能原理

为了实现我们的功能需求,我们必须确认这个项目的可行性,至少原理上是行得通的。

(1)旋转的眩晕效果

lasermaker的网站上有成型的眼镜的开源的图纸,我们只需要稍加改进即可,lasermaker软件的图库里有螺旋线,如果我们采用圆形的镜框,刚好可以保证旋转的效果,怎样让螺旋线转起来呢?如果有形状扁平的减速电机更好,首先想到的是,电脑散热风扇用的电机,手里也恰好有几个,可惜转速太快,pwm调速效果也不咋好,于是退而求其次,选择了体积小,转速慢的N20减速电机,配合齿轮减速,效果刚刚好。

(2)镜框花里胡哨的灯光效果

有之前项目的经验,直接采用2个环装的12位全彩LED即可,随机颜色的流水灯,效果花里胡哨。

步骤3 步骤3
项目的创作过程

(1)选定主题,理清项目的功能需求

(2)根据功能需求,列出简单的材料清单

(3)简单试验,确定项目的可行性

(4)图纸的设计

(5)组装测试

(6)最终测试

步骤4 步骤4
结构设计

(1)根据lasermaker网站上已有的开源的图纸(https://www.laserblock.cn/forum.php?mod=viewthread&tid=158&highlight=%D1%DB%BE%B5)进行改进;

(2)确定镜框的形状为圆形

(3)镶嵌环状12位全彩LED灯和螺旋线的设计

projectImage

(4)齿轮传动设计

projectImage

(5)眼镜腿的改进和垫片的设计

(6)最终调整,形成图纸

projectImage
材料清单 材料清单
1x
掌控板
1x
拓展板
2x
环状12位全彩LED
2x
N20减速电机
1x
2路L9110电机驱动模块
1x
杜邦线
1x
M2*16螺丝
1x
M2螺母
2x
N20电机座
1x
2.5mm亚克力
1x
2.5mm奥松板
1x
1.5mm椴木层板
代码 代码
	                    					# 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)

	                    				
Makelog作者原创文章,未经授权禁止转载。
2
2
评论
[[c.user_name]] [[c.create_time]]
[[c.parent_comment.count]]
|
[[c.comment_content]]