본문 바로가기
-----ETC-----/C++ 임베디드 시스템 프로그래밍 시리즈

[C++ 임베디드 시스템 프로그래밍 시리즈] Day 5: GPIO 제어 기초

by cogito21_cpp 2024. 8. 1.
반응형

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 핀을 제어하는 기본 함수는 digitalWritedigitalRead가 있습니다.

 

디지털 출력 (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 예고

다음 날은 "인터럽트와 폴링"에 대해 다룰 것입니다. 인터럽트와 폴링의 차이점과 각각의 사용 방법을 학습하고, 실습 예제를 통해 이해를 돕겠습니다.

반응형