首页/作品列表/PyCharm ESP32 开发环境设置
PyCharm ESP32 开发环境设置
90732 0
主要内容
PyCharm 是 JetBrains 推出的非(GONG)常(NENG)好(QIANG)用(DA)的 Python IDE。Microduino 即将推出支持 Micropython 的 ESP32 核心,如果能够直接使用 PyCharm 对它进行开发,是一件很爽的事情。
当前实验环境是:MAC、Windows(Win7以上)。

前置条件

1。 安装 Python 3.5+ 以上版本。

您可以从 python.org 下载对应的版本。之所以选择 Python3 有两个原因:首先 Micropython 是 Python3 的一个嵌入式端实现。其次高中信息技术课标中要求的人工智能、数据处理的一些常用工具如 Tensorflow 等要求 Python3。
在 MAC 上因为系统已经自带 Python 2.7 版本,所以安装后需要采用 python3 来访问刚刚安装的版本。
$ python --version
Python 2.7.10
$ which python
/usr/bin/python
$ python3 --version
Python 3.6.4
$ which python3
/Library/Frameworks/Python.framework/Versions/3.6/bin/python3
Windows 环境需要:Win 7 SP1 以上才能安装 Python 3。安装过程比较容易,只要在安装时确定将 python 放到 path 设置里就可以了。

2。 下载并安装 PyCharm IDE

这里我们可以选择免费而且开源的 Community 版本。下载地址在此

3。 在 Pycharm 中安装 Micropython 插件

MAC 版 PyCharm 请在菜单中选择“Preference”:
Windows 版本 PyCharm 在菜单中选择 “File”/“Setting”:
设置对话框被打开,点击“Plugins”管理插件。要增加新的插件,可以选择“Browse repositories”按钮,打开在线的插件库。在插件库中查找名为“micropython”的插件。然后安装。
安装完插件后,需要重启 Pycharm 生效。
补充更新
您还可以试用我定制的一版插件,从本附件中下载,使用 “Install plugin from disk”安装它。在这个版本里,我处理的部分有:增加 ESP32 选项,上传完程序文件之后会对 ESP32 做软重启,能够直接看到新的 main.py 被执行。

PyCharm设置

1。 选择 Python 版本

创建一个 Pure Python 的项目取名为“esp32”,我们需要将此 PyCharm 项目所使用的 Python 版本从缺省的 Python2 换成 Python3。
在菜单中选择“Preference”,然后选择“Project:esp32 / Project Interpreter”,:然后,在 Project Interpreter 下拉框中选择 “Python 3.6”。
如果下拉列表中没有 Python3 选项,可以点选“Show All”来增加,点按对话框左下角的“+”,选择“Add Local...”。
选择“System Interpretor”标签,然后选择 Python 3
然后安装这些依赖包:

2。 设置Micropython插件

接下来继续在“Preference”窗口中对Micropython插件进行设置。选择“Language & Frameworks”,“MicroPython”。然后选中 “Enable MicroPython Support”,然后选择“ESP8266”(没错,暂时这个插件不完全支持 ESP32,所以选择这个 ESP8266),在 “Device path” 中输入你的 ESP32 串口,例如:“/dev/cu.SLAB_USBtoUART”,输入完成后,可以按一下“Detect”按钮检查确认一下。
Windows 版本 PyCharm 直接在 Device Path 中 输入串口的名称,如“COM6”,然后按 “Detect”按钮检查确认一下。
设置完成之后,您应该能够在“Tools”菜单中看到 “MicroPython” 选项。如果看不见,请重启一下 PyCharm。

为 ESP32 更新固件

为Python安装了 esptool.py 之后,就能够用它为 ESP32 刷新固件。MicroPython 的 ESP32 固件也在开发演进过程中,可以从 MicroPython 网站下载最新的固件
esptool.py --chip esp32 --port /dev/cu.SLAB_USBtoUART write_flash -z 0x1000 firmware.bin

开发实践

