▌01 安装Thonny软件
1.简介
在开发使用 RP2040 时,根据它的 PI Pico Python SDK 中的第四章,介绍使用Thonny软件作为开发PI Pico的开发集成环境(Integreted Development Environment:IDE)。
▲ PI Pico Python SDK推荐使用Thonny作为开发IDE
下面讨论如何从 Thonny官网 首页下载安装Windows版本的Thonny软件,并对 RASPBERRY PI PICO 树莓派PICO开发板双核高性能低功耗RP2040芯片 开发设置相应的开发环境。
2.下载Thonny软件
在Thonny官网的右上方便有针对不同OS的下载安装链接:
▲ Thonny官网首页,右上方就有相应的OS下的Thonny安装下载
这里点击下载了Windows版本的Thonny进行安装测试:
▌02 安装测试
1.安装Thonny 软件
点击下载之后的Thonny安装包软件,便开始自动安装Thonny软件。
▲ 从开始到安装完毕
基本上都是按照缺省的选项便可以顺利的将Thonny软件安装在计算机的C盘目录中了。
▲ 安装过程
2.运行Thonny
(1)首次运行设置
在运行安装好的Thonny程序之后,在第一次运行的时候,它提示选择界面语言和初始设置。
初始设置包括两种:
- Standard
- Raspberry PI
在开始运行的时候,请选择“Standard”模式。
设置完毕之后,程序便呈现下面的用户界面状态。此后便可以创建、编写、运行和调试普通的Python程序了。
▲ 运行Thonny选择运行语言和初始设置
如果选择了Raspberry PI模式,用户界面将会呈现如下的形式。
▲ 运行之后的初始界面
通过点击上面对话框的右上角“切换至一般模式”,重新启动程序,程序界面边呈现一般运行模式:
▲ 回复到一般运行模式
(2)设置Thonny的Python解释器
通过点击Thonny程序右下角的Python版本号,选择Python对应的解释器:MicroPython(Raspberry Pi Pico)。
▲ 设置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对应的PC端口号可以在Thonny的设置-解释器中的端口 使用到。不过当设置端口位“自动探测端口”(缺省的状态),则可以不必记录Pi Pico串口所对应的端口号了。
▲ 设置解释器以及对应的端口
点击Thonny中的工具栏的“停止/重启后端进程”按钮,连接Thonny软件与Pi Pico之,在ShellX中便可以通过MicroPython的 REPL 完成交互变成命令了。
下面显示了正确连接Pi Pico之后,在ShellX中执行简单的Help(), Print命令。
▲ 连接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闪烁程序运行情况
5.程序存储与打开
使用文件中的另存为 可以存储测试的程序。此时需要选择存储的地点:
- 此电脑
- Raspberry Pi Pico
可以选择不同的存储位置。在将来重新打开时选择对应的存储空间即可。
▲ 存储Pi Pico程序
下图显示了在打开文件是选择程序所在的存储空间。
▲ 存储PI Pico 程序
▌03 配置Thonny Shell
有时会通过Thonny的Shell窗口读取MicroPython输出的数据。下面给出对于Shell输出的配置以及读取数据的示例程序。
1.配置Shell输出
缺省的情况下,Shell会对长度大于1000个字节的字符串压缩显示。此时需要通过点击再将输出内容进行展开。这对于很多情况下会将输出更加的正解。
设置是通过Thonny的配置中的Shell,设置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软件来开发测试Pi Pico程序非常便捷。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
#============================================================