'Arduino'에 해당되는 글 104건

  1. 2020.01.17 Hardware | bluetooth 모듈 SPP-C 사용해 보기
  2. 2020.01.05 Hardware | bluetooth 모듈 HC-06 / HC-05 사용해 보기 - 2
  3. 2019.12.01 Hardware | TIL311 Hexadecimal LED display 가지고 놀아보기 - 1 2
  4. 2019.11.19 Hardware | LCD2004 를 arduino 로 컨트롤 해보기 - 2
  5. 2019.11.13 Hardware | Arduino MEGA 2560 를 DIY 해보자 - 1 4
  6. 2019.10.25 Hardware | Arduino 를 DIY 해보자 - 3
  7. 2019.10.15 Hardware | 레트로 led 글자판 HPDL-1414 사용기 - 1
  8. 2019.10.12 Hardware | 공기질 측정용 MiCS-6814 센서를 사용해 보자 - 1 26
  9. 2019.10.08 Hardware | LCD2004 를 arduino 로 컨트롤 해보기 - 1
  10. 2019.10.07 Hardware | Arduino 로 Gimbal 컨트롤 하기 2

Hardware | bluetooth 모듈 SPP-C 사용해 보기

|

Bluetooth 모듈에 꽂혀 꽃혀, 한꺼번에 구입한 모듈들의 마지막 모듈인 SPP-C 확인 포스트 입니다.

지금까지 확인해 본 Bluetooth 모듀에 대해서는 아래 글을 참고해 보세요.


* Hardware | bluetooth 모듈 HC-06 / HC-05 사용해 보기 - 2

- https://chocoball.tistory.com/entry/Hardware-bluetooth-HC06-HC05-2


* Hardware | bluetooth 모듈 HC-06 / HC-05 사용해 보기 - 1

https://chocoball.tistory.com/entry/Hardware-bluetooth-HC06-HC05-1




1. SPP-C


이름도 생소한 SPP-C Bluetooth 모듈입니다.

구입처는 아래 링크에서 구입. 일반 모듈 치고는 3천원 정도로 고가네요.


* SPP-C Bluetooth serial pass-through module wireless serial communication from machine Wireless SPPC Replace HC-05 HC-06

- https://www.aliexpress.com/item/32755550889.html



사용된 main chip 은 Beken 이라는 중국 회사 제품 입니다.


* BK3231

BKDatasheet.pdf

SPP-CA HardwareGuide_chn.pdfSPP.pdf

SPP.pdf


외형은 다음과 같이 생겼어요.



사진에서 볼 수 있 듯, 사용된 breakout board 는 HC-05 / 06 과 동일한 ZS-040 이 사용 되었습니다.




2. 간단 구동


FTDI 로 연결하여 Arduino IDE 의 Serial Monitor 를 통해, AT command 로 상태 확인을 해보겠습니다.



이렇게 계속 LED 가 깜빡이면, AT command mode 라고 하네요.

Paring 이 되면, LED 가 계속 켜져 있습니다.



아래는 간단한 AT command 의 결과 입니다.

HC-05 / 06 과 다른 점은, AT 명령어 끝에 물음표 ( ? ) 를 넣지 않습니다.



AT

ready 상태 확인


AT+RESET

상태 reset


AT+VERSION

firmware version 확인


AT+LADDR

할당된 주소 표시


AT+NAME

기기 확인용 이름 확인하거나 설정


AT+ROLE

Master / Slave 확인하거나 설정


AT+PIN

Paring 시 사용 될 비밀번호 확인하거나 설정


AT+BAUD

Paring 시 사용 될 baud rate 확인하거나 설정


AT+HELP

특이하게 HELP 명령어를 지원합니다. 어떤 명령어들이 준비되어 있는지 알 수 있으니 좋네요.





3. Windows 10 과 연동


HC-05 / 06 에서 했던 OS 와 연동시켜 봅니다.



Windows 10 에서 기기를 찾을 수 있습니다.



Paring 을 위한 password 를 넣습니다. 아까 AT command 로 확인한 "1234" 겠죠?



일반 Bluetooth 기기처럼 쉽게 연결이 됩니다. 장치관리자에서 기기 등록이 완료됩니다.



연결된 Bluetooth 가, 그 모듈이 맞는지 주소도 확인해 봅니다.



Windows 에서는 COM11 로 연결되었군요.



Putty 를 이용해 접근해 봅니다. 초기 Speed Baud rate 는 9600 입니다.



Serial Monitor (FTDI 연결) 와 Putty (Serial) 접속 - 각각 다른 접근을 통해, paring 통신이 가능한지 확인해 봅니다.



서로 연결이 문제없이 되고, 문자 전송으로 통신 연결을 확인 할 수 있습니다.

동영상 첨부합니다.



HC-05/06 과 다른 점은, pairing 연결/해제에 대한 상태 및 상대 주소도 보여줍니다.


Paring 성공

+CONNECTING<<

CONNECTED


Paring 해제

DISC:SUCCESS

+READY

+PAIRABLE





4. Master / Slave 연동 준비


HC-05/06 에서 해 봤던, Master/Slave 연동을 시험해 보기로 합니다.



우선 HC-05/06 에서 통신 속도를 38400 baud rate 로 맞춰서 진행했으니, 동일하게 설정합니다.

AT 명령어는, "AT+BAUD6" 입니다.



Serial Monitor 에서 명령어 실행 후, baud rate 를 바꿔 확인하면, 정상적으로 설정 된 것을 확인.



SPP-C 를 Slave 로 이용시, 가지고 있는 주소를 알아야 Master 에서 직접 연결이 가능하므로, 주소를 따 놓습니다.

그 주소를 HC-05 Master 에 등록해 줍니다.




5. Master / Slave 연동 연결


연결은 한번 해봤던 회로를 그대로 사용.


   SPP-C  | Arduino Nano
-------------------------
    TXD   |      D10
    RXD   |      D11
-------------------------
          |     POWER
-------------------------
    VCC   |      3.3V
    GND   |      GND
-------------------------
  SWITCH  |      D2
 LED+220Ω |      D8
-------------------------


회로도도 동일.



아래와 같이 배선. 얼핏 보기엔 복잡하지만, LED 와 스위치, 그리고 TX/RX 를 연결해 주면 됩니다.



다른 분들은 쉽게 하는것 같은데, arduino 에서 전원을 끌어다 쓰면 정상동작 하지 않았습니다.

외부전원 - MB102 를 사용해야 정상 동작했습니다.



동작 확인 동영상 입니다.

Arduino 에 들어간 소스는 tactile switch 가 눌리면 Master / Slave 에 신호를 보내고,

상대 Slave / Master 에서 신호를 받으면 LED 를 high 로 만드는 소스 입니다.



소스는 이전 포스트인 아래 글에 올려 놨습니다.


    * Hardware | bluetooth 모듈 HC-06 / HC-05 사용해 보기 - 2

- https://chocoball.tistory.com/entry/Hardware-bluetooth-HC06-HC05-2




5. Master / Slave 모드 변경


검색 해보면, SPP-C 에 사용된 BK3231 는 Slave 뿐만 아니라, Master 로도 사용이 가능합니다.

"AT+ROLE1" 명령어로 Master 로 변경되어야 하나, command 결과가 OK 라 할지라도 모드 변경이 되지 않습니다.



메뉴얼을 찾아 봤습니다.



하드웨어적으로 Slave only 가 될 수도 있다고 하네요.

좀더 찾아 봤습니다. BC04-A 이지만, BC04-B 메뉴얼에 보면, PIO(4)PIO(5) 를 이용해서 모드 변경이 가능하다 합니다.



PIO(4) 를 3.3V 에 연결하면 software 변경 모드로 온다 합니다. 이렇게 하면 AT command 로 조정 가능해 보입니다.

그렇게 하면 PIO(5) 는 건들지 않아도 된다고 하네요.



27번핀이 PIO(4) 인 것이군요.


BC04-B Technical specification.pdf

BC04-B_AT_Command.pdf

BK3231_ARM968E-S.pdf

BLK-MD-BC04-B_AT-COMMANDS.pdf

DS_IM130614001_Serial_Port_BLE_Module_Master_Slave_HM-10.pdf


단, 좀 확신을 가질 수 없는게, 명확히 BC04-A 레이아웃에도 적용이 되는지 입니다.

여러 사진들을 찾아 봤으나, BK3231 이 올라간 그림에서 PIO(4) 는 여기닷! 이라고 찍혀 있는 사진이 없었습니다.



이렇게 보면, Pin 구성이 많이 다른것 같기도 하고...





6. 접점 변경


일단 BC04-B 기준으로 접점 조정을 해보기로 합니다.



배를 갈라주고...



저 노란색 화살표의 제일 오른쪽이 PIO(4) 인데, 일단 납땜이 되어 있습니다.

Slave 고정되어 있는 현재의 상태를 변경해줘야 하니, 땜 접점을 없애 주기로 합니다.



열풍기가 있으면 한방이겠지만... ㅠ.ㅠ

토스트기에 넣고 구우면서 핀셋으로 흔들어 봅니다. 효과 없군요.



RX/TX 부분이 가장 멀리 떨어져 있으니, 여기서부터 납 제거 및 보드를 살짝씩 들어 올려서 분리 시도 합니다.



잘 떨어졌는데, 위 사진의 화살표 보이는 것 처럼 동판도 들려버렸습니다. 아...



캡톤 테이프 성애자인 저는, 막아야 할 27 pin 및 혹시라도 접점이 생길것 같은 부분을 커버해 줍니다.



27 pin 을 방어한 체로, 다시 납땜.



그리고 FTDI 에 연결.

반응이 없습니다..............


FTDI 연결 모듈에 들오지 않은 불이 하나 더 들어 옵니다. 어딘가 쇼트가 되었거나 기판 (동판) 이 망가진 듯.

27 pin 을 다시 납땜 해서 접점을 만들어 줘도 동일 현상.


확실하게 망가졌네요. ㅠㅠ


SPP-C 를 Master 화 시키는 것은 실패했습니다.
오기가 발동하여, 동일한거 하나 더 구입해서 깔끔하게 다시 작업해 볼까 했습니다만,
다른 할것도 많고, 실제 구현때는 더 좋은 모듈을 사용할 것이기에 여기까지만 해보기로 타협합니다.


And

Hardware | bluetooth 모듈 HC-06 / HC-05 사용해 보기 - 2

|

일전에 구입해 놓은 bluetooth 모듈인, HC-06, HC-05, SPP-C 사용기 2탄 입니다.

첫번째 포스트는 아래 링크를 참고해 보세요.


* Hardware | bluetooth 모듈 HC-06 / HC-05 사용해 보기 - 1

- https://chocoball.tistory.com/entry/Hardware-bluetooth-HC06-HC05-1


오늘은 master/slave 두 가지 모드를 지원하는 HC-05 에 대해 알아봅니다.




1. Firmware


Wi-Fi 모듈처럼 자체 firmware 를 가지고 있습니다.

Firmware 를 최신버전으로 update 하고 싶었으나, 인터넷에서 찾기는 어렵네요.


HC-05 는 Bluetooth 계열에서는 고가면서 다기능인 RN42 로 업그레이드가 가능하다고 하지만,

저의 PCB 는 불가능한 제품임을 알게 되었습니다.


* Fake HC-05/HC-06 modules with BlueCore3 chips relabeled as BC417

https://github.com/lorf/csr-spi-ftdi/issues/25



언뜻 튜닝 요소가 많아 보이지만, 요즘 나오는 제품들은 튜닝이 불가능 한것 같습니다.




2. USB 시리얼 연결


궂이 arduino 를 통해서 연결할 필요는 없고, 직접 serial 통신으로 연결합니다.


  HC-05 | FTDI
----------------
   RX   |  TX
   TX   |  RX
----------------
        | POWER
----------------
   GND  |  GND
   VCC  |  3.3V
----------------


Arduino 를 거치지 않더라도 Arduino IDE 를 사용할 수 있습니다.

FTDI 가 연결 된 Port 만 정확하게 선택하면 Serial Monitor 를 이용하여 AT 명령어를 확인해 볼 수 있습니다.



HC-05 가 사용하는 전류량이 많은지라, arduino 나 FTDI 에서 전력을 공급하면 불안정한 모습을 보입니다.

Bluetooth 모듈도 Wi-Fi 모듈과 동일하게, 외부 전원을 이용하는 편이 좋습니다.



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





3. AT mode


HC-05 가 동작하는 mode 는 두 가지가 있습니다. 하나는 보통 mode 이고, 다른 하나는 AT mode.

Normal mode 는 LED 깜빡임이 빠르고, AT mode 는 깜빡임이 느려서 그 구분을 할 수 있습니다.


참고로 설정을 변경할 수 있는 모드가 AT mode 이고, 기본 모드가 아닙니다.


* Normal mode



* AT mode



AT mode 로 들어가는 방법은 두 가지가 있습니다.



EN pin 을 high 로 (전원 연결)

EN pin 에 대해 전원을 연결한 상태로 키면 AT mode 로 진입하게 됩니다.

어떤 제품은 그냥 켰다가, 한번만이라도 EN 에 전원을 인가해 주면 AT mode 로 접근한다 하는데, 제꺼는 처음부터 high 로 놓지 않으면 AT mode 로 진입할 수 없었습니다.


Button 를 누른 상태에서 켜기

위의 화살표 버튼을 누른 상태에서 전원을 인가하면, AT mode 로 동작합니다.

그 뒤에 손을 놔도 그대로 AT mode 를 유지합니다.





4. Command list


HC-06 과 비슷하지만 다른 부분들도 있습니다.

주로 사용하는 command 를 가지고 간단한 설명을 남겨 놓습니다.



AT+VERSION?

firmware 버전에 대해 확인합니다.

비교적 요즈음 구매해서 그런지 "VERSION:3.0-20170601" 라고 뜨네요.


AT+STATE?

커멘드 입력시의 상태를 표시해 줍니다.

"INITIALIZED" ---- initialized status
"READY" ---- ready status
"PAIRABLE" ---- pairable status
"PAIRED" ---- paired status
"INQUIRING" ---- inquiring status 
"CONNECTING" ---- connecting status
"CONNECTED" ---- connected status
"DISCONNECTED" ---- disconnected status
"NUKNOW" ---- unknown status


AT+ROLE?

Master 인지 Slave 인지 확인할 수 있습니다. Master 이면 1, Slave 면 0 입니다.


AT+ADDR?

주소 정보를 반환해 줍니다.


AT+NAME?

기기 이름을 설정하거나 알려 줍니다.


AT+PSWD?

비밀번호를 확인할 수 있습니다.


AT+UART?

Serial connect 시에 사용될 속도를 설정/확인 할 수 있습니다.



AT+CMODE?

지정된 기기와 연결 시킬 것인지, 여러 기기와 통신하게 할 지를 정할 수 있습니다.

0 이면, 지정된 기기와의 연결만 가능하고, 1 이면 다른 여러 기기와 연결시킬 수 있는 mode 입니다.


AT+BIND?

연결할 상대 기기 주소 지정.


AT+POLAR?

PIO8 / PIO9 연결 상태에 따른 LED 표시 상태를 정의한다 합니다. 무슨 이야기 인지 하나도 모르겠습니다.


AT+IPSCAN?

IP 스캔할 인터벌과 타이밍을 설정합니다.


