'LED'에 해당되는 글 19건

  1. 2019.04.11 Life | 현관 전등 교환 2
  2. 2018.12.03 Hardware | 8x8 LED matrix 와 Colorduino 이용해 보기
  3. 2018.12.02 Hardware | MAX30105 파티클 센서 - 2
  4. 2018.01.27 Hardware | LED 구매하기
  5. 2017.12.26 Life | LED 전등의 잔불을 없애보자
  6. 2017.12.01 Hardware | LED bar graph 를 컨트롤 해보자 - 1
  7. 2017.08.13 Hardware | LED bar graph 를 이용해 보자
  8. 2017.07.07 Hardware | 삼성 USB 마우스 분해해 보기
  9. 2017.06.25 Hardware | Arduino 로 Photoresister 가지고 놀기 - 1

Life | 현관 전등 교환

|

1. 고장


사람 움직임을 감지하여 불을 켜는 현관등이 나갔습니다.

전기 관련해서는 항상 두꺼비집을 내리고 작업합시다.



단순히 전구 수명이 다 했나 하고, 전등을 갈아 봤더니 계속 켜져있네요.

센서부 고장일 듯 합니다.



나사를 풀고 본체를 천정에서 분리합니다.

사진에서 보이듯, 처음 공사하신 분의 장인의 손길이 느껴지는 시공입니다.



매우 단순한 구조입니다.



전원과 전등 사이에 센서부가 컨트롤 하는 구조 입니다.



60W 용이네요. 전구가 이렇게 전기를 많이 먹습니다.



의미는 없지만 직경 치수를 재봅니다.



참고로 전등과 전원이 연결되는 부분은 세라믹으로 되어 있어서 절연, 내연성은 좋습니다만 무척 무겁습니다.





2. 회로


회로가 어떤 모양인지 뚜껑을 까 봤습니다.



적외선 센서와 조도센서가 있네요.

저녁에만 동작하도록 설정할 수 있는 이유가, 이 조도센서 덕 인듯 합니다.



회로에서 나는 열인지, 전등으로 인한 것인지, 하우징의 회로부 주위가 조금 거무튀튀 합니다.






3. 주문


다른 전등들을 교체할 때, 전부 LED 로 리폼하고 싶었습니다.


다만, LED 교체 비용 대비 원가가 안나온다는 이유로 LED 리폼을 못했습니다만,

이번에는 본체 구매나 LED 리폼이나 가격 차이가 그리 크지 않아서 허락을 득 했습니다.


인터넷을 살펴보니, 하우징은 빼고 내용물만 쏙 교체할 수 있는 kit 가 널리 팔리고 있네요.


* LED 리폼 모듈 센서등 직부등 매입등 원형 기판

https://smartstore.naver.com/makeabright/products/2319570109



총 가격은 6,400 원 + 2,500 원 = 8,900 원





4. 도착


구매한지 하루만에 배송되었습니다.

우린 편하지만, 배송하시는 분들의 노동이 배송비에 비해 너무 싼 가격으로 책정된게 아닌가 합니다.



구성물은 LED 기판, 컨버터, 스페이서, 자석 및 전원 커넥터 등입니다.

스페이서와 자석은 하나를 신청하면 구멍 갯수에 맞게 올줄 알았더니만, 실제로 하나씩만 왔습니다.


뭐 하나만으로도 가능하지만, 안전한 고정은 3쌍이 필요할 듯 합니다.



드디어 왔군요! LED 기판!

이쪽 계열에서는 정평이 나 있는 LG Innotek 제품입니다.



LED는 내부에 제너다이오드가 삽입되어 있어, 과전압을 막아준다는 그 LED chip 이네요.

사진에서 검은 점이 그 제너다이오드 입니다.



전등 사용시에는 60W 였는데, LED는 15W 만을 사용하는 듯 합니다.

1/4 전력이네요. 지구를 사랑해야 합니다.



내부 기판은 거의 비슷합니다.

적외선 센서와 조도 센서를 하나의 켑 안에 위치시켜, 이치에 맞게 설계한것 같습니다.


원래 있던 기판에서는 외부와 통하는 동그란 창이 적외선 센서에만 접근되도록 디자인 되었지만, 이 제품은 그 부분을 해결 했네요.



좀더 개선된 제품임에는 분명합니다.



이따시만한 콘덴서는 비슷하네요.



옆에 부착된 chip 은 LM324N 이라고, OpAmp 네요.



퓨즈도 설치되어 있네요. 확실히 개선된 것 맞습니다.






5. 설치


자석과 스페이서를 기판과 조립합니다.

구성품에는 들어있지 않지만, 나사만으로 연결하는 것은 기판을 상하게 할 수 있을것 같아,

집에서 굴러다니는 스페이서를 추가로 사용했습니다.



전원잭을 연결하면 전기를 공급할 수 있게 됩니다.



스페이서를 중간에 넣었더니 기판을 이렇게 띄울 수 있네요.



LED는 열이 많이 나므로, 이렇게 스페이서로 띄우는게 잘한 선택인듯 싶습니다.



전원선을 원터치로 연결할 수 있는 모듈도 제품에 포함되어 있어,

천정에서 내려오는 전원선과 연결할 때에는 절연 태이프가 필요 없고, 작업이 편합니다. 






6. 짜잔~!


우후후 불이 잘 들어 오는군요.

iPhone 으로 사진을 찍으니 오른쪽에 전구 잔상이 남는게 신기해서 이 사진을 남겨 봅니다.



기존 전구 60W 보다 2배는 더 밝은것 같습니다. 완전 대낮처럼 밝습니다.

다만, 은은한 불빛인 "전구색" 을 주문했는데, "주광색" 이 왔습니다. 교환하고 뭐하고 하는게 너무 귀찮으니 그냥 쓰기로 합니다.

요즘 배송물품 중, 제대로 오는게 없는듯한 느낌입니다.



자석으로 하우징에 붙어있는 형식이므로, 필요시에는 아래처럼 쉽게 기판을 제거할 수 있습니다.



천정과 고정하는 나사 구멍이, 석고 보드판에 뚫려 있어서, 다시 결합하니 헛돕니다.


실로 나사를 감고 목공본드를 발라서 조였습니다.

시간이 지나면 확실히 고정 되겠죠?



Mission Completed !


'Life' 카테고리의 다른 글

Life | 비데 설치기  (2) 2019.07.05
Life | 항공무선통신사 도전기 - 2  (4) 2019.04.28
Life | 항공무선통신사 도전기 - 1  (0) 2019.03.22
Life | 샤워기 온수 조절 상식  (0) 2019.01.05
Life | 자동차 냉각수 보충하기  (0) 2018.11.06
And

Hardware | 8x8 LED matrix 와 Colorduino 이용해 보기

|

1. 8x8 LED Matrix


한동안 LED bar 나 LED 전구, 74HC595 등을 사용하다가,

"FULL COLOR 8x8 LED Dot Matrix" 라는 문구를 보게 됩니다.


때는 바야흐로 2017년 5월 24일...

아래 제품을 구입하게 됩니다.


* Full Color 8x8 8*8 Mini Dot Matrix LED Display Red Green Bule RGB Common Anode Digital Tube Screen For Diy 60mmx60mmx5mm

https://www.aliexpress.com/item/5mm-8x8-8-8-Full-Colour-RGB-LED-Dot-Matrix-Display-Module-Common-Anode/32452391556.html



정말 이쁘게 생겼죠?




2. 도착


