ESP32/장치설정

[아두이노] ESP32 Multi Thread 구현하는 방법 (easy RTOS)

아두맨 2024. 3. 6. 00:02
반응형
요약
ESP32를 아두이노에서 Task를 여러 개 생성하여 Multi Thread 구현하는 방법에 대해서 알아보겠습니다.
Free RTOS의 개념을 이해하기 전에 익혀두면 좋습니다.
하나의 파일로 코드를 다 처리할 경우 복잡해지고 다시 볼 때 정말 힘듭니다.
이럴 때 Task 단위로 아두이노.ino 파일을 생성하면 유지보수할 때 편하게 할 수 있습니다.

wokwi에서 Multi Thread 구현하는 방법

wokwi에서 프로젝트 설정하는 방법은 ESP32 → 장치설정 → ESP32 웹에서 간단히 시뮬레이션 테스트 wokwi에서 확인하실 수 있습니다. (아래 링크로도 확인 가능합니다.) 

[ESP32/장치설정] - ESP32 웹에서 간단히 시뮬레이션 테스트 wokwi

 

ESP32 웹에서 간단히 시뮬레이션 테스트 wokwi

요약 ESP32를 아두이노에서 실제로 테스트하기 전 간단하게 웹(wokwi)에서 시뮬레이션 테스트하는 방법 실제 개발보드로 테스트하며 진행하는 것이 물론 좋지만 핀을 수작업으로 일일이 연결하는

yepb.tistory.com

 

wokwi에 접속해서 먼저 프로젝트를 생성합니다.

 

바로 SAVE 하셔서 Multi Thread 이름으로 지정해 줍니다.

 

