# 제목: 2N3904 트랜지스터를 사용한 스위칭 예제 - 2



# 내용: 저번 글에 이어 트랜지스터를 사용해서 간단한 회로를 만들고, 이를 아두이노를 통해 제어하는 방법에 대해 알아봅시다.


3개의 LED를 연결하고, 1개의 트랜지스터(2N3904)를 사용하여 회로 제어를 해보도록 한다.


이 회로에서 LED의 cathode(+) 에는 3, 4, 5번 핀으로 input을 넣어주고, 트랜지스터의 base(가운데)에 6번 핀을 연결하여 디지털 신호 HIGH/LOW를 넣어주어 전체 회로를 켰다 끌 수 있도록 구성하였다.


# 코드:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
int ledPin1 = 3;  //Digital I/O 3번에 1번째 LED 연결
int ledPin2 = 4;  //Digital I/O 4번에 2번째 LED 연결
int ledPin3 = 5;  //Digital I/O 5번에 3번째 LED 연결
int switchPin = 6//Digital I/O 6번에 트랜지스터 base 연결
 
void setup() {
  // put your setup code here, to run once:
  analogWrite(ledPin1, 1023);
  analogWrite(ledPin2, 200);
  analogWrite(ledPin3, 50);       //1~1023 입력시 LED 점등됨. 하지만 너무 낮으면 불이 안켜지니 주의.
  digitalWrite(switchPin, HIGH);  //(스위치를 닫는다 = 회로를 연결한다)
  delay(1000);
  digitalWrite(switchPin, LOW);
  analogWrite(ledPin1, 0);
  analogWrite(ledPin2, 0);
  analogWrite(ledPin3, 0);
}
 
void loop() {
  delay(1000);
  digitalWrite(switchPin, HIGH); //회로를 연결한 상태에서,
  analogWrite(ledPin1, 1023);
  delay(1000);
  analogWrite(ledPin1, 0);
  analogWrite(ledPin2, 1023);
  delay(1000);
  analogWrite(ledPin2, 0);
  analogWrite(ledPin3, 1023);
  delay(1000);
  analogWrite(ledPin3, 0);  //LED 1, 2, 3번 순서대로 1초씩 점등 후 꺼짐.
}
cs


# 회로도(Fritzing):



# 실행결과:




# 비고:


# 제목: 2N3904 트랜지스터를 사용한 스위칭 예제



# 내용: 앞서 스위치를 사용해서 회로를 연결했다 끊었다 하는 예제를 보여드렸죠.


이번에는 수동이 아닌, 전기적 신호를 사용해서 회로를 제어하는 방법을 보여드릴게요.


이번 글에서는 아두이노의 +5V, GND만 사용하고 그 외 I/O를 사용하지 않은 채로 트랜지스터의 사용법만 보여드리고, 


다음 글에서 트랜지스터와 아두이노 I/O를 연결하여 활용예제에 대해 다뤄보도록 할게요.



# 코드: (단순 회로 - 아두이노 사용하지 않음)



# 회로도(Fritzing):

1. 트랜지스터의 가운데단자 (BASE) - GND 연결을 하지 않았을 때. (LED OFF)

2. 트랜지스터의 가운데단자 (BASE) 연결을 했을 때. (LED ON)




# 실행결과: 




# 비고:


2N3904 Datasheet: https://html.alldatasheet.com/html-pdf/11470/ONSEMI/2N3904/180/1/2N3904.html



# 제목: 가변저항을 사용한 활용 예제



# 내용: 가변저항의 값을 아날로그 데이터로 입력하면 0~ 1023의 값이 입력된다.


이를 활용하여 필요한 만큼 구획을 나누어 원하는 상황에 맞게 사용할 수 있다.


해당 예제에서는 총 4개의 균등한 구획으로 나누고 각 구획마다 LCD에 다른 문구를 표시한다.



# 코드:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
 
LiquidCrystal_I2C lcd(0x3F162);  // I2C LCD 객체 선언
const int resistorPin = A0;   //아두이노 A0 I/O에 가변저항을 연결합니다.
int sensorValue = 0;
 
void setup() {
  lcd.begin(); // lcd를 사용을 시작합니다.
  lcd.clear(); // lcd를 전부 지웁니다.
  lcd.home();  // 첫번째 줄 첫번째(좌측) 위치로 이동한다.
 
  pinMode(resistorPin, INPUT);  //resistorPin 을 입력으로 설정합니다.
}
 
