3주 차 ESP32를 활용한 LED 제어 - park-02/2024-1_Smart-Devices GitHub Wiki

목차

  • 디지털 출력

    • 실습 [1]
  • 아날로그 출력

    • PWM
    • DAC
    • 실습 [2]
    • 실습 [3]
  • 아날로그 입력

    • 가변 저항
    • 옴의 법칙
    • 실습 [4]
  • 후기

디지털 출력

ESP32 Devkit은 EN, VIN, 3V3, GND, 그리고 입력 전용 핀(34, 35, 36, 39)을 나머지 제외한 모든 핀을 디지털 출력으로 활용 가능합니다. 이는 다양한 프로젝트 및 응용 프로그램을 위한 ESP32의 디지털 출력 기능을 활용할 수 있게 합니다.

  • EN : 활성화(Enable) 핀은 모듈의 동작을 제어하는 데 사용됩니다. 이 핀이 활성화되면 모듈이 활성화되어 동작하며, 비활성화되면 모듈이 꺼집니다.
  • GPIO : 디지털 입력 및 출력을 처리하는 다목적 핀입니다. 다양한 센서 및 외부 장치와의 상호 작용에 사용됩니다.
  • I/O : 디지털 신호를 처리하고 장치 간 통신을 가능하게 합니다. 데이터 송수신 및 제어 신호 전송에 사용됩니다.
  • Analog input : 외부에서 오는 아날로그 신호를 디지털로 읽어들여 처리하는 데 사용됩니다.

실습[1] 내용

  • 이 실습에서는 ESP32를 사용하여 LED를 1초 동안 켜고 1초 동안 끄는 것을 반복하는 프로그램을 작성합니다.

준비물

  • ESP32, ESP32 확장 실드, Led 모듈, 점퍼 케이블

회로 연결

소스코드

const int ledPin = 4; //led 핀 번호 설정     
// setup 함수는 리셋을 누르거나 보드에 전원을 공급할 때 한 번 실행     
void setup(){    
  pinMode(ledPin, OUTPUT);    
}   
  
void loop() { // 반복 실행합니다.    
  digitalWrite(ledPin, HIGH); // LED를 켭니다.    
  delay(1000); // 1초 동안 대기합니다.     
  digitalWrite(ledPin, LOW); // LED를 끕니다.     
  delay(1000); // 1초 동안 대기합니다.       
}
  • 이 코드에서는 setup() 함수에서 LED 핀을 출력으로 설정합니다. 그리고 loop() 함수에서는 LED를 HIGH로 설정하여 LED를 켜고, 1초 동안 대기한 후에 LED를 LOW로 설정하여 LED를 끕니다. 그리고 다시 1초 동안 대기하고 이를 반복합니다. 이렇게 하면 LED가 1초 간격으로 깜박이게 됩니다.

실행

  • ESP32 보드를 컴퓨터에 연결합니다.
  • Arduino IDE에 소스코드를 컴파일하고 업로드합니다.
  • 프로그램이 업로드되면 LED가 1초 동안 켜지고 1초 동안 꺼지는 것을 반복하여 작동합니다.
KakaoTalk_20240320_214357677.mp4

결과

  • 이 프로그램을 실행한 결과 LED가 1초 간격으로 켜지고 꺼지는 것을 확인할 수 있었습니다.

아날로그 출력

ESP32 Devkit은 EN, VIN, 3V3, GND 핀 및 입력 전용 핀(34, 35, 36, 39)을 제외한 나머지 모든 핀을 아날로그 출력 또는 디지털 출력으로 사용할 수 있습니다. 또한, ESP32는 아두이노와 동일하게 PWM(Pulse Width Modulation) 출력을 지원하며, 추가로 DAC(Digital-to-Analog Converter)를 지원합니다.

PWM

PWM(Pulse Width Modulation)은 pulse(파형), width(폭), modulation(변조)의 약자로 펄스 폭 변조를 말하는 것입니다. 이 기술은 주어진 시간 동안 신호의 HIGH(1) 상태와 LOW(0) 상태를 교대하여 아날로그적인 출력을 만들어냅니다. 이를 통해 신호에서 특정 시간 동안의 HIGH(1) 비율을 조절함으로써 아날로그적인 효과를 만들어내는 것입니다. 이 비율을 Duty Cycle이라고 하며, 이를 조절하여 LED의 밝기를 조절하거나 모터의 속도를 제어할 수 있습니다. PWM은 전력을 효율적으로 관리하고 장치를 효과적으로 제어하는 데 사용됩니다. 또한, PWM을 이용하여 LED가 깜빡거리는 것을 인지할 수 없는 주기로 켜고 끄면 LED의 밝기를 조절할 수 있습니다.

