int led_R = 9;
int led_G = 10;
int led_B = 11;
void setup() {
 
}

void loop() {
  int R = analogRead(A1);
  analogWrite(led_R, R/4);
  int G = analogRead(A2);
  analogWrite(led_G, G/4);
  int B = analogRead(A3);
  analogWrite(led_B, B/4);
}

 

 

가변저항으로 LED 밝기 조절하기.

 

Posted by 샌츠
,

#include <Servo.h> 

 /*서보모터 라이브러리를 사용하기위해 Include */

Servo myservo;  // create servo object to control a servo 

                // twelve servo objects can be created on most boards

 int pos = 0;    // variable to store the servo position 


void setup() 

  Serial.begin(9600);

/*시리얼통신을 위한 값*/

  myservo.attach(9);  // attaches the servo on pin 9 to the servo object 

/*실제로 제어할 서보의 제어핀의 번호*/

 

void loop() 

  for(pos = 0; pos <= 180; pos += 1) // goes from 0 degrees to 180 degrees 

  {                                  // in steps of 1 degree 

    myservo.write(pos);              // tell servo to go to position in variable 'pos' 

    /* 서보모터에게 pos값의 각도로 이동하라는 명령.*/

      Serial.print(pos); 

Serial.print("\n");

/*시리얼모니터를 통한 pos 값 확인을 위한 소스*/

delay(50);                       // waits 15ms for the servo to reach the position 

  } 

  /*왼쪽으로*/

  for(pos = 180; pos>=0; pos-=1)     // goes from 180 degrees to 0 degrees 

  {                                

    myservo.write(pos);              // tell servo to go to position in variable 'pos' 

    Serial.print(pos);

     Serial.print("\n");

    delay(50);                       // waits 15ms for the servo to reach the position 

  } 

  /*오른쪽으로*/



Posted by 샌츠
,

[아두이노 강좌] 14. 아두이노로 서보모터 제어하기

http://wiki.vctec.co.kr/opensource/arduino/servocontrol

본 게시글에서는 아두이노를 이용하여 서보모터를 어떻게 제어하는지 살펴보도록 하겠습니다. 서보를 자동으로 앞뒤로 움직이게 만들어보고, 포텐셔미터를 추가하여 서보의 포지션을 제어하도록 하겠습니다.

knob.jpg

브레드보드 레이아웃1

아래의 브레드보드에서는 서보 모터만이 아두이노에 연결되어 있습니다. 아래와 같이 브레드보드를 셋업합니다.

fritzing_sweep.jpg

서보모터는 3개의 리드선을 가지고 있는데 보통 빨강이 5V, GND는 검정이나 갈색입니다. 나머지 리드선은 제어 리드선으로 보통 오렌지색이나 노랑색을 띄고 있습니다. 제어 리드선을 디지털 핀 9번에 연결합니다.

서보 리드선 끝의 소켓에 점퍼를 연결하여 아래와 같이 브레드보드에 셋업합니다.

sweep.jpg

만약 서보가 오동작을 한다면,

위와 같이 셋업을 하였는데 만약 서보가 이상하게 동작을 한다면, 그것은 서보가 너무 많은 전력을 끌어다 쓰기 때문일 수 있습니다. USB로 아두이노에 전원을 공급하기 때에만 이러한 현상이 발생할 수 있습니다. 보통 모터가 움직이기 시작할때 전력을 많이 쓰기 때문에 이는 아두이노 보드의 전압을 떨어 뜨릴 수 있으며, 이는 다시 아두이노 보드를 리셋하게 만듭니다.

만약 이러한 현상이 발생한다면, 캐페이시터(470uF이상)를 GND와 5V 사이에 추가함으로써 해결할 수 있습니다.

fritzing_with_cap.jpg

캐패에시터는 모터가 사용하는 전력 저장소와 같은 역활을 하여 모터가 시작할때 아두이노 전원뿐아니라 캐패이시터에서 전기를 끌어다 쓸수 있습니다.

캐패이시터의 긴 다리가 양극이며 이 리드선이 5V에 연결되어야 합니다. 음극 리드선은 보통 '-' 심볼로 표시됩니다.

아두이노 코드 1

아래의 스케치 코드를 아두이노에 업로드하면 서보가 한방향으로 돌다가 다른 방향으로 다시 도는 것을 확인 할 수 있습니다.

본 스케치 코드는 아두이노 servo 예제 폴더에 있는 sweep 코드를 기반으로 작성된 코드입니다.

  1. #include <Servo.h>
  2. int servoPin = 9;
  3. Servo servo;
  4. int angle = 0; // servo position in degrees
  5. void setup()
  6. {
  7. servo.attach(servoPin);
  8. }
  9. void loop()
  10. {
  11. // scan from 0 to 180 degrees
  12. for(angle = 0; angle < 180; angle++)
  13. {
  14. servo.write(angle);
  15. delay(15);
  16. }
  17. // now scan back from 180 to 0 degrees
  18. for(angle = 180; angle > 0; angle--)
  19. {
  20. servo.write(angle);
  21. delay(15);
  22. }
  23. }

서보 모터는 펄스에 의해 제어되어 사용하기 쉽습니다. 서보용 아두이노 라이브러리가 있어 서보에게 단지 동작할 각도를 알려주기만 하면 됩니다.

이러한 서보 라이브러리를 사용하기 위해서는 아래와 같은 코드로 아두이노 IDE에게 서보 라이블러리를 사용할 것임을 알려주어야 합니다.

  • #include <Servo.h>

그리고, 서보를 제어하기 위해 servoPin이라는 이름의 변수를 정의하였습니다.

    1. Servo servo;

위의 코드에서 보면 Servo 타입 servo변수를 정의한 것을 볼 수 있습니다. Servo는 라이브러리에서 제공하는 변수 타입으로 서보사용시 사용합니다. 8개까지의 서보를 정의할 수 있습니다. 만약 두개의 서보를 가지고 있다면, 아래와 같이 정의 할 수 있을 것입니다.

    1. Servo servo1;
    2. Servo servo2;

