没有目的,单纯好玩,忙里偷闲,嵌入式设备入门点滴备忘。
文章目录
1. 写在前面
- 乐鑫提供了 ESP-IDF 的开发环境,也有详细的指南,无奈折腾了挺久也没搞定,试过 vscode 的插件方式,也总是在 python 环境那里卡住,又不想搞乱已经配置好的 conda 虚拟环境,所以尝试了熟悉的 arduino 路线,没想到非常顺滑。
- 本篇博客是备忘在 ubuntu 20.04 下配置 arduino 中的 esp32 开发环境流程,对其他系统也有一定启发性,尤其是现在教程繁多,大家的代码和板子又不是完全相同,如何调通自己的板子和程序,需要一定的搜索和思考能力。
2. Step by step 配置流程
基本流程是,在 Arduino 中添加板子,添加库,测试例子。
2.1 硬件情况
-
本文所使用的 ESP32 购自某宝,宣称使用乐鑫官方 ESP-WROOM-32 模组,支持 wifi & 蓝牙,名字叫 Goouu-esp32,如下图。
-
这块板子的引脚如下,标号与其他 ESP32 稍有区别,这里也着实让我这个新手多花了点时间,板子上标注的
GXX
就是 GPIO 的编号,在连接其他设备时遵循编号去找对应的针脚就可以。 -
注意:这里主机我用的是
Ubuntu 20.04
,主要是装库方便,寻求 win 下步骤的可以不用看了。
2.2 Arduino 中添加 ESP32 板子支持
-
Ubuntu 下的
Arduino
和Git
安装就省略了,直接从 Arduino 这里开始。在 File - Preferences 偏好设置中加入额外的板子管理器链接https://dl.espressif.com/dl/package_esp32_index.json
如下图:
-
打开 Tools - Board - Boards Manager,在其中搜索
esp32
,能够看到乐鑫官方的板子库,安装它。
-
安装完成后就可以在 Tools - Board - ESP32 Arduino 中选择
ESP32 Dev Module
,选好后,Arduino 右下角如下图所示:
2.3 测试 ESP32 GetChipID 例程
-
下面我们测试一个例子能否编译并烧录进去,在 File - Examples - ESP32 中选择 GetChipID,别忘了 usb 连上 ESP32 板子,然后给串口开个权限,我这里是 ttyUSB0,请酌情修改:
sudo chmod 777 /dev/ttyUSB0
-
例子代码如下。
uint32_t chipId = 0; void setup() { Serial.begin(115200); } void loop() { for(int i=0; i<17; i=i+8) { chipId |= ((ESP.getEfuseMac() >> (40 - i)) & 0xff) << i; } Serial.printf("ESP32 Chip model = %s Rev %d\n", ESP.getChipModel(),ESP.getChipRevision()); Serial.printf("This chip has %d cores\n", ESP.getChipCores()); Serial.print("Chip ID: "); Serial.println(chipId); delay(3000); }
-
点击对勾编译,报错如下:
ModuleNotFoundError: No module named 'serial' exit status 1 Error compiling for board ESP32 Dev Module.
-
这里 ESP32 编译使用了 python 环境,而我们缺少一个
pyserial
包,目前我的 Arduino 是从桌面快捷方式启动的,没有共享到命令行的环境变量,而我命令行里是配置好了 python 的虚拟环境,里面有这个包,所以在 Arduino 的快捷方式里添加一下环境变量:sudo gedit /usr/share/applications/arduino-arduinoide.desktop #在 Exec 这一行添加指令 zsh -i -c ,使其从命令行执行,我使用的命令行是 zsh Exec = zsh -i -c /home/arduino-1.8.16/arduino
-
配置好后,重启 Arduino 再次编译这个例子,这回就没问题了。
-
点击箭头进行烧录,烧录没问题,打开 Tools - Serial Monitor 串口监视器,可以看到循环输出的板子 ID 号类似如下,到这一步板子的基本编程环境就搞定了。
15:07:39.062 -> ESP32 Chip model = ESP32-D0WDQ5 Rev 3 15:07:39.095 -> This chip has 2 cores 15:07:39.095 -> Chip ID: 11308360
2.4 测试 ESP32 Blink 例程
-
再测试一个最简单的亮灯例子,直接选择 File - Examples - 01 Basics 中的 Blink 闪灯例子,代码如下:
int LED_BUILTIN = 1; void setup() { pinMode(LED_BUILTIN, OUTPUT); } void loop() { digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level) delay(200); // wait for a second digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW delay(200); // wait for a second }
-
注意,这里 ESP32 没有定义
LED_BUILTIN
,这里看到了一些别的博客,有写 2 的,有写 23 的,对于这块板子都不行,实际上是这块板子的电路设计跟其他 ESP32 可能不完全相同,这也是我花了一点时间琢磨的地方,那么首先我们们看一下ESP32比较通用的针脚定义图,如下: -
那么,即使不同厂家画板子的走线不同,但是 GPIO 号对应的功能是不会变的,我们再上某宝看一下手头这块板子的电路图如下。虽然我不是专业搞硬件的,但是基本的电路原理还是懂一点,观察发现
LED
跟TXD0
是串在一起的,而下面的电路图中 TXD0 没有标 GPIO 号,它上面是 GPIO22,我们对应到上图中去看一看,TXD0
(TX0) 实际上对应了GPIO = 1
号。 -
在代码中将
LED_BUILTIN
定义为 1 ,编译后烧录完毕,成功点亮小蓝灯,并按间隔闪烁,虽然中间走了一点弯路,但是整个流程还是奔着 “知其所以然” 的方向去的,即使再换个厂家的 ESP32 板子,我相信也能给你一定的启发。
esp32 blink 程序效果