必须注意:因为 ESP32 的 MicroPython 固件退出模式的命令键值和 ESP8266 不同,采用 ESP8266 的插件实现不能够正常重新运行 ESP32 到初始状态,所以,在看到文件上传已经完成100%,“Soft reboot”的提示出现之后,必须重新插拔一下 USB 电缆,对 ESP32 进行重置,才能看到程序执行的效果。遇到问题,需要重新插拔一下 USB 电缆。
如果不重新插拔,很容易遇到无反应或者“could not enter raw repl”问题

1。 REPL 模式交互

在“Tools”菜单选择 “MicroPython” / “Micropython REPL” 选项,会打开 REPL 交互窗口。利用交互窗口,我们可以实验 MicroPython 的包、了解 Microduino ESP32 系统的情况。
你可以在 REPL 窗口中,实验下面的命令:
首先试试 help()
Device path /dev/cu.SLAB_USBtoUART
Quit: Ctrl+] | Stop program: Ctrl+C | Reset: Ctrl+D
Type 'help()' (without the quotes) then press ENTER.

>>> help()
Welcome to MicroPython on the ESP32!

For generic online docs please visit http://docs.micropython.org/

For access to the hardware use the 'machine' module:

import machine
pin12 = machine.Pin(12, machine.Pin.OUT)
pin12.value(1)
pin13 = machine.Pin(13, machine.Pin.IN, machine.Pin.PULL_UP)
print(pin13.value())
i2c = machine.I2C(scl=machine.Pin(21), sda=machine.Pin(22))
i2c.scan()
i2c.writeto(addr, b'1234')
i2c.readfrom(addr, 4)

Basic WiFi configuration:

import network
sta_if = network.WLAN(network.STA_IF); sta_if.active(True)
sta_if.scan() # Scan for available access points
sta_if.connect("", "") # Connect to an AP
sta_if.isconnected() # Check for successful connection

Control commands:
CTRL-A -- on a blank line, enter raw REPL mode
CTRL-B -- on a blank line, enter normal REPL mode
CTRL-C -- interrupt a running program
CTRL-D -- on a blank line, do a soft reset of the board
CTRL-E -- on a blank line, enter paste mode

For further help on a specific object, type help(obj)
For a list of available modules, type help('modules')
>>> print('Hello Microduino, Hello MiroPython')
Hello Microduino, Hello MiroPython
>>> 
检查一下系统文件:
>>> import os
>>> os.listdir()
['boot.py']
>>> 
点亮一下LED灯。将 ESP32 核心和 Microduino Sensor Hub 堆叠在一起,将 LED 接入到左下角的 D6/7 端口(UPin27 开口朝左),这个口对应的 GPIO 端口为 25.
>>> from machine import Pin
>>> led = Pin(25, Pin.OUT)
>>> led.value(1)
>>> led.value(0)
>>> 
检查一下所支持的 MicroPython 包
>>> help('modules')
__main__ flashbdev random uos
_boot framebuf re upip
_onewire gc select upip_utarfile
_thread hashlib socket upysh
apa106 heapq ssl urandom
array inisetup struct ure
binascii io sys urequests
btree json time uselect
builtins machine ubinascii usocket
cmath math ucollections ussl
collections micropython uctypes ustruct
dht neopixel uerrno utime
ds18x20 network uhashlib utimeq
errno ntptime uheapq uzlib
esp onewire uio websocket
esp32 os ujson zlib
Plus any modules on the filesystem
>>> help("modules.re")
object modules.re is of type str
encode --
find --
rfind --
index --
rindex --
join --
split --
splitlines --
rsplit --
startswith --
endswith --
strip --
lstrip --
rstrip --
format --
replace --
count --
partition --
rpartition --
center --
lower --
upper --
isspace --
isalpha --
isdigit --
isupper --
islower --
>>> 
测试一下 Wifi 连接。
>>> import network
>>> sta_if = network.WLAN(network.STA_IF)
I (29264) wifi: wifi firmware version: ebd3e5d
I (29264) wifi: config NVS flash: enabled
I (29264) wifi: config nano formating: disabled
I (29264) system_api: Base MAC address is not set, read default base MAC address from BLK0 of EFUSE
I (29274) system_api: Base MAC address is not set, read default base MAC address from BLK0 of EFUSE
I (29304) wifi: Init dynamic tx buffer num: 32
I (29304) wifi: Init data frame dynamic rx buffer num: 64
I (29304) wifi: Init management frame dynamic rx buffer num: 64
I (29304) wifi: wifi driver task: 3ffcaf40, prio:23, stack:4096
I (29314) wifi: Init static rx buffer num: 10
I (29314) wifi: Init dynamic rx buffer num: 0
I (29324) wifi: wifi power manager task: 0x3ffcfb90 prio: 21 stack: 2560
I (29384) phy: phy_version: 383.0, 79a622c, Jan 30 2018, 15:38:06, 0, 0
I (29384) wifi: mode : null
>>> sta_if.active(True)
I (44614) wifi: mode : sta (30:ae:a4:01:8a:b8)
I (44614) wifi: STA_START
True
>>> ssid = "YOURSSID"
>>> password = "XXXX"
>>> sta_if.connect(ssid, password)
>>> I (138614) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
I (139174) wifi: state: init -> auth (b0)
I (139174) wifi: state: auth -> assoc (0)
I (139204) wifi: state: assoc -> run (10)
I (139234) wifi: connected with YOURSSID, channel 1
I (139234) network: event 4
I (142204) wifi: pm start, type:0

