본문 바로가기

ESP32

ESP32 기본 OTA(Over The Air) 프로그래밍

반응형

ESP32 기본 OTA(Over The Air) 프로그래밍을 Arduino IDE에서 수행하는 방법

 

Arduino IDE를 사용하여 ESP32에 무선(OTA) 프로그래밍하는 방법 튜토리얼

 

목차

소개

OTA(Over-The-Air) 업데이트란 무엇인가요?

ESP32 OTA 업데이트 프로세스 이해하기

ESP32 OTA의 두 가지 주요 방법

OTA 업데이트 수행 단계

1단계: OTA 지원 스케치 업로드(시리얼 업로드)

2단계: 새 스케치를 무선으로 업로드하기

중요 팁

 

집안 곳곳에 ESP32 모듈이 여러 개 흩어져 있다고 상상해 보세요. 프로그램을 업데이트할 때마다 각 모듈을 꺼내 케이블에 연결해야 한다면 매우 번거롭고 시간이 많이 걸릴 것입니다.

 

다행히도, 무선 업데이트 라는 훌륭한 해결책이 있습니다 .

 

OTA(Over-The-Air) 업데이트란 무엇인가요?

 

ESP32에는 OTA(Over-The-Air) 업데이트라는 중요한 기능이 포함되어 있습니다. 이 기능을 사용하면 기존의 USB 케이블을 연결하는 대신 Wi-Fi 연결을 통해 ESP32에 새로운 프로그램이나 펌웨어를 업로드할 수 있습니다.

 

이 기능은 ESP32가 옥상, 벽 속, 또는 멀리 떨어진 야외 공간과 같이 접근하기 어려운 장소에 설치된 경우 특히 유용합니다.

 

ESP32 디바이스를 대량으로 관리하는 경우 OTA 업데이트는 더욱 중요해집니다. 이 기능을 사용하면 정기 유지 보수 중에 단일 컴퓨터에서 모든 디바이스에 새 펌웨어를 한 번에 전송할 수 있으므로 시간과 노력을 크게 절약할 수 있습니다.

 

ESP32 OTA 업데이트 프로세스 이해하기

 

OTA 업데이트 작업을 시작하기 전에, 백그라운드에서 어떤 일이 벌어지고 ESP32가 이 전체 프로세스를 어떻게 관리하는지 이해하는 것이 매우 도움이 됩니다.

 

ESP32는 플래시 메모리를 파티션 이라고 하는 여러 섹션으로 구성합니다 . 이러한 파티션은 프로그램 저장, 사용자 데이터 저장, 파일 시스템 관리 등 다양한 용도로 사용됩니다.

 

OTA 업데이트가 제대로 작동하려면 ESP32에 특별한 메모리 설정이 필요합니다. 이 설정에는 최소 두 개의 동일한 애플리케이션 파티션(이름은 ota_0와 ota_1)과 세 번째 파티션 otadata(OTA 데이터 파티션)이 포함됩니다.

 

이 otadata파티션은 ESP32가 시작 또는 재시작할 때 어떤 애플리케이션 파티션에서 부팅해야 하는지에 대한 정보를 추적하는 특별한 파티션입니다.

 

ESP32 OTA 업데이트 프로세스

 

 

언제든지 이 애플리케이션 파티션 중 하나만 활성화되어 프로그램을 실행하고, 다른 하나는 사용되지 않은 상태로 유지됩니다. OTA 업데이트를 수행하면 새 프로그램이 비활성화된 파티션에 다운로드됩니다. 다운로드가 완료되고 ESP32가 새 업데이트의 유효성을 확인하면 시스템은 새로 업데이트된 파티션을 활성화합니다. 그 시점부터 ESP32는 이 활성화된 파티션에서 새 프로그램을 실행합니다.

 

