본문 바로가기

아두이노우노 R4

Arduino를 사용하여 ESP32 보드에 FreeRTOS 구현하기 1

반응형

Arduino를 사용하여 ESP 32 장치에 FreeRTOS 솔루션 구현 튜토리얼 4과 중 1과 

 

이번 수업에서는 실습을 시작해 보겠습니다. 수업 전반에 사용될 하드웨어를 설정하고 간단한 Arduino 프로그래밍 기법을 사용하여 테스트해 보겠습니다. 다음 수업에서는 동일한 하드웨어를 사용하지만 FreeRTOS 함수를 사용하여 더 복잡한 솔루션을 개발해 보겠습니다.

 

필요한 하드웨어

 

취미 학습 프로젝트이기 때문에 하드웨어 구성 요소는 매우 일반적이며 요구 사항도 제한적입니다. 제 설정은 다음과 같습니다. 그다지 흥미롭지는 않지만, Arduino 플랫폼에서 FreeRTOS 프로그래밍의 여러 필수 기능을 시연하는 데 사용할 수 있습니다. 

 

 

개발 보드 — 저는 ESP 32 WROOM을 사용하지만 대부분의 ESP 32 보드가 작동할 것입니다. 테스트에 사용한 보드의 아마존 링크는 다음과 같습니다.

 

LED와 제한 저항 — 저는 제 폐품 상자에서 나온 일반적인 파란색, 빨간색, 초록색 LED를 사용했습니다. 전류 흐름을 제한하기 위해 330옴 저항을 사용했지만, 220옴에서 1K옴 사이의 저항이면 모두 작동할 것입니다. 저항이 높을수록 LED 출력의 밝기가 감소합니다.

 

OLED I2C 디스플레이 - 여기에서 볼 수 있듯이 작은(0.96인치) 디스플레이를 사용했지만 SSD1306 드라이버를 지원하는 I2C 인터페이스로 구동되는 디스플레이라면 무엇이든 작동해야 합니다.

 

푸시버튼 스위치 — 브레드보드 설치용으로 설계된 모든 푸시버튼 스위치가 작동합니다. 여기서 사용된 스위치는 푸시-투-클로즈 접점을 가지고 있습니다.

 

일반 브레드보드 및 연결선 

 

시스템 배선

 

위의 브레드보드 회로 사진을 자세히 보시면 회로 배치에 제약이 있다는 것을 알 수 있습니다. ESP 32 브레이크아웃 보드는 브레드보드 중앙 부분만큼 넓어서 보드 양쪽 가장자리에 있는 핀에 연결하기가 어려웠습니다. 하지만 ESP WROOM 32의 핀아웃을 보니 보드 한쪽에서 필요한 전원, GPIO, I2C 핀을 찾을 수 있었습니다. 연결해야 하는 모든 핀에 더 많은 연결 공간을 확보하기 위해 브레드보드에 WROOM 32 보드 오프셋을 장착했습니다. 

 

ESP 32 WROOM 핀아웃 다이어그램

 

회로 배선 단계는 아래와 같습니다. 브레드보드 크기에 따라 원하는 부품 배치를 선택할 수 있습니다.

 

  1. 3V3 핀을 브레드보드의 양극 전원 레일에 연결하고 GND 핀을 음극 레일에 연결합니다. 보드 한쪽의 음극 레일에서 반대쪽의 음극 레일로 점퍼선을 연결합니다.
  2. 3개의 LED는 짧은 다리를 음극 레일에 연결하고 긴 핀을 브레드보드의 중앙 부분에 연결하여 배치합니다.
  3. 제한 저항기는 LED의 긴 핀 끝에 연결되고 브레드보드 중앙을 가로질러 연결 공간으로 연결됩니다.
  4. 그런 다음 점퍼선을 사용하여 LED 반대편의 저항기 끝을 ESP 32의 해당 핀에 연결합니다. 녹색은 D15 핀에, 빨간색은 D4 핀에, 파란색은 16 핀에 연결합니다.
  5. OLED 디스플레이 보드에서 VCC와 GND 핀 사이에 점퍼를 연결하여 전원의 양극과 음극을 연결합니다. ESP 32의 SDA 핀에서 D21 핀으로, SCL 핀에서 D22 핀으로 점퍼를 연결합니다.
  6. 핀 D23의 점퍼를 푸시버튼 스위치의 한 핀에 연결하고, 스위치의 반대쪽에서 접지 레일로 가는 전선을 연결합니다.

 

이제 됐어요. 이제 괜찮을 거예요. 

 

초기 테스트 프로그래밍

 

FreeRTOS 프로그래밍을 시작하기 전에, 간단한 테스트 프로그램을 사용하여 배선과 Arduino 구성을 테스트해 보겠습니다. 아래의 간단한 프로그램은 각 표시등을 0.5초 동안 개별적으로 켜고 OLED 디스플레이에 표시등 색상을 표시합니다. 버튼을 누르면 표시등이 꺼지고 디스플레이에 "DARK"가 표시됩니다. 그다지 유용한 프로그램은 아니지만, 배선이 올바르고 Arduino IDE가 제대로 구성되었는지 확인하는 데 도움이 됩니다.

 

