왕초보의 개발 공부/아두이노 공부하기

아두이노 for 문을 이용한 LED 제어하기 , 풀다운 스위치로 LED 제어하기(교재 예시 그림 오류 있음, 수정)

봉구C 2025. 3. 24. 23:56
728x90
반응형
SMALL

예제 출처:  한번에 이해되는 아두이노 

 

 

LED 3개를 하나씩 시간차를 두고 깜박이게 하기  ( 켜짐과 꺼짐, 딜레이에 반복문을 주어 코드 응용하였습니다. ) 

 

 

아두이노 LED 깜박이기

 

아두이노에서 나오는 전압은 5V, LED가 버틸 수 있는 전압은 보통 2V 정도로 저항을 쓰는 이유는 

LED 의 고장을 막기 위함입니다. 

여기선 220Ω을 사용하였습니다. 

이유 : 220Ω 저항을 넣으면 전류가 약 13~15mA 정도로 적당히 흐르게 돼서 LED가 안전

💡 옴의 법칙(Ohm’s Law)

전류(I) = 전압(V) ÷ 저항(R)

옴에 법칩에서 전압은 저항이 받을 전압을 넣으면 됩니다. 아두이노 5V - LED 2V = 3V 로 저항이 받을 전압은 3V 가 되는거죠.

그래서 3 / 220 을 해서 전류를 구할 수 있습니다. 

 

아두이노가 출력 할 수 있는 최대 전류는 40mA 이니까 13.6mA 는 비교적 안전선입니다. 

int myLed[] = {2,4,6};
int myDelay[] = {500, 1000, 1500};
void setup() {
	for (int i = 0; i < 3; i++){
    pinMode(myLed[i],OUTPUT);
    }
}

void loop() {
	for (int i = 0; i < 3; i++){
    digitalWrite(myLed[i], HIGH);
    delay(myDelay[i]);
    digitalWrite(myLed[i],LOW);
    delay(myDelay[i]);
    }
 }

 

 

다음은 풀업, 풀다운 개념으로 스위치를 눌렀을 때 불이 켜지는 회로를 만들어 보겠습니다. 

스위치를 눌렀을 때 불이 켜지게 하려면 풀다운 스케치를 작성하여야 합니다. 

(풀다운, 풀업 개념이 궁금하시면 댓글 달아주세요. 따로 포스팅 해볼게요.)

 

교재에선 하늘색 회로 그림이 빠져 있으나 사진처럼 GND 에 연결 해주셔야 합니다. 

 

여기서 왜 버튼에는 10kΩ을 사용하고 LED 에는 220Ω 을 사용했나면

LED의 220Ω 저항 → 전류 제한용

LED는 너무 큰 전류가 흐르면 타버릴 수 있습니다.

위에서 설명 했듯이 아두이노는 5V 전압을 공급합니다.

LED는 보통 2V 정도만 필요합니다.

남은 전압(약 3V)이 저항(220Ω)에 걸려서 전류를 적절히 조절하게 됩니다.

결과적으로 LED가 안전하게 빛날 수 있는 것 입니다.

즉, 220Ω 저항은 LED를 보호하기 위한 목적.

버튼의 10kΩ 저항 → 풀다운(혹은 풀업) 저항

버튼은 전류를 제한하는 게 아니라, 신호를 안정화하는 역할을 합니다.

아두이노는 입력 핀의 상태가 LOW인지 HIGH인지 감지해야 합니다.
하지만, 버튼을 안 누를 때(회로가 열려 있을 때)는 입력 핀의 상태가 애매하게 떠버릴 수 있습니다.
이걸 플로팅 상태(floating state)라고 합니다.

그래서 버튼이 눌리지 않았을 때 확실하게 LOW(0V)가 되도록
10kΩ 저항을 GND(0V)에 연결하는 이유입니다. (풀다운 저항)

 

