树莓派PICO-OLED图片和视频

本文介绍如何使用树莓派PICO结合micropython和oled12864显示屏播放视频。主要内容包括视频预处理流程:从视频到GIF、从GIF到BMP帧、从BMP到PBM帧;以及树莓派PICO上的程序实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

树莓派PICO-oled图片和视频

一.思路

我们在使用micropython来控制oled时,使用到了ssd1306的库,通过ssd1306引入的framebuf我们可以实现将一帧图片数据写入帧缓冲区,然后oled可以显示一帧图片,通过连续写入帧,就可以让oled显示一段视频

然而oled12864属于黑白显示的一类,那么我们就需要对帧数据进行预处理:我们将一段视频.mp4或者动画.gif按照一定的码率剪切为单独的帧图片,将所有的帧图片转化为128x64的二值化图片,然后让单片机逐一播放,以达到我们想要的效果。

注:本案例将采用oled12864+micropython+raspberry pico完成,案例对于其他使用micropython编程的单片机比如:ESP32同样适用

本案例将用到的软件下载:Hrilug/优快云 (github.com)

二.实现数据预处理


       首先,对于视频文件,我们需要转换为.gif文件,你可以通过网络在线转化器Online File Converter (cdkm.com)。这里你需要设置.gif的帧数,这直接决定你后来oled的刷新率和你的文件大小了,但是oled12864的刷新率也是有极限的,我这里直接推荐你的使用1-10帧提取视频文件到gif。      


       现在你已经有了GIF文件,但是oled12864不能直接播放GIF动画而是一帧一帧的图片,所以我们把GIF文件拆开,这里我们需要使用软件gitsplitter,这是个软件以及类似软件很多,大家自行查找。然后得到一帧一帧的BMP格式的图片。


       然而,这还并不是我们想要的帧图片,我们需要将帧图片调整大小为128x64像素,我们可以使用批量图片处理软件图片转化器。

      

        最后,我们将BMP帧图片转换为PBM二值图片类型。我在这里先引入一个文件类型:PBM。对于.pbm的图片文件可以存储二值化的图片,并且占用内存小,同样也方便我们操作。使用PBM文件存储单独的帧,然后让单片机读取让oled显示,也是目前比较主流的oled视频播放的方法了,相对于一帧一帧地提取图片色值并把数组写进txt方便得多。我们使用python脚本实现转换。

       注:将BMP帧放在python脚本同一个文件夹下,PIL库下载pip3 install pillow

from PIL import Image
import time

for i in range(1,122):
    print(i)
    file=str(i)+'.bmp'
    im=Image.open(file)
    im=im.convert('1')
    im.save(str(i)+'.pbm')
    time.sleep(0.1)

三.实现


       我们将ssd1306.py库文件、main.py主程序、还有含有我们预处理好的PBM文件的PBM文件夹上载到PICO开发板。

       Main.py参考来自博主YunTianMingg

from ssd1306 import SSD1306_I2C
from machine import I2C,Pin
import time,machine,framebuf

i2c=I2C(0,sda=Pin(0), scl=Pin(1), freq=2000000)
display = SSD1306_I2C(128,64,i2c)

def show(dirt):
    with open(dirt,'rb') as f :
        f.readline()
        data = bytearray(f.read())
        fbuf = framebuf.FrameBuffer(data,128,64,framebuf.MONO_HLSB)
        display.fill(0)
        display.blit(fbuf,0,0)#如果不居中,可以修改中间的参数
        display.show()
        del fbuf#清理内存

for i in range(1,122):
    dirt = 'pbm/'+ str(i) + '.pbm' #文件地址
    show(dirt)
    time.sleep(0.2)#这个延时的长度取决于各自的帧率

参考:

 如何高效使用Micropython看你喜欢看的视频_YunTianMingg丶的博客

 ESP32 Python 用OLED播放Bad Apple_scott_xiao的博客