servo변수에게는 실제로 제어할 서보의 제어핀이 어떤 핀인지를 알려주어야 니다. 아래의 코드로 servo변수에게 제어핀을 알려줍니다.

servo.attach(servoPin);

변수 angle은 서보의 현재각도를 저장하기 위해 사용됩니다. loop함수에서 우리는 두개의 for loop를 사용하는 것을 볼 수 있는데, 첫번째로 각도를 한방향으로 180도까지 증가 시키고, 다음 for 루프에서는 반대방향으로 욺직이게 합니다.

servo.write(angle);

위의 코드는 서보에게 파라메터로 들어온 각도로 위치를 업데이트 하는 명령입니다.

브레드보드 레이아웃2

그럼 두번째 브레드보드 레이아웃을 살펴보겠습니다. 이 레이아웃에는 포텐셔미터가 포함되어 포텐셔미터를 돌려 서보의 위치를 조절할 수 있습니다. 포텐셔미터의 슬라이더 리드를 아두이노의 A0에 연결합니다.

fritzing_knob.jpg

아두이노 코드

  1. #include <Servo.h>
  2. int potPin = 0;
  3. int servoPin = 9;
  4. Servo servo;
  5. void setup()
  6. {
  7. servo.attach(servoPin);
  8. }
  9. void loop()
  10. {
  11. int reading = analogRead(potPin); // 0 to 1023
  12. int angle = reading / 6; // 0 to 180-ish
  13. servo.write(angle);
  14. }

두번째 코드도 첫번째 코드와 비슷한데 potPin이라는 변수가 추가되었습니다. 서보의 위치를 셋팅하기 위해 포텐셔미터로부터 나오는 아날로그 값을 A0핀으로부터 analogRead함수를 통하여 읽어 드리면, 0에서 1023의 값이 읽히게 됩니다.

서보는 오직 180도만 회전할 수 있기 때문에 180도에 맞게 0~1023까지의 값을 스케일 하여야 합니다. 0-1023을 6으로 나누면 0~170이 되어 알맞게 스케일 되었습니다

서보 모터

서보 모터의 위치는 펄스의 길이에 따라서 설정됩니다. 서보는 대략 매 20ms마다 펄스를 받게되는데, 만약 이 펄스가 1ms동안 high이면 각은 0 이며, 1.5ms동안 high이면 중간위치에 위치하게 되고 2ms인 경우는 180도가 되게 됩니다..

servos.png

서버가 움직일 수 있는 끝부분은 제품에 따라 차이가 있는데 많은 서보가 170도까지만 회전을 합니다. 360도까지 회전하는 서보도 있으니 필요하다면 제품을 찾아보는 것도 좋습니다.

 


Posted by 샌츠
,

[아두이노 강좌] 07. 버튼을 이용하여 RGB LED 색상 제어하기

http://wiki.vctec.co.kr/opensource/arduino/rgbledcolorcontrol

이번 게시글에서는 6번 강좌에서 셋업하였던 세개의 푸쉬버튼을 이용하여 RGB LED의 색깔을 제어하는 실험을 진행하도록 하겠습니다.

overview.jpg

브레드보드 레이아웃

브레드보드 레이아웃은 아래와 같습니다. RGB LED의 가장 긴다리는 2번째 줄에 연결하여 GND에 연결되어 있는 것을 주의하십시오

본 레이아웃은 RGB LED가 공통 음극을 가진 타입을 기준으로 작성되었습니다. 만약 공통 양극을 가진 RGB LED를 가지고 있다면 가장 긴 다리를 +5V에 GND대신 연결하십시오.

fritzing.jpg

아두이노 코드

아래의 코드를 아두이노에 로드합니다.

시작할때, 모든 LED는 꺼져 있게 되며 버튼을 누르고 있으면 LED는 점점 밝게 빛나게 됩니다. 브레드보드상의 제일 상단에 있는 버튼은 빨강, 중간은 초록, 제일 밑의 버튼은 파랑색을 조절하는 버튼입니다.

버튼들을 서로 눌러서 색이 어떻게 섞이는 지 확인하여 보십시오. 다시 시작하고 싶으시면 아두이노의 리셋버튼을 눌러 초기화 시키십시오. USB커넥터 옆에 있는 버튼입니다.

  1. int redLEDPin = 11;
  2. int greenLEDPin = 10;
  3. int blueLEDPin = 9;
  4. int redSwitchPin = 7;
  5. int greenSwitchPin = 6;
  6. int blueSwitchPin = 5;
  7. int red = 0;
  8. int blue = 0;
  9. int green = 0;
  10. void setup()
  11. {
  12. pinMode(redLEDPin, OUTPUT);
  13. pinMode(greenLEDPin, OUTPUT);
  14. pinMode(blueLEDPin, OUTPUT);
  15. pinMode(redSwitchPin, INPUT_PULLUP);
  16. pinMode(greenSwitchPin, INPUT_PULLUP);
  17. pinMode(blueSwitchPin, INPUT_PULLUP);
  18. }
  19. void loop()
  20. {
  21. if (digitalRead(redSwitchPin) == LOW)
  22. {
  23. red ++;
  24. if (red > 255) red = 0;
  25. }
  26. if (digitalRead(greenSwitchPin) == LOW)
  27. {
  28. green ++;
  29. if (green > 255) green = 0;
  30. }
  31. if (digitalRead(blueSwitchPin) == LOW)
  32. {
  33. blue ++;
  34. if (blue > 255) blue = 0;
  35. }
  36. analogWrite(redLEDPin, red);
  37. analogWrite(greenLEDPin, green);
  38. analogWrite(blueLEDPin, blue);
  39. delay(10);
  40. }

스케치를 보면 LED를 제어하기 위한 세개의 출력 핀이 있고, 이 출력 핀은 PWM핀으로 LED의 각 컬러로 들어가는 전력을 제어할 있습니다.