큰 무리 없이 잘 도착 했습니다.



dot 의 한개씩 자세히 보면, 조그마한 3가지 LED가 하나의 dot 를 이룹니다.



우리가 흔히 알고 있는 3색 - 빨강, 파랑, 녹색이 모든 색을 표현하는 원리를 이용하는 구조로 생각할 수 있습니다.



핀이 많은 것을 보면, full color 임은 확실해 보입니다.

단색일 경우는 아래 보이는 pin 수보다 훨씬 적습니다.



자... 그럼 arduino 와 어떻게 연동될까요.

인터넷 바다에서 검색에 검색을 거듭합니다.





3. 구현 방법


RGB 를 섞어 색을 만들며, 색의 변화를 컨트롤 하는 주된 기능은 "Pulse Width Modulation" 이라고 합니다.

한국에서는 "펄스 폭 변조" 라는군요. (그냥 직역이지 않소...)


* Pulse-width modulation

https://en.wikipedia.org/wiki/Pulse-width_modulation


SparkFun 에서도 관련한 설명을 해 놓은 web page 가 있어서 여기에 링크를 걸어 놓습니다.


* Pulse Width Modulation

https://learn.sparkfun.com/tutorials/pulse-width-modulation/all


간단히 이야기 하면, 펄스의 "" 만을 조정하여, 빛의 강약이나 모터의 구동 속도를 조절하는 것입니다.

눈으로 보기에는 자연스러운 흐름이지만, 주파수적으로는 끊어서 조정하는 방법이라고 합니다.



"난, arduino 를 가지고 놀려고 했는데, 공부를 해야 하는군" 이라는 생각을 다시금 깨우쳐 주는 대목입니다.


자, 그래서 8x8 led dot matrix 를 구동하려면 어떤 선례들이 있는지 찾아보니, 잘 정리된 글들이 대략 다음과 같군요.

결론부터 이야기 하면, 필자도 이런 이야기를 합니다.


"Pulse width modu - WHAT ?"


읽어보면, 결국 74HC595 + ATmega328 등을 이용하여, 전용 breakout 보드를 만들어서 컨트롤 하고 있었습니다.
이게 단순한게 아니었구나...

* 8×8 RGB LED Matrix

http://blog.spitzenpfeil.org/wordpress/projects/8x8-rgb-led-matrix/


* 64 Pixel RGB LED Display - Another Arduino Clone

- https://www.instructables.com/id/64-pixel-RGB-LED-Display-Another-Arduino-Clone/


* How to Build a 8×8 RGB LED Matrix with PWM using an Arduino

http://francisshanahan.com/index.php/2009/how-to-build-a-8x8x3-led-matrix-with-pwm-using-an-arduino/


* nrj/LEDMatrixControl

https://github.com/nrj/LEDMatrixControl


여기까지 하려면 시간이 많이많이많이 걸리겠는걸... 라고 생각 후, 일단 덮고 다른걸로 한동안 시간을 보내게 됩니다.





4. Colorduino


시간이 흘러 흘러 1년...



우연히 Colorduino 라는 제품의 존재를 알게 됩니다.


알게 된지는 꽤 되었지만, 직접 breakout 보드를 만들어 보고자 무시해 왔지만, 너무 일이 커지는듯 하여 포기하고,

1년이 훌쩍 지난 2018년 11월, 이 구동 driver 격인 breakout 보드 구입을 위해 조사하게 됩니다.


제조사는 ITead 라는 회사군요.


* ITEAD Intelligent Systems Co.Ltd.

https://www.itead.cc/


현재 Colorduino 는 version 1.4 까지 나와있는 듯 합니다.


* Colorduino V1.4 Color Rainbow Matrix RGB LED Driver Shield For Arduino

https://www.itead.cc/colorduino-v1-4.html


아래 스샷들은 제품 website 에서 가져온 내용인데,

지금까지 고민한 것들이 모두 구현되어 있는 모습을 보여주고 있습니다.



PWM 을 위해서 전용 chip이 채용되었군요.



컨트롤을 위해서 arduino 에서 사용하는 ATmega328 이 채용되었습니다.


그래서 Arduino IDE 와 FTDI 를 통해서 연결 시,

보드를 ATmega328 을 채용한 보드 - Uno, Duemilanove, Nano - 를 선택하면 문제가 없습니다.


관련된 library 및 example 소스는 WIKI 형식으로 정리가 되어 있습니다.


* Colorduino V1.3 (WIKI)

https://www.itead.cc/wiki/Colorduino_V1.3


* Colorduino V1.4 (WIKI)

https://www.itead.cc/wiki/Colorduino_V1.4


사용된 각 chip 의 datasheet 는 아래와 같이 이 post 에 첨부해 놓습니다.


* Datasheet

- Colorduino : DS_IM120410004_Colorduino.pdf

DM163 : DS_DM163.pdf

M54564FP : DS_M54564FP.pdf


* Fritzing Parts

Colorduino.fzpz





5. Colorduino / Funduino 구입


AliExpress 에서 검색하면, Colorduino 의 clone 제품인 "Funduino" 가 판매되고 있습니다.

잘 보면, Colorduino V1.3 버전을 기준으로 만든 제품입니다.


* Free shipping ! Full color 8 * 8 LED RGB matrix screen driver board Colorduino for arduino

https://www.aliexpress.com/item/Free-shipping-Full-color-8-8-LED-RGB-matrix-screen-driver-board-Colorduino-for-arduino/2045397138.html



위의 ITead 사이트의 V1.3 과 비교해 보면, 완벽히 동일하다는 것을 알 수 있습니다.





6. Funduino 도착


가격이 좀 있다 보니, 2주만에 도착했습니다.



뽁뽁이로 잘 쌓여서 도착했습니다. 믿음직 스러운 배송입니다.



상면샷 입니다. 깔끔하게 만들어져 있네요.



다시금 Colorduino 와 동일함을 느끼게 됩니다.



ATmega328 도 보이며, PWM 을 위한 DM163 도 보입니다.



뒷면에는 당당하게(?) Funduino v1.A 라고 마킹되어 있습니다.






7. 장착 및 FTDI 연결


우선 8x8 LED matrix 의 1번 pin (not 어뢰) 를 Funduino 의 1번 소캣에 맞추어 끼웁니다.



Dot matrix 에 딱 가려지는 크기 입니다. 잘 만들었네요.



FTDI 와 pin 연결은 다음과 같습니다.


  FTDI | Funduino
------------------
  DTR  |   DTR
  RX   |   TXD
  TX   |   RXD
  VCC  |   VDD
  GND  |   GND
------------------



실제로 FTDI 와 연결된 모양은 다음과 같습니다.

(한데 묶여있는 선 다발로 조금 지저분해 보이지만, 그건 오해입니다.)



일단, PC USB --> FTDI --> Funduino 를 연결하면, 미리 구워진 프로그램으로 구동됩니다.



동영상으로 찍어 봤습니다.



이쁘네요.





8. Arduino IDE 설정 및 Library 설치


Colorduino 는 기본으로 ATmega328 을 가지고 있으므로,

IDE 에서는 ATmega328 을 실장하고 있는 Arduino Nano / Uno / Duemilanove 어느것을 선택해도 됩니다.



최종적으로 소스 프로그램이 ATmega328 용으로 컴파일 되면 문제가 없으니까요.


Colorduino 의 Library 를 다운로드하여 등록합니다.



그러면 아래와 같이 example 을 로드할 수 있습니다.



