安装 Thonny 软件环境开发PI Pico

Thonny软件安装及Pi Pico开发使用教程
本文介绍了使用Thonny软件开发PI Pico的详细过程。包括从Thonny官网下载安装Windows版本软件,首次运行设置、Python解释器设置,连接PI Pico实验电路板,运行简单程序及存储打开程序。还提及了配置Thonny Shell输出和读取数据的方法,指出用Thonny开发测试Pi Pico程序很便捷。

 

01 安装Thonny软件


1.简介

在开发使用 RP2040 时,根据它的 PI Pico Python SDK 中的第四章,介绍使用Thonny软件作为开发PI Pico的开发集成环境(Integreted Development Environment:IDE)。

▲ PI Pico Python SDK推荐使用Thonny作为开发IDE

▲ PI Pico Python SDK推荐使用Thonny作为开发IDE

下面讨论如何从 Thonny官网 首页下载安装Windows版本的Thonny软件,并对 RASPBERRY PI PICO 树莓派PICO开发板双核高性能低功耗RP2040芯片 开发设置相应的开发环境。

2.下载Thonny软件

在Thonny官网的右上方便有针对不同OS的下载安装链接:

▲ Thonny官网首页,右上方就有相应的OS下的Thonny安装下载

▲ Thonny官网首页,右上方就有相应的OS下的Thonny安装下载

这里点击下载了Windows版本的Thonny进行安装测试:

 

02 安装测试


1.安装Thonny 软件

点击下载之后的Thonny安装包软件,便开始自动安装Thonny软件。

▲ 从开始到安装完毕

▲ 从开始到安装完毕

基本上都是按照缺省的选项便可以顺利的将Thonny软件安装在计算机的C盘目录中了。

▲ 安装过程

▲ 安装过程

2.运行Thonny

(1)首次运行设置

在运行安装好的Thonny程序之后,在第一次运行的时候,它提示选择界面语言和初始设置。

初始设置包括两种:

  • Standard
  • Raspberry PI

在开始运行的时候,请选择“Standard”模式。

设置完毕之后,程序便呈现下面的用户界面状态。此后便可以创建、编写、运行和调试普通的Python程序了。

▲ 运行Thonny选择运行语言和初始设置

▲ 运行Thonny选择运行语言和初始设置

如果选择了Raspberry PI模式,用户界面将会呈现如下的形式。

▲ 运行之后的初始界面

▲ 运行之后的初始界面

通过点击上面对话框的右上角“切换至一般模式”,重新启动程序,程序界面边呈现一般运行模式:

▲ 回复到一般运行模式

▲ 回复到一般运行模式

(2)设置Thonny的Python解释器

通过点击Thonny程序右下角的Python版本号,选择Python对应的解释器:MicroPython(Raspberry Pi Pico)

▲ 设置Thonny的Python解释器

▲ 设置Thonny的Python解释器

如果你安装Thonny是旧的版本,则需要更新的最新的Thonny版本,对应的Python解释器才能够选择对应的PI Pico。

3.连接PI Pico实验电路板

将PI Pico通过MiniUSB电路连接到PC的USB端口。如果PI Pico开发板已经按照 RASPBERRY PI PICO 树莓派PICO开发板双核高性能低功耗RP2040芯片 的过程下载了 MicroPython的固件(单片机程序),并且在PC中安装了 "Board CDC驱动,则计算机设备管理器中就会出现"Pi Pico Serial Port(COM6) 对应的串口。其中COM6中的具体端口号与计算机本身串口配置有关系。

▲ PI Pico Serial Port(COM6)

▲ PI Pico Serial Port(COM6)

PI Pico对应的PC端口号可以在Thonny的设置-解释器中的端口 使用到。不过当设置端口位“自动探测端口”(缺省的状态),则可以不必记录Pi Pico串口所对应的端口号了。

▲ 设置解释器以及对应的端口

▲ 设置解释器以及对应的端口

点击Thonny中的工具栏的“停止/重启后端进程”按钮,连接Thonny软件与Pi Pico之,在ShellX中便可以通过MicroPython的 REPL 完成交互变成命令了。

下面显示了正确连接Pi Pico之后,在ShellX中执行简单的Help(), Print命令。