또 다른 세개의 핀이 필요한데 이 핀들은 버튼을 위하여 사용이 됩니다. setup함수에서 입력으로 설정되었으며 HIGH상태로 풀업되어, 만약 버튼이 눌리게 된다면 LOW상태로 변화하게 됩니다.

핀이 정의된 다음에는 red, green, blue라는 변수들이 나오게 됩니다.

  1. int red = 0;
  2. int blue = 0;
  3. int green = 0;

이 변수들은 LED의 각 RGB 채널의 빛의 세기를 저장하는 값입니다. 만약 red가 0이라면 LED의 빨강색부분은 꺼지게 되며, 255라면 최고치의 빨강색을 밝게 표현합니다.

loop함수는 두 부분으로 나뉘어 있는데 첫번째 부분은 버튼을 체크해서 red, green, blue변수에 버튼의 상태에 따라 필요한 변화를 주는 부분입니다. 예를 들어 빨강색용 버튼을 체크하는 부분은 아래와 같습니다.

  1. if (digitalRead(redSwitchPin) == LOW)
  2. {
  3. red ++;
  4. if (red > 255) red = 0;
  5. }

digitalRead함수를 실행하게 되고 red 핀이 LOW상태인것을 발견하게 되면 이것은 버튼이 눌렸다는 것을 의미합니다. 그래서 red변수에 1을 더하게 됩니다.

PWM용으로 쓸수 있는 최대 값은 255이기 때문에 다음 라인에서 red가 255를 넘는지를 확인 한 후 넘었다면 0으로 다시 설정합니다.

두번째 부분은 analogWrite함수를 수행하는 부분으로 각각의 LED의 색을 설정하게 됩니다.

  1. analogWrite(redLEDPin, red);
  2. analogWrite(greenLEDPin, green);
  3. analogWrite(blueLEDPin, blue);

마지막으로 loop의 마지막에는 짧은 딜레이를 주어 색의 변화를 조금 늦추어 줍니다. 이 딜레이가 다다면 푸쉬버튼의 물리적인 노이즈로 색이 랜덤하게 변할 수 있습니다.


Posted by 샌츠
,

[아두이노 강좌] 06. 푸쉬버튼을 이용한 디지털 입력하기

http://wiki.vctec.co.kr/opensource/arduino/pushbutton

본 게시물에서는 푸시 버튼을 이용하여 LED를 켜고 끄는 방법에 대해 살펴보도록 하겠습니다.

overview.jpg

맨위에 있는 푸쉬 버튼을 누르면 LED가 켜지고 다른 버튼을 누르면 LED가 꺼지게 될 것입니다.

브레드보드 레이아웃

스위치 버튼의 핀은 스위치 반대편에 위치하여 있습니다.

fritzing.jpg

LED를 연결할 때는 극성을 주의하여 연결하십시오. 짧은 쪽이 음극이며 오른쪽에 위치 시켜야 합니다.

아두이노 코드

아래의 스케치를 아두이노에 로드시키고 맨 위에 위치한 푸쉬버튼을 눌러보십시오. LED가 켜지는것을 확인한 후 다른 버튼을 눌러 LED를 끄십시오.

  1. int ledPin = 5;
  2. int buttonApin = 9;
  3. int buttonBpin = 8;
  4. byte leds = 0;
  5. void setup()
  6. {
  7. pinMode(ledPin, OUTPUT);
  8. pinMode(buttonApin, INPUT_PULLUP);
  9. pinMode(buttonBpin, INPUT_PULLUP);
  10. }
  11. void loop()
  12. {
  13. if (digitalRead(buttonApin) == LOW)
  14. {
  15. digitalWrite(ledPin, HIGH);
  16. }
  17. if (digitalRead(buttonBpin) == LOW)
  18. {
  19. digitalWrite(ledPin, LOW);
  20. }
  21. }

코드의 첫부분에서는 세개의 핀을 위한 변수를 정의하였습니다. ledPin은 출력 핀이며 buttonApin은 제일 위에 있는 버튼, buttonBpin은 다른 스위치를 의미합니다.

setup함수에서 ledPin을 디지털 출력모드로 설정하였습니다. buttonApin, buttonBpin은 입력으로 설정되었는데 INPUT_PULLUP이 파라메터로 쓰였습니다.

  1. pinMode(buttonApin, INPUT_PULLUP);
  2. pinMode(buttonBpin, INPUT_PULLUP);

INPUT_PULLUP 핀모드는 핀이 입력으로 사용될 것이지만 아무것도 연결되지 않았다면 HIGH 상태로 pullup 시켜두라는 것을 의미합니다. 다시 말하면 입력핀의 기본 상태는 HIGH입니다. 그리고 버튼을 눌르면 상태는 LOW가 되어야 합니다.

그래서 스위치들이 GND에 연결되어 있습니다. 스위치가 눌리면 스위치는 입력핀을 그라운드와 연결시키게 되고 입력핀은 더이상 HIGH상태가 될수 없게 됩니다.

입력은 보통 HIGH이고 버튼이 눌리면 LOW로 되는 로직을 loop 함수에서 처리합니다.

  1. void loop()
  2. {
  3. if (digitalRead(buttonApin) == LOW)
  4. {
  5. digitalWrite(ledPin, HIGH);
  6. }
  7. if (digitalRead(buttonBpin) == LOW)

{

  1. digitalWrite(ledPin, LOW);
  2. }
  3. }

루프 함수 안에는 두개의 if문이 있고 각각 버튼 두개의 상태를 검사합니다.

버튼이 눌린다면 눌린쪽에 연결된 입력핀은 LOW가 되므로 버튼A가 눌려 LOW상태가 된다면 digitalWrite 함수가 ledpin을 HIGH로 만들어 LED를 켜게 됩니다.

비슷하게 버튼 B가 눌린다면 LED를 끄게 됩니다.

