본문 바로가기

ESP32

아두이노 Nano ESP32 빠른 가이드 3 - 치트시트

반응형

 

아두이노 나노 ESP32 치트 시트 

 

설치, 핀 레퍼런스, 통신 포트 및 마이크로컨트롤러 사양을 포함한 Nano ESP32 개발 보드에 대한 기술 요약입니다. 

 

 

이 포스팅을 포함하여 작성한 전체 링크는 아래 리스트를 참고하세요. 배움을 절대로 멈추지 마세요.

 

아두이노 Nano ESP32 빠른 가이드 1 - 시작 & FAQ

아두이노 Nano ESP32 빠른 가이드 2 - 스펙과 튜토리얼

아두이노 Nano ESP32 빠른 가이드 3 - 치트시트

아두이노 Nano ESP32 빠른 가이드 4 - 클라우드

아두이노 Nano ESP32 빠른 가이드 5 - 디버깅

아두이노 Nano ESP32 빠른 가이드 6 - ESP-NOW

아두이노 Nano ESP32 빠른 가이드 7 - 시작하기

아두이노 Nano ESP32 빠른 가이드 8 - 핀 설정

아두이노 Nano ESP32 빠른 가이드 9 - SPIFFS 파티션

 

 

아두이노 나노 ESP32는 ESP32-S3을 기반으로 하는 ESP32 SoC를 메인 마이크로컨트롤러로 탑재한 최초의 아두이노입니다. 이 SoC는 u-blox® NORA-W106 모듈 내부에 있으며 Bluetooth® 및 Wi-Fi® 연결을 모두 제공할 뿐만 아니라 안테나를 내장하고 있습니다. 

 

Nano ESP32 overview

 

이 문서에서는 보드의 기능에 관한 정보와 리소스 링크를 찾을 수 있습니다.  

주의: 이 보드는 많은 ESP32 예제와 즉시 호환되지만 핀아웃은 다를 수 있습니다. 전체 API는 ESP32-S3 API 참조에서 확인할 수 있습니다. 

 

NORA-W106 (ESP32-S3) 

 

 

NORA-W106 module

 

 

Nano ESP32는 NORA-W106 모듈에 내장된 Espressif의 ESP32-S3 시스템 온 칩(SoC)을 탑재하고 있습니다. ESP32-S3에는 듀얼 코어 마이크로프로세서 Xtensa® 32비트 LX7이 탑재되어 있으며, 2.4 GHz Wi-Fi® 대역과 Bluetooth® 5를 지원합니다. 이 SoC의 작동 전압은 3.3V입니다.

 

또한 NORA-W106에는 Bluetooth® 및 Wi-Fi® 연결을 위한 안테나가 내장되어 있습니다. 

 

메모리

 

나노 ESP32는 다음을 갖추고 있습니다.

  • 384kB ROM
  • 512kB SRAM
  • 16MB 플래시(외부, GD25B128EWIGR을 통해 제공)
  • 8MB PSRAM 

 

데이터시트 전체 데이터시트는 아래 링크에서 PDF로 다운로드할 수 있습니다:

 

Nano ESP32 데이터시트 다운로드 

 

아두이노 ESP32 보드 패키지

 

이 보드는 원래 ESP32 보드 패키지에서 파생된 아두이노 ESP32 보드 패키지를 기반으로 합니다. 이 패키지는 보드의 다양한 기능에 액세스 할 수 있는 풍부한 예제를 제공하며, IDE를 통해 직접 액세스 할 수 있습니다.

 

 

ESP32 examples in the IDE

 

 

보드 패키지를 설치하려면 보드 관리자로 이동하여 Nano ESP32를 검색하세요. 보드 패키지 설치에 대한 자세한 지침은 Nano ESP32 시작하기 문서를 참조하세요.

 

ESP32 핀 맵

 

Nano ESP32의 기본 핀은 Nano 폼 팩터에 맞게 설계되었습니다. 이 핀 매핑은 공식 Arduino ESP32 보드 패키지에서 수행됩니다(바로 위 참조). 아래 핀 맵을 참조하여 물리적 핀이 ESP32와 어떻게 연관되는지 알아보세요: 

 

 

