top of page
curyustory

Arduino 002 INPUT


아두이노는 디지털 신호만을 인식합니다. 전기적 신호가 있다 없다. 그 두가지 입니다. 자연의 신호는 변화의 단계가 있으면 전구나 모터만 하더라도 밝기, 속도등의 변화를 제어하거나 파악해야 합니다. 일정한 5V의 전압을 가지고 있는 아두이노는 어떤 원리로 그런 단계들을 익식하거나 제어 할 수 있을까요. 전구를 아주빠르게 켰다 껐다 를 인간이 인지 하지 못할 정도로 반복 한다면 빛의 세기가 줄어든것 처럼 보입니다. 이러한 간격 (Pulse Width) 를 조정(Modularion)함으로 단계적 빛의 세기를 조정 할 수 있습니다.

아두이노는 하드웨어적으로 아날로그 인풋을 받을 수 있게 설계되어 있습니다. ~11~10~9 A0 A1등으로 표기 되어 있습니다.

++아날로그와 디지털 자료메모++

아날로그 (Analogue)는 외부적인 원인에 의하여 연속적으로 변하는 물리량 을 나타내는 것으로, 온도계의 수은주나 시계의 바늘 위치, 빛이나 소리 등을 들 수 있습니다. 즉, 아날로그는 특정 상태에 대하여 무한한 실수 값을 가질 수 있지만, 이와 반대로 디지털 (Digital)은 불연속적인 제한된 값 만을 가집 니다.

++펄스폭변조(PWM) 자료메모++

Pulse Width Modulation 디지털 신호로 아날로그 회로를 제어하는 방법입니다. 아날로그 신호는 시간에 따라 연속적인 값의 변화를 보이 는 반면, 디저털 신호는 제한된 신호(0 또는 1)의 값만을 갖습니다. 5V의 신호를 출력한다고 가정한다면, 아날 로그는 정확히 5V가 아니라 시간에 따라 0~5V 범위 내 임의의 실수 값을 가지며, 디지털의 경우 0 (off) 또는

5V (on) 값 만을 가집니다. 펄스폭변조 (PWM)방식을 사용하여 아날로그 신호와 같이 다양한 값을 표현해 줄 수 있습니다. 일정 주기로 On과 Off를 반복하여 사각파를 만들고, On으로 설정된 시간 의 비율 (duty cycle)을 조정함으로써 출력 전압에 변화를 주는 것입니다. 예로, 0.05 초 (50ms) 동안 5V 전원을 공급하고 다음 0.05초 (50ms) 동안, 전원을 공급하지 않는다면, 0.1초 (100ms)동안 50%는 5V, 나머지 50%는 0V로, 아래의 가운데 그 림 같은 형태가 되며 1초 동안 반복을 하면 10회의 변화가 생기게 됩니다. 즉 1초 동 안에 5V의 절반인 2.5V가 공급되는 것과 같습니다. 만일 전구를 연결했다면, 2.5V 전원에 연결된 것과 같이 불이 켜질 것입니다.

전기의 이해 참조 : http://kocoafab.cc/tutorial/view/348

1. 옴의 법칙 Georg Ohm이 발표한 이론으로 전압이 커질수록 전류의 세기는 세지고, 일정한 전압일 때 전기 저항이 클수록 전류가 약해진다는 법칙입니다.

전압 (V = Voltage) 전류가 흐를때의 압력으로 단위는 V (볼트) 입니다. 전류 (I = Current) 전하가 이동하는 현상으로 단위는 A (암페어) 입니다. 저항 (R = Resistance) 전기의 흐름을 방해하는 성질으로, 단위는 Ω (옴) 입니다.

2. 저항 저항은 전류의 흐름을 방해하는 성질로 저항의 크기는 물질의 종류와 형태에 따라 달라집니다. 저항의 크기는 띠의 개수와 색깔로 구분을합니다. 본 학습가이드에서 가장 많이 사용되는 330Ω 저항의 띠는 주황색-주황색-갈색-금색으로 칠해져 있으며, 10KΩ 저항의 띠는 갈색-검정색-주황 색-금색으로 칠해져 있습니다.

++실습_예제 #3 : LED를 희미하게 켜기

analogWrite를 이용하여 빛의 밝기를 조정하기

CODE

void setup() //setUp() 메소드는 스케치가 시작될 때 딱 한 번만 실행

{

pinMode(11, OUTPUT); //11번 핀을 출력으로 설정

pinMode(10, OUTPUT); //10번 핀을 출력으로 설정

}

//loop() 메소드는 반복해서 실행됩니다.

void loop()

