Skip to content

Latest commit

 

History

History
512 lines (323 loc) · 22.2 KB

File metadata and controls

512 lines (323 loc) · 22.2 KB

九、在 micro:bit 上编程

在本章中,我们将介绍微:位微控制器。我们将探讨它的功能和它与其他微控制器相比的优势。本章结束时,您将学习如何在该微控制器上加载代码,控制其 LED 网格显示,以及如何与板上的按钮交互。本章以一个很好的项目结束,这样您就可以使用这个硬件创建一个倒计时计时器。每个 MicroPython 板都有自己的优势,最好知道有什么,以便为您的项目选择合适的硬件。

在本章中,我们将介绍以下主题:

  • 使用 Mu 将代码闪存到 micro:bit 上
  • 使用 Mu 在 micro:bit 上获取 REPL
  • 在 LED 显示屏上显示单个字符
  • 显示内置图像
  • 显示滚动文本
  • 显示按下了哪个按钮
  • 创建倒计时计时器

技术要求

本章的代码文件可在本书 GitHub 存储库的Chapter09文件夹中找到,可在上找到 https://github.com/PacktPublishing/MicroPython-Cookbook

本章中的食谱需要 BBC micro:bit 板和 Mu 文本编辑器。

微:位

微比特是由英国广播公司英国广播公司创建的,作为一个可以在英国用于教育目的的板。它大约是信用卡大小的一半,并且有许多输入和输出传感器,当你考虑它的尺寸时,这是令人惊讶的。它有一个加速计和一个磁强计。它有两个按钮和一个复位按钮。有一个 5 x 5 的 LED 阵列,可以作为基本显示器来显示不同的符号和字符。下图显示了此板的外观:

该板通过使用带 AAA 电池的外部电池组支持便携式电源。USB 连接用于将电路板连接到计算机,以便在上面传输脚本并运行 REPL。

使用 Mu 将代码闪存到 micro:bit 上

本食谱将向您展示如何将 Python 脚本闪存到 micro:bit。Mu 文本编辑器内置了对这种类型的电路板闪烁代码的支持,这个方法将引导您完成这个过程。一旦我们理解了这一点,我们就可以使用它来开发和加载我们需要的任何脚本到 micro:bit 板上。无论何时,只要您想要创建项目并使用 micro:bit 进行实验,这都是必不可少的第一步。

准备

您需要为此配方安装 Mu 文本编辑器。按照第 1 章MicroPython 入门中关于 Mu 文本编辑器安装的说明进行操作。

怎么做。。。

按照以下步骤学习如何使用 mu 将代码闪存到 micro:bit 上:

  1. 使用 USB 电缆将 micro:bit 连接到计算机。
  2. 启动 Mu 文本编辑器应用程序。
  3. 单击应用程序最左角的“模式”按钮,弹出以下对话框:

  1. 选择 BBC micro:bit 选项,然后按 OK。
  2. 在主文本编辑器窗口中放置以下代码块:
from microbit import display
display.show('x')
  1. 按下工具栏上的闪烁按钮,将代码闪烁到电路板上。以下屏幕截图突出显示了 Flash 按钮以供参考:

  1. 如果您查看电路板上的 LED 网格,它现在应该显示x字符。

它是如何工作的。。。

与 Circuit Playder Express 相比,micro:bit 采用不同的方法将代码加载到电路板上。该板要求您使用特定的软件,该软件了解如何使用 Python 脚本并将其闪存到这些类型的板上。Mu 文本编辑器完全支持此 MicroPython 板。最初的步骤需要配置 Mu,以便它能够与连接的 micro:bit 板交互。创建的脚本是一个简单的脚本,它从 micro:bit Python 库导入显示对象,并使用它在 LED 显示屏上显示x字符。

还有更多。。。

在 micro:bit 上闪烁代码时,最容易启动的程序是 Mu 文本编辑器。不过,还有其他可用选项,例如名为 uFlash 的命令行程序。使用命令行方法的价值在于,它为您提供了使用所选文本编辑器的灵活性,以便您可以编辑代码,然后在准备使用 uFlash 实用程序时刷新代码。

另见

以下是有关此配方的一些参考资料:

使用 Mu 在 micro:bit 上获取 REPL

此配方将基于我们在上一配方中介绍的方法。正如将脚本加载到板上是必要的一样,REPL 在调试脚本时也是必要的。当您尝试测试电路板或试图找出代码的错误时,REPL 将为您提供更丰富的界面。在 REPL 中,您可以获得回溯并查看 print 语句的输出。

准备

您需要安装和配置 Mu 文本编辑器,并将 micro:bit 板连接到计算机。

怎么做。。。