Nano ESP32
D0 GPIO44
D1 GPIO43
D2 GPIO5
D3 GPIO6
D4 GPIO7
D5 GPIO8
D6 GPIO9
D7 GPIO10
D8 GPIO17
D9 GPIO18
D10 GPIO21
D11 GPIO38
D12 GPIO47
D13 GPIO48
A0 GPIO1
A1 GPIO2
A2 GPIO3
A3 GPIO4
A4 GPIO11
A5 GPIO12
A6 GPIO13
A7 GPIO14
BOOT0 GPIO46
BOOT1 GPIO0

 

 

더 나은 시각적 번역을 위해 아래 핀아웃을 참조하세요: 

 

Nano / ESP32 pinout

 

 

아두이노 부트로더 모드

 

이는 보드 전원이 켜진 상태에서 리셋 버튼을 두 번 눌러 보드를 일종의 복구 모드로 전환할 수 있는 기능으로, 나노 ESP32에는 아두이노 부트로더 모드라고 하는 기능이 있습니다.

 

이 모드는 원치 않는 동작을 생성하는 스케치를 업로드한 경우에 유용합니다. 스케치로 인해 컴퓨터에서 감지할 수 없게 되거나 키보드와 마우스를 장악한 HID 스케치로 인해 컴퓨터를 다시 제어해야 할 수도 있습니다. 실제로 스케치를 실행하지 않고도 보드를 켤 수 있습니다.

 

주의: 부트로더 모드로 들어가려면 리셋 버튼을 누른 다음 RGB LED가 깜박이면 다시 버튼을 누릅니다. 녹색 LED가 천천히 깜박이면 부트로더 모드에 성공적으로 진입한 것입니다.

 

첫 번째 한정 생산 배치의 일부 보드는 녹색과 파란색 핀이 뒤바뀐 다른 RGB LED로 조립되었습니다. 여기에서 전체 도움말 센터 문서를 읽어보세요.

 

ROM 부팅 모드

 

일반 부트로더 모드 외에도 Arduino Nano ESP32를 사용하면 ROM 부팅 모드로 들어갈 수 있습니다. 이 모드는 거의 필요하지 않지만 유용할 수 있는 경우가 있습니다(예: 이 프로세스에 따라 다음과 같은 작업을 수행할 수 있습니다):

 

  • 이미 보드에 있는 Arduino 부트로더를 업데이트합니다. 이렇게 하면 Nano ESP32가 다른 ESP32 보드로 잘못 인식되는 문제를 해결할 수 있습니다.
  • 타사 펌웨어로 플래시한 Nano ESP32에 일반 Arduino 스케치를 업로드할 수 있는 기능을 복원합니다.

 

부트로더를 다시 플래시해야 하는 경우 이 도움말 센터 문서의 단계를 따를 수 있습니다.

 

기본 스케치

 

Nano ESP32 보드에 로드된 기본 스케치는 아래 코드 스니펫에서 확인할 수 있습니다: 

 

 

#define LEDR 46
#define LEDG 45
#define LEDB 0
#ifdef LED_BUILTIN
#undef LED_BUILTIN
#define LED_BUILTIN 48
#endif

void setup() {
  // put your setup code here, to run once:
  pinMode(LEDR, OUTPUT);
  pinMode(LEDG, OUTPUT);
  pinMode(LEDB, OUTPUT);
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  digitalWrite(LED_BUILTIN, HIGH);
  digitalWrite(LEDR, LOW);
  digitalWrite(LEDG, HIGH);
  digitalWrite(LEDB, HIGH);

  delay(1000);

  digitalWrite(LED_BUILTIN, LOW);
  digitalWrite(LEDR, HIGH);
  digitalWrite(LEDG, LOW);
  digitalWrite(LEDB, HIGH);

  delay(1000);

  digitalWrite(LED_BUILTIN, HIGH);
  digitalWrite(LEDR, HIGH);
  digitalWrite(LEDG, HIGH);
  digitalWrite(LEDB, LOW);

  delay(1000);
  digitalWrite(LED_BUILTIN, LOW);
}

 

마이크로파이썬

 

Nano ESP32는 보드에 쉽게 설치할 수 있는 Python®의 마이크로 구현인 MicroPython을 지원합니다. MicroPython을 시작하려면 Nano ESP32에서 MicroPython을 배우기 위한 전용 강좌인 MicroPython 101을 방문하세요. 이 과정에서는 시작하기 위한 기본 지식과 함께 인기 있는 타사 구성 요소에 대한 다양한 예제를 제공합니다.

 