아래는 Colorduino 의 Plasma 와, 문자를 스크롤 하는 Library 링크 입니다.

혹시 모르니, 실제 파일도 첨부해 놓습니다.


* Colorduino Library

https://github.com/Electromondo-Coding/Colorduino

Colorduino-master.zip


* Colorduino Scroller Library

https://github.com/Electromondo-Coding/ColorduinoScrollerLibrary

ColorduinoScrollerLibrary-master.zip


위의 Scroller 는 위의 Colorduino Library 와 서로 의존성을 갖습니다.


또다른 버전의 Colorduino Library 도 존재하는데, 그게 아래 링크 및 파일입니다.

위의 Library 와 비슷하지만, 좀더 PWM 이 부드럽게 동작하는 듯 합니다.


그래서, 아래 Colorduino Library 와 위의 Scroller Library 를 혼합하여 설치하면,

Scroller 가 동작하지 않으니 주의가 필요합니다.


* Colorduino Library

https://github.com/lincomatic/Colorduino/

Colorduino-master.zip





9. Plasma 와 Scroller


위의 두 example 을 구동시킨 동영상을 첨부합니다.

우선 Plasma 동영상 입니다.



Scroller 에서는 아래 처럼 text 를 수정하여, 원하는 text 를 뿌려줄 수 있습니다.



Scroller 의 동영상 입니다.






FIN


거의 1년 6개월 걸린, 8x8 LED Dot Matrix 의 동작확인이 이제야 끝났습니다.

뭔가 생산적으로 coding 을 해보고 싶었으나, example 소스를 보고 바로 접었습니다.


꼭 coding 을 해야 할 때가 되면 그때 하려구요.


And

Hardware | MAX30105 파티클 센서 - 2

|

이 글은 이전 MAX30105 파티클 센서를 활용하여 OLED 에 심전도를 그려보는 도전기 입니다.

이전 글은 아래 link 를 참고하세요.


* Hardware | MAX30105 파티클 센서 - 1

http://chocoball.tistory.com/entry/Hardware-MAX30105-particle-sensor-1





1. min, max 와 scalar


일단 MAX30105 에서 입력받는 값은 5만에서 많게는 10만도 넘어갑니다.

이를 32 pixel 너비를 갖는 OLED 에 표현하려면 그 값에 맞도록 축소시켜야 합니다.



이에 더하여, 값들의 기준이 아래 그림처럼 널을 뛰므로 기준값을 잡기가 여간 쉽지 않습니다.



기준값을 잡기 위해 min, max 값을 한 사이클당 판별하여 scale in 치환값을 잡아줘야 합니다.


이를 위해 일단, 이전 사이클에서 얻은 제일 작은 min 값을 이용하여,

입력받는 값에서 빼면 그래프가 아래 그림처럼 내려갑니다.



OLED 폭이 128 pixel 이므로, 이 폭을 한 사이클로 잡습니다.

EXCEL 을 통하여 위의 방식을 검증해 본 결과 문제 없이 표현되는 것을 확인할 수 있었습니다.



OLED 의 y 값에 해당하는 값을 EXCEL 에서 32 pixel 기준으로 변환된 값을 array 에 입력하고

순서대로 출력해서 OLED 에 맞는지 최종 확인해 봅니다.



요리조리 검증해 본 결과 아래 식을 통해서 min, max 값과 한 사이클을 OLED 폭인 128 에 표현하고

다시 0 부터 시작하는 - 화면이 바뀌는 방법을 확인하였습니다.


	irValue = particleSensor.getIR();
	
	if( x > 127) { //refresh OLED screen
		display.clearDisplay();
		lastx=0;
		x=1;
		
		scaler = (max_irValue - min_irValue) / 32;
		pre_min_irValue = min_irValue;
		
		// reset min, max value
		max_irValue = irValue;
		min_irValue = irValue - 1;
	}





2. y값 reverse


OLED 에 표현시, x/y 값은 우리가 일반적으로 배운 왼쪽 아래에서 시작되는 것이 아니라,

왼쪽 위로부터 값의 증가를 표현합니다.



즉, sensor 로부터 값을 입력 받으면, 상하 전치를 시켜줘야 합니다.

제가 쓰고 있는 것은 상하 32 pixel 이므로, 아래 한 pixel 을 빼면 31 이므로,

31 에서 입력받은 값을 빼주면 표현하고자 하는 위치로 바꿀 수 있습니다. 



	// invert y values to fit OLED display
	if ( pre_min_irValue > irValue) {
		y = 31;
	} else {
		y = 31 - ((irValue - pre_min_irValue) / scaler);
	}

값이 너무 적어지면, 값이 역전하여 아래 그림같이 튀어버립니다.

그래서 전 사이클에서 확인 되었던 min value 보다 적어지면 강제적으로 최저값을 할당합니다.

여기서 "y = 31" 은 OLED 상에서는 제일 밑에 표시되는, 일상의 0 값과 같습니다.






3. BPM 과 piezo buzzer


심전도의 값이 가장 높아지면 buzzer 를 울리게 하는 소스 입니다.

또한 BPM 값도 표현해 줍니다.


BPM 값은 심전도의 한 사이클 평균을 내어 1분동안 얼마나 맥박이 뛰는지를 수치화 한 값입니다.



소스는 다음과 같고, 아래 blog 를 전면 참고하였습니다.


* Heart beat Sensor and “ECG” Display

http://www.xtronical.com/basics/heart-beat-sensor-ecg-display/


	ThisTime=millis();
	if( y < UpperThreshold ) {
		if(BeatComplete) {
			BPM=ThisTime-LastTime;
			BPM=int(60/(float(BPM)/1000));
			BPMTiming=false;
			BeatComplete=false;
			tone(2,1000,250);
		}
		if(BPMTiming==false) {
			LastTime=millis();
			BPMTiming=true;
		}
	}
	if((y > LowerThreshold) && (BPMTiming))
		BeatComplete=true;






4. source


지금까지의 작업을 모두 합하여 하나의 소스로 만들었습니다.


#include "Wire.h"
#include "MAX30105.h"

#include "SPI.h"
#include "Adafruit_GFX.h"
#include "Adafruit_SSD1306.h"

// Hardware SPI
#define OLED_DC     6
#define OLED_CS     7
#define OLED_RESET  8
Adafruit_SSD1306 display(OLED_DC, OLED_RESET, OLED_CS);

MAX30105 particleSensor;

unsigned int irValue;
unsigned int max_irValue;
unsigned int min_irValue;
unsigned int x = 0;
unsigned int y;
unsigned int lastx = 0;
unsigned int lasty = 0;
unsigned int scaler;
unsigned int pre_min_irValue;
int BPM;
int LastTime = 0;
int ThisTime;
bool BPMTiming=false;
bool BeatComplete=false;
#define UpperThreshold 10
#define LowerThreshold 25

