【树莓派 Pico 基于MicroPython编程Thonny开发】

简介: 【树莓派 Pico 基于MicroPython编程Thonny开发】

1. MicroPython 介绍

MicroPython是具有部分原生代码编译功能的 Python 解释器。MicroPython 实现了 Python 3.4 和 Python 3.5 及更高版本的一些精选功能,用于嵌入式处理器和受限系统。它与 CPython 不同,您可以在此处阅读有关差异的更多信息

1.png

MicroPython 是 Python 3编程语言的精简高效实现,其中包括 Python 标准库的一小部分,并且经过优化,可在微控制器和受限环境中运行。

  • MicroPython pyboard是在裸机上运行 MicroPython 的紧凑型电子电路板,为您提供可用于控制各种电子项目的低级 Python 操作系统。
  • MicroPython 充满了高级功能,例如交互式提示、任意精度整数、闭包、列表推导、生成器、异常处理等等。然而,它足够紧凑,可以在 256k 的代码空间和 16k 的 RAM 内安装和运行。
  • MicroPython 旨在尽可能与普通 Python 兼容,让您可以轻松地将代码从桌面传输到微控制器或嵌入式系统。

2.png

2. 入门

首先,我们将Pi RP2040 连接到计算机,并从 MicroPython 上传一个简单的代码来检查板子是否运行良好。

3.png

2.1 硬件设置

  • Pi RP2040 x1
  • 安卓Micro数据线 x1
  • 电脑 x1

2.2 软件设置

步骤 1 :根据您的操作系统下载并安装最新版本的Thonny 编辑器

4.png

我的是windows,选推荐的第一个,下载地址

5.png

步骤 2 :启动Thonny

选择简体中文和Pi

6.png

步骤 3 :点击“切换至一般模式”,重新启动。

7.png

效果如下

8.png

第 4 步。连接Pi Pico,依次选择运行>配置解释器>解释器>端口,选择设备为MicroPython(Raspberry Pi Pico),端口为Try to detect prot automatically

9.png

3. RP2040 连接到 PC 并点亮

image.gif

3.1 步骤 1

按住“BOOT”按钮,然后通过安卓线将RP2040连接到PC。如果运行良好,PC 上会显示“RPI-RP2”桌面。👻👻👻

10.png

3.2 步骤 2

按下“停止/重启后端”按钮,将弹出一个窗口,帮助您在板上安装 MicroPython 固件。

为您的开发板下载正确的 MicroPython UF2 文件:

12.png

端口是:COM25

3.3 步骤 3

检查解释器是否一致COM25

将以下代码复制到 Thonny。

from machine import Pin, Timer
led = Pin(25, Pin.OUT)
Counter = 0
Fun_Num = 0
def fun(tim):
    global Counter
    Counter = Counter + 1
    print(Counter)
    led.value(Counter%2)
tim = Timer(-1)
tim.init(period=1000, mode=Timer.PERIODIC, callback=fun)

第 4 步。通过单击“运行当前脚本”按钮上传代码。第一次,Thonny 会询问您要将代码文件保存在哪里。This Computer和Raspberry Pi Pico都很好。

14.png

如果运行良好,您将看到 LED 灯每秒打开和关闭一次。并且越来越多的输出也将显示在 Shell 中。

15.png

4. IIC 连接RP2040在SSD1306显示

在本项目中,我们将通过IIC接口连接Grove - OLED Display 0.96" (SSD1306),在Seeed Studio XIAO RP2040上演示IIC功能。

4.1 硬件连接

步骤 1。下载ssd1306.py库并用 Thonny 打开它。

