[WinForms / 아두이노] (아날로그 입력) 가변 저항으로 LED 제어

00·2025년 2월 15일

프로젝트

목록 보기
11/14

개요

가변저항(Potentiometer)

  • 가변저항은 값을 바꿀 수 있는 저항이다. 노브(knob)를 돌려 사용자가 값을 변경할 수 있다.
  • 오디오의 볼륨이나 LED 조명의 밝기를 제어하는 등 아날로그값을 조절할 때 필요하다.
  • 단자가 세 개 있다. 양 끝의 단자는 전원(5V)과 접지(GND)에 연결하고, 가운데 단자는 와이퍼(Wiper)라고 하는 가변저항의 변경된 저항 값을 읽을 수 있는 특수한 단자이다.
  • 고정저항과 가변저항은 모두 극성이 없는 전자 부품이므로 전원과 접지의 연결 단자를 서로 바꿔서 연결하더라도 정상적으로 작동한다. 단, 가변저항은 전원과 접지의 방향을 변경하면 가변저항의 값의 범위(와이퍼에서 측정되는 값의 범위)가 바뀌는 점에 주의해야 한다.
  • 예를 들어, 가변저항의 단자 세 개 중 좌측 단자를 전원에 연결하고, 우측 단자를 그라운드로 연결했을 때, 가운데 2번 핀을 통해 최대 값 1,023의 값을 읽을 수 있으며, 노브를 우측으로 돌리면 최소 값 0을 읽을 수 있다. 반대로 좌측 단자에 그라운드를 연결하고 우측 단자에 전원을 연결하면 최소 값 0을 읽으며, 노브를 우측으로 돌리면 최대 값 1,023을 읽을 수 있다.

아날로그 신호의 입력 범위
아날로그 입력 신호를 0에서 1,023까지의 값으로 표현할 수 있다. 즉, 가변저항의 가운데 2번 단자를 아두이노의 아날로그 입력 핀에 연결해 입력받는 값의 범위는 0 ~ 1,023이다. 아날로그를 디지털로 변환하기 위한 ADC(Analog Digital Converter)가 10비트(bit)를 지원하기 때문이다. 10비트(bit)가 표현할 수 있는 경우의 수가 2의 10승, 즉 1,024이므로 0부터 1,023까지인 것이다.

아날로그 입력을 통해 가변저항의 값을 읽거나 조도센서, 온도센서, 초음파센서의 값을 측정하는 방법

가변 저항값 측정

가변저항값을 측정하고 그래프로 확인해보았다. 노브를 움직이면 직렬 모니터에 표시되는 수치가 변경된다. 또한 아날로그 입력값의 범위가 0~1,023 사이에서 변경된다.

// c# code
//
void setup()
{
  Serial.begin(9600); // 시리얼 통신 초기화
  				      // 1초에 9600비트로 데이터 전송
}


// loop() 함수 : 
// 컴퓨터에서 실행 중인 C# 프로그램에서 전달된 명령에 따라 LED를 켜고 끄는 코드
void loop()
{
  int readValue = analogRead(A0); // 아날로그 입력 핀 A0의 신호값을 읽어 변수에 저장
  Serial.println(readValue); // 변수값을 직렬 모니터에 출력
}

가변 저항으로 LED 켜고 끄기

아두이노 회로

스케치 코드

// c# code
//
void setup()
{
  Serial.begin(9600); // 시리얼 통신 초기화
  				      // 1초에 9600비트로 데이터 전송
  
  pinMode(13, OUTPUT); // 디지털 핀 13번을 출력 모드로 설정
}


// loop() 함수 : 
// 컴퓨터에서 실행 중인 C# 프로그램에서 전달된 명령에 따라 LED를 켜고 끄는 코드
void loop()
{
  int readValue = analogRead(A0); // 아날로그 입력 핀 A0의 신호값을 읽어 변수에 저장
  Serial.println(readValue); // 변수값을 직렬 모니터에 출력
  
  
  // 가변저항으로부터 읽은 값에 따라 LED를 제어
  if(readValue < 500) // readValue < 500이면
    digitalWrite(13, LOW); // digitalWrite() 함수로 13번 핀에 LOW 신호를 보내 LED를 끄고,
  else // readValue < 500이 아니면
    digitalWrite(13< HIGH);  // digitalWrite() 함수로 13번 핀에 HIGH 신호를 보내 LED를 켠다.
}
  • 아두이노 회로
    (1) 가변저항의 노브를 돌려 아날로그 입력값이 500보다 작으면 LED의 불빛이 꺼지게 했다.

    (2) 가변저항의 노브를 돌려 아날로그 입력값이 500보다 크거나 같으면 LED의 불빛이 켜지게 했다.

