面向基于微控制器的快速原型设计与开发的 CircuitPython 基础知识

虽然 Python 语言让编程变得更加简单,但它最初的设计目的是在拥有足够的处理、内存和外设资源的个人电脑及其他机器上运行。而对于面临较严格的资源和接口限制的嵌入式系统,针对微控制器优化的版本 MicroPython 日益受到欢迎。甚至开源社区也一直在针对特定的微控制器和开发板来修改 MicroPython,以支持严谨的微控制器开发工作。

本文将介绍其中一种修改版,即 Adafruit 的 CircuitPython。本文将首先对 Python 进行简要介绍,并与传统嵌入式开发语言 C++ 进行比较,然后讨论 Python 如何演变成 MicroPython 以及现在的 CircuitPython。接下来,本文将描述使用 CircuitPython 编写软件的过程,随后还介绍 Adafruit 和其他供应商提供的几种支持 CircuitPython 环境的开发板。

选择 Python 的原因

最初的 Arduino 开发板及其诸多后续产品都是深受用户欢迎的微控制器开发板,适用于创客、业余爱好和学生项目,以及嵌入式原型。但是,Arduino IDE 和编程语言基于 C++,这是一种功能强大但又复杂的编译语言,语法怪异,标点规则僵化,令众多新手程序员望而生畏。

Python 是一种更新的编程语言。它是面向对象的解释型交互语言,将出色的编程功能与极其清晰的语法集于一体。该语言以可写性和可读性以及简化的语法而著称。这些特性结合在一起,可减少编程错误的数量,简化代码重复使用,从而加快软件开发速度。

该语言的解释型特性可为程序员提供即时反馈,鼓励他们进行试验和快速学习。出于这些原因,Python 现在成为众多学生和创客学习的首选编程语言。

但 Python 有一个缺憾,其设计目的是在个人电脑和大型机器上运行,这些设备拥有足够的 RAM、大量存储空间和完整用户界面,还配备了键盘、大型显示器和鼠标。它并不用作嵌入式编程语言。但是,Python 3 编程语言有一个名为 MicroPython 的精简高效版本,它经过专门创建和优化,可在微控制器的受限资源中运行。

开源社区认识到 MicroPython 作为嵌入式编程语言的前景,一直在针对特定的微控制器和开发板来修改 MicroPython,以支持严谨的微控制器开发工作。例如,Adafruit 开发了符合自身需求的 MicroPython,名为 CircuitPython。CircuitPython 旨在简化低成本微控制器板上编程任务的试验和学习过程,它是针对 Adafruit 开发板上的微控制器和硬件资源而量身定制。CircuitPython 预安装在 Adafruit 的几款开发板上,也可安装在其他开发板上。

C++ 和 Python 之间的差异

鉴于 Arduino IDE 的强劲发展势头和普及,而且市场上有很多 Arduino 开发板,我们有理由要问:为什么需要专用版本的 Python 来进行嵌入式开发?通过对两种语言进行比较,我们可以知道答案。

C++ 是旧版 C 语言的扩展,提供面向对象的扩展。即便有了这些扩展,C++ 代码还是有些晦涩难懂,因为它保留了 C 语法,这种语法最初是由贝尔实验室的 Kernigan 和 Ritchie 在上世纪 60 年代末和 70 年代初创建。C 语言原先的目的是要容易地映射到目标处理器的机器指令。该语言更加偏重于机器的需求,而非程序员的需求,这一点在其语法中体现得格外明显。由于商用微处理器直到 1971 年才出现,因此 C 语言最初是针对小型计算机而开发。上世纪 80 年代,微处理器的 C 编译器逐渐演进为有用工具。C 语言一直是编译型语言,C++ 也同样如此。

丹麦计算机科学家 Bjarne Stroustrup 在 1979 年开始开发 C++。他撰写的第一本有关该语言的教科书在 1985 年问世,而 C++ 直到 1998 年才成为标准编程语言。与 C 语言相同,Stroustrup 的 C++ 语言最初也是面向大型计算机。2003 年开发的 Arduino IDE(集成开发环境)使得 C++ 适用于微控制器。

Python 也是面向对象的语言。它由荷兰程序员 Guido van Rossumin 开发,最初在 1991 年发布。Python 的语法设计重点强调代码对于人的可读性 — 这是 Python 和 C++ 之间的一个关键差异。可写性与可读性密切相关,这是 Python 的另一大特点。可写性意味着 Python 受到程序员的广泛赞誉,它让程序员能够更快速地编写应用程序,这样可以鼓励试验,缩短原型设计和开发周期。