▲ 连接PI Pico 实验电路板

▲ 连接PI Pico 实验电路板

4.运行简单程序

PI Pico Python SDK中给出了很多基础的联系程序,可以使用他们来对你手边的PI Pico做简单的测试。

在Thonny程序中建立新的文件"test1.py”,并输入下面的测试程序:

from machine import Pin, Timer
from time import sleep_us

led = Pin(25, Pin.OUT)
tim = Timer()

#------------------------------------------------------------
def tick(timer):
    global led
    led.toggle()

tim.init(freq=1, mode=Timer.PERIODIC, callback=tick)

for i in range(100):
    print(i)
    sleep_us(1000)

print("End of program.")

点击运行按钮,便可以看到相应的程序输出,以及Pi PICO上的LED的变化。

▲ PI Pico板载LED闪烁程序

▲ PI Pico板载LED闪烁程序

下面显示了PI Pico板载LED闪烁的情况。

▲ PI Pico板载LED闪烁程序运行情况

▲ PI Pico板载LED闪烁程序运行情况

5.程序存储与打开

使用文件中的另存为 可以存储测试的程序。此时需要选择存储的地点:

  • 此电脑
  • Raspberry Pi Pico

可以选择不同的存储位置。在将来重新打开时选择对应的存储空间即可。

▲ 存储Pi Pico程序

▲ 存储Pi Pico程序

下图显示了在打开文件是选择程序所在的存储空间。

▲ 存储PI Pico 程序

▲ 存储PI Pico 程序

 

03 配置Thonny Shell


有时会通过Thonny的Shell窗口读取MicroPython输出的数据。下面给出对于Shell输出的配置以及读取数据的示例程序。

1.配置Shell输出

缺省的情况下,Shell会对长度大于1000个字节的字符串压缩显示。此时需要通过点击再将输出内容进行展开。这对于很多情况下会将输出更加的正解。

设置是通过Thonny的配置中的Shell,设置Shell最长输出字符串:将其修改为10000。

▲ 设置Thonny的Shell输出最大长度为10000

▲ 设置Thonny的Shell输出最大长度为10000

2.读取Shell数据代码

下面给出了读取Thonny Shell的代码,并进行显示。

tspsendwindowkey('Thonny', 's', alt=1)
tspsendwindowkey('Thonny', 'ac', control=1)

str = [int(s) for s in clipboard.paste().split('[')[-1].split(']')[0].split(',')]
printf(str)

plt.plot(str)
plt.xlabel("Sample")
plt.ylabel("Value")
plt.grid(True)
plt.tight_layout()
plt.show()

▲ 将Thonny的Shell读取的数据进行显示

▲ 将Thonny的Shell读取的数据进行显示

 

▌总结


使用Thonny软件来开发测试Pi Pico程序非常便捷。Thonny也只是很多开发板与开发环境。下面是从Thonny的设置中的解释器配置看到的对应的支持的硬件种类。

▲ Thonny所支持的开发环境

▲ Thonny所支持的开发环境

■ 相关文献链接:

1.TSP到Thonny程序搬运

#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# UPPPP.PY                     -- by Dr. ZhuoQing 2021-02-24
#   Upload PI Pico Program.
#   Usage:
#       upppp filename COM1 & 100
#       upppp *             # Paste file into Thonny & execute
#
# Note:
#============================================================

from head import *

import serial
from _ast import Or
from serial.serialutil import SerialException

#------------------------------------------------------------
THONNY_WINDOW = 'Thonny'

def ThonnyExec():
    tspcopyclipboard()

    blanklineflag = 1

    clipstr = clipboard.paste().split('\n')
    pastr = []

    lastpasteline = ''

    for s in clipstr:
        if len(s) == 0: continue

        ss = s.lstrip(' ')

        if len(ss) > 0:
            if ss[0] == '#': continue
            if ss.find('from head') >= 0: continue

            if len(ss) < 2:
                if blanklineflag != 0:
                    continue

                blanklineflag = 1
            else:
                blanklineflag = 0
        else:
            if blanklineflag != 0:
                continue

            blanklineflag = 1

        if len(lastpasteline) > 0:
            pastr.append(lastpasteline)

        lastpasteline = s

    if len(lastpasteline) > 0:
        pastr.append(lastpasteline)

    if len(lastpasteline) > 2:
        pastr.append("\r")

    copystr = '\n'.join(pastr)
    tspcopystring(copystr)

    tspsendwindowkey(THONNY_WINDOW, "e", alt=1)
    tspsendwindowkey(THONNY_WINDOW, "av", control=1)
    tspsendwindowkey(THONNY_WINDOW, '%c'%(0x74), vk=1)
    tspfocuswindow("TEASOFT:1")
    printf("\a")