按照以下步骤学习如何使用 mu 在 micro:bit 上获取 REPL:

  1. 启动 Mu 文本编辑器应用程序。
  2. 单击工具栏中的 REPL 按钮,该按钮在以下屏幕截图中高亮显示:

  1. REPL 界面现在应显示在屏幕的下半部分,如以下屏幕截图所示:

  1. 在 REPL 中运行以下代码行:
>>> 1+1
2
  1. 运行以下代码块:
>>> import microbit
>>> microbit
<module 'microbit'>

microbit库现在已导入。

它是如何工作的。。。

Mu 文本编辑器内置了对许多板的 REPL 支持,包括 micro:bit。单击 REPL 按钮时,编辑器将尝试打开与电路板的串行连接。如果成功,它将在电路板上启动 REPL 会话。

REPL 中打印的初始文本显示了板上使用的 MicroPython 解释器的版本。此时,您在 REPL 提示符中键入的任何命令都将通过主板上评估的串行连接发送到主板。然后,它们的输出将返回到计算机,并显示在 REPL 屏幕上。

还有更多。。。

MicroPython REPL 附带了许多有用的函数,可以帮助您探索主板上可用的不同 Python 模块和对象。您可以在不同的模块和对象上调用help函数,以了解它们的详细功能。当您正在探索一个特定的对象,并想知道该对象上可用的属性和方法时,您可以使用dir函数在 REPL 会话中列出它们。

另见

以下是有关此配方的一些参考资料:

在 LED 显示屏上显示单个字符

此配方将向您展示如何使用随板提供的 5 x 5 LED 阵列来显示字符和数字。显示对象有一个show方法,可以将字符和数字映射到需要在 LED 上显示的位图图像。这些 LED 是此电路板上的主要输出形式之一,因此此配方将为您提供一种有价值的方法来与您在电路板上放置的脚本进行交互。

准备

您将需要安装和配置 Mu 文本编辑器,并将微型位板连接到计算机。

怎么做。。。

按照以下步骤学习如何在 LED 显示屏上显示单个字符:

  1. 在 REPL 中运行以下代码行:
>>> from microbit import display
>>> display.show('a')
  1. 显示器现在应该显示字母a。运行以下代码块以显示编号1
>>> display.show('1')
  1. 以下代码块在运行后将显示编号2
>>> display.show(2)
  1. 运行以下代码块以关闭显示器:
>>> display.clear()
  1. 应将以下代码放入主文本编辑器窗口,并将其闪存到板上:
from microbit import display
import time

for i in range(3):
    display.show(i)
    time.sleep(1)

一旦执行,此代码将显示数字 0、1 和 2,每次更改之间有 1 秒的延迟。

它是如何工作的。。。

作为 micro:bit Python 库的一部分的 display 对象上有一个 show 方法,可用于在显示器上显示数字和字符。最初的两个示例使用数据类型为 string 的参数调用该方法。

当显示数字2时,该值以整数形式给出。这是可能的,因为show在接收输入时接受字符串或整数。配方中闪现的主脚本首先导入必要的库,然后启动一个for循环,循环三次。在每个循环中,它显示从0开始的当前迭代次数,然后在再次循环之前休眠一秒钟。

还有更多。。。

处理 5 x 5 LED 栅格的有限显示分辨率可能是一个挑战。谢天谢地,micro:bit 附带的 Python 模块已经完成了所有工作,找到了一种以易读的方式显示显示器上所有字母和字符的方法。在这个配方中,我们看到了如何提供字符串和整数作为数据来显示。在下一个配方中,我们将看到相同的方法也可以接收其他对象,例如图像对象。

另见

以下是有关此配方的一些参考资料:

显示内置图像

此配方将向您展示如何使用 5 x 5 LED 阵列来显示 micro:bit 库中提供的内置图像之一。有许多图像可用,从面部表情到动物符号。它们非常像表情符号。

在本食谱中,我们将看到如何在显示屏上显示心脏和笑脸图标。在 micro:bit 上创建项目时,显示文本和数字以外的符号非常有用,如本配方所示。如果你在 micro:bit 上做了一个游戏,当玩家输赢游戏时,你可能想表现出高兴或悲伤的表情。

准备

您需要安装和配置 Mu 文本编辑器,并将 micro:bit 板连接到计算机。

怎么做。。。

按照以下步骤学习如何显示内置图像:

  1. 在 REPL 中执行以下代码块:
>>> from microbit import display, Image
>>> import time
>>> 
>>> display.show(Image.HAPPY)
  1. 显示器上应该有一张快乐的脸。运行以下代码块以显示心脏图标:
>>> display.show(Image.HEART)
  1. 以下代码块将显示指向 1 点钟的钟面:
>>> display.show(Image.CLOCK1)
  1. 运行以下代码块以显示将钟面从 1 点钟移动到 12 点钟的钟面动画:
