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开发环境搭建好了。