ESP32

From DaqWiki
Jump to navigation Jump to search

= General information and links

Adafruit HUZZA32

    • USB power connector
    • connection for external 3.7 V battery, charged from USB
    • serial IO 3.3V RX+TX
    • 1x SPI (where is the rest?)
    • 1x I2C (where is the rest?)
    • 7 GPIO top, shared with 2 DACs and 6 ADCs
    • 7 GPIO bottom, shared with 7 ADCs and other functions
    • everything is 3.3V, *NOT* 5V safe
    • there is ADC1 and ADC2, not clear what it means, ADC voltage range not clear
    • ADC1 or ADC2 cannot be used with Wifi (this is unclear)
    • ESP32 SD card interface not connected
    • ESP32 serial IO connected to USB via USB-serial-bridge chip (the best I can tell)
    • power is USB with battery backup, one header pin provides regulated 3.3 V power to user (available current not clear, maybe 250 mA), battery voltage is on A13

ESP-WROOM-32 module

Information from the data sheets:

ESP32-D0WDQ6 chip

  • dual Xtensa® 32-bit LX6 microprocessors. The internal memory includes:
  • 448 KB of ROM for booting and core functions.
  • 520 KB of on-chip SRAM for data and instructions.
  • 8 KB of SRAM in RTC, which is called RTC FAST Memory and can be used for data storage; it is accessed by the main CPU during RTC Boot from the Deep-sleep mode.
  • 8 KB of SRAM in RTC, which is called RTC SLOW Memory and can be accessed by the co-processor during the Deep-sleep mode.
  • 1 Kbit of eFuse: 256 bits are used for the system (MAC address and chip configuration) and the remaining 768 bits are reserved for customer applications, including flash-encryption and chip-ID.
  • 8 MB or 4 MB QSPI SRAM or Flash (this is the 4 Mbyte flash on the WROOM module?)
  • 18 channels of 12-bit SAR ADC, sampling: RTC 200 ksps, DIG 2 Msps, range 0..2450 mV, 6% variation between chips, see data sheet about calibration
    • ADC1 ch0..7, ADC2 ch0..9
  • Hall sensor (just one? which ADC channel?)
  • 2 channels of 8-bit DAC (GPIO25, 26)
  • 10 touch-sensor inputs T0..T9
  • ULP processor, RTC memory
  • 10/100 ethernet MAC
  • SD/SDIO/MMC controller 80 MHz, 1, 4 and 8 bits
  • SPI/SDIO slave interface
  • 3 channels of UART (U0 full modem control, U1, U2 RTS/CTS only)
  • 2 channels I2C master or slave
  • 2 channels I2S master or slave (I2S0, I2S1)
  • 8 channels infra red receive or transmit (RMT_SIG_IN0..7 and _OUT0..7)
  • 8 channels pulse counter
  • 3 channels PWM controller
  • 3 channels of SPI (SPI, HSPI, VSPI) master or slave
  • JTAG (4 pins)
  • 16 channels LED PWM
  • 228 signals, Table 25
  • 48 pins, IO_MUX table
  • conflict between ADC2 and Wifi (and Bluetooth?)

WROOM module

Information from adafruit: https://www.adafruit.com/product/3405 and https://learn.adafruit.com/adafruit-huzzah32-esp32-feather

  - 240 MHz CPU, 520 kbytes SRAM, Wifi, Bluetooth, 4 Mbyte flash, interface for SD card.
  - 3x UART
  - 3x SPI
  - 2x I2C
  - 12 ADC inputs
  - 2 DAC
  - more goodies
  - everything is 3.3V, *NOT* 5V safe

Arduino IDE

On RPi3 running CentOS 7.3 (ARM 32 bit)

  • install pyserial (CentOS7)
#pip install pyserial ### no "pip"
#yum install python-pip ### "package not found" - no EPEL for ARM
curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
python get-pip.py 
pip install pyserial
  • install required packages (pyserial, libXrender, libXtst) (Raspbian Feb-2020)
