DDZZ669 发表于 2022-12-4 12:04

玩转RP2040之使用Python在LCD上显示图片

<div class='showpostmsg'><p>上篇文章:<a href="https://bbs.eeworld.com.cn/thread-1226547-1-1.html" target="_blank"> 玩转RP2040之LCD绘制基本形状测试</a>,介绍了使用MicroPython在RP2040的LCD进行基本的图形绘制,包括像素点绘制、直线绘制、矩形绘制等。但对于图片的绘制,好像没有很好的支持。</p>

<p>&nbsp;</p>

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

<p cid="n6" mdtype="paragraph"></p>

<p cid="n7" mdtype="paragraph">&nbsp;</p>

<h1 cid="n8" mdtype="heading">1 更换Python固件</h1>

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

<p cid="n10" mdtype="paragraph"></p>

<h1 cid="n11" mdtype="heading">2 修改引脚定义</h1>

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

<pre style="background:#555; padding:10px; color:#ddd !important;">
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():
&nbsp; &nbsp;&#39;&#39;&#39;
&nbsp;Decode and draw jpg on display
&nbsp;&#39;&#39;&#39;
&nbsp; &nbsp;spi = SPI(1, baudrate=60000000, sck=Pin(SCK), mosi=Pin(MOSI))
&nbsp; &nbsp;tft = gc9a01.GC9A01(
&nbsp; &nbsp; &nbsp; &nbsp;spi,
&nbsp; &nbsp; &nbsp; &nbsp;240,
&nbsp; &nbsp; &nbsp; &nbsp;240,
&nbsp; &nbsp; &nbsp; &nbsp;reset=Pin(RST, Pin.OUT),
&nbsp; &nbsp; &nbsp; &nbsp;cs=Pin(CS, Pin.OUT),
&nbsp; &nbsp; &nbsp; &nbsp;dc=Pin(DC, Pin.OUT),
&nbsp; &nbsp; &nbsp; &nbsp;backlight=Pin(BL, Pin.OUT),
&nbsp; &nbsp; &nbsp; &nbsp;rotation=0)

&nbsp; &nbsp;# enable display and clear screen
&nbsp; &nbsp;tft.init()

&nbsp; &nbsp;# cycle thru jpg&#39;s
&nbsp; &nbsp;while True:
&nbsp; &nbsp; &nbsp; &nbsp;for image in [&quot;bigbuckbunny.jpg&quot;, &quot;bluemarble.jpg&quot;]:
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;tft.jpg(image, 0, 0, gc9a01.SLOW)
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;time.sleep(5)


main()</pre>

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

<h1 cid="n15" mdtype="heading">3 图片文件放到板子中</h1>

<p cid="n16" mdtype="paragraph">在测试之前,还要将要显示的jpg图片和程序放到RP2040板子中,对应py文件,之前的文章(<a href="https://bbs.eeworld.com.cn/thread-1226513-1-1.html" target="_blank"> 玩转RP2040之Python开发环境搭建</a>)介绍过一种方式是:在电脑上通过Thonny打开py文件,然后串口连接到板子,再点文件另存为,选择存到板子中即可。</p>

<p cid="n17" mdtype="paragraph">那对于jpg图片,怎么保存到板子中呢?这里再介绍另外一种文件复制的方法,使用ampy工具。</p>

<p cid="n18" mdtype="paragraph"></p>

<h2 cid="n19" mdtype="heading">3.1 安装ampy工作</h2>

<p cid="n20" mdtype="paragraph">自己的Windows电脑上需要有python的开发环境,然后使用pip指令安装adafruit-ampy这个工具</p>

<pre style="background:#555; padding:10px; color:#ddd !important;">
pip install adafruit-ampy</pre>

<p cid="n22" mdtype="paragraph">安装完成之后,可以输入ampy指令确认是否安装成功:</p>

<p cid="n23" mdtype="paragraph"></p>

<p cid="n24" mdtype="paragraph">这里主要用到的是put这个指令,用来将电脑中的文件发送到RP2040板子中。</p>

<h2 cid="n25" mdtype="heading">3.2 使用apmy指令传输文件</h2>

<p cid="n26" mdtype="paragraph">在要上传的文件的目录下按住shift键并右击目录,选择&ldquo;此次打开powershell窗口&rdquo;。</p>

