스마트디바이스실습 ‐ 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 32394095) 값 반환
🔸 ADC2 (Wi-Fi 사용 불가): GPIO 019, 25,27
🔸 12-bit 해상도 (0
💠 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