第三章 MicroPython基础知识
虽然MicroPython易于使用,但对于初学者(特别是Windows平台下的开发者)来说,为了避免因平台差异带来的影响,更好地学习和使用MicroPython,我们还是需要做一些准备工作。这些准备工作包括了解MicroPython的基础知识和使用方法、交互式环境、常见问题及常用的开发工具等。通过这些准备,我们可以更快地掌握MicroPython的开发技巧,更好地发挥其优势。
本章分为如下几个小节:
3.1 Python3与MicroPython关联
3.2 MicroPython系统结构
3.3 MicroPython的REPL交互式环境
3.1 Python3与MicroPython关联
本书并非专注于Python3语言的指南,因此建议读者通过专门的书籍或在线教程来学习Python相关的知识。值得庆幸的是,Python语言以其简单易学的特点而著称,即使之前没有接触过Python,大部分读者也能在几天内初步掌握。在此,我们假设读者已经对Python语言有了初步的了解。
读者即使没有学过Python语言,掌握起来也是非常快。Python3的参考资料非常多,这里作者推荐了两个免费学习Python网站:
1,菜鸟教程
2,黑马程序员
为了更好地帮助初学者,特别是对Python还不熟悉的读者,让大家可以更好地理解和使用MicroPython,下面列出了几个基本要素:
1,MicroPython的语法是完全基础Python3的,使用者需了解Python3语言的基础知识。
2,Python3语言是使用缩进来表示代码的层次(如果缩进不正确,会导致语法错误或者运行错误),而不是用大括号。缩进可以使用TAB键或者空格键,但TAB最好设置为4个空格。
3,位操作和C语言一样。
4,逻辑操作使用“and”、“or”和“^”,而不是C语言的“||”、“&&”。
5,在控制流语句(for、if…else…、match...case)中使用冒号。
6,注意除法的区别,一个除号“/”代表浮点计算。两个除号“//”代表整数除法。
3.2 MicroPython系统结构
一个MicroPython系统的典型构造如下图:它是由微控制器(系统底层硬件)、MicroPython固件和用户程序三大部分组成。其中,硬件和MicroPython固件是最基础且相对不变的部分,而用户程序则可以随时变更,可以存放多个用户程序到系统中,随时调用或切换,这是使用MicroPython的一个特色。
图3.2.1 典型的MicroPython系统架构
微控制器硬件就如同一个没有安装操作系统的计算机,只有下载了程序后才能实现其他的功能。MicroPython的功能就像嵌入式系统的操作系统(它不同于FreeRTOS、ucOS这样的实时系统,用户程序不能单独修改,因为系统和用户程序是一体的,需要编译后运行)。只有先安装了MicroPython系统(固件),才能运行各种MicroPython程序。
目前MicroPython源代码支持不同微控制器平台,这需要开发者自己编译对应MCU的MicroPython固件,并将固件下载到微控制器中才能运行MicroPython。
3.3 MicroPython的REPL交互式环境
REPL是Read-Evaluate-Print Loop(读取-求值-输出循环)的缩写。许多编程语言都带有某种形式的REPL,它们就像是一个小型Shell,使得程序员能够与解释器(或内核)进行交互,方便地输入各种命令,观察运行状态,因此在程序调试时能够发挥非常大的作用。
Python语言的REPL功能非常强大,而MicroPython虽然是一个缩减版的Python,但它的REPL功能同样强大。通过REPL交互环境,我们可以访问pyboard、输入程序、测试代码、查找问题、查看帮助、查看磁盘文件等。由于MicroPython是面向嵌入式应用的,因此MicroPython的REPL与Python的标准REPL相比,还存在一些差异,例如快捷键不同,还提供了额外的功能和用法。如果能够熟练掌握这些功能,将有助于我们更好地使用MicroPython。
3.3.1 常用的终端
在MicroPython开发中,我们通常使用串口终端软件和MicroPython的REPL(Read-Eval-Print Loop)进行交互,发送命令。通过串口终端软件,我们可以方便地在REPL中输入代码,运行和调试程序,以及打印输出结果。在开发MicroPython程序时,掌握串口终端软件的使用是非常必要的,因为它可以帮助我们更高效地进行开发和调试。
需要注意的是,不建议使用Windows下的串口调试助手等类似软件进行一般的串口调试和发送数据。这些软件通常不支持输入命令,也不支持粘贴功能,无法与REPL进行交互操作,因此不适合一般的开发需求。建议使用专业的串口终端软件,例如PuTTY、Minicom等,这些软件通常具有更丰富的功能和更好的操作体验。
另外,本书籍使用的是Thonny软件中的Shell交互窗口,这个交互窗口可以与MicroPython的REPL(Read-Eval-Print Loop)进行交互,发送命令。该软件安装流程及使用,请用户参考第四章的内容。
3.3.2 REPL的快捷键
在REPL提供了不少快捷键,使用这些快捷键可以有效减少按键的次数,提供代码输入效率。REPL常用的快捷键如下表所示。
表3.3.2.1 RERL快捷键列表
按下CTRL+D,将执行软件复位,复位完成后显示以下内容:
MPY: soft reboot MicroPython v1.22.0-preview.31.g3883f2948.dirty on 2023-11-15; Generic ESP32S3 module with Octal-SPIRAM with ESP32S3 Type "help()" for more information. >>>
Tab键在输入代码时是最常用的功能之一,它可以帮助我们快速补全代码,提高输入效率,比如在Thonny工具的终端Shell中,输入“ma”,然后按下Tab键,它就会提示相关信息,如下图所示。
图3.3.2.1 Tab键列出可能的选项
3.3.3 help()函数的作用
在Python中,我们可以使用help()函数来获取关于特定对象、模块、函数或类的详细帮助信息。在MicroPython中,这个功能同样得到了支持。在REPL(交互式命令行)环境下,直接输入help(),将会显示一个基本的帮助界面。这个界面提供了关于MicroPython中machine特定库以及REPL用法的信息,可以帮助我们更好地了解基本的命令和函数。
Welcome to MicroPython on the ESP32! For online docs please visit http://docs.micropython.org/ For access to the hardware use the 'machine' module: # machine特定库的示例 import machine pin12 = machine.Pin(12, machine.Pin.OUT) pin12.value(1) pin13 = machine.Pin(13, machine.Pin.IN, machine.Pin.PULL_UP) print(pin13.value()) i2c = machine.I2C(scl=machine.Pin(21), sda=machine.Pin(22)) i2c.scan() i2c.writeto(addr, b'1234') i2c.readfrom(addr, 4) Basic WiFi configuration: import network sta_if = network.WLAN(network.STA_IF); sta_if.active(True) sta_if.scan() # Scan for available access points sta_if.connect("", " ") # Connect to an AP sta_if.isconnected() # Check for successful connection # REPL快捷键功能描述 Control commands: CTRL-A -- on a blank line, enter raw REPL mode CTRL-B -- on a blank line, enter normal REPL mode CTRL-C -- interrupt a running program CTRL-D -- on a blank line, do a soft reset of the board CTRL-E -- on a blank line, enter paste mode For further help on a specific object, type help(obj) For a list of available modules, type help('modules')
从上述可知,我们可通过help(模块名或函数名)查看更详细的帮助,如查看machine模块中的Pin类接口等详细帮助:
>>> import machine >>> help(machine.Pin) objectis of type type init -- value -- off -- on -- irq -- board -- IN -- 1 OUT -- 3 OPEN_DRAIN -- 7 PULL_UP -- 2 PULL_DOWN -- 1 IRQ_RISING -- 1 IRQ_FALLING -- 2 WAKE_LOW -- 4 WAKE_HIGH -- 5 DRIVE_0 -- 0 DRIVE_1 -- 1 DRIVE_2 -- 2 DRIVE_3 -- 3 >>>
首先,我们使用import导入machine模块,然后可以通过help()函数来获取machine模块中Pin类的接口等相关帮助信息。根据上述内容可知,
help()函数可以一级一级深入查看,如:
>>> help(machine.Pin.init) objectis of type function >>> help(machine.Pin.value) object is of type function >>>
上述内容可知,machine特定库的Pin类中的init和value方法是一个函数类型。如果开发者能够灵活利用help()函数,就可以查看大部分函数的基本用法和很多常量定义,甚至不需要看手册就能够知道该接口的用法。
3.3.4 查看模块包含的变量和函数
在Python中,使用dir()函数可以查看一个模块内部包含的所有变量和函数。同样,MicroPython也支持这个函数。通过使用dir()函数,我们可以快速查看当前系统已经导入了哪些模块:
>>> import machine >>> dir() ['__name__', 'os', '__thonny_helper', 'gc', 'bdev', 'machine'] >>>
在MicroPython中,我们首先需要导入machine模块,然后使用dir()函数来查看系统已经导入了哪些模块。在系统信息提示中,我们可以看到已经包含了machine模块的信息。
也可以通过dir()函数查看模块内部的变量和函数,与help()函数一样,dir()函数也可以深入到模块内部:
>>> import machine >>> dir() ['__name__', 'os', '__thonny_helper', 'gc', 'bdev', 'machine'] >>> dir(machine) ['__class__', '__name__', '__dict__', 'ADC', 'ADCBlock', 'DEEPSLEEP', 'DEEPSLEEP_RESET', 'EXT0_WAKE', 'EXT1_WAKE', 'HARD_RESET', 'I2C', 'I2S', 'PIN_WAKE', 'PWM', 'PWRON_RESET', 'Pin', 'RTC', 'SDCard', 'SLEEP', 'SOFT_RESET', 'SPI', 'Signal', 'SoftI2C', 'SoftSPI', 'TIMER_WAKE', 'TOUCHPAD_WAKE', 'Timer', 'TouchPad', 'UART', 'ULP_WAKE', 'WDT', 'WDT_RESET', 'bitstream', 'bootloader', 'deepsleep', 'dht_readinto', 'disable_irq', 'enable_irq', 'freq', 'idle', 'lightsleep', 'mem16', 'mem32', 'mem8', 'reset', 'reset_cause', 'sleep', 'soft_reset', 'time_pulse_us', 'unique_id', 'wake_reason'] >>>
作者希望开发者善于利用help()和dir()函数,在调试与输入代码时,更够帮助我们查看内部变量和函数名称,了解模块的功能和用法。