虽然 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)