第二个主要差异在于 Python 是一种解释型语言,这一点与 Basic 编程语言非常相似。后者最初出现在上世纪 60 年代,针对小型计算机而开发,之后随着微型计算机的引入,在 70 年代真正得以蓬勃发展。与 Basic 相同,Python 的解释型特性摒弃了用于编译编程语言的编辑/编译/下载/运行开发周期,从而鼓励试验和学习。但与 Basic 不同的是,Python 是一种更高级别的面向对象的现代语言,它融合了自最初开发 Basic 以来半个世纪内,我们在计算机科学领域取得的进步成果。

例如,Python 的变量无需在使用之前进行声明和指定类型。程序员无需担忧某个变量应该是整数还是浮点数。Python 解释器可以解决该问题,并在运行时做出适当的选择。

C++ 和 Python 之间的另外两个差异是字符串处理和标点。很多程序员发现 C++ 中的字符串处理不仅麻烦,而且令人困惑。Python 的字符串处理则要简单得多,让人很容易想到 Basic 的深受大家喜爱的简单字符串处理功能,它长期以来都被视为 Basic 的一大优点。

同样,C 和 C++ 语言的标点 — 特别是大括号 ({})— 对于新手甚至是经验丰富的程序员来说,都是另一块会经常遇到的绊脚石。程序员总是感觉程序中似乎有奇数个大括号,这意味着他们必须深入检查代码,找到缺失的大括号所应该放置的位置。Python 没有繁琐的标点,但确实使用了缩进,增加了 Python 代码的可读性。

MicroPython 的起源

与 C 和 C++ 相同,Python 最初的设计目的也是在大型计算机上运行。因此,该语言需要过多的资源来用于微控制器编程。澳大利亚程序员兼物理学家 Damien George 因此开发了一个名为 MicroPython 的 Python 版本,可在微控制器更有限的资源上运行。Arduino 开发板是 MicroPython 的早期硬件目标。

MicroPython 的交互特性集中体现在它的命令界面上,该界面的正式名称为 REPL(读取-求值-输出-循环)窗口,通常通过串行连接(将主机 PC 连接到微控制器开发板)运行。REPL 界面与上世纪 70 年代和 80 年代的 Basic 命令行界面非常相似。该界面接受用户输入(单个表达式或语句),对其进行计算,然后通过 REPL 窗口将结果返回给用户,或者执行嵌入在语句中的命令。

使用 REPL 界面,可以查询变量、切换 I/O 行,或将字符串发送到相连的外设。命令行经过解析后,一旦按下 Enter 键,便会立即执行。这是解释型语言的特性。

MicroPython 的这种特性有利于探索性的编程和调试,也是使得 MicroPython 语言易于使用的诸多方面之一,无论对于初学者还是经验丰富的程序员都是如此。与 Arduino IDE 的传统“编辑-编译-运行-调试”周期相比,REPL 用户界面有助于缩短开发周期。即使经验丰富的程序员也能够使用 MicroPython 的 REPL 用户界面,以交互方式来试验新类型的外设,并因此从中受益。

CircuitPython 对开发板的支持

每个微控制器都有一系列独特的外设,各开发板也不例外。这些外设需要支持库,对于 Arduino IDE 和 MicroPython 来说也是如此。此外,还有很多附加的外设,例如 Adafruit 的 1655 NeoPixel 可寻址 RGB LED,它们也需要库支持。

为了提供更高程度的支持,Adafruit 开发了自己的 MicroPython 版本,名称为 CircuitPython,旨在满足该公司的一些廉价微控制器开发板的特定需求。该公司还将来自庞大 Arduino 集合的很多外设库转换为 CircuitPython 库,为 CircuitPython 提供大量的外设支持库,而且还在不断增加。

Adafruit 设计了一系列微控制器开发板,以特意支持 CircuitPython,其中包括:

  • 3333 Circuit Playground Express,带有十个可寻址、可控制的 RGB LED(图 1)

Adafruit 的 3333 Circuit Playground Express 图片

图 1:Adafruit 的 3333 Circuit Playground Express 带有十个可寻址、可控制的 RGB LED。(图片来源:Adafruit)

  • 3500 Trinket M0 开发板,外形尺寸仅为 27 mm x 15.3 mm x 2.75 mm(图 2)

Adafruit 的 3500 Trinket M0 开发板图片