푸쉬 스위치

스위치는 간단한 부품으로 버튼을 누르면 두개의 접촉부분을 연결시켜 전기를 흐르게 만드는 부품입니다.

여기서 사용되는 택틀 스위치는 4개의 다리를 가지고 있어 무엇이 무엇인지 약간 헷갈립니다.

sw.png

실제로 버튼에는 두개의 전기적 연결만이 있습니다. 스위치 케이스 안에는 핀B와 핀C가 서로 연결되어 있고 핀A와 핀D가 서로 연결되어 있습니다.

 


Posted by 샌츠
,
Programming/IoT_Embedded

아두이노 디지털 핀에 24V 입력받기(저항으로 전압강하, 전압분배)

dltpdn@gmail.com 이세우 2016.02.04 00:21
아두이노나 라즈베리파이 같은 보드는 GPIO라는 입출력 핀들을 제공하는데요.
입출력 신호로 사용하는 전압은 각각  5v와 3.3v입니다.
이런 신호를 TTL(Transistor to Transistor Logic, 네트웍에서 말하는 TTL하고 다름)라고 하는데요.
보통 자체 동작전압을 가지고 입출력을 받는 회로를 만드는 경우에는 아무 문제가 없는데
별도 자체 전원으로 동작하는 외부 장치에서 신호를 받는 경우는 전압 때문에 입력을 받을 수가 없는 경우가 많습니다.

가장 대표적인 예가 PC하고 연결할때 시리얼포트를 쓰는 경우가 있는데,
PC는 HIGH/LOW를 +12V/-12V로 표현하는데, 
이걸 직접 아두이노나 라즈베리파이에 연결하면 당연히 보드가 타버리게 되죠.


또 다른 예로는 아파트나 사무실 천정에 하나씩은 달려 있는 화재 감지기의 경우 인데요.

이것은 24V로 동작합니다. 그래서 화재가 나면 24V를 HIGH값으로 입력 받아야 하는데,
이걸 아두이노나 라즈베리파이에 그대로 받았다가는 순식간에 타버리게 되죠.

그 외에도 우리는 특정 전압을 어떤 전압으로 낮추어서 사용해야 할때가 많습니다.
이렇게 전압을 원하는 수준으로 내려야 할 때 사용하는 방법은 여러가지가 있는데요.

지금 소개할 방식은 저항을 이용한 전압분배 방식으로 TTL 신호를 받아 들기에 적합하고
회로 구현도 아주아주아주 쉽고 비용도 엄청 저렴합니다.

무엇보다도 전압분배에 대한 이해를 하는 것은 전자회로에 아주 중요한 기초이니까 함께 알아 보시죠.



먼저 저항과 전압의 관계에 대해서 좀 살펴 볼까요?

아래의 그림처럼 저항을 연결하고 저항 전/후의 전압을 측정하면 얼마 일까요?


배터리가 1.5v라고 했을때 몇 오옴 짜리 저항이든 간에, 저항과 플러스(양극,+)와 맞다은 곳은 1.5v이고
저항과 마이너스(음극, -)와 맞다은 곳은 0v 입니다.
어떤 분은 너무 당연하기도 하고 어떤 분은 이해가 안 갈겁니다.

이해 안되시는 분을 위해 아주 쉽게 설명하자면,
음극은 0v고 양극은 1.5v 겠죠? 그런데, 저항 다리가 각각의 극하고 붙어 있자나요.
그러니까 저항과 연결된 선 어디를 측정해도 연결된 극의 전압이 나옵니다.

실제로 멀티미터로 측정을 하려고 해도 우수운 그림 밖에 나오지 않습니다.
그림에서 저항의 왼쪽 전압을 측정하려면 아래 그림 처럼 될텐데, 우숩지요?



그럼 이제 다른 그림을 하나 더 볼까요?


10k옴 저항을 2개 연결했습니다.
그리고 나서 각 구간의 전압을 측정해 보면 가운데 영역은 몇 볼트가 나올까요?

실제로 측정해 보면 0.75v가 나옵니다.



만약 위의 건전지 처럼 1.5v 아니라 3v를 연결했다면 가운데 영역의 전압을 얼마가 나올까요?

네 예상하신것 처럼 1.5v가 나옵니다.

여기서 테스터기(멀티미터)의 리드봉(probe)을 아래와 같이 놓고 측정해도 같은 값이 나옵니다.


이렇게 어떤 회로 전과 후에 전압이 달라지는 것을 전위차라고 하구요.
일반적으로 우리가 "전압이 얼마다” 라고 이야기 하는 것은 바로 이 전위차를 말하는 것입니다.

이전 포스트에서도 잠시 다루었지만, 아래 그림 처럼
저항 없이 양극과 음극이 만나면 어떻게 되고 그때 전압은 얼마 일까요?

이렇게 연결하면 건전지가 뜨거워 지면서 배터리 홀더와 전선, 그리고 배터리 까지 불타버립니다.
이걸 이용해서 김병만이 정글의 법칙에서 껌종이로 불도 피우고 그랬죠.

왜 그런지는 이전 포스트를 참조 하시구요.

지금은 이때 전압이 얼마인가 하는게 중요합니다.
전압(전위차)은 바로 0V입니다.

다들 아시는 옴의 법칙
짜잔!!  

이 법칙에서 R 즉 저항이 0(zero, 영)이 되면 V 즉 전압도 0(zero, 영)이 될 수 밖에 없습니다.
무슨 수에 0을 곱하면 무조건 0이 되는거 다 아시죠?



이제 그럼 본격적인 실험을 해보죠.
이번엔 2개의 저항의 값을 서로 다르게 해보는 거에요.
아래 그림 처럼 10k옴, 20k옴 저항을 연결하면 각 영역의 전압은 얼마 일까요?
 


각각 1v와 2v가 나옵니다.

이것을 다이어그램으로 다시 그리면 아래와 같게 되죠.