I (143634) event: sta ip: 192.168.7.234, mask: 255.255.255.0, gw: 192.168.7.1
I (143634) network: GOT_IP

>>> sta_if.isconnected()
True
>>> 
请注意:如果输入了错误的 SSID 和 Pssword,系统会不断的尝试重连网络,只有插拔一下 USB 电缆才能正常。
>>> ssid = "YOURSSID"
>>> password = "XXXX"
>>> sta_if.connect(ssid, password)
>>> I (81843) wifi: STA_DISCONNECTED, reason:201
no AP found
I (84253) wifi: STA_DISCONNECTED, reason:201
no AP found

2。上传编写的 Python 文件

因为目前 PyCharm MicroPython 尚未正式支持 ESP32,所以我们只能用这个插件实现有限的功能——上传文件暂时还不能使用执行文件等操作。
首先,我们返回项目开发窗口,创建一个名为:main.py 的 Python 文件,我们将用它来测试文件的上传。main.py 是 ESP32 上缺省的入口执行文件。
# LED灯闪烁

import time
from machine import Pin

led = Pin(25, Pin.OUT) # create LED object from pin2,Set Pin2 to output

while True:
led.value(1) # Set led turn on
time.sleep(0.5)
led.value(0) # Set led turn off
time.sleep(0.5)
重新插拔一下 USB 电缆,对 ESP32 进行重置。
在文件编辑框中点按鼠标右键,能够看到有“Flash main.py”这命令,执行这个命令就能够完成文件上传。
必须注意:因为 ESP32 的 MicroPython 固件实现问题,进入上传文件模式或 REPL 模式之后,其退出模式的命令键值和 ESP8266 不同,所以采用 ESP8266 的插件实现不能够正常重新运行 ESP32 到初始状态,所以,在看到文件上传已经完成100%,“Soft reboot”的提示出现之后,必须重新插拔一下 USB 电缆,对 ESP32 进行重置,才能看到程序执行的效果。
然后,您可以切换到 REPL 模式,利用 os.listdir() 查看文件列表。
Quit: Ctrl+] | Stop program: Ctrl+C | Reset: Ctrl+D
Type 'help()' (without the quotes) then press ENTER.
Traceback (most recent call last):
File "main.py", line 10, in
KeyboardInterrupt:
MicroPython v1.9.3-386-g9884a2c7 on 2018-03-02; ESP32 module with ESP32
Type "help()" for more information.
>>> import os; os.listdir()
['boot.py', 'main.py']
>>> 
不同文件名的文件,采用类似的操作可以被放到设备上。

