ESP32-S2-Pico
| ||||||||||||||||||||
| ||||||||||||||||||||
说明
产品简介
ESP32-S2-Pico, ESP32-S2-LCD-0.96体积小巧,外设接口丰富,集成低功耗 Wi-Fi 系统级芯片(SoC)和大容量存储器,支持 Raspberry Pi Pico 扩展板生态的开发板。具有硬件加密加速器、RNG、HMAC 和数字签名 (Digital Signature) 模块,满足物联网的安全要求。多种低功耗工作状态满足在物联网 (IoT)、移动设备、可穿戴电子设备、智能家居等应用场景的功耗需求。
产品特性
ESP32-S2 普通版特性:
- 支持Raspberry Pi Pico 扩展板生态,满足创意十足物联网应用开发
- Xtensa 单核 32 位 LX7 微处理器 ESP32-S2FH4,支持高达 240 MHz 的时钟频率
- 集成 320KB SRAM、128KB ROM,8MB PSRAM、4MB Flash 存储器
- 支持 IEEE802.11 b/g/n,板载 2.4 GHz WiFi 陶瓷天线,最高 150Mbps 数据传输率
- 采用 Type-C 接口,紧跟时代潮流,无需纠结正反插
- 片上集成全速 USB OTG,SPI,I2C,UART,ADC,D/A,PWM,DVP 8/16 Camera 接口,LCD 接口(8 位串口 RGB/8080/6800),TWAI 控制器(兼容 ISO11898-1),电容式传感 GPIO,温度传感器和 RMT (TX/RX)
- 板载 1.8A 电流的高效率升降压 DC-DC TPS63000 电源 IC
- 支持多种低功耗工作状态,可调节通信距离、数据率和功耗之间的最佳平衡,满足各种应用场景的功耗需求
- 邮票孔设计,可直接焊接集成到用户自主设计的底板上
ESP32-S2 LCD 版特性:
- ESP32-S2 普通版所有特性
- 板载 0.96 英寸 160×80 像素的 65K 彩色 IPS LCD 显示屏
- 板载单节 3.7V 锂电池充放电接口,适用移动类型物联网产品设计
硬件说明
- Pico扩展板堆叠接入ESP32-S2-Pico或ESP32-S2-LCD-0.96注意避免引脚交叉使用
- 注意不要遮挡ESP32-S2-Pico或ESP32-S2-LCD-0.96的天线部分,若WiFi信号过差,尝试调整板子方向
- 下载程序时,先断开Type-C USB,再按住 BOOT 按键在接入 Type-C USB 上电,或按照下面步骤操作
- 按住 BOOT 按键不放,再按下 RESET 按键
- 先释放 RESET 按键,再释放 BOOT 按键
- ESP32-S2-LCD-0.96 板载单节 3.7V 锂电池充放电接口,使用 MX1.25 连接器,注意电池正负极
引脚说明
ESP32-S2-Pico, ESP32-S2-LCD-0.96引出引脚相同, 所有引出的引脚可通过ESP32-S2强大的IO MUX把引脚设置 SPI,I2C,UART,TWAI,AD/DA,I2S等硬件功能,其中
- 将默认UART0引脚放固定位置不建议设置为其它功能
- ESP32-S2 有 2 个 8 位 DAC 可独立地工作通道
- ESP32-S2的USB引脚(GPIO19,GPIO20)可用于固件下载和串口打印等功能
- 更多引脚信息查看ESP32-S2 Datasheet3.10外设管脚分配章节和原理图
ESP32-S2-Pico
ESP32-S2-LCD-0.96
产品尺寸
其它
ESP32-S2-Pico, ESP32-S2-LCD-0.96可使用CircuitPython,MicroPython,C/C++(Arduino,ESP-IDF)进行快速开发产品原型,以下简要介绍三种开发方式
CircuitPython
CircuitPython是一种编程语言,旨在简化在低成本微控制器板上进行编码实验和学习,是针对学生和初学者的 MicroPython 编程语言的开源衍生产品,由 Adafruit Industries 支持 CircuitPython 的开发和维护
MicroPython
MicroPython 是 Python 3 编程语言的精简高效实现,其中包括 Python 标准库的一小部分,并且经过优化,可在微控制器和受限环境中运行。
C/C++(Arduino,ESP-IDF)
乐鑫官方的 C/C++ 库方便快速安装, 如果遇到有下载问题请先查看FAQ解决
环境设置
环境设置是在 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
资料
文档
程序
软件
数据手册
FAQ
下载程序时,先断开Type-C USB,按住 BOOT 按键在接入 Type-C USB 上电或按照下面步骤操作:
- 按住 BOOT 按键不放,再按下 RESET 按键
- 先释放 RESET 按键,再释放 BOOT 按键
由于没有挂载USB转UART芯片, 需使用ESP32-S2自带的USB口进行下载程序和虚拟串口打印信息. Arduino的操作请参考示例程序章节.ESP-IDF+VSCODE的IDE环境下,USB虚拟串口示例直接使用esp-idf\examples\peripherals\usb\tusb_console工程, 使用时注意如下几点, 详细操作请查看gif图演示
1. USB下载程序前需要手动使ESP32-S2-Pico进入下载模式,方法一是在USB已接情况下先按住BOOT按键不放再按下RESET按键后释放,方法二是断开USB按住BOOT键上电,然后按F1选择COM口
2. USB下载COM号和USB虚拟串口COM号不一样, 下载完程序后需要手动按RESET按键复位运行应用程序再在vscode上重新切换虚拟串口COM号显示打印信息