그럼 이제 원래 알아 보려고 했던 전압을 낮추는 방법을 알아 볼께요.

앞서 알아 보았듯이, 저항 2개를 연결하고 그 가운데 영역의 전압을 측정해 보면 
입력 전압보다 낮아 지는 것을 알 수 있습니다.
이때 저항의 입력전압과 저항 값에 따라 그 가운데 영역의 전압을 알아 낼 수 있는데요.
그 가운데 영역을 이용해서 TTL 신호로 사용하는 겁니다.

이때 저항 2개를 각각 R1, R2 라고 부르면,  두 저항의 값이 동일할 때는
R1에 걸리는 전압과 R2에 걸리는 전압이 동일하기 때문에 전압은 절반으로 나누어 집니다.
이와 달리 R1과 R2의 저항 값을 달리하게 되면 그 비율에 따라 나뉘게 됩니다.
이것을 공식으로 세우면 아래와 같은 공식이 완성 됩니다.

  



이제 저항 2개만 있으면 원하는 전압을 뽑아 낼 수 있게 되었습니다.

그럼 24V 전압을 아두이노 입력으로 받으려면 R1,R2의 저항 값은 얼마 일까요?
막상 계산하려니까 수학의 스트레스 스멜이 슬슬 올라 오나요?(학교 다닐때 저는 수학이 너무 싫었어요..)

쉽게 계산 하는 방법을 알려 드릴께요.

위 공식에 대입하면,
Vout  = 5v  (아두이노 디지털 핀으로 입력 받아야 하니까)
Vin    = 24v (24v 전압을 입력 받는 다고 했으니까)
그럼 식으로 만들어 보죠.

5 = R2/(R1+R2) * 24

그 다음이 막막하네요…  일단, 이항 부터 해보면...

R2/(R1 + R2) =  5 / 24

오잉! R2가 나와 버렸네요.

R2  = 5

그럼 R1도 구해야죠~

R1 + R2 = 24
R2 = 24  - R1 =  24 - 5 = 19

R1 = 19, R2 = 5 네요. 간단하죠?

자 그럼 19옴하고 5옴을 연결하면 될까요?
잘 보면 저 공식은 각 저항 값의 배수 중 어떤것을 적용해도 같다는 걸 알 수 있어요.

예를 들면 첫번째로 실험했던 10k옴 2개를 연결했던걸 생각해 보세요.
3v를 반반씩 나누어서  1.5v로  되었어요.
그럼 여기서 1k옴 2개를 쓰면 어떻게 될까요? 당연히 1.5v 반반씩 나누어 집니다.
그럼 100k옴 2개는?, 10옴 2개는?, 1옴 2개는?
다~~~ 마찬가지입니다. 10K 뿐만 아니라 1,234옴 2개를 연결해도 마찬가지!!
왜냐하면 5:5 비율이니까요.

그럼 저 많은 것들 중에 어떤걸 써야 하죠? 

해답의 열쇠는 바로바로바로~~ 전류가 가지고 있습니다.
얼마 만큼의 전류를 필요로 하는냐에 따라 배수 중에 적합한 것을 적용하는 것입니다.

전류값은 어떻게 구할까요? 
다시 나옵니다. 옴의 법칙
짜잔!!  


이 식을  다시 쓰면,

두둥!!


앞서 예를든 3V에 10k옴 2개를 연결했을 때 각 저항에 흐르는 전류는 얼마인지 계산해 볼까요?

IR1 = VR1 / R1 = 1.5V / 10,000 = 0.00015 = 0.15mA

저항 값이 같고 그래서 각 저항에 걸리는 전압도 같으니 두번째 저항에 흐르는 전류도 똑 같겠죠?


다시 한번 더 해 볼까요?
앞서 보았던 아래 그림 처럼 3V에 10k, 20k 저항을 연결했을때 각각의 전류는 얼마 일까요?

IR1 = 1V / 10K = 1 / 10000 = 0.0001 = 0.1mA
IR2 = 2V / 20K = 2 / 20000 = 0.0001 = 0.1mA

어때요? 각각의 저항과 전압이 다른데도 흐르는 전류의 값은 같죠?
이 포스트를 읽고 계실 분이라면
     "하나의 회로에 흐르는 전류의 값은 같다"
라는 말을 어디서 들어 보셨을 것 같은데, 이제 이해 되시죠?

자 그럼 다시 원래대로 돌아 와서 24V 전압을 아두이노에 입력 받으려면 
저항을 어떤걸 써야 할까요?

아까 구한 대로 라면
R1 = 19, R2 = 5 입니다.
비율만 갖다면 어떤 값이든 상관 없다고 했으니까,
표준 저항(모든 수치에 맞는 저항을 다 만들 수는 없겠죠. 신발사이즈 처럼)에서 
고르기 편하게  R2를 1로 바꾸어서 다시 계산해면

R2/ (R1+ R2) 이니까, 5/24 였어요, 이걸 5로 약분하면
5/24 = 1/4.8 이네요.
그러면 R2 = 1, R1 = 4.8 - 1 = 3.8

R1 = 3.8, R2 = 1

정말 맞는지 공식에 다시 대입해 볼까요?


24 * 1 / ( 3.8 + 1) = 24 / 4.8 = 5

맞군요.


이제 10을 몇번 곱해야 할지는 필요한 전류에 따라 다릅니다.
우리는 아두이노 디지털 핀으로 입력 받기를 원하니까,
아두이노가 느낄 수 있는 정도의 전류만 있으면 되겠네요.

앞서 풀업/풀다운 저항 포스팅 에서도 설명 드린것 처럼
아두이노 입력 핀은 아무런 회로와 연결되어 있지 않으면
1(HIGH), 0(LOW)가 무작위로 입력됩니다.
아주 미세한 전자의 영향을 받는 것이죠.
이 상태를 Hi-Z(하이 임피던스)라고 하는데요.
이때는 아주 미세한 전류만 흘러도 인식할 수 있다는 뜻입니다.
수 마이크로 암페어의 전류만 있어도 가능합니다.

