本帖最后由 云天 于 2024-1-5 23:50 编辑  
 
【项目背景】 
冬奥全息舱“云拜年”登上黑科技热搜,2022年2月6日,国际奥委会主席巴赫“现身”2022北京新闻中心云聚展区,通过跨区域云全息技术向中外媒体记者“云拜年”。 
 
 
“全息舱”的效果很惊艳,我也跃跃欲试。通过查阅网络资料,制作一个小型“全息舱”是可行的。  
【项目设计】  
硬件使用旧液晶显器结合树莓派和语音识别模块、LED灯带。旧液晶显器制作“全息舱”,LED灯带提供光源,树莓派播放“白背景”视频,语音识别模块控制视频播放、光源开关颜色转换指令。蓝牙键盘用来运行Python程序。  
 
 
【全息舱制作】  
旧显示器  
 
 
拆解显示器  
 
 
把背光板与lcd液晶显示模组分开。不再使用背光板提供光源。使用LED灯带提供光源。 
 
 
 
 
 
 
制作“白舱” 
 
 
固定电源板、显示电路板、电池组(为树莓派扩展板供电) 
 
固定LED灯带,安装电源线、VGA视频线。 
 
 
粘贴外壳,固定树莓派。 
 
 
 
 
 
 
 
 
 
【测试语音识别模块】  
树莓派安装扩展板,语音识别模块接IIC引脚,LED灯带接18引脚。  
 
 
 
树莓派Python程序 
			
			
			- 
 - # -*- coding: utf-8 -*
 - 
 - from __future__ import print_function
 - import sys
 - import os
 - sys.path.append(os.path.dirname(os.path.dirname(os.path.realpath(__file__))))
 - 
 - from DFRobot_DF2301Q import *
 - import time
 - from rpi_ws281x import PixelStrip, Color
 - import argparse
 - 
 - LED_COUNT = 24# LED灯的个数
 - LED_PIN = 18      # DI端接GPIO18
 - 
 - 
 - # 以下可以不用改
 - LED_FREQ_HZ = 800000  #LED信号频率以赫兹为单位(通常为800khz)
 - LED_DMA = 10          #用于生成信号的DMA通道(尝试10)
 - LED_BRIGHTNESS = 255  #设置为0表示最暗,设置为255表示最亮
 - LED_INVERT = False    # #为True以反转信号(当使用NPN晶体管电平偏移时)
 - LED_CHANNEL = 0       #GPIO 13、19、41、45设置为“1”或35
 - 
 - 
 - '''
 -   @brief Module I2C communication init
 -   @param i2c_addr - I2C communication address
 -   @param bus - I2C bus
 - '''
 - DF2301Q = DFRobot_DF2301Q_I2C(i2c_addr=DF2301Q_I2C_ADDR, bus=1)
 - #控制LED灯显示颜色
 - def colorWipe(strip, color, wait_ms=20):
 - 
 -     for i in range(strip.numPixels()):
 -         strip.setPixelColor(i, color)
 -         strip.show()
 -         time.sleep(wait_ms / 1000.0)
 - def setup():
 -   global strip
 - 
 -   DF2301Q.set_volume(5)#语音模块的音量设置
 - 
 -   DF2301Q.set_mute_mode(0)#静音开关
 - 
 -   DF2301Q.set_wake_time(60)#唤醒后,响应时间
 - 
 -   parser = argparse.ArgumentParser()
 -   parser.add_argument('-c', '--clear', action='store_true', help='clear the display on exit')
 -   args = parser.parse_args()
 - 
 -    #使用适当的配置创建NeoPixel对象。
 -   strip = PixelStrip(LED_COUNT, LED_PIN, LED_FREQ_HZ, LED_DMA, LED_INVERT, LED_BRIGHTNESS, LED_CHANNEL)
 -   #初始化库(必须在其他函数之前调用一次)。
 -   strip.begin()
 - 
 -   print('Press Ctrl-C to quit.')
 -   if not args.clear:
 -         print('Use "-c" argument to clear LEDs on exit')
 -   DF2301Q.play_by_CMDID(23)   # 完成提示音
 - 
 - num=0
 - def loop():
 -   global num
 -   CMDID = DF2301Q.get_CMDID()
 -   if(117== CMDID):#打开灯光
 -     colorWipe(strip, Color(255, 255, 255)) 
 -   elif(133== CMDID):#设置颜色为绿色
 -     colorWipe(strip, Color(0, 255, 0)) 
 -   elif(135== CMDID):#设置颜色为蓝色
 -     colorWipe(strip, Color(0, 0, 255)) 
 -   elif(130== CMDID):#设置颜色为红色
 -     colorWipe(strip, Color(255, 0, 0)) 
 -   elif(118== CMDID):#关闭灯光
 -     colorWipe(strip, Color(0, 0, 0)) 
 - 
 -   print(num)
 - if __name__ == "__main__":
 -   setup()
 -   while True:
 -     loop()
 - 
 - 
 
  复制代码
    
 
 
注:要安装相应的库:pinpong,pyserial,rpi_ws281x 【播放视频】 
使用树莓派系统自带的VLC播放器播放视频。 
 
 
 
 
 
 
【Python程序控制视频播放】 
最好使用omxplayer库来进行播放视频。本例使用的os结合vlc播放视频。 
- 
 -  elif(5== CMDID):#播放视频
 -    num=1
 -    os.system('/usr/bin/vlc-wrapper video1.mp4')
 -  elif(6== CMDID): #播放上一个
 -    num=num-1
 -    if num<1:
 -       num=5
 -    os.system('/usr/bin/vlc-wrapper video'+str(num)+'.mp4')
 -  elif(7== CMDID): #播放下一个
 -    num=num+1
 -    if num>6:
 -       num=1
 -    os.system('/usr/bin/vlc-wrapper video'+str(num)+'.mp4')
 
  复制代码
  
【演示视频】 
 
 
 
 
 |