void loop() {
  lcd.home();
  sensorValue = analogRead(resistorPin);  //analogRead()를 사용해서 아날로그 입력을 받는다.
 
  if(sensorValue >= 0 && sensorValue <255) {         //sensorValue 값이 0~254 일때
    lcd.print("1st quarter");
  }
  else if(sensorValue >= 255 && sensorValue <511) {  //값이 255~510 일때
    lcd.print("2nd quarter");
  }
  else if(sensorValue >= 511 && sensorValue <766) {  //값이 511~765 일때
    lcd.print("3rd quarter");
  }
  else {                                             //값이 766~1023 일때
    lcd.print("4th quarter");
  }
}
cs


# 회로도(Fritzing):




# 실행결과:



# 비고:


# 제목: 3-pin 스위치(토글 스위치)를 사용해서 두가지 상태를 만들어보자.



# 내용: 3-pin 스위치에 경우 방향에 따라 다른 회로를 구성할 수 있다.



위 사진과 같이 회로를 구성하고 스위치를 좌-우로 움직여보면 어떤 상황일 때 LED가 켜지는 지 확인할 수 있다.

(스위치 구성에 따라 방향이 반대일 수 있으므로 꼭 사용하기 전에 확인하세요)


가운데 핀은 항상 연결이 되어있고, 스위치의 이동에 따라 좌측핀 혹은 우측핀과 가운데핀이 연결되는 구조이다.


오른쪽 버튼스위치의 경우 아예 회로가 단절되었다가 버튼을 눌렀을 때만 회로가 연결되는 구조라면, 토글스위치는 회로가 항상 연결은 되어있으나


두가지 회로 중 선택하는 스위치라고 생각하면 된다.


이번 예제에서는 스위치로 Apple 혹은 Banana 를 표시할 수 있는 회로를 만들어본다.


# 코드:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
 
LiquidCrystal_I2C lcd(0x3F162);  // I2C LCD 객체 선언
 
const int switchPin = 2;   //아두이노 디지털핀 2번 I/O에 스위치를 연결합니다.
int sensorValue = 0;
 
void setup() {
  lcd.begin(); // lcd를 사용을 시작합니다.
  lcd.clear(); // lcd를 전부 지웁니다.
  lcd.home();  // 첫번째 줄 첫번째(좌측) 위치로 이동한다.
 
  pinMode(switchPin, INPUT);  //switchPin 을 입력으로 설정합니다.
}
 
void loop() {
  lcd.home();
  sensorValue = digitalRead(switchPin);  //digitalRead()를 사용해서 디지털 입력을 받는다.
  if(sensorValue == HIGH) {  //스위치가 +5V와 연결되었을 경우 (HIGH)
    lcd.print(" Apple");
  }
  else {                     //스위치가 GND와 연결되었을 경우 (LOW)
    lcd.print("Banana");
  }
}
cs


# 회로도(Fritzing):




# 실행결과:



# 비고:




# 제목: 가변저항(INPUT) - 아두이노 - LCD1602(OUTPUT)으로 



# 내용: 가변저항을 사용해서 사용자가 직접 특정값을 입력해서 원하는 기능을 하도록 해보자.


일단 가변저항으로 어떻게 신호를 입력할 수 있을까?


이는 "전압분배법칙"을 사용해서 가능합니다.


법칙 자체를 설명하면 너무 복잡해질 것 같아서... 간단한 원리만 설명합니다.


가변저항은 총 3개의 핀으로 구성되어있고 좌/우측 끝 핀을 연결하면 전체저항값이 나오고,


끝단 중 하나와 가운데 핀을 연결하면 회전량만큼의 저항에 대한 값만 나오게 됩니다.


이걸 사용해서 좌/우끝단에 각각 +5V / GND 를 연결하고 가운데를 analog 입력에 넣으면 회전한 만큼 전압을 넣게되어


0~ 1023의 값을 입력할 수 있습니다. (analogRead() 메소드를 사용합니다)



# 코드:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
 
LiquidCrystal_I2C lcd(0x3F162);  // I2C LCD 객체 선언
const int resistorPin = A0;   //아두이노 A0 I/O에 가변저항을 연결합니다.
int sensorValue = 0;
 