그럼, IR1, IR2가 수 uA(마이크로 암페어) 그러니까 0.x mA가 되도록 저항 값에 10을 곱해서 높여주면 되겠군요.
어차피 IR1과 IR2는 하나의 회로니까 전류값이 동일할 것이고, 그러면 편하게 IR2것만 계산해 보면 되겠네요.
IR2 = 5V / 1옴 = 5A  너무 크죠? 그럼 저항에 0을 4개 붙이면 0.0005A 즉 0.5mA가 되겠네요?

IR2 = 5V / 10,000옴 = 0.0005 = 0.5mA 

그럼 배율에 따라 3.8과 1에다가 10k씩 곱해서

R1 = 38kΩ, R2 = 10kΩ 

이제 되었네요.

그럼 실제로 실험을 해볼까요?
저는 38kΩ 저항이 없어서 20kΩ + 18kΩ을 직렬연결하였습니다.
실제로 38kΩ은 표준저항에 없구요. 구매하실때는 39kΩ을 구매하시면 됩니다.

먼저 24v 어뎁터를 준비합니다.

24v 어뎁터를 브레드 보드에 쉽게 연결할 수 있게 커넥터를 준비했습니다.



멀티미터로 어뎁터의 전압을 측정해보니 24.36v 가 나오네요.

20k + 18k , 10k를 연결해서 중간에서 전압을 측정하니 5.04v가 나오네요.


자 그럼 실제로 아두이노와 연결해서 마지막 실험을 해볼까요?
(주의!! 이렇게 고전압으로 회로를 구성할때는 반드시 위의 사진처럼 멀티미터로 먼저 테스트 해보는게 좋습니다.
무조건 아두이노나 라즈베리파이의 GPIO에 연결하면 순식간에 타버릴 수 있으니까요!
제가 그걸 모르고 라즈베리파이 4개나 태워 먹었어요.)

저는 아래와 같이 회로를 구성했습니다.
저는 38k옴 대신에 20k와 18k를 연달아(직렬) 연결했습니다.
그리고 10k옴과 연결한 사이에서 2번 핀으로 입력을 받는 겁니다.
그리고 당연히 2개의 회로의 GND를 연결해줍니다.(이거는 어떻게 설명하기 힘든 부분이네요.)


아래 코드는 아두이노에서 스위치 입력을 받아 LED를 깜빡이는 코드 입니다.
아두이노 IDE 메뉴에서 “파일” > “예제” > “02.Digital” > “Button”을 누르면 나옵니다.

const int buttonPin = 2;     // the number of the pushbutton pin
const int ledPin =  13;      // the number of the LED pin

// variables will change:
int buttonState = 0;         // variable for reading the pushbutton status

void setup() {
  // initialize the LED pin as an output:
  pinMode(ledPin, OUTPUT);
  // initialize the pushbutton pin as an input:
  pinMode(buttonPin, INPUT);
}

void loop() {
  // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);

  // check if the pushbutton is pressed.
  // if it is, the buttonState is HIGH:
  if (buttonState == HIGH) {
    // turn LED on:
    digitalWrite(ledPin, HIGH);
  }
  else {
    // turn LED off:
    digitalWrite(ledPin, LOW);
  }
}


아래 동영상은 최종 실험 모습을 담았습니다.



만약 라즈베리파이로 똑같은 회로의 입력을 받는다면 저항 값은 얼마로 해야 할까요?
라즈베리파이는 3.3v를 입력 값으로 받기 때문에 저항 값을 다시 계산해야 합니다.

다시 공식에 대입해 볼까요?


3.3 = R2 / (R1+R2) * 24
R2/(R1+R2) = 3.3/24 = 1/7.27
R2 = 1
R1 = 7.27 - 1 = 6.27


이렇게 2개의 저항을 이용해서 전압분배를 해 보았는데요.
이 전압분배와 저항의 관계는 두고두고 써먹을 데가 많기도 하고 전자 회로를 이해하는데 꼭 필요한 지식입니다.
이것을 이해해야 트랜지스터를 이용한 여러가지 회로를 만들 수가 있습니다.

그럼 누군가에게는 도움이 되었기를 바랍니다.

그나저나 악보는 언제 쓰나...



출처: http://blog.xcoda.net/80 [악보쓰는 프로그래머]

출처: http://blog.xcoda.net/80 [악보쓰는 프로그래머]

Posted by 샌츠
,

아두이노/전자 기초 이론 2016.12.20 10:03 |

아두이노 처음에 하면 LED를 켤 때 반드시 저항을 같이 연결하라고 합니다.

왜일까요?

1. 여기 달린 이 저항은 대체 왜 달며?

2. 그 값은 어떤 근거로 정해졌나?

이거 궁금하지 않습니까?

저는 궁금했습니다.

하지만 그 보다 더 궁금한 것이 많았기 때문에 일단 제쳐 놓고 딴 것 부터 열심히 했습니다.

이제 아두이노로 할 수 있는 것은 어느 정도 해 보니 좀 더 근본적 이론,

기초적인 문제가 궁금해졌습니다.

남이 만들어 놓은 회로만 따라하는 게 아니고 

제가 생각한 회로를 독자적으로 만들려면 

반드시 저 저항값이 어떻게 정해지는지를 알아야만 했으니까요.

대략 220에서 330옴 사이의 저항을 연결하라는대 그 근거는 뭘까요?


지금부터 쓰는 글은 

http://blog.xcoda.net/80

(원문링크)

여기서 참고 했습니다.

아주 상세하고도 친절히 잘 설명해 놓으셨지만, 

사람마다 이해하는 방식이 다르듯이 

제가 이해하기에는 한 눈에 쏙 들어오질 않았습니다.

그래서 일단 저의 이해를 돕기 위해 제 방식대로 정리를 하려고 합니다.


일단 정리를 하면 이런 겁니다.


