嵌入式 Python:在 BBC micro:bit 上构建游戏

举报
Yuchuan 发表于 2021/09/17 09:10:21 2021/09/17
【摘要】 Python 是为嵌入式系统编写代码的绝佳选择。它使您能够更快地开发您的代码,并提供您在低级语言中找不到的安全保证。您现在已经掌握了使用 Python 开始嵌入式开发之旅的知识,并熟悉了一些可用的选项。

目录

编写在终端或 Web 浏览器中运行的代码非常有趣。然而,编写影响现实世界的代码可以在另一个层面上令人满意。编写这种代码称为嵌入式开发,而 Python 使它比以往任何时候都更易于访问!

在本教程中,您将学习:

  • 什么是嵌入式开发以及为什么要使用 Python 来完成它
  • 在嵌入式系统上运行 Python 的硬件软件选项是什么
  • Python的是一个非常适合嵌入式系统时,它的不
  • 如何使用MicroPython在 BBC micro:bit 上编写基本游戏

本教程包含允许您在BBC micro:bit上构建简单游戏的代码片段。要访问完整代码并预览您将要构建的内容,请单击以下链接:

什么是嵌入式开发?

嵌入式开发是为任何非通用计算机的设备编写代码。这个定义有点模棱两可,所以一些例子可能会有所帮助:

  • 通用计算机包括笔记本电脑、台式电脑、智能手机等。
  • 嵌入式系统包括洗衣机、数码机、机器人等。

作为一般经验法则,如果您不会将某物称为计算机,但它仍然运行着代码,那么它可能是一个嵌入式系统。该名称来自计算机嵌入物理系统以执行某些任务的想法。

嵌入式系统往往被设计为完成一项任务,这就是为什么我们将常规计算机称为“通用”:它们被设计为完成多项任务。

就像您需要计算机来运行常规代码一样,要运行嵌入式代码,您也需要某种硬件。这些硬件通常称为开发板,本教程将向您介绍一些旨在运行 Python的硬件。

用于嵌入式开发的 Python

学习 Python 最好的事情之一是它适用于很多地方。您可以编写可以在任何地方运行的代码,甚至可以在嵌入式系统上运行。在本节中,您将了解在嵌入式项目中使用 Python 所带来的权衡以及开始时需要注意的一些事项。

使用 Python 的好处

Python 在构建嵌入式系统时带来的核心优势是开发速度。Python 具有可用于大多数任务的库,这仍然适用于其嵌入式实现。您可以专注于构建您的系统,因为您遇到的许多问题已经得到解决。

由于 Python比其他常见的嵌入式语言级别更高,因此您将编写的代码会更加简洁。这有助于提高开发速度,这意味着您可以更快地编写代码,但它也有助于保持您的代码易于理解。

Python 是内存管理的。C++ 是嵌入式开发的常见选择,但不是。在 C++ 中,您有责任在完成后释放内存,这是很容易忘记的事情,导致程序内存不足。Python 为你做这件事。

使用 Python 的缺点

虽然 Python 的内存管理有很大帮助,但它确实会导致较小的速度和内存成本。MicroPython 文档对内存问题进行了很好的讨论

另一件要考虑的事情是 Python解释器本身占用空间。对于编译语言,程序的大小仅取决于您的程序,但 Python 程序需要运行它们的解释器。Python 解释器也占用 RAM。在 micro:bit 上,你不能用 Python 编写蓝牙代码,因为 Python 和蓝牙没有足够的空间同时使用。

由于Python是解释,但绝不能因此相当快编译语言。解释型语言需要在运行前解码每条指令,但编译型语言可以直接运行。然而,在实践中,这很少重要,因为 Python 程序对于大多数用例来说仍然运行得足够快。

嵌入式开发新手需要注意的事项

现代计算机有大量内存可供使用。当您对它们进行编程时,您不必太担心您创建的列表的大小或一次加载整个文件。然而,嵌入式系统的内存有限。编写程序时必须小心,不要一次在内存中存储太多东西。

同样,嵌入式系统上的处理器速度比台式计算机慢得多。处理器速度决定了代码执行的速度,因此在嵌入式计算机上运行程序比在台式计算机上运行需要更长的时间。考虑嵌入式代码的效率更为重要——您不希望它永远运行!

对嵌入式系统进行编程时,最大的变化可能是电源要求。笔记本电脑、电话和台式电脑要么插入墙上,要么配备大电池。嵌入式系统通常具有微型电池,并且必须持续很长时间,有时甚至数年。您运行的每一行代码都会消耗一点电池寿命,而这一切都会加起来。

以下是您在开始时应该注意的其他一些事项:

  • 如果您的设备上有网络连接,那么它很可能很慢或不可靠。
  • 您可以选择的库要少得多。
  • 嵌入式系统通常没有大量的持久存储

嵌入式开发是一个很大的领域,有很多新人需要学习。不过现在,请记住在嵌入式系统上编写精益代码更为重要。这使得嵌入式系统非常有助于提高代码的学习效率!

运行嵌入式 Python 的硬件选项

在编写任何嵌入式代码之前,您必须选择您的代码将在什么硬件上运行。有大量可用的开发板可供选择,即使在运行 Python 的开发板中也是如此。您的选择将取决于您使用它们的项目。在本节中,您将介绍一些可用选项。

BBC micro:bit

BBC微:位是专为教育用途的嵌入式系统。在 micro:bit 上,有很多组件,包括按钮、5x5 LED 屏幕、扬声器和麦克风、加速度计和蓝牙模块。不幸的是,蓝牙模块无法与 Python 一起使用,但您仍然可以直接使用无线电。它可以在 Scratch、JavaScript和最重要的 Python 中编程。

这是背面的一张照片,显示了一些可用的很酷的组件:

BBC micro:bit 带包装

micro:bit 有很多很棒的在线资源,可以帮助您开始并提出项目想法。

Raspberry Pi

大多数 Raspberry Pi 在技术上是单板计算机而不是嵌入式系统,但它们仍然允许通过其 GPIO 引脚访问外部硬件。该规则的一个例外是Raspberry Pi Pico,它是一种微控制器开发板。其他 Raspberry Pi 运行 Linux,这意味着您可以将它们用作完整的计算机,并且所有 Pis 开箱即用地支持 Python。

有几种不同型号的 Raspberry Pi 可用,但它们都能够运行 Python 并使用电子设备。您应该选择哪种模型取决于您的项目需求。这是最新型号之一:

树莓派 4 B 型

您可以在官方网站上找到有关 Raspberry Pi 不同型号的更多信息。有关可以使用 Raspberry Pi 和 Python创建的项目示例,请查看在 Raspberry Pi 上使用 Python 构建物理项目

木板

pyboard是一个电子产品开发板被设计为运行MicroPython。它比 micro:bit 强大得多,但没有任何额外的好东西,比如 micro:bit 的板载屏幕和传感器。这是pyboard 1.0:

Pyboard 1.0 的前视图

您可能会注意到黑板上有很多金色圆圈。这些被称为引脚,用于将 pyboard 连接到其他电子元件。例如,如果您正在建造遥控汽车,您可能会将一些电机连接到它们。

其他

有很多与 Python 兼容的板和套件,太多了,无法在此一一列出。但是,有一些有趣的值得一提:

  • LoPy从Pycom连接到物联网等网络的专业互联网LORASigfox
  • 基于ESP8266的开发板都运行 MicroPython。ESP8266 是一种廉价的支持 Wi-Fi 的微控制器。它的继任者ESP32系列芯片也都运行 MicroPython。
  • Python 也可以在 Nintendo DS 上运行。对于初学者来说,设置看起来有点复杂,但是这个项目太有趣了,不能不提。

MicroPython 兼容的板子比本教程所能容纳的要多得多。你应该做一些研究来为你的项目找到合适的。一个不错的起点可能是Adafruit 的 MicroPython 商店

用于编写嵌入式 Python 的软件选项

当您在计算机上安装 Python时,您通常会安装一个名为CPython的特定Python实现。Python 的实现是运行 Python 代码的程序。

您可以将 CPython 称为默认的 Python 实现,因为它是由定义语言本身的人编写的。然而,CPython 并不是 Python 的唯一实现。在本节中,您将了解一些专门针对编写嵌入式代码的实现。

微Python

MicroPython是事实上的标准嵌入式 Python 实现。它是一个 Python 3.x 实现,旨在在微控制器上运行。它不是 100% 兼容 CPython,但非常接近。这意味着,如果您编写了在 Python 3.4 以下版本上运行的代码,那么您很有可能让它在 MicroPython 中运行。

电路Python

CircuitPythonMicroPython的一个分支,它支持略有不同的电路板列表,并进行了一些更改以使其对初学者更加友好。大多数情况下,您在使用 CircuitPython 时的体验与使用 MicroPython 时的体验非常相似。如果您的电路板仅支持它而不支持其他实现,您可以选择使用 CircuitPython。

项目:西蒙在 BBC micro:bit 上说游戏

没有什么比实际经验更重要的了,所以在本节中,您将在 BBC micro:bit 上构建一个 Simon Says 游戏。如果你没有,别担心!有在线模拟器可以帮助您入门。

西蒙说是一种儿童游戏,其中一个人向一组人发出指令。如果他们在指令前加上“西蒙说”,那么小组就必须这样做。如果他们在没有先说“西蒙说”的情况下给出指令,则该小组必须忽略该指令。为了让我们的游戏更简单,我们将只专注于提供指令的部分。

游戏将按以下方式运行:

  • micro:bit 会想到一个方向并告诉玩家。
  • 玩家将尝试朝那个方向倾斜 micro:bit。
  • 如果玩家设法及时正确地倾斜 micro:bit,那么他们就会得到一分!
  • 如果玩家没有及时做出正确的倾斜,那么 micro:bit 会显示他们的分数,游戏重新开始。

在开始编码之前,您需要设置环境。

设置您的环境

无论您是否拥有物理 micro:bit,开始编码的最快途径是使用可用的在线编辑器。在本教程中,您将使用create.withcode 编辑器。当您打开编辑器时,您将看到以下屏幕:

create.withcode 编辑器

大部分屏幕都被文本缓冲区占据,您可以在其中输入代码。在右下角,您会看到一个播放按钮。这将让您在编写代码后运行代码。

在屏幕上显示说明

您的游戏需要做的第一件事是提出一个方向并将其告诉玩家。对于本场比赛的目的,你可以使用三个方向:leftright,和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)

此代码将每秒显示不同的随机方向。前两行导入必要的函数:

  1. microbit模块包含与 micro:bit 接口所需的所有代码。例如,displayaccelerometer模块在这里。该microbit模块在 micro:bit 上预加载了 MicroPython,因此如果您在计算机上运行代码时尝试导入它,则可能会遇到错误。
  2. 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 上运行您的代码

如果你有一个物理 micro:bit,那么运行你的代码需要几个额外的步骤。您需要下载一个.hex文件,然后将其复制到您的 micro:bit 上。

要下载.hex文件,请在编辑器中查找以下按钮:

create.withcode 编辑器中的 Download HEX 按钮

这将要求您将文件保存到您的计算机。保存它,然后抓住你的 micro:bit。使用 USB 数据线将您的 micro:bit 连接到您的计算机。您应该会看到它以与 USB 驱动器相同的方式出现。

要对 micro:bit 进行编程,请将下载的.hex文件拖到您的 micro:bit 上。micro:bit 背面的红色 LED 应闪烁。一旦它停止,您的程序就会加载到设备上并立即开始执行!

提示:以下是一些提示,如果您遇到困难,可能会有所帮助:

  • 如果您需要从头开始重新启动程序,micro:bit 背面的 USB 连接器旁边有一个重置按钮。
  • 代码中的错误将在屏幕上滚动。如果您有耐心并观看它们,它们可以为您提供有关如何修复脚本的很好的线索。

你必须非常努力地打破你的 micro:bit!如果出现问题,请仔细检查您的代码,不要害怕尝试,即使您不确定它是否会起作用。

既然您已经为开发设置了 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倾斜并一直向右倾斜。

您获取玩家输入的代码需要执行三个步骤:

  1. 读取加速度计的 X 值。
  2. 确定该 X 值是代表向左、向右还是保持静止移动。
  3. 确定这是否是正确的移动方向。

这是完成这些步骤的代码:

# 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 多行,包括注释,这比传统嵌入式语言中的等效程序要短得多。

更进一步

至此,您已经在嵌入式系统上构建了一个完整的游戏!如果你想要一些额外的挑战,这里有一些想法:

  • 合并其他加速度计轴并将其变成Bop It的 micro:bit 版本!
  • 缩短玩家移动 micro:bit 的时间,如果他们得到正确的数字。你能做的最短时间是多少?你认为这是为什么?
  • 包括加速度计手势。开箱即用,micro:bit 可以检测到晃动、面朝下或面朝上,甚至自由落体。
  • 添加多人游戏功能,以便您可以与朋友一起玩。micro:bit 有一个无线电模块,允许 micro:bits 之间的通信。

这个列表不是确定的,而是应该让你思考。如果你想出一个很酷的方法来扩展游戏,那么请在评论中分享!

进一步阅读

嵌入式开发是一个巨大的领域,需要学习很多东西。如果您想了解有关使用 Python 进行嵌入式开发的更多信息,那么值得庆幸的是,那里有很多很棒的资源。这里有一些链接可以帮助您入门。

micro:bit 资源

关于 micro:bit 最好的事情之一是那里有大量的教育资源:

Micro:bit 教育基金会最近发布了micro:bit第二个版本,有望激发全新的资源浪潮。

其他运行 Python 的开发板

micro:bit 并不是唯一的板子。绝对值得探索为您的项目找到合适的:

有更多有趣的设备可以运行 Python。您一定会找到适合您项目的一款。

结论

Python 是为嵌入式系统编写代码的绝佳选择。它使您能够更快地开发您的代码,并提供您在低级语言中找不到的安全保证。您现在已经掌握了使用 Python 开始嵌入式开发之旅的知识,并熟悉了一些可用的选项。

在本教程中,您学习了:

  • 什么是嵌入式开发以及为什么要使用 Python 来完成它
  • 嵌入式系统编程和通用计算机有什么区别
  • 哪些选项可用于为嵌入式系统编写Python代码
  • 如何使用MicroPython在 BBC micro:bit 上编写基本游戏

嵌入式开发是一个广阔而令人兴奋的领域,充满了有趣的发现。继续学习,并确保在下面的评论中分享您的发现!

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。