보드 Reset

 

MicroPython을 설치했지만 클래식 Arduino/C++ 프로그래밍으로 돌아가고 싶은 경우 쉽게 재설정할 수 있습니다. 보드의 RESET 버튼을 두 번 탭 하기만 하면 됩니다(버튼은 하나만 있습니다). 보드가 부팅 모드로 전환되고(녹색 표시등이 깜박거려야 함) Arduino IDE에서 볼 수 있습니다.

 

아두이노 클라우드

 

Nano ESP32는 아두이노 클라우드 플랫폼에서 지원됩니다. C++ 라이브러리를 사용하는 "클래식" Arduino 또는 MicroPython을 통해 클라우드에 연결할 수 있습니다:

 

 

API

 

Nano ESP32는 다른 아두이노 보드와 동일한 API를 사용하여 프로그래밍할 수 있습니다(언어 참조 참조). 그러나 ESP32 플랫폼은 표준 Arduino API에서 사용할 수 없는 추가 라이브러리와 기본 제공 기능을 제공합니다. 자세한 내용은 ESP32-S3 API를 참조하세요.

 

주변 장치 API

 

ESP32-S3의 주변 장치(예: ADC, I2C, SPI, I2S, RTC)에 대해 자세히 알아보려면 주변 장치 API 섹션을 참조하세요.

 

절전 모드

 

Nano ESP32는 최소한의 전력을 소비하도록 프로그래밍할 수 있으므로 태양광/배터리 구동 프로젝트와 같이 전력 제약이 있는 설계에 적합합니다.

 

ESP32 설명서의 절전 모드 섹션에서는 최소 전력을 소비하도록 보드를 구성하는 방법을 설명하며, 최대 절전 및 최대 절전 모드를 소개합니다.

 

전력 고려 사항 

 

Nano ESP32 Power Tree

 

 

Nano ESP32에 전원을 공급하려면 USB-C® 케이블을 사용하거나 VIN 핀을 사용할 수 있습니다. VIN 핀을 사용할 경우 보드의 MP2322GQH 컨버터가 손상될 수 있으므로 5~18V 범위 내의 전압을 사용하세요.

 

입력 전압(VIN)

 

  • USB-C® 커넥터를 사용하는 경우 5V로 전원을 공급해야 합니다.
  • VIN 핀의 권장 입력 전압은 6-21V입니다.

 

보드를 뒤집어 밑면을 보면 "3.3V"라고 표시된 납땜 점퍼를 찾을 수 있습니다. 두 패드 사이의 작은 흔적을 잘라내면 보드에서 스텝다운 컨버터를 분리하게 되고, USB 포트에 연결해도 보드가 더 이상 켜지지 않거나 VIN 핀을 통해 전원을 공급해도 보드가 켜지지 않습니다. 대신 보드의 3.3V 핀에 정확히 3.3V를 직접 공급해야 합니다. 이는 전원에 따라 VIN 핀이나 USB 포트를 통해 전원을 공급하는 것보다 보드에 전원을 공급하는 에너지 효율적인 방법이 될 수 있습니다. 3.3V 납땜 점퍼

 

 

3.3 V Solder Jumper

 

 

작동 전압

 

ESP32-S3 SoC의 내부 작동 전압은 3.3V이며, 이보다 높은 전압을 GPIO 핀에 인가해서는 안 됩니다.

 

5V 핀/VBUS

 

Nano ESP32는 5V 핀이 없는 최초의 보드입니다. 대신 핀의 기능을 더 정확하게 설명하는 VBUS로 대체되었습니다.

 

VBUS는 USB를 통해 전원이 공급될 때마다 5V를 제공합니다. VIN 핀을 통해 전원이 공급되면 비활성화됩니다. 즉, VIN 핀을 통해 보드에 전원을 공급하는 동안에는 보드에서 5V를 얻을 수 없으므로 로직 레벨 시프터 또는 외부 5V 전원 공급 장치를 사용해야 합니다.

 

이 조치는 보드의 마이크로 컨트롤러가 실수로 5V를 수신하여 보드가 손상되는 것을 방지하기 위해 취해진 조치입니다. 

 

 