void setup() {
  Wire.begin();
  display.begin(SSD1306_SWITCHCAPVCC);
  display.clearDisplay();
  
  // initialize sensor
  if (!particleSensor.begin(Wire, I2C_SPEED_FAST)) { //Use default I2C port, 400kHz speed
    display.println("MAX30105 was not found. Please check wiring/power.");
    while (1);
  }
  
  //Setup to sense a nice looking saw tooth on the plotter
  byte ledBrightness = 0x1F; //Options: 0=Off to 255=50mA
  byte sampleAverage = 8; //Options: 1, 2, 4, 8, 16, 32
  byte ledMode = 3; //Options: 1 = Red only, 2 = Red + IR, 3 = Red + IR + Green
  int sampleRate = 1000; //Options: 50, 100, 200, 400, 800, 1000, 1600, 3200
  int pulseWidth = 411; //Options: 69, 118, 215, 411
  int adcRange = 4096; //Options: 2048, 4096, 8192, 16384
  
  particleSensor.setup(ledBrightness, sampleAverage, ledMode, sampleRate, pulseWidth, adcRange); //Configure sensor with these settings
  
  // initiate min, max values
  irValue = particleSensor.getIR();
  max_irValue = irValue;
  min_irValue = max_irValue - 1; 
  for (int ini ; ini < 100 ; ini++) {
	  irValue = particleSensor.getIR();
	  
	  if (max_irValue < irValue) {max_irValue = irValue;}
	  if (min_irValue > irValue) {min_irValue = irValue;}
  }
  
  display.display();
}

void loop() {
	irValue = particleSensor.getIR();
	
	if( x > 127) { //refresh OLED screen
		display.clearDisplay();
		lastx=0;
		x=1;
		
		scaler = (max_irValue - min_irValue) / 32;
		pre_min_irValue = min_irValue;
		
		// reset min, max value
		max_irValue = irValue;
		min_irValue = irValue - 1;
	}
	
	display.setTextColor(WHITE);
	ThisTime=millis();

	// invert y values to fit OLED display
	if ( pre_min_irValue > irValue) {
		y = 31;
	} else {
		y = 31 - ((irValue - pre_min_irValue) / scaler);
	}
	
	// draw heartbeat lins
	display.drawLine(lastx, lasty, x, y, WHITE);
	lasty = y;
	lastx = x;
	
	// update min, max values
	if (max_irValue < irValue) {max_irValue = irValue;}
	if (min_irValue > irValue) {min_irValue = irValue;}
	
	ThisTime=millis();
	if( y < UpperThreshold ) {
		if(BeatComplete) {
			BPM=ThisTime-LastTime;
			BPM=int(60/(float(BPM)/1000));
			BPMTiming=false;
			BeatComplete=false;
			tone(2,1000,250);
		}
		if(BPMTiming==false) {
			LastTime=millis();
			BPMTiming=true;
		}
	}
	if((y > LowerThreshold) && (BPMTiming))
		BeatComplete=true;
	
	// display BMP
	display.fillRect(0,24,64,32,BLACK);
	display.setCursor(0,24);
	display.print("      BPM");
	display.setCursor(0,24);
	display.print(BPM);
	
	// check finger is on the sensor
	if (irValue < 10000) { display.setCursor(1,1); display.print("NO Finger?"); }
	
	// display all data to OLED
	display.display();
	x++;
}


결과 동영상을 올려 봅니다.







FIN


이걸 구현해 보려고 3주간 주말 = 토, 일 이틀간 x 3 = 6일 동안 삽질의 연속이었습니다.

이 문제는 소스에서 scalar 를 구하기 위한 나누기를 해야 하는데, % 연산자를 사용했기 때문이었습니다.


* Modulo

https://www.arduino.cc/reference/en/language/structure/arithmetic-operators/modulo/


% 연산자는 몫을 구하는 것이 아니라, 나머지를 구하는 연산자지요!!!

반대로 알고 있었던 것. 이걸 알아 차리는데 6일이나 걸렸습니다!!!



변수의 갯수도 줄여 보기도 하고, 각 값을 먼저 scale in 해서 결과를 내보기도 하고, 하여간 별짓 다 했습니다.

처음에 디버깅만 잘 했어도 이렇게 오래 걸리지는 않았을 듯 하네요.

디버깅 작업이 얼마나 중요한지 새삼 깨닳았습니다.



이렇게 하면 Serial Monitor 에도 이렇게 나오니 환장할 노릇이었습니다.


이 덕에 Hardware SPI 활용과 OLED refresh rate 등등을 공부하게 되었네요.

아이고야... 좀 쉬자.


SpO2 농도 값이나, 그래프를 좀더 안정적으로 보여줄 수 있도록 소스를 더 다듬고 싶었지만,

에너지를 너무 많이 써서 이번 작업은 여기까지 하겠습니다.


나중에 다시 생각나면, 소스코드를 다시 잡아 볼께요.


And

Hardware | LED 구매하기

|

1. 아이고


일본의 후지산 등반부터, 각종 아웃도어 활동시에 사용되었던 Petzl 의 헤드렘프.

특히 캠핑에서는 없으면 안될 장비였죠.


작년 가을에 갔던 캠핑시 강풍과 비를 맞이하게 되어 저녁에 텐트를 급하게 옮기느라 머리에 이 헤드램프를 쓰고 작업을 했더랬죠.



사용 후, 캠핑장구류에 같이 넣어 놓고 11월에 한번 더 캠핑을 가게 되었죠.

저녁에 캠핑장에 도착해서 이 헤드램프를 꺼내 쓰려고 하니, 동작하지 않았습니다.

이런 낭패가...



집에 돌아가서 분해해 살펴 보았습니다.

밧데리에 물이 뭍어 부식되면서, 나사 겹합부를 타고 들어가 보드까지 부식이 진행된걸 확인하게 되었습다.

아...



완전 맛이 갔네요.

애정이 많이 간 장비라 직접 고쳐보고 싶어졌습니다.




2. LED


보드 부식도 문제지만, 처음 분해시 LED 분리한답시고 LED 다리에 인두를 너무 오래 지져서, LED 가 하나 맛이 갔습니다.


교환용 LED를 구매해야 하는데, 이참에 입맛에 맞는 LED를 구매하고 싶었습니다.

조건은 다음과 같았죠.


* 직진성이 좋아야 한다

* 가능하면 고휘도 여야 한다

* white 보다는 warm white 를 장착하여 멀리서도 식별되게 한다


특히 warm white 는 색도가 달라, 저녁에 뻘에서 해루질 하더라도 헤드램프 만으로도 가족 식별이 쉬워질것 같았고,

개인적으로 warm white 를 좋아하는 지라, 선택하게 되었습니다.




3. Staw Hat / Inverted Cone


첫번쨰 조건인 "직진성" 을 생각해 봤을 땐,

LED 중에서 머리가 평평한 LED가 렌즈 효과처럼 빛을 다발로 잡아주어 LED 렌즈 이탈 시, 직진성을 갖을것 같았습니다.


그런데 정 반대더군요 !!!

사실은, 머리가 평평한 LED 내부는 움푹 들어간 모양이고,

머리 꼭지 부분은 오히려 더 빛을 산란시키기 위해 거울처럼 머리를 깎아 놓은 것이였습니다.


* What is the advantage of a "straw hat" (inverted cone) LED?

https://electronics.stackexchange.com/questions/2089/what-is-the-advantage-of-a-straw-hat-inverted-cone-led/2090




위의 그림이 산란 방식을 가장 잘 설명해 놓았습니다.


아래 글은 크리스마스 트리에 장식하는 LED 들에 대한 이야기 인데,

LED 소자들을 보면 Staw Hat 이라는 것을 알 수 있습니다.


* LED Christmas Light String Guide

https://blog.1000bulbs.com/home/led-christmas-light-guide



둥그런 머리 모양과 평평한 - 그렇지만 아쪽이 파인것 같이 된 - 모양의 빛의 성질에 대해 설명한 그림은 다음과 같습니다.



마침 사는 아파트 앞에 교회가 있어서, 크리스마스 때부터 지금까지 설치된 LED 소자를 확인해 봤습니다.