void setup() {
  lcd.begin(); // lcd를 사용을 시작합니다.
  lcd.clear(); // lcd를 전부 지웁니다.
  lcd.home();  // 첫번째 줄 첫번째(좌측) 위치로 이동한다.
 
  pinMode(resistorPin, INPUT);  //resistorPin 을 입력으로 설정합니다.
}
 
void loop() {
  lcd.home();
  lcd.print("Resistor(0~1023)");
  lcd.setCursor(0,1);   // LCD 에 한자리 ~ 네자리가 표시될 때
  lcd.print("    ");    // 네자리 표시 후에 한자리~세자리 표시로 바뀌면
  lcd.setCursor(0,1);   // 마지막자리 숫자가 그대로 남아있게 되어 표기오류가 생긴다.
                        // 그래서 이 방법을 사용해서 해당 LCD칸을 초기화해준다.
  sensorValue = analogRead(resistorPin);  //analogRead()를 사용해서 아날로그 입력을 받는다.
  lcd.print(sensorValue);   //lcd에 0~1023 값을 출력한다.
  lcd.setCursor(4,1);
  lcd.print("value");
}
cs


# 회로도(Fritzing):




# 실행결과:



# 비고:


이 방법을 사용하여 가변저항입력값 (0~1023)에 범위를 주어 특정값에 특정한 액션을 취하게 할 수 있습니다. 가변저항 입력을 사용하여 구현할 수 있는 예제를 다음 글에 써보도록 할게요~



http://fritzing.org/download/




아두이노 회로도를 그리기 위해 전세계 사람들이 제일 많이 쓰는 프로그램


(과제용 / 전시용 / 포스팅 용으로 사용)


엄청 편할뿐만 아니라 시각적 효과도 아주 뛰어남

'Arduino > # Softwares' 카테고리의 다른 글

Arduino IDE (코딩 프로그램)  (0) 2018.06.08


https://www.arduino.cc/en/Main/Software




아두이노에 원하는 프로그램을 넣기 위한 프로그램

'Arduino > # Softwares' 카테고리의 다른 글

Fritzing (회로구성 프로그램)  (0) 2018.06.08

# 제목: LCD1602 IIC로 특수문자를 만들고 출력해보자.



# 내용: 알파벳이나 숫자 이외에 다른 문자를 표시하고 싶을 때 사용하는 방법이다. LCD의 한칸의 값은 가로 5칸 세로 8칸으로 총 40개의 점으로 구성되어 있다.


 만드는 법:


 1. 특수문자를 정의하자!


uint8_t character1[8] = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};


특수문자의 이름을 정의하고 (character1) 그 값에 0x0 ~ 0x1f 값을 넣어주면된다.

첫번째 값부터 맨 윗 행에 대한 값을 정해주는데, 다 꺼진 것을 0x0, 다 켜진것은 0x1f 가 된다.

0x** 는 16진수 값이기 때문에 계산해서 입력해주어야한다.


예시) 

 16

8

4

2

1

3번째 칸만 켜지는 상황: 0x4


 16

8

4

2

1

3,4,5번째 칸이 켜지는 상황: 4+2+1 -(16진수로변환)> 0x7


 16

8

4

2

1

1, 5번째 칸만 켜지는 상황: 16+1 -> 17 -(16진수로변환)> 0x11


이렇게 총 8개의 값을 넣으면 특수문자 정의는 완료된다.



2. 특수문자를 등록하자!


lcd.createChar(0, character1);


createChar 메소드를 사용하여 등록할 수 있다. 필요에 맞게 해당 특수문자를 번호로 등록하고, 위에 정의했던 특수문자의 이름을 넣어주면 된다.


예시)

lcd.createChar(1, character2);

lcd.createChar(2, heart);



3. 특수문자를 쓰자!


lcd.write(0);

lcd.write(1);


write() 메소드를 사용하여 특수문자를 사용할 수 있다!

특정 위치에 사용하고 싶으면 setCursor()메소드를 사용하면 된다.


# 예제코드:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
 
LiquidCrystal_I2C lcd(0x3F162);  // I2C LCD 객체 선언
 
