'레트로'에 해당되는 글 2건

  1. 2019.12.01 Hardware | TIL311 Hexadecimal LED display 가지고 놀아보기 - 1 2
  2. 2019.10.15 Hardware | 레트로 led 글자판 HPDL-1414 사용기 - 1

Hardware | TIL311 Hexadecimal LED display 가지고 놀아보기 - 1

|

저는 시각적인 자극에 많이 민감합니다.

그러다 보니, 숫자 표시나 그래프 표시에 관심을 가지고 있죠.


Arduino / Sensor 취미활동을 하면서, 이 "표시" 부품들이 장바구니에 계속 쌓여가고만 있습니다.

오늘은 새로 구입한 TIL311, 또는 DIS1417 소자를 가지로 놀아보기로 합니다.




1. 구매


TIL311 은, 다른 레트로 소자들 보다는 비교적 저렴한 LED display 입니다.

비싼건 개당 8만원 하는 것 들도 있지요. 레트로 소자들 중에서는 현재 수요가 없어 생산 중단한 모델들이 비쌉니다.

이를테면 아래와 같은 부품이죠.


HCMS-2353‎



인터넷에 올라와 있는 구동 모양을 보면 엄~청 이쁜데, 요즘은 OLED 나 LED 로 대체되어 생산이 거의 없거나 조금입니다.

희소가치로 비쌉니다.


당장 고가이면서 희귀한 부품을 구입해 놀아 볼 수 없으니, 적당한 소자를 찾다가 TIL311 이라는 것을 알게 되었습니다.

개당 대략 5천원 정도... 점심 한번 안먹는다고 생각하고 구매 버튼을 눌렀습니다. 2개... ㅠㅠ


* New Promotion TIL311 Encapsulation DIP11 HEXADECIMAL DISPLAY WITH LOGIC Wholesale

https://www.aliexpress.com/item/33009753875.html







2. 도착


비싼 몸값이라 그런지, 우체국 택배로 왔습니다.



중국에서 넘어오는 소자들이 fake 가 많고, 질이 떨어지는 대체품이 오는 경우도 있기에 걱정 했습니다만, 기대했던 만큼의 퀄리티.



한국에서 생산되었다고 하네요. 한국 사이트에서는 도무지 찾을 수 없었지만. (거의가 해외 배송)



소자 안을 자세히 보면, 조그마한 LED 들과 controller chip 이 같이 있습니다.

전체적으로 레진으로 둘러 쌓여 있구요.





3. 사양


Texas Instruments 사가 생산했다 합니다.


32951.pdf

til311_datasheet.pdf

til311-e4-519224.pdf


논리 diagram 은 다음과 같습니다.

입력 받는 4개의 data line 을 통해서 decode 한 후, 정해진 숫자를 표시해 줍니다.

그래서 조그마한 칩이 밑부분에 자리잡고 있습니다.



잘 보면, 숫자 표시부분의 밑, 왼쪽 오른쪽에 점이 하나씩 있습니다.

이것도 따로 표시 가능합니다. 그래서 전류를 많이 먹습니다. (효율 안좋음)



전류가 많이 필요한지라, LED 용 V input 과, 로직 칩용 V input 이 따로 존재합니다.

그리고, 컨트롤은 Data line 에서 high / low 로 단순하게 컨트롤 할 수 있는, 단순한 구조 입니다.


표시 가능한 character 들은 다음과 같습니다. 딱 16진수 숫자만...





4. Arduino 연결 및 소스 - 1


Arduino 와의 연결에 대해서는 아래 사이트를 참고 하였습니다.


* raphaelcasimir/til311_test.ino

https://gist.github.com/raphaelcasimir/611cd8d9eff86a0bf996bd5277a12c94


연결 구성은 다음과 같습니다.