#------------------------------------------------------------
if len(sys.argv) > 1:
    if sys.argv[1] in '. ;  *':
        ThonnyExec()
        printf("\a")
        exit()

#------------------------------------------------------------
title = tspgetwindowtitle()
for t in title:
    if t.find('Thonny') == 0:
        ThonnyExec()
        printf("\a")
        exit()

#------------------------------------------------------------
PORTNAME = 'COM6'
WAITTIMEMS = 500
WAIT_LOOP = 0

#------------------------------------------------------------
doppath = tspgetdoppath()
filename = tspeditfileget()

#filename = os.path.join(doppath, 'testpwm.py')
printf(filename)

#------------------------------------------------------------
if len(sys.argv) > 1:
    for v in sys.argv[1:]:
        if len(v) > 3:
            if v[0:3] == 'COM':
                PORTNAME = v
                continue

        if v.isdigit():
            WAITTIMEMS = int(v)
            continue

        if v in '* % &'.split():
            WAIT_LOOP = 1
            continue

        filebase = v + ".PY"
        filename = os.path.join(doppath, filebase)

#------------------------------------------------------------
if not os.path.isfile(filename):
    printf("File %s does not exist !"%filename)
    exit()

#------------------------------------------------------------
sport = serial.Serial()
sport.baudrate = 115200
sport.timeout = 0.1
try:
    sport.port = PORTNAME
except:
    printf('Set sport port %s error. '%PORTNAME)

try:
    sport.open()
except serial.serialutil.SerialException:
    printf('Open sport port %s error.'%PORTNAME)
else:
    printf('Open sport port %s Ok.'%PORTNAME)
#------------------------------------------------------------
sport.write(b'\x03')                # Terminate the current program
sport.write(b'\x03')                # Terminate the current program
time.sleep(.05)
sport.write(b'\x04')                # Software reboot PI Pico
sport.timeout = 0.1
printf(sport.read(10000).decode('utf-8'))

sport.timeout = 0.05
sport.write(b'\x05')               # Enter Paste mode
printf(sport.read(10000).decode('utf-8'))

#------------------------------------------------------------
lastnullline = 0

lastbyte = b''

with open(filename, 'r') as f:
    for l in f.readlines():
        keepline = l.replace('\n', '\r')

        #----------------------------------------------------
        l = l.lstrip(' ')
        if len(l) > 0:
            if l.find('head') >= 0: continue
            if l[0] == '#': continue

            if len(l) <= 2:
                if lastnullline != 0:
                    continue

                lastnullline = 1
            else:
                lastnullline = 0

        lbyte = bytes(keepline, 'utf-8')

        if len(lastbyte) > 0:
            sport.write(lastbyte)

        lastbyte = lbyte
        continue

if len(lastbyte) > 0:
    sport.write(lastbyte)

#------------------------------------------------------------
sport.timeout = 0.1
printf(sport.read(10000).decode('utf-8'))
printf('\a')

sport.write(b'\x04')               # Exit the paste mode
#------------------------------------------------------------
if WAIT_LOOP != 0:
    sport.timeout = 0.05

    while True:
        key = tspread()
        if key[8] == 2 or key[7] == 2:
            sport.write(b'\0x3')
            sport.write(b'\0x3')
            printf('\r\nUser Terminate .\a')
            break

        readstr = sport.read(10000).decode('utf-8')
        if len(readstr) > 0:
            tspshowinfor(readstr)

else:
    sport.timeout = WAITTIMEMS / 1000.0
    printf(sport.read(10000).decode('utf-8'))

#------------------------------------------------------------

#------------------------------------------------------------
#        END OF FILE : UPPPP.PY
#============================================================
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卓晴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值