# MicroPython SSD1306 OLED driver, I2C and SPI interfaces
from micropython import const
import framebuf
# register definitions
SET_CONTRAST = const(0x81)
SET_ENTIRE_ON = const(0xA4)
SET_NORM_INV = const(0xA6)
SET_DISP = const(0xAE)
SET_MEM_ADDR = const(0x20)
SET_COL_ADDR = const(0x21)
SET_PAGE_ADDR = const(0x22)
SET_DISP_START_LINE = const(0x40)
SET_SEG_REMAP = const(0xA0)
SET_MUX_RATIO = const(0xA8)
SET_COM_OUT_DIR = const(0xC0)
SET_DISP_OFFSET = const(0xD3)
SET_COM_PIN_CFG = const(0xDA)
SET_DISP_CLK_DIV = const(0xD5)
SET_PRECHARGE = const(0xD9)
SET_VCOM_DESEL = const(0xDB)
SET_CHARGE_PUMP = const(0x8D)
# Subclassing FrameBuffer provides support for graphics primitives
# http://docs.micropython.org/en/latest/pyboard/library/framebuf.html
class SSD1306(framebuf.FrameBuffer):
    def __init__(self, width, height, external_vcc):
        self.width = width
        self.height = height
        self.external_vcc = external_vcc
        self.pages = self.height // 8
        self.buffer = bytearray(self.pages * self.width)
        super().__init__(self.buffer, self.width, self.height, framebuf.MONO_VLSB)
        self.init_display()
    def init_display(self):
        for cmd in (
            SET_DISP | 0x00,  # off
            # address setting
            SET_MEM_ADDR,
            0x00,  # horizontal
            # resolution and layout
            SET_DISP_START_LINE | 0x00,
            SET_SEG_REMAP | 0x01,  # column addr 127 mapped to SEG0
            SET_MUX_RATIO,
            self.height - 1,
            SET_COM_OUT_DIR | 0x08,  # scan from COM[N] to COM0
            SET_DISP_OFFSET,
            0x00,
            SET_COM_PIN_CFG,
            0x02 if self.width > 2 * self.height else 0x12,
            # timing and driving scheme
            SET_DISP_CLK_DIV,
            0x80,
            SET_PRECHARGE,
            0x22 if self.external_vcc else 0xF1,
            SET_VCOM_DESEL,
            0x30,  # 0.83*Vcc
            # display
            SET_CONTRAST,
            0xFF,  # maximum
            SET_ENTIRE_ON,  # output follows RAM contents
            SET_NORM_INV,  # not inverted
            # charge pump
            SET_CHARGE_PUMP,
            0x10 if self.external_vcc else 0x14,
            SET_DISP | 0x01,
        ):  # on
            self.write_cmd(cmd)
        self.fill(0)
        self.show()
    def poweroff(self):
        self.write_cmd(SET_DISP | 0x00)
    def poweron(self):
        self.write_cmd(SET_DISP | 0x01)
    def contrast(self, contrast):
        self.write_cmd(SET_CONTRAST)
        self.write_cmd(contrast)
    def invert(self, invert):
        self.write_cmd(SET_NORM_INV | (invert & 1))
    def show(self):
        x0 = 0
        x1 = self.width - 1
        if self.width == 64:
            # displays with width of 64 pixels are shifted by 32
            x0 += 32
            x1 += 32
        self.write_cmd(SET_COL_ADDR)
        self.write_cmd(x0)
        self.write_cmd(x1)
        self.write_cmd(SET_PAGE_ADDR)
        self.write_cmd(0)
        self.write_cmd(self.pages - 1)
        self.write_data(self.buffer)
class SSD1306_I2C(SSD1306):
    def __init__(self, width, height, i2c, addr=0x3C, external_vcc=False):
        self.i2c = i2c
        self.addr = addr
        self.temp = bytearray(2)
        self.write_list = [b"\x40", None]  # Co=0, D/C#=1
        super().__init__(width, height, external_vcc)
    def write_cmd(self, cmd):
        self.temp[0] = 0x80  # Co=1, D/C#=0
        self.temp[1] = cmd
        self.i2c.writeto(self.addr, self.temp)
    def write_data(self, buf):
        self.write_list[1] = buf
        self.i2c.writevto(self.addr, self.write_list)
class SSD1306_SPI(SSD1306):
    def __init__(self, width, height, spi, dc, res, cs, external_vcc=False):
        self.rate = 10 * 1024 * 1024
        dc.init(dc.OUT, value=0)
        res.init(res.OUT, value=0)
        cs.init(cs.OUT, value=1)
        self.spi = spi
        self.dc = dc
        self.res = res
        self.cs = cs
        import time
        self.res(1)
        time.sleep_ms(1)
        self.res(0)
        time.sleep_ms(10)
        self.res(1)
        super().__init__(width, height, external_vcc)
    def write_cmd(self, cmd):
        self.spi.init(baudrate=self.rate, polarity=0, phase=0)
        self.cs(1)
        self.dc(0)
        self.cs(0)
        self.spi.write(bytearray([cmd]))
        self.cs(1)
    def write_data(self, buf):
        self.spi.init(baudrate=self.rate, polarity=0, phase=0)
        self.cs(1)
        self.dc(1)
        self.cs(0)
        self.spi.write(buf)
        self.cs(1)