{

analogWrite(11, 20); // 11번 핀의 전압을 0(0V)~255(5V)중 50에 해당하는 전압으로 설정

analogWrite(10, 20); // 10번 핀의 전압을 0(0V)~255(5V)중 50에 해당하는 전압으로 설정

delay(1000); // 1초 대기

analogWrite(11, 255); // 11번 핀의 전압을 0(0V)~255(5V)중 200에 해당하는 전압으로 설정

analogWrite(10, 255); // 10번 핀의 전압을 0(0V)~255(5V)중 255에 해당하는 전압으로 설정

delay(1000); // 1초 대기

}

++실습응용 For문을 이용하여 빛의 단계를 30시간차 별로 1단계씩 255단계를 조정하여 서서히 점멸하도록 해보았습니다++

CODE

\void setup() //setUp() 메소드는 스케치가 시작될 때 딱 한 번만 실행 { pinMode(11, OUTPUT); //11번 핀을 출력으로 설정 pinMode(10, OUTPUT); //10번 핀을 출력으로 설정 } //loop() 메소드는 반복해서 실행됩니다. void loop() { for(int i=0; i<255; i++){ analogWrite(11, i); analogWrite(10, i); delay(30); } for(int i=255; i>=0; i--){ analogWrite(11, i); analogWrite(10, i); delay(30); } }

++실습_예제 #5 : 푸쉬버튼 사용하기 (디지털 입력) PushButton

CODE

// push button 연결하기. 누르면 LED가 켜지도록 만들어 봅시다. int button1Pin = 2; //푸시버튼과 연결된 핀 번호(2)를 저장할 변수 선언 int ledPin = 13; //LED와 연결된 핀 번호(13)를 저장할 변수 선언 void setup(){ pinMode(button1Pin, INPUT); //2번 핀을 입력용으로 설정 pinMode(ledPin, OUTPUT); //13번 핀을 출력용으로 설정 } void loop(){ int button1State = digitalRead(button1Pin); //버튼이 눌렸는 지 아닌지를 읽어와서 앞에 선언한 변수에 저장 if(button1State == LOW) { //눌렸다면 digitalWrite (ledPin, HIGH); //LED를 ON } else { //눌리지 않았다면 digitalWrite(ledPin, LOW); //LED를 OFF } }

Pull up & Pull down 푸시 버튼 한 쪽은 GND와 연결 되어 있습니다. 푸시 버튼을 누르면 GND와 연결되게 됩니다. digitalRead로 값을 읽으면 LOW로 읽히게 됩니다. 즉, 입력핀에 0V 값을 입력 한 것입니다. 다른 한 쪽은 디지털 핀과 연결이 되어있습니다. 하지만 누르지 않을 때 무조건 HIGH로 읽히는 것은 아닙니다. 이 경우 5V or 0V 둘 다 입력 되지 않았기 때문에 칩 자체에서 어떤 값인지 읽어 올 수 없습니다. 이렇게 핀에 어떤 값이 입력이 됬는 지 모르는 경우를 플로팅(floating)이라고 합니다. 플로팅 상태가 되면 소자의 특성과 주위 환경에 따라 High, Low 상태가 수시로 변할 수 있고 여러 노이즈를 유 발하여 오작동을 일으킬 수 있습니다. 이런 경우 풀업 저항(pullup resister)를 사용합니다. 2번 핀과 푸쉬 버튼 사이 연결된 10KΩ 저항이 바로 풀업저항입니다. 이 사이에 저항을 연결 하므로써 항상 5V 전압이 걸려있는 HIGH 상태가 됩니다. 핀을 높은 저항인 상태로 매달아 둔다는 뜻으로 풀업 저항이라고 합니다. 정리하면, 누르면 LOW상태, 평상시는 HIGH 상태입니다.

실습_예제 #7 : 가변저항으로 LED 밝기 조절하기 (아날로그 입력)

CODE

void setup() { // 3번 지정 pinMode(3, OUTPUT); }

void loop() { // A0의 값 0~1024를 0~255값으로 변환하여 출력 analogWrite (3, analogRead(A0)/4); }

실습 예제 #8 : 포토레지스터로 LED 밝기 조절하기

CODE

int sensorPin = 0; int ledPin = 3; int lightLevel; void setup(){ pinMode(ledPin, OUTPUT); //LED 핀을 출력용으로 설정 } void loop() { lightLevel = analogRead(sensorPin); //아날로그 값을 읽음 manualTune(); //LED 밝기 조절 함수 analogWrite(ledPin, lightLevel); //lighLevel 만큼 LED가 밝혀짐 } void manualTune(){ lightLevel = map(lightLevel, 500, 1023, 0, 255); //500 ~ 1023범위에 있는 lightLevel를 0~255범위로 바꾼다. lightLevel = constrain(lightLevel, 0, 255); //lightlevel이 0보다 작으면 0을 출력, 255보다 크면 255를 출력, 0~255사이의 숫자면 그대로 출력 }

조회수 66회댓글 0개

최근 게시물

전체 보기
bottom of page