Search Code

ESP32 튜토리얼 31/55 - 장애물 회피 기능이 있는 LED 스트립 프로젝트 | SunFounder의 ESP32 IoT 학습 키트

ESP32 튜토리얼 31/55 - 장애물 회피 기능이 있는 LED 스트립 프로젝트 | SunFounder의 ESP32 IoT 학습 키트

이 튜토리얼에서는 ESP32 마이크로컨트롤러와 WS2812 LED 스트립을 사용하여 장애물 감지에 따라 방향을 바꿀 수 있는 프로젝트를 만들 것입니다. LED 스트립이 앞으로 이동할 때는 무작위 색상을 표시하고, 장애물이 감지되면 미리 정해진 색상으로 전환한 후 방향을 반전합니다. 이 프로젝트는 적외선 장애물 회피 센서와 결합된 ESP32의 성능을 보여줍니다.

ESP32-31-flowing-light-main2

이 튜토리얼 전체에서 필요한 하드웨어 구성 요소, 배선 지침, 그리고 이 프로젝트를 구현하는 데 필요한 코드를 다룰 것입니다. 더 시각적인 설명을 원하시면 아래 링크된 비디오(비디오의 00:00 지점)를 확인하세요.

하드웨어 설명

이 프로젝트에는 ESP32 마이크로컨트롤러, WS2812 LED 스트립, 적외선 장애물 회피 센서를 포함한 여러 구성 요소가 필요합니다. ESP32는 내장 Wi-Fi와 Bluetooth를 갖춘 강력한 마이크로컨트롤러로, IoT 애플리케이션에 완벽합니다. WS2812 LED 스트립은 프로그래밍 가능한 RGB LED 스트립으로 각 LED를 개별적으로 제어할 수 있어 역동적인 조명 효과를 만들 수 있습니다.

적외선 장애물 회피 센서는 적외선을 방출하고 근처 물체의 반사를 감지하여 작동합니다. 장애물이 감지되면 센서의 출력 상태가 변경되어 ESP32가 LED 스트립의 동작을 변경하여 적절히 대응할 수 있습니다.

데이터시트 세부 정보

제조업체 WS2812B
부품 번호 WS2812B
로직/IO 전압 3.3 V (일반)
공급 전압 5 V (일반)
출력 전류 (채널당) 20 mA (최대)
피크 전류 (채널당) 60 mA (최대)
PWM 주파수 가이드 400 Hz (일반)
입력 로직 임계값 0.3 Vcc (높음), 0.1 Vcc (낮음)
전압 강하 / RDS(on) / 포화 1.2 V (최대)
열 제한 85 °C (최대)
패키지 표면 실장
참고 사항 / 변형 다양한 길이와 밀도로 제공됨

 

  • 최적의 성능을 위해 LED 스트립에 5 V 전원을 공급하세요.
  • 신호 무결성 문제를 방지하려면 데이터 핀에 적절한 저항을 사용하세요.
  • 과열을 방지하기 위해 출력 전류 제한에 주의하세요.
  • 전압 스파이크를 방지하려면 전원 공급 장치를 적절히 디커플링하세요.
  • 원하는 감지 범위를 얻으려면 적외선 센서를 신중하게 조정하세요.

배선 지침

ESP32-31-flowing-light-wiring

구성 요소를 배선하려면 적외선 장애물 회피 센서부터 시작하세요. 센서의 출력 핀을 ESP32의 핀 25에 연결하세요. 중간 핀은 접지에 연결하고 마지막 핀(VCC)은 3.3 V 전원에 연결해야 합니다.

ESP32-31-flowing-light-schematic

다음으로 WS2812 LED 스트립의 경우 데이터 핀(일반적으로 노란색 선)을 ESP32의 핀 14에 연결하세요. 빨간색 선은 5 V 전원에 연결하고 검은색 선은 접지에 연결해야 합니다. 느슨한 배선을 방지하기 위해 모든 연결을 제대로 고정하세요.

코드 예제 및 설명

다음은 이 프로젝트를 실행하는 코드에 대한 간략한 개요입니다. 먼저 LED 스트립의 픽셀 수와 통신에 사용되는 데이터 핀을 정의합니다:

#define NUM_PIXELS 8
#define DATA_PIN 14