진짜로 크리스마스 트리용 LED는 Staw Hat 이었네요!!!

이렇게 이미 광범위하게 쓰이고 있는줄은 처음 알았습니다.



다른 각도에서 샷 하나 더.

머리는 평평하지만 안쪽으로 파인 모양이 보이죠?!



그래서 옆에 지나다닐 때, 눈이 부시지 않았구나.




4. Round Hat


그럼 둥근 모양이면 다냐...

그건 또 아니더구요.


길이가 짧고 납작한 LED 는 직진성이 Staw Hat 보다는 좋지만, 빛을 퍼지게 하는 효과가 있었습니다.



결국 Standard 한, 납작하지도 않고, 평평하지도 않은, 우리가 흔히 보는 LED가 가장 직진성이 좋았던 것이였습니다.

오히려 빛을 모아준다는군요.



결국 가장 일반적인 5mm 짜리 warm white LED 를 구매하기로 합니다.

(자료 찾는게 시간이 더 걸림)




5. 구매


역시 AliExpress 에서 구매합니다.

Warm white 는 다른 색과 같이 섞어서 파는 옵션이 없네요.


100개나 쓸까 싶습니다만, 1000원정도에 무료배송이므로 구매합니다.


* Smart Electronics 100pcs/lot F5 Super Bright 5MM Round Warm White Transparent LED Light Lamp Emitting Diode High Quality

https://ko.aliexpress.com/item/Smart-Electronics-100pcs-lot-F5-Super-Bright-5MM-Round-Warm-White-Transparent-LED-Light-Lamp-Emitting/32597841882.html




전기적 성질은, 3.0~3.2V 구동 전압에 빛의 확산성이 30도로 나옵니다.






6. 도착


가격이 싸고, 무료배송이다 보니 한달정도 걸렸습니다.



알리스러운 뽁뽁이 소포 비닐봉투로 왔습니다.



그냥 평범한 5mm LED 입니다.




7. 불을 켜보자


그냥 불을 키는건 재미가 없으니, SOS 를 Morse 부호로 켜 봅니다.



Layout 은 다음과 같습니다.



LED 는 소자 보호를 위해서 꼭 저항이 연결되어 있어야 합니다.

저항은 저번에 사용한 330 Ohm Resistor Network 를 사용했습니다.


* Hardware | Resistor Network 을 사용해보자

http://chocoball.tistory.com/entry/Hardware-Resistor-Network-using


Sketch 는 다음과 같아요.


int ledPin = 13;
// LED connected to digital pin 13
void setup() {
	pinMode(ledPin, OUTPUT);
}

void flash(int duration) {
	digitalWrite(ledPin, HIGH);
	delay(duration);
	digitalWrite(ledPin, LOW);
	delay(duration);
}

void loop() {
	flash(200); flash(200); flash(200);
	// S
	delay(300);
	// otherwise the flashes run together*//
	flash(500); flash(500); flash(500);
	// O
	flash(200); flash(200); flash(200);
	// S
	delay(1000);
	// wait 1 second before we start
}


생각한 대로 잘 나옵니다.



아래는 동영상 입니다.

S 는 짧은 3개, O 는 길게 3개네요.



살짝 누런 빛이 나는것 같기는 합니다.

자~ 그럼 원래 목적인 Petzl 의 헤드렘프를 고쳐 볼까나~?


라고 생각했지만, 오늘은 여기까지만 하기로합니다.




FIN


헤드램프도 그렇지만, 이번에 알게된 Morse Code 에 대해서도 좀더 알고 싶어졌습니다.

Morse Code 를 쉽게 구동시키는 arduino 코드를 만들어 볼까 합니다.



And

Life | LED 전등의 잔불을 없애보자

|

1. LED 잔불


화장실 전구가 나가서 아껴 두웠던 LED 전구로 갈아 끼웠습니다.


그치만, 이게 뭔가요.

전등을 꺼도 도깨비 불처럼 켜져 있네요.


인터넷에 찾아보니 "잔불" 이라고 합니다.



저녁에 자다가 화장실 갈 때는 좋은데,

유령 불같다고 애들이 무서워 합니다.


계속 켜져 있으니, 전기도 더 소비될 것이고, 소자에 무리가 갈 듯 합니다.




2. 전기 상을 바꿔 보기


두꺼비 집에서 인입되는 전기의 상(相) 을 바꿔 보면 된다고 합니다.

공통선 (ground) 와 인입선이 바뀌면서 잔불이 생길 수 있다고 하네요.


도식으로 그려보면....

그려보고 싶지만 귀찮습니다.


전류가 LED 전구로 먼저 들어가게 될 경우에 이런 경우가 생긴다고 하네요.


두꺼비 집 작업 전에 감전을 방지하기 위해 절연되는 장갑을 찾아봅니다.

라텍스 장갑밖에 없네요. 일단 생명을 보존하기 위해 착용합니다.



두꺼비집을 열고 전등 부분만 내려 놓습니다.

빨간색과 검은색을 바꾸어 봅니다.



자 바꾸었으니 올려 봅니다.



실패 !!!




3. 스위치의 LED 제거


스위치의 LED 전구가 있으면, 그로 인하여 전류가 샌다고 합니다.


그림으로 그려보면...

귀찮으니 생략합니다.



스위치 소켓을 분리해야 하니, 커버를 제거합니다.

손에 땀이 많이나 장갑에 물이 고입니다. 장갑을 집어 던집니다.


이사올때도 손을 보지 않아서 어마무시하게 더럽습니다.



송풍기도 같이 연결되어 있으니 배선을 잘 기억해 놔야 합니다.

저는 사진으로 찰칵.



벽에서 나온 선을 제거하면 이렇게 됩니다.



네군데 있는 걸림 돌기를 밀어 내어서 파란색 뚜껑을 땁니다.

잘 안되어서 힘주어서 들어 냈더니만, 사진에서 오른쪽 윗부분의 걸림쇄 부분이 부러졌습니다...



LED 가 붙어있는 기판을 들어낸 모습 입니다.


교류 220V 전원임에도 불구하고 딸랑 저항 한개와 소형 LED로 괜찮은 것인가? 라는 의구심을 갖게 됩니다.

전공이 전자공학이지만 학교를 놀러다녀서 전혀 생각나지 않습니다.

60Hz 라서 반쪽 파형이 무시되어서 그런가 라고 짐작만 해 봅니다.



인두와 납 흡입기를 이용하여 소자들도 분리합니다.

안녕~.



중간에 있는 동판이 왔다갔다 하면서 ON/OFF 를 담당하게 됩니다.

저걸 끼운 상태로 뚜껑을 덮는게 여간 힘든게 아닙니다. 자꾸 위치에서 벗어납니다.


한 10번정도 시도 끝에 뚜껑이 잘 닫혔습니다.




4. 결과


후훗. 성공입니다.

저희 집은 상의 변화가 아니라 스위치단의 LED 제거로 해결되는 구조인 것 같습니다.


스위치단에 뭔가 회로를 추가로 구성하면 될 것 같으나,

시간이 너무 오래 걸리면, 가장으로서의 대처능력을 의심받게 되므로 이 선에서 마무리 합니다.



가장으로서의 자존심을 +1 회복하였습니다.




5. 참고


220V 60Hz 가 걸리는 전원에 어떤 LED 와 저항이 달려있는지 궁금하여 측정해 봅니다.



저항은 약 180kOhm 정도 되네요.



LED 는 1.8V 정도의 소비 voltage 특성을 가집니다.