Nano ESP32에는 아날로그와 디지털의 두 가지 헤더가 있습니다. 여기에 나열된 핀은 이전 나노 폼 팩터 설계를 준수하는 기본 핀입니다.

 

보드에서 사용할 수 있는 핀은 다음과 같습니다: 

 

 

Pin Type Function
D13/SCK Digital SPI Serial Clock / LED Built in
D12/CIPO Digital SPI Controller In Peripheral Out
D11/COPI Digital SPI Controller Out Peripheral In
D10 Digital GPIO
D9 Digital GPIO
D8 Digital GPIO
D7 Digital GPIO
D6 Digital GPIO
D5 Digital GPIO
D4 Digital GPIO
D3 Digital GPIO
D2 Digital GPIO
D1/RX Digital GPIO 1 / UART Receiver (RX)
D0/TX Digital GPIO 0 / UART Transmitter (TX)
A0 Analog Analog input 0
A1 Analog Analog input 1
A2 Analog Analog input 2
A3 Analog Analog input 3
A4 Analog Analog input 4 / I2C Serial Datal (SDA)
A5 Analog Analog input 5 / I2C Serial Clock (SCL)
A6 Analog Analog input 6
A7 Analog Analog input 7

 

ESP32의 유연성 덕분에 모든 핀을 GPIO로 사용할 수 있다는 점에 유의하세요.

 

디지털

 

Nano ESP32에는 digitalRead()를 사용하여 읽거나 digitalWrite()를 사용하여 쓸 수 있는 14개의 디지털 핀(D0-D13)이 있습니다. 

 

 

Pin Type Function
D13/SCK Digital SPI Serial Clock / LED Built in
D12/CIPO Digital SPI Controller In Peripheral Out
D11/COPI Digital SPI Controller Out Peripheral In
D10 Digital GPIO
D9 Digital GPIO & RX1
D8 Digital GPIO & TX1
D7 Digital GPIO
D6 Digital GPIO
D5 Digital GPIO
D4 Digital GPIO
D3 Digital GPIO
D2 Digital GPIO
D0/RX Digital GPIO 0 / UART Receiver (RX0)
D1/TX Digital GPIO 1 / UART Transmitter (TX0)

 

모든 아날로그 핀을 디지털 핀으로도 사용할 수 있지만 그 반대는 불가능하다는 점에 유의하세요.

 

아날로그

 

Nano ESP32에는 8개의 아날로그 입력 핀이 있으며, 2개는 I2C 통신(A4/A5)을 위해 예약되어 있습니다. ESP32-S3에는 두 개의 SAR ADC인 ADC1과 ADC2가 내장되어 있으며, 각 ADC는 각각 4개의 채널을 사용합니다. 

 

 

Pin Type Function ADC channel
A0 Analog Analog input 0 ADC1_CH0
A1 Analog Analog input 1 ADC1_CH1
A2 Analog Analog input 2 ADC1_CH2
A3 Analog Analog input 3 ADC1_CH3
A4 Analog Analog input 4 / I2C Serial Datal (SDA) ADC2_CH0
A5 Analog Analog input 5 / I2C Serial Clock (SCL) ADC2_CH1
A6 Analog Analog input 6 ADC2_CH2
A7 Analog Analog input 7 ADC2_CH3

 

 

ADC2는 Wi-Fi® 통신에도 사용되며 동시에 사용할 경우 장애가 발생할 수 있다는 점에 유의하세요. 자세한 내용은 아날로그-디지털 변환기(Espressif 문서 링크)를 참조하세요.

 

PWM

 

PWM(펄스 폭 변조)은 모든 디지털 핀(D0-D13)과 모든 아날로그 핀(A0-A7)에서 지원되며, 출력은 analogWrite() 메서드를 통해 제어됩니다. 

 

analogWrite(pin,value);

 

Note: 타이머 제한으로 인해 동시에 5개의 PWM 신호만 생성할 수 있습니다. 

 

I2C 

 

I2C Pins

 

Nano ESP32의 메인 I2C 버스에 사용되는 기본 핀은 다음과 같습니다: 

 

Pin Function Description
A4 SDA I2C Serial Data
A5 SCL I2C Serial Clock

 

 