setup() 함수에서 LED 스트립과 적외선 센서를 초기화합니다:

void setup() {
  pixels.begin();
  pinMode(AVOID_PIN, INPUT_PULLUP);
  uint32_t color = pixels.Color(random(256), random(256), random(256));
  pixels.fill(color);
  pixels.show();
}

loop() 함수에서 장애물이 감지되었는지 확인하고 LED 스트립을 그에 따라 제어합니다:

if (avoid_value) {
    for (int i = 0; i < NUM_PIXELS; i++) {
      pixels.setPixelColor(i, color);
      pixels.show();
      pixels.setPixelColor(i, 0);
      delay(100);
    }
  } else {
    for (int i = NUM_PIXELS - 1; i >= 0; i--) {
      pixels.setPixelColor(i, color);
      pixels.show();
      pixels.setPixelColor(i, 0);
      delay(100);
    }
  }

이 코드는 LED 스트립이 앞으로 이동할 때 무작위 색상을 표시하고 장애물이 감지되면 방향을 바꿀 수 있게 합니다. 전체 코드는 기사 아래에 로드되므로 모든 세부 사항을 확인하려면 꼭 살펴보세요.

시연 / 기대 효과

설정이 완료되고 코드가 업로드되면 LED 스트립이 앞으로 이동하면서 무작위 색상을 표시하기 시작합니다. 장애물이 감지되면 스트립이 미리 정해진 색상(예: 녹색)으로 전환하고 방향을 반전합니다. 장애물이 제거되면 스트립은 무작위 색상으로 앞으로 이동을 재개합니다. 적외선 센서의 감지 범위는 사용되는 전원 공급 장치에 따라 달라질 수 있습니다(비디오의 10:30 지점).

비디오 타임스탬프

  • 00:00 시작
  • 2:14 프로젝트 소개
  • 4:58 배선 설명
  • 7:41 장애물 회피 센서 조정
  • 10:03 아두이노 코드 설명
  • 15:40 Arduino IDE에서 ESP32 보드 및 COM 포트 선택
  • 17:22 프로젝트 1: 시연
  • 18:17 반환 색상 변경

이미지

ESP32-31-flowing-light-main2
ESP32-31-flowing-light-main2
ESP32-31-flowing-light-main
ESP32-31-flowing-light-main
ESP32-31-flowing-light-schematic
ESP32-31-flowing-light-schematic
ESP32-31-flowing-light-wiring
ESP32-31-flowing-light-wiring
832-ESP32 Tutorial 31/55- Arduino code flowing light
언어: C++
#include <Adafruit_NeoPixel.h>

// Set the number of pixels for the running light
#define NUM_PIXELS 8

// Set the data pin for the RGB LED strip
#define DATA_PIN 14

// Initialize the RGB LED strip object
Adafruit_NeoPixel pixels(NUM_PIXELS, DATA_PIN, NEO_GRB + NEO_KHZ800);

// Initialize the avoid sensor
#define AVOID_PIN 25

void setup() {
  // Initialize the RGB LED strip
  pixels.begin();

  // Initialize the avoid sensor
  pinMode(AVOID_PIN, INPUT_PULLUP);

  // Set the initial LED color
  uint32_t color = pixels.Color(random(256), random(256), random(256));
  pixels.fill(color);
  pixels.show();
}

void loop() {
  // Read the input from the infrared sensor
  bool avoid_value = digitalRead(AVOID_PIN);

  // Generate a random color for the current pixel
  uint32_t color = pixels.Color(random(256), random(256), random(256));

  // If no obstacle is detected
  if (avoid_value) {
    for (int i = 0; i < NUM_PIXELS; i++) {
      // Turn on the current pixel with the random color
      pixels.setPixelColor(i, color);

      // Update the RGB LED strip display
      pixels.show();

      // Turn off the current pixel
      pixels.setPixelColor(i, 0);
      delay(100);
    }
  }
  // If detects an obstacle, change the direction of the LED strip
  else {
    for (int i = NUM_PIXELS - 1; i >= 0; i--) {
      pixels.setPixelColor(i, color);
      pixels.show();
      pixels.setPixelColor(i, 0);
      delay(100);
    }
  }
}

자원 및 참고자료

파일📁

파일이 없습니다.