이 영리한 설계는 중요한 안전 기능을 제공합니다. 업데이트 도중 문제가 발생할 경우, ESP32는 자동으로 정상적으로 작동했던 이전 버전의 펌웨어로 되돌릴 수 있습니다. 이러한 롤백 기능 덕분에 시스템 전체의 안정성이 크게 향상되고, 잘못된 업데이트로 인해 기기가 완전히 작동 불능 상태가 되는 것을 방지할 수 있습니다.

 

ESP32 OTA의 두 가지 주요 방법

 

ESP32에서 OTA 업데이트를 수행하는 방법은 여러 가지가 있지만, 가장 일반적으로 사용되는 두 가지 방법은 다음과 같습니다.

 

1. 기본 OTA

 

기본 OTA 방식에서는 먼저 일반 USB 케이블을 사용하여 ESP32 보드에 OTA 지원 프로그램을 업로드합니다. 이 첫 번째 업로드는 ESP32에서 OTA 기능을 설정하는 데 필수적입니다.

 

OTA 기능이 활성화된 이 스케치가 성공적으로 업로드되면 ESP32가 Arduino IDE에서 일반 시리얼 포트와 함께 네트워크 포트로 표시됩니다. 그 후부터는 이 네트워크 포트를 선택하고 Wi-Fi 네트워크를 통해 ESP32에 새 프로그램을 직접 업로드할 수 있으며, USB 케이블을 통해 업로드하는 것만큼 간편합니다.

 

2. 웹 업데이트

 

웹 업데이트 방식은 약간 다르게 작동합니다. 이 방식에서는 ESP32가 업데이트 페이지를 호스팅하는 소형 웹 서버를 실행합니다. 동일한 네트워크에 연결된 모든 컴퓨터나 스마트폰에서 브라우저를 통해 이 페이지를 열고 바이너리 파일(.bin) 형식의 새 프로그램 버전을 업로드할 수 있습니다. 그러면 ESP32가 새 펌웨어를 자동으로 설치합니다.

 

각 방법에는 고유한 장점이 있으므로 프로젝트 요구 사항에 가장 적합한 방법을 선택할 수 있습니다.

 

이 튜토리얼에서는 기본 OTA 업데이트를 구현하는 방법을 단계별로 안내합니다. 하지만 웹 업데이터를 이용한 OTA 업데이트 방식에 대해 더 자세히 알아보고 싶다면, 별도의 튜토리얼을 여기에서 확인하세요.

 

웹 업데이터를 이용한 ESP32 무선(OTA) 프로그래밍 튜토리얼

 

ESP32 웹 업데이트 프로그램 (아두이노 IDE에서 OTA(Over The Air) 프로그래밍)

 

OTA 업데이트 수행 단계

 

OTA 업데이트를 활성화하고 수행하는 과정은 두 가지 간단한 단계로 구성됩니다.

 

  1. USB(시리얼) 연결을 사용하여 OTA 지원 스케치를 업로드합니다.
  2. 무선 연결을 이용하여 새 프로그램을 무선으로 업로드합니다.

 

1단계: OTA 지원 스케치 업로드(시리얼 업로드)

 

가장 먼저 해야 할 일은 ESP32에 OTA(Over-the-Air) 업데이트 기능을 지원하는 프로그램을 업로드하는 것입니다. 이 첫 단계는 반드시 USB 케이블을 통한 물리적 직렬 연결을 사용하여 완료해야 한다는 점을 기억하세요. 이 초기 설정이 완료된 후에야 ESP32가 무선 업데이트를 수신할 수 있습니다.

 

다음은 OTA 기능을 활성화하기 위해 ESP32에 업로드해야 하는 최소한의 코드입니다.

 

// Include Libraries
#include <WiFi.h>        // For connecting ESP32 to WiFi
#include <ArduinoOTA.h>  // For enabling over the air updates

// Set WiFi Credentials
const char* ssid = "..........";      // Change to your WiFi Network name
const char* password = "..........";  // Change to you password

void setup() {
  // Connect to WiFi
  WiFi.begin(ssid, password);
  while (WiFi.waitForConnectResult() != WL_CONNECTED) {
    delay(5000);
    ESP.restart();
  }

  ArduinoOTA.begin();  // Starts OTA
}