I2C 장치를 연결하려면 스케치 상단에 와이어 라이브러리를 포함시켜야 합니다.

 

#include <Wire.h>

 

 

void setup() 내에서 라이브러리를 초기화하고 사용하려는 I2C 포트를 초기화해야 합니다.

 

Wire.begin() //SDA & SDL

 

 

그리고 I2C를 통해 연결된 장치에 무언가를 쓰려면 다음 명령을 사용할 수 있습니다: 

 

Wire.beginTransmission(1); //begin transmit to device 1
Wire.write(byte(0x00)); //send instruction byte 
Wire.write(val); //send a value
Wire.endTransmission(); //stop transmit

 

 

두 번째 I2C 버스

 

Nano ESP32에는 Wire1을 통해 액세스 하는 두 번째 I2C 버스가 있습니다. 이를 사용하려면 SDA 및 SCL을 위한 두 개의 자유 핀을 설정해야 합니다.

 

예를 들어

 

//initializes second I2C bus on pins D4,D5
Wire1.begin(D4, D5); //sda, scl

 

 

주의: Wire와 Wire1은 동시에 사용할 수 있으므로 동일한 주소를 공유할 수 있는 장치로 작업할 때 유용한 기능입니다. 

 

SPI 

 

 

SPI Pins

 

Nano ESP32의 SPI 핀은 다음과 같습니다:  

 

Pin Function Description
D10* CS Chip Select
D11 COPI Controller Out, Peripheral In
D12 CIPO Controller In, Peripheral Out
D13 SCK Serial Clock

 

*모든 GPIO를 칩 선택에 사용할 수 있습니다. 다음 예제는 SPI를 사용하는 방법을 보여줍니다: 

 

#include <SPI.h>

const int CS = 10;


void setup() {
  pinMode(CS, OUTPUT);

  SPI.begin();

  digitalWrite(CS, LOW);

  SPI.transfer(0x00);
  
  digitalWrite(CS, HIGH);
}

void loop() {
}

 

두 번째 SPI 포트(HSPI)

 

Nano ESP32에는 두 번째 SPI 포트(HSPI)가 있습니다. 이를 사용하려면 SPIClass를 사용하여 객체를 생성하고 특정 핀 세트에서 통신을 초기화해야 합니다.

 

주의: HSPI 포트의 기본 핀은 다음과 같습니다: GPIO14(Sck), GPIO12(CIPO), GPIO13(COPI), GPIO15(CS). 이러한 핀 중 일부는 Nano ESP32에서 액세스 할 수 없으므로 수동으로 구성해야 합니다. 아래 코드 예제 상단의 정의를 참조하세요. 

 

//define SPI2 pins manually
//you can also choose any other free pins
#define SPI2_SCK D2
#define SPI2_CIPO D3
#define SPI2_COPI D4
#define SPI2_CS D5

//create SPI2 object
SPIClass SPI2(HSPI);

void setup() {
//initialize SPI communication
  SPI2.begin(SPI2_SCK, SPI2_CIPO, SPI2_COPI, SPI2_CS);
}

 

 

USB Serial & UART

 

Nano ESP32 보드에는 3개의 하드웨어 직렬 포트와 USB를 통해 노출되는 포트가 있습니다.

 

  • 직렬은 USB 포트를 의미합니다.
  • Serial0은 보드의 RX/TX 핀(D0, D1)을 통해 액세스할 수 있는 첫 번째 하드웨어 직렬 포트(UART)를 나타냅니다.
  • Serial1은 두 번째 UART 포트로, 모든 자유 GPIO에 할당할 수 있습니다.
  • Serial2는 세 번째 UART 포트이며, 이 역시 자유 GPIO에 할당할 수 있습니다.

 

Serial(Native USB)

 

직렬 데이터를 컴퓨터로 보내는 작업은 표준 Serial 객체를 사용하여 수행됩니다.

 

Serial.begin(9600);
Serial.print("hello world");

 

 

UART를 통해 데이터를 송수신하려면 먼저 void setup() 내에서 전송 속도를 설정해야 합니다.

 

Serial0 (UART)

 

참고: Serial0은 부트로더/커널과 공유되어 부팅/리셋 시 몇 가지 메시지를 출력하며, 크래시 발생 시 이 직렬 포트에서 FreeRTOS를 통해 크래시 덤프가 출력됩니다. 이러한 이유로 간섭을 피하기 위해 시리얼 1 또는 시리얼 2 포트를 사용하는 것이 좋습니다(자세히 보기).

 