图 2:Adafruit 的 3500 Trinket M0 开发板的外形尺寸仅为 27 mm x 15.3 mm x 2 mm。(图片来源:Adafruit)

  • 3501 Gemma M0 的尺寸大约与 25 美分硬币相同,可从其 USB 端口或单独电池端口供电(图 3)。

Adafruit 的 3501 Gemma M0 图片

图 3:Adafruit 的 3501 Gemma M0 的尺寸大约与 25 美分硬币相同,可从其 USB 端口或单独电池端口供电。(图片来源:Adafruit)

  • 3403 Feather M0 Express 是一款开发板,带有小的试验板区域,用于定制电路(图 4)

Adafruit 的 3403 Feather M0 Express 开发板图片

图 4:Adafruit 的 3403 Feather M0 Express 开发板带有小的试验板区域,用于定制电路。(图片来源:Adafruit)

这四款 Adafruit 微控制器开发板都基于 Microchip Technology(前身为 Atmel)的 SAMD21 微控制器,提供原生 USB 支持。但是,CircuitPython 支持的器件不仅仅是 Adafruit 开发板和 SAMD21 微控制器。适用于其他开发板和微控制器的 CircuitPython 版本也开始出现,其中包括 Adafruit 的 3406 Feather NRF52 和 Nordic Semiconductor 的 nRF52-DK 开发板,它们都基于 Nordic Semiconductor 的 nRF52832 微控制器。此外,CircuitPython 还支持 Nordic Semiconductor 的 nRF52840-DK 开发板(图 5),该开发板基于该公司的 nRF52840 微控制器。这三款开发板所基于的两种微控制器都在芯片上集成了低功耗蓝牙 (BLE) 技术,并提供适当的软件支持。

Nordic Semiconductor 的 nRF52840-DK 开发板图片

图 5:Nordic Semiconductor 的 nRF52840-DK 开发板集成了 BLE 支持功能。(图片来源:Nordic Semiconductor

使用 CircuitPython 进行开发

Adafruit 已采用一种独特的方法,将 CircuitPython 装载到直接支持该语言的开发板上。将上述开发板中的其中一块插入主机 PC 的 USB 端口,该开发板将显示为 PC 的磁盘驱动器。该磁盘驱动器的根目录显示关键的 CircuitPython 文件,包括解释器和用户程序,以及一个包含库文件的文件夹。这种布置让主机 PC 能够使用现有文件系统和驱动程序,轻松地访问开发板。

主机 PC 上的 CircuitPython 用户界面需要可下载的免费开源编辑器和 REPL 界面。Adafruit 推荐使用名为 Mu 的开源应用程序,如图 6 所示。Mu 屏幕分为代码窗口和 REPL 控制及监控窗口,程序员可在前一个窗口中进行编辑,在后一个窗口中控制开发板的 CircuitPython 解释器。

名为 Mu 的 Adafruit 开源编程界面的图片

图 6:Adafruit 推荐使用名为 Mu 的开源编程界面。Mu 屏幕分为代码窗口和 REPL 控制及监控窗口,程序员可在前一个窗口中进行编辑,在后一个窗口中控制开发板的 CircuitPython 解释器。(图片来源:codewith.mu/en/tutorials/1.0/adafruit)

在代码窗口中键入程序,然后单击 Mu 的“保存”按钮,即可将代码保存在 Adafruit 的 CircuitPython 开发板上,该板位于 SAMD21 微控制器的大型片上闪存中。所有 CircuitPython 代码都位于微控制器闪存中的开发板上。请记住,CircuitPython 开发板看起来就像 PC 的一个磁盘驱动器,因此从操作系统的视角来看,这属于常见操作。

总结

Python 语言为程序员带来了诸多益处,包括交互式的编程、试验和调试。它提供简化且更人性化的语法,无需进行变量声明和类型指定,也没有繁琐的标点。MicroPython 是 Python 3 的另一个版本,它让我们能够使用 Python 进行微控制器编程。

正如本文所述,Adafruit 已对 MicroPython 进行修改,开发了 CircuitPython,旨在直接支持硬件,进一步简化试验和学习,并且加快软件开发。CircuitPython 已经可以支持多个低成本微控制器开发板(基于 Microchip 的 SAMD21 微控制器),以及其他开发板(基于 Nordic Semiconductor 的支持 BLE 的 nRF 微控制器)。

  • 面向基于微控制器的快速原型设计与开发的 CircuitPython 基础知识已关闭评论
    A+
发布日期:2019年07月14日  所属分类:参考设计