apt-get install python-pip ### will pull many dependancies
pip install pyserial ### Successfully installed pyserial-3.4
apt-get install libxrender1 libxtst6
  • install arduino:
    • download from https://www.arduino.cc/en/main/software, untar: arduino-1.8.12-linuxarm.tar.xz
    • xz -d < arduino-1.8.12-linuxarm.tar.xz | tar xvf -
    • cd arduino-1.8.12
    • ./arduino ### it will bomb because libXtst is missing:
    • yum install libXtst
  • install ESP32 BSP:
  • try a "hello world" example:
    • in arduino
    • go to File->Examples->Communication->ASCII table
    • go to Sketch, do Compile and Upload (ESP32 should be connected)
    • compile successful (remember to install pyserial!), download successul, (CentOS7) after "reset using RTS" nothing happens, (Raspbian) after "reset using RTS" the new program runs
    • go to Tools->Serial monitor set speed to 9600, hit the reset button on the ESP32, it should start printing the ascii table
  • try TFT display example
    • follow general instructions here: https://learn.adafruit.com/adafruit-2-4-tft-touch-screen-featherwing/tft-graphics-test
    • install the libraries they ask for: Adafruit ILI9341, Adafruit GFX, Adafruit_ImageReader, Adafruit_ZeroDMA (each library will install big number of dependant libraries)
    • in File->Examples, open Adafruit ILI9341 -> graphicstest_featherwing
    • Sketch -> Compile, Upload (success, (CentOS7) after "reset using RTS" nothing happens, (Raspbian) after "reset using RTS" the new program runs
    • open Tools -> Serial monitor, set speed to 115200, hit ESP32 reset button, there will be test printed on the console and graphics drawn on the TFT display.

ESP32 DAC

Ardiuno sketch to set: 2.49V on A0 (DAC2) and 1.27V on A1 (DAC1).

#include <driver/dac.h>
void setup() {
  // put your setup code here, to run once:
  dac_output_enable(DAC_CHANNEL_1);
  dac_output_voltage(DAC_CHANNEL_1, 100);

  dac_output_enable(DAC_CHANNEL_2);
  dac_output_voltage(DAC_CHANNEL_2, 200);
}

Espressif IDE and tools

esptool

git repository is here: https://github.com/espressif/esptool

  • pip install esptool ### version esptool-2.8
  • check that ESP32 is connected
  • esptool.py read_mac
pi@raspberrypi:~/.arduino15 $ esptool.py read_mac
esptool.py v2.8
Found 2 serial ports
Serial port /dev/ttyUSB0
Connecting....
Detecting chip type... ESP32
Chip is ESP32D0WDQ6 (revision 1)
Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None
Crystal is 40MHz
MAC: a4:cf:12:7d:0a:24
Uploading stub...
Running stub...
Stub running...
MAC: a4:cf:12:7d:0a:24
Hard resetting via RTS pin...
  • esptool.py chip_id ### esp32 has no chip_id, use mac_address instead
  • esptool.py flash_id
pi@raspberrypi:~/.arduino15 $ esptool.py flash_id
esptool.py v2.8
Found 2 serial ports
Serial port /dev/ttyUSB0
Connecting....
Detecting chip type... ESP32
Chip is ESP32D0WDQ6 (revision 1)
Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None
Crystal is 40MHz
MAC: a4:cf:12:7d:0a:24
Uploading stub...
Running stub...
Stub running...
Manufacturer: 20
Device: 4016
Detected flash size: 4MB
Hard resetting via RTS pin...
  • esptool.py read_flash_status
pi@raspberrypi:~/.arduino15 $ esptool.py read_flash_status
esptool.py v2.8
Found 2 serial ports
Serial port /dev/ttyUSB0
Connecting......
Detecting chip type... ESP32
Chip is ESP32D0WDQ6 (revision 1)
Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None
Crystal is 40MHz
MAC: a4:cf:12:7d:0a:24
Uploading stub...
Running stub...
Stub running...
Status value: 0x0200
Hard resetting via RTS pin...

idf.py

Per instructions: https://docs.espressif.com/projects/esp-idf/en/latest/esp32/get-started/index.html#get-started-get-esp-idf

Pefore starting:

  • check that pip is installed ### my "pip" was pointing to "pip3" while "python" is "python2", a mismatch.
  • check that libffi-dev is installed, "apt-get install libffi-dev"
  • check that /usr/inclide/openssl exists, if missing, "apt-get install libssl-dev"
ssh pi@...
cd esp
git clone --recursive https://github.com/espressif/esp-idf.git
cd esp-idf
git checkout v3.3.1 ### LTS release, use on x86 Linux and Mac
git checkout release/v4.2 ### use on RPi (no ARM version of 3.3.x release)
./install.sh
...
./export.sh
  • build and run "hello world!"
cd ~/esp
cp -r $IDF_PATH/examples/get-started/hello_world .
cd hello_world/
idf.py menuconfig
idf.py build
...
idf.py -p /dev/ttyUSB0 flash monitor
...
ets Jun  8 2016 00:22:57

rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0030,len:4
load:0x3fff0034,len:7076
load:0x40078000,len:13696
load:0x40080400,len:3984
0x40080400: _init at ??:?

entry 0x40080688
I (29) boot: ESP-IDF v4.2-dev-1054-g7d0f1536e-dirty 2nd stage bootloader
I (29) boot: compile time 01:12:10
I (30) boot: chip revision: 1
I (34) boot_comm: chip revision: 1, min. bootloader chip revision: 0
I (41) boot.esp32: SPI Speed      : 40MHz
I (46) boot.esp32: SPI Mode       : DIO
I (50) boot.esp32: SPI Flash Size : 2MB
I (55) boot: Enabling RNG early entropy source...
I (60) boot: Partition Table:
I (64) boot: ## Label            Usage          Type ST Offset   Length
I (71) boot:  0 nvs              WiFi data        01 02 00009000 00006000
I (78) boot:  1 phy_init         RF data          01 01 0000f000 00001000
I (86) boot:  2 factory          factory app      00 00 00010000 00100000
I (93) boot: End of partition table
I (98) boot_comm: chip revision: 1, min. application chip revision: 0
I (105) esp_image: segment 0: paddr=0x00010020 vaddr=0x3f400020 size=0x05944 ( 22852) map
I (122) esp_image: segment 1: paddr=0x0001596c vaddr=0x3ffb0000 size=0x022c4 (  8900) load
I (126) esp_image: segment 2: paddr=0x00017c38 vaddr=0x40080000 size=0x00404 ( 0x40080000: _WindowOverflow4 at /home/pi/esp/esp-idf/components/freertos/xtensa/xtensa_vectors.S:1730

 1028) load
I (132) esp_image: segment 3: paddr=0x00018044 vaddr=0x40080404 size=0x07fd4 ( 32724) load
I (155) esp_image: segment 4: paddr=0x00020020 vaddr=0x400d0020 size=0x12fa0 ( 77728) map
0x400d0020: _stext at ??:?

I (185) esp_image: segment 5: paddr=0x00032fc8 vaddr=0x400883d8 size=0x01cb0 (  7344) load
0x400883d8: xQueueGiveFromISR at /home/pi/esp/esp-idf/components/freertos/queue.c:1437

I (194) boot: Loaded app from partition at offset 0x10000
I (194) boot: Disabling RNG early entropy source...
I (196) cpu_start: Pro cpu up.
I (200) cpu_start: Application information:
I (205) cpu_start: Project name:     hello-world
I (210) cpu_start: App version:      1
I (214) cpu_start: Compile time:     Apr 11 2020 01:14:28
I (220) cpu_start: ELF file SHA256:  89f38bcbf9a7fc9a...
I (226) cpu_start: ESP-IDF:          v4.2-dev-1054-g7d0f1536e-dirty
I (233) cpu_start: Starting app cpu, entry point is 0x40081280
0x40081280: call_start_cpu1 at /home/pi/esp/esp-idf/components/esp32/cpu_start.c:277

I (226) cpu_start: App cpu up.
I (244) heap_init: Initializing. RAM available for dynamic allocation:
I (251) heap_init: At 3FFAE6E0 len 00001920 (6 KiB): DRAM
I (257) heap_init: At 3FFB2B38 len 0002D4C8 (181 KiB): DRAM
I (263) heap_init: At 3FFE0440 len 00003AE0 (14 KiB): D/IRAM
I (270) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM
I (276) heap_init: At 4008A088 len 00015F78 (87 KiB): IRAM
I (282) cpu_start: Pro cpu start user code
I (300) spi_flash: detected chip: generic
I (301) spi_flash: flash io: dio
W (301) spi_flash: Detected size(4096k) larger than the size in the binary image header(2048k). Using the size in the binary image header.
I (312) cpu_start: Starting scheduler on PRO CPU.
I (0) cpu_start: Starting scheduler on APP CPU.
Hello world!
This is esp32 chip with 2 CPU cores, WiFi/BT/BLE, silicon revision 1, 2MB external flash
Free heap: 299224
Restarting in 10 seconds...
...

Arduino other build tools

End