Nano ESP32의 UART 통신을 위한 기본 핀은 다음과 같습니다: 

 

Pin Function Description
D0 RX Receive Serial Data
D1 TX Transmit Serial Data

 

 

Nano ESP32 UART Pins

 

 

UART를 통해 데이터를 송수신하려면 먼저 void setup() 내에서 전송 속도를 설정해야 합니다. UART(RX/TX 핀)를 사용할 때는 Serial0 객체를 사용한다는 점에 유의하세요.

 

Serial0.begin(9600);

 

들어오는 데이터를 읽으려면 while loop()를 사용하여 각 문자를 읽고 문자열에 추가할 수 있습니다.

 

while(Serial0.available()){
    delay(2);
    char c = Serial0.read();
    incoming += c;
  }

 

 

그리고 무언가를 작성하려면 다음 명령을 사용할 수 있습니다:

 

Serial0.write("Hello world!");

 

Serial1 및 Serial 2 (UART)

 

Nano ESP32에는 사전 정의된 핀이 없는 2개의 추가 하드웨어 직렬 포트가 있으며, 모든 무료 GPIO에 연결할 수 있습니다. 따라서 이를 사용하려면 TX 및 RX 핀을 수동으로 할당해야 합니다.

 

Serial1과 Serial2를 사용하려면 프로그램의 setup() 함수에서 초기화해야 합니다: 

 

//initialization
Serial1.begin(9600, SERIAL_8N1, RX1PIN, TX1PIN);
Serial2.begin(9600, SERIAL_8N1, RX2PIN, TX2PIN);

//usage
Serial1.write("Hello world!");
Serial2.write("Hello world!");

 

  • RXPIN과 TXPIN을 할당하려는 GPIO로 바꿉니다(예: D4, D5).
  • 그런 다음 Serial1.write() 및 Serial1.read()와 같은 명령을 사용할 수 있습니다.

 

SERIAL_8N1 매개변수는 직렬 통신을 위한 구성입니다.

 

  • 8 = 데이터 워드 길이(8비트). 5,6,7비트로 변경할 수 있습니다.
  • N = 패리티(이 경우 "없음"). "짝수"(E) 또는 "홀수"(O)로 변경할 수 있습니다.
  • 1 = 스톱 비트, 사용 가능한 다른 옵션은 2입니다. 

 

I2S

Inter-IC 사운드(I2S 또는 IIS) 프로토콜은 다양한 구성(필립스 모드, PDM, ADC/DAC)의 디지털 오디오 장치를 연결하는 데 사용됩니다. I2S의 기본 핀 구성은 다음과 같습니다: 

 

Pin Definition
D7  
D8  
D9  
D9  
D10  

 

기본 핀은 setAllPins() 메서드를 사용하여 변경할 수 있습니다: 

 

I2S.setAllPins(sck, fs, sd, sd_out, sd_in)

 

라이브러리를 초기화하려면 begin() 메서드를 사용합니다:

 

I2S.begin(mode, sampleRate, bitPerSample)

 

데이터를 읽으려면 마지막 샘플을 반환하는 read() 메서드를 사용합니다.

 

I2S.read()

 

다양한 모드 및 다양한 오디오 장치에 대한 예제는 보드 패키지의 예제 > I2S에서 확인할 수 있습니다.

 

더 읽어보세요:

 

 

듀얼 코어

 

ESP32-S3은 두 개의 코어에서 코드를 개별적으로 실행할 수 있는 듀얼 코어 XTensa LX7을 기반으로 합니다. 이는 각 코어에서 실행되는 작업을 설정하여(void loop()가 구현되는 방식과 유사하게) FreeRTOS를 통해 활성화할 수 있습니다. 사용 가능한 코어는 0과 1입니다.

 

아래 예제는 Arduino ESP32 보드 패키지에 있는 BasicMultiThreading 예제를 수정한 버전으로, 두 가지 공통 작업을 동시에 사용하는 방법을 보여줍니다:

 

  • 특정 코어(0)에서 하나의 작업을 사용하여 LED를 깜박입니다,
  • 특정 코어(1)에서 두 번째 작업을 사용하여 아날로그 핀 읽기. 

 