----------------------------------------------
|      FUNCTION      | TIL311 | Arduino Nano |
----------------------------------------------
| LED/LOGIC SUPPLY   | 1, 14  |      5V      |
| GROUND             |   7    |      GND     |
| LATCH STROBE INPUT |   5    |      D3      |
| BLANKING           |   8    |      D4      |
| LEFT D.P. CATHODE  |   4    |      D5      |
| RIGHT D.P. CATHODE |   10   |      D6      |
| LATCH DATA INPUT A |   3    |      D7      |
| LATCH DATA INPUT B |   2    |      D8      |
| LATCH DATA INPUT C |   13   |      D9      |
| LATCH DATA INPUT D |   12   |      D10     |
----------------------------------------------


실제 연결은 다음과 같습니다.



소스는 아래와 같습니다.


// EDUCATIONAL CODE. Do What the Fuck You Want to Public License.

// Just a quick code to explain how the TIL311 hexa display works.
// I do not have it anymore, this is just based on the datasheet so no means of testing.
// This is not object-oriented or uC-style for education purpose.

// You will have to connect pins 1 and 14 of TIL311 to Vcc (5V)
// pin 7 to ground.

// Datasheet: https://www.jameco.com/Jameco/Products/ProdDS/32951.pdf for reference.

#define LSTROBE 3 // TIL311 pin 5. If HIGH, the TIL311 will not be affected by inputs. Useful for multiplexing.
#define BLANK 4 // To pin 8. To blank the screen, can be used to modulate intensity
#define LDP 5 // To pin 4. Left decimal point, put LOW to light up
#define RDP 6 // To pin 10. Right decimal point, same

const byte dataPins[] = {7, 8, 9, 10}; // TIL311 binary inputs
// Connect to 3, 2, 13, 12, in this order, see datasheet page 2

int disp=0; // Displayed number

void setup() {
	for (int i=0; i<4; ++i){
		pinMode(dataPins[i], OUTPUT);
	}

	pinMode(LSTROBE, OUTPUT);
	pinMode(BLANK, OUTPUT);
	pinMode(LDP, OUTPUT);
	pinMode(RDP, OUTPUT);

	digitalWrite(LSTROBE, LOW);
	digitalWrite(BLANK, LOW);

	// Decimal points off
	digitalWrite(LDP, HIGH);
	digitalWrite(RDP, HIGH);
}

void loop() {
	for (int i=0; i<4; ++i){
	    digitalWrite(dataPins[i], bitRead(disp, i));
	}

	disp++; // Same as disp = disp + 1;
	
	if (16 == disp) // This is a hexadecimal display
	    disp = 0;
  
	delay(1000); // Wait one second
}


구동 결과 동영상 입니다.



예쁘죠? 아주 조그마한 LED 들이 빛나는 모습을 실제로 보면 더 좋습니다.



불 켜진 실내에서 구동시킨 동영상이 위와 같습니다.

밝은 곳에서도 잘 보이는 세기 입니다.



단순히 궁금하여, 5V input 이지만, 3.3V 를 먹여 봤습니다. 제대로 동작하지 않군요.

요즘은 저전력 디자인으로 대부분의 소자 및 OLED 가 3.3V 를 지원하지만, 이 친구는 옛날것이라 5V 에서만 동작합니다.



숫자 3을 표시 시킬 때가 저는 가장 마음에 듭니다.



숫자 0 표시시할 때 찍어 보구요.



16진수를 표시하므로 A 부터 F 까지도 표시 됩니다.



이뿌죠?




5. Arduino 연결 및 소스 - 2


Arduino 를 가지고 TIL311 을 컨트롤 하는 방법이 단순하므로, 인터넷에 공개되어 있는 소스가 조금씩 다릅니다.

아래 소개되는 소스는, 가장 간단한 방법으로 구현한 소스라 공유해 봅니다.


* Arduino and a TIL311

http://www.getmicros.net/arduino-til311.php


연결은 다음과 같아요.


