模板: ESP32-S2 USE
环境设置
环境设置是在 Windows 10 系统下进行,用户可以选择使用 Arduino 或 ESP-IDF 和使用 Visual Studio Code 作为 IDE 进行开发, Mac/Linux 操作系统用户请参考官方说明
Arduino
1. 下载安装Arduino IDE,注意要默认配置及全英文路径如下图所示
2. Arduino IDE安装ESP32库,详细安装过程如下,相关资料请点击参考
其中下面第一行URLs适用于国外用户在线安装,第二行URLs适用于中国大陆用户在线安装,用户根据自己情况填写其中一行即可,考虑到在线安装经常失败, 推荐中国大陆用户从阿里云盘下载安装包离线安装arduino-esp32,参考链接(注意, 在线安装失败要全部卸载掉已经下载好的安装文件默认在C:\Users\zhongshaohua\AppData\Local\Arduino15\文件夹下,否则离线安装会失败)
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json https://arduino.me/packages/esp32.json
3. 打开VSCode,安装Arduino和C/C++插件(注意使用Microsoft Publisher)如下图所示
4. 安装插件后,按F1输入Preferences Open Settings (UI)按Enter找到Arduino插件设置,如下图所示
5. 按F1输入Arduino Board Config按Enter设备板子下载参数如下图所示
ESP-IDF
1 下载安装esp-idf-tools-setup最新离线版本,安装放在全英文路径且默认配置(自动安装 ESP-IDF , Python ,Git及设置环境变量),ESP-IDF 的路径放在其它地方,如下图所示
2. 下载安装VS Code,放在全英文路径下且默认配置安装如下图所示.
3. 打开VS Code,按Ctrl+P,输入ext esp-idf-extension安装配置插件如下图所示
4. VSCode中按下F1,输入Configure ESP-IDF extension进行配置,打开配置页面后选择USE EXISTING SETUP,过程如下图所示
CircuitPython
1. 下载安装最新Thonny IDE后,打开Thonny IDE -> Configure interpreter...,如下图所示
2. 按住板子上BOOT键 , 再接入USB线缆,查找设备管理器或对应COM口,下载或运行程序,具体请查看硬件连接章节
3. 按照下图步骤所示选择 ESP32-S2 的 CircuitPython 固件下载,下载前会清除 ESP32-S2-Pico 的 Flash 内容,整个下载过程持续1分钟左右
4. 参考CircuitPython Documentation 进行编程
MicroPython
1. 下载安装最新Thonny IDE后,打开Thonny IDE -> Configure interpreter...,如下图所示
2. 按住板子上BOOT键 , 再接入USB线缆,查找设备管理器或对应COM口,下载或运行程序,具体请查看硬件连接章节
3. 按照下图步骤所示选择 ESP32-S2 的 在线 MPY 固件下载,下载前会清除 ESP32-S2-Pico 的 Flash 内容,整个下载过程持续1分钟左右
4. 若需要 Tonny IDE 下载本地固件 ESP32_S2_WROVER-20220117-v1.18.bin , 请按照如下图所示操作, 步骤3 和 步骤4 选择其一即可,推荐按照此步骤4操作
5. 参考MicroPython Documentation , releases note进行编程
示例说明
Arduino示例
- 本小节结合 Arduino , Pico 扩展板 , 使用 ESP32-S2 的 AD/DA , SPI , I2C , WiFi 等外设
- 注意,USB 虚拟串口输出需要选择下图所示选项,且代码中加入开启 USB 虚拟串口 代码,代码可以参考File->Examples->USB->USBSerial
ADC/DAC
- 注意选择如下图所示的配置选择, 开启 USB CDC 和选择 USB update 模式
- 下载有出现如下图所示错误是提示下载完后需要手动复位才能运行程序
示例程序简析
- 4个AD,1个DA宏定义,DA初始化输出值127,setup()函数中初始化USB串口输出
#define adc0 6 #define adc1 7 #define adc2 8 #define adc3 1 #define dac_pin 17 uint16_t adc_Value = 0; // variable to store the value coming from the sensor uint8_t dac_value = 127; //DA output value void setup() { // put your setup code here, to run once: HWSerial.begin(115200); HWSerial.setDebugOutput(true); USB.onEvent(usbEventCallback); USBSerial.onEvent(usbEventCallback); USBSerial.begin(); USB.begin(); delay(4000); // USBSerial.printf("Setup done"); }
- DA每隔5秒增加1 , 一直到255后从0开始增加 , 使用其中一个AD脚连接DA , 检测DA运行 , 第28行至第30行是电池电压检测
void loop() { // put your main code here, to run repeatedly: /* * you can wire adcx pin to dac pin to test AD/DA. */ dac_value++; dacWrite(dac_pin,dac_value); adc_Value = analogRead(adc0); USBSerial.printf("ADC value of GPIO6 is %d\n",adc_Value); USBSerial.printf("convert to voltage is %fV\n",adc_Value/8191.0*3.3); adc_Value = analogRead(adc1); USBSerial.printf("ADC value of GPIO7 is %d\n",adc_Value); USBSerial.printf("convert to voltage is %fV\n",adc_Value/8191.0*3.3); adc_Value = analogRead(adc2); USBSerial.printf("ADC value of GPIO8 is %d\n",adc_Value); USBSerial.printf("convert to voltage is %fV\n",adc_Value/8191.0*3.3); /* * Get battery volatage,please solder the 0R resistor on R37 position * and remove the R36(0R). * * please subtract bias(0.34) when get AD value of GPIO1, because the * 5% precision resistor brings about to bias, we will fix it in the * next version * */ adc_Value = analogRead(adc3); USBSerial.printf("ADC value of GPIO1 is %d\n",adc_Value); USBSerial.printf("convert to battery voltage is %fV\n",(adc_Value/8191.0*3.3-0.34)*3); delay(5000); }
UART
- 注意选择如AD_DA例程下载所示的配置选择, 开启USB CDC和选择USB update模式
- 下载有出现如AD_DA例程下载所示错误提示需要下载完后需要手动复位才能运行程序
- UART例程结合Pico-GPS-L76B读取NMEA,解析并转换坐标系后输出等
示例程序简析
- 包含NMEA0183库,实例化NMEA0183Msg,NMEA0183,指定串口1的引脚
/* * NMEA0183 library is from https://github.com/ttlappalainen/NMEA0183 * Thanks to ttlappalainen */ #include "NMEA0183.h" #include "NMEA0183Msg.h" #include "NMEA0183Messages.h" #include "USB.h" #if ARDUINO_USB_CDC_ON_BOOT #define HWSerial Serial0 #define USBSerial Serial #else #define HWSerial Serial USBCDC USBSerial; #endif tNMEA0183Msg NMEA0183Msg; tNMEA0183 NMEA0183; #define RXD2 3 #define TXD2 2
- NMEA0183.Begin()函数中指定NMEA0183数据流串口和波特率 , 初始化USB串口功能, loop()函数中轮询NMEA0183数据流接收
void setup() { // put your setup code here, to run once: Serial1.begin(9600,SERIAL_8N1,RXD2,TXD2); NMEA0183.Begin(&Serial1,1, 9600); HWSerial.begin(115200); HWSerial.setDebugOutput(true); USB.onEvent(usbEventCallback); USBSerial.onEvent(usbEventCallback); USBSerial.begin(); USB.begin(); delay(4000); } void loop() { // put your main code here, to run repeatedly: tNMEA0183Msg NMEA0183Msg; while (NMEA0183.GetMessage(NMEA0183Msg)) { USBSerial.printf(NMEA0183Msg.Sender()); USBSerial.printf(NMEA0183Msg.MessageCode()); for (int i=0; i < NMEA0183Msg.FieldCount(); i++) { USBSerial.printf(NMEA0183Msg.Field(i)); } USBSerial.printf("\n"); /* * To Be Done * WGS84 coordinate convert to GCJ02 coordinate */ } }
I2C
注意选择如AD_DA例程下载所示的配置选择, 开启USB CDC和选择USB update模式
下载有出现如AD_DA例程下载所示错误提示需要下载完后需要手动复位才能运行程序
本例程使用I2C读取Pico-10DOF-IMU上的加速度计, 陀螺仪, 地磁计 , 气压计数据后融合计算得出当前姿态 , 上电时请根据串口信息摆放传感器进行当地地磁校准
程序下载完成后, 按下复位键, 打开sscom串口助手, 选择对应COM口 , 选择DTR 然后等待串口输出对应信息进行校准
SPI
- 注意选择如AD_DA例程下载所示的配置选择, 开启USB CDC和选择USB update模式
- 下载有出现如AD_DA例程下载所示错误提示需要下载完后需要手动复位才能运行程序
- 本例程测试ESP32-S2-LCD-0.96上的LCD和扫描打印WiFi热点信息
示例程序简析
- setup()中初始化USB串口,WiFi的STA模式, 在loop()函数中开启LCD显示,USB串口打印输出扫描到的WiFi信息
void setup() { HWSerial.begin(115200); HWSerial.setDebugOutput(true); USB.onEvent(usbEventCallback); USBSerial.onEvent(usbEventCallback); USBSerial.begin(); USB.begin(); WiFi.mode(WIFI_STA); WiFi.disconnect(); delay(100); USBSerial.printf("Setup done"); } void loop() { // USBSerial.printf("This is a test\r\n"); led_init(); led_test(); lcd_dev.lcd_init(); lcd_dev.lcd_test(); USBSerial.printf("scan start\r\n"); // WiFi.scanNetworks will return the number of networks found int n = WiFi.scanNetworks(); USBSerial.printf("scan done\r\n"); if (n == 0) { USBSerial.printf("no networks found\r\n"); } else { USBSerial.printf("%d",n); USBSerial.printf(" networks found\r\n"); for (int i = 0; i < n; ++i) { // Print SSID and RSSI for each network found USBSerial.printf("%d",i + 1); USBSerial.printf(": "); USBSerial.printf("%s",WiFi.SSID(i)); USBSerial.printf(" ("); USBSerial.printf("%d",WiFi.RSSI(i)); USBSerial.printf(")\r\n"); delay(10); } } USBSerial.printf("\r\n"); // Wait a bit before scanning again delay(3000); }
LCD
- ESP32-S2-LCD-0.96上的LCD驱动使用了ST7735,本小结使用TFT_eSPI库进行显示,注意提前安装arduino-esp32,TFT_eSPI等库
- 打开TFT_eSPI库文件夹(默认安装位置注意下图路径)下User_Setup_Select.h和User_Setups/Setup43_ST7735.h文件并按如图所示修改
- 在TFT_eSPI的example文件的setup()函数中加入背光引脚的初始化
ePaper
- 本小结使用ESP32-S2-Pico或ESP32-S2-LCD-0.96和Pico-ePaper-2.13演示Pico-ePaper系列产品
- 下载解压e-Paper ESP32 Driver Board中的examples\esp32-waveshare-epd文件夹到Arduino\libraries文件夹下,再打开Arduino\libraries\esp32-waveshare-epd\src\DEV_Config.h文件更改相关引脚,如图所示
- 打开Arduino IDE , 在File->Examples->waveshare-e-Paper中选择型号后进行编译下载 , 如图所示
MPY示例
MPY 是 MiroPython 缩写,本小节结合 MPY, Pico 扩展板 , 详细示例请查阅示例程序MicroPython文件夹,参考Micropython Documents