void loop() {
  ArduinoOTA.handle();  // Handles OTA
}

 

OTA 코드 흐름 이해하기

 

이제 이 코드가 실제로 어떻게 작동하는지, 그리고 각 부분이 어떤 역할을 하는지 자세히 살펴보겠습니다.

 

먼저 코드 상단에 두 가지 중요한 라이브러리를 추가합니다. WiFi.h 라이브러리는 ESP32가 Wi-Fi 네트워크에 연결할 수 있도록 해주고, ArduinoOTA.h 라이브러리는 무선 업데이트(OTA)를 가능하게 합니다.

 

#include // For connecting ESP32 to WiFi

#include // For enabling over the air updates

 

다음으로, 네트워크 이름(SSID)과 비밀번호를 저장할 두 개의 변수를 정의합니다. ESP32가 연결할 수 있도록 이 변수들을 자신의 네트워크 정보로 업데이트해야 합니다.

 

// Set WiFi Credentials

const char* ssid = ".........."; // Change to your WiFi Network name

const char* password = ".........."; // Change to you password

 

코드의 설정 부분으로 넘어가면, 가장 먼저 Wi-Fi에 연결합니다. Wi-Fi 라이브러리의 함수를 사용하여 이를 수행합니다 WiFi.begin(). 이 함수가 실행되면 ESP32가 스테이션 모드로 네트워크에 자동으로 연결됩니다. 코드는 연결이 성공적으로 설정될 때까지 기다린 후 다음 단계로 넘어갑니다.

 

// Connect to WiFi
WiFi.begin(ssid, password);
while (WiFi.waitForConnectResult() != WL_CONNECTED) {
  delay(5000);
  ESP.restart();
}

 

 

Wi-Fi 연결이 완료되면, ArduinoOTA 라이브러리의 첫 번째 주요 함수인 ArduinoOTA.begin()을 사용합니다. 이 함수는 특별한 매개변수가 필요하지 않으며, 단순히 OTA 서비스를 시작하여 ESP32가 무선 업데이트를 수신할 준비를 하도록 합니다.

 

 

ArduinoOTA.begin();

 

코드의 루프 섹션에는 ArduinoOTA.handle()이라는 또 다른 핵심 함수가 있습니다. 이 함수는 ESP32로 전송되는 업데이트 요청이 있는지 지속적으로 확인합니다. 사용자가 직접 작성한 애플리케이션 코드, 즉 ESP32가 실제로 수행해야 할 작업들도 이 함수와 함께 이 루프 섹션에 포함됩니다.

 

void loop() {

  ArduinoOTA.handle(); // Handles OTA

}

 

이 코드는 ESP32에서 무선 업데이트가 작동하도록 하는 데 필요한 최소한의 코드만을 보여주는 가장 기본적인 코드입니다.

 

하지만 더 많은 기능과 활용법을 살펴보고 싶다면 ArduinoOTA 라이브러리에서 제공하는 다른 함수들을 활용해 보세요. 어떤 기능들이 더 있는지 확인하려면 파일 > 예제 > ArduinoOTA > BasicOTA 로 이동하세요 .

 

 

기본 OTA 아두이노 IDE 내장 예제

 

2단계: 새 스케치를 무선으로 업로드하기

 

ESP32에서 OTA 지원 스케치가 실행되면 USB 케이블을 분리할 수 있습니다. 이제부터는 배터리 팩이나 원하는 다른 전원을 사용하여 ESP32에 전원을 공급할 수 있습니다.

 

진행하기 전에 컴퓨터와 ESP32 보드가 동일한 Wi-Fi 네트워크에 연결되어 있는지 확인하십시오. OTA 업데이트가 제대로 작동하려면 이 조건이 필수적입니다.

 

