4853|9

291

帖子

5

TA的资源

纯净的硅(中级)

楼主
 

玩转RP2040之使用Python在LCD上显示图片 [复制链接]

上篇文章: 玩转RP2040之LCD绘制基本形状测试,介绍了使用MicroPython在RP2040的LCD进行基本的图形绘制,包括像素点绘制、直线绘制、矩形绘制等。但对于图片的绘制,好像没有很好的支持。

 

在网上找到一个使用MicroPython在gc9a01的LCD显示图片的例子,已经编译好了LCD驱动的固件,可以直接使用,也可以自己再修改编译,比较不错,项目链接地址:

 

1 更换Python固件

要使用MicroPython以及此项目中的函数接口进行LCD上的图片显示,需要先给RP2040更换为这里的固件,更换方法和之前介绍的一样,就是按住BOOT和RESET重启,安装BOOT不发后弹出文件夹,把下面的固件拖进去即可,固件烧录的具体流程可参考之前的文章:

2 修改引脚定义

然后就可以使用项目中的测试程序进行图片显示测试了,再测试之前,需要改下引脚定义,因为下载的这个项目所用的板子的LCD引脚定义和RP2040的是不一样的,可以参考微雪LCD基础例程中的引脚定义的写法,进行对应的修改,修改的代码如下,jpg.py程序:

import gc
import time 
from machine import Pin, SPI
import gc9a01
​
DC = 8
CS = 9
SCK = 10
MOSI = 11
RST = 12
​
BL = 25
​
gc.enable()
gc.collect()
​
​
def main():
    '''
    Decode and draw jpg on display
    '''
    spi = SPI(1, baudrate=60000000, sck=Pin(SCK), mosi=Pin(MOSI))
    tft = gc9a01.GC9A01(
        spi,
        240,
        240,
        reset=Pin(RST, Pin.OUT),
        cs=Pin(CS, Pin.OUT),
        dc=Pin(DC, Pin.OUT),
        backlight=Pin(BL, Pin.OUT),
        rotation=0)
​
    # enable display and clear screen
    tft.init()
​
    # cycle thru jpg's
    while True:
        for image in ["bigbuckbunny.jpg", "bluemarble.jpg"]:
            tft.jpg(image, 0, 0, gc9a01.SLOW)
            time.sleep(5)
​
​
main()

可以看到,有了LCD编译库的加持,应用代码变得十分简洁,在指定了LCD的引脚并进行初始化之后,只需要指定要显示的jpg图片,即可实现图片的显示,图片也不需要再额外的编码转换。

3 图片文件放到板子中

在测试之前,还要将要显示的jpg图片和程序放到RP2040板子中,对应py文件,之前的文章( 玩转RP2040之Python开发环境搭建)介绍过一种方式是:在电脑上通过Thonny打开py文件,然后串口连接到板子,再点文件另存为,选择存到板子中即可。

那对于jpg图片,怎么保存到板子中呢?这里再介绍另外一种文件复制的方法,使用ampy工具。

3.1 安装ampy工作

自己的Windows电脑上需要有python的开发环境,然后使用pip指令安装adafruit-ampy这个工具

pip install adafruit-ampy

安装完成之后,可以输入ampy指令确认是否安装成功:

这里主要用到的是put这个指令,用来将电脑中的文件发送到RP2040板子中。

3.2 使用apmy指令传输文件

在要上传的文件的目录下按住shift键并右击目录,选择“此次打开powershell窗口”。

比如此次要上传的jpg图片在examples/RP2/jpg目录下,就在jpg文件夹上按住shift键并右击。

使用ls指令可以查看jpg目录下的文件,然后使用下面的指令进行文件推送

ampy --port COM31 put alien.jpg
  • COM31为自己板子的串口号

  • alien.jpg为要发送的文件名,这里是一个图片文件,此外,也支持文件夹发送

需注意的是:在执行此指令时,板子串口要连接到电脑,但串口不能再连接到其它软件,如果连接到了Thonny,要断开Thonny与板子的连接关系

文件发送成功的示意结果如下:

发送成功后,可以再示意Thonny连接板子,通过打开文件,打开板子文件,来确认图片是否已经在板子中了。

4 运行测试

程序和图片都放到板子中后,就可以测试了,由于我的板子在上篇文章测试LCD画基本元素时,放入了一个main.py的程序,所以开机默认会运行那个程序,在不删除那个程序的情况下,用Thonny打开板子中的jpg.py图片测试程序,点击Thonny中的运行,也是可以运行的,测试效果图如下:

5 总结

本篇介绍了使用MicroPython在RP2040上进行LCD全屏图片的显示测试,通过更换已编译好的LCD驱动的python固件,然后将要显示的jpg文件通过ampy放到板子中,修改测试程序的引脚定义,即可实现LCD上图片的显示。

 

 

此帖出自消费电子论坛

最新回复

