GPIO 제어 기초
임베디드 시스템에서 GPIO(General Purpose Input/Output)는 매우 중요한 역할을 합니다. GPIO 핀을 통해 다양한 센서와 액추에이터를 제어할 수 있습니다. 오늘은 GPIO 핀의 다양한 설정과 제어 방법을 학습하겠습니다.
1. GPIO 핀 모드 설정
GPIO 핀은 입력(Input), 출력(Output), 풀업(Pull-up), 풀다운(Pull-down) 모드로 설정할 수 있습니다.
입력 모드 (Input Mode)
입력 모드는 외부 신호를 읽는 데 사용됩니다. 버튼이나 센서의 상태를 읽을 때 사용됩니다.
pinMode(pin, INPUT); // 핀을 입력 모드로 설정
출력 모드 (Output Mode)
출력 모드는 외부 장치로 신호를 보내는 데 사용됩니다. LED나 모터를 제어할 때 사용됩니다.
pinMode(pin, OUTPUT); // 핀을 출력 모드로 설정
풀업 모드 (Pull-up Mode)
풀업 모드는 내부 풀업 저항을 활성화하여 입력 핀이 풀업된 상태를 유지하도록 합니다. 버튼을 사용할 때 노이즈를 줄이기 위해 사용됩니다.
pinMode(pin, INPUT_PULLUP); // 핀을 입력 풀업 모드로 설정
풀다운 모드 (Pull-down Mode)
풀다운 모드는 내부 풀다운 저항을 활성화하여 입력 핀이 풀다운된 상태를 유지하도록 합니다. 일부 마이크로컨트롤러에서는 지원되지 않을 수 있습니다.
pinMode(pin, INPUT_PULLDOWN); // 핀을 입력 풀다운 모드로 설정
2. GPIO 제어 함수
GPIO 핀을 제어하는 기본 함수는 digitalWrite
와 digitalRead
가 있습니다.
디지털 출력 (Digital Output)
디지털 출력을 사용하여 핀의 상태를 HIGH(1) 또는 LOW(0)로 설정할 수 있습니다.
digitalWrite(pin, HIGH); // 핀을 HIGH 상태로 설정 (5V)
digitalWrite(pin, LOW); // 핀을 LOW 상태로 설정 (0V)
디지털 입력 (Digital Input)
디지털 입력을 사용하여 핀의 상태를 읽을 수 있습니다.
int state = digitalRead(pin); // 핀의 상태를 읽음
3. 예제 프로젝트: LED와 버튼 제어
LED와 버튼을 사용하여 GPIO 제어를 연습해보겠습니다.
예제 1: 버튼을 눌러 LED 켜기
버튼을 눌렀을 때 LED가 켜지고, 버튼을 떼면 LED가 꺼지는 예제입니다.
// 핀 번호 정의
const int buttonPin = 2; // 버튼 핀
const int ledPin = 13; // 내장 LED 핀
// 변수 정의
int buttonState = 0; // 버튼 상태
// 초기 설정 함수
void setup() {
// 버튼 핀을 입력 풀업 모드로 설정
pinMode(buttonPin, INPUT_PULLUP);
// LED 핀을 출력 모드로 설정
pinMode(ledPin, OUTPUT);
}
// 메인 루프 함수
void loop() {
// 버튼 핀의 상태를 읽음
buttonState = digitalRead(buttonPin);
// 버튼이 눌러졌는지 확인 (풀업 모드에서 LOW는 버튼이 눌린 상태)
if (buttonState == LOW) {
// 버튼이 눌러졌다면 LED를 켬
digitalWrite(ledPin, HIGH);
} else {
// 버튼이 눌러지지 않았다면 LED를 끔
digitalWrite(ledPin, LOW);
}
}
예제 2: 토글 스위치로 LED 제어
버튼을 눌렀을 때 LED가 켜지고, 다시 누르면 LED가 꺼지는 예제입니다.
// 핀 번호 정의
const int buttonPin = 2; // 버튼 핀
const int ledPin = 13; // 내장 LED 핀
// 변수 정의
int buttonState = 0; // 현재 버튼 상태
int lastButtonState = 0; // 이전 버튼 상태
bool ledState = false; // LED 상태
// 초기 설정 함수
void setup() {
// 버튼 핀을 입력 풀업 모드로 설정
pinMode(buttonPin, INPUT_PULLUP);
// LED 핀을 출력 모드로 설정
pinMode(ledPin, OUTPUT);
}
// 메인 루프 함수
void loop() {
// 버튼 핀의 상태를 읽음
buttonState = digitalRead(buttonPin);
// 버튼 상태가 변경되었는지 확인
if (buttonState != lastButtonState) {
// 버튼이 눌린 상태인지 확인 (풀업 모드에서 LOW는 버튼이 눌린 상태)
if (buttonState == LOW) {
// LED 상태를 토글
ledState = !ledState;
digitalWrite(ledPin, ledState ? HIGH : LOW);
}
// 버튼 상태 업데이트
lastButtonState = buttonState;
}
}
마무리
오늘은 GPIO 제어의 기초를 학습했습니다. GPIO 핀의 모드 설정과 제어 함수 사용법을 익히고, LED와 버튼을 사용하여 GPIO 제어 예제를 구현했습니다. 다음 날에는 인터럽트와 폴링에 대해 더 깊이 알아보겠습니다.
질문이나 추가적인 피드백이 있으면 언제든지 댓글로 남겨 주세요.
Day 6 예고
다음 날은 "인터럽트와 폴링"에 대해 다룰 것입니다. 인터럽트와 폴링의 차이점과 각각의 사용 방법을 학습하고, 실습 예제를 통해 이해를 돕겠습니다.
'-----ETC----- > C++ 임베디드 시스템 프로그래밍 시리즈' 카테고리의 다른 글
[C++ 임베디드 시스템 프로그래밍 시리즈] Day 7: 타이머와 카운터 사용법 (0) | 2024.08.01 |
---|---|
[C++ 임베디드 시스템 프로그래밍 시리즈] Day 4: 기본 입출력 프로그래밍 (0) | 2024.08.01 |
[C++ 임베디드 시스템 프로그래밍 시리즈] Day 3: 개발 환경 설정 (툴체인, IDE) (0) | 2024.08.01 |
[C++ 임베디드 시스템 프로그래밍 시리즈] Day 2: 임베디드 시스템에서의 C++ 사용 사례 (0) | 2024.08.01 |
[C++ 임베디드 시스템 프로그래밍 시리즈] Day 1: 임베디드 시스템의 개요와 중요성 (0) | 2024.08.01 |