3。上传编写的 Python lib 包

接下来我们上传自己开发的 python lib。
在 esp32 的项目下创建一个新的 “Python Package”,取名为 “mylib”。
在 mylib 目录下创建一个新的 “mywifi.py”。内容如下:
import network


def connect(ssid, passwd):
station = network.WLAN(network.STA_IF)
if station.isconnected() == True:
print("Already connected")
return

station.active(True)
station.connect(ssid, passwd)
while station.isconnected() == False:
pass

print("Connection successful")
print(station.ifconfig())

创建一个命令执行目录上传。选择“Edit Configuration”下拉框。
创建名为“Flash mylib”的执行配置。
重新插拔一下 USB 电缆,对 ESP32 进行重置。执行这个配置,上传目录。
上传后,重新插拔一下 USB 电缆,对 ESP32 进行重置。通过 REPL 检查返回结果如下:
>>> import os; os.listdir()
['boot.py', 'main.py', 'mylib']
>>> os.listdir('mylib')
['__init__.py', 'mywifi.py']
>>> from mylib import mywifi
>>> ssid = "YOURSSID"
>>> password = "XXXX"
>>> mywifi.connect(ssid, password)
I (76110) wifi: wifi firmware version: ebd3e5d
I (76110) wifi: config NVS flash: enabled
I (76110) wifi: config nano formating: disabled
I (76110) system_api: Base MAC address is not set, read default base MAC address from BLK0 of EFUSE
I (76120) system_api: Base MAC address is not set, read default base MAC address from BLK0 of EFUSE
I (76150) wifi: Init dynamic tx buffer num: 32
I (76150) wifi: Init data frame dynamic rx buffer num: 64
I (76150) wifi: Init management frame dynamic rx buffer num: 64
I (76150) wifi: wifi driver task: 3ffcaf40, prio:23, stack:4096
I (76160) wifi: Init static rx buffer num: 10
I (76160) wifi: Init dynamic rx buffer num: 0
I (76170) wifi: wifi power manager task: 0x3ffcfb90 prio: 21 stack: 2560
I (76230) phy: phy_version: 383.0, 79a622c, Jan 30 2018, 15:38:06, 0, 0
I (76230) wifi: mode : null
I (76230) wifi: mode : sta (30:ae:a4:01:8a:b8)
I (76230) wifi: STA_START
I (76360) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
I (76920) wifi: state: init -> auth (b0)
I (76920) wifi: state: auth -> assoc (0)
I (76940) wifi: state: assoc -> run (10)
I (76970) wifi: connected with Microduino, channel 1
I (76970) network: event 4
I (77610) event: sta ip: 192.168.7.234, mask: 255.255.255.0, gw: 192.168.7.1
I (77610) network: GOT_IP
Connection successful
('192.168.7.234', '255.255.255.0', '192.168.7.1', '192.168.7.1')
>>> I (79940) wifi: pm start, type:0

>>> 

3。 删除已经写入的所有文件

重新插拔一下 USB 电缆,对 ESP32 进行重置。
在“Tools”菜单选择 “MicroPython” / “Remove all files from MicroPython device” 选项,能够清除已经写入的所有文件。你可以采用 REPL 交互方式,输入 import os; os.listdir() 来检查。

后续工作

已经向 MicroPython Plugin 的开发者提出请求增加 ESP32 的支持了。也许他的反馈比较慢,以后有时间的稍后,可以自己实现一下这个插件,让大家用的更顺畅。
所需硬件
暂无数据!
代码展示

1. main.py

编程语言: Python

软件工具:other


2. mywifi.py

编程语言: Python

软件工具:other


附件下载
  • 资料展示
  • intellij-micropython-SNAPSHOT.zip
2
大牛,别默默的看了,快登录帮我点评一下吧!

立即注册