AT+SENM?

Safe / Encryption mode 라고 합니다.


AT+ADCN?

인증을 통해 pairing 된 기기의 수를 알려 줍니다.


AT+MRAD?

가장 최근에 인증을 통해 연결된 기기를 보여줍니다.


AT+MPIO?

Multiple port output 이라고 합니다. 무슨 소리인지 모르겠습니다.


AT+CLASS?

디바이스 타이프를 보여 줍니다.


AT+IAC?

Access code 에 GIAC type (General Inquire Access Code : default 는 0x9e8b33) 을 사용.


AT+INQM?

RSSI 모드로 몇 개의 device를 최장 몇 초동안 받아들일지의 설정.


잘 쓰이지 않을 보안과 deep한 설정은 잘 모르겠네요. 기준이 되는 문서를 첨부합니다.

추가로, firmware version 에 따라 명령어가 조금씩 다를 수 있습니다.


HC-0305_serial_module_AT_commamd_set_201104_revised.pdf




5. Slave 모드로 Windows 10 과 연결해 보기


HC-06 을 가지고 놀 때도 했지만, HC-05 이니 한번 더 동일한 방법으로 Windows 10 와 연결 해 봅니다.



인식 후, 연결을 위해 암호를 입력합니다.



특별한 문제 없이 연결 되었습니다.



장치 관리자에서 확인해 보면, Bluetooth 장치에 정상적으로 등록 되었네요.



Putty 로 연결해 보기 위해 COM port 를 확인해 봅니다.



Putty 의 Serial 로 연결해 봅니다.



Putty 에서 키보드로 입력하면, Putty 상에서는 보이지 않지만, Arduino IDE 의 Serial Monitor 에서는 전송된 글씨가 보입니다.



Slave 모드로 Windows 10 에 연결에 문제가 없네요.




6. Master 모드로 Slave 연동 - firmware 설정


마지막으로, HC-05 (Master) 와 HC-06 (Slave) 를 연결하여 통신이 가능한지 확인해 봤습니다.

참고한 사이트와 너tube 정보는 다음과 같아요.


* How to Configure HC-05 Bluetooth Module As Master and Slave Via AT Command

https://www.instructables.com/id/How-to-Configure-HC-05-Bluetooth-Module-As-Master-/


* Communication between Master HC-05 and Slave HC-05
    - https://www.youtube.com/watch?v=mY803K-5WxE



구성품은 arduino / 스위치 / LED 각각 두 개씩 필요하고, Master/Slave 가 될, HC-05 / HC-06 이 필요합니다.


HC-06 Slave 설정

우선 HC-06 Slave 에서 다음과 같이 설정합니다.


- AT+ROLE=0 : Slave 설정

- AT+ADDR? : Master 에 등록하기 위해 address 를 알아 냄

- AT+UART=38400,0,0 : Serial 통신 속도를 38400 으로 맞춤



통신속도를 맞추면, Serial Monitor 의 속도도 새로운 값 - 38400 에 맟줘 줘야 확인이 가능 합니다.



HC-05 Master 설정

그 다음으로, HC-05 Master 는 다음과 같이 설정합니다.


- AT+ROLE=1 : Master 설정

- AT+CMODE=1 : pairing 할 기기를 검색하지 않고, 지정하여 등록. 등록은 아래의 BIND 명령어로 설정.

- AT+BIND=98D3,41,F93341 : 패어링 할 Slave 기기를 지정. (위에서 Slave 의 ADDR 로 확인한 주소 정보)

- AT+UART=38400,0,0 : Serial 통신 속도를 38400 으로 맞춤



최종적으로 BIND 정보를 확인하여, Slave 어드레스가 잘 등록되어 있으면 OK 입니다.





6. Master 모드로 Slave 연동 - arduino 와 연결


Pin 연결은 다음과 같습니다.

HC-05 와 HC-06 의 연결은 Master/Slave 로 기능은 다르나, 연결 방법은 동일합니다.


 HC-05/06 | Arduino Nano
-------------------------
    TXD   |      D10
    RXD   |      D11
-------------------------
          |     POWER
-------------------------
    VCC   |      3.3V
    GND   |      GND
-------------------------
  SWITCH  |      D2
 LED+220Ω|      D8
-------------------------


회로도를 Fritzing 으로 그려 봤습니다.

최근에 업데이트 된 0.9.4 로 그렸는데, 그림 export 에 버그가 있네요. (점프선에 점선)



실제 구현한 사진 입니다.



주의할 점으로는, Wi-Fi 모듈 연결 시험 했을때와 동일하게, Bluetooth 모듈도 추가 전원으로 연결해야 원활한 확인이 가능 합니다.

Arduino 로부터 빼서 사용하는 전원은 충분치 못하여 불안정한 동작을 보입니다.



위의 사진 오른쪽 밑에 있는 것이 추가 전원입니다.

Arduino 에 써넣을 sketch 는 다음과 같습니다.


Master Source


//this is master

#include "SoftwareSerial.h"

SoftwareSerial BTSerial(10, 11);
int state = 0;
const int ledPin = 8;
const int buttonPin = 2;
int buttonState = 1;

void setup() {
  BTSerial.begin(38400);
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);
  pinMode(buttonPin, INPUT);
  digitalWrite(buttonPin, HIGH);
}

void loop() {
 if(BTSerial.available() > 0) { 
    // Checks whether data is comming from the serial port
    state = BTSerial.read(); // Reads the data from the serial port
 }
 
 // Controlling the LED
 buttonState = digitalRead(buttonPin);
 
 if (buttonState == LOW) {
  BTSerial.write('1');
 } else {
  BTSerial.write('0');
 }
 
 if (state == '1') {
  digitalWrite(ledPin, HIGH); // LED ON
  state = 0;
 } else if (state == '0') {
  digitalWrite(ledPin, LOW); // LED ON
  state = 0;
 }
}


Slave Source


//this is slave

#include "SoftwareSerial.h"

SoftwareSerial BTSerial(10, 11);
int state = 0;
const int led = 8;
const int button = 2;
int buttonstate = 1;

void setup() {
  BTSerial.begin(38400);
  pinMode(led, OUTPUT);
  digitalWrite(led, LOW);
  pinMode(button, INPUT);
  digitalWrite(button, HIGH);
}

void loop() {
 if(BTSerial.available() > 0) { 
    // Checks whether data is comming from the serial port
    state = BTSerial.read(); // Reads the data from the serial port
 }
 
 // Reading the button
 buttonstate = digitalRead(button);
 
 if (buttonstate == LOW) {
   BTSerial.write('1'); // Sends '1' to the master to turn on LED
 } else {
   BTSerial.write('0');
 }  

  if (state == '1') {
  digitalWrite(led, HIGH); // LED ON
  state = 0;
 } else if (state == '0') {
  digitalWrite(led, LOW); // LED ON
  state = 0;
 }
}


여기까지 오면 모든 준비는 다 되었습니다.




7. Master 모드로 Slave 연동 - 확인


HC-05 (Master) 와 HC-06 (Slave) 끼리의 연동 통신을 위해 서로 LED 가 깜빡거리다 연결 됩니다.


Arduino 소스 및 회로에서 구성한 대로,

Master 의 스위치를 누르면, Slave 쪽의 LED 가 켜지고, Slave 의 스위치를 누르면, Master 쪽의 LED 가 점등하는 것을 알 수 있습니다.



문제 없이 서로 통신하고 있다는 것을 LED 점등으로 확인 할 수 있습니다.




8. SPP-C 연동


다음 편에서는 SPP-C 확인을 해보도록 하겠습니다.




And

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 | LCD2004 를 arduino 로 컨트롤 해보기 - 2

|

이 글은, 먼저 LCD 20x4 를 처음 사용해 본 글의 후편입니다.


* Hardware | LCD2004 를 arduino 로 컨트롤 해보기 - 1

https://chocoball.tistory.com/entry/Hardware-LCD2004-arduino-control-1




1. 이론적 배경


LCD2004 및 HD44780 을 사용하는 LCD 에 대해서는 아래 웹사이트에서 거의 완벽하게 설명하고 있습니다.


* Arduino with HD44780 based Character LCDs

http://www.martyncurrey.com/arduino-with-hd44780-based-lcds/


위의 글은 전반적인 이야기 이고, 아래에 보이는 글 두 개는, 커스텀 글짜에 대한 좀 더 자세한 이야기 입니다.


* How to generate and display self made Custom characters on 16×2 lcd

https://www.engineersgarage.com/knowledge_share/making-custom-characters-on-16x2-lcd/


An internal ​CG-RAM(character generated ram) in which we can generate or place our custom character. CG-RAM size is 64 bytes. We can generate/place 8 characters of size 5×8 at a time in CG-RAM.


* Making and displaying Custom characters on lcd with Arduino Uno and 16×2 lcd

https://www.engineersgarage.com/arduino/making-custom-characters-on-lcd-using-arduino/


CG-RAM is the main component in making custom characters. CG stands for custom generated and RAM you all know random access memory. This CG-RAM stores our custom characters once we declare them in our code. I will come on it later. As you know once we write any type of code we need a memory to store it and a controller to run it. In the 16×2 lcd custom character case its same. We write code(arrays) of character’s which we want to display on lcd. Then we store them in a memory on lcd. In our case this memory is named as CG-RAM(Character generated RAM). 


CG-RAM size is 64 Bytes. You can create 8 characters at a time and load them in cg-ram. Each character occupies 8-bytes. Eight characters each of eight byte (8-characters * 8-Bytes) is equal to 8×8=64 Bytes. CG-RAM address in lcd memory starts from 0x40(Hexadecimal) or 64 in decimal.


위의 글들을 요약하자면 다음과 같습니다.


- HD44780 을 사용하는 LCD 에서는 커스텀 글자를 만들 수 있다.

- 64 Bytes 메모리 한계로, 커스컴 글자는 8개까지만 가능.

- 어드레스는, 0x00~0x07 로 접근 가능.




2. 한땀 한땀 만들어 보기


Custom Character 제작 시, 어떤 형식으로 메모리에 올리는지를 자동으로 소스까지 생성해 주는 페이지 입니다.

이 페이지에서, 8x5 형상에 원하는 모양을 마우스로 클릭해 보면, 대충 감을 잡을 수 있습니다.


* LCD Custom Character Generator

http://maxpromer.github.io/LCD-Character-Creator/


위의 페이지를 따라해 보면, Parallel 연결 + Binary 조합으로 소스 작성은 다음과 같이 됩니다.

대문자 B 로 시작하여, 각 cell 값에 따라 도식처럼 보여줍니다.


이 블로그의 마스코트인 초코볼을 본따 봤습니다. (도트의 한계로 거의 뭐...)



Hexadecimal 로 표현할 때에는, 5자리 2진수를 Hex 코드로 만들어 줍니다. 예를 들면 아래처럼요...


B10111 = 0x17


내 머리로 계산하지 않더라도 Hexadecimal 인 "0x..." 로 표현할 수 있습니다.

코드적으로 보면, 아무래도 Hex 를 사용하는 것이 코드상 더 간결하게 됩니다.



Arduino 연결을 I2C 로 바꾸어 주면,

include 구문과 LiquidCrystal_I2C 를 I2C 접근 주소와 함께 선언할 수 있도록 소스가 추가됩니다.



소스까지 생성해 주니, 이해하기 쉽습니다.

위의 페이지를 통하여, custom character 는 어떻게 해서 생성되는 지를 감각적으로 배워볼 수 있네요.




3. 끝판 왕


한땀 한땀이 아니라, 8개 생성 가능한 메모리를 한번에 만들 수 있는 소개 자료 입니다.


* Alphanumeric LCD HD44780 - big font, big digits generator (excel sheet)

https://www.avrfreaks.net/forum/alphanumeric-lcd-hd44780-big-font-big-digits-generator-excel-sheet



EXCEL 을 이용하여, 마우스 클릭만으로 폰트를 제작할 수 있게 되어 있습니다.


* dblachut/LCD-font-generator

https://github.com/dblachut/LCD-font-generator

LCD-font-generator.xlsm


Custom Character 는 8개까지 가능하니,

all 흑백, all 흰색을 제외하면 7개를 만들고, 추가적으로 하나 더 만들 수 있는 여유가 있습니다.




4. 메모리 들여다 보기


아래 장표는 HD44780 에 기억되어 있는 코드들 입니다.

왼쪽이 아시아 버전 (일본어 가다가나가 미리 들어가 있슴) 과, 오른쪽이 유럽 버전 (뭔가 더 다채로움) 입니다.



그럼, 실제로 커스텀 글짜를 입력해 보고, 메모리에 어떤 문자가 기억되어 있는지 알아 볼 수 있는 소스가 있습니다.

해당 소스를 사용하려면 아래처럼, 관련 Library 를 인스톨 하면 됩니다.


Tools > Manage Libraries... > LiquidCrystal I2C by Frank de Brabander



위의 library 를 인스톨 하면, 예제코드를 받을 수 있습니다.


File > Examples > LiquidCrystal I2C > CustomChars



소스는 다음과 같습니다.


//YWROBOT
//Compatible with the Arduino IDE 1.0
//Library version:1.1
#include "Wire.h"
#include "LiquidCrystal_I2C.h"

#if defined(ARDUINO) && ARDUINO >= 100
#define printByte(args)  write(args);
#else
#define printByte(args)  print(args,BYTE);
#endif

uint8_t bell[8]  = {0x4,0xe,0xe,0xe,0x1f,0x0,0x4};
uint8_t note[8]  = {0x2,0x3,0x2,0xe,0x1e,0xc,0x0};
uint8_t clock[8] = {0x0,0xe,0x15,0x17,0x11,0xe,0x0};
uint8_t heart[8] = {0x0,0xa,0x1f,0x1f,0xe,0x4,0x0};
uint8_t duck[8]  = {0x0,0xc,0x1d,0xf,0xf,0x6,0x0};
uint8_t check[8] = {0x0,0x1,0x3,0x16,0x1c,0x8,0x0};
uint8_t cross[8] = {0x0,0x1b,0xe,0x4,0xe,0x1b,0x0};
uint8_t retarrow[8] = {	0x1,0x1,0x5,0x9,0x1f,0x8,0x4};
  
LiquidCrystal_I2C lcd(0x27, 20, 4); // set the LCD address to 0x27 for a 16 chars and 2 line display

void setup() {
	lcd.init(); // initialize the lcd
	lcd.backlight();
	
	lcd.createChar(0, bell);
	lcd.createChar(1, note);
	lcd.createChar(2, clock);
	lcd.createChar(3, heart);
	lcd.createChar(4, duck);
	lcd.createChar(5, check);
	lcd.createChar(6, cross);
	lcd.createChar(7, retarrow);
	lcd.home();
	
	lcd.print("Hello world...");
	lcd.setCursor(0, 1);
	lcd.print(" i ");
	lcd.printByte(3);
	lcd.print(" arduinos!");
	delay(5000);
	displayKeyCodes();
}

// display all keycodes
void displayKeyCodes(void) {
	uint8_t i = 0;
	
	while (1) {
		lcd.clear();
		lcd.print("Codes 0x"); lcd.print(i, HEX);
		lcd.print("-0x"); lcd.print(i+16, HEX);
		lcd.setCursor(0, 1);
		for (int j=0; j<16; j++) {
			lcd.printByte(i+j);
		}
		
		i+=16;
		
		delay(4000);
	}
}