/* Basic Multi Threading Arduino Example
   
   Modified 16th October 2023 by Karl Söderby

   Set up two tasks that run on each core of a Nano ESP32 (ESP32-S3 XTensa LX7 MCU),
   one that blinks an LED, one that reads an analog signal.

   These tasks will execute infinitely.

   This example code is in the Public Domain (or CC0 licensed, at your option.)
   Unless required by applicable law or agreed to in writing, this
   software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
   CONDITIONS OF ANY KIND, either express or implied.
*/

// Define the cores
#define CORE_0 0
#define CORE_1 1

#define ANALOG_INPUT_PIN A0 //Specify analog pin
#define LED_BUILTIN 13  // Specify the on which is your LED


int counter = 0;
// Define two tasks for Blink & AnalogRead.
void TaskBlink(void *pvParameters);
void TaskAnalogRead(void *pvParameters);
TaskHandle_t analog_read_task_handle;  // You can (don't have to) use this to be able to manipulate a task from somewhere else.

void setup() {
  Serial.begin(115200);
  uint32_t blink_delay = 1000;  // Delay between changing state on LED pin

  //create task for blinking an LED
  xTaskCreatePinnedToCore(
    TaskBlink, "Task Blink"  // A name just for humans
    ,
    2048  // The stack size can be checked by calling `uxHighWaterMark = uxTaskGetStackHighWaterMark(NULL);`
    ,
    (void *)&blink_delay  // Task parameter which can modify the task behavior. This must be passed as pointer to void.
    ,
    2  // Priority
    ,
    NULL  // Task handle is not used here - simply pass NULL
    ,
    CORE_0  // Core on which the task will run
  );

  //create a task for reading analog signals
  xTaskCreatePinnedToCore(
    TaskAnalogRead, "Analog Read", 2048  // Stack size
    ,
    NULL  // When no parameter is used, simply pass NULL
    ,
    1  // Priority
    ,
    &analog_read_task_handle  // With task handle we will be able to manipulate with this task.
    ,
    CORE_1  // Core on which the task will run
  );
}

void loop() {
  //loop is empty, the tasks are instead looped infinitely
}

void TaskBlink(void *pvParameters) {  // This is a task.
  uint32_t blink_delay = *((uint32_t *)pvParameters);

  pinMode(LED_BUILTIN, OUTPUT);

  for (;;) {  // A Task shall never return or exit.
    counter++;
    digitalWrite(LED_BUILTIN, HIGH);  // turn the LED on (HIGH is the voltage level)

    delay(1000);
    digitalWrite(LED_BUILTIN, LOW);  // turn the LED off by making the voltage LOW

    delay(1000);
    Serial.print("Core ");
    Serial.print(CORE_0);
    Serial.print(": Blink task complete. Times run: ");
    Serial.println(counter);
  }
}

void TaskAnalogRead(void *pvParameters) {  // This is a task.
  (void)pvParameters;

  for (;;) {
    // read the input on analog pin:
    int sensorValue = analogRead(ANALOG_INPUT_PIN);
    // print out the value you read:
    Serial.print("Core ");
    Serial.print(CORE_1);
    Serial.print(": Analog reading task, value is: ");
    Serial.println(sensorValue);
    delay(500);  // 100ms delay
  }
}

 

 

이 예제를 실행할 때 직렬 모니터 도구를 열면 각 코어에서 어떤 일이 발생하는지 확인할 수 있습니다. 

 

Dual core example.

 

 

  • 태스크는 xTaskCreatePinnedToCore() 에서 생성됩니다,
  • xTaskCreatePinnedToCore() 내부에서는 여러 매개변수를 지정하는데, 가장 중요한 것은 어떤 코어와 어떤 함수를 실행할지 지정하는 것입니다,
  • 태스크 함수 내부의 코드는 무한히 반복되는 for(;;){} 문 안에 배치됩니다.

노트: 예제에 대한 자세한 설명과 함께 ESP32의 듀얼 코어에 대한 자세한 내용은 기본 멀티 스레딩 예제에서 확인할 수 있습니다.

 

IO 멀티플렉서 및 GPIO 매트릭스

 

