Raspberry Pi 驱动5110播放Bad Apple

如何使用树莓派驱动Nokia5110 LCD在之前已经提及,还是使用adafruit的驱动方案。

这里不得不提的是在Raspbmc中是无法使用Hardware SPI的,在装了Raspbian后,终于用上了Hardware SPI,刷新速度一下子上去了,但是有一个bug还是存在的,就是第一次运行没显示,需要运行其他的py程序之后才能在5110上显示画面。。。。

具体方法
由于该方案本身就可以显示图片文字等等,所以思路也就是让它不断显示图片罢了,然后再伴上音乐,就是这样。。

帧的获得
我使用了MATLAB来获取视频文件的所有帧,因为它实在是太方便了。
首先要将视频文件载入,导入为矩阵(MATLAB支持少数几种视频格式,所以如果格式不支持还得转下码)

clear;clc;
xyloObj = VideoReader('ba.mp4');
nFrames = xyloObj.NumberOfFrames;
vidHeight = xyloObj.Height;
vidWidth = xyloObj.Width;

% Read one frame at a time.
for k = 1 : nFrames
    % Read a frame and convert it to 48x84
    ls = im2bw(imresize(read(xyloObj, k), [48,84]));
    % Save it to BMP\ba????.bmp
    imwrite(ls, strcat('BMP\ba', num2str(i), '.bmp'), bmp);
    disp(k);
end

2 播放功能的实现
由于是播放图片,所以要考虑到帧率,具体思路就是在播放视频前先获取当前时间轴timesta,然后做一个while死循环,不断获取当前时间轴timenow,计算已经播放了的时间time=timenow-timesta,那么要播放的帧就是time×30+1(我使用的视频是30帧/秒的),这样做的好处就是永远是声画同步的,缺点就是会掉帧。
声音的话直接使用了pygame模块来实现,也比较方便。

import time
import Adafruit_Nokia_LCD as LCD
import Adafruit_GPIO.SPI as SPI
import Image
# In order to play music
import pygame
print 'Press Ctrl-C to quit.'
# Raspberry Pi hardware SPI config:
DC = 23
RST = 24
SPI_PORT = 0
SPI_DEVICE = 0
# Hardware SPI usage:
disp = LCD.PCD8544(DC, RST, spi=SPI.SpiDev(SPI_PORT, SPI_DEVICE, max_speed_hz=4000000))
# Initialize library.
disp.begin(contrast=60)
# Clear display.
disp.clear()
disp.display()
# Play music
pygame.init()
pygame.mixer.music.load("badapple.mp3")
pygame.mixer.music.play()
# Time starting display image
timesta = time.time()
while True:
       # Time now
       timenow = time.time()
       # Calculate the frame to display
       frame = int((timenow - timesta)*30) + 1
       # Load image and convert to 1 bit color.
       image = Image.open('/home/pi/badapple/BMP/ba' + str(frame) + '.bmp).convert('1')
       disp.image(image)
       disp.display()

所有文件下载:bad apple.zip

Leave a Reply

Your email address will not be published. Required fields are marked *