步骤 2。单击“文件→另存为”并将库保存在“Raspberry Pi Pico”中

选择“Raspberry Pi Pico”作为我们保存的位置。

确保保存的文件名为“ssd1306.py”,否则将无法使用。

16.png

步骤 3。将以下代码复制到 Thonny。

from ssd1306 import SSD1306_I2C
from machine import Pin, I2C
from time import sleep
i2c = I2C(1, scl=Pin(7), sda=Pin(6), freq=200000)#Grove - OLED Display 0.96" (SSD1315)
oled = SSD1306_I2C(128, 64, i2c)
while True:  
    oled.fill(0)#clear
    oled.text("Hello,World!",0,0)
    oled.show()
    #sleep(0.5)


第 4 步。通过单击“运行当前脚本”按钮上传代码。第一次,Thonny 会询问您要将代码文件保存在哪里。This Computer和Raspberry Pi Pico都很好。

17.png

接线入下

端口A 板子 端口B 板子
VCC SSD1306 3V3 Pico
GND SSD1306 GND Pico
SCL SSD1306 GPIO7 Pico
SDA SSD1306 GPIO6 Pico

如果运行良好,您将看到文本“Hello,World!” 显示在屏幕上。

18.png

5. 其他资源

一些额外的库和示例代码在这里:

[ZIP] XIAO-RP2040-MicroPython-Grove.zip

MicroPython

【树莓派 Pico 基于Arduino IDE编程开发】

【树莓派 Pico 和 Pico W】

目录
相关文章
|
IDE 编译器 开发工具
【STM32 LVGL基础教程】初识LVGL
【STM32 LVGL基础教程】初识LVGL
1473 0
|
应用服务中间件 nginx Windows
windows下面Nginx日志切割
windows下面Nginx日志切割
496 0
windows下面Nginx日志切割
|
存储 编译器 Linux
MinGW下载和安装教程
要知道,GCC 官网提供的 GCC 编译器是无法直接安装到 Windows 平台上的,如果我们想在 Windows 平台使用 GCC 编译器,可以安装 GCC 的移植版本。目前适用于 Windows 平台、受欢迎的 GCC 移植版主要有 2 种,分别为 MinGW 和 Cygwin。其中,MinGW 侧重于服务 W本节要重点给大家介绍的是 MinGw 的安装和使用。MinGw 全称 Minimalist GNU for Windows,应用于 Windows 平台,可以为我们提供一个功能有限的 Linux 系统环境以使用一些 GNU 工具,比如 GCC 编译器、gawk、bison 等等。
5473 0
MinGW下载和安装教程
Halcon中关于角度计算和测量拟合的算子详解
Halcon中关于角度计算和测量拟合的算子详解
2106 0
|
传感器 Linux Python
一起玩转树莓派(19)——红外遥控控制实验
红外遥控是生活中非常常见的电子器具,电视机,空调,音响等电器都可以通过遥控器进行控制。本篇博客,我们尝试来通过红外发生器和红外信号接受器来进行红外控制实验,在树莓派上通过红外遥控的按键来处理LED灯的控制。
2181 0
|
负载均衡 Java 应用服务中间件
Spring Cloud Alibaba系列(三)使用feign进行服务调用
Feign是spring cloud提供的一个声明式的伪http客户端,它使得调用远程服务就像调用本地服务一样简单,只需要创建一个接口并添加一个注解即可。
3375 0
|
12月前
|
传感器 编解码 人工智能
为 NVIDIA Jetson 和其他嵌入式系统选择合适的摄像头
本文详细介绍了为NVIDIA Jetson和其他嵌入式系统选择合适摄像头模块的关键因素,包括传感器类型(CCD和CMOS)、电子快门(全局快门和滚动快门)、彩色或单色传感器、动态范围、分辨率、帧率和接口等。文章还提供了光学器件的选择建议,并列出了NVIDIA摄像头模块合作伙伴,帮助用户完成从概念到生产的整个设计过程。
178 0
为 NVIDIA Jetson 和其他嵌入式系统选择合适的摄像头
|
NoSQL IDE 开发工具
OPENJTAG调试学习(一):嵌入式软件的交叉开发系统
OPENJTAG调试学习(一):嵌入式软件的交叉开发系统
522 0
|
网络协议 Ubuntu Linux
iPad Pro “买后生产力” - 在iPad上远程连接服务器编程写代码【公网远程】
iPad Pro “买后生产力” - 在iPad上远程连接服务器编程写代码【公网远程】
742 1