ㅎㅁㅎㅁㅎㅁㅎ

Duty Cycle(듀티 사이클)은 주기 동안 신호가 HIGH(1) 상태로 유지되는 비율을 나타냅니다. 보통 백분율로 표시되며, 0%에서 100%까지의 값을 가질 수 있습니다. Duty Cycle이 50% 라면, 신호는 주기의 절반 동안 HIGH 상태로 유지됩니다. Duty Cycle을 조절함으로써 PWM 신호의 폭을 제어하여 아날로그적인 출력을 조절할 수 있습니다.

ㅋㅌㅊㅋㅍ

디지털 신호는 HIGH(1) 상태와 LOW(0) 상태밖에 없기 때문에 중간의 값이 존재할 수 없습니다. 하지만 아날로그 신호는 다양한 값을 가질 수 있습니다. 그렇기 때문에 디지털 신호를 LED에 연결하면 LED가 On/Off 동작만 하게 되고, 아날로그 신호에 LED를 연결하게 되면 LED가 On/Off도 되지만 LED의 빛의 밝기도 조절할 수 있습니다. ㅁㄴㄹㄴㄹ

DAC

DAC는 디지털 신호를 아날로그 신호로 변환하는 역할을 합니다. 일반적으로 디지털 컴퓨터는 디지털 신호를 생성하고 처리하지만, 이를 아날로그적인 출력이나 제어에 사용해야 할 때가 있는데 이때 DAC가 필요합니다.

실습[2] 내용

  • 이 실습에서는 ESP32에 LED를 사용하여 PWM(Pulse Width Modulation)을 통해 LED의 밝기를 조절하는 예제입니다. LED가 점차 켜지고 점차 꺼지는 효과를 만드는 프로그램을 작성합니다.

준비물

  • ESP32, ESP32 확장 실드, Led 모듈, 점퍼 케이블

회로 연결

소스코드

 const int ledPin = 4;

void setup() {
  pinMode(ledPin, OUTPUT);
}

void loop() {
  // LED를 점차 밝기 증가.
  for (int i = 0; i <= 255; i++) {
    analogWrite(ledPin, i); // PWM 신호를 사용하여 LED의 밝기를 조절합니다.
    delay(15);
  }
  
  // LED를 점차 밝기 감소.
  for (int i = 255; i >= 0; i--) {
    analogWrite(ledPin, i); // PWM 신호를 사용하여 LED의 밝기를 조절합니다.
    delay(15);
  }
}
  • 이 코드에서는 setup() 함수에서 LED가 연결된 핀을 출력으로 설정하고, loop() 함수에서는 LED의 밝기를 0에서 255까지 점차적으로 증가시킨 후 255부터 0까지 점차적으로 감소시킵니다. 이때 analogWrite() 함수를 사용하여 LED의 밝기를 조절합니다.

실행

  • ESP32 보드를 컴퓨터에 연결합니다.
  • Arduino IDE에 소스코드를 컴파일하고 업로드합니다.
  • LED의 밝기가 점차 밝아지고 어두워지는 것을 반복합니다.
KakaoTalk_20240320_221444876.mp4

결과

  • PWM을 통해 LED의 밝기를 조절하는 프로그램을 작성했습니다. 코드를 실행하면 LED가 서서히 밝아지고, 다시 서서히 어두워지는 것을 확인할 수 있습니다.

실습[3] 내용

  • 이 실습에서는 ESP32에 버튼 모듈듈을 사용하여 LED를 제어하는 예제입니다. 버튼의 상태에 따라 LED가 켜지거나 꺼집니다.

준비물

  • ESP32, ESP32 확장 실드, Led 모듈, 점퍼 케이블, 버튼 모듈듈

회로 연결

소스코드

 const int buttonPin = 33; // 버튼 핀 설정
const int ledPin = 4; // LED 핀 설정
int buttonState = 0; // 버튼 상태 읽기 위한 변수

void setup() {
  pinMode(ledPin, OUTPUT); // LED 핀을 출력으로 설정
  pinMode(buttonPin, INPUT); // 버튼 핀을 입력으로 설정
}

void loop() {
  buttonState = digitalRead(buttonPin); // 버튼의 상태를 읽어옴.

  if (buttonState == LOW) { // 버튼이 눌려져 있다면
    digitalWrite(ledPin, HIGH); // LED를 켜기
  } else { // 버튼이 눌려져 있지 않다면
    digitalWrite(ledPin, LOW); // LED를 끄기
  }
}
  • 이 코드에서는 setup() 함수에서 LED 핀을 출력으로 설정하고, 버튼 핀을 입력으로 설정합니다. 그리고 loop() 함수에서는 버튼의 상태를 읽어와서 버튼이 눌려져 있으면 LED를 켜고, 그렇지 않으면 LED를 끕니다.