LED 가 AC power 에 DC로 연결되는 부분은 나중에 좀더 고민해 보겠습니다.

그렇지 않아도, 멀티탭 - power bar 에 사용되는 LED 들은 어떤 처리들이 되어 있는지 궁금했거든요. (같은 원리)




FIN


집안 일은 끝이 없습니다.

And

Hardware | LED bar graph 를 컨트롤 해보자 - 1

|

1. Arduino 와 LED bar graph


이미 LED bar graph 를 사용해 봤습니다.

아래 글들은 본 포스팅과 관련 있는 글 들입니다.


* Hardware | LED bar graph 를 이용해 보자

http://chocoball.tistory.com/entry/Hardware-LED-bar-graph


* Hardware | Resistor Network 을 사용해보자

http://chocoball.tistory.com/entry/Hardware-Resistor-Network-using


* Hardware | 74HC595 shift register 를 사용해 보자

http://chocoball.tistory.com/entry/Hardware-74HC595-shift-register


우선 arduino 와 direct 연결과 shift register 1개를 이용해서 연결을 해보기로 합니다.





2. Digital Pin 으로 직접 컨트롤


LED bar graph 의 anode 쪽을 arduino 의 digital Pin 에 직접 연결하여 전원을 공급함과 동시에 LED 를 on/off 하는 방법입니다.



Source code 는 쉽지만, arduino 와 직접 연결되는 선이 많아집니다.

또한, D13 pin 까지 쓰면 더이상 연결할 수가 없습니다.


   LED       |   Arduino
   Bargraph  |   Nano
----------------------------
   anode 2   |     D2
   anode 3   |     D3
   anode 4   |     D4
   anode 5   |     D5
   anode 6   |     D6
   anode 7   |     D7
   anode 8   |     D8
   anode 9   |     D9
   anode 10  |     D10
   anode 11  |     D11
   anode 12  |     D12
   anode 13  |     D13
     GND     |     GND
----------------------------


참고한 사이트는 아래와 같습니다.

http://www.4tronix.co.uk/arduino/ArduinoLearning.pdf


int timer = 50; // The higher the number, the slower the timing. int pins[] = { 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 }; // an array of pin numbers int num_pins = 12; // the number of pins (i.e. the length of the array) void setup() { int i; for (i = 0; i < num_pins; i++) // the array elements are numbered from 0 to num pins - 1 pinMode(pins[i], OUTPUT); // set each pin as an output } void loop() { int i; for (i = 0; i < num_pins; i++) { // loop through each pin... digitalWrite(pins[i], HIGH); // turning it on, delay(timer); // pausing, digitalWrite(pins[i], LOW); // and turning it off. } for (i = num_pins - 1; i >= 0; i--) { digitalWrite(pins[i], HIGH); delay(timer); digitalWrite(pins[i], LOW); } }

Source code 는 참고한 사이트것을 그대로 사용하빈다.

단순히 digitalWrite 를 이용한 컨트롤 되겠습니다.



연결 사진 입니다.



구동 동영상 입니다.





3. Shift Register 를 이용하는 방법


Shift Register 를 이용하면 data / latch / clock 핀인 3개의 digital pin 만으로 컨트롤이 가능합니다.

여러 sensor 를 사용할 때에는 이 방법이 최선으로 보입니다.


이미 shift register 를 이용하여 확인해 봤습니다만, 이 글에서 한번 더 해봅니다.


* Hardware | 74HC595 shift register 를 사용해 보자

http://chocoball.tistory.com/entry/Hardware-74HC595-shift-register


우선 74HC595 pin 정보 입니다.



원본 data sheet 는 다음과 같습니다.


595datasheet.pdf


참고한 link 는 다음과 같습니다.


https://www.sqlskills.com/blogs/paulselec/category/shift-registers.aspx


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


  LED       | Shift Register | Arduino
  Bargraph  |   SN74HC595N   |  Nano
---------------------------------------
  anode 1   | Q1 (pin 1)     |
  anode 2   | Q2 (pin 2)     |
  anode 3   | Q3 (pin 3)     |
  anode 4   | Q4 (pin 4)     |
  anode 5   | Q5 (pin 5)     |
  anode 6   | Q6 (pin 6)     |
  anode 7   | Q7 (pin 7)     |
            | GND (pin 8)    |  GND
            | Vcc (pin 16)   |  3.3V
  anode 0   | Q0 (pin 15)    |
            | DS (pin 14)    |  D11     --> dataPin
            | OE (pin 13)    |  GND
            | ST_CP (pin 12) |  D8      --> latchPin
            | SH_CP (pin 11) |  D12     --> clockPin
            | MR (pin 10)    |  3.3V
----------------------------------------


Layout 입니다.

Arduino 에서는 컨트롤 위한 선이 3개만 사용된 것을 보실 수 있을껍니다.



연결된 모습니다.



Source code 입니다.


shiftOut 이라는 명령어를 쓰면 쉽게 동작시킬 수 있으나,

참고한 사이트의 제작자는 오로지 공부를 위해 digitalWrite 명령어를 사용했습니다.


/*
  Driving a 74HC595 shift register
  01/27/2010
*/

// This pin gets sets low when I want the 595 to listen
const int pinCommLatch = 8;

// This pin is used by ShiftOut to toggle to say there's another bit to shift
const int pinClock = 12;

// This pin is used to pass the next bit
const int pinData = 11;

void setup() {
	pinMode (pinCommLatch, OUTPUT);
	pinMode (pinClock, OUTPUT);
	pinMode (pinData, OUTPUT);
	//Serial.begin (56600);
} // setup

// Using my own method with as few instructions as possible
// Gotta love C/C++ for bit-twiddling!
void sendSerialData2 (byte  value) {
	// Signal to the 595 to listen for data
	digitalWrite (pinCommLatch, LOW);
	
	for (byte bitMask = 128; bitMask > 0; bitMask >>= 1) {
		digitalWrite (pinClock, LOW);
		digitalWrite (pinData, value & bitMask ? HIGH : LOW);
		digitalWrite (pinClock, HIGH);
	}
	
	// Signal to the 595 that I'm done sending
	digitalWrite (pinCommLatch, HIGH);
}  // sendSerialData2
  
void loop() {
	for (int counter = 1; counter < 256; counter++) {
		sendSerialData2 (counter);
		delay (75);
	}
} // loop


구동시킨 동영상 입니다.





4. 더 간단하게 사용해 보기


위와 같은 동작을 시키는 좀더 간단한 tutorial 이 있습니다.


https://www.arduino.cc/en/Tutorial/ShiftOut


shiftOut 이라는 명령어로 쉽게 구현되었습니다.

https://www.arduino.cc/reference/en/language/functions/advanced-io/shiftout/


//**************************************************************//
//  Name    : shiftOutCode, Hello World                                
//  Author  : Carlyn Maw,Tom Igoe, David A. Mellis 
//  Date    : 25 Oct, 2006    
//  Modified: 23 Mar 2010                                 
//  Version : 2.0                                             
//  Notes   : Code for using a 74HC595 Shift Register           //
//          : to count from 0 to 255                           
//****************************************************************

//Pin connected to ST_CP of 74HC595
int latchPin = 8;
//Pin connected to SH_CP of 74HC595
int clockPin = 12;
////Pin connected to DS of 74HC595
int dataPin = 11;



void setup() {
	//set pins to output so you can control the shift register
	pinMode(latchPin, OUTPUT);
	pinMode(clockPin, OUTPUT);
	pinMode(dataPin, OUTPUT);
}

