乐高EV3的可扩展性很强,但如何用pc连接ev3,并用python代码来控制EV3,资料太少了,试着做了一次,记录在这里。
需要的硬/软件
硬件准备
一、乐高EV3
二、PC,win10系统
三、TF卡(我用的是64G的)
四、TF卡读卡器
软件准备
一、必须的:
(一)python
官方下载地址:https://www.python.org/downloads/
(二)Win32 Disk Imager
官方下载地址:https://sourceforge.net/projects/win32diskimager/files/latest/download
(三)EV3Dev
本质上是一个 Debian Linux 的操作系统,我们将让EV3加载这个操作系统,然后利用Python来操作EV3。
EV3Dev有两个版本:
1.0-版本名称叫Jessie
2.0-版本名称叫Stretch
我用的是Stretch,没比较过两个版本的区别。
官方下载地址:https://www.ev3dev.org/docs/getting-started/
二、看情况选择:
(一)python的IDE或编辑器
可选的很多,pycharm, visual studio code(vs code),jupyter, notepad++等等都可以。
vs Code是一个不错的选择,轻量级,扩展多,连接方便。
当然,选择其他也没问题。
附上vs code官方载地址:https://code.visualstudio.com/
(二)将PC和EV3相连的软件
如果已经选择了vs code,也可以不另外下载,因为vs code可以很方便的连接上EV3。
或者,也可以下win scp,通过它,在PC和EV3之间传输文件。
win scp官方下载地址:https://winscp.net/eng/index.php
基本原理
本质就是将一个叫Ev3Dev的Linux系统先装到TF卡上,然后将TF卡插入EV3机器中,这样,开机时EV3就会加载TF卡上的操作系统。
然后将代码文件(.py)写入EV3中执行。
如果想用回原生的系统,关机后拔卡重新启动EV3就好。
步骤
一、打开Win32 Disk Imager, 将下载的ev3dev2映像文件(img文件)写入空白的TF卡中。
二、将TF卡插入EV3中,开机。开机时间较久,大概需要30秒甚至更长,要耐心等待。
到出现这个图,就差不多了。
最后会出现这个界面,就OK了。
三、连接PC和EV3
1.USB线连接
按下图选择:
2.蓝牙
按下图选择
3.wifi,这个需要适配器。我没有。
不论哪种方式,连接成功后在EV3机器屏幕最上一行会出现EV3的IP地址。
到了这步,可以打开win scp,输入EV3的IP地址登录EV3了。如果已经写好了代码,就可以将代码传进EV3执行了。
默认登录名:robot,默认密码:maker
不过且慢, 在将你的代码传进EV3之前,需要对传输的文件进行权限设置。(因为现在EV3上运行的EV3Dev是linux系统,linux系统的文件是否可执行,不是看扩展名,而是依赖文件权限的设置。)
打开win scp后,根据如下设置:
设置完成后,就可以将py文件传进EV3,在EV3上通过filebrowser找到文件,直接点击EV3中间的按钮就可以运行了。
现在,EV3真的可以运行自己写的py文件了。
如果使用VS code,则不用进行py文件的权限设置,因为vs code在将文件传进EV3之前处理好文件的权限。
如果你打算使用jupyter, notepad++这些编辑器编辑生成py文件,然后再用win scp传到EV3,那就不用往下看了。
以下是使用vscode才需要看。
vscode的确比较便捷好用,它可以编辑代码,连接EV3,调试及运行代码。推荐一试。
四、安装vs code
省略,如不懂可自行搜索。
五、通过vscode连接EV3。若连接成功,EV3名称前会有个小绿点。
六、重点是配置
1.安装扩展
(1)microsoft python extension
(2)ev3dev-browser
2.选择一种方式启动一个项目
3.下载一个开始项目
下载地址:https://github.com/ev3dev/vscode-hello-python
下载这个项目的意义在于,这个项目里边有一个文件夹:.vscode,文件夹里包含下面几个配置文件,其中的launch.json、settings.json对配置有用。当然,自己编写也是可以的。
launch.json
settings.json
extensions.json
.gitignore
把.vscode文件夹复制到项目的工作文件夹,删掉extension.json, .gitignore,只保留launch.json、settings.json。
4.修改配置文件
(1)launch.json修成为如下,重点是
"program": "/home/robot/${workspaceRootFolderName}/${relativeFile}"
{"version": "0.2.0","configurations": [{"name": "Download and Run Current File","type": "ev3devBrowser","request": "launch","program": "/home/robot/${workspaceRootFolderName}/${relativeFile}"}]
}
(2)settings.json修改如下:
{"files.eol": "n","ev3devBrowser.download.exclude": "{**/.*,LICENSE,README.md}"
}
配置成功后,在Debug界面中会出现Download and run current file.
而原来的Debug界面是这样的:
5.配置虚拟环境(视情况而定,也可以不做。)
这一步的目的是,是让文件的运行有一个“相对独立且干净”的python环境,如果觉得不需要,也可以不做。
另外,这一步,可以部分解决“unable to import ev3dev2 ”报错。
一、确定已安装有ev3dev2库,如无,先在vscode终端或在cmd中安装:
pip install --upgrade pip
pip install python-ev3dev2
二、确认安装有virtualenv,如没有,先安装。
pip install virtualenv
三、打开CMD(win+R打开),进入工作文件夹,然后输入以下代码,作用是建立虚拟环境:
py -3 -m venv .venv
然后激活:
.venvScriptsactivate
运行activate后,会成这样:
这时,在工作文件夹内会多一个.venv的文件夹,说明成功。
四、点击下方蓝色状态栏的最左侧,将python解释器修改为虚拟环境中的解释器。
七、其他
确定.py文件中代码的开头为:
#!/usr/bin/env python3
否则会报错。
成功运行
连接好EV3和PC,随便写了一段代码,按F5运行,成功!
https://www.zhihu.com/video/1197284882014138368#!/usr/bin/env python3
import ev3dev2.fonts as fonts
from ev3dev2.motor import *
from ev3dev2.sound import *
from ev3dev2.led import *
from ev3dev2.sensor.lego import TouchSensor
from ev3dev2.button import *
from ev3dev2.display import *
from PIL import Image
from time import sleep, time
import tracebackclass myev3:def __init__(self,txt):# print("program starting...")self.m = Motor(address="A")self.sd=Sound()self.btn=Button()self.led=Leds()self.lcd=Display()self.txt=txtdef disp(self,txt):self.lcd.draw.text((5,10),txt, font=fonts.load('luBS14'))self.lcd.update()sleep(5)def left(self,state):if state:self.sd.speak('you press the left')self.m.on_for_rotations(SpeedPercent(50),5)self.led.set_color("LEFT","ORANGE")def right(self,state):if state:self.sd.speak('hello,nice to meet you.')self.led.set_color("LEFT","YELLOW")def showlogo(self):self.logo = Image.open('../py/pics/dzxclogo.jpg')self.lcd.image.paste(self.logo, (0,0))self.lcd.update()sleep(5)def run(self): self.btn.on_left=self.leftself.btn.on_right=self.rightself.disp(self.txt)self.showlogo()while True:self.btn.process()sleep(0.02) if __name__=='__main__':try:my=myev3("Welcome to nDa Zhi Xiao Chao nScientific labratory")my.run()except:# If there is any error, it will be stored in the log file in the same directorylogtime = str(time())f=open("log" + logtime + ".txt",'a') traceback.print_exc(file=f) f.flush() f.close()