void loop() {

}


위의 소스를 arduino 에 올리고, LCD 20x4 와 I2C 연결해서 얻은 결과 입니다.



Custom Character 가 잘 올라가서 표현되었습니다.

0x00 부터 0xff 까지, 내부 글짜를 모두 훑는 결과는 다음과 같습니다.



확실히 아시아 버전임을 알 수 있네요.

버전이 다르지만, 구동은 같은 HD44780 칩 이므로, 해킹을 통하여 비어있는 address 에도 쓰기가 가능할 것 같은데,

복잡할 듯 하여 그만 두기로 합니다.




5. 큰 폰트


여기까지 해 보면, 큰 폰트 사용하여 시계 등을 표현하는 방법을 대강 생각해 낼 수 있습니다.

이 글의 원래 목적이었던, 아래 그림처럼 표현해 보고자 함이었으니, 이제 커스텀 폰트를 만들어 봅니다.



위의 숫자 들을 잘 살펴 보면, 몇 가지 모양을 조합하여 큰 폰트를 만들어 낸 것을 알 수 있습니다.



유니크한 영역을 살펴 보면, 아무것도 적혀있지 않은 모양까지 포함하면, 모두 8개가 됩니다.

이렇게 딱 맞게 만들다니...


열씸히 만들어 보려고 여러가지 검색하던 중, 좋은 소스를 발견합니다.


* 4-Line LCD Big Numbers

http://woodsgood.ca/projects/2015/02/27/4-line-lcd-big-numbers/



Software RTC 를 이용하여, 시간 데이터를 가져오고, custom / big font 로 시계를 표현해 주는 소스 입니다.


//************************************************************
//             BIG FONT (4-line) LCD CHARACTERS 
//                Adrian Jones, February 2015
//************************************************************

// Build 1
//   r1 150214 - initial build with glyphs and big font character table in program memory
//   r2 150227 - added RTC support
//************************************************************
#define build 1
#define revision 2
//************************************************************

#include "avr/pgmspace.h" // for memory storage in program space

#include "Wire.h" 
#include "LiquidCrystal_I2C.h" // library for I@C interface

LiquidCrystal_I2C lcd(0x27, 20, 4);

const char custom[][8] PROGMEM = {
	{0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x0f, 0x1f}, // char 1: top left triangle
	{0x00, 0x00, 0x00, 0x00, 0x1f, 0x1f, 0x1f, 0x1f}, // char 2: upper block
	{0x00, 0x00, 0x00, 0x00, 0x10, 0x1c, 0x1e, 0x1f}, // char 3: top right triangle
	{0x1f, 0x0f, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00}, // char 4: bottom left triangle
	{0x1f, 0x1e, 0x1c, 0x10, 0x00, 0x00, 0x00, 0x00}, // char 5: bottom right triangle
	{0x1f, 0x1f, 0x1f, 0x1f, 0x00, 0x00, 0x00, 0x00}, // char 6: bottom block
	{0x1f, 0x1f, 0x1e, 0x1c, 0x18, 0x18, 0x10, 0x10}  // char 7: full top right triangle
	                                                  // room for another one!
};

const char bn[][30] PROGMEM = { // organized by row
//         0               1               2               3               4              5               6                7               8               9
    {0x01,0x02,0x03, 0x01,0x02,0xFE, 0x01,0x02,0x03, 0x01,0x02,0x03, 0x02,0xFE,0x02, 0x02,0x02,0x02, 0x01,0x02,0x03, 0x02,0x02,0x02, 0x01,0x02,0x03, 0x01,0x02,0x03},
    {0xff,0xfe,0xff, 0xFE,0xFF,0xFE, 0x01,0x02,0xFF, 0xFE,0x02,0xFF, 0xFF,0x02,0xFF, 0xFF,0x02,0x02, 0xFF,0x02,0x03, 0xFE,0x01,0x07, 0xFF,0x02,0xFF, 0xFF,0xFE,0xFF},
    {0xff,0xfe,0xff, 0xFE,0xFF,0xFE, 0xFF,0xFE,0xFE, 0xFE,0xFE,0xFF, 0xFE,0xFE,0xFF, 0xFE,0xFE,0xFF, 0xFF,0xFE,0xFF, 0xFE,0xFF,0xFE, 0xFF,0xFE,0xFF, 0x04,0x06,0xFF},
    {0x04,0x06,0x05, 0xFE,0x06,0xFE, 0x06,0x06,0x06, 0x04,0x06,0x05, 0xFE,0xFE,0x06, 0x04,0x06,0x05, 0x04,0x06,0x05, 0xFE,0x06,0xFE, 0x04,0x06,0x05, 0xFE,0xFE,0x06}
};

byte col, row, nb=0, bc=0; // general
byte bb[8]; // byte buffer for reading from PROGMEM

#include "RTClib.h"
RTC_Millis RTC;
byte hr, mn, se, osec;

//*********************** INITIAL SETUP ***********************
void setup() {
	randomSeed(analogRead(0));
	RTC.begin(DateTime(__DATE__, __TIME__));
	
	lcd.init(); // initialize the LCD
	lcd.backlight();
	lcd.begin(20, 4);
	
	for (nb=0; nb<7; nb++ ) { // create 8 custom characters
		for (bc=0; bc<8; bc++) bb[bc]= pgm_read_byte( &custom[nb][bc] );
		lcd.createChar( nb+1, bb );
	}
	
	lcd.clear();
	lcd.setCursor(4, 0);
	lcd.print(F("4-Line LARGE"));
	lcd.setCursor(4, 1);
	lcd.print(F("TIME DISPLAY"));
	lcd.setCursor(5, 3);
	lcd.print(F("V"));
	lcd.print(build);
	lcd.print(F("."));
	lcd.print(revision);
	lcd.print(F(" "));
	lcd.print(freeRam());
	lcd.print(F("B"));
	printNum(random(0,10),0);
	printNum(random(0,10),17);
	delay(5000);
	lcd.clear();
}

//************************* MAIN LOOP ************************
void loop() {
	DateTime now = RTC.now();
	hr = now.hour();
	mn = now.minute();
	se = now.second();
	
	if(se != osec) {
		printNum(hr/10,0);
		printNum(hr%10,3);
		printColon(6);
		printNum(mn/10,7);
		printNum(mn%10,10);
		printColon(13);
		printNum(se/10,14);
		printNum(se%10,17);
		osec = se;
	}
	delay(50); // not strictly necessary
}

...


소스가 좀 길어서, SyntaxHighLighter 가 커버하지 못합니다. 따로 소스파일을 올립니다.


4line_LCD_clock.txt


참고로, 사이트에 올라와 있는 소스 그대로 사용할 수가 없습니다.

제작된지 시간도 좀 흘렀고, 사용한 library 가 조금 다른 것이 원인일 듯 하네요.

그래서 소스에서 몇가지 살짝 수정하였습니다.


	lcd.init(); // initialize the LCD
	lcd.backlight();
	lcd.begin(20, 4);


debug 시, 특히 가장 시간을 많이 잡아 먹은 부분은, 위의 LCD 초기화 부분이었습니다.

원 소스에는 위의 부분이 없거나, 실행 위치가 달라 그대로 사용하면 이상한 폰트들을 마구 뿌립니다.

특히, "lcd.init()" 는 custom character 를 메모리에 입히는 전단계에서 실행되어야 합니다.


추가로, Software RTC 라이브러리가 필요합니다.


Tools > Manage Libraries... > RTClib by Adafruit




모든 준비가 완료되면 arduino 에 업로드 합니다.



역시 삽질 끝에 맛보는 행복. 동영상도 올려봅니다.



참고로, 다른 custom character 들은 숫자들 끼리 공유가 되지만, 7 숫자의 중간 꺾이는 부분에 할당된 character 는 7에서만 사용됩니다.

위의 동영상에서 7 나오는 부분을 잘 보시면 됩니다.



7에서만 사용되는 문자 형상은 위와 같습니다. 공유되기 애매한 모양이죠?

메모리 한개가 여유 있으니, 소스 원작자가 여유를 부린 듯 합니다 :-)



사무실 책상 위에, laptop 옆에 위치 시켰더니, 가독성도 좋고 시간 보는 재미가 있습니다.

사진에는 잘 표현되지 못했지만, 검은색 글씨라 눈도 편안합니다.


모두 Happy Arduino~!


And

Hardware | Arduino MEGA 2560 를 DIY 해보자 - 1

|

본 글은 arduino 를 직접 만들어 보기 DIY 시리즈 중,

Arduino Mega 2560 를 DIY 하기 위한 부품 조사와 조달에 관한 이야기 입니다.





1. Mega 2560 revision history


Arduino Mega 2560 은 개선점을 적용한 PCB 가 revision 되면서, 그 버전이 R1 > R2 > R3 로 바뀌게 됩니다.


아래 내용은 눈으로 확인 할 수 있는 PCB 변경점을 간단히 정리해 봤습니다.

부품을 구매하려면 어떤 부품들을 구매해야 하는지 정확히 알아야 하기 때문이죠.


* R1 > R2

- USB 통신을 담당하는 ATmega8U2 실장 모양이 마름모꼴로 바뀜

- ATmega8U2 용 Oscillator 주변의 저항과 캐페시터 위치가 바뀜

- Op Amp 크기가 작은 버전으로 바뀜

- Voltage Regulator 크기가 바뀜

- ATMEGA2560 chip 용 Oscillator 에 27 Ohm 저항이 하나 추가 됨




* R2 > R3

- USB 통신을 담당하는 ATmega8U2 가 ATmega16U2 으로 변경 됨 (메모리가 더 많음)

- RESET 스위치가 CPU 옆에서 USB 쪽으로 위치가 바뀜

- Resetable fuse 자세가 세로로 바뀜

- Op Amp 위치가 Oscillator 와 나란히 놓임

- Rectifier Diode 위치가 pinheader 쪽으로 이동됨

- ATMEGA2560 chip 윗쪽에 Multi-Layer Chip Inductor 와 100nF 캐패시터가 추가됨

- ATMEGA2560 chip 용 Oscillator 주변에 22pF 캐패시터와 Switching Chip Diode 가 새로 생김






2. 부품 리스트 업