<p cid="n27" mdtype="paragraph">比如此次要上传的jpg图片在examples/RP2/jpg目录下,就在jpg文件夹上按住shift键并右击。</p>

<p cid="n28" mdtype="paragraph"></p>

<p cid="n29" mdtype="paragraph">使用ls指令可以查看jpg目录下的文件,然后使用下面的指令进行文件推送</p>

<pre style="background:#555; padding:10px; color:#ddd !important;">
ampy --port COM31 put alien.jpg</pre>

<ul cid="n31" data-mark="-" mdtype="list">
        <li cid="n32" mdtype="list_item">
        <p cid="n33" mdtype="paragraph">COM31为自己板子的串口号</p>
        </li>
        <li cid="n34" mdtype="list_item">
        <p cid="n35" mdtype="paragraph">alien.jpg为要发送的文件名,这里是一个图片文件,此外,也支持文件夹发送</p>
        </li>
</ul>

<blockquote cid="n36" mdtype="blockquote">
<p cid="n37" mdtype="paragraph">需注意的是:在执行此指令时,板子串口要连接到电脑,但串口不能再连接到其它软件,如果连接到了Thonny,要断开Thonny与板子的连接关系</p>
</blockquote>

<p cid="n38" mdtype="paragraph">文件发送成功的示意结果如下:</p>

<p cid="n39" mdtype="paragraph">发送成功后,可以再示意Thonny连接板子,通过打开文件,打开板子文件,来确认图片是否已经在板子中了。</p>

<p cid="n40" mdtype="paragraph"></p>

<h1 cid="n41" mdtype="heading">4 运行测试</h1>

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

<p cid="n43" mdtype="paragraph"></p>

<h1 cid="n44" mdtype="heading">5 总结</h1>

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

<p cid="n46" mdtype="paragraph">&nbsp;</p>

<p>&nbsp;</p>
</div><script>                                        var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                                       
                                        if(parseInt(discuz_uid)==0){
                                                                                                (function($){
                                                        var postHeight = getTextHeight(400);
                                                        $(".showpostmsg").html($(".showpostmsg").html());
                                                        $(".showpostmsg").after(loginstr);
                                                        $(".showpostmsg").css({height:postHeight,overflow:"hidden"});
                                                })(jQuery);
                                        }                </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>

DDZZ669 发表于 2022-12-4 12:40

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

<p>f8628366b7bb17440e30192f23ebe374<br />
&nbsp;</p>

DDZZ669 发表于 2022-12-4 13:22

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

<pre>
<code class="language-python">import time
import random
from machine import Pin, SPI
import gc9a01
import t1, t2, t3, t4, t5

TOASTERS =
TOAST =

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 &lt;= 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
            tft.fill_rect(
                man.x+bitmap.WIDTH-man.speed,
                man.y,
                man.speed,
                bitmap.HEIGHT,
                gc9a01.BLACK)

            man.move()

            if man.x &gt; 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()</code></pre>

<p>测试图:</p>

<p></p>

<p>动画效果:</p>

<p>ee8f5f66733c2a484746c1e06f70246e<br />
&nbsp;</p>

dcexpert 发表于 2022-12-4 13:56

<p>用thonny传文件比ampy方便</p>

DDZZ669 发表于 2022-12-4 14:03

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

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

dcexpert 发表于 2022-12-4 16:53

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

<p>任意文件都行</p>

<p>&nbsp;</p>

<p>先在文件上点鼠标右键</p>

<p>&nbsp;</p>

<p> &nbsp;</p>

<p>然后从菜单选&ldquo;上载到&rdquo;</p>

<p>&nbsp;</p>

<p> &nbsp;</p>

<p>&nbsp;</p>

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

DDZZ669 发表于 2022-12-4 20:42

dcexpert 发表于 2022-12-4 16:53


<p>这种方式确实更方便,又学到一招,感谢分享<img height="48" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/handshake.gif" width="48" /></p>

小火苗 发表于 2023-1-11 14:09

<p>写的是真不错啊&nbsp;太细节啦&nbsp;太准确了</p>

liaoyuanhong 发表于 2023-3-24 23:58

<p>这个有没有例子啊。我这里跑了没有反应。</p>

DDZZ669 发表于 2023-3-27 22:51

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

<p>源码吗?文章开头有介绍,源码来自github的一个开源项目</p>
页: [1]
查看完整版本: 玩转RP2040之使用Python在LCD上显示图片