실행


가변저항으로 LED 깜빡임 속도 조절

아두이노 회로

스케치 코드

// c# code
//
void setup()
{
  Serial.begin(9600); // 시리얼 통신 초기화
  				      // 1초에 9600비트로 데이터 전송
  
  pinMode(13, OUTPUT); // 디지털 핀 13번을 출력 모드로 설정
}


// loop() 함수 : 
// 컴퓨터에서 실행 중인 C# 프로그램에서 전달된 명령에 따라 LED를 켜고 끄는 코드
void loop()
{
  int readValue = analogRead(A0); // 아날로그 입력 핀 A0의 신호값을 읽어 변수에 저장
  Serial.println(readValue); // 변수값을 직렬 모니터에 출력
  
  
  
  
  // 가변저항으로부터 읽은 값에 따라 LED를 제어
  digitalWrite(13, LOW); // digitalWrite() 함수로 13번 핀에 LOW 신호를 보내 LED를 끄고,
  delay(readValue); // readValue값만큼 코드 실행을 기다린다.
  digitalWrite(13, HIGH);  // digitalWrite() 함수로 13번 핀에 HIGH 신호를 보내 LED를 켠다.
  delay(readValue); // readValue값만큼 코드 실행을 기다린다.
}
  • delay() 함수의 시간 단위가 ms고, 아날로그 입력 범위는 0~1,023이다. 따라서 만들 수 있는 지연시간 범위는 0부터 최대 1,023ms이므로 LED 깜빡이는 속도를 최대로 지연해도 1초 남짓이다. 지연 시간의 범위를 늘리기 위해 위 코드를 아래와 같이 수정했다.
// c# code
//
void setup()
{
  Serial.begin(9600); // 시리얼 통신 초기화
  				      // 1초에 9600비트로 데이터 전송
  
  pinMode(13, OUTPUT); // 디지털 핀 13번을 출력 모드로 설정
}


// loop() 함수 : 
// 컴퓨터에서 실행 중인 C# 프로그램에서 전달된 명령에 따라 LED를 켜고 끄는 코드
void loop()
{
  int input = analogRead(A0); // 아날로그 입력 핀 A0의 신호값을 읽어 변수에 저장
  int output = input/1023*2000; // 출력값에 변환식 적용
  
  Serial.print(input); // 변수값을 직렬 모니터에 출력
  Serial.print('\t'); // 공백 출력
  Serial.println(output); // 변수값을 직렬 모니터에 출력
  
  
  
  
  // 가변저항으로부터 읽은 값에 따라 LED를 제어
  digitalWrite(13, LOW); // digitalWrite() 함수로 13번 핀에 LOW 신호를 보내 LED를 끄고,
  delay(output); // 변수로 지연 시간을 제어 
  				 // output값만큼 코드 실행을 기다린다.
  digitalWrite(13, HIGH);  // digitalWrite() 함수로 13번 핀에 HIGH 신호를 보내 LED를 켠다.
  delay(output); // output값만큼 코드 실행을 기다린다.
}
  • int output = input/1023*2000;: 출력값에 변환식을 적용하여 지연 시간의 범위를 0ms ~ 2,000ms로 변경하였다.

실행

  • 입력값이 0~1,022까지는 출력값이 0이고 입력값이 1,023이어야 출력값이 2,000으로 나타난다. 이는 데이터형 변환을 고려하지 않았기 때문에 나타난 문제이다. 즉, input을 1,023으로 나누면 0.xxx와 같이 소수로 나타나는데 이 소수를 float이 아닌 int형 변수에 담으려고 해서 소수점 아래가 다 잘리고 0만 담기는 것이다.
  • 이러한 문제를 해결하기 위해 강제 형 변환을 하도록 아래와 같이 스케치 코드를 수정했다.
int output = (float)input/1023*2000;

0개의 댓글