1. LED에 저항은 왜 다는가?

아두이노 디지탈 핀에서는 5V(볼트)에 40mA(미리 암페어) 까지의 전기가 나옵니다.

그런대 만일 LED가 그 보다 낮은 용량이라면?

LED가 타버리거나 합선이 되면 아두이노가 고장나거나.... 뭐 그럴 가능성이 있겠죠?


그래서 알맞는 저항을 달아서 그런 사고를 막으려는 것이죠.

설명은 이런 겁니다.

위의 그림에서 저항 두개가 쓰였습니다.

그 저항 두개의 값이 동일하다면, 전체 100의 전압을 반으로 나눠 준다는 겁니다.

저항 두개를 써서 전압을 원하는 비율로 나누면

파란 수직선 부분에서 원하는 전압의 전기를 끌어 쓸 수 있다는 겁니다.


그렇다면 다음 그림에서 ?에 들어갈 숫자는 얼마일까요?

 

답은 2겠죠?

이게 바로 핵심입니다.

저항이 직렬로 연결 되어 있을 때 각 저항의 크기의 비율만큼 전압을 나눠 쓴다.

만일 저항이 한개 밖에 없으면 전기를 혼자 다 먹지만,

저항이 많으면 공평하게 자기 크기 만큼 나눠 먹는다.


왜냐?

그건 모르겠습니다.

어쨌든 저항의 세계에서는 분배의 정의가 확립되어 있는 것 같아서 부러울 따름입니다.


그러면 윗 글의 저자가 예로 든 문제를 제 방식으로 풀어 보겠습니다.

문제는 이겁니다.

나는 24V를 넣고, 5V를 꺼내 쓰고 싶은대 

저 그림에서 a,b,c는 각각 얼마냐?

답은 

이겁니다.

그런대 여기서 전류A 문제가 나옵니다.

전류도 줄여 주고 싶다는 거죠.

전류를 줄여 주려면 

이런 식으로 뒤에 0을 계속 붙여 주라는 거죠.

0을 한개 붙일 때 마다 1A가 0.1A가 되고,0.01A가 되고 하는 식으로 전류가 줄어든다는 겁니다.


그럼 LED에 220~330옴의 저항을 달아야 한다는 숫자는 어떻게 나왔냐고요?

그건 아직도 모르겠습니다.

좀 더 공부를 해 봐야지.^^

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ


혹시 이런 걸까요?



