树莓派Pico扩展板ESP32-S2使用教程

说明

产品简介

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 锂电池充放电接口,适用移动类型物联网产品设计

引脚分布

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 的开发和维护

  • CircuitPython 相关应用开发参考开发文档
  • CircuitPython 的Github库可以进行重新编译作定制开发
  • CircuitPython 在不同ESP32-S2核心主板上的相关固件

MicroPython

MicroPython 是 Python 3 编程语言的精简高效实现,其中包括 Python 标准库的一小部分,并且经过优化,可在微控制器和受限环境中运行。

  • Micropython 相关应用开发参考开发文档
  • Micropython 的Github库可以进行重新编译作定制开发
  • MicroPython 在不同ESP32-S2核心主板上的相关固件

C/C++(Arduino,ESP-IDF)

乐鑫官方的 C/C++ 库方便快速安装, 中国大陆用户遇到下载问题请查看FAQ解决

  • ESP32-S2 的 Arduino 开发手册
  • ESP32-S2 的 ESP-IDF 开发手册

环境设置

环境设置是在 Windows 10 系统下进行,用户可以选择使用 Arduino 或 ESP-IDF 和使用 Visual Studio Code 作为 IDE 进行开发, Mac/Linux 操作系统用户请参考官方说明

Arduino

1. 下载安装Arduino IDE,注意要默认配置及全英文路径如下图所示

2. Arduino IDE安装ESP32库,详细安装过程如下,相关资料请点击参考
其中下面第一行URLs适用于国外用户, 第二行URLs适用于中国大陆用户,用户根据自己情况填写其中一行即可

https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
https://www.arduino.cn/package_esp32_dev_index.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

MicroPython

硬件连接

  • Raspberry Pi Pico扩展板堆叠地接入ESP32-S2-Pico或ESP32-S2-LCD-0.96时注意避免引脚交叉使用,如相同位置GPIO脚的串口类扩展板
  • 注意不要遮挡ESP32-S2-Pico或ESP32-S2-LCD-0.96的天线部分,若静置时WiFi信号过差,需要调整板子方向
  • 下载更新程序需要先按住BOOT按键不放再按下RESET按键后释放或断开USB按住BOOT键上电,此时ESP32-S2的UART0(GPIO43,GPIO44)、USB可烧录程序
  • ESP32-S2-Pico或ESP32-S2-LCD-0.96默认上电会打印ESP32-S2状态信息,若要取消,需要往下图所示往寄存器写入参数,注意取消后不可再恢复

示例代码

本小节结合Arduino , Raspberry Pi Pico扩展板 , 使用ESP32-S2的AD/DA , SPI , I2C , WiFi等外设

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

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);
}

WiFi