실행

  • ESP32 보드를 컴퓨터에 연결합니다.
  • Arduino IDE에 소스코드를 컴파일하고 업로드합니다.
  • 버튼을 누를 때 LED가 켜지고, 버튼을 놓으면 LED가 꺼집니다.
KakaoTalk_20240320_223256143.mp4

결과

  • 프로그램을 실행하면 버튼을 누를 때 LED가 켜지고, 버튼을 놓으면 LED가 꺼지는 것을 확인할 수 있습니다

아날로그 입력

ESP32 Devkit에서 아날로그 입력으로 쓸 수 있는 핀은 아래 그림과 같습니다.
Wi-Fi 사용 중인 경우에는 ADC2 채널은 사용할 수 없습니다.

실습[4] 내용

  • 이 실습에서는 ESP32에 가변 저항 모듈을 사용하여 LED의 밝기를 제어하는 예제입니다. 가변 저항의 값을 읽어와 LED의 밝기를 조절합니다.

가변 저항

가변 저항은 회로에서 전기적 저항을 조절할 수 있는 구성 요소입니다. 회전하는 슬라이더를 통해 저항값을 변경할 수 있습니다. 이러한 특성은 신호를 조절하거나 변화시키는 데 사용됩니다.
예) LED의 밝기를 조절하거나 모터의 속도를 제어하는 데 사용할 수 있습니다.

옴의 법칙

옴의 법칙은 전기 회로에서 전압, 전류 및 저항 간의 관계를 설명하는 기본 법칙입니다. 옴의 법칙의 식은 (V=I × R) 전류(I), 전압(V), 저항(R)이 있습니다.

준비물

  • ESP32, ESP32 확장 실드, Led 모듈, 점퍼 케이블, 가변 저항 모듈

회로 연결

소스코드

 const int potPin = 34; // 갑변 저항 모듈은 GPIO 34(아날로그 ADC1_CH6)에 연결
const int ledPin = 4; // LED 모듈은 GP10 4에 연결
int potValue = 0; // 가변 저항값 저장 변수

void setup() {
  pinMode(ledPin, OUTPUT); // LED 핀을 출력으로 설정
  pinMode(potPin, INPUT); // 가변 저항 핀을 입력으로 설정
}

void loop() {
  potValue = analogRead(potPin); // 가변 저항의 값을 읽어옴
  analogWrite(ledPin, map(potValue, 0, 405, 0, 255)); // LED 밝기를 가변 저항의 값에 따라 조절
  delay(500); // 0.5초 딜레이
}
  • 이 코드에서는 setup() 함수에서 LED 핀을 출력으로 설정하고, 가변 저항 핀을 입력으로 설정합니다. 그리고 loop() 함수에서는 가변 저항의 값을 읽어와서 LED의 밝기를 조절합니다. 가변 저항의 값은 analogRead() 함수를 사용하여 읽어오며, LED의 밝기는 map() 함수를 사용하여 가변 저항의 값을 0부터 405까지의 범위에서 0부터 255까지의 PWM 값으로 변환하여 조절합니다. 0.5초마다 LED의 밝기가 업데이트됩니다.

실행

  • ESP32 보드를 컴퓨터에 연결합니다.
  • Arduino IDE에 소스코드를 컴파일하고 업로드합니다.
  • 가변 저항을 조절하면 LED의 밝기가 변화합니다.
KakaoTalk_20240320_224416074.mp4

결과

  • 프로그램을 실행하면 가변 저항을 조작하여 LED의 밝기를 변경할 수 있습니다. 높은 저항값으로 조절하면 LED의 밝기가 어둡고, 낮은 저항값으로 조절하면 LED의 밝기가 밝아지는 것을 확인할 수 있습니다.

후기

이번 실습을 통해 ESP32를 사용하여 LED의 밝기를 조절하거나 버튼을 사용하여 버튼 상태에 따라 LED가 켜지고 꺼지고 가변저항기를 이용하여 저항값을 실시간으로 변경하는 등 다양한 값을 설정하면서 다양한 센서와 외부 장치를 제어하는 방법과 제어에 필요한 프로그래밍을 배웠습니다. 이를 통해 전자공학의 기본 개념과 프로그래밍 기술을 활용하여 다양한 기능을 구현하는 경험을 했습니다. 예제를 따라 하면서 전자공학에 대한 이해도가 높아지고, 실제로 코드를 작성하고 실행시키며 외부 장치의 동작을 관찰하면서 전자공학에 대한 흥미가 더욱 높아졌습니다. 앞으로도 이러한 학습을 통해 다양한 외부 장치를 만나고 싶습니다.

⚠️ **GitHub.com Fallback** ⚠️