다시 말해 10kΩ 저항은 필요 없는 전류를 빼주면서 신호를 확실하게 만들어 주는 역할.


풀다운 저항(10kΩ)의 역할

버튼을 안 눌렀을 때:

전류가 10kΩ 저항을 통해 GND로 연결됨 → 4번 핀은 LOW (0V)

버튼을 눌렀을 때:

버튼을 누르면 5V가 직접 연결됨 → 4번 핀은 HIGH (5V)

즉, 10kΩ 저항이 없으면 버튼을 안 눌렀을 때 핀 상태가 불안정해져서 오작동할 수 있습니다.


✔️정리

저항 값역할어디에 사용?
220Ω 전류 제한 LED 보호
10kΩ 신호 안정화 버튼(풀다운/풀업 저항)

LED는 적절한 전류가 흐르게 조절하는 게 목적입니다.
버튼은 안정적인 신호 입력을 보장하는 게 목적입니다.

int buttonPin = 4;			// 푸시버튼이 연결된 번호
int ledPin = 13;			// LED가 사용하는 핀 번호
int buttonState = 0;		// 입력 핀의 상태를 저장
void setup() {
	pinMode(ledPin, OUTPUT);		// LED는 출력으로 설정
    pinMode(buttonPin, INPUT);		// 푸시 버튼으로 입력 설정
}

void loop(){		// 입력 값을 읽고 저장
	buttonState = digitalRead(buttonPin);
    // 버튼이 눌렸는지 확인, 버튼이 눌렸으면 입력 핀의 상태는 HIGH가 됨
    if(buttonState == HIGH) {
    	digitalWrite(ledPin, HIGH);  // LED 켬
    }
    else {
    	digitalWrite(ledPin, LOW);	// LED 끔
    }
}

 

 

 

처음에 교재 예시대로 했다가 LED 가 마냥 계속 켜져있길래 

코드를 잘못 쓴 줄 알았는데 전선 하나가 연결이 안되어 있었습니다. 

교재 사진에도 빠져있더라구요. 

출발점과 도착지가 있어야 하는데 GND( 그라운드 ) 바로 도착지 역할을 합니다. 

출발점 : 아두이노의 디지털 핀 (예: 2,4,6,13 등)

도착점: GND(그라운드, 접지)

버튼을 눌렀을 때:

5V → 버튼(4번 핀) → 아두이노가 읽음 → 13번 핀에서 5V 출력 → LED → GND

버튼을 떼었을 때:

5V → 버튼 차단됨 → 13번 핀 LOW → LED에 전류 안 흐름 → 꺼짐

 

아래 코드는 시리얼 모니터에 버튼이 눌리지 않을 때 0 출력, 버튼이 눌렸을 때 1을 출력 ( 풀다운일 경우, 풀업은 반대로 출력) 하는 

코드를 넣어봤습니다. (시리얼 통신)

int buttonPin = 4;			
int ledPin = 13;
int buttonState = 0;
int val = 0;

void setup() {
  	Serial.begin(9600);
	pinMode(ledPin, OUTPUT);
    pinMode(buttonPin, INPUT);
}

void loop(){
  	val=digitalRead(buttonPin);
	buttonState = digitalRead(buttonPin);
    if(buttonState == HIGH) {
    	digitalWrite(ledPin, HIGH);
    }
    else {
    	digitalWrite(ledPin, LOW);
      	    
    }
  		Serial.println(val);
}

 

 

처음 아두이노를 공부할 때 저는 기계치인대다가 재미 없어보였는데 

전류의 흐름을 조금 이해하고 나니 흥미가 생겼어요.  ( 열정은 아니고 ) 

열정이 되기까지 꾸준히 공부 해봐야겠지만 어떻게 될진 모르겠네요 ^^

( 저는 열정은 지식과 꾸준함이 있을 때 생기는 거라고 생각합니다. )

 

 

감사합니다.❤️

 

728x90
반응형
LIST