MicroPython是Python的一个精简版本,它是为了运行在单片机这样的性能有限的微控制器上,最小体积仅256K,运行时仅需16K内存。
MicroPython是基于Python 3.4的语法标准。因为要适应嵌入式微控制器,所以裁剪了大部分标准库,仅保留部分模块如math、sys的部分函数和类。此外,很多标准模块如json、re等在MicroPython中变成了以u开头的ujson、ure,表示针对MicroPython开发的标准库。
目前,MicroPython除了可以运行在最初开发的pyboard微控制器上外,还可以运行在大量基于ARM的嵌入式系统,如Arduino,这样我们就可以通过Python来非常方便地开发自动控制、机器人这样的应用。
本章我们介绍如何使用MicroPython开发简单的机器人应用程序。
使用MicroPython开发机器人,我们首先要搭建一个开发环境。和运行在桌面或服务器的纯软件环境不同的是,我们得有一个硬件开发环境。可以选择树莓派+Arduino控制板,但是搭建机器人需要的零件比较复杂。作为教程,我们选择乐高EV3机器人作为开发环境,因为乐高机器人搭建非常容易,并且乐高的EV3控制器是一个完整的ARM系统。
那么问题来了:如果你没有乐高EV3怎么办?
戳这里:淘宝。
乐高官方提供了一个完整的EV3运行时镜像,该镜像内置了MicroPython,可以非常方便地运行Python程序。需要从乐高官网下载镜像到本地,然后写入到MicroSD卡。Windows和Mac系统可以使用Etcher写入镜像到MicroSD卡,也可以使用dd命令写入。
插入SD卡后启动EV3控制器,等待1~2分钟,启动成功后,即可选择“Wireless and Networks”连接电脑:
使用无线网连接需要额外的USB无线网卡,强烈推荐选择蓝牙连接,因为EV3内置了蓝牙模块。配对并连接成功后,可以在电脑上看到已连接的蓝牙设备EV3。
可以直接使用SSH登录EV3,因为这个自带MicroPython的EV3镜像是一个裁剪后的Debian Linux系统。我们用命令ssh robot@ev3dev.local登录,密码是maker:
$ ssh robot@ev3dev.local
Password: *****
Linux ev3dev 4.14.96-ev3dev-2.3.2-ev3 #1 PREEMPT Sun Jan 27 21:27:35 CST 2019 armv5tejl
_____ _
_____ _|___ / __| | _____ __
/ _ \ \ / / |_ \ / _` |/ _ \ \ / /
| __/\ V / ___) | (_| | __/\ V /
\___| \_/ |____/ \__,_|\___| \_/
Debian stretch on LEGO MINDSTORMS EV3!
Last login: Mon Mar 4 18:05:04 2019 from f81e::a7:c54d:4e0b:3af7%bnep0
robot@ev3dev:~$ ls /usr/lib/micropython/
README fcntl.mpy mailbox.mpy reprlib.mpy trace.mpy
README.rst ffilib.mpy mailcap.mpy runpy.mpy traceback.mpy
__future__.mpy fnmatch.mpy mimetypes.mpy sched.mpy tty.mpy
_libc.mpy formatter.mpy multiprocessing.mpy sdist_upip.mpy types.mpy
_markupbase.mpy fractions.mpy nntplib.mpy select.mpy typing.mpy
abc.mpy ftplib.mpy numbers.mpy selectors.mpy uaiohttpclient.mpy
argparse.mpy functools.mpy operator.mpy shelve.mpy uasyncio
base64.mpy getopt.mpy optparse.mpy shlex.mpy uasyncio.mpy
binascii.mpy getpass.mpy os shutil.mpy ucontextlib.mpy
binhex.mpy gettext.mpy pathlib.mpy signal.mpy ucurses
bisect.mpy glob.mpy pdb.mpy smtplib.mpy udnspkt.mpy
calendar.mpy gzip.mpy pickle.mpy socket.mpy umqtt
cgi.mpy hashlib pickletools.mpy socketserver.mpy unicodedata.mpy
cmd.mpy heapq.mpy pkg_resources.mpy sqlite3.mpy unittest.mpy
code.mpy hmac.mpy pkgutil.mpy ssl.mpy upip.mpy
codecs.mpy html platform.mpy stat.mpy upip_utarfile.mpy
codeop.mpy http poplib.mpy statistics.mpy upysh.mpy
collections imaplib.mpy posixpath.mpy string.mpy urequests.mpy
concurrent imp.mpy pprint.mpy stringprep.mpy urllib
contextlib.mpy importlib.mpy profile.mpy struct.mpy urllib.mpy
copy.mpy inspect.mpy pty.mpy subprocess.mpy utarfile.mpy
csv.mpy io.mpy pwd.mpy sys.mpy uu.mpy
curses ipaddress.mpy pyb.mpy tarfile.mpy uuid.mpy
datetime.mpy itertools.mpy pystone.mpy telnetlib.mpy venv.mpy
dbm.mpy json pystone_lowmem.mpy tempfile.mpy warnings.mpy
decimal.mpy keyword.mpy queue.mpy test weakref.mpy
difflib.mpy linecache.mpy quopri.mpy textwrap.mpy xmltok.mpy
email locale.mpy random.mpy threading.mpy zipfile.mpy
errno.mpy logging.mpy re.mpy time.mpy zlib.mpy
ev3dev2 machine readline.mpy timeit.mpy
在/usr/lib/micropython/目录下可以看到系统自带的Python库。MicroPython并不直接运行.py文件,而是运行.mpy这个紧凑的二进制文件。
要开发EV3机器人程序,我们还需要搭建一个开发环境。Visual Studio Code是强烈推荐的开发环境,并且,乐高官方推出了一个VSCode扩展,可以方便地开发并远程调试应用程序。在VS Code的扩展中搜索lego并安装LEGO® MINDSTORMS® EV3 MicroPython扩展:
安装扩展后,我们就可以开始开发运行在EV3上的Python程序。在VS Code左侧面板选择Lego图标,选择“Create a new project”:
我们创建一个hellorobot的工程,EV3插件自动为我们创建了一个包含样板代码的main.py:
#!/usr/bin/env pybricks-micropython
from pybricks import ev3brick as brick
from pybricks.ev3devices import (Motor, TouchSensor, ColorSensor, InfraredSensor, UltrasonicSensor, GyroSensor)
from pybricks.parameters import (Port, Stop, Direction, Button, Color, SoundFile, ImageFile, Align)
from pybricks.tools import print, wait, StopWatch
from pybricks.robotics import DriveBase
# Write your program here
brick.sound.beep()
首行的注释表示运行环境是MicroPython,然后自动导入了EV3所需的所有控制API。brick.sound.beep()用于控制EV3的扬声器发出一声“哔”的声音。
我们可以编写任意的Python源码文件,但执行时注意程序入口永远是main.py。
在VS Code中,找到EV3DEV DEVICE BROWSER,点击ev3dev,连接后图标显示为绿色:
接下来,我们就可以直接切换到Run面板,点击RUN运行,在OUTPUT面板中看到输出结果:
注意到VS Code是一个开发环境,我们在电脑上并没有安装MicroPython,整个程序是通过蓝牙网络先传输到EV3主机,再执行,最后取回输出结果显示在VS Code中,因此,这是一个远程执行并允许调试的功能。print()函数可以输出到VS Code,主要作为调试使用,brick.display.text()则是输出到EV3的主机屏幕上。
这样,我们就把连接EV3的整个MicroPython开发环境搭建好了。