'12 segments'에 해당되는 글 1건
- 2017.12.11 Hardware | LED bar graph 를 컨트롤 해보자 - 2
1. 12 segments
LED bargraph 를 컨트롤시에 shift register 를 사용하면, arduino의 3가지 선으로 LED 들을 조정할 수 있습니다.
다만, shift register 의 사용 가능한 pin 갯수가 8개라서 shift register 로 컨트롤 할 수 있는 LED 갯수가 8개로 한정됩니다.
지금 가지고 있는 LED bargraph 가 12 segments, 즉 12개짜리인 관계로 4개를 사용하지 못하고 있었습니다.
* Hardware | LED bar graph 를 컨트롤 해보자 - 1
- http://chocoball.tistory.com/entry/Hardware-LED-bar-graph-controlling-1
* Hardware | 74HC595 shift register 를 사용해 보자
- http://chocoball.tistory.com/entry/Hardware-74HC595-shift-register
그럼 shift register 2개를 사용하여 12 segments 전부를 사용해 보고자 합니다.
2. Pinout
12개의 LED 를 조작하기 위한 선과 shift register 끼리 연결하는 Pin, GND, Power 선 등 연결은 간단하지만,
jumper 갯수 자체는 1개의 shift register 를 사용했을 때 보다 2배 이상 많아집니다.
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 |
LED | Shift Register | Shift Register | Arduino Bargraph | SN74HC595N (1) | SN74HC595N (2) | Nano -------------------------------------------------------- anode 7 | Q1 (pin 1) | | anode 8 | Q2 (pin 2) | | anode 9 | Q3 (pin 3) | | anode 10 | Q4 (pin 4) | | anode 11 | Q5 (pin 5) | | | Q6 (pin 6) | | | Q7 (pin 7) | | | GND (pin 8) | | GND | Vcc (pin 16) | | 3.3V anode 6 | Q0 (pin 15) | | | DS (pin 14) | | D11 --> dataPin | OE (pin 13) | | GND | ST_CP (pin 12) | ST_CP (pin 12) | D8 --> latchPin | SH_CP (pin 11) | SH_CP (pin 11) | D12 --> clockPin | MR (pin 10) | | 3.3V | Q7' (pin 9) | DS (pin 14) | anode 1 | | Q1 (pin 1) | anode 2 | | Q2 (pin 2) | anode 3 | | Q3 (pin 3) | anode 4 | | Q4 (pin 4) | anode 5 | | Q5 (pin 5) | | | Q6 (pin 6) | | | Q7 (pin 7) | | | GND (pin 8) | GND | | Vcc (pin 16) | 3.3V anode 0 | | Q0 (pin 15) | | | DS (pin 14) | | | OE (pin 13) | GND | | MR (pin 10) | 3.3V | | Q7' (pin 9) | -------------------------------------------------------- |
포인트는 serial data output 을 다음 shift register 의 serial data input 으로 해주고,
latch 와 clock 은 동기를 위해 동일한 pin ( 12 / 11 ) 에 연결하는 것입니다.
그 외 LED 와 연결하는 parallel data output 은 LED 에 각각 연결하면 됩니다.
3. Layout
제대로 연결하면 잘 움직입니다.
아래 소스를 토대로 참조한 사이트의 핀 배열을 조금 바꾸었습니다.
(원래 사이트에서는 8 + 8 = 16 개 기준으로 만들어 졌슴)
4. Source code
아래는 참조한 사이트 입니다.
- http://www.instructables.com/id/Arduino-16-LEDs-using-two-74HC595-shift-registers-/
실제 코드는 아래 github 링크에 있습니다.
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 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 |
int latchPin = 8; int clockPin = 12; int dataPin = 11; int numOfRegisters = 2; byte* registerState; long effectId = 0; long prevEffect = 0; long effectRepeat = 0; long effectSpeed = 30; void setup() { //Initialize array registerState = new byte[numOfRegisters]; for ( size_t i = 0; i < numOfRegisters; i++) { registerState[i] = 0; } //set pins to output so you can control the shift register pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); } void loop() { do { effectId = random(6); } while (effectId == prevEffect); prevEffect = effectId; switch (effectId) { case 0: effectRepeat = random(1, 2); break ; case 1: effectRepeat = random(1, 2); break ; case 3: effectRepeat = random(1, 5); break ; case 4: effectRepeat = random(1, 2); break ; case 5: effectRepeat = random(1, 2); break ; } for ( int i = 0; i < effectRepeat; i++) { effectSpeed = random(10, 90); switch (effectId) { case 0: effectA(effectSpeed); break ; case 1: effectB(effectSpeed); break ; case 3: effectC(effectSpeed); break ; case 4: effectD(effectSpeed); break ; case 6: effectE(effectSpeed); break ; } } } void effectA( int speed) { for ( int i = 0; i < 12; i++) { for ( int k = i; k < 12; k++) { regWrite(k, HIGH); delay(speed); regWrite(k, LOW); } regWrite(i, HIGH); } } void effectB( int speed) { for ( int i = 11; i >= 0; i--) { for ( int k = 0; k < i; k++) { regWrite(k, HIGH); delay(speed); regWrite(k, LOW); } regWrite(i, HIGH); } } void effectC( int speed) { int prevI = 0; for ( int i = 0; i < 12; i++) { regWrite(prevI, LOW); regWrite(i, HIGH); prevI = i; delay(speed); } for ( int i = 11; i >= 0; i--) { regWrite(prevI, LOW); regWrite(i, HIGH); prevI = i; delay(speed); } } void effectD( int speed) { for ( int i = 0; i < 6; i++) { for ( int k = i; k < 6; k++) { regWrite(k, HIGH); regWrite(11 - k, HIGH); delay(speed); regWrite(k, LOW); regWrite(11 - k, LOW); } regWrite(i, HIGH); regWrite(11 - i, HIGH); } } void effectE( int speed) { for ( int i = 5; i >= 0; i--) { for ( int k = 0; k <= i; k++) { regWrite(k, HIGH); regWrite(11 - k, HIGH); delay(speed); regWrite(k, LOW); regWrite(11 - k, LOW); } regWrite(i, HIGH); regWrite(11 - i, HIGH); } } void regWrite( int pin, bool state) { //Determines register int reg = pin / 6; //Determines pin for actual register int actualPin = pin - (6 * reg); //Begin session digitalWrite(latchPin, LOW); for ( int i = 0; i < numOfRegisters; i++) { //Get actual states for register byte* states = ®isterState[i]; //Update state if (i == reg) { bitWrite(*states, actualPin, state); } //Write shiftOut(dataPin, clockPin, MSBFIRST, *states); } //End session digitalWrite(latchPin, HIGH); } |
소스를 잘 보면 16, 15, 8, 7 등의 숫자가 나옵니다.
이를 토대로 12, 11, 6, 5 등으로 12개에 맞춰서 숫자만 바꾸어 주면 됩니다.
따로 변수를 빼놓고, 자동으로 계산해서 사용될 수 있도록 하면, LED 갯수가 바뀌더라도 편할것 같습니다.
참조 사이트 말대로 "Unlimited Pins" 구조가 되겠네요.
5. 구동
아래는 멋지게 구동되는 모습입니다.
Fully! 12개의 LED 들을 모두 사용하는 모습입니다.
거참 source code 잘 짰네요.
수학적인 컨트롤 이므로, 다양한 모양으로 컨트롤이 가능할 듯 합니다.
FIN
이제 몇개의 LED 가 되었든, shift register 를 daisy chain 으로 엮으면 못할게 없겠습니다.
'Hardware' 카테고리의 다른 글
Hardware | Heating Gun 을 만들어 보자 - 1 (0) | 2017.12.14 |
---|---|
Hardware | DSO150 firmware update (0) | 2017.12.11 |
Hardware | LED bar graph 를 컨트롤 해보자 - 1 (0) | 2017.12.01 |
Hardware | 74HC595 shift register 를 사용해 보자 (0) | 2017.12.01 |
Hardware | bGeigie Nano 를 이용하여 방사능을 측정해 보자 (2) | 2017.11.24 |