<think>好的,我现在需要帮助用户了解如何在树莓派Pico上点亮OLED屏幕,无论是使用MicroPython还是C SDK。首先,我应该先回顾一下用户提供的引用内容。引用[1]提到如何选择MicroPython解释器,引用[2]描述了开发板集成了OLED等外设,所以用户可能使用的是类似的开发板,比如带有SSD1306驱动的OLED屏幕。 首先,我需要确定用户使用的OLED屏幕型号。常见的0.96寸OLED通常使用SSD1306控制器,接口可能是I2C或SPI。假设用户的是I2C接口,因为这在Pico上较为常见且接线简单。 对于MicroPython部分,步骤应该是安装固件、连接硬件、安装库、编写代码。需要检查用户是否已经配置了MicroPython环境(根据引用[1])。然后,连接SDASCL引脚到Pico的对应GPIO,比如GP0GP1。接着,需要确保有ssd1306.py的库文件,可以从官方仓库获取。然后编写初始化I2C屏幕的代码,并显示测试内容。 对于C SDK部分,可能需要使用pico-sdk中的硬件库,或者第三方库如pico-ssd1306。需要指导用户安装SDK,配置CMakeLists.txt,编写初始化I2C、配置SSD1306、发送数据的代码。这部分可能更复杂,需要用户熟悉C构建流程。 可能的问题点包括接线错误、库未正确安装、I2C地址不正确(通常0x3C或0x3D)、以及屏幕初始化参数设置。需要提醒用户检查这些方面,并查看文档或示例代码。 用户可能还需要知道如何显示文本或图形,可能需要使用图形库或自行处理像素。在MicroPython中,ssd1306库提供基本功能,但高级功能需要扩展。在C中,可能需要实现更多底层操作。 最后,生成相关问题,帮助用户深入学习,比如如何显示中文、绘制图形、优化性能等。</think>### 树莓派 Pico 点亮 OLED 屏幕教程 #### 一、MicroPython 实现 1. **硬件连接** - OLED 屏幕(SSD1306 驱动,I2C 接口)与 Pico 接线: - SDA → Pico **GP0**(物理引脚1) - SCL → Pico **GP1**(物理引脚2) - VCC → 3.3V - GND → GND *(若使用其他 GPIO 引脚,需在代码中修改对应参数)* 2. **软件配置** - 步骤1:下载 [ssd1306.py](https://github.com/micropython/micropython/blob/master/drivers/display/ssd1306.py) 驱动库,通过 Thonny IDE 上传到 Pico 存储中[^1] - 步骤2:编写代码: ```python from machine import Pin, I2C import ssd1306 i2c = I2C(0, scl=Pin(1), sda=Pin(0), freq=400_000) # 使用GP0GP1 oled = ssd1306.SSD1306_I2C(128, 64, i2c) oled.fill(0) # 清屏 oled.text("Hello Pico!", 0, 0) oled.text("OLED Test", 0, 16) oled.show() ``` #### 二、C SDK 实现 1. **环境准备** - 安装 [pico-sdk](https://github.com/raspberrypi/pico-sdk) 并配置开发环境 - 添加 [pico-ssd1306](https://github.com/nakhonthai/pico-ssd1306) 第三方库 2. **代码示例** ```c #include "pico/stdlib.h" #include "ssd1306.h" int main() { i2c_init(i2c_default, 400 * 1000); gpio_set_function(PICO_DEFAULT_I2C_SDA_PIN, GPIO_FUNC_I2C); gpio_set_function(PICO_DEFAULT_I2C_SCL_PIN, GPIO_FUNC_I2C); SSD1306 display = ssd1306_configure(128, 64, 0x3C); ssd1306_clear(&display); ssd1306_draw_string(&display, 0, 0, "Hello Pico!", 1); ssd1306_show(&display); while(1); } ``` #### 三、常见问题排查 - **屏幕无显示**:检查 I2C 地址是否为 `0x3C` 或 `0x3D`(可通过 `i2c.scan()` 检测) - **花屏/乱码**:确认初始化尺寸(128x64 或 128x32)与实际屏幕匹配 - **接线不稳定**:确保使用 2.2kΩ 上拉电阻(部分模块已内置)
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值