아두이노 IDE에서 보드 및 포트 선택 드롭다운 메뉴를 찾으세요. 이제 ESP32가 네트워크 포트 목록에 표시될 것입니다. 예를 들어 " DOIT ESP32 DEVKIT V1 at 192.168.254.53 "과 같이 표시되고 옆에 작은 무선 아이콘이 있을 것입니다. 이 네트워크 포트를 선택하여 진행하세요. 드롭다운 메뉴에서 ESP32를 찾을 수 없는 경우 IDE를 다시 시작해 보세요.

 

 

네트워크 포트를 선택하세요

 

 

 

향후 모든 업데이트 시 유의해야 할 중요한 사항이 있습니다. 무선으로 업로드할 예정인 새로운 프로그램에는 반드시 ArduinoOTA.begin()과 ArduinoOTA.handle() 함수가 모두 포함되어야 합니다. 이 함수들을 포함하는 것을 잊어버리면 해당 업데이트 이후 OTA 기능을 사용할 수 없게 되며, 기능을 복구하기 위해 USB 케이블 연결로 다시 돌아가야만 합니다.

이 요구 사항을 염두에 두고, ESP32에 업로드하려는 새로운 코드는 처음부터 새로 작성하기보다는 기존 OTA 지원 스케치에 추가하도록 하십시오.

이 과정을 보여주기 위한 실제 예시로, 이전 코드에 간단한 LED 깜빡임 프로그램을 포함시켰습니다.

 

// Include Libraries
#include <WiFi.h>        // For connecting ESP32 to WiFi
#include <ArduinoOTA.h>  // For enabling over the air updates

// Set WiFi Credentials
const char* ssid = "carelab";      // Change to your WiFi Network name
const char* password = "12345678";  // Change to you password

//variabls for blinking an LED with Millis
const int led = 2;                 // ESP32 Pin to which onboard LED is connected
unsigned long previousMillis = 0;  // will store last time LED was updated
const long interval = 1000;        // interval at which to blink (milliseconds)
int ledState = LOW;                // ledState used to set the LED

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

  // Connect to WiFi
  WiFi.begin(ssid, password);
  while (WiFi.waitForConnectResult() != WL_CONNECTED) {
    delay(5000);
    ESP.restart();
  }

  ArduinoOTA.begin();  // Starts OTA
}

//내장 RGBLED 함수 사용

void loop() {
  ArduinoOTA.handle();  // Handles OTA

  //loop to blink without delay
  /*unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval) {
    // save the last time you blinked the LED
    previousMillis = currentMillis;
    // if the LED is off turn it on and vice-versa:
    ledState = not(ledState);
    // set the LED with the ledState of the variable:
    digitalWrite(led, ledState);
  }*/

  #ifdef RGB_BUILTIN
  digitalWrite(RGB_BUILTIN, HIGH);  // Turn the RGB LED white
  delay(1000);
  digitalWrite(RGB_BUILTIN, LOW);  // Turn the RGB LED off
  delay(1000);
  rgbLedWrite(RGB_BUILTIN, RGB_BRIGHTNESS, 0, 0);  // Red
  delay(1000);
  rgbLedWrite(RGB_BUILTIN, 0, RGB_BRIGHTNESS, 0);  // Green
  delay(1000);
  rgbLedWrite(RGB_BUILTIN, 0, 0, RGB_BRIGHTNESS);  // Blue
  delay(1000);
  rgbLedWrite(RGB_BUILTIN, 0, 0, 0);  // Off / black
  delay(1000);
  #endif
}

 

 

주의: 이 예제에서 LED를 깜빡이게 하는 데 delay() 함수를 사용하지 않았다는 점을 눈치채셨을 것입니다. 비록 delay() 함수가 일반적으로 이러한 용도로 사용되지만 말이죠. 그 이유는 delay() 함수가 특정 시간 동안 프로그램 전체를 완전히 일시 정지시키기 때문입니다. ESP32가 delay()가 끝날 때까지 멈춰 있는 동안 OTA 업데이트 요청이 도착하면, 프로그램은 해당 요청을 완전히 놓치게 되어 업데이트가 실패하게 됩니다.

