【摘要】 Python 是为嵌入式系统编写代码的绝佳选择。它使您能够更快地开发您的代码,并提供您在低级语言中找不到的安全保证。您现在已经掌握了使用 Python 开始嵌入式开发之旅的知识,并熟悉了一些可用的选项。
目录
编写在终端或 Web 浏览器中运行的代码非常有趣。然而,编写影响现实世界的代码可以在另一个层面上令人满意。编写这种代码称为嵌入式开发,而 Python 使它比以往任何时候都更易于访问!
在本教程中,您将学习:
本教程包含允许您在BBC micro:bit上构建简单游戏的代码片段。要访问完整代码并预览您将要构建的内容,请单击以下链接:
嵌入式开发是为任何非通用计算机的设备编写代码。这个定义有点模棱两可,所以一些例子可能会有所帮助:
作为一般经验法则,如果您不会将某物称为计算机,但它仍然运行着代码,那么它可能是一个嵌入式系统。该名称来自将计算机嵌入物理系统以执行某些任务的想法。
嵌入式系统往往被设计为完成一项任务,这就是为什么我们将常规计算机称为“通用”:它们被设计为完成多项任务。
就像您需要计算机来运行常规代码一样,要运行嵌入式代码,您也需要某种硬件。这些硬件通常称为开发板,本教程将向您介绍一些旨在运行 Python的硬件。
学习 Python 最好的事情之一是它适用于很多地方。您可以编写可以在任何地方运行的代码,甚至可以在嵌入式系统上运行。在本节中,您将了解在嵌入式项目中使用 Python 所带来的权衡以及开始时需要注意的一些事项。
Python 在构建嵌入式系统时带来的核心优势是开发速度。Python 具有可用于大多数任务的库,这仍然适用于其嵌入式实现。您可以专注于构建您的系统,因为您遇到的许多问题已经得到解决。
由于 Python比其他常见的嵌入式语言级别更高,因此您将编写的代码会更加简洁。这有助于提高开发速度,这意味着您可以更快地编写代码,但它也有助于保持您的代码易于理解。
Python 是内存管理的。C++ 是嵌入式开发的常见选择,但不是。在 C++ 中,您有责任在完成后释放内存,这是很容易忘记的事情,导致程序内存不足。Python 为你做这件事。
虽然 Python 的内存管理有很大帮助,但它确实会导致较小的速度和内存成本。MicroPython 文档对内存问题进行了很好的讨论。
另一件要考虑的事情是 Python解释器本身占用空间。对于编译语言,程序的大小仅取决于您的程序,但 Python 程序需要运行它们的解释器。Python 解释器也占用 RAM。在 micro:bit 上,你不能用 Python 编写蓝牙代码,因为 Python 和蓝牙没有足够的空间同时使用。
由于Python是解释,但绝不能因此相当快编译语言。解释型语言需要在运行前解码每条指令,但编译型语言可以直接运行。然而,在实践中,这很少重要,因为 Python 程序对于大多数用例来说仍然运行得足够快。
现代计算机有大量内存可供使用。当您对它们进行编程时,您不必太担心您创建的列表的大小或一次加载整个文件。然而,嵌入式系统的内存有限。编写程序时必须小心,不要一次在内存中存储太多东西。
同样,嵌入式系统上的处理器速度比台式计算机慢得多。处理器速度决定了代码执行的速度,因此在嵌入式计算机上运行程序比在台式计算机上运行需要更长的时间。考虑嵌入式代码的效率更为重要——您不希望它永远运行!
对嵌入式系统进行编程时,最大的变化可能是电源要求。笔记本电脑、电话和台式电脑要么插入墙上,要么配备大电池。嵌入式系统通常具有微型电池,并且必须持续很长时间,有时甚至数年。您运行的每一行代码都会消耗一点电池寿命,而这一切都会加起来。
以下是您在开始时应该注意的其他一些事项:
嵌入式开发是一个很大的领域,有很多新人需要学习。不过现在,请记住在嵌入式系统上编写精益代码更为重要。这使得嵌入式系统非常有助于提高代码的学习效率!
在编写任何嵌入式代码之前,您必须选择您的代码将在什么硬件上运行。有大量可用的开发板可供选择,即使在运行 Python 的开发板中也是如此。您的选择将取决于您使用它们的项目。在本节中,您将介绍一些可用选项。
在BBC微:位是专为教育用途的嵌入式系统。在 micro:bit 上,有很多组件,包括按钮、5x5 LED 屏幕、扬声器和麦克风、加速度计和蓝牙模块。不幸的是,蓝牙模块无法与 Python 一起使用,但您仍然可以直接使用无线电。它可以在 Scratch、JavaScript和最重要的 Python 中编程。
这是背面的一张照片,显示了一些可用的很酷的组件:
micro:bit 有很多很棒的在线资源,可以帮助您开始并提出项目想法。
大多数 Raspberry Pi 在技术上是单板计算机而不是嵌入式系统,但它们仍然允许通过其 GPIO 引脚访问外部硬件。该规则的一个例外是Raspberry Pi Pico,它是一种微控制器开发板。其他 Raspberry Pi 运行 Linux,这意味着您可以将它们用作完整的计算机,并且所有 Pis 开箱即用地支持 Python。
有几种不同型号的 Raspberry Pi 可用,但它们都能够运行 Python 并使用电子设备。您应该选择哪种模型取决于您的项目需求。这是最新型号之一:
您可以在官方网站上找到有关 Raspberry Pi 不同型号的更多信息。有关可以使用 Raspberry Pi 和 Python创建的项目示例,请查看在 Raspberry Pi 上使用 Python 构建物理项目。
该pyboard是一个电子产品开发板被设计为运行MicroPython。它比 micro:bit 强大得多,但没有任何额外的好东西,比如 micro:bit 的板载屏幕和传感器。这是pyboard 1.0:
您可能会注意到黑板上有很多金色圆圈。这些被称为引脚,用于将 pyboard 连接到其他电子元件。例如,如果您正在建造遥控汽车,您可能会将一些电机连接到它们。
有很多与 Python 兼容的板和套件,太多了,无法在此一一列出。但是,有一些有趣的值得一提:
MicroPython 兼容的板子比本教程所能容纳的要多得多。你应该做一些研究来为你的项目找到合适的。一个不错的起点可能是Adafruit 的 MicroPython 商店。
当您在计算机上安装 Python时,您通常会安装一个名为CPython的特定Python实现。Python 的实现是运行 Python 代码的程序。
您可以将 CPython 称为默认的 Python 实现,因为它是由定义语言本身的人编写的。然而,CPython 并不是 Python 的唯一实现。在本节中,您将了解一些专门针对编写嵌入式代码的实现。
MicroPython是事实上的标准嵌入式 Python 实现。它是一个 Python 3.x 实现,旨在在微控制器上运行。它不是 100% 兼容 CPython,但非常接近。这意味着,如果您编写了在 Python 3.4 以下版本上运行的代码,那么您很有可能让它在 MicroPython 中运行。
CircuitPython是MicroPython的一个分支,它支持略有不同的电路板列表,并进行了一些更改以使其对初学者更加友好。大多数情况下,您在使用 CircuitPython 时的体验与使用 MicroPython 时的体验非常相似。如果您的电路板仅支持它而不支持其他实现,您可以选择使用 CircuitPython。
没有什么比实际经验更重要的了,所以在本节中,您将在 BBC micro:bit 上构建一个 Simon Says 游戏。如果你没有,别担心!有在线模拟器可以帮助您入门。
西蒙说是一种儿童游戏,其中一个人向一组人发出指令。如果他们在指令前加上“西蒙说”,那么小组就必须这样做。如果他们在没有先说“西蒙说”的情况下给出指令,则该小组必须忽略该指令。为了让我们的游戏更简单,我们将只专注于提供指令的部分。
游戏将按以下方式运行:
在开始编码之前,您需要设置环境。
无论您是否拥有物理 micro:bit,开始编码的最快途径是使用可用的在线编辑器。在本教程中,您将使用create.withcode 编辑器。当您打开编辑器时,您将看到以下屏幕:
大部分屏幕都被文本缓冲区占据,您可以在其中输入代码。在右下角,您会看到一个播放按钮。这将让您在编写代码后运行代码。
您的游戏需要做的第一件事是提出一个方向并将其告诉玩家。对于本场比赛的目的,你可以使用三个方向:left
,right
,和stay still
。您的代码需要选择这些方向之一并将其显示给玩家。这将被包装在一个无限while
循环中,以便它可以多次运行。
注意:无限while
循环在嵌入式编程中比在其他类型的编程中更常见。这是因为嵌入式系统往往只做一项工作,所以不存在挂断系统和阻止其他程序运行的风险。
您的代码可能如下所示:
from microbit import *
from random import randrange
# Define left, stay still, and right
directions = ["L", "O", "R"]
# While the micro:bit is on
while True:
# Pick a random direction
direction = directions[randrange(3)]
display.show(direction)
# Sleep for a second (1000ms)
sleep(1000)
此代码将每秒显示不同的随机方向。前两行导入必要的函数:
microbit
模块包含与 micro:bit 接口所需的所有代码。例如,display
和accelerometer
模块在这里。该microbit
模块在 micro:bit 上预加载了 MicroPython,因此如果您在计算机上运行代码时尝试导入它,则可能会遇到错误。random
模块允许您选择一个随机数。在导入之后,代码定义了directions
列表。这包含代表可用方向的三个字符。用字符定义这个列表的好处是它们可以直接显示,因为 micro:bit 屏幕一次只有一个字符的空间。
该while True:
环告诉微:位永远运行里面的代码。实际上,这意味着它会在 micro:bit 通电时运行。在里面,代码首先选择一个随机方向randrange()
并显示它。之后,它会睡一秒钟。这会迫使 micro:bit 一秒钟不做任何事情,从而确保玩家有时间看到指令。
现在你有一些代码,你可以运行它!幸运的是,您不需要 micro:bit 来运行您的代码,因为您的编辑器带有内置模拟器。您可以通过单击右下角的播放按钮访问它并运行您的代码。
当您单击播放按钮时,您将在编辑器中看到以下叠加弹出窗口:
在其中,您将看到一个 micro:bit,屏幕应显示方向列表中的随机字符。如果没有,请尝试将上面的代码复制到编辑器中,然后再次单击播放按钮。
注意: create.withcode 模拟器是一个很好的资源,但它有时会有点问题。如果您遇到问题,以下可能会有所帮助:
如果您是一名更高级的编码员,您可以使用Device Simulator Express 扩展和伪 microbit 模块将Visual Studio Code设置为 micro:bit 开发环境以进行代码自动完成。
这是您将在本教程的其余部分遵循的一般开发流程。
如果你有一个物理 micro:bit,那么运行你的代码需要几个额外的步骤。您需要下载一个.hex
文件,然后将其复制到您的 micro:bit 上。
要下载.hex
文件,请在编辑器中查找以下按钮:
这将要求您将文件保存到您的计算机。保存它,然后抓住你的 micro:bit。使用 USB 数据线将您的 micro:bit 连接到您的计算机。您应该会看到它以与 USB 驱动器相同的方式出现。
要对 micro:bit 进行编程,请将下载的.hex
文件拖到您的 micro:bit 上。micro:bit 背面的红色 LED 应闪烁。一旦它停止,您的程序就会加载到设备上并立即开始执行!
提示:以下是一些提示,如果您遇到困难,可能会有所帮助:
你必须非常努力地打破你的 micro:bit!如果出现问题,请仔细检查您的代码,不要害怕尝试,即使您不确定它是否会起作用。
既然您已经为开发设置了 micro:bit,您就可以继续进行一些编码了。
现在 micro:bit 可以告诉玩家该做什么,是时候获取玩家的输入了。为此,您将使用加速度计。加速度计是一种测量运动的装置。它可以判断 micro:bit 是否在向特定方向移动,对于游戏来说,重要的是 micro:bit 是否在特定方向倾斜。看看下面的图表:
在图中,您将看到三个轴:X、Y 和 Z。它们就像您在学校的图表中可能看到的轴一样。X 轴代表左右运动,Y 轴代表上下运动,Z 轴代表朝向或远离您的运动。
micro:bit 上的加速度计返回来自这三个轴的值。由于您的游戏只关心向左和向右倾斜,因此您现在只需要 X 轴。accelerometer.get_x()
返回范围内的值(-2000, 2000)
,其中-2000
一直向左2000
倾斜并一直向右倾斜。
您获取玩家输入的代码需要执行三个步骤:
这是完成这些步骤的代码:
# Previous code...
while True:
# Previous code...
# Get the X-axis (left-right) tilt
acc_x = accelerometer.get_x()
# Determine direction
if acc_x < -200:
player_in = "L"
elif abs(acc_x) < 200:
player_in = "O"
elif acc_x > 200:
player_in = "R"
# Check win condition
if player_in == direction:
# Player input correctly
display.show(Image.HAPPY)
else:
display.show(Image.SAD)
sleep(1000)
这段代码有点长,因为你必须检查很多不同的条件。您要做的第一件事是从加速度计中获取 X 轴值accelerometer.get_x()
。请记住,这将在范围内(-2000, 2000)
。
获得 X 值后,您将执行一系列检查以找出它代表的运动。任何大于200
任一方向的值都被认为是倾斜的,小于任一方向的值都被认为200
是静止的。
abs()
通过从加速度计值中去除负号来帮助缩短代码。这意味着该范围内的数字(-200, 200)
将被视为保持静止。您可能希望使用该阈值来使游戏或多或少具有挑战性。
从播放器获得方向输入后,您检查它是否正确。如果方向正确,则代码会显示一张快乐的脸。否则,它会显示出悲伤的脸。然后代码会休眠一秒钟,让玩家可以看到结果,而不会很快消失。
由于加速度计是检测物理运动的传感器,您可能想知道如何在模拟器中与其交互。幸运的是,模拟器提供了一个可以用鼠标控制的虚拟加速度计。
以与之前相同的方式运行您的代码,方法是单击右下角的播放按钮。您将看到 micro:bit 叠加层出现。覆盖层顶部有一些选项卡,用于控制 micro:bit 的各种组件。单击标有Accelerometer的选项卡。
在此选项卡中,您将看到三个滑块,每个轴一个。您将使用 X 轴滑块来测试您的游戏。
当您向右移动滑块时,加速度计的 X 值将增加。同样,当您向左移动滑块时,X 值将减小。这相当于向左和向右倾斜 micro:bit 并允许您在浏览器中玩游戏。
现在基本游戏已经到位,是时候考虑增加点数和输球来完成游戏了。请记住规范中描述的行为是,当玩家输了时,micro:bit 将显示玩家达到该点的总点数。如果玩家做对了,micro:bit 不应显示任何内容:
# Previous code...
points = 0
while True:
# Previous code...
if player_in == direction:
# Player's input is correct
points += 1
else:
display.scroll(points)
display.show(Image.SAD)
points = 0
sleep(1000)
值得庆幸的是,这比上一步的变化要小。在while
循环之外,您定义一个将跟踪玩家点数的变量 points
。
再往下,您更改了对玩家输入是否在正确方向上的检查。如果玩家移动了正确的方向,他们的总分就会增加1
。否则,您可以使用 使总点数在屏幕上滚动display.scroll()
,显示出悲伤的脸,然后重置总点数。
您还会sleep()
进入丢失代码,因为没有显示图像以使其正确。这使游戏更具挑战性!
为了帮助您检查代码并巩固所学知识,以下是游戏的完整代码:
from microbit import display, Image, accelerometer, sleep
from random import randrange
# Define left, stay still, and right
directions = ["L", "O", "R"]
points = 0
# While the micro:bit is on
while True:
# Pick a random direction
direction = directions[randrange(3)]
display.show(direction)
# Sleep for a second (1000ms)
sleep(1000)
# Get the X-axis (left-right) tilt
acc_x = accelerometer.get_x()
# Determine direction
if acc_x < -200:
player_in = "L"
elif abs(acc_x) < 200:
player_in = "O"
elif acc_x > 200:
player_in = "R"
# Check win condition
if player_in == direction:
# Player's input is correct
points += 1
else:
display.scroll(points)
display.show(Image.SAD)
points = 0
sleep(1000)
恭喜您构建了自己的游戏!您会注意到这段代码只占用了 30 多行,包括注释,这比传统嵌入式语言中的等效程序要短得多。
至此,您已经在嵌入式系统上构建了一个完整的游戏!如果你想要一些额外的挑战,这里有一些想法:
这个列表不是确定的,而是应该让你思考。如果你想出一个很酷的方法来扩展游戏,那么请在评论中分享!
嵌入式开发是一个巨大的领域,需要学习很多东西。如果您想了解有关使用 Python 进行嵌入式开发的更多信息,那么值得庆幸的是,那里有很多很棒的资源。这里有一些链接可以帮助您入门。
关于 micro:bit 最好的事情之一是那里有大量的教育资源:
Micro:bit 教育基金会最近发布了micro:bit的第二个版本,有望激发全新的资源浪潮。
micro:bit 并不是唯一的板子。绝对值得探索为您的项目找到合适的:
有更多有趣的设备可以运行 Python。您一定会找到适合您项目的一款。
Python 是为嵌入式系统编写代码的绝佳选择。它使您能够更快地开发您的代码,并提供您在低级语言中找不到的安全保证。您现在已经掌握了使用 Python 开始嵌入式开发之旅的知识,并熟悉了一些可用的选项。
在本教程中,您学习了:
嵌入式开发是一个广阔而令人兴奋的领域,充满了有趣的发现。继续学习,并确保在下面的评论中分享您的发现!
本文系外文翻译,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系外文翻译,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。