산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

아두이노 프로토스레딩으로 멀티태스킹 마스터하기: 단계별 튜토리얼

부품 및 소모품

아두이노 우노 × 1
선파운더 블루 16x2 LCD × 1
브레드보드 (일반) × 1
로터리 포텐셔미터 (일반, 1kΩ 권장) × 1

프로젝트 소개

이 튜토리얼에서는 단일 코어 아두이노로 동시에 세 가지 작업을 수행하는 방법을 다룹니다:

프로토스레딩이란?

프로토스레딩(Protothreading)은 일반적으로 멀티태스킹(두 가지 이상의 작업을 동시에 또는 다른 간격으로 수행)이 필요한 작업을 아두이노에서 구현하는 방식입니다. 즉, "멀티스레드"처럼 동작합니다. 하지만 아두이노는 단일 코어 칩에 절차적 코드로 작동하므로 진정한 멀티스레딩은 불가능합니다. 그렇다면 프로토스레딩은 어떻게 다를까요?

"진짜" 멀티스레딩 vs 프로토스레딩

프로토스레딩을 제대로 이해하려면 왜 이것이 진짜 멀티스레딩이 아닌지부터 알아야 합니다.

인텔이 펜티엄 프로세서에 "하이퍼스레딩" 기술을 도입했던 시절을 기억하시나요? 하이퍼스레딩은 단일 코어가 두 개처럼, 두 코어가 네 개처럼 동작하게 만드는 기술입니다. 핵심은 사이클(Cycle)입니다.

마이크로컨트롤러와 CPU 모두 "사이클" 단위로 작업을 처리합니다. 초당 몇 사이클을 처리하느냐가 클럭 속도입니다. 아두이노 우노의 ATmega328P는 16MHz로 동작하며, 초당 1,600만 사이클을 처리합니다. 이는 코드 줄 수가 아닌 레지스터 데이터 이동 같은 프로세서 명령어 단위입니다.

단일 코어의 속도 한계(발열 등)로 인해 멀티코어 CPU와 멀티스레딩이 등장했습니다. 컴퓨터에서 멀티스레드 애플리케이션은 서로 다른 코어에서 병렬로 실행되는 별도 프로세스들입니다. 하지만 아두이노 MCU는 코어가 하나뿐이므로 전통적인 멀티스레딩은 불가능합니다. 단일 코어에서 여러 작업을 동시에 처리하려면 프로토스레딩이 필요합니다.

프로토스레딩은 어떻게 다른가?

프로토스레딩은 하이퍼스레딩과 유사하지만, CPU 사이클 대신 코드의 '루프'나 '실행 라인' 단위로 작업을 나눕니다. 메인 루프에서 다른 작업이 없을 때 덜 빈번하거나 덜 까다로운 작업을 수행하고, 주기적으로 다른 작업이 실행될 시간인지 확인해 분기하는 방식입니다.

중요: SD 카드 읽기 등 블로킹(Blocking) 작업은 여전히 다른 프로토스레드의 적시 실행을 방해합니다. 하지만 변수 변경이나 출력 값 갱신 같은 빠른 작업에는 훌륭하게 작동합니다.

시작하기

수행할 작업을 정의합니다. 예제에서는 (a) LCD 백라이트 페이드 인/아웃, (b) 느린 간격으로 카운터 증가, (c) 더 느린 간격으로 문자열 순환을 구현합니다.

함수를 블로킹이 적은 순서부터 많은 순서로 정렬하세요. 가장 블로킹이 적은 함수(가장 자주 실행되고 빠르게 완료)를 메인 "스레드"로 사용합니다. 위 예제에서는 (a) 백라이트 펄싱이 해당됩니다.

메인 스레드(및 그 안의 루프)에서 numberThread.check(), textThread.check()를 호출해 다른 스레드 실행 여부를 확인합니다. 모든 루프 내에서 이 체크를 수행해야 블로킹을 방지할 수 있습니다.

코드는 상세히 주석 처리되어 있으니 메인 루프 부분을 참고하세요. TimedAction 라이브러리를 사용해 각기 다른 간격으로 세 가지 동작을 반복 실행합니다.

