所有分类
主题 主题
平台 平台
我的工作台
userHead
注册时间 [[userInfo.create_time]]
创造力 [[userInfo.creativity]]
[[userInfo.remark]]
[[d.project_title]]
articleThumb
[[d.material_name]]
timelineThumb
进入工作台
折叠
所有分类 我的工作台
展开
【PinPong Board】有屏的地方就有BadApple
天明zzb 天明zzb 2021-04-27 14:07:32
4
1
简单

有显示器的地方就有BadApple。
从MicroSD卡读取数据,然后在OLED上呈现视频。

材料清单 材料清单
1x
PinPong开发版
1x
MicroSD卡模块
步骤1 步骤1
图片捕捉

下载Bad Apple MP4文件,使用 PotPlayer 的截图功能,将视频中的每一帧截图成 72 x 54 的 bmp 图片。PinPong的 OLed的最大分辨率是 128 x 64,不改变源视频长宽比的情况下,选用 96 * 64 的分辨率会导致运存不足,因为每一帧的图片数据会保存在一个 char[] 数组中

步骤2 步骤2
位图转换

使用 Image2Lcd 将刚才生成的 bmp 图片批量转换成 bin 文件,输出数据类型 二进制(*.bin) , 扫描模式 水平扫描 ,输出灰度 单色 ,最大宽度和高度 72 和 54 

步骤3 步骤3
数据处理

打开 windows 命令行工具,在生成的 bmp 文件目录下,输入 copy /b *.bin bad.bin 生成所需的 bin 文件

步骤4 步骤4
格式化内存卡,把bad.bin文件放入卡中
步骤5 步骤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号针脚没有用到,针脚定义见下表(最右侧一栏为单片机引脚):

projectImage
projectImage
projectImage
步骤6 步骤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 步骤7
最后来个视频看看效果吧!!!
附件 附件
Makelog作者原创文章,未经授权禁止转载。
4
1
评论
[[c.user_name]] [[c.create_time]]
[[c.parent_comment.count]]
[[c.comment_content]]