스마트디바이스실습 ‐ 3주차 - jiho0419/SmartDevice_2025-1 GitHub Wiki

1️⃣ GPIO (General-Purpose Input/Output)

*️⃣ 정의

💠 GPIO는 범용 입출력 핀(General-Purpose Input/Output) 이라는 뜻으로, 마이크로컨트롤러(MCU)나 싱글 보드 컴퓨터(SBC, 예: 라즈베리파이)에서 다양한 입출력 기능을 수행할 수 있는 핀을 말한다.
💠 특정한 기능이 정해져 있지 않으며, 프로그래밍을 통해 입력 또는 출력으로 설정하여 사용할 수 있다.

*️⃣ 특징

💠 입출력 설정 가능

🔸 각각의 GPIO 핀을 입력(Input) 또는 출력(Output) 으로 설정할 수 있음
🔸 소프트웨어를 통해 동작을 제어할 수 있음


💠 디지털 신호 처리

🔸 GPIO 핀은 0(LOW) 또는 1(HIGH) 의 디지털 신호만 처리 가능
🔸 아날로그 신호를 직접 처리하려면 ADC(Analog-to-Digital Converter)가 필요함


💠 풀업(Pull-up) 및 풀다운(Pull-down) 저항 기능

🔸 GPIO 핀을 입력으로 사용할 때, 기본적인 전압 상태를 유지하기 위해 내부적으로 풀업 저항(High 유지) 또는 풀다운 저항(Low 유지) 을 설정할 수 있음.


💠 인터럽트(Interrupt) 기능 지원

🔸 특정 이벤트(예: 버튼 클릭, 센서 감지)가 발생했을 때, CPU가 즉시 반응할 수 있도록 인터럽트를 설정할 수 있음


💠 PWM(펄스 폭 변조, Pulse Width Modulation) 지원

🔸 일부 GPIO 핀은 PWM을 지원하여 아날로그 출력처럼 동작 가능
🔸 예: LED 밝기 조절, 모터 속도 조절 등에 활용


💠 전압 레벨 차이 주의 필요

🔸 마이크로컨트롤러나 SBC에 따라 GPIO 전압이 다를 수 있음.
🔸 예: 라즈베리파이 → 3.3V
🔸 예: 아두이노(UNO) → 5V
🔸 전압이 맞지 않으면 손상될 수 있으므로 레벨 시프터(Level Shifter) 사용 필요

2️⃣ ESP32 GPIO

*️⃣ 정의

💠 ESP32는 Espressif Systems에서 개발한 강력한 Wi-Fi 및 Bluetooth 지원 마이크로컨트롤러로, 다양한 GPIO 핀을 제공한다.
💠 GPIO 핀은 입력(Input), 출력(Output), PWM, ADC, DAC, I2C, SPI, UART 등의 기능을 수행할 수 있습니다.

*️⃣ ESP32 GPIO 핀 개수 및 분포

💠 ESP32의 GPIO 핀은 총 34개가 있으며, 다음과 같이 구성됨

🔸 일반적인 GPIO 핀 : 0~39번 (단, 일부 핀은 특별한 기능이 있음)

🔸 입력 전용 핀 : GPIO 34~39 (출력 불가)

🔸 터치 센서 지원 핀 : GPIO 0, 2, 4, 12, 13, 14, 15, 27, 32, 33

🔸 ADC 지원 핀 : GPIO 019, 2527, 32~39

🔸 DAC 지원 핀 : GPIO 25, 26

🔸 PWM 지원 핀 : 모든 출력이 가능한 GPIO

🔸 I2C 핀 (기본 설정) : GPIO 21(SDA), GPIO 22(SCL)

🔸 SPI 핀 (기본 설정) : GPIO 23(MOSI), GPIO 19(MISO), GPIO 18(SCK), GPIO 5(SS)

🔸 UART 핀 (기본 설정) : GPIO 1(TX), GPIO 3(RX)

*️⃣ 주요 특징 및 제한 사항

💠 입출력 가능 여부

🔸 GPIO 34~39: 입력 전용 핀 (출력 불가)
🔸 나머지 GPIO 핀: 입출력 가능


💠 팅 시 주의해야 할 GPIO 핀

🔸 ESP32는 부팅 과정에서 특정 GPIO 핀을 확인하며, 일부 핀은 부팅 과정에서 특정 상태를 가져야 정상적으로 동작

GPIO 핀 부팅 시 역할 주의할 점
GPIO 0 Flash 모드 선택 부팅 시 HIGH(1) 상태여야 함. LOW(0)면 펌웨어 업로드 모드 진입
GPIO 2 부팅 메시지 출력 LOW(0) 상태면 일부 보드에서 부팅 실패 가능
GPIO 12 Boot 모드 선택 HIGH(1)이면 SPI Flash가 작동하지 않을 수 있음
GPIO 15 부팅 과정에서 필요 LOW(0) 상태여야 정상 부팅 가능

