MicroPython物联网开发入门1欢迎上贼船ESP8266

寻技术 Python编程 2023年07月11日 126

1欢迎上贼船

1.1 关于本教程

这是一个针对Python初学者的教程,他们想学习对设备进行编程,以便与物理世界互动。你将学习如何使用MicroPython编程,MicroPython是专为在微控制器上运行的Python版本。你将学习如何编写的应用程序将从传感器读取数据,在小屏幕上显示信息,对按钮作出反应,并从互联网上传或下载数据。有很多很酷的东西!

1.2 要求

有Python的基本编码经验。你不需要有任何关于微控制器、电子学、甚至MicroPython的知识。

你还需要一台有USB接口的Ubunutu电脑,因为你要把微控制器连接到电脑上进行编程。

购物清单

1.3.1 微控制器

MicroPython可以在几种不同类型的微控制器上运行,但在本教程中,我将只使用一种型号:ESP8266。请注意,有一些不同的板子,你可以买到相同的芯片。你想买的型号是非正式地称为 "开发板 "的型号,更正式的名称是ESP-12。这些板子上安装有微控制器,小型Wi-Fi天线,用于供电和编程的微型USB输入,以及30个可直接插入面包板的引脚。

ESP8266微控制器芯片是一个较大的银色盒子。在它上面你可以看到一条人字形的金线。那是Wi-Fi天线。你可以看到每侧有15个引脚,每个引脚都有标签,应该印在电路板上,名称是D0、D1、3V3、GND等。

有三个标有3V3或3.3V的引脚,它们提供电流。这个名字来自于电压,即3.3伏。这些引脚可用于向其他元件提供输入电流。还有四个GND或 "ground"引脚。这些引脚提供了接地连接。正如你在本教程后面所学到的,所有元件都有明确标记的引脚,用于输入电流,通常称为VCC,还有用于连接到地面,称为GND。

标有D的引脚是数据引脚。这些引脚用于单片机和其他连接设备之间的通信。

电路板上有两个内置的小LED(发光二极管,如果你愿意,也可以说是小灯泡),你可以在图中看到黄色的。上面的LED与标有D4或GPIO2的引脚相连,而下面的LED则与D0相连,也就是GPIO16。

在其余的引脚中,A0是值得一提的,因为它是电路板上唯一的 "模拟 "引脚。所有其他的引脚要么是0,要么是1,但是模拟引脚可以有一定的数值范围,由通过该引脚的电流大小决定。本教程不使用模拟针脚。

另一个有趣的引脚是RST,它可以用来向电路板发送复位信号。后续你将学习如何使用这个引脚来 "唤醒 "处于深度睡眠状态的微控制器。

标有Vin的引脚可以用来给电路板供电,作为更方便的Micro-USB端口的替代。在本教程中,你要做的所有例子都是通过micro-USB端口供电的,所以你不会使用这个引脚。

其余的引脚在大多数板子上都是留给微控制器自己使用的,所以这里没有很多有趣的功能可以提及。如果你想知道在你的特定板子上有什么用途,你应该查阅具体的文件,因为这些引脚的接线方式不尽相同。

在底部中央,你有一个微型USB输入连接器。在本教程中,你将总是通过这个连接器给电路板供电。如果你把电缆的另一端连接到你的电脑上,那么电路板就会在你的电脑上显示为一个串行设备。这个串行连接将被用来向微控制器上传代码。

为了完成这个概述,请注意电路板上有两个小按钮,分别是RST和FLASH,在微型USB端口的两侧。FLASH按钮为板子准备了新的固件,但这个按钮很少需要,因为当前版本的板子可以通过串行连接进入闪存模式。RST按钮是简单的复位按钮,按下它可以重新启动电路板。

1.3.2 温度和湿度传感器

有三个或四个引脚的模型。对于本教程都可以。

1.3.3 屏幕

一些例子会在128x64像素的OLED小屏幕上显示信息。

1.3.4 按键

一些例子将由按钮来触发。

1.3.5 面包板和跳线

为了能够在不焊接的情况下轻松地建立和拆卸电路,你将需要面包板和跳线。

最上面的两排和最下面的2排孔通常被称为 "电源条",它们的工作方式实际上与家用电源条类似。

中间的孔是以五为一组的。中间两部分的十排孔用字母a到j标示,但与电源条不同,这些行没有连接。这些针脚的连接是垂直的,并且只覆盖了每一部分的五个垂直孔组。各列的标签从1到30,但在许多面包板上,你只能看到每五列一个标签。利用这些标签,你可以看到a1、b1、c1、d1和e1孔都是相互连接的,所以任何插入这些孔的引脚都会全部连接。同样,针脚f1、g1、h1、i1和j1之间也是相连的,但它们与上面的五个孔没有共同的连接。

1.3.6 USB到MicroUSB电缆

你将需要一条USB线来连接你的微控制器和你的电脑。这将提供电源,也是串行连接,你将通过它把代码上传到微控制器的存储器中。这和大多数安卓手机的充电线是一样的,所以你可能已经有一条可以使用了。