----------------------------------------------
|      FUNCTION      | TIL311 | Arduino Nano |
----------------------------------------------
| LED/LOGIC SUPPLY   | 1, 14  |      5V      |
| GROUND             |   7    |      GND     |
| LATCH STROBE INPUT |   5    |      GND     |
| BLANKING           |   8    |      D6      |
| LEFT D.P. CATHODE  |   4    |              |
| RIGHT D.P. CATHODE |   10   |              |
| LATCH DATA INPUT A |   3    |      D2      |
| LATCH DATA INPUT B |   2    |      D3      |
| LATCH DATA INPUT C |   13   |      D4      |
| LATCH DATA INPUT D |   12   |      D5      |
----------------------------------------------


왼/오른쪽 점은 연결시키지 않은 소스 입니다.


/* Control */
#define BLANK_INPUT 6

/* Latches */
#define LATCH_DATA_A 2
#define LATCH_DATA_B 3
#define LATCH_DATA_C 4
#define LATCH_DATA_D 5

void display (uint8_t value) {
	/* Send data to the latch */
	digitalWrite (LATCH_DATA_A, bitRead (value, 0));
	digitalWrite (LATCH_DATA_B, bitRead (value, 1));
	digitalWrite (LATCH_DATA_C, bitRead (value, 2));
	digitalWrite (LATCH_DATA_D, bitRead (value, 3));
}

void setup () {
	// setup the pins
	pinMode (BLANK_INPUT, OUTPUT);
	pinMode (LATCH_DATA_A, OUTPUT);
	pinMode (LATCH_DATA_B, OUTPUT);
	pinMode (LATCH_DATA_C, OUTPUT);
	pinMode (LATCH_DATA_D, OUTPUT);
	digitalWrite (BLANK_INPUT, LOW);
}

void loop () {
	static byte i = 0;
	
	display (i++);
	if (i> 15) i = 0;
	delay (1000);
}


단순히 0 부터 15까지 숫자를 증가시키면서, Data line 에 들어갈 high/low 를 디코딩하여 제어합니다.

결과는 처음 소스와 완벽히 동일하여 따로 올리지 않았습니다.




6. Arduino 연결 및 소스 - 3


또 다른 예제.


* geekman/til311-tester.ino

https://gist.github.com/geekman/b5abb878443ad0cddd68aa1881602a66


연결은 다음과 같습니다.


----------------------------------------------
|      FUNCTION      | TIL311 | Arduino Nano |
----------------------------------------------
| LED/LOGIC SUPPLY   | 1, 14  |      5V      |
| GROUND             |   7    |      GND     |
| LATCH STROBE INPUT |   5    |      D13     |
| BLANKING           |   8    |      D3      |
| LEFT D.P. CATHODE  |   4    |              |
| RIGHT D.P. CATHODE |   10   |              |
| LATCH DATA INPUT A |   3    |      D12     |
| LATCH DATA INPUT B |   2    |      D11     |
| LATCH DATA INPUT C |   13   |      D10     |
| LATCH DATA INPUT D |   12   |      D9      |
----------------------------------------------


여기서도 왼/오른쪽의 dot 는 표시하지 않는 내용입니다.

아래 소스에서 MSB_PIN 과 LSB_PIN 은, 각각 D9 와 D12 라고 표시되어 있지만, 나머지 Data line 에서는 표시가 없습니다.


자세히 보면, 순차적으로 값을 조정하고 있습니다. (i--)

그래서 LATCH DATA INPUT B = D11 과 LATCH DATA INPUT C = D10 이라는 것을 알 수 있죠.

소스를 간소화하는 좋은 테크닉이라고 생각합니다.


/*
 * TIL311 / DIS1417 tester
 * 
 * MSB_PIN -> input D
 *            input C
 *            input B
 * LSB_PIN -> input A
 * 
 * also hook up LATCH_PIN and BLANKING_PIN accordingly
 * 
 * 2016.09.14 darell tan
 */

// PWM pin. try to avoid 5 & 6
#define BLANKING_PIN    3

// LSB_PIN (larger) to MSB_PIN (smaller)
#define LATCH_PIN      13
#define LSB_PIN        12
#define MSB_PIN         9