코드

Multithreaded LCD Code - multithread.ino (v1.1)

/* Arduino Protothreading Example v1.1 by Drew Alden (@ReanimationXP) 
 * 2016/01/12 - Update: v1.1 - 2017/08/18 Arduino 1.6.6+ 대응 수정
 * 참고: TimedAction 라이브러리는 구버전입니다. 
 * TimedAction.h 내의 WProgram.h를 Arduino.h로 변경해야 합니다.
 */

// 서드파티 라이브러리
#include <TimedAction.h>  // 별도 설치 필요, TimedAction.h에서 WProgram.h → Arduino.h 수정 필수

// 기본 라이브러리
#include <LiquidCrystal.h>

// 전역 변수
int backlightPin = 9;      // 백라이트 페이딩용 PWM 핀
int timerCounter = 0;      // 증가 카운터 (오버플로우 주의)
int stringNo = 0;          // 표시할 문자열 인덱스
char* stringArray[] = {
  "Check it out... ", 
  "I have 3 threads", 
  "going at once...", 
  "Cool, huh?! :D "
};

// 초기화
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

// 함수: 카운터 증가 및 표시
void incrementNumber() {
  lcd.setCursor(0, 1);
  timerCounter++;
  lcd.print(timerCounter);
}

// 함수: 문자열 순환 표시
void changeText() {
  lcd.setCursor(0, 0);
  lcd.print(stringArray[stringNo]);
  if (stringNo >= sizeof(stringArray)/sizeof(char *)) {
    stringNo = 0;
    changeText();
  } else {
    stringNo++;
  }
}

// 타이머 객체 생성 (함수 정의 뒤에 위치해야 함)
TimedAction numberThread = TimedAction(700, incrementNumber);   // 700ms마다
TimedAction textThread = TimedAction(3000, changeText);         // 3000ms마다

void setup() {
  lcd.begin(16, 2);
  changeText();  // 초기 문자열 표시
}

void loop() {
  // 다른 스레드 체크 및 실행
  numberThread.check();
  textThread.check();

  // 작업 3: 백라이트 페이드 인 (가장 빈번한 작업 = 메인 루프)
  digitalWrite(13, HIGH);
  for (int fadeValue = 0; fadeValue <= 255; fadeValue += 10) {
    numberThread.check();  // 루프 내에서도 체크 필수
    textThread.check();
    analogWrite(backlightPin, fadeValue);
    delay(20);  // 메인 루프 지연은 짧게 유지
  }

  // 백라이트 페이드 아웃
  digitalWrite(13, LOW);
  for (int fadeValue = 255; fadeValue >= 0; fadeValue -= 10) {
    numberThread.check();
    textThread.check();
    analogWrite(backlightPin, fadeValue);
    delay(20);
  }
}

핵심 포인트: 메인 루프의 for 루프 내부에서도 .check()를 호출해야 다른 스레드가 제때 실행됩니다. delay()는 짧게 유지하세요. 이 방식은 간단한 멀티태스킹에 효과적이며, RTOS 지원 MCU에서는 더 정교한 구현이 가능합니다.

제조공정

  1. 아두이노와 파이썬으로 OpenSensors를 활용한 공기질 측정 가이드
  2. 아두이노 RFID 도어락 만들기 – 단계별 완벽 가이드
  3. 아두이노로 범용 IR 리모컨 만들기: 단계별 가이드
  4. 디지털 신장계 제작: 아두이노 & 레이저 센서로 키 측정하기
  5. 서미스터(NTC) 온도 센서 아두이노 활용 완전 정복 - 수식부터 구현까지
  6. 아두이노로 음악 톤 만들기: 88키 피아노 음계 구현 가이드
  7. 아두이노를 NMEA-0183에 연결하기: 단계별 가이드
  8. 아두이노 나노 지문 센서 프로젝트 – 단계별 튜토리얼
  9. 아두이노로 Modbus 마스터하기: 단계별 완벽 가이드
  10. 아두이노 입문 튜토리얼 01: 첫 프로젝트 시작하기