IDE 설정 - 이 튜토리얼은 Windows 10에서 실행되는 Arduino IDE 버전 2.3.2를 활용하지만 다른 버전도 작동해야 합니다. ESP 32 보드에 맞게 구성하지 않은 경우 보드 관리자 메뉴를 사용하여 Espressif Systems 라이브러리의 ESP32를 다운로드하세요. 로드한 후에는 선택할 수 있는 보드 옵션이 많습니다. 프로젝트에서 사용되는 기능을 지원하는 ESP DEV MODULE을 사용합니다. SSD1306 드라이버 칩을 사용하는 OLED 디스플레이 보드에 대한 지원을 제공하는 Adafruit SSD1306 라이브러리도 포함해야 합니다. 드라이버에 대한 정보는 여기에서 확인할 수 있습니다 . FreeRTOS 기능을 활용하는 데 필요한 설정 요구 사항은 없습니다. ESP 32 보드 라이브러리를 설치할 때 구성되는 Arduino/Espressif 툴체인에서 직접 처리합니다. 브레이크아웃 보드의 USB-C 커넥터를 IDE 컴퓨터의 USB 포트에 연결하고 Arduino IDE가 포트를 활용하도록 구성합니다. 어떤 포트에 연결되어 있는지 확실하지 않은 경우 Windows 10에서는 장치 관리자 앱을 사용하여 확인할 수 있습니다. 포트 범주에 USB-Serial CH340 장치로 표시됩니다. IDE의 모습은 다음과 같습니다. 

 

 

코드 입력 — 이 연습의 목적은 단순히 배선과 IDE 구성을 테스트하는 것이므로 코드를 설명할 필요가 없습니다. 코드를 복사하여 새 아두이노 스케치에 붙여넣고, rtos_initial이라는 이름으로 저장하세요. 

 

/*********
This code was developed for use with the tutorial series entitled
"Implementing FreeRTOS Solutions on ESP 32 Devices using Arduino"  

Refer to https://medium.com/@tomw3115/implementing-freertos-solutions-on-esp-32-devices-using-arduino-114e05f7138a for more information.

This software is provided as-is for hobbyist use and educational purposes only.

published by Tom Wilson - September 2024 *********/

#include <Adafruit_SSD1306.h>
#include <splash.h>

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_SSD1306.h>

// define LCD display settings
#define OLED_ADDR 0x3C
#define OLED_RESET 4

// define GPIO pin numbers for LEDs and push button
int pinGreen = 15;
int pinRed = 4;
int pinBlue = 16;
int pinBtn = 23;

// define 1/2 second pause time for light sequencing
int waitTime = 500;

// initialize the lcd display (once)
Adafruit_SSD1306 Display(OLED_RESET);

// the setup function runs once when you press reset or power the board
void setup() 
{
  // initialize serial communication at 115200 bits per second:
  Serial.begin(115200);

  //set GPIO pins to output
  pinMode(pinGreen, OUTPUT);
  pinMode(pinRed, OUTPUT);
  pinMode(pinBlue, OUTPUT);
  pinMode(pinBtn, INPUT_PULLUP); // button is in HIGH state when unpressed

  // initialize the OLED display board
  Display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR);
  Display.clearDisplay();
  Display.display();

  //start with all LEDs OFF
  digitalWrite(pinGreen, LOW); 
  digitalWrite(pinRed, LOW); 
  digitalWrite(pinGreen, LOW); 
}

// function to display messages on the OLED display
void displayMsg(char color[6]) // pass the character array to display
  {   
    Display.clearDisplay();
    Display.setTextSize(1);
    Display.setTextColor(WHITE);
    Display.setCursor(40, 0);
    Display.println("LED Lit");
    Display.setTextSize(2);
    Display.setTextColor(WHITE);
    Display.setCursor(30, 15);
    Display.println(String(color));
    Display.display();
  }

void loop() 
{
  while (true)  // run forever until you unplug it
  { 
    if (digitalRead(pinBtn) == HIGH) // check for button push
    { 
      // sequence through LED colors
      digitalWrite(pinGreen, HIGH);
      displayMsg("Green");
      delay(waitTime);           
      digitalWrite(pinGreen, LOW); 
      digitalWrite(pinRed, HIGH);
      displayMsg("Red");
      delay(waitTime);           
      digitalWrite(pinRed, LOW);  
      digitalWrite(pinBlue, HIGH);
      displayMsg("Blue");
      delay(waitTime);           
      digitalWrite(pinBlue, LOW);  
    }
    else
    { 
      // skip LED sequencing and display Dark" message if the button is pressed
      displayMsg("Dark");
    }
  }
}

 

코드를 컴파일하여 보드에 업로드하면 자동으로 재설정되고 실행됩니다. 부팅이나 활성화 버튼을 누를 필요가 없습니다. LED 표시등이 0.5초 간격으로 켜지고 OLED 디스플레이에 현재 켜져 있는 표시등의 색상이 표시됩니다. 버튼을 누르면 표시등이 꺼지고(현재 주기 후) 버튼을 놓을 때까지 디스플레이에 "Dark"가 표시됩니다. 이 하드웨어 및 IDE 구성은 향후 모든 레슨에서 사용할 것입니다. 구성은 다음과 같습니다. 

 

축하합니다! 이제 배선과 Arduino IDE 구성 설정을 확인했습니다. 이제 멋진 깜빡이는 LED 디스플레이가 생겼습니다. 다음 레슨에서는 동일한 회로 구성과 Arduino IDE 설정을 사용하여 FreeRTOS를 사용하여 더욱 흥미로운 솔루션을 구축해 보겠습니다. 

 

 

반응형

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