delay() 대신 millis()와 같은 비차단 방식을 사용합니다. 이렇게 하면 다른 작업을 수행하는 동안에도 프로그램이 계속 실행되며 업데이트를 확인할 수 있습니다.

 

 

이제 준비가 되셨으면 평소처럼 아두이노 업로드 시와 마찬가지로 " 업로드 " 버튼을 클릭하세요.

 

화면에 " 구성 및 업로드 " 라는 제목의 창이 나타나고 비밀번호를 입력하라는 메시지가 표시됩니다. 이는 사용 중인 Wi-Fi 네트워크의 비밀번호를 입력하라는 것입니다. 비밀번호를 입력한 다음 창의 " 업로드 " 버튼을 클릭하십시오.

 

네트워크 포트를 통해 OTA 스케치를 업로드할 때 비밀번호 입력 창이 나타납니다.

 

업로드 과정이 완료되면 ESP32가 자동으로 재시작되고 새 코드가 즉시 실행됩니다. 예를 들어, 앞서 보여드린 LED 깜빡임 코드를 업로드했다면 ESP32의 내장 LED가 깜빡이기 시작하는 것을 볼 수 있습니다.

 

ESP32 온보드 LED 깜빡임

 

중요 팁

 

ESP32에서 OTA(Over-The-Air) 업데이트가 원활하게 작동하려면 몇 가지 중요한 팁을 따라야 합니다.

 

무선으로 새 프로그램을 업로드할 때는 항상 OTA 코드가 포함되어 있는지 확인하세요 . OTA 코드 없이 프로그램을 업로드하면 ESP32가 Wi-Fi를 통한 업데이트 기능을 사용할 수 없게 됩니다. 이 경우, USB 케이블로 보드를 컴퓨터에 다시 연결하고 OTA 기능이 활성화된 스케치를 다시 업로드해야 합니다.

 

컴퓨터와 ESP32가 항상 동일한 Wi-Fi 네트워크에 연결되어 있는지 확인하세요 . OTA 업데이트가 제대로 작동하려면 두 장치가 네트워크를 통해 서로 통신해야 하므로 이는 필수적입니다.

 

첫 번째 물리적 업로드 후 아두이노 IDE에 네트워크 포트가 나타나지 않더라도 걱정하지 마세요. IDE를 다시 시작하기만 하면 됩니다 .

 

OTA 스케치는 일반 스케치보다 더 많은 메모리를 사용한다는 점을 기억하세요 . ESP32는 업데이트 전에 현재 프로그램과 새로 업로드할 프로그램을 모두 저장하기 때문입니다. 따라서 업데이트를 위한 충분한 공간을 확보할 수 있도록 플래시 메모리 사용량을 신중하게 계획해야 합니다.

 

 

튜토리얼의 원문은 이곳을 참고

반응형

캐어랩 고객 지원

취업, 창업의 막막함, 외주 관리, 제품 부재!

당신의 고민은 무엇입니까? 현실과 동떨어진 교육, 실패만 반복하는 외주 계약, 아이디어는 있지만 구현할 기술이 없는 막막함.

우리는 알고 있습니다. 문제의 원인은 '명확한 학습, 실전 경험과 신뢰할 수 있는 기술력의 부재'에서 시작됩니다.

이제 고민을 멈추고, 캐어랩을 만나세요!

코딩(펌웨어), 전자부품과 디지털 회로설계, PCB 설계 제작, 고객(시장/수출) 발굴과 마케팅 전략으로 당신을 지원합니다.

제품 설계의 고수는 성공이 만든 게 아니라 실패가 만듭니다. 아이디어를 양산 가능한 제품으로!

귀사의 제품을 만드세요. 교육과 개발 실적으로 신뢰할 수 있는 파트너를 확보하세요.

지난 30년 여정, 캐어랩이 얻은 모든 것을 함께 나누고 싶습니다.

카카오 채널 추가하기

카톡 채팅방에서 무엇이든 물어보세요

당신의 성공을 위해 캐어랩과 함께 하세요.

캐어랩 온라인 채널 바로가기

캐어랩