这个有没有例子啊。我这里跑了没有反应。   详情 回复 发表于 2023-3-24 23:58
点赞 关注
 
 

回复
举报

291

帖子

5

TA的资源

纯净的硅(中级)

沙发
 

去掉程序里的延时,以最快速度切换图片显示的实测效果:

VID_20221204_123556

 

此帖出自消费电子论坛
 
 
 

回复

291

帖子

5

TA的资源

纯净的硅(中级)

板凳
 

对于小图标的动画效果,还是不错的,比如toasters.py这个程序

import time
import random
from machine import Pin, SPI
import gc9a01
import t1, t2, t3, t4, t5

TOASTERS = [t1, t2, t3, t4]
TOAST = [t5]

DC = 8
CS = 9
SCK = 10
MOSI = 11
RST = 12

BL = 25

class toast():
    '''
    toast class to keep track of a sprites locaton and step
    '''
    def __init__(self, sprites, x, y):
        self.sprites = sprites
        self.steps = len(sprites)
        self.x = x
        self.y = y
        self.step = random.randint(0, self.steps-1)
        self.speed = random.randint(2, 5)

    def move(self):
        if self.x <= 0:
            self.speed = random.randint(2, 5)
            self.x = 240-64

        self.step += 1
        self.step %= self.steps
        self.x -= self.speed


def main():
    '''
    Draw and move sprite
    '''
    spi = SPI(1, baudrate=60000000, sck=Pin(SCK), mosi=Pin(MOSI))
    tft = gc9a01.GC9A01(
        spi,
        240,
        240,
        reset=Pin(RST, Pin.OUT),
        cs=Pin(CS, Pin.OUT),
        dc=Pin(DC, Pin.OUT),
        backlight=Pin(BL, Pin.OUT),
        rotation=0)

    # enable display and clear screen
    tft.init()
    tft.fill(gc9a01.BLACK)

    # create toast spites in random positions
    sprites = [
        toast(TOASTERS, tft.width()-64, 0),
        toast(TOAST, tft.width()-64*2, 80),
        toast(TOASTERS, tft.width()-64*4, 160)
    ]

    # move and draw sprites
    while True:
        for man in sprites:
            bitmap = man.sprites[man.step]
            tft.fill_rect(
                man.x+bitmap.WIDTH-man.speed,
                man.y,
                man.speed,
                bitmap.HEIGHT,
                gc9a01.BLACK)

            man.move()

            if man.x > 0:
                tft.bitmap(bitmap, man.x, man.y)
            else:
                tft.fill_rect(
                    0,
                    man.y,
                    bitmap.WIDTH,
                    bitmap.HEIGHT,
                    gc9a01.BLACK)

        time.sleep(0.05)


main()

测试图:

动画效果:

VID_20221204_125921_x264

 

此帖出自消费电子论坛
 
 
 

回复

1万

帖子

25

TA的资源

版主

4
 

用thonny传文件比ampy方便

此帖出自消费电子论坛

点评

thonny也可以传图片文件到板子吗,没有找到这个功能  详情 回复 发表于 2022-12-4 14:03
 
 
 

回复

291

帖子

5

TA的资源

纯净的硅(中级)

5
 
dcexpert 发表于 2022-12-4 13:56 用thonny传文件比ampy方便

thonny也可以传图片文件到板子吗,没有找到这个功能

此帖出自消费电子论坛
 
 
 

回复

1万

帖子

25

TA的资源

版主

6
 
DDZZ669 发表于 2022-12-4 14:03 thonny也可以传图片文件到板子吗,没有找到这个功能

任意文件都行

 

先在文件上点鼠标右键

 

 

然后从菜单选“上载到”

 

 

 

如果创建了目录,也可以进入目录后,上传到指定目录。

此帖出自消费电子论坛

点评

这种方式确实更方便,又学到一招,感谢分享  详情 回复 发表于 2022-12-4 20:42
 
 
 

回复

291

帖子

5

TA的资源

纯净的硅(中级)

7
 

这种方式确实更方便,又学到一招,感谢分享

此帖出自消费电子论坛
 
 
 

回复

162

帖子

0

TA的资源

一粒金砂(高级)

8
 

写的是真不错啊 太细节啦 太准确了

此帖出自消费电子论坛
 
 
 

回复

286

帖子

1

TA的资源

一粒金砂(中级)

9
 

这个有没有例子啊。我这里跑了没有反应。

此帖出自消费电子论坛

点评

源码吗?文章开头有介绍,源码来自github的一个开源项目  详情 回复 发表于 2023-3-27 22:51
个人签名

失恋中。。。

 
 
 

回复

291

帖子

5

TA的资源

纯净的硅(中级)

10
 
liaoyuanhong 发表于 2023-3-24 23:58 这个有没有例子啊。我这里跑了没有反应。

源码吗?文章开头有介绍,源码来自github的一个开源项目

此帖出自消费电子论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表