第1章 在我们开始ESP32之前
ESP32是一款出色的设备。它价格低廉,足以用于那些对微控制器而言勉强可行的任务,同时性能又足够强大,能够处理直到最近对于这种低成本设备来说仍难以胜任的任务。它拥有两个内核、WiFi、蓝牙和低功耗模式,再加上一个运行速度快且内存足以完成大多数工作的处理器。它还配备了众多内置外设和接口,如PWM、I2C、SPI、UART和ADC。此外,它还有一些新颖的外设,例如电机控制器PWM器件、远程控制子系统、触摸输入、正弦波生成DAC以及一个超低功耗处理器,该处理器可以在主处理器处于睡眠模式时运行。
所有这些特性使得ESP32适用于非常简单的任务,例如门或窗的开启传感器,也适用于更为复杂的任务,比如电机控制器。
ESP32家族
ESP32由中国公司乐鑫信息科技(Espressif Systems)设计。该公司凭借其首款处理器ESP8266赢得了声誉,ESP8266在一个体积小巧、成本低廉的封装中集成了WiFi子系统。ESP8266赢得了众多爱好者的青睐,但在早期,由于缺乏英文文档,人们很难了解这款设备。随着ESP32系列的推出,这些问题已成为过去。如今,不仅有大量优质的文档,还有官方的软件开发工具包——乐鑫物联网开发框架(ESP-IDF),它可在Windows、Linux和macOS系统上运行,支持C语言和C++。该框架专为构建物联网(IoT)应用而设计,提供了Wi-Fi、蓝牙、电源管理及其他系统功能。
ESP确实存在一个问题,即没有单一的参考实现。对于像Arduino系列以及树莓派(Raspberry Pi)的设备,产品和信息都来自单一源头,这让事情变得更简单。不过,目前市面上大多数ESP32设备的差异都很小,而且它们之间的兼容性非常高。
首先需要明确的是,ESP32系列并非基于非常常见的ARM处理器。目前,ESP32设备要么使用Xtensa LX6或LX7处理器,要么(不太常见的情况)使用开源的RISC-V处理器。由于ESP-IDF支持所有这些处理器,因此使用它们中的任何一种都没有问题。不过,大多数ESP32开发设备使用的是LX6。
在撰写本文时,常见的ESP32设备有五种,基于LX6/7处理器的S系列,以及采用RISC-V处理器的C系列:
S系列:
- ESP32(2014年):搭载LX6双核处理器,支持WiFi 4和蓝牙
- ESP32-S2(2019年):搭载LX7单核处理器,仅支持WiFi 4
- ESP32-S3(2020年):搭载LX7双核处理器,支持WiFi 4和蓝牙 C系列:
- ESP32-C3(2020年):采用RISC-V处理器,支持WiFi 4
- ESP32-C6(2021年):采用RISC-V处理器,支持WiFi 6
这些设备在内存配置、GPIO引脚及其他功能方面也存在差异。较新型号的设备似乎更倾向于使用RISC处理器,而非LX6/7处理器。在撰写本文时,ESP32是价格最低且最常见的型号。不过,性能显著提升的ESP32-S3也很容易买到。本书中会同时以ESP32和ESP32-S3作为示例。
开发板
大多数情况下,你可能会使用的开发板是由包含基本器件的表面贴装模块构成的。这些模块表现为安装在开发板上的小型银色盒子。
正是这个“银色盒子”决定了一个开发系统的特性。制造商们会选择一个模块,再添加一些组件,从而制作出开发板。值得一提的是,你也可以购买未安装在印刷电路板(PCB)上的模块,将其设计到自己的电子设备中,打造一个100%定制化的ESP32。
开发板的主要任务是将TTL串口转换为USB接口,该接口为开发机器提供电源和串口连接。您可以在下方看到一个典型的电路图:
这是乐鑫公司生产的ESP32 DevKitC开发板,它被用作大多数其他开发板的设计起点。此外,还有一款基于S3的DevKitC开发板。
关键在于,开发板通常对所使用的ESP32模块几乎没有额外添加什么。也就是说,开发板的主要特性由所使用的ESP32模块决定,但在引出到外部引脚的GPIO线路以及提供的额外硬件方面仍可能存在差异——有些开发板会配备一个连接到GPIO 2的LED。
购买开发板时,首先要考虑的是它使用的是哪种模块。在撰写本文时,主要有两个模块系列——WROOM和WROVER。这两个系列的主要区别在于,WROVER系列配备了支持视频设备所需的串行RAM器件。
除此之外,这两个系列完全相同。几乎所有的开发板都采用WROOM或WROOM S3模块,这些模块有多个型号,差异大多较小。最常见的型号如下:
Name | Flash Memory |
---|---|
ESP-WROOM-32 | 4 MB |
ESP32-S3-WROOM-1 | 8 MB |
ESP-WROOM-32-8M | 8 MB |
ESP-WROOM-32-16M | 16 MB |
ESP32采用LX6双核处理器,而S3则使用LX7处理器。还有一些其他配置的型号,针对特定使用场景提供相应功能。32U系列(如ESP-WROOM-32U等)配备了用于连接外部天线的U.FL(IPEX)接口,而非内置PCB天线;HT系列则能够承受更高的温度。一些非常小巧的开发板还采用了ESP-Pico模块,该模块有多种闪存容量可供选择。
开发板的不同之处还体现在引出到外部连接器的GPIO线路上。
下面展示了一个典型的ESP32:
S3通常有两个接口,一个UART接口和一个USB接口,并且通常有一个可寻址的RGB LED连接到GPIO38引脚上:
小型开发板通常引出到外部的GPIO引脚数量较少。例如:
通常有两个开关,分别是引导加载程序(boot loader)开关和复位(reset)开关,还有一个电源LED灯——这个灯很讨厌,不使用电烙铁的话无法将其关闭。开发板通常还内置一个串口转USB芯片,常见的是CP2120或CH340。有些用户称其中一种芯片更好,但实际上两者都能正常工作。大多数开发板采用与乐鑫设计的开发板相同的引脚分布,但也会遇到一些细微差异,以及更小尺寸的版型——这类版型引出到外部的GPIO引脚数量更少。
如前所述,你也能找到没有USB接口的开发板。这类开发板通常通过电源引脚直接供电,并且在没有USB转换功能辅助的情况下,通过UART串行接口进行编程。使用这类开发板会稍微麻烦一些,因为你得想办法连接到UART,但一旦解决了供电和串行连接的问题,其工作原理就和其他开发板完全一样了。
这一切意味着,尽管ESP32开发板的种类多到可能让人眼花缭乱,但它们都具有高度的兼容性,并且编程方式相同。除了可能存在的内存大小和速度差异问题外,为一款开发板编写的程序应该也能在另一款上运行。这条规则唯一的例外是,如果某款开发板没有将GPIO引脚引出供外部使用,但所有标准尺寸的开发板都拥有相同的外部连接接口。
在开发板中,你最可能接触到的ESP32/S3硬件的核心要点如下:
- 双核LX6/LX7处理器,灵活时钟频率最高可达240 MHz
- 520KB静态随机存取存储器(SRAM),以及4/8MB板载闪存
- 支持设备和主机模式的USB 1.1接口
- 低功耗睡眠和休眠模式
- 34/48个多功能通用输入输出(GPIO)引脚,10/14个触摸(电容式)传感器
- 4个串行外设接口(SPI)、2个集成电路总线(I2C)、3个通用异步收发传输器(UART)、2个集成电路内置音频总线(I2S)、控制器局域网总线(CAN bus)、1/2个12位模数转换器(ADC)、2个8位数模转换器(DAC,仅ESP32具备)以及16路脉冲宽度调制(PWM)输出
- 片上加速加密硬件
- 独立的低功耗处理器
虽然现在深入探讨细节还为时过早,但一张ESP32的引脚分布图能让你清楚了解这款设备的多功能性:
注意,带有向内箭头的线路仅用于输入,带有波浪线的线路兼容PWM。另外请注意,GPIO6至GPIO11旁标有感叹号,这表明这些引脚不可使用,因为它们构成了与闪存的接口。
ESP32 S3的引脚排列与之类似但有所不同,且没有仅用于输入的引脚:
还有DevKitM变体,其在一些引脚位置上有所不同。本书中的所有图表均使用ESP32和ESP32 S3 C开发板,因此请确保你所使用的开发板具有相同的引脚排列。
复位和启动
几乎所有开发板都配备的这两个按钮,了解它们的实际功能以及为什么通常不需要用到它们是很有必要的。顾名思义,复位/使能按钮用于重置系统并重新启动。单独按下启动按钮不会有任何反应,只有在按下启动按钮的同时按下复位/使能按钮,系统才会进入“固件下载模式”,并运行加载程序,以便通过串口下载新代码。
进入下载模式后,你需要使用esptool之类的工具来下载代码,不过像VS Code这样的集成开发环境(IDE)也能完成这项工作,具体可参见下一章。相关的实际通信协议有文档说明,但通常你无需关注这些细节。
复位使能按钮连接到模块上的EN线,而启动按钮连接到GPIO0。这意味着你不能将GPIO0用于其他用途:
实际上,你很少需要使用启动按钮来下载代码,因为大多数开发板采用标准配置,将串口的DTR和RTS控制线分别连接到EN引脚和GPIO0引脚。
你可以发现,通过切换串口控制线,能够实现系统复位或进入固件上传模式。这意味着,你通常无需手动按按钮,因为用于上传或运行代码的软件会自动完成这项工作。了解这一点很重要,因为如果你将串口用于其他用途,就需要留意RTS和DTR线的使用方式,更多内容参见第15章关于串口的介绍。
期待内容
本书中没有完整的项目——尽管有些示例已经非常接近完整项目,而且显然其中一些示例可以组合起来构建出成品项目。之所以这样安排,是因为本书的重点在于学习事物的工作原理,以便你能够进一步去做一些非标准化的事情。
重要的是,你能够推理出处理器在做什么,以及它如何与现实世界进行实时交互。这是桌面编程和嵌入式编程之间的重大区别。在桌面编程领域,你其实不太在乎某件事何时发生,但当你为物理系统编程时,你会非常在意这一点。
这是一本关于理解通用原理并使事物在尽可能底层运行的书籍。当你直接与硬件打交道时,了解正在发生的情况至关重要。
所有示例都尽可能基础,代码设计也力求通俗易懂。在大多数情况下,这意味着要避免使用那些看似凭空出现的常量,以及会掩盖基本步骤、让人难以理解的函数。此外,错误处理也精简到了最低限度——如果添加错误处理代码,简单的程序会显得复杂。当然,完全可以将这些示例重构为更接近生产级别的代码,而且做这项工作所花费的精力,远比让这些基础程序首先能正常运行要少得多。
本书没有介绍多种可能的开发环境配置,而是采用了VS Code,并搭配使用ESP-IDF所需的附加组件。你也可以选择其他方法,但VS Code能让入门过程变得非常简单快捷。
你需要准备些什么?
嗯——至少需要一块ESP32或ESP32 S3!实际上,建议你多买几块,以防出现意外情况。ESP32开发板的价格会根据你购买的数量而有所不同。如果是单块购买,最便宜的货源来自中国,一块ESP32开发板大约3美元,ESP32 S3大约5美元,当然,还要加上邮费。
你还需要一台机器来运行编写程序所需的软件,编写好的程序可以下载到ESP32中——这台机器就是开发机。好消息是,你几乎可以使用任何台式机——个人电脑(PC)、苹果电脑(Mac)或Linux系统的电脑都行。
至于除ESP32之外的其他硬件,你需要一块免焊原型板和一些连接线(也称为杜邦线)。你还需要一些LED灯、若干电阻、一些2N2222或其他通用晶体管,以及后续章节中会用到的各种传感器。有关链接,请参见I/O Press网站上本书的资源页面。
ESP32开发板在原型制作时存在一个特殊问题,它的宽度太大,无法适配标准的原型板。有一些“超薄”开发板,其优势在于能够适配标准原型板,但还有一个简单的解决办法:使用两块原型板,将开发板的一侧插在一块原型板上,另一侧插在另一块原型板上。
从原型板上插拔ESP32这类较大的器件也有技巧可言。诀窍是使用塑料撬棒,缓慢且均匀地将器件的两端从板上撬起。
虽然你不需要会焊接,但你需要能够在原型板上连接电路。万用表(不到10美元)很有用,但如果你认真对待电子项目,投资购买一台逻辑分析仪(不到100美元)会很快物有所值。你可以买到小型的逻辑分析仪,通过USB端口连接,再配合应用程序就能显示电路中发生的情况。只有借助多通道逻辑分析仪,你才有希望弄明白电路中发生了什么。如果没有它,也没有掌握使用它的基本技巧,你基本上就如同盲目摸索,只能猜测可能出了什么问题。
最后,如果你对此更为认真,那么投资一台小型示波器也是值得的,它可以用来检查微控制器输出的那些本应是数字信号的模拟特性。不过,如果你必须在这两种仪器之间做出选择,逻辑分析仪应该是你的首选。
值得注意的是,ESP32生成的信号可能过快,以至于低成本示波器和逻辑分析仪无法可靠检测——这类仪器的工作频率通常在1MHz到25MHz之间。这意味着,处理远快于1微秒的脉冲会很困难,因为你无法依赖这些仪器。市面上有价格适中的200MHz和500MHz逻辑分析仪,如果你认真对待硬件工作,购置一台无疑是值得的。需要知道的是,如果你试图处理超出它们工作范围的信号,这两种仪器都可能给出误导性的结果。
本书还假定你具备类C语言的编程能力——Java、C#、Python都与C语言相似,当然,C++也是如此。本书没有篇幅教授C语言编程,但书中的程序足够简单易懂,任何不常见的代码都会有相应解释。如果你想详细学习C语言,可参阅《Fundamental C: Getting Closer To The Machine》,ISBN:9781871962604。
社区
由于有众多公司生产ESP32开发板,因此不像 Arduino 或树莓派那样有一个统一的ESP32社区。乐鑫(Espressif)运营着一个活跃的论坛,网址是:https://www.esp32.com/index.php 这是一个提问以及查看是否已有相关答案的好地方。当然,还有 Stack Overflow 这个平台。
在任何论坛上,答案的质量参差不齐,既有误导性的,也有非常出色的。一定要结合自己的认知来评估所得到的建议。对于那些给出的答案明显误解了你的问题的人,要友善并给予理解。
你还需要记住,这些建议通常也是带有偏见的。有C++经验的程序员往往会告诉你一种做法,但其复杂程度不如直接用C语言解决来得简单。电子学新手会给你推荐基于“现成模块”的解决方案,而实际上用几个便宜的元件就能实现更简单的替代方案。另一方面,电子学专家则常常建议开发定制硬件,而这种硬件可能需要数月时间才能调试好,其实现成的解决方案既便宜又好用。即便你得到的建议100%正确,它也未必适合你。
通常来说,绝不要听从任何你不理解的建议。
总结
- 中国制造商乐鑫(Espressif)推出的ESP32,鉴于其低廉的成本,是一款功能极为强大的设备,非常适合用于制作原型机、一次性产品以及量产设备。
- 使用C语言为ESP32编程是个绝佳选择,因为它既简洁又高效。
- ESP-IDF(乐鑫物联网开发框架)支持C语言,其专为构建物联网(IoT)应用而设计,提供了Wi-Fi、蓝牙、电源管理及其他系统功能。
- 市面上的ESP32开发板种类繁多,让人很难知道从何入手。不过,用于制作这些开发板的ESP32模块数量并不多,而且它们之间的差异也很小。
- 原版ESP32仍然有售,且价格低于其替代产品ESP32 S3。
- 从带有全套外露引脚的WROOM-32 ESP32或ESP32 S3开发板入手。
- 你需要一对原型板和一些原型线。
- 你还需要一个万用表,最好再配备一台逻辑分析仪。有了这些基本仪器后,你可以根据经济能力添置其他设备。
- 如果说有一件实验室设备是你确实应该购置的,那就是逻辑分析仪。没有它,你对电路中发生的情况就只能靠猜测。
- 乐鑫运营着一个活跃的ESP32社区论坛,如果你遇到难题,这里是寻求建议的好地方。不过,对于任何提供的建议,一定要进行评估,通常情况下,除非你理解了,否则不要轻易接受。