void setup() {
	for (int i = LSB_PIN; i >= MSB_PIN; i--)
		pinMode(i, OUTPUT);
	
	pinMode(BLANKING_PIN, OUTPUT);
	analogWrite(BLANKING_PIN, 0);
	
	pinMode(LATCH_PIN, OUTPUT);
	digitalWrite(LATCH_PIN, 1);
}

static void send(unsigned int data) {
	data &= 0xF;
	
	for (int i = LSB_PIN; i >= MSB_PIN; i--) {
		digitalWrite(i, data & 1);
		data >>= 1;
	}
	
	
	// strobe it
	digitalWrite(LATCH_PIN, 0);
	
	delayMicroseconds(1); // T-setup = 40ns
	digitalWrite(LATCH_PIN, 1);
}

unsigned int count = 0;
int cycleCount = 0;
int dutyCycle = 0;

void loop() {
	// adjust brightness when it hits 0
	if (count == 0 && ++cycleCount == 1) {
		cycleCount = 0;
		
		analogWrite(BLANKING_PIN, dutyCycle);
		
		dutyCycle += 50;
		if (dutyCycle > 255)
			dutyCycle = 0;
	}
	
	send(count);
	count++;
	count &= 0xF;
	
	delay(500);
}


구동 동영상은 다음과 같습니다. 소스가 좀 다른 모양이지만 완벽하게 동일한 구동이죠?






7. Arduino 연결 및 소스 - 4


또 다른 예제. 밑 좌우에 있는 dot 도 이와 켜 보는게 좋겠죠?

위 소스 중에서 가장 간단한 소스에 dot 을 점멸하는 소스를 추가해 봤습니다.


----------------------------------------------
|      FUNCTION      | TIL311 | Arduino Nano |
----------------------------------------------
| LED/LOGIC SUPPLY   | 1, 14  |      5V      |
| GROUND             |   7    |      GND     |
| LATCH STROBE INPUT |   5    |      GND     |
| BLANKING           |   8    |      D6      |
| LEFT D.P. CATHODE  |   4    |      D7      |
| RIGHT D.P. CATHODE |   10   |      D8      |
| LATCH DATA INPUT A |   3    |      D2      |
| LATCH DATA INPUT B |   2    |      D3      |
| LATCH DATA INPUT C |   13   |      D4      |
| LATCH DATA INPUT D |   12   |      D5      |
----------------------------------------------


연결은 동일하고, arduino 와 dot 부분만 추가로 연결 했습니다.


/* Control */
#define BLANK_INPUT 6
 
/* Latches */
#define LATCH_DATA_A 2
#define LATCH_DATA_B 3
#define LATCH_DATA_C 4
#define LATCH_DATA_D 5

/* Cathods */
#define CATHOD_LEFT 7
#define CATHOD_RIGHT 8
 
void display (uint8_t value) {
    /* Send data to the latch */
    digitalWrite (LATCH_DATA_A, bitRead (value, 0));
    digitalWrite (LATCH_DATA_B, bitRead (value, 1));
    digitalWrite (LATCH_DATA_C, bitRead (value, 2));
    digitalWrite (LATCH_DATA_D, bitRead (value, 3));
	
	if (value % 2) {
		digitalWrite(CATHOD_LEFT, HIGH);
		digitalWrite(CATHOD_RIGHT, LOW);
	} else {
		digitalWrite(CATHOD_LEFT, LOW);
		digitalWrite(CATHOD_RIGHT, HIGH);
	}
}
 
void setup () {
    // setup the pins
    pinMode (BLANK_INPUT, OUTPUT);
    pinMode (LATCH_DATA_A, OUTPUT);
    pinMode (LATCH_DATA_B, OUTPUT);
    pinMode (LATCH_DATA_C, OUTPUT);
    pinMode (LATCH_DATA_D, OUTPUT);
    digitalWrite (BLANK_INPUT, LOW);
	
	pinMode(CATHOD_LEFT, OUTPUT);
	pinMode(CATHOD_RIGHT, OUTPUT);
}
 