uint8_t upstep0[8= {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0};
uint8_t upstep1[8= {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1f};
uint8_t upstep2[8= {0x0,0x0,0x0,0x0,0x0,0x0,0x1f,0x1f};
uint8_t upstep3[8= {0x0,0x0,0x0,0x0,0x0,0x1f,0x1f,0x1f};
uint8_t upstep4[8= {0x0,0x0,0x0,0x0,0x1f,0x1f,0x1f,0x1f};
uint8_t upstep5[8= {0x0,0x0,0x0,0x1f,0x1f,0x1f,0x1f,0x1f};
uint8_t upstep6[8= {0x0,0x0,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f};
uint8_t upstep7[8= {0x0,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f};
uint8_t upstep8[8= {0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f};
 
uint8_t rightstep0[8= {0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10};
uint8_t rightstep1[8= {0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18};
uint8_t rightstep2[8= {0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c};
uint8_t rightstep3[8= {0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e};
uint8_t rightstep4[8= {0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f};
 
int i,j,k,m,n;
 
void setup() {
  lcd.begin();
  lcd.clear();
  lcd.home();
}
 
void loop() {
  upstepfill();
  rightstepfill();
}
 
void rightstepfill() {
 
  lcd.createChar(10,rightstep0);
  lcd.createChar(11,rightstep1);
  lcd.createChar(12,rightstep2);
  lcd.createChar(13,rightstep3);
  lcd.createChar(14,rightstep4);
  
  lcd.home();
  lcd.clear();
  for(m=0;m<16;m++){
      for(n=10;n<15;n++){
        lcd.setCursor(m,0);
        lcd.write(n);
        lcd.setCursor(m,1);
        lcd.write(n);
        delay(50);
      }
  }
}
void upstepfill() {
 
  lcd.createChar(0, upstep0);
  lcd.createChar(1, upstep1);
  lcd.createChar(2, upstep2);
  lcd.createChar(3, upstep3);
  lcd.createChar(4, upstep4);
  lcd.createChar(5, upstep5);
  lcd.createChar(6, upstep6);
  lcd.createChar(7, upstep7);
  lcd.createChar(8, upstep8);
  
  lcd.home();
  lcd.clear();
  for(i=1;i>=0;i--){
    for(k=0;k<9;k++){
      for(j=0;j<16;j++){
        lcd.setCursor(j,i);
        lcd.write(k);
      }
    }
    delay(200);
  }
}

cs


# 회로도(Fritzing):



# 실행결과:



# 비고: 


현재 예제에서는 8개가 넘는 캐릭터를 등록해서 사용하기 때문에

위와 같이 특수문자를 출력할 때마다 createChar()메소드를 사용한 것을 볼 수 있습니다. 


8개 이하일 경우 setup() 함수 안에 한번만 넣어주면 되고,

8개 초과일 경우 아래와 같이 사용할 때마다 생성 후 사용하시면 되겠습니다 =)


# 제목: LCD1602 IIC 를 이용한 디스플레이 출력 기본편



# 내용: LCD에 원하는 문자/특수문자 등을 출력하는 법을 알아보자.



# 코드:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
 
LiquidCrystal_I2C lcd(0x3F162);  // I2C LCD 객체 선언
 
uint8_t diff[8]  = {0x00x40x40x1f0x40x40x00x1f}; //특수문제 제작코드 (+/-)
uint8_t heart[8= {0x00xa0x1f0x1f0xe0x40x00x0};
void setup() {
  lcd.begin(); // lcd를 사용을 시작합니다.
  lcd.createChar(0, diff);  //특수문자를 캐릭터로 만든다.
  lcd.createChar(1, heart);  //특수문자를 캐릭터로 만든다.
  
  lcd.home();  // 첫번째 줄 첫번째(좌측) 위치로 이동한다.
  lcd.print("sample");  // 좌표로 시작하여 sample 이라는 단어 출력
  lcd.setCursor(14,0);  // 첫번째줄 15번째 위치로 커서 이동한다.
  lcd.write(1);
  lcd.setCursor(151);  // 2번째(1+1)줄 16번째(15+1) 위치로 커서를 이동한다. 
  lcd.write(0);  //특수문자 사용법
}
 
void loop() {
  delay(1000);
  lcd.clear();  // lcd 화면 전체를 지운다.
}
cs


# 회로도(Fritzing):



# 실행결과:



# 비고:


 * I2C 객체 선언하는 부분에서 주소값은 기기별로/LCD별로 다를 수 있습니다.

   보통은 0x27 혹은 0x3F 둘중 하나 입력하면 LCD 표시가 될겁니다.


 * 특수문자를 직접 만드는 법은 다음 포스팅에 올리겠습니다 =)


+ Recent posts