void loop() {
	// count from 0 to 255 and display the number 
	// on the LEDs
	
	for (int numberToDisplay = 0; numberToDisplay < 256; numberToDisplay++) {
		// take the latchPin low so 
		// the LEDs don't change while you're sending in bits:
		digitalWrite(latchPin, LOW);
		// shift out the bits:
		shiftOut(dataPin, clockPin, MSBFIRST, numberToDisplay);  
		
		//take the latch pin high so the LEDs will light up:
		digitalWrite(latchPin, HIGH);
		// pause before next value:
		delay(50);
	}
}


위의 soruce 는 위의 동영상과 완벽하게 동일한 동작을 합니다.

comment out 라인만 빼면 정말 간단하게 구현되어 있다는 것을 알 수 있죠?


/*
  Shift Register Example
  Turning on the outputs of a 74HC595 using an array

  Hardware:
  * 74HC595 shift register 
  * LEDs attached to each of the outputs of the shift register
 */

//Pin connected to ST_CP of 74HC595
int latchPin = 8;
//Pin connected to SH_CP of 74HC595
int clockPin = 12;
////Pin connected to DS of 74HC595
int dataPin = 11;

//holders for infromation you're going to pass to shifting function
byte data;
byte dataArray[10];

void setup() {
	//set pins to output because they are addressed in the main loop
	pinMode(latchPin, OUTPUT);
	Serial.begin(9600);
	
	//Binary notation as comment
	dataArray[0] = 0xFF; //0b11111111
	dataArray[1] = 0xFE; //0b11111110
	dataArray[2] = 0xFC; //0b11111100
	dataArray[3] = 0xF8; //0b11111000
	dataArray[4] = 0xF0; //0b11110000
	dataArray[5] = 0xE0; //0b11100000
	dataArray[6] = 0xC0; //0b11000000
	dataArray[7] = 0x80; //0b10000000
	dataArray[8] = 0x00; //0b00000000
	dataArray[9] = 0xE0; //0b11100000
	
	//function that blinks all the LEDs
	//gets passed the number of blinks and the pause time
	blinkAll_2Bytes(2,500); 
}

void loop() {
	for (int j = 0; j < 10; j++) {
		//load the light sequence you want from array
		data = dataArray[j];
		//ground latchPin and hold low for as long as you are transmitting
		digitalWrite(latchPin, 0);
		//move 'em out
		shiftOut(dataPin, clockPin, data);
		//return the latch pin high to signal chip that it 
		//no longer needs to listen for information
		digitalWrite(latchPin, 1);
		delay(300);
	}
}


// the heart of the program
void shiftOut(int myDataPin, int myClockPin, byte myDataOut) {
	// This shifts 8 bits out MSB first, 
	//on the rising edge of the clock,
	//clock idles low
	
	//internal function setup
	int i=0;
	int pinState;
	pinMode(myClockPin, OUTPUT);
	pinMode(myDataPin, OUTPUT);
	
	//clear everything out just in case to
	//prepare shift register for bit shifting
	digitalWrite(myDataPin, 0);
	digitalWrite(myClockPin, 0);
	
	//for each bit in the byte myDataOut
	//NOTICE THAT WE ARE COUNTING DOWN in our for loop
	//This means that %00000001 or "1" will go through such
	//that it will be pin Q0 that lights.
	for (i=7; i>=0; i--) {
		digitalWrite(myClockPin, 0);
		
		//if the value passed to myDataOut and a bitmask result 
		// true then... so if we are at i=6 and our value is
		// %11010100 it would the code compares it to %01000000 
		// and proceeds to set pinState to 1.
		
		if ( myDataOut & (1 << i) ) {
			pinState= 1;
		} else {
			pinState= 0;
		}
	//Sets the pin to HIGH or LOW depending on pinState
	digitalWrite(myDataPin, pinState);
	//register shifts bits on upstroke of clock pin  
	digitalWrite(myClockPin, 1);
	//zero the data pin after shift to prevent bleed through
	digitalWrite(myDataPin, 0);
	}
	
	//stop shifting
	digitalWrite(myClockPin, 0);
}


//blinks the whole register based on the number of times you want to 
//blink "n" and the pause between them "d"
//starts with a moment of darkness to make sure the first blink
//has its full visual effect.
void blinkAll_2Bytes(int n, int d) {
	digitalWrite(latchPin, 0);
	shiftOut(dataPin, clockPin, 0);
	shiftOut(dataPin, clockPin, 0);
	digitalWrite(latchPin, 1);
	delay(200);
	
	for (int x = 0; x < n; x++) {
		digitalWrite(latchPin, 0);
		shiftOut(dataPin, clockPin, 255);
		shiftOut(dataPin, clockPin, 255);
		digitalWrite(latchPin, 1);
		delay(d);
		digitalWrite(latchPin, 0);
		shiftOut(dataPin, clockPin, 0);
		shiftOut(dataPin, clockPin, 0);
		digitalWrite(latchPin, 1);
		delay(d);
	}
}


위 소스는 segment 의 모양을 dataArray 를 사용하여 표현하는 soruce 입니다.



위의 소스를 구동시킨 동영상 입니다.




FIN


12 segments LED bar graph 를 한개만 써서 하는 것은 확인해 봤습니다.


1 개의 shift register 만 사용하면 8개까지만 사용이 가능하니, 12 segments 을 모두 활용하지 못했습니다.

Shift register 를 daisy chain 으로 추가 엮어 주면 가능하다고 합니다.


따로 글을 작성해 보겠습니다.


And

Hardware | LED bar graph 를 이용해 보자

|

1. 그래프

저는 graph pettish 입니다.

데이터를 가지고 그래프로 표현하는 것에 환장한다는 뜻이지요.


방대한 data 를 가지고 하나의 graph 로 표현하면서,

그 data 가 가지는 의미를 파악하는 것을 정말 좋아합니다.


요즈음은 big data 가 유행하고 있어, big data 를 가지고 가치있는 insight 를 발굴해 내는 사람을 data scientist 라고 부르기도 합니다.

아마 지금 직업이 아니였더라면 이쪽으로 갔을지도 모를 일입니다.



아두이노에 대해 웹서핑하다가 LED bar graph 를 가지고 진행 상황을 확인하는 동영상을 보게 됩니다.

그것도 graph 에다가 반짝이는 LED 를 엮어놓은 bar 입니다.


그래 저거야!

당장 구입하려고 조사해 봅니다.




2. 구입

오늘도 AliExpress 삼매경으로 구입 대상을 물색합니다.

여러 종류의 LED bar graph 가 존재하네요.


특히 색을 한가지밖에 표현 못하는 제품이 기본인 듯 합니다.

녹색이냐, 파란색이냐, 빨간색이냐...


또한, segment 라고 해서 한개의 bar 에 몇개의 LED 를 표현하느냐의 갯수의 선택도 해야 합니다.


일단 많이 표현하고 싶고, LED 는 기본이 빨간색이야, 라고 믿기에

빨간색 12 segment 짜리를 구입합니다.



스펙은 다음과 같다고 합니다.



내부 회로 구성은 다음과 같다고 하네요.



잘 보면, 하나하나의 LED 가 다음과 같은데,

이런 LED 를 하나의 패키징으로 만든 제품입니다.



모든 LED 관련 부품은 Anode / Cathode 방향이 중요합니다.

이거 잘못 하는 바람에 한개의 segment 를 날려 먹었습니다.