void loop () {
    static byte i = 0;
     
    display (i++);
	
    if (i > 15) i = 0;
    delay (1000);
}


숫자 증가시 2로 나누고 홀짝으로 dot 점멸을 컨트롤 했어요.



좌우 dot 들도 잘 발광하네요. 좋다~!



오른쪽도 잘 찍힙니다. 아래는 동영상 입니다.





8. What Next ?


이번에는 간단한 동작만 구현해 봤습니다.

후에 추가 4개를 더 구매하여 6개가 되면, shift register 등을 사용하여 시계를 꾸며 볼까 합니다.



And

Hardware | 레트로 led 글자판 HPDL-1414 사용기 - 1

|

1. 인류의 문명


인류의 문명 발달, 그 이전 인간의 진화에서 가장 큰 변화는 "" 이었다고 합니다.

위험을 피하고, 주위 환경을 살피며, 좋은 상대를 고르는... 수정체같은 이 "눈" 은 확실히 다른 인체 기관과 다른 부분이 있습니다.


눈으로 보는게 중요한 것은 "생존" 에 필수 이며, 현대에 와서는 "기호" 로 바뀌는 것 같습니다.

그래서인지 요즈음, 레트로 LED 에 관심이 굉장이 많아졌습니다.



어렸을 적에 멋져 보였던 기계들에서 사용되었기 때문에 그런 것일까요?




2. HPDL-1414


레트로 LED 들은 요즘도 팔지만, 더 이상 생산을 하지 않는다던지, 수요가 없어서 희소가치가 높아져 있습니다.

그래서 다들 비쌉니다. 아시죠? 제가 1만원 이상 되는거 사기 어렵다는거. (직장인의 비애)


나중에 구입하게 되면 사용기를 올리겠지만,

현재 구할 수 있는 레트로 LED 중에서는 HPDL-1414 가 가장 저렴하지 않은가 합니다.


낼름 구입해 봤습니다.


* 1pcs X HPDL-1414 HPDL1414 Four character smart digital display. Digital Tube. Free Shipping

https://www.aliexpress.com/item/32920650954.html



요즘 알리 배송은 예전만큼 느리지 않습니다.



일단 두 개 구입했습니다.



인터넷에서 돌아다니는 사진과는 조금 다른 제품 마무리 입니다만, 나름 예쁩니다.



예전부터 말레이시아에서 이런 류의 부품들이 많이 생산되는 것 같습니다.

다만, 여기에 말레이시아라고 쓰여 있지만, 정말 그런지는 아무도 모르죠.



각 표시창이 볼록하게 되어 있어서, 가시성을 높여주는 모양입니다.



회로 chip 은 수지로 막혀 있네요. 카피품이면 chip 이 다르겠지만, 동작은 오리지널과 차이 없는 듯 합니다.





3. 사양


인터넷에서 스켄 버전이 있지만, 가장 깔끔한 사양서 PDF 를 발견하게 되어, 일반 사양서와 함께, 여기에 공유해 봅니다.


dl1414-4-char-magnified-led-display-siemens.pdf

HPDL-1414.pdf


사양서 대로라면, 아래 캐릭터를 표현할 수 있습니다.





4. 연결


I2C 통신이나 컨트롤러가 없기 때문에, HIGH/LOW 특성으로 단순 표시를 시도해 봅니다.

아직 이쪽 지식이 많이 않은지라, 아래 사이트의 소스를 그대로 사용했습니다.


* HPDL-1414 Test

http://psyclesam.blogspot.com/2013/03/hpdl-1414-test.html


연결은 다음과 같습니다.


-----------------------------------------
| HPDL-1414 |  function  | Arduino Nano |
-----------------------------------------
|     1     | Data Input |      D5      |
|     2     | Data Input |      D4      |
|     3     |  WR Wrtie  |      D10     |
|     4     |Digit Select|      D9      |
|     5     |Digit Select|      D8      |
|     6     |     VCC    |      5V      |
|     7     |     GND    |      GND     |
|     8     | Data Input |      D0      |
|     9     | Data Input |      D1      |
|     10    | Data Input |      D2      |
|     11    | Data Input |      D3      |
|     12    | Data Input |      D6      |
-----------------------------------------


