ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 포텐시오미터의 값을 읽어 LED밝기 조절하기
    Arduino/LED 제어 하기 2020. 10. 18. 22:36

    부품의 설명

    신호는 아두이노의 A0핀으로 읽는다.

    저항의 크기를 가변으로 조절하는 장치이며, 가변저항은 극성이 없으므로 VCC와 GND가 바뀌어도 된다.입출력 형태는 아두이노의 값을 입력한다.

     

    포텐시오미터의 특징은 다음과 같다.

    1. 저항을 변경하면 전압이 변함

    2. 출력된 전압 값은 아두이노에 아날로그 형태로 입력 

        (아두이노는 저항의 값에 따라 입력값을 0~1023의 값의 형태로 변환하여 입력)

     

    포텐시오미터와 아두이노를 다음과 같이 연결하자.

    LED에는 모두 220옴의 저향을 달았다. 입력핀은 A0를 쓸 것이다.

     

     

    포텐시오미터의 값을 읽어 한 개의 LED의 밝기를 조절하는 예제. 

    아두이노를 다음과 같이 연결해보자.

    LED의 핀은 3번핀으로 쓸 것이다.

    입력핀은 A0를 쓸 것이다.

     

    소스 코드

    #define   LED_PIN   3   //  LED를 연결한 핀 번호로 아날로그 핀이다.
    
    //  포텐셔미터의 값을 읽어 LED의 밝기를 조절하는 예제. 
    //  LED의 값은 0~255의 값을 갖는다.
    void setup() {
      // put your setup code here, to run once:
      Serial.begin(9600);
      
      pinMode(LED_PIN,OUTPUT);  //  출력핀으로 설정
    }
    
    void loop() {
      // put your main code here, to run repeatedly:
      int value = ReadPotentiometer();
    
      //  Serial.println(value);
    
      int led = (float)value / 1023 * 255;  //  값 변환
      
      WriteLED(led);    //  변환한 값으로 LED 밝기 조절 
    
      Serial.println(led);
      
      delay(100);
    }
    
    //  AO핀의 입력값을 읽어 리턴하는 함수
    int ReadPotentiometer()
    {
      return analogRead(A0);  //  A0핀의 입력값을 리턴
    }
    
    //  변환한 값으로 LED 밝기 조절하는 함수 
    void WriteLED(int led)
    {
      analogWrite(LED_PIN,led);
    }

     

     

    포텐셔미터의 값을 읽어 5개의 LED의 밝기를 조절하는 예제. 

    먼저, 다음과 같이 연결한다.

    이 예제에서는 5개의 LED를 단순히 켜는 예제가 아닌, 포텐셔미터를 돌릴 때마다

    LED가 켜지는 패턴들이 달라진다.

    다시 말하면, 포텐셔미터는 0~1023의 값을 갖는다고 하였다.

    즉, 예를 들어

    Range[0 ~ 300] 이면, LED가 모두 켜지고 꺼지는 패턴

    Range[301 ~ 600] 이면, LED가 앞에서부터 하나씩 켜지면서 꺼지는 패턴

    Range[601 ~ 900] 이면, LED가 뒤에서부터 하나씩 켜지면서 꺼지는 패턴

    이와 같은 방법으로 만들 것이다.

    부득이하게, 패턴 2개는 만들지 못했다.

    소스 코드

    //  포텐셔미터의 값을 읽어 5개의 LED의 밝기를 조절하는 예제
    //  여기서 LED의 개수만큼 LED를 켜는 유형을 갖는다고 하자.
    //  포텐셔미터의 값의 범위에 따라 이 LED를 켜는 유형을 정의하자.
    //  포텐셔미터의 값의 범위는 0~1023이므로, 5범위로 나눠서 이 값의 영역에 따라
    //  LED를 켜는 패턴을 만들면 된다.
    //  LED의 값은 0~255의 값을 갖는다.
    //  LED에 저항은 220옴을 연결한다.
    
    #define   LED_MAX     5   //  LED핀의 개수
    
    #define   LED_PIN_3   3   //  LED를 연결한 핀 번호로 아날로그 핀이다.
    #define   LED_PIN_4   4 
    #define   LED_PIN_5   5
    #define   LED_PIN_6   6
    #define   LED_PIN_7   7   
    
    void setup() {
      // put your setup code here, to run once:
      Serial.begin(9600); //  시리얼 통신 초기 세팅.
    
      //  LED 출력핀 초기화
      for (int i = LED_PIN_3; i < LED_MAX + LED_PIN_3; i++)
      {
          pinMode(i,OUTPUT);    //  출력핀으로 설정
          digitalWrite(i,LOW);  
      }
    }
    
    void loop() {
      // put your main code here, to run repeatedly:
      int value = ReadPotentiometer();
    
      int oneRange = 1023 / LED_MAX;        //  포텐셔미터의 값의 5구간으로 나눈 영역
    
      int currentRange = value / oneRange;  //  0~5사이의 값을 갖는다.
                                            //  이 값이 곧, LED가 켜지는 패턴의 유형
      Serial.println(currentRange);
    
      //  모든 LED를 전부 출력하는 패턴
      if (currentRange == 0)
      {
        for (int i = LED_PIN_3; i < LED_PIN_3 + LED_MAX; i++)
        {
          WriteLED(i,HIGH);
        }
      }
      //  3번 LED에서부터 차례로 하나 켜고 끄는 함수 
      else if (currentRange == 1)
      {
        for (int i = LED_PIN_3; i < LED_PIN_3 + LED_MAX; i++)
        {
          WriteLED(i,HIGH);
          delay(100);
          WriteLED(i,LOW);
          delay(100);
        }
      }
      //  맨 마지막 7번 LED에서부터 3번 LED 순으로 차례로 하나 켜고 끄는 함수 
      else if (currentRange == 2)
      {
        for (int i = LED_PIN_3 + LED_MAX - 1; i >= LED_PIN_3; i--)
        {
          WriteLED(i,HIGH);
          delay(100);
          WriteLED(i,LOW);
          delay(100);
        }
      }
      //  홀수번 핀과 짝수핀으로 나눠서 각 핀들을 켜고 끄는 함수
      else if (currentRange == 3)
      {
         WriteLED(LED_PIN_3,HIGH);  WriteLED(LED_PIN_5,HIGH); WriteLED(LED_PIN_7,HIGH);
         delay(100);
         WriteLED(LED_PIN_3,LOW);  WriteLED(LED_PIN_5,LOW); WriteLED(LED_PIN_7,LOW);
    
         WriteLED(LED_PIN_4,HIGH);  WriteLED(LED_PIN_6,HIGH);
         delay(100);
         WriteLED(LED_PIN_4,LOW);  WriteLED(LED_PIN_6,LOW);
      }
      else if (currentRange == 4)
      {
      }
      else
      {
      }
    }
    
    //  AO핀의 입력값을 읽어 리턴하는 함수
    int ReadPotentiometer()
    {
      return analogRead(A0);  //  A0핀의 입력값을 리턴
    }
    
    //  변환한 값으로 LED 밝기 조절하는 함수 
    void WriteLED(int ledPIN,int led)
    {
      digitalWrite(ledPIN,led);
    }

     

     

    그리고, 위에서는 for문을 이용해서 핀에 접근하는 방식을 썼다.

    그런데, 비트 연산을 활용해도 괜찮은 방법이라 생각한다.

    하나의 예를 들면 다음과 같다.

    void setup() {
      // put your setup code here, to run once:
      pinMode(3,OUTPUT);
    }
    
    void loop() {
      // put your main code here, to run repeatedly:
      //int a=0b00000101;
      int a=0b00001010;
      digitalWrite(3, (a & 8)>> 3);
      digitalWrite(4, (a & 4)>> 2);
      digitalWrite(5, (a & 2)>> 1);
      digitalWrite(6, (a & 1)>> 0 );
    }

     

     

    비트 연산 예제1

    소스 코드

    //  비트 연산자 예제
    //  비트 연산자는 통신에서 많이 쓰인다.
    
    void setup() {
      // put your setup code here, to run once:
      Serial.begin(9600);
    }
    
    void loop() {
      // put your main code here, to run repeatedly:
      int bin = 0b10000000;   //  2진수 표현법 
      
      int hex = 0x0F;         //  16진수 표현법으로 2진수로는 0000 1111
    
      int hex1 = 0x8F;        //  16진수 표현법으로 2진수로는 1000 1111
    
      int c;
    
      int d = 0b00010000;
    
      c = d >> 1;
      
      //  Serial.println(hex | hex1,BIN); //  OR 연산
    
      //  Serial.println(hex & hex1,BIN); //  AND 연산
    
      Serial.println(hex ^ hex1,BIN);     //  XOR 연산
    }

     

     

     

    비트 연산 예제1

    소스 코드

    void setup() 
    {
      // put your setup code here, to run once:
      for (int i = 2; i < 5; i++)
      {
        pinMode(i,OUTPUT);
        digitalWrite(i,LOW);
      }
    }
    
    void loop() 
    {
      // put your main code here, to run repeatedly:
      int num;
      int state;
    
      int a = 0b00011100;  //  2진수 표현
      
      for (int i = 2; i < 5; i++)
      {
        //  i = 2이면, a >> 2는  0b00000111 && ob00000001 = ob00000001 = 1
        //  i = 3이면, a >> 3은  0b00000011 && ob00000001 = ob00000001 = 1
        //  i = 4이면, a >> 4는  0b00000001 && ob00000001 = ob00000001 = 1
        
        state = (a >> i & 0b00000001) ? HIGH : LOW;
     
        digitalWrite(i,state);
      }
    }

     

    댓글

Designed by Tistory.