有显示器的地方就有BadApple。
从MicroSD卡读取数据,然后在OLED上呈现视频。
材料清单
- PinPong开发版 X1
- MicroSD卡模块 X1
步骤1 图片捕捉
下载Bad Apple MP4文件,使用 PotPlayer 的截图功能,将视频中的每一帧截图成 72 x 54 的 bmp 图片。PinPong的 OLed的最大分辨率是 128 x 64,不改变源视频长宽比的情况下,选用 96 * 64 的分辨率会导致运存不足,因为每一帧的图片数据会保存在一个 char[] 数组中
步骤2 位图转换
使用 Image2Lcd 将刚才生成的 bmp 图片批量转换成 bin 文件,输出数据类型 二进制(*.bin) , 扫描模式 水平扫描 ,输出灰度 单色 ,最大宽度和高度 72 和 54
步骤3 数据处理
打开 windows 命令行工具,在生成的 bmp 文件目录下,输入 copy /b *.bin bad.bin 生成所需的 bin 文件
步骤4 格式化内存卡,把bad.bin文件放入卡中
步骤5 灵魂走线
连接你的硬件,MicroSD Card 采用 SPI 方式和 PinPong 通信,嗯。。。我这里没有sd卡模块了所以直接用了自带的卡套,如果你同样没有,可以参考一下截图
GND GND
5V +5
CS Pin 4
MOSI Pin 11
SCK Pin 13
MISO Pin 12
卡的SPI通信需要四根线:两条数据线(SPI_MISO、SPI_MOSI),一条时钟线(SPI_SCK)和一条片选(Chip Select)信号线。在SPI模式下,SD卡的8号、9号针脚没有用到,针脚定义见下表(最右侧一栏为单片机引脚):
步骤6 上传代码,附件中的直接上传即可,这里我已经把bin和ino打包完毕
#include "SD.h"
#include "U8glib.h"
#define LCD_WIDTH 128
#define LCD_HEIGHT 64
#define WIDTH_COUNT 9
#define HEIGHT 54
#define SIZE (WIDTH_COUNT*HEIGHT)
#define top (LCD_HEIGHT - HEIGHT) / 2
#define left (LCD_WIDTH - WIDTH_COUNT * 8) / 2
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_NO_ACK|U8G_I2C_OPT_FAST); // I2C 接口
char buf[SIZE];
File root;
File myFile;
void draw() {
u8g.drawBitmap(left, top, WIDTH_COUNT, HEIGHT, (const uint8_t*)buf);
}
void setup(){
Serial.begin(38400);//串口波特率
pinMode(10, OUTPUT);
if (!SD.begin(4)) {
Serial.println("Initialization Failed");
return;
}//sd初始化,如果失败打印:Initialization Failed
Serial.println("Initialization OK");
myFile = SD.open("bad.bin");
}
void loop(){
u8g.firstPage();
do {
draw();
} while(u8g.nextPage());
if (myFile && myFile.available()) {
myFile.read(buf, SIZE);
} else {
myFile.close();
myFile = SD.open("bad.bin");
Serial.println("Replay.");
delay(5000);
}
}
问题:
I2C OLED ssd1306显示屏来播放视频,结果就是 FPS 有点低
步骤7 最后来个视频看看效果吧!!!
虾虾^0^2021.08.11
厉害
luqGQ_mS2021.04.28
赞!有屏幕的地方就有坏苹果