1.4 Hello

到https://micropython.org/download/?port=esp8266下载固件,一般用2M的版本:esp8266-20230426-v1.20.0.bin

将普通USB端插入计算机上的一个空闲USB端口,将微型USB端插入ESP8266板。当板子通电时,你可能会看到其中一个LED灯闪烁,但当然不会有其他事情发生,因为没有安装软件。

$ sudo pip install esptool rshell
$ esptool.py write_flash 0 Downloads/esp8266-20230426-v1.20.0.bin --flash_size=detect
esptool.py v4.6.2
Found 1 serial ports
Serial port /dev/ttyACM0
Connecting....
Detecting chip type... Unsupported detection protocol, switching and trying again...
Connecting....
Detecting chip type... ESP8266
Chip is ESP8266EX
Features: WiFi
Crystal is 26MHz
MAC: d8:bf:c0:f8:16:d5
Uploading stub...
Running stub...
Stub running...
Configuring flash size...
Auto-detected Flash size: 4MB
Flash will be erased from 0x00000000 to 0x0009afff...
Flash params set to 0x0040
Compressed 634016 bytes to 420365...
Wrote 634016 bytes (420365 compressed) at 0x00000000 in 37.0 seconds (effective 136.9 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting via RTS pin...

我将向你展示的是如何连接到你的电路板上运行的Python提示符。这被称为 REPL,它是 "Read-Eval-Print-Loop "的缩写。这是标准的Python提示符,你可能习惯于在使用常规的Python解释器时看到它,但这次它将在你的电路板上运行,为了与它互动,你将使用串行连接到你的计算机。

在你之前发布的esptool.py命令的输出中,寻找以Serial port开头的一行。这一行的内容是连接到你的微控制器板的串口设备的名称。在Linux或Mac电脑上,这将是格式为/dev/的名字,而在Windows上,它将是COM。你可以看到,对于我目前使用的电路板,设备名称是/dev/ttyACM0。

$ rshell --port /dev/ttyACM0
Using buffer-size of 32
Connecting to /dev/ttyACM0 (buffer-size 32)...
Trying to connect to REPL  connected
Retrieving sysname ... esp8266
Testing if ubinascii.unhexlify exists ... Y
Retrieving root directories ... /boot.py/
Setting time ... Jul 06, 2023 12:57:01
Evaluating board_name ... pyboard
Retrieving time epoch ... Jan 01, 2000
Welcome to rshell. Use Control-D (or the exit command) to exit rshell.
/home/andrew> repl
Entering REPL. Use Control-X to exit.
>
MicroPython v1.20.0 on 2023-04-26; ESP module with ESP8266
Type "help()" for more information.
>>> 
>>> print('Hello, MicroPython!')
Hello, MicroPython!
>>> 

参考资料

  • 软件测试精品书籍文档下载持续更新 https://github.com/china-testing/python-testing-examples 请点赞,谢谢!
  • 本文涉及的python测试开发库 谢谢点赞! https://github.com/china-testing/python_cn_resouce
  • python精品书籍下载 https://github.com/china-testing/python_cn_resouce/blob/main/python_good_books.md
  • https://docs.micropython.org/en/latest/esp8266/tutorial/intro.html
  • https://zhuanlan.zhihu.com/p/82366556
  • https://blog.csdn.net/makeryzx/article/details/79872567
  • https://www.espressif.com.cn/sites/default/files/documentation/2a-esp8266-sdk_getting_started_guide_cn.pdf
  • https://blog.csdn.net/qq_38405680/article/details/84571843

1.5控制板载的LED

正如我前面提到的,这个板子有两个LED。更准确地说,几乎都是这样的,但有些老的ESP8266开发板只有一个LED。让我们首先尝试控制最常见的那个,即所有板子都有的那个:

>>> import machine
>>> led = machine.Pin(2, machine.Pin.OUT)

machine是板子接口的内置一。这个包最重要的特征之一是Pin()类,它被用来读取或写入数据引脚。

位于Wi-Fi天线旁边的LED是连接到D4引脚的。那么为什么我用2来初始化这个引脚呢?这是因为微控制器中引脚的命名通常非常混乱。印在电路板上的引脚名称其实并不那么有用,在寻址方面真正重要的是它的GPIO(General-purpose input/output)编号。GPIO是通用输入/输出的意思,是对可供应用程序使用的一组引脚的名称。如果你回到本文顶部的引脚图,你会注意到D4也是GPIO2,所以我使用2作为引脚编号。

Pin()类的构造函数需要第二个参数,它是常数,声明这个引脚是输出引脚。这意味着该引脚将被配置为被写入。当针脚被设置为0时,LED会打开,而当针脚被设置为1时,LED会关闭。当你用上面的Python语句将引脚2初始化为输出时,你可能会看到电路板上的LED立即打开,因为在默认情况下,这个引脚的状态是0。

如果你想关闭LED,你可以向该引脚写一个1:

# 关灯
>>> led.value(1)
>>> led.on()
# 开灯
>>> led.value(0)
>>> led.off()

记住,LED是反向接线的,所以on()把它关掉,off()把它打开!

第二个LED在D0引脚上,也被称为GPIO16。如果它存在,它也是反向布线的。

>>> led2 = machine.Pin(16, machine.Pin.OUT)
>>> led2.off()

如果你的电路板有第二个LED,上面的代码应该把它打开。第二个LED位于RST按钮附近。

MicroPython解释器支持控制结构,其方式与标准Python相同。可以用while循环、两个LED和time.sleep()函数创造一个小小的灯光秀:

>>> import time
>>> while True:
...     led.off()
...     led2.on()
...     time.sleep(0.5)
...     led.on()
...     led2.off()
...     time.sleep(0.5)
...

欣赏完灯光秀后,你可以按Ctrl-C键跳出while-loop并停止它。然后你可以按Ctrl-X键退出REPL,回到rshell提示符。最后,你可以按Ctrl-D退出rshell,回到你的终端。

1.6 MicroPython的文件系统

在ESP8266板上,实际上没有文件存储器,所以MicroPython分配了一部分闪存并在其中创建了一个虚拟文件系统。本教程推荐的ESP8266开发板带有4MB的闪存,这足以容纳MicroPython固件和小型文件系统。

两个文件在MicroPython中具有特殊的意义,名字分别是boot.py和main.py。作为正常启动程序的一部分,MicroPython会在内部文件系统中寻找带有这些名字的文件,如果找到它们,它就会自动执行它们。正如你即将看到的,MicroPython固件已经提供了一个boot.py文件,但它不包括main.py,它是留给开发者提供的。所以要创建保存在板子闪存中的应用程序,需要做的就是把它作为main.py写到板子上。

REPL的rshell工具提供了访问文件系统的功能。所以,让我们用USB线把板子连接到电脑上,然后启动rshell。当你进入rshell提示符时,输入help来查看它提供的所有命令:

$ rshell --port /dev/ttyACM0
Using buffer-size of 32
Connecting to /dev/ttyACM0 (buffer-size 32)...
Trying to connect to REPL  connected
Retrieving sysname ... esp8266
Testing if ubinascii.unhexlify exists ... Y
Retrieving root directories ... /boot.py/
Setting time ... Jul 06, 2023 15:05:37
Evaluating board_name ... pyboard
Retrieving time epoch ... Jan 01, 2000
Welcome to rshell. Use Control-D (or the exit command) to exit rshell.
/home/andrew> help

Documented commands (type help <topic>):
========================================
args    cat  connect  date  edit  filesize  help  mkdir  rm     shell
boards  cd   cp       echo  exit  filetype  ls    repl   rsync

Use Control-D (or the exit command) to exit rshell.

但这些命令以一种非常有趣的方式工作,使你能够同时处理你的计算机中的文件系统和板上的文件系统。你可以使用路径和文件名来引用你电脑中的任何文件,但特殊目录/pyboard被映射到MicroPython的文件系统中。

home/andrew> ls /pyboard
boot.py
/home/andrew> ls /
boot/       home/       opt/        snap/       usr/        lib64@      swapfile   
cdrom/      lost+found/ proc/       srv/        var/        lib@       
dev/        media/      root/       sys/        bin@        libx32@    
etc/        mnt/        run/        tmp/        lib32@      sbin@      
/home/andrew> cat /pyboard/boot.py
# This file is executed on every boot (including wake-boot from deepsleep)
#import esp
#esp.osdebug(None)
import uos, machine
#uos.dupterm(None, 1) # disable REPL on UART(0)
import gc
#import webrepl
#webrepl.start()
gc.collect()

虽然修改和/或添加代码到boot.py中并没有什么不妥,但不去管这个文件,因为有些情况下MicroPython本身会修改这个文件。我更喜欢在main.py上进行所有的编码,因为它是可完全掌控的文件。

1.7 闪烁灯应用程序

为了使你所有的教程文件井井有条,让我们创建一个子目录,用来存放本章的代码。所以确保你的当前目录被设置为micropython-tutorial,并创建一个chapter3子目录:

/home/andrew/code/micro_esp/ch2> cat main.py
import machine
import time

led = machine.Pin(2, machine.Pin.OUT)
led2 = machine.Pin(16, machine.Pin.OUT)
while True:
    led.on()
    led2.off()
    time.sleep(0.5)
    led.off()
    led2.on()
    time.sleep(0.5)
/home/andrew/code/micro_esp/ch2> cp main.py /b
/bin/      /boot.py/  /boot/     
/home/andrew/code/micro_esp/ch2> cp main.py /pyboard/
Copying '/home/andrew/code/micro_esp/ch2/main.py' to '/pyboard/main.py' ...

要把这个文件上传到微控制器板上,你可以在rshell提使用cp命令, 拷贝完成后reset一下即可生效。

关闭

用微信“扫一扫”