댓글을 달아 주세요

  1. 땅끝까지 2016.12.20 10:55 신고 Address Modify/Delete Reply


    행님.. led 스펙을 보면 허용 전압과 전류가 있습니다. 그걸 맞추기 위해 저항을 사용하는거고

    옴의공식으로 저항값( r = v / i ) 을 계산하는건데, 어려운가요.?

    그림은 첫번째가 맞습니다.

    ^__^


    • 김진팔 2016.12.20 11:28 신고 Address Modify/Delete

      아... 알려 주셔서 감사합니다.
      저도 짐작은 했지만....
      짐작은 짐작일 뿐.... 꾸벅

      진짜 감사합니다.^^

      그러니까 LED도 전기를 잡아먹는 저항으로 간주하고 계산한다는 거죠?

  2. 땅끝까지 2016.12.20 12:00 신고 Address Modify/Delete Reply


    넹.. 그리고 led 스펙을 알기 힘드니까.

    470옴 짜리 저항을 쓰면,대부분의 led 스펙 안에 듭니다. 약간 어둡게 보이긴 하지만요..

    ^__^

  3. 노가다 2016.12.20 19:57 신고 Address Modify/Delete Reply

    요즘 취업도 어렵구 공무원준비할 경제적 지웜이나 머리가 안되기도 하고 전기분야가 앞으로 전망이 있고 기술 익히면 밥은 굶지 않는다는 말을 듣고 전기기능사 자격증 딴후 전기쪽 노가다 일을 하면서 돈 모아서 폴리텍대학 전기과 가서 상급자격을 딸 계획이 어떻겠냐는 말을 듣고여. 혹시 이쪽 분야나 전기관련일에 잘 아시면 현실적인 얘기 부탁드립니다. 앞날을 좀 긍정적이고 희망을 좀 갖져도 될지요? 치킨집배달하는 친구도 요즘 AI 때뮨에 쉬고 있다는데 너무 부정적인 얘기만 해서여. 살아가는데 팔수적인 실용적 지식이나 지혜를 좀 알려주세여

    • 김진팔 2016.12.21 10:48 신고 Address Modify/Delete

      요즘은 사람일 이라는 게 운이 100%라는 생각이 듭니다.

      세상에 태어난 사람 중에 살기 위해 노력 안 하는 사람도 있을까요?
      있다면, 모든 노력을 해 본 뒤에 지쳐서 포기한 사람이겠죠?

      (기본적으로 모든 사람이 노력을 하고 있는 상태라면 성공과 실패를 결정짓는 핵심 요소는 행운이 될 수 밖에 없습니다.)


      저도 거의 반백수로 매일 블로그질이나 하는 주제에 님께 알려드릴 지혜가 있을리는 없지만,

      그냥, 남들이 '뭐 하면 좋다더라~~ '하는 거 말고,
      님이 '죽어도 하고싶은 것'을 찾는 게 좋지 않을까요?

      예를 들어서 누가

      '너 김태희랑 결혼 할래? 아니면 이거 할래?'

      라고 물을 때
      조금도 주저없이

      " 저는 김태희랑 결혼 하는 것 보다 이게 10000000000000000000배 좋아요."

      라고 할 수 있는 것을 찾으세요.

      만에 하나 돈을 잘 못 벌어도 그 걸 하는 동안만은 행복할테니까 그리 큰 손해는 아닐 겁니다.

      저 에게는 그게 바로 '아두이노, 외국어 공부, 경제공부' 입니다.

      낼 모래 나이 50 되는 저도
      제가 이런 것을 좋아한다는 사실을 최근에야 깨달았습니다.

      내가 뭘 좋아하는지를 찾아내는 게 쉬운 일이 아닙니다.
      그걸 알아내려면 이것 저것 해 볼 수 있는 시간적 여유와 경제적 여유가 있어야하는대

      일단 당장 먹고 살아야 하니까요.

      아! 그리고 뭐든지 사람이 몰리면 임금 단가가 떨어집니다.
      요즘 또 전기쪽 공학쪽으로 사람이 몰리는 분위기던대.....
      희소성의 원칙은 만고불변입니다.

      다이야몬드가 길거리에 발에 채이면 그걸 누가 돈 주고 사겠어요?

      성경에도 '좁은 길로 가라. 좁은 길에는 사람이 적다' 고 했습니다.

      이 말은 직업 진로를 선택 할 때에도 참고할만한 말인 것 같습니다.

  4. 구독자 2016.12.21 22:21 신고 Address Modify/Delete Reply

    짱님, 제가 알고 있는 것을 간단히 정리하였습니다.

    LED는 P-N 접합 반도체 (발광 다이오드)이며, LED 양단에서 발생하는 전압 강하 (저항이 아님, 저항은 0)는 정해져 있습니다.
    전압강하가 0.7V 정도이며 (정확한 것은 부품 제조사 datasheet에), 5V IO 출력을 사용 시 전류를 계산하는 방법을 예로 들면,

    1) 저항이 없을 경우: I = V/R = (5V-0.7V) / 0옴 = 4.3V/0옴 = 무한대 전류
    -->즉, IO가 출력할수 있는 전류만큼 출력하며, 전류가 매우 높을 경우 전기 에너지가 모두 열 에너지화 되면서 타버림

    2) 저항이 200옴 경우: I = V/R = (5V-0.7V) / 200옴 = 4.3V/200옴 = 21.5mA

    3) 원하는 전류로 저항 계산 방법: R = V/I = (5V-0.7V) / I = 4.3V/I
    --> 전류 10mA로 하려면 저항 R = 4.3V/10mA = 430옴

    4) LED를 2개 직렬로 연결하고 저항이 1개이고 100옴인 경우
    : I = V/R = (5V - 0.7V - 0.7V) / 100옴 = 3.6V / 100옴 = 36mA

    LED 전류는 보통 10mA 정도로 하면 되며, 전류를 높이면 전류 대비 빛 양의 효율이 떨어지고 나머지 에너지는 열로 변환 됩니다.
    보통 전류가 많이 흐를 경우 탄다는 것은 결국은 열이 많이 발생에서 화학적인 반응으로..
    전류가 낮더라도 전압이 높아서 망가지는 경우는 트레시홀드 이상 넘어가서 차단을 못해서 손상이 발생하는 것입니다.

    오옴의 법칙과 LED (다이오드) 전압 강하만 이해하면 간단히 계산 됩니다.^^
    실제 멀티미티로 찍어보면 정확히 계산대로 됩니다. (열 영향으로 인한 특성 변화를 감안하면)

    전기회로는 이론이 확률적으로 딱 들어 맞는다고 생각합니다. 왜냐하면 엄청 많은 수량의 전자가 확률적으로 움직이고, 모수가 많아서 잘 들어맞는다고..

  5. ssk07043 2016.12.22 08:20 신고 Address Modify/Delete Reply

    아두이노 재밌어요?

    • 김진팔 2016.12.22 11:17 신고 Address Modify/Delete

      저는 외국어 공부를 좋아하고,
      컴퓨터를 좋아하고,
      전자부품을 보면 여자들이 다이야몬드 반지를 보고 정신을 잃는 것 처럼 정신을 잃습니다.
      그리고 손으로 만지작 거리고 뭘 만드는 것도 잘 합니다.

      이 모든 것을 한꺼번에 모아놓은 것이 아두이노입니다.

  6. ssk07043 2016.12.22 08:21 신고 Address Modify/Delete Reply

    저온의 진공(우주)에다 열에너지를 가하면 열에너지가 유지될까요 아님 열에너지가 빨리 사라질까요?

    • 김진팔 2016.12.22 11:16 신고 Address Modify/Delete

      ^^ 글쎄요... 아주 어려운 질문이군요.
      제가 그걸 대답할 수 있을까요?

      할 수 있다면 한 10년 정도 골똘히 생각해 봐야할 것 같습니다.

  7. 안녕 2016.12.22 12:06 신고 Address Modify/Delete Reply

    고양이 영상은 무슨 기기로 올리시죠?요즘 유튜브같은걸 올리는1인 미디어 시대인대 dslr 카메라를 사야 할지 새로 니콘에서 30만원대 키미션 액션캠이 나왔더군요. 실용적이고 가성비에는 액션캠이 유리해보이는데 선택이 어럽내요

    • 김진팔 2016.12.23 10:18 신고 Address Modify/Delete

      친구에게 얻은 중고 스마트폰 입니다.
      그냥 카메라로 쓰고 있습니다.
      그게.... 뭐더라....

      팬텍이라고 망한 회사에서 마지막으로 만든 거....
      중고가도 10만원 정도 밖에 안 하는 듯...

      막 쓰기 좋네요^^

  8. ssk07043 2016.12.23 08:00 신고 Address Modify/Delete Reply

    아두이노 배워 볼려하는데 뭐가 필요할까요?

    • 김진팔 2016.12.23 10:19 신고 Address Modify/Delete

      일단 아두이노 관련 책 중에 그림이 많고 설명이 쉽게 되어있는 책을 골라야겠죠?

      무엇보다도,
      '나는 아두이노로 이런 것을 만들어보고싶다.' 는 것이 있으면 훨씬 공부가 잘 됩니다.

      중간에 어려워도 포기도 안되고요.

      저는 주로 용산에 가서 관련 부품을 삽니다.

      교통이 그쪽이 더 편리해서요.

Posted by 샌츠
,