3. 원리

원리는 다음과 같다고 합니다.

전위차로 인하여 분리되어 있던 전자가 움직이면서 광자를 내는 원리 입니다. (뭔소리여)


그림이 잘 되어 있어서 가져와 봤습니다.

저도 이런 그림을 잘 그려보고 싶네요.





4. 도착

요즈음의 AliExpress 는 배송이 막 한달 걸리고 그러지 않는것 같습니다.

약 2주만에 도착했어요.


구성품은 빨간색 12 segment LED bar graph 가 5개 입니다.



밑면입니다.



옆면입니다.

다리의 간격은 빵판의 간격과 같습니다.



윗면입니다.





5. 테스트

아래와 같이 빵판에 연결합니다.



처음에 연결을 잘못 했습니다.

Anode / Cathod 를 반대로 했죠.

안켜지니 5V 에다도 연결을 했더랬습니다.


결과는 그 부분만 LED 가 나가버렸습니다.

예전에도 LED 한개짜리를 결손 잘못으로 인하여 나간적이 있었는데 똑같은 실수를 반복했습니다.


잘 찾아보니 모서리 부분에 갈아 낸것처럼 표시가 된 부분이 anode (+) 라고 하네요.



그럼 저항은 어느쪽에?

구글링하여 찾은 다음 사진처럼 anode 에 연결했습니다.



저항은 anode / cathod 어느 방향에다 설치하든 상관이 없다는 것을 방금 실험해서 알 수 있었습니다.

그래도 그림이 저렇게 되어 있으니 똑같이 해봅니다.




6. 결과

잘 동작합니다.



동영상도 올려 봅니다.

중간정도의 LED 는 동작하지 않습니다. 처음 제품 받았을 적에 anode / cathod 확인도 안하고, 5V 인가시에 죽은 segment 입니다.



속이 좀 쓰리긴 합니다만, 다음에는 이제 같은 실수는 안하겠죠?




FIN

LED segment 하나하나에 저항을 연결하지 않아도 되는 resistor network 라는 부품과

LED 점등을 관리해주는 74HC595 라는 chip 을 사용하여, 최종적으로 arduino 와 연결해 보려 합니다.


일단 부품이 오면 진행하는 것으로.

And

Hardware | 삼성 USB 마우스 분해해 보기

|

1. 친숙한 마우스

저번에 제조업의 Microsoft 가 만든 무선 마우스를 분해 해 봤습니다.


http://chocoball.tistory.com/entry/Hardware-Microsoft-wireless-mouse-4000


휠 고무가 녹아버린는 것 말고는 참 잘 만든 마우스였습니다.


그럼 다른 마우스들은 어떨까 하고 고장난 삼성 마우스를 분해해 보겠습니다.




2. 오늘의 주인공

고장나서 굴러다니던 삼성 USB 마우스 입니다.


가격 차이가 있어서 고가의 무선마우스와 단순비교는 의미가 없을 수도 있겠지만,

가격 차이가, 구조적으로 어떻게 차이를 나타내는지 보는것도 괜찮을것 같습니다.





3. 분해

분해는 간단 합니다.

우선 궁둥이쪽 나사를 하나 뺍니다.



많이 단순하네요.



분해는 이게 끝입니다.




4. 내부 부품

USB 케이블에 페라이트 코어가 있네요.

다른 이야기 이지만, 그 많은 페라이트 코어가 얼마나 효과가 좋은지는 모르겠어요.


휠을 누르면 눌리는 스위치와 좌우 스위치가 있습니다.


또한 휠 고정축에 휠을 이용해 스크롤을 감지해주는 노브가 있습니다.

최대한 구성을 간단하게 한 흔적이 옆보입니다.


콘덴서와 저항이 원가절감으로 빠져 있네요.


광원과 감지 센서가 나란히 있습니다.



기판을 붙잡고 있는 돌기를 제끼면 기판을 분리할 수 있습니다.

다만, 이 돌기는 강질이라서 힘을 많이 주면 부러져 버리네요.


수리를 전제로 만들어진 제품이 아니라는 것을 알 수 있습니다.

끼워 넣을때는 가능하지만 빼낼때는 부러지게 되어 있습니다.



광원의 수신 센서부 입니다.

광원을 반사시키는 프리즘 같은 투명 플라스틱은 그냥 걸처져 있습니다.



기판을 완전히 들어낸 사진 입니다.



USB에 연결하여 광원을 확인해 보았습니다.

이게 레이저인가 LED 인지 잘 모르겠습니다.


보기에는 고휘도 LED 인것 같이 보입니다.

부품 적출해서 가지고 놀면 되겠습니다.





FIN

다른 마우스들도 분해해 보고 싶네요.

And

Hardware | Arduino 로 Photoresister 가지고 놀기 - 1

|

1. Photoresistor

광원을 받으면 저항값이 바뀌는 소자가 photo-resistor 입니다.

다른 말로는 Light Dependent Resisor (LDR) 이라고도 합니다.


빛을 받으면 저항값이 내려가고, 어두워지면 저항값이 올라가는 반응을 이용합니다.



보통, 어두워지면 자동으로 전기가 켜지는 가로등에 많이 쓰이고 있죠.



저번에 했던 motion sensor 에, 이 photoresistor 를 추가하여 개조하기 위해 구입해 봅니다.


http://chocoball.tistory.com/entry/Hardware-HCSR501-PIR-motion-sensor




2. 구입 및 도착

AliExpress 에서 "GL5528" 로 검색하면 보편적인 Photoresistor 가 검색됩니다.


https://ko.aliexpress.com/item/20Pcs-Photo-Light-Sensitive-Resistor-Photoresistor-5528-GL5528/1852500725.html



무료배송이 행복합니다.


배송까지 약 2주정도 걸렸습니다.

요즈음은 대략 2주정도 걸리는군요.



실물은 이렇게 생겼습니다.



구글에서 보던 줄이 더 촘촘하고 긴 모듈을 상상했으나,

조금 간단한 제품입니다.




3. Layout

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

특이한건, 저항과 Photoresistor 연결점을 A0 로 한다는 것 정도 입니다.


 Photoresistor | 
-------------------------------
      +        |      A0
      +        |   220 ohm (1)
      -        |      GND
-------------------------------

  220 ohm (1)  | 
-------------------------------
      +        | Photoresistor
      -        |      GND
-------------------------------

 
    LED    | 
----------------------------------
     +     |     D8
     -     |  220 ohm (2) -->  GND
----------------------------------




4. Code

Source code 입니다.


//photoresistor A Style Tech.

int Pr = 0; // will be used for analog 0.
int PrValue = 0; // value of output
int Pr_Input = 10; // value of when light is on

void setup() {
  Serial.begin(9600); //start serial Monitor
  pinMode(8, OUTPUT); // pin 8 as output
}

void loop() {
  PrValue = analogRead(Pr);
  Serial.println(PrValue); //prints photoresistor value
  delay(100); // value updated every 0.1 second.

  if (PrValue < Pr_Input) {
    digitalWrite(8, HIGH);
  } else {
    digitalWrite(8, LOW); }
}




5. 구동

구동 잘 되네요.



IDE의 Serial Monitor 로 확인해본 결과 입니다.

10 이하의 값이 나오는 경우는 손으로 photoresistor 를 막아서 빛을 못받게 하는 상황입니다.

이때 LED 가 켜지죠.



잘 되쥬?



나름 재미 있네요.




FIN

이제 뭘하지?

And
prev | 1 | 2 | next