소스는 다음과 같습니다.


const int dTime = 25;  // delay beteewn digit writes
const int lTime = 250; // delay between loops
const int cMin = 33;   // start Decimal Ascii value 32(space) to 95 (underscore) 
const int cMax = 95;   // start Decimal Ascii value 32(space) to 95 (underscore)


void setup() {
  DDRD = DDRD | B11111111; // set direction bits for pins 7-0
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
}

void loop() {
  int asciiDec = cMin;
  while(asciiDec < cMax)  {
    // loop ascii set
    PORTD = (asciiDec);
    delay(1);                // wait for a ms 
    digitalWrite(8, HIGH);   // 8=A0 9=A1 select digit HH=3 LH=2 HL=1 LL=0
    digitalWrite(9, HIGH);   // 8=A0 9=A1 select digit HH=3 LH=2 HL=1 LL=0
    delay(1);                // wait for a ms    
    digitalWrite(10, LOW);   // Write pin Low
    delay(1);                // wait for a ms
    digitalWrite(10, HIGH);  // Write Pin High
    delay(dTime);            // delay between characters ms seconds

    PORTD = (asciiDec);
    delay(1);                // wait for a ms 
    digitalWrite(8, LOW);    // select digit
    digitalWrite(9, HIGH);   // select digit
    delay(1);                // wait for a ms
    digitalWrite(10, LOW);   // Write pin Low
    delay(1);                // wait for a ms
    digitalWrite(10, HIGH);  // Write Pin High
    delay(dTime);            // delay between characters ms seconds

    PORTD = (asciiDec);
    delay(1);                // wait for a ms 
    digitalWrite(8, HIGH);   // select digit
    digitalWrite(9, LOW);    // select digit
    delay(1);                // wait for a ms
    digitalWrite(10, LOW);   // Write pin Low
    delay(1);                // wait for a ms
    digitalWrite(10, HIGH);  // Write Pin High
    delay(dTime);            // delay between characters ms seconds  

    PORTD = (asciiDec);
    delay(1);                // wait for a ms 
    digitalWrite(8, LOW);    // select digit
    digitalWrite(9, LOW);    // select digit
    delay(1);                // wait for a ms
    digitalWrite(10, LOW);   // Write pin Low
    delay(1);                // wait for a ms
    digitalWrite(10, HIGH);  // Write Pin High
    delay(dTime);            // delay between characters ms seconds

    asciiDec++;              // increment character
    delay(lTime);            // loop delay ms seconds
  }

}




5. 동작


이미 검증하신 분을 그대로 따라 했더니만, 힘들지 않게 간단하게 표시를 시켜볼 수 있었습니다.



4개 LED 에 동일한 글짜를 표시하고, 바로 다음 글짜로 옮겨가는 단순한 구동입니다.



동영상도 올려 봅니다.

이 레트로 LED 의 매력을 느낄 수 있죠?



확대 스코프로 안을 들여다 봤습니다.

금으로 된 bonding 이랑, 발광하는(?) 소자들이 보입니다.



발광하게 되면 이렇게 보여요. 신기.





6. Reference


이번에는 간단한 동작만을 따라해 봤지만, 아래 두 사이트를 참고하여 좀더 다양한 표시 방법에 도전해 보겠습니다.

특히 I2C 를 통한 통신이 되면 편하게 문자를 표시할 수 있을것 같네요.


* Alphanumeric LED Displays Revisited

http://paul.zawada.us/2011/12/alphanumeric-led-displays-revisited.html



* Arduino Snippets: DL1414 LED Character Display

https://softsolder.com/2012/12/07/arduino-snippets-dl1414-led-character-display/


참고로, 추가 2개 더 구입함...


And
prev | 1 | next