*️⃣ 주요 기능별 GPIO 핀

💠 PWM (Pulse Width Modulation)

🔸 모든 출력 가능한 GPIO 핀에서 PWM 신호 생성 가능
🔸 LED 밝기 조절, 모터 속도 조절 등에 활용


💠 ADC (Analog-to-Digital Converter, 아날로그 입력)

🔸 ADC1 (Wi-Fi 사용 가능): GPIO 3239
🔸 ADC2 (Wi-Fi 사용 불가): GPIO 019, 25,27
🔸 12-bit 해상도 (0
4095) 값 반환


💠 DAC (Digital-to-Analog Converter, 아날로그 출력)

🔸 GPIO 25, GPIO 26
🔸 8-bit 해상도로 아날로그 출력 가능 (0~255)


💠 I2C (Inter-Integrated Circuit, 기본 설정)

🔸 GPIO 25, GPIO 26
🔸 8-bit 해상도로 아날로그 출력 가능 (0~255)


💠 I2C (Inter-Integrated Circuit, 기본 설정)

🔸 SDA (데이터): GPIO 21
🔸 SCL (클럭): GPIO 22
🔸 소프트웨어로 다른 GPIO 핀으로 변경 가능


💠 SPI (Serial Peripheral Interface, 기본 설정)

🔸 MOSI (데이터 출력): GPIO 23

🔸 MISO (데이터 입력): GPIO 19

🔸 SCK (클럭 신호): GPIO 18

🔸 SS/CS (슬레이브 선택): GPIO 5


💠 UART (Universal Asynchronous Receiver-Transmitter)

🔸 기본적으로 3개(UART0, UART1, UART2) 사용 가능

🔸 UART0: TX (GPIO 1), RX (GPIO 3) - USB 시리얼 통신

🔸 UART1: TX (GPIO 10), RX (GPIO 9) - 기본적으로 플래시 메모리와 연결됨

🔸 UART2: TX (GPIO 17), RX (GPIO 16)


💠 터치 센서 지원 핀

🔸 GPIO 0, 2, 4, 12, 13, 14, 15, 27, 32, 33

🔸 정전식 터치 감지 가능 → 버튼 없이 손 터치로 입력 가능

3️⃣ ESP32 GPIO 실습

*️⃣ 디지털 출력 (LED 제어)

💠 ESP32의 디지털 출력을 이용하여 LED를 켜고 끄는 실습을 진행

💠 회로 연결

🔸 LED 모듈
🔸 S(신호): D4
🔸 VCC(전원): 3.3V
🔸 GND(접지): GND


💠 코드

const int ledPin = 4; // D4 핀에 LED 연결

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

void loop() {
  digitalWrite(ledPin, HIGH); // LED ON
  delay(1000);
  digitalWrite(ledPin, LOW);  // LED OFF
  delay(1000);
}

💠 실행 결과

https://github.com/user-attachments/assets/65b955c9-5c00-4346-93dc-3911b342512d

*️⃣ 디지털 입력 (버튼 제어)

💠 버튼 입력을 통해 LED를 제어하는 실습을 진행
💠 led가 켜진 상태에서 버튼 모듈을 누를 때마다 꺼지는 코드 작성 후 실습 진행

💠 회로 연결

🔸 LED 모듈
🔸 S(신호): D4
🔸 VCC(전원): 3.3V
🔸 GND(접지): GND

🔹 버튼 모듈
🔹 S: D33
🔹 VCC: 3.3V
🔹 GND: GND


💠 코드

const int ledPin = 4;
const int buttonPin = 33;
int buttonState = 0;

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

void loop() {
  buttonState = digitalRead(buttonPin);
  digitalWrite(ledPin, buttonState);
}

💠 실행 결과

https://github.com/user-attachments/assets/935f7002-73f9-4e39-94d1-4f9e0ab2cd88

*️⃣ 디지털 입력 (버튼 제어) 응용

💠 버튼 입력을 통해 LED를 제어하는 실습을 진행
💠 led가 꺼진 상태에서 버튼 모듈을 누를 때마다 켜지는 코드 작성 후 실습 진행

💠 회로 연결

🔸 LED 모듈
🔸 S(신호): D4
🔸 VCC(전원): 3.3V
🔸 GND(접지): GND

🔹 버튼 모듈
🔹 S: D33
🔹 VCC: 3.3V
🔹 GND: GND


💠 코드

const int ledPin = 4;
const int buttonPin = 33;
int buttonState = 0;

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT_PULLUP);  // 내부 풀업 저항 활성화
}

void loop() {
  buttonState = digitalRead(buttonPin);
  digitalWrite(ledPin, !buttonState);  // 버튼 상태를 반전시켜서 출력
}


💠 실행 결과

https://github.com/user-attachments/assets/0c09f276-5018-4c7b-8fc1-4abaf39bf1a3