Public으로 저장하시면 됩니다.(유료 결제하면 Private 할 수 있으나 그냥 Public으로 진행하는 게 좋습니다.


지난 시간에 배웠던 LED와 아날로그 리딩으로 구현

LED 세팅하는 방법은 아래의 링크를 참고하시면 됩니다.

[ESP32/센서활용] - [아두이노] ESP32 LED 제어하는 방법 (디지털 ON/OFF 방식)

 

[아두이노] ESP32 LED 제어하는 방법 (디지털 ON/OFF 방식)

요약 ESP32를 아두이노에서 간단하게 LED 제어하는 방법에 대해서 알아보겠습니다. digitalWrite(pin, H/L)를 사용해서 간단하게 ON/OFF 하는 방법입니다. 먼저, 실패 확률을 줄입시다! 시작하기에 앞서 펌

yepb.tistory.com

 

아날로그 신호를 읽는 코드는 아래의 링크를 참고하시면 됩니다.

[ESP32/센서활용] - [아두이노] ESP32 아날로그 값 읽는 방법 (ADC, MilliVolts)

 

[아두이노] ESP32 아날로그 값 읽는 방법 (ADC, MilliVolts)

요약 ESP32를 아두이노에서 아날로그 값을 ADC와 전압으로 읽는 방법에 대해서 알아보겠습니다. analogRead(PIN)와 analogReadMilliVolts(PIN)를 사용해서 값을 12bit와 3.3V로 읽는 방법입니다. wokwi에서 ESP32 아

yepb.tistory.com

 

전에 세팅하셨던 것을 참고하여 아래 그림과 같이 wokwi에서 배선해 줍니다.

 

처음에 가변저항의 아날로그 값이 0이라서 LED 출력 값이 엄청 빠르게 올라갈 겁니다.

 

가변저항을 조금 돌려서 시간을 맞추면 LED가 blink_delay 시간에 맞게 깜빡일 겁니다.

 

아래의 코드를 복사 붙여 넣기 해서 실행하면 됩니다.

#if CONFIG_FREERTOS_UNICORE
#define ARDUINO_RUNNING_CORE 0
#else
#define ARDUINO_RUNNING_CORE 1
#endif

#define ANALOG_INPUT_PIN 34
#define LED_OUTPUT_PIN 32

// 멀티 TASK 선언
void TaskBlink( void *pvParameters );
void TaskAnalogRead( void *pvParameters );

uint32_t blink_delay = 1000;

void setup() {
  Serial.begin(115200);

  xTaskCreatePinnedToCore(
    TaskBlink
    ,  "Task Blink"
    ,  2048       
    ,  NULL
    ,  1  // 높을수록 먼저 처리
    ,  NULL
    , ARDUINO_RUNNING_CORE
    );

  xTaskCreatePinnedToCore(
    TaskAnalogRead
    ,  "Analog Read"
    ,  2048  // Stack size
    ,  NULL 
    ,  2  // 높을수록 먼저 처리
    ,  NULL 
    ,  ARDUINO_RUNNING_CORE 
    );

  Serial.printf("Basic Multi Threading Arduino Example\n");
}

void loop(){
  delay(10000);
}

void TaskBlink(void *pvParameters){ 
  (void) pvParameters;
  pinMode(LED_OUTPUT_PIN, OUTPUT);

  for (;;){ 
    digitalWrite(LED_OUTPUT_PIN, HIGH);
    vTaskDelay(blink_delay);
    digitalWrite(LED_OUTPUT_PIN, LOW);
    vTaskDelay(blink_delay);
    Serial.print("TASK_BLINK RUNNING\t delaytime :: ");
    Serial.println(blink_delay);
  }
}

void TaskAnalogRead(void *pvParameters){ 
  (void) pvParameters;

  for (;;){
    int sensorValue = analogRead(ANALOG_INPUT_PIN);
    blink_delay = sensorValue;
    Serial.print("TASK_ANALOG RUNNING\t ADC :: ");
    Serial.println(sensorValue);
    vTaskDelay(100); // 0.1s delay
  }
}

 

xTaskCreatePinnedToCore 함수는 FreeRTOS에서 태스크를 생성하는 함수입니다.

 

여기에 대한 각 매개변수를 살펴보겠습니다.

TaskBlink 생성할 태스크의 진입점인 함수의 포인터입니다. 이 경우 TaskBlink 함수가 태스크의 진입점입니다.
"Task Blink" 생성될 태스크의 이름입니다. 이 이름은 디버깅 목적으로 사용됩니다.
2048 태스크의 스택 크기입니다. 스택은 함수에서 사용하는 지역 변수 및 함수 호출에 필요한 정보를 저장하는 데 사용됩니다.
NULL 태스크에 전달되는 매개변수입니다. 이 경우에는 사용하지 않으므로 NULL로 설정됩니다.
1 태스크의 우선순위입니다. FreeRTOS에서 높은 숫자가 더 높은 우선순위를 나타냅니다.
NULL 태스크의 핸들을 저장할 포인터입니다. 이 핸들을 사용하여 태스크를 제어할 수 있습니다. 여기서는 사용하지 않으므로 NULL로 설정됩니다.
ARDUINO_RUNNING_CORE 태스크가 실행될 코어를 지정합니다. ARDUINO_RUNNING_CORE 매크로는 코드 맨 위에서 정의된 것으로, FreeRTOS가 UniCore에서 실행되는지에 따라 적절한 코어를 선택합니다. UniCore에서 실행되면 0을, 그렇지 않으면 1을 선택합니다.

 

처음 사용하실 때에는 파란색으로 색칠된 부분만 수정하셔도 됩니다. 

 

나머지는 좀 더 코드 작업에 익숙해지면 다루도록 하겠습니다.

 

테스트 핸들을 저장할 포인터는 사용할 일이 꽤 있으므로 나중에 Free RTOS 할 때 자세히 다루도록 하겠습니다.


이제 시작을 눌러서 실행하면 됩니다.

그림과 같이 두 개의 출력을 볼 수 있습니다.

 

- TASK_BLINK RUNNING      delaytime  :: 881

- TASK_ANALOG RUNNING   ADC  :: 881

 

가변저항에서 읽은 아날로그 신호 ADC 값을 blink_delay로 지정해주고 있기 때문에 ADC 시간에 맞게 LED가 깜빡입니다.


아두이노 세팅 및 코드 작성

ESP32를 아두이노 세팅하는 방법은 ESP32 → 장치설정 → ESP32 아두이노 2 설치를 찾아가셔도 되고 아래의 링크로도 확인 가능합니다.  
[ESP32/장치설정] - ESP32 아두이노 2 설치
 

ESP32 아두이노 2 설치

요약 ESP32 아두이노 IDE 2 버전을 설치하는 방법에 대해 알아보겠습니다. 현재 펌웨어 개발 과정에서 에러가 덜 발생되는 2.0.11 버전으로 설치를 진행합니다. ESP32는 IoT가 장점이기 때문에 기본 예

yepb.tistory.com

 

코드는 wokwi에서 사용한 코드 그대로를 복사 붙여 넣기 해주면 됩니다.

 

코드를 업로드하시고 시리얼 모니터 결과를 확인하면 wokwi와 똑같이 동작합니다.

 

실제 보드에서도 wokwi와 동일하게 구동되는 것을 확인할 수 있습니다.


이번 시간에는 Free RTOS를 배우기 전에 Multi Thread 개념을 배워보았습니다.

우리가 현재를 살아가면서 시간을 중요하게 생각하듯 시스템에서도 마찬가지입니다.

Multi Thread 사용법을 잘 익히시고 사용하다가 Free RTOS 공부와 같이 병행해 주면 좋습니다.

 

오늘도 긴 글 읽어주셔서 감사합니다!

반응형