>>> CLOCK = [getattr(Image, 'CLOCK%s' % i) for i in range(1, 13)]
>>> for image in CLOCK:
...     display.show(image)
...     time.sleep(0.1)
...     
...     
... 
>>>
  1. 应将以下代码放入主文本编辑器窗口,并将其闪存到板上:
from microbit import display, Image
import time

CLOCK = [getattr(Image, 'CLOCK%s' % i) for i in range(1, 13)]
while True:
    for image in CLOCK:
        display.show(image)
        time.sleep(0.1)

一旦执行,该代码将持续将钟面从 1 点移动到 12 点,每次更改之间的延迟为0.1秒。

它是如何工作的。。。

作为microbitPython 库的一部分的Image对象有一组内置图像,可以通过引用它们的属性名来访问这些图像。show 方法接受这些图像对象,并在调用它们后将它们显示在网格上。REPL 中的初始示例显示了一张快乐的脸、一颗心和一个时钟面,只需参考这些图像的名称即可。

然后创建一个列表,以从 1 到 12 的正确顺序指向 12 个时钟面图像中的每一个。然后可以使用此列表创建时钟面动画。首先,启动一个无限循环。在无限循环的每次迭代过程中,将启动一个for循环,该循环将迭代 12 个时钟面图像中的每一个,显示它们,然后在开始下一次迭代之前暂停 0.1 秒。通过这种方式,可以创建时钟面在时钟上的 12 个位置之间移动的动画。

还有更多。。。

有更多的符号和图像,而不仅仅是在这个食谱中显示的那些。您可以通过参考文档或使用内置的dir函数在 REPL 中列出它们的名称,在 REPL 中探索它们。

该库还支持一种机制,您可以使用该机制定义自己的自定义图像,这些图像可以保存在代码中并在项目之间重用。在这个配方中,我们向您展示了一种创建图像动画的方法,但是在display对象的show方法中也有内置的动画支持,也可以使用。

另见

以下是有关此配方的一些参考资料:

显示滚动文本

此配方将向您展示一种技术,您可以使用microbit库提供的滚动文本功能向用户显示文本。LED 栅格一次只能显示一个字符。通过使用滚动功能,您可以将消息显示为滚动显示的字符序列。

通过这种方式,您可以创建向用户显示短消息的项目,即使主板上可用的物理显示有限。此配方还将向您展示如何控制此动画的速度,以及如何在显示器上无休止地显示文本循环。

准备

您需要安装和配置 Mu 文本编辑器,并将 micro:bit 板连接到计算机。

怎么做。。。

按照以下步骤学习如何显示滚动文本:

  1. 使用 REPL 运行以下代码行:
>>> from microbit import display
>>> display.scroll('hello')
  1. 显示屏应显示在显示屏上滚动的文本'hello'。默认延迟为 150 毫秒。以下代码块将以正常速度的两倍滚动文本:
>>> display.scroll('hello', delay=75)
  1. 以下代码块将以默认速度的一半显示相同的文本:
>>> display.scroll('hello', delay=300)
  1. 运行以下代码块以无限循环方式显示文本:
>>> display.scroll('hello', loop=True)
  1. Ctrl+C终止循环。您应该看到以下消息:
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyboardInterrupt: 
>>> 
  1. 应将以下代码放入主文本编辑器窗口,并将其闪存到板上:
from microbit import display

TEXT = [
    ('slow', 300),
    ('normal', 150),
    ('fast', 75),

]

for text, delay in TEXT:
    display.scroll(text, delay=delay)

一旦执行,此代码将以三种递增速度滚动文本:慢速、普通和快速。

它是如何工作的。。。

scroll方法是display对象的一部分,提供了在显示器上滚动文本所需的所有功能。只需要一个参数,即要显示的文本。调用此方法后,它将启动动画并在提供的文本中显示每个角色,并在屏幕上滚动角色,直到显示整个文本。

可选的delay参数可用于控制滚动动画的显示速度。“延迟”的值越低,动画速度越快,而值越高,动画速度越慢。主脚本定义了一个列表,每个列表有三条消息,滚动延迟的设置不同。然后执行一个for循环,该循环将遍历每个值并调用scroll方法来显示指定的文本,并为每条消息应用自定义滚动delay

还有更多。。。

scroll方法提供的其他选项也可以派上用场。此方法能够在后台运行scroll动画。当您希望在程序执行其他操作时显示消息时,这可能非常有用。您应该注意使用本配方中提供的循环选项。本质上,以这种方式调用show方法将使调用永远不会返回,因为它将在show方法中启动无限循环。

另见

以下是有关此配方的一些参考资料:

显示按下了哪个按钮