ESP32-S3 SoC에는 IO 멀티플렉서(입력/출력 멀티플렉서)와 GPIO 매트릭스가 있습니다. IO 멀티플렉서는 데이터 선택기 역할을 하며 다양한 주변 장치를 물리적 핀에 연결할 수 있습니다.

 

ESP32-S3 칩에는 45개의 물리적 GPIO가 있지만 디지털 주변장치는 더 많습니다. IO 멀티플렉서는 신호를 다른 GPIO로 라우팅하여 특정 핀의 기능을 변경할 수 있는 유연성을 제공합니다. 

 

Peripheral IO MUX

 

 

이 기술은 잘 알려져 있고 ESP32 보드에 적용되지만, Nano ESP32에서는 이전 설계와 일관성을 유지하기 위해 I2C, SPI 및 UART 주변 장치에 기본 핀 세트를 사용합니다.

 

예를 들어, Nano ESP32의 SDA/SCL 핀은 기본적으로 A4/A5에 부착되어 있습니다. 다른 핀 세트를 사용해야 하는 경우 이 핀을 D8, D9 등으로 변경할 수 있습니다. 이는 멀티플렉서/GPIO 매트릭스를 통해 이루어집니다.

 

핀 재할당

 

아래 링크를 통해 주변 장치 재할당에 대한 자세한 내용을 확인할 수 있습니다:

 

기술 참조 매뉴얼도 여기에서 확인할 수 있습니다:

 

 

Wi-Fi®

 

Nano ESP32에는 ESP32-S3 SoC가 내장된 NORA-W106 모듈이 있습니다. 이 모듈은 2.4GHz 대역을 통한 Wi-Fi® 통신을 지원합니다. 보드 패키지와 함께 제공되는 몇 가지 예제를 통해 HTTP 요청, 웹 서버 호스팅, MQTT를 통한 데이터 전송 등의 방법을 살펴볼 수 있습니다.

 

RGB LED(빌트인, 내장)

 

ESP32에는 LED_RED, LED_GREEN 및 LED_BLUE 핀 이름으로 제어할 수 있는 RGB LED가 있습니다. 이 핀은 보드의 헤더에서 액세스 할 수 없으며 RGB LED에만 사용할 수 있습니다.

 

주의: 첫 번째 한정 생산 배치의 일부 보드는 녹색과 파란색 핀이 반전된 다른 RGB LED로 조립되었습니다. 여기에서 전체 도움말 센터 문서를 읽어보세요. 

 

제어하려면 다음을 사용하세요: 

 

digitalWrite(LED_RED, STATE); //red
digitalWrite(LED_GREEN, STATE); //green
digitalWrite(LED_BLUE, STATE); //blue

 

이 핀을 액티브 로우라고 하는데, 실제로 이 핀이 의미하는 바는 LED 중 하나를 켜려면 다음과 같이 LOW로 써야 한다는 것입니다: 

digitalWrite(LED_RED, LOW);

 

USB HID

 

마우스.이동(x,y) 또는 키보드.누르기('w')를 사용하여 HID 장치를 에뮬레이션하는 데 Nano ESP32를 사용할 수 있습니다. 이는 키보드와 마우스 사용에 대한 최소한의 예시입니다:

 

키보드 예제 

 

#include "USB.h"
#include "USBHIDKeyboard.h"
USBHIDKeyboard Keyboard;

void setup() {
  // put your setup code here, to run once:
  Keyboard.begin();
  USB.begin();
}

void loop() {
  // put your main code here, to run repeatedly:
  Keyboard.print("Hello World");
  delay(500);
}

 

마우스 예제  

 

#include "USB.h"
#include "USBHIDMouse.h"
USBHIDMouse Mouse;

void setup() {
  // put your setup code here, to run once:
  Mouse.begin();
  USB.begin();
}

void loop() {
  // put your main code here, to run repeatedly:
  Mouse.move(5, 0, 0); 
  delay(50);
}

 

예제 > USB의 보드 패키지에서도 바로 사용할 수 있는 몇 가지 예제를 사용할 수 있습니다. IDE에서 보드가 더 이상 인식되지 않는 경우 아두이노 부트로더 모드로 전환하여 복구할 수 있다는 점을 기억하세요. 

 

반응형

더욱 좋은 정보를 제공하겠습니다.~ ^^