보드프리 ( http://www.boardfree.kr/ ) 에서 PCB 를 신청합니다.



사실은 저번에 arduino nano 보드에 SMD 부품 올리다가 실패해버려, 이왕 새로 주문 하는 김에 Mega 2560 도 같이 주문한게 시작.

(한번 주문에 2가지 PCB를 각각 1개씩만! 요청할 수 있슴)



이 분들은 땅파서 장사하시나요? 공짜 PCB 도 모자라 미니 사과맛 쿠키까지 보내셨어요.

언젠가 한번 사무실 찾아가 아스크림을 쏴야 할까 봐요.


다만, 위에서 설명한 것과 같이 revision 이 바뀌면서, 부품들도 변경된 것도 모르고, 처음에 R3 에 대한 부품을 조사했더랬습니다.

아래는 PCB 에 관련된 파일들.


* R3 Eagle file / PDF

MEGA2560_Rev3e.brd

MEGA2560_Rev3e.sch

MEGA2560_Rev3e_sch.pdf

dimensioniMega.dxf


* BoardFree 에서 제공된 파일

BL-384(BOM).pdf

BL-384.pdf


* Reference (R1)

Arduino_MEGA2560_ref.brd

Arduino_MEGA2560_ref.sch


위의 파일들을 보면, "BoardFree 의 Mega 2560 = Reference Mega 2560" 임을 알 수 있습니다.

(사이트에도 "레퍼런스 그대로... " 라고 써있슴)


그것도 모르고 줄장 R3 버전으로 조사했네요 (1주일)

나중을 위해, 일단 R3 로 정리한 부품 리스트를 올려 봅니다.


-------------------------------------------------------------------------------------------------------
|                  name                  | value         | type                                       |
-------------------------------------------------------------------------------------------------------
| C2, C3, C4, C5, C6, C7, C8, C9, C11    | 100nF         | 0603 SMD                                   |
| C12, C16                               | 100nF         | 0603 SMD                                   |
| C10, C13                               | 1uF           | 0603 SMD                                   |
| C1, C14, C15                           | 22pF          | 0603 SMD                                   |
| PC1, PC2                               | 47uF 25V      | Aluminum Electrolytic Capacitor            |
-------------------------------------------------------------------------------------------------------
| R1, R2                                 | 1M Ohm        | 0603 SMD                                   |
| RN2                                    | 22 Ohm        | 0603 * 4 (CAY16) Resistor Network          |
| RN1, RN5                               | 10k Ohm       | 0603 * 4 (CAY16) Resistor Network          |
| RN3, RN4                               | 1k Ohm        | 0603 * 4 (CAY16) Resistor Network          |
-------------------------------------------------------------------------------------------------------
| L, ON, RX, TX                          | LED           | 0805 SMD                                   |
-------------------------------------------------------------------------------------------------------
| D1                                     | M7 (1N4007)   | Rectifier Diode                            |
| D2, D3                                 | CD1206-S01575 | Switching Chip Diode                       |
| F1                                     | 500mA 15V     | L1812 Resetable Fuse                       |
-------------------------------------------------------------------------------------------------------
| L1                                     | MH2029-300Y   | 0805 Chip Ferrite Beads                    |
| L2                                     | CV201210-100K | 0805 Ferrite Multi-Layer Chip Inductor     |
-------------------------------------------------------------------------------------------------------
| IC1                                    | LD1117S50CTR  | SOT-223 Voltage Regulator                  |
| IC3                                    |ATMEGA2560-16AU| TQFP-100 8-bit Microcontroller             |
| IC4                                    | ATMEGA16U2-MU | QFN-32 8-bit Microcontroller               |
| IC6                                    | LP2985-33DBVR | DBV SOT-23 (5) LDO Voltage Regulator       |
| IC7                                    | LMV358IDGKR   | MSOP-8 (VSSOP) LMV358 Op Amp               |
| T1                                     | PMV48XP       | SOT-23 MOSFET                              |
-------------------------------------------------------------------------------------------------------
| Y1                                     |CSTCE16M0V53-R0| 16MHz Ceramic Resonator Built in Capacitor |
| Y2                                     | 16MHz         | HC-49S Crystal Oscillator                  |
-------------------------------------------------------------------------------------------------------
| Z1, Z2                                 | CG0603MLC-05E | 0603 ESD Protector                         |
-------------------------------------------------------------------------------------------------------
| ADCH, ADCL, COMMUNICATION, POWER, PWML | 8             | single row female 2.54mm pitch pinhead     |
| JP6                                    | 10            | single row female 2.54mm pitch pinhead     |
| XIO                                    | 2X18          | double row male 2.54mm pitch pinhead       |
| ICSP, ICSP1                            | 2X3           | double row male 2.54mm pitch pinhead       |
| X1                                     | DC-21MM       | 5.5/2.1mm female DC power jack plug socket |
| X2                                     | USB B type    | USB B type female socket                   |
| RESET                                  | TS42          | 6X6X3.1mm 5 foot Switche                   |
-------------------------------------------------------------------------------------------------------


조사하면서 부품들에 대한 새로운 지식들도 습득하게 되었지만, 주문해야 할 부품들과는 차이가 있으니,

Reference (R1) 버전에 부품 리스트를 다시 정리했습니다. (주말 이틀)



다시 동일한 삽질...


-------------------------------------------------------------------------------------------------------
|                  name                  | value         | type                                       |
-------------------------------------------------------------------------------------------------------
| C2, C3, C4, C5, C6, C7, C8, C9, C11    | 100nF         | 0603 SMD                                   |
| C12, C13                               | 100nF         | 0603 SMD                                   |
| C10                                    | 1uF           | 0603 SMD                                   |
| C1, (C14, C15)*, C16, C17              | 22pF          | 0603 SMD                                   |
| PC1, PC2                               | 47uF 25V      | Aluminum Electrolytic Capacitor            |
-------------------------------------------------------------------------------------------------------
| R1, R2                                 | 1M Ohm        | 0603 SMD                                   |
| R3, R4                                 | 27 Ohm        | 0603 SMD                                   |
| RN2                                    | 22 Ohm        | 0603 * 4 (CAY16) Resistor Network          |
| RN1, RN5                               | 10k Ohm       | 0603 * 4 (CAY16) Resistor Network          |
| RN3, RN4                               | 1k Ohm        | 0603 * 4 (CAY16) Resistor Network          |
-------------------------------------------------------------------------------------------------------
| L, ON, RX, TX                          | LED           | 0805 SMD                                   |
-------------------------------------------------------------------------------------------------------
| D1                                     | M7 (1N4007)   | Rectifier Diode                            |
| F1                                     | 500mA 15V     | L1812 Resetable Fuse                       |
-------------------------------------------------------------------------------------------------------
| L1                                     | BLM21 (WE-CBF)| 0805 Wurth Elektronik Series Ferrite Beads |
-------------------------------------------------------------------------------------------------------
| Q1                                     | 16MHz         | HC-49S Crystal Oscillator                  |
| Y1                                     |CSTCE16M0V53-R0| 16MHz Ceramic Resonator Built in Capacitor |
-------------------------------------------------------------------------------------------------------
| IC2 (IC1)*                             | MC33269D-5.0  | DPACK 5V 800mA LDO voltage regulator       |
| IC3                                    |ATMEGA2560-16AU| TQFP-100 8-bit Microcontroller             |
| IC4                                    | ATMEGA16U2-MU | QFN-32 8-bit Microcontroller               |
| IC5                                    | LM358D        | SOP-8 Op Amp                               |
| IC6                                    | LP2985-33DBVR | DBV SOT-23 (5) LDO Voltage Regulator       |
| T2                                     | FDN340P       | SOT-23 MOSFET                              |
-------------------------------------------------------------------------------------------------------
| Z1, Z2                                 | CG0603MLC-05E | 0603 ESD Protector                         |
-------------------------------------------------------------------------------------------------------
| ADCH, ADCL, COMMUNICATION, PWMH, PWML  | 1X8           | single row female 2.54mm pitch pinhead     |
| POWER                                  | 1X6           | single row female 2.54mm pitch pinhead     |
| JP1+JP2+JP3+JP4+XIOH+XIOL              | 2X18          | double row female 2.54mm pitch pinhead     |
| ICSP, ICSP1                            | 2X3           | double row male 2.54mm pitch pinhead       |
| X1                                     | DC-21MM       | 5.5/2.1mm female DC power jack plug socket |
| X2                                     | USB B type    | USB B type female socket                   |
| RESET                                  | TS42          | 6X6X3.1mm 5 foot Switche                   |
-------------------------------------------------------------------------------------------------------
* C14, C15 are used only when Crystal Oscillator is used for Mega 2560 chip
* IC1 (SOT-223) can replace IC2


최종적으로 바로 위의 part list 가 구매 대상이 되겠습니다.

예전에 arduino nano / duemilanove DIY 를 준비하면서 구매했던 부품들과 동일한 부품들이 있습니다.

이번에 새로 구매해야 할 부품들만 추려서 하나씩 정리해 봤습니다.





3. Capacitors


캐페시터는 0603 SMD Capacitor 와, 47uF/25V Aluminum Electrolytic Capacitor 가 필요합니다.

우선 0603 SMD 타입은 100nF, 1uF, 22pF 이렇게 세 종류를 구입합니다.


* 100pcs 0603 SMD Chip Multilayer Ceramic Capacitor 0.5pF - 22uF 10pF 22pF 100pF 1nF 10nF 15nF 100nF 0.1uF 1uF 2.2uF 4.7uF 10uF

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



마침 아래에서 소개될 Array Resistor 판매하는 업자가 이 부품도 팔고 있어, 같이 주문합니다.



Aluminum Electrolytic Capacitor 는 이미 100uF/35V 를 가지고 있지만, 이참에 스펙대로 47uF/25V 를 구매해 보려고 했으나,

쓸때없을 것 같아서 그냥 기존꺼 쓰기로 했습니다.


* Free Shipping 20pcs SMD 50V 35V 25V 16V 10V 100UF 220UF 47UF 33UF 22UF 10UF 4.7UF 2.2UF 1UF Aluminum Electrolytic Capacitor

- https://www.aliexpress.com/item/32377971645.html



이전 Duemilanove 에서 사용했던 그놈입니다.






4. 0603 SMD Resistor


저항은 0603 SMD 타입 저항과 Array Resistor 형태의 저항이 필요합니다.

우선 0603 SMD 타입은 아래 링크에서 구입했습니다.


* 0603 SMD Resistor Kit Assorted Kit 1ohm-10M ohm 5% 36valuesX20pcs=720pcs 1608 Sample Kit Sample bag

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



잘 도착했구요.



저항 값은 모두 간략화해서 표기되어 있습니다.



하지만, 아쉽게도 27 ohm 딱 하나가 포함되어 있지 않네요.

할 수 없이, 0603 SMD 27 ohm 만 따로 구입합니다.


* 100pcs 0603 SMD 1/8W chip resistor resistors 0 ohm ~ 10M 0R 1K 4.7K 4K7 10K 100K 1 10 100 220 330 ohm 0R 1R 10R 100R 220R 330R

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


도착 예의 샷.



요놈 하나때문에 따로 구매.






5. Array Resistor


Resistor Network 라고도 불리는 것 같습니다.


* Array Resistor

http://www.samsungsem.com/global/product/passive-component/chip-resistor/array/index.jsp



0603 SMD 4개를 붙여, 더 소형화 시킨 resistor network 이네요.


부품 어디에 납땜하느냐에 따라 아래와 같이 몇 가지로 구분됩니다.

주의해야 할 부분은, Mega 2560 사양서에 보면 RN 으로 시작되는 이름이지만, 사실 아래 그림에선 RP 모양입니다.



Array Resistor 또는 Resistor Network 은 처음보는 것이라, 정확한 칫수를 알아야 합니다.

AliExpress 에서는 "0603 x 4" 라고 표시되는데, 이게 사양서에 보이는 CAY16 와 같은 것인지를 확인해야 했습니다.


아래는 CAY16 에 대한 사양서 칫수 입니다. "3.20 x 1.60" 사이즈인 듯 합니다.


CATCAY.pdf



AliExpress 에서 판매되는 "0603 x 4" 제품의 사양이 그려진 사진을 캡춰해 봅니다.



빙고! CAY16 과 "0603 x 4" 는 동일한 사양이네요. 최종적으로 아래 제품을 구매하면 될 것 같습니다.


* 100pcs 0603*4 8P4R 2*4P Network Resistor SMD array 0 ~ 910 ohm 1K ~ 910K 2K 2.2K 4.7K 10K 22K 47K 100K 1M 1 10 100 220 470 ohms

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



22, 10k, 1k 세가지를 구입합니다.



4개의 저항이 하나로 묶여 있는 모습은 예쁩니다.






6. Ferrite Beads


페라이트는 고주파 간섭을 없애주는 역할을 합니다.


Ferrite beads, or ferrite chokes, are used as low pass filters to eliminate high frequency noise while allowing low frequency signals or DC current to pass through a circuit. The noise may come from any number of sources including high-frequency switching noise from a power-supply circuit or RF noise in an RF signal-isolation circuit that must be minimized to ensure both signal integrity and antenna efficiency.


어떤 사람은 PCB 에서 Ferrite bead 가 망가졌다고 아래 사진처럼 Ferrite 코어를 이용해 직접 만든 사람도 있습니다.


* component replacement arduino mega

https://forum.arduino.cc/index.php?topic=355192.0



Arduino Mega 2560 에 사용되는 Ferrite Bead 는 다음 부품 정도면 적당할 것 같습니다.

(사양서에는 정확한 값이 표시되어 있지 않음)


* BLM21PG221SN1D (2A tolerant component in an 0805 package)

ENFA0005-1485072.pdf


... 라고 생각했지만, 곰곰히 따져보니, R3 에 사용된 MH2029-300Y 가 보다 좋은게 아닐까 합니다.

급선회 해서 MH2029-300Y 를 구매키로 합니다.


* MH2029-300Y (30 Ohms @100MHz 1 Power, Signal Line Ferrite Bead 0805 (2012 Metric) 3A 25mOhm)

mh.pdf


* (10PCS/lot)0805 MH2029-300Y

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




소자 표면에 표기가 없어서 나중에 헷갈릴 수 있을것 같아요.






7. Oscillator / Resonator


Resonator 라고도 합니다.

기본 클럭을 만들어서 microprocessor 가 명령어를 실행하게끔 해주는 진동 소자 입니다.

종류로는 Crystal 을 사용하는 것과 Ceramic 을 사용한 것이 있습니다.


정확성으로는 Ceramic 보다 Crystal 이 더 좋다고 합니다.


그래서 그런지, 판매되는 모든 arduino Mega 2560 보드들은, USB를 담당하는 ATmega8U2 chip 에 Crystal Oscillator 를 붙여 놨습니다.

PCB 리비전이 바뀌더라도요. 그 이유로는 USB 통신이 클럭에 매우 민감하다고 합니다.


다만, 실제 PCB 에는 USB controller chip 에도 Ceramic 을 실장할 수 있도록 배선이 되어 있습니다.



참고로, schematic 에서 확인해 보면, oscillator 양쪽 단자에 capacitor 가 물려 있는 것을 확인할 수 있습니다.

Oscillator 를 controller chip 에 연결할 때에는 capacitor 가 필수 인거죠.



단, ceramic oscillator 는 capacitor 가 built-in 되어 있고, crystal oscillator 는 따로 capacitor 를 달아 줘야 합니다.

아래 schematic 은, 어떤 부품을 쓰던 capacitor 는 꼭 필요하다라는 것을 보여주고 있습니다.



여기도요.



Ceramic Resonator 사양에도 "built-in" 이라고 표시되어 있습니다.



Ceramic Resonator 사양서의 "Application Circuits Utilization" 을 보면,

controller chip 과 붙일 시, capacitor 의 필요성을 표시하고 있습니다. Ceramic Resonator 는 capacitor 가 built-in 인데도 말이죠.


* Application Circuits Utilization

1506176.pdf



즉, crystal oscillator 를 붙이는 경우는 capacitor 가 같이 붙여야 하고, ceramic resonator 를 붙이는 경우는 capacitor 가 필요 없습니다.

부품 주문과 실장시에 이 부분을 유념해야 겠죠?


Crystal oscillator 는 이미 가지고 있으므로, ceramic resonator 만 구입합니다.


* 10PCS 16MHZ CSTCE16M0V53-R0 3.2*1.3 SMD Crystal

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



휴... 이 oscillator / resonator 를 정하는 것이 가장 힘들었습니다.



소형화에는 필수인 ceramic oscillator 입니다.



급박이 되어 있는 3개 다리.






8. ATMega2560


Arduino Mega 2560 의 심장인 중앙 컨트롤러 입니다.


* ATmega2560

Atmel-2549-8-bit-AVR-Microcontroller-ATmega640-1280-1281-2560-2561_datasheet.pdf


아래 링크를 통해 구매했습니다.

* 1pcs/lot ATMEGA2560 ATMEGA2560-16AU LQFP-100 In Stock



다만, 위의 업자는 두 번에 걸쳐서 완전 다른 CPU 를 보내 왔습니다. Dispute 해서 환불...



한달여 이상 걸려서 보내준 부품은 ALTERA...



그 다음 보내준 것은, XILINX...



담당하는 사람이 부품을 모르는 것인가? 언제 필요하게 될지 모르겠지만, CPU가 두 개 더 생겼습니다.



그나저나 위의 필요없는 CPU 는 어쩔.


* 1PCS ATMEGA2560-16AU ATMEGA2560 16AU QFP IC

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



결국 위에서 주문한 것이 도착.



구글링 해서 찾은 동일 CPU 들과 비교시, 마킹이 조금 얇습니다.



다만 깔끔한 프린팅.



아랫면까지 선명한 마킹인 것을 보면 정품인 듯, 하면서도 아닌듯 하고.


* 1 Piece IC Chip ATMEGA2560-16AU ATMEGA2560 MEGA2560 SOP Original Integrate Circuit Chip

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



이미 주문 넣었는데, 장바구니에 남아있던 다른 판매자 제품을, 출근 중 비몽사몽 간에 하나 더 주문해 버립니다.



아핫! ATmega2560 이 하나 더 생겼어! (싸지도 않은거...)



음? 근데 이게 더 정품같은데?



실 사용은 이걸로 하기로 합니다.




9. ATMega16U2


USB controller chip 인 ATmega16U2 입니다.


doc7799.pdf


원래는 한단계 아래 사양인 ATmega8U2 를 사용하도록 디자인 되어 있으나, 메모리 용량이 더 크고 최신 버전인 16U2 를 사용하지 못할 이유가 없습니다.


* Original 1 Pcs ATMEGA16U2-MU MEGA16U2-MU ATMEGA16U2 MEGA16U2 ATMEL QFN32 100% 8 Bit AVR Micro Controller QFN32 Singlechip IC

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



ATmega2560 chip 과 가격 비교를 해보니, 그리 차이나지 않는군요.



귀여운 녀석입니다.



앙증맞은 뒷면이구요.



납땜하기가 괜찮을까... 걱정이 좀 됩니다.




10. LDO Voltage Regulator


이 소자는, 입력과 출력 전압이 크지 않을 때 사용되고, 노이즈 발생이 적으며, 크기도 작은게 장점이라고 합니다.


A low-dropout or LDO regulator is a DC linear voltage regulator that can regulate the output voltage even when the supply voltage is very close to the output voltage.


The advantages of a low dropout voltage regulator over other DC to DC regulators include the absence of switching noise (as no switching takes place), smaller device size (as neither large inductors nor transformers are needed), and greater design simplicity (usually consists of a reference, an amplifier, and a pass element). The disadvantage is that, unlike switching regulators, linear DC regulators must dissipate power, and thus heat, across the regulation device in order to regulate the output voltage.


구매할 소자는 LP2985-33DBVR 입니다.
눈으로 보면 엄청 작은데, 이런 package 가 DBV 또는 SOT-23 (5) 이라고 하네요.


알리에서는 아래 링크에서 구매했습니다.

* 10pcs LP2985 LP2985-33DBVR IC REG LDO 3.3V 0.15A SOT23-5



도착은 평범.



최소형 voltage regulator 처럼 생겼습니다.






11. P-Channel MOSFET


정식 명칭은 Single P-Channel, Logic Level MOSFET 이고, 간단히 말하면 P-Channel MOSFET 입니다.


FDN340P-D.PDF


Arduino Mega2560 은 USB 와 Power Jack 에서 5V 전원을 받는데,

이 두 개가 동시에 연결될 경우, USB 전원을 차단하고 Power Jack 전원을 활성화 하기 위한 스위치 기능을 구현합니다.

참고로, 중간에서 판단자 역할을 해주는 소자는 LM358D Op Amp 이며, comparator (비교기) 기능을 제공합니다.


LM358D 는 이미 구매해 놓은게 있으므로 이번에는 FDN340P 만 구매합니다.

... 라고 하려 했지만, R3 버전에서 새롭게 사용된 PMV48XP 로 바꿔 달아 보기로 합니다. (용량이 더 큼)


PMV48XP.pdf


* PMV48XP SOT23 silk-screen KNW P channel 20 v 3.5 A MOS tube

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



점점 집안이 부품들로 넘쳐나기 시작했어요.



소형화는 숙명입니다.





12. ESD Protector


정전기나 그와 비슷한 큰 전압이 갑짜기 걸렸을 경우 보호해 주는 소자라고 보면 되겠습니다.

Arduino Mega 2560 에서는 USB의 두 개 data line (D2, D3) 에 연결됩니다.


사용 될 CG0603MLC-05E 제품 메뉴얼을 보면, ESD 에 대한 설명이 다음과 같이 되어 있습니다.


cg0603mlc-05e_cg0603mlc-12e.pdf


----------------------------

An ESD protection device protects a circuit from an Electrostatic discharge (ESD), in order to prevent a malfunction or breakdown of an electronic device.

----------------------------


* Free shipping 100pcs/lot CG0603MLC-05E package 0603 ESD Suppressors original Product

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



국내에서 10개만 구매해도 배송료 합하면 위의 가격보다 더 비쌉니다.

그냥 100개라도 위의 AliExpress 링크에서 구매합니다.



100개 언제 다 써...





13. RESET


4발짜리 SMD switch 는 가지고 있지만, 5발짜리는 없습니다. 그럼 주문해야죠.


* 20PCS 6*6*2.5/2.7/3.1/3.4/4.3/5/5.5mm 6x6x2.5-5.5mm 4/5 Foot Microswitch SMD Push Button Switches Tact Switch 4/5 Foot Patch

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



이것도 언제 다 써...



보통 빨간색을 많이 사용하므로, 저는 검은색으로 주문했어요.





14. Pinheader


Pinheader 는 몇 종류는 가지고 있지만, female dual row 는 없기에 구입합니다.


* 2.54mm Double Row Female 2~40P Breakaway PCB Board Pin Header socket Connector Pinheader 2*2/3/4/6/10/12/16/20/40Pin For Arduino

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



뭉텅이로 왔습니다.



Pin header 는 쓸 곳이 많아, 다다익선.





To Be Continued...


짬짬이 시간을 내서 조사하고 정리했더니만 10일정도 걸려버렸습니다.

모두 도착 했으니, 이제 조립하고 bootloader 를 올려 보기로 합니다.


다만, 이 포스트가 너무 길어졌으니, 다음 포스트에서 마무리 하겠습니다.


And

Hardware | Arduino 를 DIY 해보자 - 3

|

이 글은 아래 Arduino 를 직접 만들어보는 작업의 3편이 되겠습니다.


* Hardware | Arduino 를 DIY 해보자 - 1

http://chocoball.tistory.com/entry/Hardware-Arduino-DIY-itself-1


* Hardware | Arduino 를 DIY 해보자 - 2

http://chocoball.tistory.com/entry/Hardware-Arduino-DIY-itself-2




0. Duemilanove


저번에 실패한 Arduino Nano 는 뒤로 하고, 이번에는 Duemilanove 입니다.


위는 정품 layout 이고, 밑에 사진이 이번에 작업할 보드 입니다.






1. Part list


Arduino Duemilanove 에 들어가는 부품 리스트 입니다.

아래 리스트는 보드프리의 PDF 파일과 arduino 사이트에서 EAGLE 파일을 참고하였습니다.


* 보드프리

BL-381(BOM).pdf

BL-381(duemilanove).pdf

* Arduino

arduino-duemilanove-schematic.pdf

arduino-duemilanove-reference-design.zip


-------------------------------------------------------------------------------------------------------
|                  name                  | value         | type                                       |
-------------------------------------------------------------------------------------------------------
| C1, C4, C5, C8, C9, C10, C11, C12, C13 | 100nF         | 0805 SMD                                   |
| C2, C3                                 | 22pF          | 0805 SMD                                   |
| C6, C7                                 | 100uF 35V     | Aluminum Electrolytic Capacitor            |
-------------------------------------------------------------------------------------------------------
| R1, R10, R11                           | 10k Ohm       | 0805 SMD                                   |
| R4, R5, R6, R7, R8, R9                 | 1k Ohm        | 0805 SMD                                   |
| L, PWR, RX, TX                         | LED           | 0805 SMD                                   |
-------------------------------------------------------------------------------------------------------
| D1                                     | M7 (1N4007)   | Rectifier Diode                            |
| F1                                     | 500mA 15V     | L1812 Resetable Fuse                       |
-------------------------------------------------------------------------------------------------------
| J1, J3                                 | 8             | single row female 2.54mm pitch pinhead     |
| J2, POWER                              | 6             | single row female 2.54mm pitch pinhead     |
| ICSP                                   | 6             | double row male 2.54mm pitch pinhead       |
| S1                                     | B3F-10XX      | OMRON B3F-10XX series switch               |
| X2                                     | DC-21MM       | 5.5/2.1mm female DC power jack plug socket |
| X4                                     | USB B type    | USB B type female socket                   |
-------------------------------------------------------------------------------------------------------
| IC1                                    | ATMEGA328P-PU | DIP28 8-bit Microcontroller                |
| IC2                                    | FT232RL       | SSOP28 USB UART interface IC               |
| IC4                                    | MC33269D-5.0  | 5V 800mA LDO voltage regulator             |
| IC5                                    | LM358D        | SOP8 Op Amp                                |
| Q2                                     | 16MHz         | HC-49S crystal oscillator                  |
| T1                                     | NDT2955       | SOT-23 MOSFET                              |
-------------------------------------------------------------------------------------------------------
| R2                                     | 100_NM        | no need to implement "no-mount"            |
| RESET-EN                               | jumper        | "auto-reset" on ATmega168                  |
| X3                                     |   JP4         | use like FTDI breakout board               |
-------------------------------------------------------------------------------------------------------


이제 위의 리스트를 가지고 하나씩 구매한 이력을 남겨 봅니다.


그냥 arduino duemilanove 하나 사면 3천원대에서 clone 제품을 구할 수 있으나,

이참에 준비하면서 부품들도 구해보고, 사용법도 알아보고 공부하기 위한 목적으로 진행했습니다.





2. Pin Header


외부 기기와 연결되기 위한 Pinout 용 Header 입니다.


기존에 보유하고 있는 긴 한줄읠 pin header 를 잘라서 사용할 수 있으나, 지저분해 질 수 있고,

깔끔하게 보이고 싶어서 궂이 구입했습니다.


* Single row female 2.54mm Pitch PCB Female Pin Header Connector Straight Single Row 2/3/4/5/6/7/8/9/10/11/12/13/14/15/16/20/40Pin

https://www.aliexpress.com/item/Single-row-female-2-54mm-Pitch-PCB-Female-Pin-Header-Connector-Straight-Single-Row-2-3/32838866439.html



도착은 주문한데로 6pin 용과 8pin용, 10개씩 배달되었습니다.



요로코롬 생겼습니다.






3. Fuse


실장되는 Fuse 는 전기적인 규격이 동일하고, 과전류가 흐른 뒤 다시 스스로 복구되는 Self Healing (Self Resetting) Fuse 입니다.


* 20PCS/LOT 1812 SMD SMD self-healing fuse 0.5A 500mA 15V MF-MSMF050-2

https://www.aliexpress.com/item/20PCS-LOT-1812-SMD-SMD-self-healing-fuse-0-5A-500mA-15V-MF-MSMF050-2/32842202101.html



무리없이 도착.



수령한 제품은 웹사이트에서 본 사진과는 다르지만, 한번 믿고 써보기로 합니다.





4. Oscillator


CPU를 돌리고 명령어를 전달하는 역할을 하는 oscillator 입니다.


* hc-49s Crystal Oscillator electronic Kit resonator ceramic quartz resonator hc-49 DIP 7 kinds X 5pcs 32.768K 4 8 12 16 20 25 MHZ

https://www.aliexpress.com/item/hc-49s-Crystal-Oscillator-electronic-Kit-resonator-ceramic-quartz-resonator-hc-49-DIP-7-kinds-X/32844442076.html



필요한건 16 Mhz 이지만, 낱개로 파는 경우는 없어서 세트로 구매합니다.



요로코롬 생겼네요.






5. LED


아래 링크의 제품을 구매하면 필요한 색깔이 모두 들어 있습니다.

* 100pcs=5colors x 20pcs 5050 5730 1210 1206 0805 0603 LED Diode Assortment SMD LED Diode Kit Green/ RED / White / Blue / Yellow




이왕이면 한꺼번에 받기위해 한 업체에 몇가지를 같이 주문하였습니다.



왠지 LED 부품은 받을때마다 기분이 좋습니다.






6. Capacitor


Capacitor 는 세라믹과 둥그런 알루미늄 캡 캐패시터 두가지를 사용합니다.


* MCIGICM 100pcs 0805 smd capacitor ceramic 22pf 100nf 1uf 2.2uf 4.7uf 10uf 47uf 22uf capacitors kit sets 0.5pF-47uF


부품이 많다 보니, 10uF 은 빼고 처음 주문을 넣어버려, 다른거 주분할 때 같이 주문했습니다.



0805 SMD 버전이라 100개씩 묶음이라고 해도 배송 용량이 적네요.



알루미늄 캡 캐패시터는 LED 구입한 업체에서 같이 구입해서 이미 도착했습니다.


* Free Shipping 20pcs SMD 50V 35V 25V 16V 10V 100UF 220UF 47UF 33UF 22UF 10UF 4.7UF 2.2UF 1UF Aluminum Electrolytic Capacitor


100uF 35V 버전입니다. 사양서에는 25V로 정의되어 있으나, 보다 더 넓은 영역에서 동작할 수 있는 35V 를 구매.
여러 사이트를 뒤져봐도 캐패시터 용량 큰거는 문제 없다고 합니다.





7. Resistor


저항은 1K 와 10K 두가지가 필요합니다.


* 20Value * 20PCS =400PCS 0805 SMD Resistor Kit 1% 1/8W (10 ohm~1M ohm) component diy samples kit free shipping


위의 세트구성은 다음과 같습니다.

10R / 22R / 47R / 100R / 220 / 470R / 750R / 1K / 2K2 / 4K7 / 6K8 / 10K

22K / 47K / 75K / 100K / 220K / 470K / 750K / 1M



* 2000pcs 0805 SMD Resistor Kit Assorted Kit 1ohm-1M ohm 5% 80valuesX 25pcs=2000pcs Sample Kit

https://www.aliexpress.com/item/5-0805-SMD-resistor-pack-80-kinds-of-commonly-used-precision-resistor-for-each-25-Total/32297723532.html



위의 세트구성은 다음과 같습니다.


10 / 100 / 1K / 10K / 100K

12 / 120 / 1K2 / 12K / 120K

15 / 150 / 1K5 / 15K / 150K

20 / 200 / 2K / 20K / 200K

22 / 220 / 2K2 / 22K / 220K

27 / 270 / 2K7 / 27K / 270K

30 / 300 / 3K / 30K / 300K

33 / 330 / 3K3 / 33K / 330K

39 / 390 / 3K9 / 39K / 390K

47 / 470 / 4K7 / 47K / 470K

51 / 510 / 5K1 / 51K / 510K

62 / 620 / 6K2 / 62K / 620K

68 / 680 / 6K8 / 68K / 680K

75 / 750 / 7K5 / 75K / 750K

82 / 820 / 8K2 / 82K / 820K

91 / 910 / 9K1 / 91K / 910K



엄청 작네요. 이것이 0805 SMD 저항이군요.






8. Switch


이전 Wi-Fi 모듈을 firmware upgrade 하기 위해 구입한 tactile switch 에 포함되어 있어,
이번에 추가로 구입하지 않았습니다.

* Hardware | 스위치 부품 구매하기


* Smart Electronics 10 Kinds of Tactile Switches Push Button SMD Tact Switch Switch 100pcs


도착한 PCB 에 필요한 부품은 through hole 부품이네요.
SMD 부품도 같이 있어서 필요시에는 SMD 버전을 사용해도 될 것 같습니다.




9. Diode


M7 은 1N4007 이라는 diode 의 별칭인 것이라는 것을 처음 알았습니다.

* 7 kinds*10pcs=70pcs/lot SMD diode package / M1 (1N4001) / M4 (1N4004) / M7 (1N4007)/ SS14 US1M RS1M SS34 KIT



LED 도착시 같이 왔습니다. 생각보다 이것도 크기가 꽤 작네요.






10. FT232RL


USB 통신을 위한 controller 입니다.

ATmega328P 는 CPU 자체에 USB 컨트롤러 부분이 없어서 이렇게 추가 USB controller chip 이 필요합니다.


참고로, Arduino Micro 에 사용되는 ATmega32U4 는 내장 USB controller 가 있어,

이렇게 추가 USB controller chip 이 필요 없습니다.


* 5pcs/lot New FT232RL FT232 FTDI USB FS SERIAL UART SSOP28 serial chips imported original In Stock


이제야 chip 들이 도착하는군요.



이번에 구입한 FTDI chip 은 마킹이 깔끔해 보여서 흔한 fake chip 은 아닌 듯 합니다.

모두 조립 후, 한번 확인해 볼께요.






11. Voltage regulator


5V 800mA 용량의 레귤레이터 입니다.

좀더 큰 용량으로 하고 싶었으나, 이쪽 지식이 충분치 않고, 과전류시 chip 들의 안전이 보장되지 않기에 스펙대로 구매했습니다.


* Free shipping 10pcs/lot MC33269DT-5.0G 5V .8A MC33269DT-5. 33269DT MC33269DT 33269DT MC33269 MC33269DT-5.0RKG

https://www.aliexpress.com/item/Free-shipping-5pcs-lot-MC33269DT-5-0G-5V-8A-MC33269DT-5-33269DT-MC33269DT-33269DT-MC33269-MC33269DT/32826048602.html



배송 포장 표기는 Cable Tools... 무엇?



전압/전류 관련 부품이다 보니, 다른 부품들보다 크기가 큽니다.






12. DC power jack plug socket

일전에 Transistor Tester 를 DIY 할 때, power jack 의 안쪽 심 두께가 달라서 기존 adapter 들을 사용 못하는 상황이 있었습니다.
결국 맞는 사양으로 이식했고, 그 뒤로 내경이 2.1mm 용으로만 통일하고 있습니다.

다행히 Duemilanove 스펙에도 5.5/2.1mm 사양으로 되어 있네요.

* 10Pcs PCB Mount 5.5 x 2.1 mm Female DC Power Black Jack Plug Socket Connector G08 Drop ship


잘 도착했구요.


내경도 2.1mm 인듯 하구요.


기존 DC adapter 에도 잘 맞습니다.



PCB 에도 맞춰 보니 문제 없네요.






13. ATmega328P

드디어! main chip 인 ATmega328P 입니다.

* 1PCS ATMEGA328P-PU DIP28 ATMEGA328-PU DIP ATMEGA328P U DIP-28 328P-PU new and original IC



중요 부품이지만, 그런거 없습니다. 여타 부품처럼 평이하게 도착했습니다.



선명하게 CPU 마킹이 되어 있습니다. Socket 이랑 같이 찍어봤습니다. 이쁘다...






14. DIP28 Socket

ATmega328P 을 얹일 DIP28 socket 입니다.

* 5pcs DIP-28 Round Hole 28 Pins 2.54MM DIP DIP28 IC Sockets Adaptor Solder Type 28 PIN 2.54 IC Connector

https://www.aliexpress.com/item/10pcs-Round-Hole-28-Pins-2-54MM-DIP-IC-Sockets-Adaptor-Solder-Type-28-PIN-2/32799885322.html




구멍이 round hole 과 lead 방식이 있습니다.

자주 chip 을 뺏다 꼈다 할 경우에 round hole 이 장점이 있고, lead 방식은 오랜동안 그냥 놔둘 경우 좋다고 합니다.


사실 lead 방식이 접점이 확실합니다.

다만, 이왕 하는 김에 고급지게 해보고자 round hole 타입을 구매해 봤습니다.

round hole 은 금속 다리 부분이 주조 방식으로 제작되므로 좀더 비쌉니다. 그리고 점점도 나쁘지 않아요.



PCB 에 잠깐 얹어 봤습니다. 아주 부드럽게 잘 맞습니다.






15. SOP8 OP AMP

다리가 8개인 OP AMP 입니다.


* 50PCS LM358DR SOP8 LM358 SOP LM358DT SOP-8 SMD LM358DR2G new and original IC

https://www.aliexpress.com/item/10PCS-LM358DR-SOP8-LM358-SOP-LM358DT-SMD-LM358DR2G-new-and-original-IC-free-shipping/32533323519.html



ATmega328P 과 함께 도착한 부품입니다.






16. SOT-23 MOSFET

Transistor 의 digital 버전이라고 불릴 수 있는 MOSFET 입니다.


* HMICICAWK Original 100% NEW 2955 NDT2955 SOT-223 10PCS/LOT

- https://www.aliexpress.com/item/NDT2955-DT2955-T2955-2955-SOT-223-Original-100-NEW-10PCS-LOT/32734398979.html



씌여진 문구에 SOT-223 이라고 되어 있습니다만, 배송된 것은 DPAK 버전으로 큰게 왔습니다.



크고 좋아보입니다만 보드에 맞질 않습니다.



Dispute 환불을 걸고 다른 업자에게 주문했더니만, SOT-233 버전을 또 보냈더랬습니다.



마킹이 조금 이상합니다만 문제 없겠죠?



다시 보낸다는 이야기가 없어, 다른 판매자에게 이미 주문을 또 했더랬습니다.


* BQ24040DSQR AP3608EG-G1 SN74LVC2G66DCTR NDT2955 MMFT2955 NTF2955 SP202EEN IR2153S STP100N8F6 MBR40100CT TPS60400DBVR D15XB80

https://www.aliexpress.com/item/BQ24040DSQR-AP3608EG-G1-SN74LVC2G66DCTR-NDT2955-MMFT2955-NTF2955-SP202EEN-IR2153S-STP100N8F6-MBR40100CT-TPS60400DBVR-D15XB80/32908941557.html



SOT-233 버전의 MOSFET 이 또 왔어!



이놈은 마킹이 프린팅 되어 있네요.






16. 실장

모든 부분이 준비되었고, SMD 실장을 위한 Flux Paste 와 오븐이 구비되었으니, 작업을 시작합니다.
(대략 준비기간 1년.... 눈물)



대략 실장될 부품을을 위치 시켜보구요.



Flux Paste 를 바르면서 진행해야 하므로, 부품들이 도망가지 않게 테이프에 layout 에 맞게 안착/준비 시켜 놓습니다.



한땀 한땀... 이라고 하기엔 다소 지저분하게 작업을 진행합니다.



오븐을 통해 구워져 나오진 첫번째 Duemilanove 작품.



온도 조정에 실패해, 흰색 기판이 빵색으로 되었습니다.

결국 LED 극성을 거꾸로 해버려, 부품 때어 내다가 패턴이 나가는 사태가... 폐기 처분.



꽤 시간이 지난 후, 다시 새로 PCB 받아서 심기일전, 다시 시작.



이번에는 Flux Paste 를 적정량 도포할 정도로 실력이 조금 향상.



구워지기 전 사진.



오븐에 구워져 나온 후, USB, Power Jack, Pin header, Switch 등등, CPU 만 빼고 모두 장착.



마지막으로 CPU 장착.... 아... 감격.




17. bootloader


이제, arduino 를 IDE 등을 통해 소스코드 넣고 동작시키려면 bootloader 를 올려야 합니다. 지금은 완전 깡통 상태.



위의 사진의 ICSP 부분을 통해서 bootloader 를 밀어 넣을 수 있습니다.



연결법은, 예전 bootloader update 할 때의 방법과 동일합니다.


* Software | Arduino Nano Bootloader 를 update 해보자

https://chocoball.tistory.com/entry/Software-Arduino-Nano-Bootloader-update



========================================
| Source (Nano) | Target (Duemilanove) |
========================================
|      D12      |     MISO  (pin 1)    |
|      5V       |     5V    (pin 2)    |
|      D13      |     SCK   (pin 3)    |
|      D11      |     MOSI  (pin 4)    |
|      D10      |     RESET (pin 5)    |
|      GND      |     GND   (pin 6)    |
----------------------------------------


처음 작업 시, Arduino Micro 를 활용해서, 스샷이 이렇게 되었네요. 소스 아두이노를 Nano 로 하면 Nano로 선택.



Source 아두이노에 "Arduino ISP" 스케치를 올립니다.



Programmer 를 "Arduino as ISP" 를 선택.



이제 다른건 다 놔두고, target arduino 기종을 선택. 대망의 Duemilanove 선택!



"Burn Bootloader" ~~~~~~~~~~!!!



동영상은 예의.



크아~~~~ 성공.



1년 이상 걸려서 조금 지친감이 없지 않아 있지만, 기분 너무 좋습니다.

이제 자가 Arduino Duemilanove 가 생겨, 다양한 프로젝트를 동시에 할 수 있는 여유가 생겼습니다.


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

Hardware | 공기질 측정용 MiCS-6814 센서를 사용해 보자 - 1

|

1. 공기


사람이 건강하게 살아가는데 필요한게 뭘까 라고 생각했을 때, 육체적 관점에서 보면 아래와 같다고 생각합니다.


- 깨끗한 공기

- 깨끗한 물

- 오염되지 않은 먹거리

- 쾌적한 주거 환경

- 충분한 수면

- 충분한 운동


예전에는 당연한 것이였지만, 이 시대에 와서는 가장 돈을 많이 들여야 하는 항목들이 되었습니다.

과거로 회기하는데 드는 비용이죠.


자고로, 산업혁명이 일어나 지구가 오염되기 전 상황으로 되돌아 가는 것이, 육체적인 건강한 삶 되겠습니다. (나의 생각)

나만 잘한다고 되는건 아니라 요원하긴 하지만...


이 arduino 나 sensor 를 가지고 노는 이유도, 전자적인 지식을 습득해 나가는 것에 대한 희열 말고도,

위의 "건강한 삶을 보낼 수 있는 환경" 에 대한 추구가 다른 주된 이유이기도 합니다.


그래서, "깨끗한 공기" 가 목적이지만, 그 이전에 현재 "어떤 공기" 속에서 살고 있는지 알아보고 싶어졌습니다.

일전에 공기질의 척도만 나타내 주는 센서를 가지고 놀아본 적이 있습니다.


* Hardware | ZP07-MP901 공기질 측정 센서

https://chocoball.tistory.com/entry/Hardware-ZP07-MP901-air-quality-sensor


다만 위의 센서는 공기의 성분까지는 알려주지 못해 그닥 쓸모가 없었죠.





2. 센서


기체를 알아보는 sensor 는 꽤 많이 나와 있습니다. 대표적으로는 MQ series 가 있지요.





이 MQ 시리즈를 이용하면 왠만한건 다 잡아 낼 수 있을 것 같습니다.


다만, 이 MQ 시리즈의 단점이 히터를 통해서 기체를 태우고 그에 따른 반응으로 측정을 하는 방법인지라,

가스나 화기를 취급하는 곳에서는 발화의 원인이 될 수 있습니다. 그래서 인화 물질을 취급하는 공장이나 병원에서는 사용되지 못합니다.


그러던 중, MiCS-6814 라는 센서의 존재를 알게 됩니다.



이 센서는 metal oxide = 기체에 의한 금속 산화도 에 따른 저항 값을 가지고 측정하므로, MQ 시리즈보다는 더 안전합니다.


SGX-CMOS-Gas-Sensor-MiCs-6814.pdf

pollutant-visualizer.pdf


잡아낼 수 있는 기체들은 다음과 같다고 하네요.


• Carbon monoxide CO 1 – 1000ppm

• Nitrogen dioxide NO2 0.05 – 10ppm

• Ethanol C2H5OH 10 – 500ppm

• Hydrogen H2 1 – 1000ppm

• Ammonia NH3 1 – 500ppm

• Methane CH4 >1000ppm

• Propane C3H8 >1000ppm

• Iso-butane C4H10 >1000ppm


하나의 센서 chip 으로 많은 성분을 잡아 낼 수 으며, 소형인지라,

MQ 시리즈를 구입해서 실험 해보기 보단, 이놈으로 결정하였습니다.




3. Grove - Multichannel Gas Sensor


MiCS-6814 를 활용하기 위해 가장 좋은 방법은,

MiCS-6814 를 활용한 breakout board 인 Grove 사의 Multichannel Gas Sensor 를 구입하는 것 입니다.


* Grove - Multichannel Gas Sensor

http://wiki.seeedstudio.com/Grove-Multichannel_Gas_Sensor/



Arduino 와의 통신도 I2C로 이루어 지며, 센서의 3개 측정값 - CO, NH3, NO3 - 의 조합으로 다른 기체도 유추해 놓는것 같습니다.

거기에 정확하지는 않지만, 어느정도 calibration 도 잡혀 있을 것이구요.


다만, 항상 그렇 듯, 가격이 문제 입니다. 요즘은 팔지도 않거니와, 실 구매 가격은 약 10만원 정도.

나중에 혹시 PCB 라도 꾸며서 만들 수 있으면 만들어 보고자, 여기에 회로 관련 정보를 올려 놓습니다.


Grove-Multichannel_Gas_Sensor_v1.0_sch.pdf

Grove-Multichannel_Gas_Sensor_v1.0_eagle_files.zip

1143_Datasheet-MiCS-6814-rev-8.pdf


* Firmware (Seeed-Studio/Mutichannel_Gas_Sensor)

https://github.com/Seeed-Studio/Mutichannel_Gas_Sensor




4. 구입


눈물을 뒤로 하고, AliExpress 로 향합니다.


* 1pcs CJMCU- MICS-6814 Air Quality CO VOC NH3 Nitrogen Oxygen Gas Sensor

- https://www.aliexpress.com/item/32762216430.html



저를 위로해 주는 기교적 착한 가격. 거진 3만원돈 이지만, 과감하게 투자해 봅니다. (6개월 고민... ㅠㅠ)



대단한건 아니지만, 도착했을 시 꽤 기뻤습니다. 이제야 이런 고급진 센서 써보는구나~ 라고.



정말 단순한 구조. 레귤레이터도 없어...



뒷면입니다.





5. 연결


어떻게 arduino 와 연결하여, 각 기체의 값을 알아낼까 찾아보던 중 아래 사이트를 발견합니다.


* Wiring MiCs 5524 / 6814 CMOS MEMS Gas Detection Sensor

https://www.14core.com/wiring-mics-5524-6814-cmos-mems-gas-detection-sensor/



걍 analog pin 에 직결하라고 하네요?

제가 구매한 breakout 보드에는 MOSFET 도 없고 그렇지만, 일단 아래 소스를 가지고 돌려 봅니다.


int NH3 = 0;
int NO2 = 1;
int CO = 2;

void setup() {
	pinMode(NH3, OUTPUT);
	pinMode(NO2, OUTPUT);
	pinMode(CO, OUTPUT);
	
	Serial.begin(9600);
	Serial.println("MiCS 6814 simple test");
}
 
void loop() {
	int sense_val_1 = analogRead(NH3);
	int sense_val_2 = analogRead(NO2);
	int sense_val_3 = analogRead(CO);
	
	Serial.print("NH3 : ");
	Serial.print(sense_val_1);
	Serial.print(" \t NO2 : ");
	Serial.print(sense_val_2);
	Serial.print(" \t CO : ");
	Serial.println(sense_val_3);
	
	delay(1000);
}


Serial Monitor 로 값을 확인해 보고, EXCEL 로 그래프를 그려 봅니다.



음... 뭔가 알아보기 힘드네요. 각 기체의 값이 서로 비슷하게 나와버립니다.






6. 저항을 추가하여 연결


아래 사이트에서 이 아저씨가 한 작업은,

측정값이 현실적으로 되려면 analog pin 에 입력되는 값은, 3.3V 를 저항을 거쳐서 연결하라고 합니다.

(이론적으로는 50K ohm 이 좋으나, 제품으로 나오는 저항은 47K ohm 이 제일 가까운 값)


* ESP32, PMS5003, BME280, MICS6814 Sensor Build

http://kstobbe.dk/2019/02/16/esp32-pms5003-bme280-mics6814-sensor-build/



또한, 아래 arduino forum 에서는, 각 단자에 47K ohm 통해 연결하는 전원은 3.3V 보단, 5V 를 먹이라고 하네요.

아마도 MiCS-6814 구동 전압이 5V 임을 감안하면, 동일한 입력 값이 좀더 예민한 값의 도출에 좋다는 이야기 같습니다.

(솔직히 잘 모름)


* CJMCU-6814 adapter board with MICS-6814 CO/NH3/NO2-sensor

https://forum.arduino.cc/index.php?topic=619992.0


Tested the sensor with the code and schematic. Connected 47k to 3 gases and 5v rather than 3v. The results seem to reflect well to CO. Have not tested NO2 and NH3.


바로 따라해 봅니다.



Serial Monitor 에서 측정된 값이구요.



EXCEL 에서 그래프화 해 봤습니다.

오오오오오, 뭔가 나오네요.



가능한 24시간동안 예열하도록 안내가 되어 있듯이, 예열 구간동안 특정 값으로 꾸준히 변화되는 것을 알 수 있습니다.

위의 빨간 표시한 부분은, 시험삼아 숨을 한번 불어본 구간입니다. 변화를 잘 감지하는군요!



하룻밤 측정해본 결과 입니다.

각 기체의 상관 관계와 실내 공기 내에서의 NH3, NO2, CO 의 값은 이정도인 듯 합니다.




7. 15bit ADC + 저항을 추가하여 연결


Arduino 내장 10 bit ADC 를 가지고 측정한 결과 보다는 15 bit ADC 가 훨씬 정확합니다.

아래 포스트 이후로, 향후 모든 측정값은 더 높은 ADC 를 통하라고 배웠습니다.


* Hardware | ADS1115 16bit 4채널 ADC 를 사용해 보자

https://chocoball.tistory.com/entry/Hardware-ADS1115-16bit-4channel-ADC


ADS1115 이 입력값을 받구요.



소스를 ADS1115 용으로 살짝 수정해 줍니다.

#include "Wire.h"
#include "Adafruit_ADS1015.h"
 
Adafruit_ADS1115 ads(0x48);
 
void setup(void) {
    Serial.begin(115200);
    ads.begin();
}
 
void loop(void) {
    int16_t adc1; // CO
    int16_t adc2; // NH3
    int16_t adc3; // NO2
     
    adc1 = ads.readADC_SingleEnded(1);
    adc2 = ads.readADC_SingleEnded(2);
    adc3 = ads.readADC_SingleEnded(3);

    Serial.print("NH3 : ");
    Serial.print(adc2);
    Serial.print(" \t NO2 : ");
    Serial.print(adc3);
    Serial.print(" \t CO : ");
    Serial.println(adc1);
     
    delay(1000);
}


Serial Monitor 에서 확인한 값 들 입니다.

확실히 뭔가 엄청나게 숫자가 불어나 있습니다.



EXCEL 을 통해서 그래프화 시켜 봅니다.



패턴은 47K ohm 저항 꼽고 측정할 때와 비슷하게 나왔습니다.


다만, 높은 ADC 를 통하여 해상도는 좋아졌지만,

어떤 기준값으로 나누어야 할지 알지 못하기 때문에, trend 만 알 수 있지 정확한 수치화까지는 진행하지 못했습니다.




8. Next Step


이런 공기질 측정에서의 수치화는 calibration 인데,

그렇게 하려면 실제 실험실 환경을 통해서, 실제 기체를 가지고 기준을 잡아야 합니다.


위의 방법이 현실적으로 불가능 하기에,

다음에 할 것으로는 Grove - Multichannel Gas Sensor 의 breakout 을 만들어서 (아님 구입해서),

제조사인 SeeedStudio 의 경험이 녹아들어가 있는 firmware 와 소스코드를 가지고 수치화 해보는 것 이겠습니다.


공기 질에 관한 센서는 몇 개가 더 있습니다. 계속 놀아보도록 하지요.

To Be Continued...


And

Hardware | LCD2004 를 arduino 로 컨트롤 해보기 - 1

|

1. 시작


흠흠흠~ 하면서 인터넷을 보던 중, arduino 로 컨트롤 하는 Liquid Crystal Display 를 보게 됩니다.

이게 흔히 말하는 LCD 이죠.


OLED 와 비교하여 부피도 크고, 명암 조절을 수동으로 해줘야 하는 등, 불편한 device 라고 생각하고 있던 중,

LCD 의 푸른색 색감을 보고 반해버렸습니다.


Display 부품을 늘이고 싶지 않았지만, 이제 구입할 때가 된것 같아 구입합니다.


* LCD2004+I2C 2004 20x4 2004A blue screen HD44780 Character LCD /w IIC/I2C Serial Interface Adapter Module For Arduino

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



결코 싼 가격은 아니지만, 이왕 구입하는 김에 보편적으로 많이 사용하는 녹색과 색감에 반한 푸른색, 두 개를 삽니다.





2. 도착


한 2주만에 재품을 받았습니다.

무료 배송이 점점 없어지고 배송비 책정이 되면서 배송 기간이 점점 짧아지고 있는 듯 합니다.



푸른색, 녹색 두개가 와서 PCB 를 비교해 보니, 서로 동일한 듯 하나 살짝 다른 모습 입니다.



I2C 컨트롤러의 칩 한쪽은 마킹이 너무 얇아 fake 제품처럼 보입니다.

조금이라도 진품처럼 보이는 쪽은 파란색 버전 입니다.



납땜도 녹색보다는 파란색이 잘 되어 있습니다.



PCB 마킹도, 파란색은 동판에 미리 새겨져 있고, 녹색은 프린팅 되어 있네요.



뭐, 생산하다가 점점 원가절감 하면서 변화된 것 일 수도 있습니다.

보통 녹색을 많이 사용하니, 녹색이 원가절감이 더 된 것 일수도 있구요.





3. Pin


Pin 수는 16개로, 아래와 같은 사양을 가집니다.


-------------------------------------------------------------------
|  pin  |                        function                         |
-------------------------------------------------------------------
|  VSS  | connected to ground                                     |
-------------------------------------------------------------------
|  VDD  | connected to a +5V power supply                         |
-------------------------------------------------------------------
|   V0  | to adjust the contrast                                  |
-------------------------------------------------------------------
|   RS  | A register select pin that controls where in the LCD's  |
|       | memory you are writing data to. You can select either   |
|       | the data register, which holds what goes on the screen, |
|       | or an instruction register, which is where the LCD's    |
|       | controller looks for instructions on what to do next.   |
-------------------------------------------------------------------
|  R/W  | A Read/Write pin to select between reading and writing  |
|       | mode                                                    |
-------------------------------------------------------------------
|   E   | An enabling pin that reads the information when HIGH    |
|       | level(1) is received. The instructions are run when the |
|       | signal changes from HIGH level to LOW level.            |
-------------------------------------------------------------------
| D0-D7 | to read and write data                                  |
-------------------------------------------------------------------
|   A   | Pins that control the LCD backlight. Connect A to 3.3V. |
-------------------------------------------------------------------
|   K   | Pins that control the LCD backlight. Connect K to GND.  |
-------------------------------------------------------------------


대충 훑어 보면, back light 전원, 본체 전원, 명암 조절, data 통신과 컨트롤 라인 등이 있습니다.

제가 구매한 제품은 I2C 모듈인 "PCF8574" 컨트롤러가 달린 제품입니다.

그러니, 일일이 모두 연결할 필요 없이 I2C 를 통해, 단 4가닥 선으로 컨트롤 할 수 있습니다.


이 chip 의 생산은 Philips, TI, NXP 등에서 생산되고 있네요. PDF 사양서를 올려 놓습니다.


LCD2004

TC2004A-01.pdf

Systronix_20x4_lcd_brief_data.pdf

RK-10290_410.pdf

50586.pdf


HD44780

HD44780.pdf

LCD Interfacing using HD44780 Hitachi chipset compatible LCD.pdf


PCF8574

PCF8574_PCF8574A.pdf

PCF8574T.pdf

pcf8574.pdf





4. I2C


Arduino 와 연결은 I2C 이므로, 4가닥으로 처리됩니다.



Liquid Crystal I2C 라이브러리가 필요합니다.

일반 Liquid Crystal I2C 라이브러리를 설치해도 되나, 궂이... 궂이 PCF8574 용 라이브러리를 찾아서 설치해 봅니다.

(범용 Liquid Crystal I2C 라이브러리가 아님)



위의 라이브러리를 설치하면 아래처럼 sample code 를 사용할 수 있습니다.


File > Examples > LiquidCrystal_PCF8574 > LiquidCrystal_PCF8574_test



I2C 활용시에는 항상 address 를 확인해 봐야 합니다.

Arduino 와 I2C 로 연결 후, i2cdetect 소스를 돌려 봅니다.



0x27 로 잡혀 있네요.

참고로 다른 I2C 센서들과 연동 시에 address 충돌이 일어나면, 아래 사진의 A0, A1, A2 쇼트 조합으로 주소를 바꿀 수 있습니다.






5. I2C 소스


친절하게도 example 소스가 충분히 잘 만들어져 있는지라, 그냥 돌려 봅니다.


#include "LiquidCrystal_PCF8574.h"
#include "Wire.h"

LiquidCrystal_PCF8574 lcd(0x27); // set the LCD address to 0x27 for a 16 chars and 2 line display
int show = -1;

void setup() {
	int error;
	
	Serial.begin(115200);
	Serial.println("LCD...");
	
	// wait on Serial to be available on Leonardo
	while (!Serial)
		;
	Serial.println("Dose: check for LCD");
	
	// See http://playground.arduino.cc/Main/I2cScanner how to test for a I2C device.
	Wire.begin();
	Wire.beginTransmission(0x27);
	error = Wire.endTransmission();
	Serial.print("Error: ");
	Serial.print(error);
	
	if (error == 0) {
		Serial.println(": LCD found.");
		show = 0;
		lcd.begin(20, 4); // initialize the lcd
	} else {
		Serial.println(": LCD not found.");
	} // if
} // setup()

void loop() {
	if (show == 0) {
		lcd.setBacklight(255);
		lcd.home();
		lcd.clear();
		lcd.print("Hello LCD");
		delay(1000);
		
		lcd.setBacklight(0);
		delay(400);
		lcd.setBacklight(255);
	} else if (show == 1) {
		lcd.clear();
		lcd.print("Cursor On");
		lcd.cursor();
	} else if (show == 2) {
		lcd.clear();
		lcd.print("Cursor Blink");
		lcd.blink();
	} else if (show == 3) {
		lcd.clear();
		lcd.print("Cursor OFF");
		lcd.noBlink();
		lcd.noCursor();
	} else if (show == 4) {
		lcd.clear();
		lcd.print("Display Off");
		lcd.noDisplay();
	} else if (show == 5) {
		lcd.clear();
		lcd.print("Display On");
		lcd.display();
	} else if (show == 7) {
		lcd.clear();
		lcd.setCursor(0, 0);
		lcd.print("*** first line.");
		lcd.setCursor(0, 1);
		lcd.print("*** second line.");
		lcd.setCursor(0, 2);
		lcd.print("*** third line.");
		lcd.setCursor(0, 3);
		lcd.print("*** forth line.");
	} else if (show == 8) {
		lcd.scrollDisplayLeft();
	} else if (show == 9) {
		lcd.scrollDisplayLeft();
	} else if (show == 10) {
		lcd.scrollDisplayLeft();
	} else if (show == 11) {
		lcd.scrollDisplayRight();
	} else if (show == 12) {
		lcd.clear();
		lcd.print("write-");
	} else if (show > 12) {
		lcd.print(show - 13);
	} // if
	
	delay(1400);
	show = (show + 1) % 16;
} // loop()


Serial Monitor 에서 확인해 보니, 잘 인식 되었네요.



너무 쉽게 되어서 살짝 김이 빠지는 정상적인 결과.



동영상도 올려 봅니다. (동영상은 16x2 버전으로 돌린 결과. 수정된 위의 소스로 20x4 로 변경된 소스를 사용하면 4줄 다 사용.)






6. Direct 연결


여기서 끝내면 너무 재미 없는지라, 한땀한땀 직접 연결해 봅니다.

워낙 오래된 부품이라, 아래 arduino 정식 사이트에서 자세히 소개되어 있습니다.


* TUTORIALS > Examples from Libraries > LiquidCrystal > HelloWorld

https://www.arduino.cc/en/Tutorial/HelloWorld?from=Tutorial.LiquidCrystal


각 Pin 의 정보는 다음과 같습니다.



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


--------------------------------
| LCD2004 |    Arduino Nano    |
--------------------------------
|   VSS   |         GND        |
|   VDD   |         5V         |
|   V0    | S of potentiometer |
|   RS    |         D12        |
|   R/W   |         GND        |
|   E     |         D11        |
|  D0-D3  |    no connected    |
|   D4    |         D5         |
|   D5    |         D4         |
|   D6    |         D3         |
|   D7    |         D2         |
|   A     |         3.3V       |
|   K     |         GND        |
--------------------------------


Diagram 으로도 그려 봤습니다. (Digital pin 은 실제와 살짝 틀림)






7. Potentiometer


여기서 필요한 것이 potentiometer 입니다. 가변 저항이죠.

다이얼을 돌려서 저항값을 변화시키는 부품이죠. 구입을 미뤄 오다가, 이번 기회에 사용하고자 구입 했습니다.


* 5 PCS/Lot Potentiometer Resistor 1K 10K 20K 50K 100K 500K Ohm 3 Pin Linear Taper Rotary Potentiometer for Arduino with Cap

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



구입한 버전은 10K Ohm.



글의 문맥상 뜬금 없지만, 도착샷 입니다. 빠질 수 없죠.



요런 모양 입니다.




8. Direct 연결 구동


직접 연결하는 방법은 Arduino IDE 에서 기본 제공합니다.



소스는 다음과 같구요.

기본 16x2 버전으로 되어 있으니, 20x4 버전으로 살짝 수정해 줍니다.


/*
  LiquidCrystal Library - Hello World
 
 Demonstrates the use a 16x2 LCD display.  The LiquidCrystal
 library works with all LCD displays that are compatible with the
 Hitachi HD44780 driver. There are many of them out there, and you
 can usually tell them by the 16-pin interface.
 
 This sketch prints "Hello World!" to the LCD
 and shows the time.
 
  The circuit:
 * LCD RS pin to digital pin 12
 * LCD Enable pin to digital pin 11
 * LCD D4 pin to digital pin 5
 * LCD D5 pin to digital pin 4
 * LCD D6 pin to digital pin 3
 * LCD D7 pin to digital pin 2
 * LCD R/W pin to ground
 * LCD VSS pin to ground
 * LCD VCC pin to 5V
 * 10K resistor:
 * ends to +5V and ground
 * wiper to LCD VO pin (pin 3)
 
 Library originally added 18 Apr 2008
 by David A. Mellis
 library modified 5 Jul 2009
 by Limor Fried (http://www.ladyada.net)
 example added 9 Jul 2009
 by Tom Igoe
 modified 22 Nov 2010
 by Tom Igoe
 
 This example code is in the public domain.
 
 http://www.arduino.cc/en/Tutorial/LiquidCrystal
 */
 
// include the library code:
#include "LiquidCrystal.h"
 
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
 
void setup() {
  // set up the LCD's number of columns and rows:
  lcd.begin(20, 4);
  // Print a message to the LCD.
  lcd.setCursor(0, 0);
  lcd.print(" Chocoball's Tech");
  lcd.setCursor(0, 2);
  lcd.print(" chocoball.tistory");
}
 
void loop() {
  // set the cursor to column 0, line 1
  // (note: line 1 is the second row, since counting begins with 0):
  lcd.setCursor(0, 3);
  // print the number of seconds since reset:
  lcd.print(millis() / 1000);
}


전부 연결하면 아래와 같습니다.



동영상도 올려 봅니다.



hello, world! 를 저의 블로그명으로 바꿔 봤습니다.



단순한 표시 방법과 오랜 기간 수정된 라이브러리 덕으로, 정말 스트레스 없이 구동 시켰습니다.




9. I2C 와 Direct 연결시 명령어 차이


I2C 를 통한 함수와, 직접 연결했을 시에 사용할 수 있는 명령어 구성이 살짝 다릅니다.

고맙게도 아래 사이트에서 잘 정리된 테이블이 있어서 여기에 올려 봅니다.


* LCD Display Tutorial for Arduino and ESP8266

https://diyi0t.com/lcd-display-tutorial-for-arduino-and-esp8266/






10. 커스텀 폰트


명령어 차이를 자세하게 올려준 사이트에서 폰트 커스텀에 대해서도 내용이 있어서 따라해 봤습니다.

이 때, 사용하는 LiquidCrystal_I2C 라이브러리는 범용을 사용하는 지라, 아래 라이브러리를 설치합니다.



소스는 아래와 같습니다. 폰트라기 보단 캐릭터 입니다.


#include "Wire.h"
#include "LiquidCrystal_I2C.h"

// Set the LCD address to 0x27 in PCF8574 by NXP and Set to 0x3F in PCF8574A by Ti
LiquidCrystal_I2C lcd(0x27, 20, 4);

byte customChar1[] = {
  B01110,
  B01110,
  B00100,
  B11111,
  B00100,
  B01110,
  B01010,
  B01010
};

byte customChar2[] = {
  B01110,
  B01110,
  B10101,
  B01110,
  B00100,
  B00100,
  B01010,
  B10001
};

void setup() {
  lcd.init();
  lcd.backlight();
}

void loop() {
  lcd.createChar(0, customChar1);
  lcd.home();
  lcd.write(0);
  delay(1000);
  lcd.createChar(0, customChar2);
  lcd.home();
  lcd.write(0);
  delay(1000);
}


Bitmap 을 이용해서 만들었고, 화면 refresh 를 통해서 움직이는 것 처럼 구성했네요.



동영상도 올려 봅니다.



참고로, 이 Liquid Crystal 은 Hitachi HD44780 를 사용하거나 호환품들이라 아래 폰트를 기본 제공합니다.


HD44780.pdf






11. 아...


인터넷에서 보지 말아야 할 것을 봐버렸습니다.



이렇게 이쁘게도 커스터마이징 할 수 있는거군요.

다음은, 커스텀 폰트를 가지고 놀아보겠습니다.


And

Hardware | Arduino 로 Gimbal 컨트롤 하기

|

1. 길고 긴 시작


때는 2015년, 한창 Kickstarter 에 열을 올려, 이것 저것에 투자(?) 하고 있을 때,

당시 저에게는 너무 생소한 Gimbal 이라는 것을 접하게 됩니다.


지금이야 드론이나 스포츠 경기 촬영, 또는 일반인이 손으로 가지고 다니면서 흔들림 방지 해주는 분야에까지 널리 사용되지만,

이 때까지만 해도 이런 종류의 기기는 전문가 집단만 사용하고 있었죠.


다 제껴두고 아래 소개 동양상 보고 홀딱 반해서 투자하게 됩니다. 75 USD...


* Gimbal for your Lights Camera or Action

https://www.kickstarter.com/projects/2035152529/gimbal-for-your-lights-camera-or-action/description



일단 동영상을 함 봐보세요. 2015년 감각으로... 사고싶어 지죠?!


당시에는, 아무 생각 없이 투자한 것이라, 어떻게 활용할지, 어떻게 컨트롤 할지 상상도 못하고 있었습니다.

제품이 도착 후, servo 로 움직인다는 것을 알고 (도착해서야!) arduino 를 활용해 기본적인 동작만 확인하고 쳐박에 두었습니다.

왜냐 하면, arduino 에 대한 지식이 얕았기에 뭘 더 할 수가 없었거든요.


아래는 지금까지 gimbal 과 관련된 포스트 들 입니다.


* Hardware | Arduino 로 Servo 를 움직여 보자

https://chocoball.tistory.com/entry/Hardware-Arduino-Servo


* Hardware | Arduino 의 Sensor Shield 사용해 보기

https://chocoball.tistory.com/entry/Hardware-Arduino-Sensor-Shield


* Hardware | Dual-axis XY Joystick Module

https://chocoball.tistory.com/entry/Hardware-dual-axis-XY-Joystick-Module


마지막으로 Joystick 모듈을 사용해 보고서, 드디어! gimbal 활용의 완성판을 작성할 수 있을것 같아, 이 글을 쓰기 시작했습니다.





2. 연결


최종 목적은 Joystick 을 가지고, Gimbal 을 상하좌우 움직이는 것 입니다.

이게 단순하지만, Joystick 의 운동 한계성으로 그리 쉽게는 되지 않더군요.


일단, Arduino > Joystick > Gimbal (servo) 를 아래와 같이 연결합니다.


  Joystick | Arduino Nano
--------------------------
    GND    |     GND
    5V     |     5V
    VRX    |     A0
    VRY    |     A1
    SW     |     D2
--------------------------
  Servo 1  |
--------------------------
    RED    |     5V
    BLACK  |     GND
    SIGNAL |     D9
--------------------------
  Servo 2  |
--------------------------
    RED    |     5V
    BLACK  |     GND
    SIGNAL |     D8
--------------------------


실제 diagram 은 다음과 같습니다.



실제 코드에서는 Joystick 의 SW_pin 이 D2 에 연결되는 등, 위의 그림과 조금 다릅니다만, 대략적인 연결 구조만 보시면 되겠습니다.





3. 간단 구동


일단 Joystick 이 유효한 방법인지 알아볼 수 있는 간단한 코드 입니다.

인터넷 어디에선가 참조했는데 링크를 까먹었습니다. 간단한 연결법이라 검색해서 쉽게 찾을 수 있습니다.


#include "Servo.h"

Servo myservo1; // create servo object to control a servo
Servo myservo2;
int potpin1 = A0; // analog pin used to connect the potentiometer
int potpin2 = A1;
int val; // variable to read the value from the analog pin

void setup() {
	myservo1.attach(9);
	myservo2.attach(10); // attaches the servo on pin 9 to the servo object
}

void loop() {
	val = analogRead(float(potpin1)); // reads the value of the potentiometer (value between 0 and 1023)
	val = map(val, 0, 1023, 0, 180); // scale it to use it with the servo (value between 0 and 180)
	myservo1.write(val); // sets the servo position according to the scaled value
	delay(15); // waits for the servo to get there
	
	val = analogRead(float(potpin2)); // reads the value of the potentiometer (value between 0 and 1023)
	val = map(val, 0, 1023, 0, 180); // scale it to use it with the servo (value between 0 and 180)
	myservo2.write(val); // sets the servo position according to the scaled value
	delay(15);
}


아래는 연결하고 실제 구동 영상입니다.



잘 돌아가쥬?

단, 여기서 문제점들이 몇가지 있습니다.


- ripple value

회로적인 문제로 ripple 값이 발생하여, 조이스틱을 움직이지 않았지만 덜덜 떨거나 깔끔한 움직임이 나오지 않습니다.

ripple 를 제거 해야 합니다.

- speed

돌아가는 속도가 너무 빨라, 원하는 방향으로 위치하기가 힘듭니다.

- available range

X 축의 경우, 90 돌아가지만, gimbal 은 360 가 돌아가게끔 되어 있습니다.

CCTV 등 에 사용된다고 가정하면, 필요 없는 각도나 회전은 발생하지 않게끔 해야 합니다.

- last position

Joystick 의 성질 상, 움직힘 후 가운데로 되돌아 옵니다.

특정 위치를 잡게 하려면 동작시키지 않을 때에는 마지막 위치를 기억하고 있어야 합니다.

- centering

어떤 위치에서든 다시 초기 위치로 되돌아 오는 기능이 있으면 편할 것 같습니다.


이 글의 나머지 부분은, 결국 위의 문제를 해결하는 내용으로 진행됩니다.





4. Ripple Value


Joystick 을 가만히 놔둬도 계속 떨거나, 움직일 때 자연스럽지 못합니다.

Serial Monitor 로 값의 변화를 찍어 봤죠.



아무것도 안했는데도 값이 출렁 거립니다.

전후값을 비교해 보니, 가만히 있어도 최대 11 정도 값이 변하는 것을 알 수 있습니다.



그래프로 도식화 해보면, 그 현상을 충분히 알 수 있습니다.

이는 전기적인 ripple 일 수도 있습니다.


* How can I filter out noise from ADC lines without delay or signal change?

https://arduino.stackexchange.com/questions/994/how-can-i-filter-out-noise-from-adc-lines-without-delay-or-signal-change


  +5V                        +5V
   |                          |
(sensor)---resistor---+---(Arduino)
   |                  |       |
   |              capacitor   |
   |                  |       |
  GND----------------GND-----GND

이 경우 RC 필터를 넣으면 됩니다. 캐패시터 값으로 0.1uF capacitor 를 사용하면 적절하다고 하네요.


So if you are sampling at around 1000 Samples/second (i.e., a sampling interval of 1 millisecond), then 100 Ohms of resistance and (roughly) 100 uF ceramic capacitor may be adequate. (The RC time constant here is RC == 100 Ohms x 100 uF = 10 milliseconds).


다만, 저항이 들어가면서 값의 외곡이 생기니 software 적으로 처리하기로 합니다.


0              512            1023 
<---------------|--------------->
          497 |   | 527

그럼 어떻게 하느냐.

Joystick 에서 arduino 로 보내지는 전체 analog 신호 0~1023 에서,

정 가운데 앞뒤로 15씩 잘라, 이 구간의 ripple 이나 작은 움직임을 무시하기로 합니다.


...
		if ( (0 <= val) && (val < 497) ) {
			myservo1.write(angle1--);
		} else if ((527 <= val) && (val < 1024)) {
			myservo1.write(angle1++);
...


위의 코드에서 보면, 중간값을 잘라 낸 앞뒤 값에서 val 을 읽어 들이는 것으로 했습니다.




5. Speed & Last Poision


원래 소스에서는 최종 위치로 바로 움직이도록 값을 넣어 주지만, 수정된 소스에서는 각도를 1도씩 움직이게 했습니다.

그러면서, delay 값을 낮춘 채로 유지했습니다.


...
		if ( (0 <= val) && (val < 497) ) {
			myservo1.write(angle1--);
		} else if ((527 <= val) && (val < 1024)) {
			myservo1.write(angle1++);
		} else {
			// do nothing
		}
...
	delay(10);
...
		if ( (0 <= val) && (val < 497) ) {
			myservo2.write(angle2--);
		} else if ((527 <= val) && (val < 1024)) {
			myservo2.write(angle2++);
		} else {
			// do nothing
		}
...
	delay(10);  
}


속도에 변화를 더 주고 싶으면, angle 은 1도씩 움직이는 것은 놔두고, delay 를 조정 합니다.

저는 delay(10) 이 가장 적절했습니다.


또한, 최종 각도를 입력하는 것이 아닌, 한쪽 방향으로 움직임만 있으면 (exist) 1도씩 움직이게 한 결과,

자연스럽게 마지막 위치에서 멈춰있게 되었습니다.




6. Available Range


180도로 움직이는 Servo 를 풀로 사용하면, 카메라를 달았을 때, 촬영 범위를 벗어나거나 회전하게 됩니다.


일단 Y 축 servo 를 생각하면,

천장과 땅바닥을 촬영 각도에서 빼게 된다면, 전체 180 도에서 140도로 좁히면 됩니다.

그렇다면, 20 > 160 도 사이를 움직이게 코딩해 줍니다.


X 축은 180 회전이 720도 회전, 90 회전이 360도, 45 회전이 180도, 22.5 회전이 되어야 비로서 90도가 됩니다.

즉, 좌우로 22.5 를 먹여야 원하는 좌우 180도로 움직이는 결과가 되지요.


...
	if ( (67 < angle1) && ( angle1 < 112) ) { // making available range
...
	} else if ( angle1 == 67) {
		angle1++;
	} else if ( angle1 == 112) {
		angle1--;
	}
...
	if ( (20 < angle2) && ( angle2 < 160) ) { // making available range
...
	} else if ( angle2 == 20) {
		angle2++;
	} else if ( angle2 == 160) {
		angle2--;
	}
...


코딩에서는 90도가 center 이므로, 이 중간을 기준으로 좌우 +/- 한 값으로 범위를 정의했습니다.

위의 소스 마지막 부분에서, 각도의 끝에 있는 값에서 +1 / -1 씩 해준 이유는, 계속 범위 안에 들기 하기 위함입니다.

이게 없으면, 1도씩 움직이던 angle 값이, 범위 밖으로 나가면서 예외상황에 빠지게 됩니다.


코딩 해보신 분이라면, 예외사항 처리가 얼마나 중요한지 아실꺼예요.




7. Centering


Joystick 에서 SW_pin 이 존재합니다.

유일하게 digital 입력이며, 조이스틱을 누르면 딸깍 하는 소래를 내는 그 부분 입니다.


마침 잘 된 거죠. Centering 을 이 SW_pin 을 사용하면 됩니다.


#include "Servo.h"

const int SW_pin = 2; // digital pin for centering
...
void setup() {
	pinMode(SW_pin, INPUT);
	digitalWrite(SW_pin, HIGH);
...
}

void loop() {
	
	if (!digitalRead(SW_pin)) {
		angle1 = 90;
		angle2 = 90;
		myservo1.write(angle1);
		myservo2.write(angle2 );
	}
...
}


SW_pin 에 입력이 있으면, 중앙이 되는 90 도를 강제적으로 input 하게 하면 됩니다.




8. 정리


지금까지 해결했던 문제들을 한데 모아 소스코드로 만들면 아래와 같이 됩니다.


#include "Servo.h"

const int SW_pin = 2; // digital pin for centering
Servo myservo1; // create servo object to control a servo
Servo myservo2;
int potpin1 = A0; // analog pin used to connect the potentiometer
int potpin2 = A1;
int val; // variable to read the value from the analog pin
int angle1 = 90;
int angle2 = 90;

void setup() {
	pinMode(SW_pin, INPUT);
	digitalWrite(SW_pin, HIGH);
	myservo1.attach(9);
	myservo2.attach(10); // attaches the servo on pin 9 to the servo object
	
	myservo1.write(angle1);
	myservo2.write(angle2);
	delay (1000); // initalizing
}

void loop() {
	
	if (!digitalRead(SW_pin)) {
		angle1 = 90;
		angle2 = 90;
		myservo1.write(angle1);
		myservo2.write(angle2 );
	}
	
	val = analogRead(float(potpin1)); // reads the value of the potentiometer (value between 0 and 1023)
	if ( (67 < angle1) && ( angle1 < 112) ) { // making available range
		if ( (0 <= val) && (val < 497) ) {
			myservo1.write(angle1--);
		} else if ((527 <= val) && (val < 1024)) {
			myservo1.write(angle1++);
		} else {
			// do nothing
		}
	} else if ( angle1 == 67) {
		angle1++;
	} else if ( angle1 == 112) {
		angle1--;
	}
	delay(10);
	
	val = analogRead(float(potpin2)); // reads the value of the potentiometer (value between 0 and 1023)
	if ( (20 < angle2) && ( angle2 < 160) ) { // making available range
		if ( (0 <= val) && (val < 497) ) {
			myservo2.write(angle2--);
		} else if ((527 <= val) && (val < 1024)) {
			myservo2.write(angle2++);
		} else {
			// do nothing
		}
	} else if ( angle2 == 20) {
		angle2++;
	} else if ( angle2 == 160) {
		angle2--;
	}
	delay(10);  
}


코드의 최적화는 생각하지 않고, 오로지 구현에만 신경쓴 소스입니다.

모든 구현이 들어간 코드를 입힌 동영상 입니다.



원하는 수준까지 동작 구현이 되어서 기분이 좋네요.

향후, ESP8266 을 이용하여 원격 조정이나 Web UI 를 통한 컨트롤도 가능하겠습니다.


모두 happy arudino~!


And
prev | 1 | 2 | 3 | 4 | 5 | ··· | 11 | next