此配方将向您展示如何通过每次按下按钮时在显示屏上显示所按下的按钮来响应电路板上的两个按钮之一。这将是本章中的第一个配方,我们将看到如何创建一个交互式项目,通过车载 LED 网格显示视觉输出来响应用户输入。

当你创建自己的项目时,使用两个按钮就可以创建以不同方式响应这些输入的交互式应用程序和游戏了。这个食谱将为您提供基本的构建块,以便您可以开始构建这些类型的项目。

准备

您需要安装和配置 Mu 文本编辑器,并将 micro:bit 板连接到计算机。

怎么做。。。

按照以下步骤学习如何显示已按下的按钮:

  1. 在 REPL 中运行以下代码行:
>>> from microbit import display, button_a, button_b
>>> 
>>> button_a.is_pressed()
False
  1. 由于未按下按钮 A,因此返回的值应为False。在执行以下代码块时按住按钮 A:
>>> button_a.is_pressed()
True
  1. 在执行以下代码块时按住按钮 B:
>>> button_b.is_pressed()
True
  1. 应将以下代码放入主文本编辑器窗口,并将其闪存到板上:
from microbit import display, button_a, button_b

while True:
    if button_a.is_pressed():
        display.show('a')
    elif button_b.is_pressed():
        display.show('b')
    else:
        display.clear()

一旦执行,如果按下按钮 A 或 B,此代码将显示字符ab

它是如何工作的。。。

初始导入后,主脚本进入无限循环。在每次迭代过程中,两个按钮中的每一个都将被轮询,以查看它当前是否被按下。如果按下按钮 A 或 B,则屏幕上将显示按下按钮的字符。循环的最后一部分是检查两个按钮是否都未按下,然后清除屏幕内容。

还有更多。。。

此配方显示了事件循环的基本结构,该循环持续循环并检查输入传感器上的事件,并在这些事件发生时采取响应措施。你可以采用这个基本配方,并以多种方式扩展它。例如,您可以创建一个脚本,帮助用户在菜单选项列表中导航和选择。

每次按下按钮 A 都可以显示下一个菜单项。当按下按钮 B 时,可以选择该菜单项。程序的整体结构在事件循环和每个循环迭代期间检查每个按钮的状态方面保持不变。

另见

以下是有关此配方的一些参考资料:

创建倒计时计时器

本食谱将向您展示如何使用 micro:bit 板创建倒计时计时器。每当有人按下按钮 A 时,倒计时计时器就会启动。它显示倒计时完成前还剩多少秒。它将从数字 9 开始并倒计时,直到计时器完成,在此阶段它将清除屏幕。每当您想创建一个需要将经过的时间合并到脚本中的项目时,咨询这样一个食谱是非常有用的。

准备

您需要安装和配置 Mu 文本编辑器,并将 micro:bit 板连接到计算机。

怎么做。。。

按照以下步骤学习如何创建倒计时计时器:

  1. 在 REPL 中执行以下代码块:
>>> from microbit import display, button_a
>>> import time
>>> 
>>> NUMBERS = list(range(9, 0, -1))
  1. 用于倒计时的数字列表将存储在NUMBERS变量中。以下代码块将显示它们的值:
>>> NUMBERS
[9, 8, 7, 6, 5, 4, 3, 2, 1]
  1. 下面的代码块将定义并调用countdown函数。您应该看到显示屏显示从 9 到 1 的倒计时,每次更改之间有一秒的延迟:
>>> def countdown():
...     for i in NUMBERS:
...         display.show(i)
...         time.sleep(1)
...     display.clear()
...     
...     
... 
>>> 
>>> countdown()
  1. 应将以下代码放入主文本编辑器窗口,并将其闪存到板上:
from microbit import display, button_a
import time

NUMBERS = list(range(9, 0, -1))

def countdown():
    for i in NUMBERS:
        display.show(i)
        time.sleep(1)
    display.clear()

while True:
    if button_a.is_pressed():
        countdown()

一旦执行,该代码将在每次按下按钮 a 时显示 9 秒倒计时。

它是如何工作的。。。

初始导入后,主脚本进入一个无限循环,不断检查按钮 a 上的按钮按下事件。如果检测到按钮 a 被按下,它将调用倒计时函数开始倒计时。countdown函数循环遍历从 9 到 1 的数字列表。

在每个循环中,它将显示数字并暂停 1 秒,然后继续下一次迭代。完成所有九次迭代后,它将清除屏幕以标记计时器的结束。

还有更多。。。

此配方可以扩展,以便当您按下按钮 B 时,另一个计时器启动。也许按钮 B 会启动计时器,从 1 数到 9。您还可以使按钮 A 启动秒表,按钮 B 可以停止秒表并显示经过的时间。

另见

以下是有关此配方的一些参考资料: