'2019/08'에 해당되는 글 9건

  1. 2019.08.30 Software | Daum AdFit 등록해 보기
  2. 2019.08.28 Hardware | LED 전등 교환기
  3. 2019.08.26 Hardware | 555 chip 알아보기 - 1
  4. 2019.08.14 Hardware | ESP-01 or ESP8266 사용기 - 5 2
  5. 2019.08.13 Hardware | ZP07-MP901 공기질 측정 센서
  6. 2019.08.12 Hardware | ADS1115 16bit 4채널 ADC 를 사용해 보자 6
  7. 2019.08.10 Hardware | Digital Compass - HMC5883L 사용기 - 3
  8. 2019.08.04 Hardware | Arduino 를 DIY 해보자 - 2
  9. 2019.08.02 Hardware | 납땜 주변 용품

Software | Daum AdFit 등록해 보기

|

1. 광고


고백하자면, 이 블로그를 시작한 이유 중 하나가 본업 외에 용돈도 좀 벌어보자도 있었습니다.

지금은 광고 수입이 너무 작아, 신경쓰지 않고 자아 실현에 그 중점을 옮겼습니다만 :-)


지금까지 AdSense 만을 광고 툴로 사용해 왔습니다.


* Software | Google Analytics 를 이용한 블로그 분석

https://chocoball.tistory.com/entry/Software-Google-Analytics-blog


* Software | Google AdSense 가입 및 설정하기

https://chocoball.tistory.com/entry/Software-Google-AdSense-PC


수익을 오픈해 보자면, 3년 걸려서 30 USD 정도 수입이 생겼습니다.

이 정도 블로그에서 용돈을 생각한다면 너무 과한 욕심이죠.




2. Daum 에는 AdFit


회사 동료로부터 블로그 시작한지 얼마 되지 않아 소주 한병 마실 정도는 되었다는 정보를 입수.

저도 AdFit 을 적용하기로.


사실 광고가 너무 많으면, 글 읽는데 집중이 되지 않으니, 최소한으로 하려 했습니다만,

돈앞에 장사 없으므로, 저도 한번 AdFit 을 적용해 보기로 합니다.





3. 등록


아래 link 에서 ID 등록합니다.


* Daum AdFit

https://adfit.biz.daum.net/



뭔가 동의하는 페이지에서 동의해 주구요.



시키는 대로, 계정에 대한 정보를 다 넣어주면 됩니다.






4. 등록


이제 web page 에 광고를 삽입하기 위한 HTML code 를 얻을 차례 입니다.



저의 이 블로그에 올린꺼라고 알려 주고요.



전체 페이지에서의 위치, 크기 등을 정하고 코드를 받습니다. 



그런 다음, 블로그의 "플러그인" 메뉴에 가서 Daum AdFit 설정에 들어갑니다.



AdFit 관리 화면서에 등록한 대로, 동일한 위치와 크기의 profile 을 만듭니다.

그리고 그 profile 에 HTML code 를 복사하기 합니다.



이렇게 하므로써, 직접 HTML coding 할 필요 없이, Tistory 에서 자동으로 지원하는 플러그인이 web page 로딩시 삽입해 주게 됩니다.

넘 편해~.





5. 적용 후


적용하면, 아래처럼 의도한 대로 광고가 노출됩니다.



아래도요.



다만, Google AdSense 처럼, 광고 노출이 적절한 사이트 인지 심사가 있습니다.

심사 결과가 나오지 않아서, 첫날은 그냥 노출만 되고 실제 수익에는 반영되지 않습니다.






6. 심사 완료


3년정도 블로그에 계속 글을 올려서 인지, 하루만에 심사 패스 했습니다.

이제 돈좀 벌어 보자~!



상단 오른쪽에 하나 더 심었습니다.



각 페이지 하단에도 하나 심었구요.



한 3일 지나니 아래와 같은 그래프를 보여 줬습니다.



한 1000년 있으면 부자 될 것 같습니다.


글이 워낙 기술 기술 하다보니 재미도 없고, 유입이 없는것 같네요.

web site 에서 기술적으로 대응할 수 있는 부분은 대부분 손 본것 같고, 이제 글 내용을 조금 재미있게 쓸 수 있게 노력해 보겠습니다.


그러면서도 이 딱딱한 문체는 잘 바뀌지 않네요. 하... 고민.


And

Hardware | LED 전등 교환기

|

1. LED 전등


한창 LED 전구로 전등을 바꾸는 붐이 불 때 (아마도 2016년도 쯤), 저도 그 흐름에 동참하고 싶었습니다.

LED 는 LG Innotek 이 좋네, 삼성이 좋네, LED 모듈에는 그에 맞는 SMPS 를 구매해야 하네 등, 여러 정보를 수집했더랬습니다.


대략 제품을 정해 놓고 막상 교체할 전등 갯수에 맞는 비용을 상정해 봤더니, 그 당시 거진 40만원 선.


그냥 싼마이 현광등을 10년 이상치를 사놔도 되는 금액이었습니다.

그에 반하여 전기료에 미치는 영향은 미비. 왜냐하면 한여름 아니면 한달 전기세가 1만 5천원을 넘지 않으니.


비록 당시의 꿈을 펼치지는 못했지만, 마음속에 계속 간직하고 있었습니다. (이게 뭐라고~)





2. 쓰레기장


때는 2019년 봄, 유독 올해는 세계의 기운이 바뀐다는 2019년 봄 여느 일요일.

평소와 다름 없이 쓰레기를 버리러 가다, 쓰레기장에 버려진 LED 전등이!


이사를 새로 오면서 기존에 달린 전등을 탈거하고 수거장에 버린 듯 합니다.


으아아아아앙아아아아~~~!!!!!

바로 집으로 가지고 옵니다.



꽤나 긴 LED 모듈 입니다.



생산연도는 잘 모르겠습니다.



3P 전선 연결 커넥터도 득템 하구요.



철제로 된 베이스 판은 도로 쓰레기장에 갔다 버리고, LED 모듈이 정상인지 테스트 해봅니다.



한놈은 중간이 들어오지 않는군요.

LED 모듈은 LED chip 몇개를 한 그룹으로 나누고, 그룹끼리 전원이 병렬로 연결되어 있습니다.

그룹내 에서는 LED chip 끼리는 직렬로 연결되어 있어서, 그 중 한놈만 죽어도 저렇게 한 그룹이 나갑니다.



해체하면서 손상되었는지 위 사진처럼 손상된 chip 들이 꽤 있습니다.

누런 찌꺼기도 많아서, 1000원짜리 소독용 에탄올로 일단 씻어 놓습니다.



이번에 수거한 LED 는 길이가 길고, 손상된 LED chip 들이 많아, 회생시키고 실제 활용하려면 손이 많이 갈것 같습니다.





3. again 쓰레기장


음?!!! 몇 주 지나지 않아 또다른 LED 전등이 쓰레기장에 버려져 있었습니다.



이 친구는 군데군데 chip 이 아예 타버렸네요.



탄게 아니라 거의 폭발 수준.



기판에도 폭발시의 열기로 변형되어 있는 부분이 있습니다.



전원 커넥터는 분리하다가 바스라져 버리네요.

강력본드로 복구는 해 놓습니다.




전등 제조사에서 붙여놓은 스펙입니다.

소비전력이 명기되어 있지 않습니다만, 정격 입력전력이 사용되는 전력일까요? 그렇다면 꽤나 많은 양이네요.



컨버터 용량을 보니 3개 해서 90W 는 사용할 것 같습니다.

생산연도는 2016년 입니다.



일단 살아있는 놈 하나 건집니다.






4. 필요한 부품 구매


기존 형광등 하우징에 설치되어 있는 형광등 부품을 제거하여 공간을 마련하고, 아래 그림처럼 LED 모듈을 자석으로 고정하도록 합니다.



단, 위처럼 생긴 자석은 그리 센것이 없어서,

네오디뮴으로 되어 있고, 중앙에 구멍이 뚫려 있어 볼트를 이용해서 스페이서와 고정할 수 있는 자석을 구입할껍니다.


우선 얼마나 LED 모듈 기판을 띄울 것인지, 기존 거실 현광등의 하우징을 측정해 봅니다. 깊이는 42mm.



기존 control box 의 높이는 21mm.



그렇담, 25mm 정도를 띄워 주면 되겠군요.


우선 하우징 철판에 고정할 수 있도록, 네오디움 자석을 구입합니다. 높이는 3mm.

구매시 주의할 점은, 너트를 끼워도 높이에 영향가지 않도록, 가운데가 오목한 제품을 선택해야 합니다.


* 5/10/20pcs 10 x 3mm Hole: 3mm Ring Neodymium Countersunk Magnets 10x3 Super Strong Rare Earth Magnet 10*3-3

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



크기가 10mm 가 적당한지, 12mm 가 적당한지 몰라, 두 가지 모두 일단 10개씩 구입합니다.


* 10pcs 12 x 3 mm Hole 3 mm Super Strong Ring Loop Countersunk Magnet Rare Earth Neo Neodymium Magnets Cylinder 3mm

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



붙을 수 있는 금속이 근처에 있으면 무섭게 달라 붙기 때문에, 꽤 두꺼운 뽁뽁이에 쌓여져 배달되었습니다.



우선 10mm 짜리가 왔습니다.

특별히 문제는 없지만, 철판과 닿는 면적이 작아서 그렇게까지 세게 붙어있지 않습니다.



나중에 12mm 짜리가 와서 모두 장착해 봤더니, 딱 맞는 세기로 잘 붙었습니다.

여러분들도 동일한 작업시에는 12mm 짜리 구입하세요.


다음으로는 대가리가 평평한 볼트 입니다.


* 50pcs M1 M1.2 M1.4 M1.6 M2 M2.5 M3 M4 Mini Micro Small Black 304 Stainless steel Cross Phillips Flat Countersunk Head Screw Bolt

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



있어보이게 black zinc 로 된 제품으로 구입했습니다.



볼트 헤드가 납짝해야 자석과 채결 시, 네오디뮴 자석이 철판에 닿는 것을 방해하지 않습니다.



볼트의 내 직경이 3mm 짜리를 M3 로 칭하는 것 같습니다. 모든 부품들을 M3 나 3mm 로 통일합니다.


불트를 구매했으니 너트도 필요하겠죠?


* 50pcs/20pcs/lot Nylon Lock Nut DIN985 M2 M2.5 M3 M4 M5 M6 Steel With Black OR White Znic

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



너트 안에 고무가 있어, 잘 풀어지지 않는 너트를 구입했습니다.



스페이서는 22mm 짜리를 구매합니다. 그래야 22mm (스페이서) + 3mm (자석) = 25 mm 라는 계산이 나옵니다.


역시 동일하게 M3 형식입니다.

한 끝쪽에 3mm 볼트를 채결할 수 있도록 되어 있습니다. 설명에는 6mm 가 파여있다고는 하지만, 더 파져 있습니다.


* 50Pcs M3*5/6/8/10/12/14/16/18/20/25+6mm Hex Nut Spacing Screw Brass Threaded Pillar PCB Computer PC Motherboard Standoff Spacer

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



볼트 + 스페이서 + 너트를 채결하면 다음과 같습니다.





5. 기존 부품 제거


기존 현광등과 관련된 전선을 제거합니다.



LED 흉내만 내고 1년이 안되어서 죽어버린 LED 형광등을 제거합니다.



안정기와 소켓, 그리고 지지대 등이 제거되니 깔끔해 집니다.






6. LED 모듈 장착


먼저 도착한 10mm 직경 자석이 사진에서 오른쪽, 12mm 가 왼쪽 입니다.

10mm 도 괜찮지만, 좀더 확실히 하기 위해 모두 12mm 네오디뮴 자석으로 교체합니다.



중앙이 움푹 파인 자석을 구매했지만, 패이지 않은 자석이 하나 있네요. QA 가 대충인 결과입니다.



전원 커넥터에 쉽게 삽입이 될 수 있게, DC 컨퍼터의 전선 끝을 납땜해 줍니다.



DC 전원 컨버터 다리에도 자석을 붙여서 하우징 철판에 붙여 줍니다.

딱 소리 나면서 잘 붙는게 기분 좋네요. 위치가 마음에 안들면 요리조리 움직여도 됩니다. Neodymium 자석 넘 좋아요.



접지도 잊지 않고 해 줍니다. 사진에서 녹색 전선이 접지 입니다.



LED 모듈 본체 부착!

따따닥~! 하면서 고정되었습니다.



한가지 아쉬운 점은 길이가 맞지 않아 윗 사진처럼 비틀어서 넣어야 한다는 것.



겉유리 마저 채결하면 작업 끝 입니다.





7. 마무리


부품 수급 과정이 오래 걸렸지만, 막상 작업시에는 문제 없이 끝났습니다.



아핫 깔끔 하군요.

거추장 스러웠던 예전 부품들을 버리고 내부가 깔끔해 진 것 같아서 기분이 좋습니다.


다만, LED 라고 해도 열이 꽤 있네요. 열이 잘 빠져나갈 수 있는 구조가 아니다 보니, 조금 걱정이 됩니다.

애초 디자인 부터 열배출을 감안하고 등가구들을 만들어 주면 어떨까 하는 생각이 매번 듭니다.


전등을 손볼 때 마다 드는 생각이, 나만의 등기구를 만들어 보고 싶다 입니다.

기능적 구조에서 디자인 까지 마음에 쏙 드는 제품을 찾아보기 힘든게 등가구 아닌가 싶습니다.

마음같아서는, 열 배출이 잘되는 등기구의 하우징, DC 컨버터 모듈 커버 및 회로 디자인, LED 모듈 디자인 등을 직접 해보고 싶네요.



이 작업 했다고 이 난리가 되었습니다.


And

Hardware | 555 chip 알아보기 - 1

|

1. History


원래는 4x4 DIP socket 이 필요해서 찾아보던 중, 555 chip 에 소켓도 같이 딸려오는 패키지가 있어, 555 를 접하게 되었습니다.

이 555 chip 은 아날로그를 디지털화 시켜주는 chip 으로써, 개발하신 분도 이렇게까지 널리 사용될 줄은 몰랐다고 합니다.


1972년에 소개된 것이, 지금도 여전히 많이 사용되고 있고, 그 갯수가 한해 10억개에 이른다 합니다.


기본적인 사용처로는, timer, pulse generation, 그리고 oscillator 등에 사용된다고 합니다.

사용법은 간단하여, 입력단의 저항과 캐패시터, 또는 스위치를 이용하여 output 을 조절한다고 합니다.


* 555 timer IC

https://en.wikipedia.org/wiki/555_timer_IC






2. 구매


원래 DIP socket 구매의 주 목적은, ATtiny85 flashing 시, 잘못된 fuse bit 를 flashing 하게 되면 ATtiny85 가 벽돌이 됩니다.

이를 환생시켜 주기 위해서는 9~12V 를 이용하여 chip 을 reset 해줘야 하는 데, 그 회로를 만들기 위해 4x4 DIP 소켓이 필요했습니다.

아래 글에서 나와 있듯이 ATtiny85 를 Digispark 로 만들어 보면서 필요하게 된 내용 입니다.


* Hardware | ATtiny85 개발 보드를 이용하여 Digispark 를 DIY 하기

https://chocoball.tistory.com/entry/Hardware-Digispark-DIY-using-ATtiny85


뭐, 시작이 어찌 되었 건, 555 chip 을 접할 수 있는 계기가 되었으니 즐겁게 구매를 진행해 봅니다.

*  MCIGICM 20pcs , (10 each) NE555 IC 555 & 8 Pin DIP Sockets

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



도착은 아래와 같습니다.



도착샷을 올리는 것은, 포스트 내용을 길게 빼기 위해서 항상 빠질 수 없는 짓 입니다.



원하는 4x4 DIP 소켓을 얻게 되었구요.



NE555 chip 이 부차적으로(?) 딸려 왔습니다. :-D



사양 문서는 아래 올려 놨습니다.

lm555.pdf





3. 기본 원리


555 에 대해서 동영상과 설명이 가장 잘 되어 있는 사이트는 아래와 같습니다.


* 555 Timer IC – Working Principle, Block Diagram, Circuit Schematics

https://howtomechatronics.com/how-it-works/electronics/555-timer-ic-working-principle-block-diagram-circuit-schematics/


언뜻 보기엔 어려워 보이지만, 전자공학과 관련된 기초적인 지식만 가지고 있으면 이해할 수 있다고 봅니다.

아래 설명들은 위의 내용을 간략해서 올려 봅니다.


555 의 물리적인 diagram 과 논리적인 diagram 은 다음과 같습니다.



논리적인 구성은 다음과 같고, 전체적으로 보면,

입력 voltage 를 나누고 > 비교하고 > Flip-Flop > 방전 시키면서 출력에 변화를 가하는 회로로 이해 할 수 있습니다.



실제 구현을 살펴 보기 전에, 전체적인 흐름을 설명하면 다음과 같습니다.



우선 Vcc 를 통해서 받은 voltage 가 모든 것의 시작이 됩니다.

아래 예에서는 12V 를 입력하여, comparators 에 들어가는 input 을 저항을 통해 6V/3V 로 바꿔서 넣어 줍니다.



Threshold / Trigger 입력단을 통해, Vcc 의 1/3, 2/3 voltage 인 6V/3V 와 비교시켜, flip-flop 의 입력으로 사용합니다.



참고로 flip-flop 은 다음 그림과 같이, NAND gate 를 가지고 논리적인 output 값을 가집니다.



저도 처음 해보는 지라, 설명을 해 놓고도 이게 뭔말인가 싶습니다.

실제로 관련된 회로를 꾸며봐야 이해하기 쉬울 듯 합니다.


우리 주위에서 가장 흔히 볼 수 있는 활용 예는, 경찰차 표시등이나, 규칙적인 전구의 점등 등이 있겠습니다.





4. Mode : Bistable


위의 동작방식을 가지고 꾸며 볼 수 있는 방법이 3가지가 있습니다.

그 중, 먼저 Bistable 모드에 대해 알아봅니다.


아래처럼 Vcc 와 Trigger / Reset 사이에 저항과 스위치를 각각 가지고 있는 회로를 보겠습니다.



우선 스위치를 누르지 않았을 때의 초기 상태는 0 이 output 으로 출력됩니다.



Trigger 스위치를 누르게 되면, comparator 가 1 로 바뀌고, 결과적으로 output state 가 1 로 바뀌게 됩니다.



그 후, Reset 스위치를 누르면, 다시 초기 상태로 되돌아 옵니다.

이는 555 chip 을 flip-flop 처럼 사용하고 싶을 때 구성하는 방식이 되겠습니다.



아래 그림처럼, Trigger 와 Reset 은,

연속적으로 입력받는다 할 지라도, 최종 output 에는 영향 주지 않으며, 상태를 계속 유지하게 됩니다.



활용도 면에서는 memory cell 이 있겠습니다. Reset 되기 전 까지는 Trigger 가 한번이라도 되면 그 값을 계속 유지하게 되니까요.





5. Mode : Monostable


Trigger 단자에는 스위치 하나와 저항 하나, 그리고 ,Threshold 에는 캐페시터가 연결되어 있고,

Discharge 단자에 이 캐페시터가 연결되어 있는 구조 입니다.



처음에는 Trigger 단자로 Vcc 가 연결되어 있으니 활성화 되어 있고,

Q-bar 와 연결된 트랜지스터가 활성화 되어 Discharge 단자로 들어오는 Vcc 가 상쇄됩니다.

결과적으로 output 은 0 인 상태이고, 회로 전체적으로 아무 변화를 일으키지 않는 상태 입니다.



이 안정된 상태에서 Trigger 스위치가 눌리면, Q-bar 상태가 0 로 변경되면서 트랜지스터가 비활성화 됩니다.

연관하여 이 트랜지스터와 연결되어 있던 Discharge 단자가 차단되고, 캐페시터에 전압이 쌓이게 됩니다.



이 캐패시터의 전압이 2/3 Vcc 에 다다르면, Comparator 에 역전이 일어나면서 전체 회로가 초기 상태로 되돌아 갑니다.



Trigger 입력으로부터 초기 상태로 되돌아가기 까지는 캐패시터와 그와 연결된 저항값에 따라 조절될 수 있습니다.

한번 입력을 넣어 놓으면, 일정 시간이 지나고 자동으로 되돌아 오는 기능이 필요시 사용되는 모드 입니다.





6. Mode : Astable


Astable 모드는 주파수 발진기로 사용될 수 있습니다.

입력받는 저항 및 캐패시터에 의해 정해지는 시간을 주기로 반복적으로 output 값이 1/0 을 나타내게 됩니다.



초기 상태는 트랜지스터가 비활성화된 상태이므로, 캐패시터에 전자가 쌓이게 되고, 1/3 Vcc 지점까지 올라갑니다.

처음 1/3 Vcc 는 Trigger 쪽 Comparator 를 1에서 0 으로 변화시키지만, Q-bar 값을 변화시키지 않으므로, 기존 상태를 유지합니다.



이제 캐패시터가 2/3 Vcc 까지 다다르게 되면, Threshold 쪽 Comparator 상태변화에 따라 최종 output 값이 0으로 바뀌게 됩니다.



이 바뀐 상태가 트랜지스터의 Discharge 회로를 활성화 시키며, 캐패시터의 전자들이 방전되기 시작합니다.

그러면서 1/3 Vcc 까지 떨어지면, 전 회로 상태가 바뀌어, 다시 output 이 1로 변경됩니다.


이제, 캐패시터 voltage 는 1/3 Vcc 에서 2/3 Vcc 사이를 왔다갔다 하면서 충방전이 일어나며, 전체 output 을 0 / 1 변하게 됩니다.

결국 주파수 신호 발생기, pulse generator 역할을 하게 됩니다.



Output 이 1인 상태로 유지하는 시간과 0 을 유지하는 시간은, 저항 2개와 캐패시터 하나의 값에 따라 정해지게 됩니다.


휴.... 이론적인 부분은 여기까지 입니다.





7. Pulse Generator


단순한 구조와 넓은 입력 voltage 값, 잘 고장나지 않는 구조때문에 적용 범위가 엄청 많이 있습니다.

이대로 끝내면 아쉬우니 Astable 상태를 가지고 pulse generation 회로를 꾸며 봤습니다.


아래 사이트를 전적으로 참고하였습니다.


* Introducing 555 Timer IC – Tutorial

연결 회로는 다음과 같습니다.


실제 전자 부품이 연결된 모양은 다음과 같습니다.



무난하게 잘 동작했습니다.

아쉬우니 동영상으로도 남겨 봅니다.






FIN


555 chip 을 알기 위해선 flip-flop 도 이해해야 하고, Op-amp 를 이용한 comparator 도 이해 해야 하고,

대학교 수업 때, 무식하게 외웠던 내용들을 이 나이 되어서야 logic 적으로 이해할 수 있는 계기가 되는 실험이었습니다.


이제 기초적인 내용을 정리해 봤으니,

앞으로는 실생활에 여전히 많이 쓰이는 555 에 대하여, 시간 날 때마다 하나씩 실험해 보겠습니다.


마지막으로, 555 에 대해 나름 유명한 cookbook 들이 있어 PDF 파일을 올려 놓습니다.


Forrest Mims - 555 Timer IC Circuits.pdf


ICTimerCookbook1stEd1977_WalterGJung.zip.001

ICTimerCookbook1stEd1977_WalterGJung.zip.002


50-555Circuits.pdf


555_basics.zip.001

555_basics.zip.002



And

Hardware | ESP-01 or ESP8266 사용기 - 5

|

이번 글을 읽기에 앞서, ESP8266 에 관하여 몇 차례에 걸쳐 다뤄 왔습니다.

ESP8266 을 활용하기 위해서는 여러 지식과 경험이 바탕이 되어야 추가적인 내용을 충분히 이해할 수 있습니다.

시간이 허락되신다면, 먼저 아래 포스팅 들을 참고해 주세요.


* Hardware | ESP-01 or ESP8266 사용기 - 1

https://chocoball.tistory.com/entry/Hardware-ESP01-or-ESP8266-using-1


* Hardware | ESP-01 or ESP8266 사용기 - 2

https://chocoball.tistory.com/entry/Hardware-ESP01-or-ESP8266-using-2


* Hardware | ESP-01 or ESP8266 사용기 - 3

https://chocoball.tistory.com/entry/Hardware-ESP01-or-ESP8266-using-3


* Hardware | ESP-01 or ESP8266 사용기 - 4

https://chocoball.tistory.com/entry/Hardware-ESP01-or-ESP8266-using-4



또한, 이 포스트에서 가장 많이 참고한 사이트는 여기 입니다.


* Using ESP8266 SPIFFS

https://www.instructables.com/id/Using-ESP8266-SPIFFS/





1. SPIFFS


SPI Flash File System 의 약자로서,

ESP8266 등에 장착된 Flash memory chip 의 여유공간에 파일을 쓰기/읽기/삭제 등을 할 수 있게 해주는 기능입니다.


* ESP8266 Arduino Core

https://arduino-esp8266.readthedocs.io/en/latest/filesystem.html


|--------------|-------|---------------|--|--|--|--|--|
^              ^       ^               ^     ^
Sketch    OTA update   File system   EEPROM  WiFi config (SDK)


단, 일판 file system 처럼 directory 구조처럼 하위 폴더 개념이 없고, 1차원적으로 모든 파일을 한곳에 넣어서 사용해야 합니다.



궁극적인 목적으로는,

- ESP8266 등에 장착된 controller 가, 시간과 로드가 많이 걸리는 외부 저장장치에 접근하지 않고, 내부적으로 처리하기 위한 방법

- 파일이 자주 변하지 않으며, 주로 읽혀지는 파일

- 여타 파일 시스템 처럼 bad block 등의 검사나, 마킹을 할 수 없음

- HTML, CSS, JS 파일들을 올려놓고 ESP8266 에서 web server 를 돌릴 수 있슴





2. Arduino IDE 에서 환경 설정


파일을 올리는 툴은 Arduino IDE 에서 하게 되므로, SPIFFS 를 사용할 수 있도록 Arduino IDE 를 설정해야 합니다.

우선 Arduino IDE 에서 SPIFFS 메뉴를 활성화 시키기 위해 아래 순서대로 진행합니다.



A. Plug-In 인스톨

아래 사이트에서 최신 파일을 받습니다.


* esp8266/arduino-esp8266fs-plugin

https://github.com/esp8266/arduino-esp8266fs-plugin/


* Latest version of ESP8266 Arduino

https://github.com/esp8266/arduino-esp8266fs-plugin/releases/tag/0.4.0

ESP8266FS-0.4.0.zip


혹시 모르니, 필요한 파일을 받아서 올렸습니다.



B. 파일을 설치

Arduino IDE 에서 설정된 sketch 폴더에 tools 라는 directory 를 만들어 서 그 안에 위의 파일을 해동하여 넣습니다.



sketch 폴더는 환경마다 다르므로, 현재 쓰고 있는 환경에서 sketch 폴더가 어디인지는 Preference 에서 확인 가능합니다.




C. 설치 완료 확인

설치 후, Arduino IDE 를 재시작 하여 Tools 메뉴에 가 보면,

아래 Before/After 처럼, 새롭게 "ESP8266 Sketch Data Upload" 매뉴가 활성화 된 것을 확인 할 수 있습니다.


Before



After






3. ESP8266 의 용량 확인


파일을 업로드 하기 전, ESP8266 에 달려 있는 Flash memory 의 용량을 확인해 봅니다.

사실 대략 알고 있다면 이 부분은 건너 뛰어도 됩니다.


우선 ESP8266 보드를 Arduino IDE 에서 직접 access 할 수 있도록, 보드를 등록해 봅니다.

보드 등록을 위한 관련 파일을 다운로드 받아 설치하려면, 아래 설정처럼 Preference 에 해당 정보가 등록되어 있어야 합니다.


File > Preference


https://arduino.esp8266.com/stable/package_esp8266com_index.json


아래처럼 등록하면 됩니다.

예전에 Digispark 를 DIY 한 흔적이 있네요. 다른 URL이 이미 있다면, 다음 줄에 등록하면 됩니다.



그럼, 아래 메뉴에서 ESP8266 보드 관련 파일을 설치할 수 있게 됩니다.


Tools > Board > Boards Manager



Boards Manager 에서 esp8266 으로 검색하여, 설치되어 있지 않으면 설치해 줍니다.



여기까지 왔다면, Board 메뉴에서 Generic ESP8266 Module 을 선택할 수 있게 됩니다.



특별히 할 설정은 없슴니다만, SPIFFS 를 2M 사용한다고 설정 했습니다.

다른 설정은 잘 모르겠네요.



이제 Flash memory 확인용 sketch 를 선택합니다.


File > Examples > ESP8266 > CheckFlashConfig



실제 소스는 다음과 같습니다.


/*
  ESP8266 CheckFlashConfig by Markus Sattler
  This sketch tests if the EEPROM settings of the IDE match to the Hardware
*/

void setup(void) {
  Serial.begin(115200);
}

void loop() {

  uint32_t realSize = ESP.getFlashChipRealSize();
  uint32_t ideSize = ESP.getFlashChipSize();
  FlashMode_t ideMode = ESP.getFlashChipMode();

  Serial.printf("Flash real id:   %08X\n", ESP.getFlashChipId());
  Serial.printf("Flash real size: %u bytes\n\n", realSize);

  Serial.printf("Flash ide  size: %u bytes\n", ideSize);
  Serial.printf("Flash ide speed: %u Hz\n", ESP.getFlashChipSpeed());
  Serial.printf("Flash ide mode:  %s\n", (ideMode == FM_QIO ? "QIO" : ideMode == FM_QOUT ? "QOUT" : ideMode == FM_DIO ? "DIO" : ideMode == FM_DOUT ? "DOUT" : "UNKNOWN"));

  if (ideSize != realSize) {
    Serial.println("Flash Chip configuration wrong!\n");
  } else {
    Serial.println("Flash Chip configuration ok.\n");
  }

  delay(5000);
}


!!주의!!

ESP8266 의 Flash memory 에 writing 하기 위해서는 아래 순서에 맞게 해야 합니다.


1. RST 의 스위치를 누른다.

2. FLASH 의 스위치를 누른다.

3. RST 의 스위치에서 손을 뗀다.

4. FLASH 의 스위치에서 손을 뗀다.

5. Flash program 에서 "시작" 을 누른다.



위의 구성처럼, 꼭 외부 전원으로 ESP8266 을 구동시키는 것과,

PC 와 Serial 연결 위한 FTDI 나 CP2102 의 GND 를, 외부전원의 GND 와 서로 연결해 주는 것을 빼먹으면 안됩니다. (동기)


FTDI 는 Serial 통신만을 위한 것이지, ESP8266 의 전원까지 공급하게 하면, 매우 높은 확률로 실패합니다.



컴파일된 sketch 가 잘 밀어들어가고 있고요.



문제 없이 끝났습니다.

Hard resetting via RTS pin... 이라고 나오고, 그 뒤 반응에 대한 내용은 나오지 않습니다.



Serial Monitor 로 확인해 보면, 올라간 sketch 가 잘 구동되는 것을 확인할 수 있습니다.

원래 1MB 였던 Flash memory 가 4MB 로 변경된 것이 확인 됩니다.





4. SPIFFS upload


이제 아까 Plug-in 을 이용해 구현했던 "ESP8266 Sketch Data Upload" 기능을 이용하여 실재로 data upload 를 해 봅니다.

sketch 폴더에 "data" 폴더를 만들고, 거기에 파일을 놔두면, 그 파일이 자동으로 upload 된다고 합니다.



으잉? 빈 깡통이라고 그러네요?

이미 위에서 알고 있는 sketch folder 와 또 다른 곳을 이야기 하는 듯 합니다.

IDE 메뉴의 "Show Sketch Folder" 를 이용하여 어디를 이야기 하는지 확인해 봅니다.


Sketch > Show Sketch Folder



Sketch 폴더가 여기였어? 이 SPIFFS 업로드용 sketch 폴더는 Temp 폴더로 잡혀있나 보네요.

data 폴더를 만들어 주고 업로드 하고 싶은 파일을 심어 놓습니다.



드디어 이 메뉴를 눌러 봅니다.



"SPIFFS Uploading Image..." 라고 뜨면서 막 뭐를 밀어 넣는 것 같습니다.



"SPIFFS Image Uploaded" 라고 뜨면서, "Hash of data verification" 까지 실행하고 끝납니다.

텍스트 파일이라서 그런지 data 압축도 자동으로 되는 것 같습니다.



Data upload 영역과 기존 firmware 영역이 잘 분리되어 있는지, 전원을 리셋하여 command 를 날려 봅니다.

기존 Wi-Fi firmware 영역은 완벽히 구분되어 잘 보존되어 있네요.



아래 그림에서 보이듯, SPIFFS 가 사용하는 File System 영역과 Program 영역이 분리되어 있는지 확인해 본 것입니다.





5. Upload 된 파일 확인


그럼 upload 되어 있는 파일이 진짜 내가 올린 파일인지 확인해 볼까요?

이 글, 맨 처음에 참조한 사이트에서 text 파일 확인용 소스가 있습니다. 그대로 활용해 봅니다. (Steve 고마워요~)


/* Steve Quinn 06/03/17
Copyright 2017 Steve Quinn

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.

 You should have received a copy of the GNU General Public License
 along with this program.  If not, see .

Written to accompany the following Instructable;

'Using ESP8266 SPIFFS'

Compiled using Arduino 1.6.9 
*/

#include "string.h"
#include "FS.h"

bool    spiffsActive = false;
#define TESTFILE "/esp8266_SPIFFS.txt"

void setup() {
	Serial.begin(115200);
	delay(1000);
	
	// Start filing subsystem
	if (SPIFFS.begin()) {
		Serial.println("SPIFFS Active");
		Serial.println();
		spiffsActive = true;
	} else {
		Serial.println("Unable to activate SPIFFS");
	}
	
	delay(2000);
}

void loop() {
	if (spiffsActive) {
		if (SPIFFS.exists(TESTFILE)) {
			
			File f = SPIFFS.open(TESTFILE, "r");
			if (!f) {
				Serial.print("Unable To Open '");
				Serial.print(TESTFILE);
				Serial.println("' for Reading");
				Serial.println();
			} else {
				String s;
				Serial.print("Contents of file '");
				Serial.print(TESTFILE);
				Serial.println("'");
				Serial.println();
				
				while (f.position() < f.size()) {
					s=f.readStringUntil('\n');
					s.trim();
					Serial.println(s);
				}
				f.close();
			}
			Serial.println();
			
			f = SPIFFS.open(TESTFILE, "a");
			if (!f) {
				Serial.print("Unable To Open '");
				Serial.print(TESTFILE);
				Serial.println("' for Appending");
				Serial.println();
			} else {
				Serial.print("Appending line to file '");
				Serial.print(TESTFILE);
				Serial.println("'");
				Serial.println();
				f.println("This line has been appended");
				f.close();
			}
			
			f = SPIFFS.open(TESTFILE, "r");
			if (!f) {
				Serial.print("Unable To Open '");
				Serial.print(TESTFILE);
				Serial.println("' for Reading");
				Serial.println();
			} else {
				String s;
				Serial.print("Contents of file '");
				Serial.print(TESTFILE);
				Serial.println("' after append");
				Serial.println();
				
				while (f.position() < f.size()) {
					s=f.readStringUntil('\n');
					s.trim();
					Serial.println(s);
				}
				f.close();
			}
		} else {
			Serial.print("Unable To Find ");
			Serial.println(TESTFILE);
			Serial.println();
		}
	}
	
	while (true) {
		yield();
	}
}


프로그램 영역에 올려야 구동되므로, IDE 에서 일반 sketch upload 로 밀어 넣습니다.

프로그램이 올라가면 Serial Monitor 를 통해 확인해 봅니다.



제가 작성했던 text 파일이 잘 읽혀지네요. 신기~!



한글 및 ASCII 코드도 잘 읽혀서 변환되었습니다. (OS 가 한글이기도 하고, 파일 인코딩을 UTF-8 로 지정함)



이 소스는 Flash memory 에서 SPIFFS 를 사용하여,

일반 file system 의 IO 처럼, 추가 쓰기가 가능하다는 것을 보여주기 위해 append 기능이 부여되어 있습니다.



이 과정을 통해 기존 firmware 위에 확인용 sketch 가 overwrite 되었으므로,

다시 Wi-Fi firmware 를 입혀주고, 그렇게 해도 여전히 data 영역이 그래도 보존되는지 확인해 봅니다.



그 다음, 다시 위의 소스 sketch 를 입히고 실행시켜 보니, 아래와 같이 한줄 더 추가 되었습니다.



즉, data 영역은 프로그램 용 sketch 나, Wi-Fi firmware 와는 완전 분리된 상태로 관리 되고 있다는 것을 알 수 있습니다.





FIN


ESP8266 에 대해서 5회에 걸쳐 살펴봤습니다.

대략적인 사용법 - 개념, 환경 구성, Flash memory 사용법 - 은 훑어 본것 같습니다.


ESP8266 의 진정한 활용은 무선으로 연결하여 IoT data 나, 실시간 연결을 통한 제어가 주 목적이 되겠습니다.

다음부터는 센서를 가지고 놀면서, IoT 적인 활용법을 익혀 보겠습니다.


And

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

|

1. 공기 질


예전 80년대 개그 프로그램 중, 스위스 공기를 깡통에 넣어 파는 일화가 있었습니다.

사실 확인이 안되니, 서울 공기를 넣어서 파는 사기를 개그로 풀어놓은 내용이었던걸로 기억해요.


그 당시 꼬꼬마였던 저는, 그 당시 상상을 뛰어넘는 내용이라 아직도 그 이미지를 강하게 기억하고 있습니다.

하긴, 물을 사먹는 시대가 온다는 예전 이야기가 현실로 된 지금은, 공기도 사먹는 날이 올지 모르겠습니다.


현실적으로 PM2.5 라는 단어가 바짝 친근해진 요즈음, 공기의 질을 신경써야 하는 시대가 온건 확실해 보입니다.






2. ZP07-MP901 센서


우연한 기회에 이 센서를 얻을 기회가 생겼습니다.

사실은 다른 공기질 측정 센서를 구입했는데, 이게 배달 되어 왔죠.



그때 당시에는 정보가 하나도 없어서, 사용을 못 하고 있다가,

이와 비슷한 센서인 ZP01-MP503 를 기준으로 만든 소스코드를 일전에 발견하여 이번에 사용해 보게 되었습니다.



도착은 이런 비닐 속에 포장되어 왔습니다.

배송 보내준 사람이 얼마나 일을 하기 싫었는지 상상하기 어렵지 않았습니다.



PCB 뒷면에는 컨트롤러 칩이 있고, 윗면에는 센서가 부착되어 있습니다.



ZP07-M901 은 ZP01-M503 보다는 좀더 복잡하게 부품들이 실장되어 있어서, 한단계 위의 제품인 듯 합니다.

아래 사진이 ZP01-M503 입니다.






3. 사양


스펙은 다음과 같습니다.


ZP07-MP901 Air Quality Module V1.1.pdf



위의 PDF 사양서에서 표기되어 있습니다만, 이 센서의 사용에 있어서 주의점 들이 몇가지가 있습니다.



사용전에 예열을 5분정도 꼭 하라고 합니다.

공기질 측정용 센서들은 대부분 센서를 가열하여 공기를 내부에서 태워서 측정하는 듯 합니다.


그래서, 휘발성 물질이 많은 곳에서는 사용을 금하라고 되어 있습니다.


한가지 아쉬운 것은, 측정은 다음 물질들이 가능하나, 공기중의 각 성분 비율을 보여주지 못하고,

밀도 측정을 통한 공기질 좋다/나쁘다 만을 알려줄 수 있습니다.


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

formaldehyde, benzene, carbon monoxide, ammonia, hydrogen,alcohol, smoke of cigarette, essence & etc.

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


온갖 안좋은 것들을 감지할 수 있군요.





4. 연결


Arduino 와의 연결은 다음과 같이 합니다.


 ZP07-MP901 | Arduino Nano
---------------------------
    VCC     |     5V
    GND     |     GND
     A      |     D8
---------------------------

공기 질의 결과 척도는 A pin 에서 digital 로 output 됩니다.

B pin 은 공장에서 사용하는 pin 으로, 측정시 사용되지 않습니다.



실재로는 빵판을 사용하지 않고 pin 들을 바로 연결했습니다.






5. 소스


ZP07-M503 (사실 이런 제품은 없슴) 용 소스 이지만, ZP07-M901 에서 완벽하게 동작합니다.


* Arduino test air quality class module ZP07-MP503 test

https://www.cnblogs.com/aiyauto/p/7388926.html


이 센서는 A pin 에서 오는 신호의 주기에 따라서 구분을 합니다.



그래서 아래 소스를 보면, 대부분이 시간의 delta 값을 찾는것으로 되어 있습니다.


//
// Author: Aiyauto
// VERSION: 0.0.1     
// Date:2017/08/16
// PURPOSE: ZP07_MP503 Air Quality Module Detection Example for Arduino
// 
 
int airQuality;  // Air quality level 0-10 
 
void setup() {
   Serial.begin(9600);
}

void loop() {
  airQuality = ZP07_MP503(8);
  Serial.print("   Current air quality rating: ");
  Serial.println(airQuality);
}
 
int ZP07_MP503(int pinA) {
  
  /* Initial */
  pinMode(pinA, INPUT);
  unsigned long millisTimes = millis();
  unsigned long startMillisTimes = millisTimes;
  
  unsigned long stopMillisTimes;
  signed long deltaMillisTimes = millisTimes - startMillisTimes;
  bool turnState = false;
  bool pinAstate = digitalRead(pinA);
  bool pinAstateLast = pinAstate;
  int result;
  
  /* test read status */
  while (true) {
    pinAstate = digitalRead(pinA);  // Read pin status
    
    if(pinAstate != pinAstateLast) {
      if (turnState == true ) {
        stopMillisTimes = millis();
        if (pinAstate == false ) {
          deltaMillisTimes = stopMillisTimes - startMillisTimes;
        } else {
          deltaMillisTimes = 98 - stopMillisTimes + startMillisTimes;
        }
        
        result = (deltaMillisTimes + 5 ) / 10;  // computation result is rounded
        break;  // out of the loop
      }
      if (turnState == false ) {
        startMillisTimes = millis();  // refresh the current time
        turnState = true; // update flag
      }
      pinAstateLast = pinAstate;
    }
    
    millisTimes = millis();
    deltaMillisTimes = millisTimes - startMillisTimes;
    if ( deltaMillisTimes > 100 ) { // The result is judged, the timeout jumps out of loop
      if (pinAstate == true) {  // air quality level 10
        result = 1;
      }
      if (pinAstate == false) { // air quality level 0
        result = 0;
      }
      
      break;
    }
  }
  
  // Serial.print(" pinAstate:");
  // Serial.print(pinAstate);
  // Serial.print(" , Air Quality Rating:");
  // Serial.print(result);
  // Serial .print(", deltaMillisTimes:");
  // Serial.println(deltaMillisTimes);
  
  return result;  // return air quality level result
}





6. 결과


위의 소스에서 pinAstate 및 deltaMillisTimes 도 표시하도록 조금 변경해서 측정해 봤습니다.

물론 전원 연결하고 5분 뒤에 말이죠.


...
Current air quality rating : 0 | pinAstate:0, air quality level:0, deltaMillisTimes:101
Current air quality rating : 0 | pinAstate:0, air quality level:0, deltaMillisTimes:101
Current air quality rating : 0 | pinAstate:0, air quality level:0, deltaMillisTimes:101
Current air quality rating : 0 | pinAstate:0, air quality level:1, deltaMillisTimes:11
Current air quality rating : 1 | pinAstate:0, air quality level:1, deltaMillisTimes:11
Current air quality rating : 1 | pinAstate:0, air quality level:1, deltaMillisTimes:10
Current air quality rating : 1 | pinAstate:0, air quality level:1, deltaMillisTimes:10
Current air quality rating : 1 | pinAstate:0, air quality level:1, deltaMillisTimes:11
Current air quality rating : 1 | pinAstate:0, air quality level:1, deltaMillisTimes:10
Current air quality rating : 1 | pinAstate:0, air quality level:1, deltaMillisTimes:9
Current air quality rating : 1 | pinAstate:0, air quality level:1, deltaMillisTimes:9
Current air quality rating : 1 | pinAstate:0, air quality level:1, deltaMillisTimes:10
Current air quality rating : 1 | pinAstate:0, air quality level:1, deltaMillisTimes:10
Current air quality rating : 1 | pinAstate:0, air quality level:1, deltaMillisTimes:9
Current air quality rating : 1 | pinAstate:0, air quality level:1, deltaMillisTimes:9
Current air quality rating : 1 | pinAstate:0, air quality level:1, deltaMillisTimes:10
Current air quality rating : 1 | pinAstate:0, air quality level:1, deltaMillisTimes:10
Current air quality rating : 1 | pinAstate:0, air quality level:0, deltaMillisTimes:101
Current air quality rating : 0 | pinAstate:0, air quality level:0, deltaMillisTimes:101
Current air quality rating : 0 | pinAstate:0, air quality level:0, deltaMillisTimes:101
...


위는 센서에 대해 숨을 내쉬었더니 값의 변화가 있었습니다.

그럼 더 쎈건 없을까... 주변을 보던 중, 땀났을 때 몸을 닦는 샤워 페이퍼를 발견합니다.

저번 출장갔을 때, 하나 사다 놓은 것.


몸에 문지르면, 땀도 제거하고 몸이 깨끗해 짐을 느끼게 해주는 물티슈 같은 것 입니다.



성분을 확인 해봤습니다.



에탄올, 멘톨, PPG-6데실테트라데세스-20, 디이소스테아린산PEG-20글리세린, 향료 가 들어 있다고 합니다.

나름 자극도 쎄고, 알콜 냄새가 강하게 나므로, 센서에서 뭔가 반응이 올 듯 합니다.



샤워 타월 한장을 꺼내서 몸좀 닦고 센서 코앞에 갔다 댑니다.


음? 처음에는 왜이리 반응이 안오지? 했습니다.

뭔가 잘못 되었나?


한~~ 참을 있으니 반응이 오는군요.



이렇게 반응이 늦어서 괜찮을까 싶을 정도로 늦습니다.

그래도 뱉어 내는 값은 나름 정확한 듯 합니다.


센서의 스펙 대로라면, delta time = 0ms 가 공기질 좋음 인데, 현실적으로 0ms 의 delta time 을 만들어 낼 수 없으므로,

101ms 이상을 공기질 제일 좋은 0 으로 설정한 것 같습니다.


스펙상으로는 100ms 에서 제일 나쁜 10이 설정되어 있습니다만, 이미 101ms 이상에서 0을 설정해 놨으므로,

이 소스를 가지고는 0~9 까지만 확인할 수 있겠네요.


90ms 대를 10으로 하면 될 것 같은데, 90ms 대의 값이 이 소스를 가지고 도출되지 않더군요.

Source code 를 손 보면 될것 같기도 한데, 귀찮아서 여기서 분석은 그만하기로 해요.


그래프가 빠지면 서운하니 그려 봤습니다.



갑짜기 그래프가 치솟는 것은 워낙 샤워 페이퍼 강도가 쎄서 그런것 같구요,

한번 반응하기 시작 하면, 완전히 그 단계를 벗어날 때 까지 유지하면서 값을 변경하는 것 같습니다.


즉, 실시간으로 민감하게 반응하기 보단, 충분히 그 상황으로 바뀌어야 반응하는 듯 합니다.

이 센서의 감도와 반응 형태를 보고, 그 환경에 맞게 활용하는 것이 중요해 보이네요.


오늘도 잘 놀았습니다.


And

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

|

1. 16 bit ADC


ADC 는 Analog to Digital Converter 의 약자로서, 입력받는 값에 대해 digital 로 표현해 줍니다.

Arduino 에는 이 ADC 가 장착되어 있어서 analog input 에 입력받은 신호에 대해 digital 로 leveling 을 해서 보여줍니다.

즉, analog 값을 digital 로 변환해서 보여주는 것이죠.


참고로, arduino nano 에는 10 bit ADC 가 장착되어 있어서 10 bit (0 ~ 1023) 값으로 표현해 줍니다.


다 좋은데, 민감한 sensor 를 다룰 때에는, 이 10 bit ADC 가 아쉬울 때가 있습니다.

좀더 정밀한 값을 들여다 보고 싶은데, 값과 값의 사이값을 알수가 없는거죠.


이 때 등장하는 것이 외부 ADC 모듈 입니다.

AliExpress 와 arduino 를 사랑하는 사람들의 blog 를 보니 ADS1115 라는 것을 많이 사용하는 군요.


ADS1115 는 Texas Instruments 사의 chip 을 사용한 16 bit ADC 입니다.


ads1115.pdf


- Resolution: 16 Bits

- Programmable Sample Rate: 8 to 860 Samples/Second

- Power Supply/Logic Levels: 2.0V to 5.5V

- Low Current Consumption: Continuous Mode: Only 150µA Single-Shot Mode: Auto Shut-Down

- Internal Low-Drift Voltage Reference

- Internal Oscillator

- Internal PGA: up to x16

- I2C Interface: 4-Pin-Selectable Addresses

- Four Single-Ended or 2 Differential Inputs

- Programmable Comparator


아래 link 의 제품이 적당해 보이네요. 구매합니다.


* I2C ADS1115 16 Bit ADC 4 channel Module with Programmable Gain Amplifier 2.0V to 5.5V for Arduino RPi

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






2. 도착


그간 업무로 정신 없었는데, 어느샌가 도착했습니다.



블로그 내용을 부풀리기 위해서라도 항상 도착샷을 올리는건 필수 입니다.



저렇코롬 생겼구요.



ALERT 와 ADDR 에 pinheader 는 남겨 놓고 납땜하기로 합니다. 그 덕에 2 pinheader 하나 득템.

그 이유는 이 밑에 설명.





3. Addressing


이 ADS1115 는 I2C 통신을 하는데, 하나의 arduino 와 4개까지 연결할 수 있다 보니, I2C 접근 주소가 겹치지 않게 할 수 있습니다.

방법은 ADDR pin 을 어디로 연결하느냐로 address 를 결정할 수 있습니다.


Adafruit 4-Channel ADC Breakouts

https://learn.adafruit.com/adafruit-4-channel-adc-breakouts


- 0x48 (1001000) ADR -> GND

- 0x49 (1001001) ADR -> VDD

- 0x4A (1001010) ADR -> SDA

- 0x4B (1001011) ADR -> SCL


회로를 꾸밀 때 마다, address 정의를 위한 연결을 해도 되지만, 귀찮겠죠?

또한, addressing 을 위해 I2C 용 핀이나, VCC 로 연결하면 왠지 껄끄럽습니다.


그래서 ground 로 연결하여, 기본 0x48 을 가지게 합니다.

또한, 아래 새다리님의 블로그를 보면, 이 연결을 가장 깔끔하게 처리하셨더군요. 따라쟁이는 바로 따라해 봅니다.


* 16비트, 4채널 ADC ADS1115 아두이노 Test

https://m.blog.naver.com/twophase/220801664646


예전에 파손된 멀티탭 전원선에서 동선 한가닥을 짧게 잘라 내어 아래와 같이 납땜 해 주섰습니다.

캡톤 테이프로 혹시 모를 쇼트를 방지했구요.



i2cdetect 로 addressing 이 잘 되었나 확인해 봅니다.


     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- 48 -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --


흠흠. 잘 되었네요.




4. Layout


* Arduino ADS1115 Module Getting Started Tutorial

http://henrysbench.capnfatz.com/henrys-bench/arduino-voltage-measurements/arduino-ads1115-module-getting-started-tutorial/


위의 tutorial 사이트에서 보면 ADS1115 를 활용하여, arduino 자체 3.3V 출력을 세밀하게 검증해 보는 소스가 있습니다.

따라쟁이는 당연 따라서 검증해 봅니다.


연결은 I2C 용 연결 2가닥과 VCC/GND 그리고, 입력용에 arduino 3.3V output 을 연결합니다.


 ADS1115 | Arduino Nano
------------------------
    VCC  |      5V
    GND  |      GND
    SCL  |      A5
    SDA  |      A4
    A0   |      3.3V
------------------------


그림으로 그려보면 다음과 같습니다.






5. Sketch


이미 관련한 library 가 나와 있기 때문에, library 를 설치합니다.

역시 God Adafruit. 없는게 없습니다.



ads1115 로 검색하면 나오지 않고, ads1x 로 검색해야 나옵니다.


이제 HENRY'S BENCH 에서 Henry 아저씨가 arduino 3.3V output 에 대해, ADS1115 를 검증해 놓은 소스를 사용해 봅니다.


#include "Wire.h"
#include "Adafruit_ADS1015.h"

Adafruit_ADS1115 ads(0x48);
float Voltage = 0.0;

void setup(void) {
	Serial.begin(9600);
	ads.begin();
}

void loop(void) {
	int16_t adc0;	// we read from the ADC, we have a sixteen bit integer as a result
	
	adc0 = ads.readADC_SingleEnded(0);
	Voltage = (adc0 * 0.1875)/1000;
	
	Serial.print("AIN0: ");
	Serial.print(adc0);
	Serial.print("\tVoltage: ");
	Serial.println(Voltage, 7);
		
	delay(1000);
}


이 소스에서 가장 중요한 것은 PGA (Programmable Gain Amplifier) 값 입니다.

이 ADS1115 의 default output 최대값이 6.144V 이므로, 이를 15 bit (16 bit 이지만, 부호를 표시하는 1 bit 를 빼면 15 bit 만 활용 가능) 인 32767 로 나누면, 출력 1 에 대해 0.1875mV 라는 계산이 나옵니다.


In the default mode, the setting is +/-6.144 volts.

Thus the value of 32767 would represent a value of 6.144 volts.

Dividing 6.144 volts by 32767 yields a scale factor of 0.1875 mV per bit.   This is a significant improvement over the Arduino ADC which resolution of approximately 5 mV per bit.  In fact, its about 26 times better!


위의 로직이 소스에 활용되었습니다.





6. 결과


지금까지 구성한 layout 과 위의 소스를 가지고 실행해 보면 다음과 같이 결과가 나옵니다.



3.3V 이지만, 미세하게 값이 변하고 있다는 것을 알 수 있습니다.

이게 USB 를 통해서 연결하지 않고 Power source 를 통해서 입력 받으면 좀더 정확하고 잘 변하지 않는 3.3V 를 얻을 수 있다고 해요.





7. 비교


Arduino nano 의 자체 3.3V 를 16 bit ADC 를 거치지 않은 채로, anlogRead (10 bit ADC) 를 하면 어떨까?


참고로 Arduino 의 AnalogReference 의 정의는 다음과 같습니다.

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

Arduino AVR Boards (Uno, Mega, Leonardo, etc.)

- DEFAULT: the default analog reference of 5 volts (on 5V Arduino boards) or 3.3 volts (on 3.3V Arduino boards)

- INTERNAL: an built-in reference, equal to 1.1 volts on the ATmega168 or ATmega328P and 2.56 volts on the ATmega32U4 and ATmega8 (not available on the Arduino Mega)

- INTERNAL1V1: a built-in 1.1V reference (Arduino Mega only)

- INTERNAL2V56: a built-in 2.56V reference (Arduino Mega only)

- EXTERNAL: the voltage applied to the AREF pin (0 to 5V only) is used as the reference.

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


AnalogReference(DEFAULT) 를 사용하여, 5V 기준으로 입력값을 leveling 하게 했으며,

arduino nano 에는 PGA 가 없으므로, 단순히 5V 를 10 bit ADC 해상도를 감안하여, 1024 로 나누어, 한 level 당, 0.0049 V 로 계산하도록 했습니다.



최종 소스는 다음과 같습니다.


#include "Wire.h"
#include "Adafruit_ADS1015.h"
 
Adafruit_ADS1115 ads(0x48);
float Voltage = 0.0;
float Voltage2 = 0.0;	// analogRead(A2)
 
void setup(void) {
    analogReference(DEFAULT);
    Serial.begin(9600);
    ads.begin();
}
 
void loop(void) {
    int16_t adc0;   // we read from the ADC, we have a sixteen bit integer as a result
     
    adc0 = ads.readADC_SingleEnded(0);
    Voltage = (adc0 * 0.1875)/1000;
     
    Serial.print("AIN0: ");
    Serial.print(adc0);
    Serial.print("\tVoltage: ");
    Serial.print(Voltage, 7);

	// analogRead(A2) start
    int16_t adc2;
    adc2 = analogRead(A2);
    Voltage2 = (adc2 * 0.0049);
    
    Serial.print("\tAIN2: ");
    Serial.print(adc2);
    Serial.print("\tVoltage2: ");
    Serial.println(Voltage2, 7);
    // analogRead(A2) end
         
    delay(1000);
}


결과값은 이렇게 나왔네요. 많이 부정확 합니다.


그 원인으로는,

- 5V reference 전압이 USB 를 통해 공급받으며, USB 전원은 불안하게 공급받습니다.

- PGA 가 없이, 단순히 5V reference 전압을 10 bit 로 나눈 값을 기준값으로 정했습니다.

- 16 bit 하고는 비교도 안되는 10 bit 해상도 차이가 납니다.



ADS1115 16 bit ADC 를 이용한 센서값 입력은 보다 정확한 값을 보장해 주네요.

향후 자주 사용해야 겠습니다.


And

Hardware | Digital Compass - HMC5883L 사용기 - 3

|

이 글은 전편 2개가 있습니다.


* Hardware | Digitial Compass - HMC5883L 사용기 - 1

https://chocoball.tistory.com/entry/Hardware-Digital-Compass-HMC5883L-1


* Hardware | Digital Compass - HMC5883L 사용기 - 2

https://chocoball.tistory.com/entry/Hardware-Digital-Compass-HMC5883L-2





1. Why calibration?


이 HMC5883L 이나, 기타 digital compass 는 영점조정이 필요합니다.

Calibration 을 하기 전은 정확성에 있어서 사용할 수 있는 물건이 아니라고도 할 정도 입니다.


또한 지구상에서 내가 어디에 있느냐에 따라 자력의 방향과 세기가 달라지므로, 공장에서 만들어 졌던 들,

이 영점 조정은 꼭 필요하게 된다는 이야기가 됩니다.


현재 위치하고 있는 지리적 장소에 따라 변하는 자력을 계산해 주는 사이트도 있습니다.


* NCEI Geomagnetic Calculators

https://www.ngdc.noaa.gov/geomag/calculators/magcalc.shtml






2. Yury Matselenak


아래 그림처럼 직각 육면체 (박스) 를 이용하여 영점 조정한 사람이 있습니다.


* Advanced hard and soft iron magnetometer calibration for dummies

https://diydrones.com/profiles/blogs/advanced-hard-and-soft-iron-magnetometer-calibration-for-dummies



영점 조절을 위한 arduino code, Visual Studio 2010 C# 을 이용한 검증 어플 및 계산 어플까지 all set 를 혼자 만드신 분이죠.

위의 블로그에서 가져온 소스를 여기에 올려 놓습니다.


MagMaster.rar


위의 압축파일에 모든게 들어 있습니다만,

한가지 아쉬운 것은, 2014년에 만들어진 코드라, 최신 Arduino IDE 에서는 제대로 동작하지 않습니다.

동작만 한다면, 이 분이 안내하고 만들어진 프로그램을 사용하여 영점 조정이 가능하나, 그러지 못했네요.


시간이 생기면 소스를 분석하고, geomagnetic 에 대해 공부하여 소스 개선을 좀 해주고 싶으나, 현재 그럴 여유는 없습니다.


Yuri 아저씨의 방식을 잠깐 설명해 보면, HMC5883L 센서는, PCB에 프린팅 된 XYZ 축의 모양에 따라 다음과 같은 축을 가집니다.



이 센서를 가지고 다음과 같이, 북쪽을 0도로 정하고 3차원 공간에서 XYZ 값을 가져오면, 틀어진 중심점을 알 수 있으니,

측정시에 그 틀어진 만큼을 빼주거나 더해주면 된다는 이론 입니다.



모두 12가지를 측정하여, 그 값들을 가지고 틀어진 중심점을 구하는 방식 입니다.





3. Sequential Quadratic Programming


측정된 값을 가지고 SQP (Sequential Quadratic Programming) 을 통해 최적의 영점을 잡아주는 방식도 있습니다.

(보다 기술적인 것은 잘 모름)


본 방식은, 아래 블로그에서 소개되었습니다.


* 電子コンパスHMC5883Lのキャリブレーションに挑戦

http://tomoto335.hatenablog.com/entry/arduino/HMC5883L


결과적으로 SQP 를 실행해야 하는데, 이를 Octave (상용 MatLab 의 GNU 버전) 을 통해서 답을 구할 수 있다고 하네요.

Yuri 아저씨 방식이 안되니, 이 방식으로 진행해 봅니다.





4. Octave


SQP 계산을 위해, 일단 Octave 를 설치해 봅니다.


* GNU Octave

https://www.gnu.org/software/octave/



사용하는 OS 에 맞게 다운로드 하구요.



인스톨 실행파일을 실행 시킵니다.



나에게 맞게 설정하구요.

저는 바탕화면이 지저분하게 되는게 싫어서 "Install for all users" 만 선택했습니다.

BLAS library 는 뭔지 모르니 그냥 OpenBLAS 로 놔뒀습니다.



Windows 10을 새로 깔았더니만 JRE 가 없네요. Octave 는 JRE 가 필요하다 합니다. 깔아 줍니다.



자 이제 다음으로 넘어갑니다.





5. 연결


우선 arduino 와 HML5883L 을 다음과 같이 연결합니다.


 HMC5883L | Arduino Nano
-------------------------
    VCC   |      5V
    GND   |      GND
    SCL   |      A5
    SDA   |      A4
-------------------------


그리고 I2CScanner / I2Cdetect 를 이요하여 address 0x1E 를 통해서 잘 인식 되었는지 확인합니다.



     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 1e --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --


Hardware 준비는 끝났으니, arduino source 준비로 넘어갑니다.





6. 값을 입력받자


HMC5883L 을 구동시켜 주는 몇 가지 Library 들을 확인해 봤는데, Adafruit 에서 만든 Unified library 가 가장 짱인 것 같습니다.



OS 를 싹 밀었더니만 예전 library 가 다 날라갔네요. 깔끔하게 다시 설치해 줍니다.



바로 실행하면, Octave 에서 계산을 방해하는 문자들이 들어가니 아래와 같이 단순한게 XYZ 값만 입력받게 합니다.


#include "Wire.h"
#include "Adafruit_Sensor.h"
#include "Adafruit_HMC5883_U.h"

/* Assign a unique ID to this sensor at the same time */
Adafruit_HMC5883_Unified mag = Adafruit_HMC5883_Unified(12345);


void setup(void) 
{
  Serial.begin(9600);
  
  /* Initialise the sensor */
  if(!mag.begin())
  {
    /* There was a problem detecting the HMC5883 ... check your connections */
    Serial.println("Ooops, no HMC5883 detected ... Check your wiring!");
    while(1);
  }
  
}

void loop(void) 
{
  /* Get a new sensor event */ 
  sensors_event_t event; 
  mag.getEvent(&event);
 
  /* Display the results (magnetic vector values are in micro-Tesla (uT)) */
  Serial.print(event.magnetic.x); Serial.print(",");
  Serial.print(event.magnetic.y); Serial.print(",");
  Serial.println(event.magnetic.z);
}


그러면 다음과 같은 결과들을 얻을 수 있습니다.


...
-21.82,-9.36,-41.94
-16.45,-8.73,-47.24
-16.45,-8.73,-47.24
-16.45,-8.73,-47.24
-9.64,-6.91,-51.43
-9.64,-6.91,-51.43
-9.64,-6.91,-51.43
-3.55,-4.00,-53.27
-3.55,-4.00,-53.27
-3.55,-4.00,-53.27
2.55,-1.27,-54.18
...


Serial Monitor 의 값들을 카피하여 txt 파일로 하나 만들어 놓습니다. 이게 Octave 에서 사용될 소스 값입니다.


참고로 Yuri 아저씨가 만들어 주신 MagMaster 프로그램 중에, MagViewer 라는게 있습니다.

실행시키면, 입력받을 Serial Port 를 물어보는데, arduino 와 연결된 port 를 지정하면 값들을 읽어와서 3차원 공간에 뿌려 줍니다.



훗, 확실히 틀어져 있군요.



동영상으로도 올려 봅니다. Graph Fetish 인지라, 이런거 보면 사족을 못 씁니다.

마우스로 요리조리 움직일 수 있어서 3차원 공간에서 어떻게 값들이 찍히는지 실시간으로 알 수 있습니다.





7. 영접을 찾아 보자


이제 Octave 에서 SQP 를 시켜 볼 차례 입니다.

Serial Monitor 에서 받은 값들을 파일로 만든 다음, Octave 내에서 아래 command 를 실행 시킵니다.


global points
points = csvread("HMC5883L_org_uncal.txt");
scatter3(points(:,1), points(:,2), points(:,3));


느낌이 예전 GNU Plot 을 사용하는 것이랑 매우 비슷하네요. Command 도 비슷하고.



짜잔~! 3차원으로 찍힌 그림을 그려줍니다. 이는 아까 MegViewer 로 본 모습이기도 합니다.



값들이 모두 입력 되었으니, 틀어진 값을 찾기 위해 SQP 해 봅니다.


function retval = sphere_errors(p, x)
  retval = sqrt( (p(:,1).-x(1)).^2+(p(:,2).-x(2)).^2+(p(:,3).-x(3)).^2).-x(4)
endfunction

function retval = sphere_error(x)
  global points
  retval = sum(sphere_errors(points, x).^2)
endfunction

x0 = [mean(points(:,1)), mean(points(:,2)), mean(points(:,3)), 100]

result = sqp(x0, @sphere_error)


그러면 한참만에 아래 값들이 도출됩니다. 모든 값들에 대해 mash 형태로 계산을 하다 보니, 꽤 시간이 걸립니다.



계산에 의하면, 중심점은 (12.1, -5.9, -7.2) 반경 47.85 라고 나옵니다.

이 값들이 지금까지 찾았던 영점값 되겠습니다.





8. 영접값 적용하여 확인


이제 다시 arduino source 로 돌아와, 위에서 구한 값들을 입력받는 source 에 반영해 줍니다.



중심점이 벗어나 있으니, 그만큼 가감해서, 입력 받을 때, 자동으로 계산되게 해주면 됩니다.


MegViewer 를 통해 어떻게 변했나 확인해 볼까요?



오호이~. 적용이 되어서 둥그런 원 모양과 중심축에 붙어서 값들이 표현되었습니다.

이게 calibration 의 힘이란 말인가... (대박)





9. Further More


사실 저는 이 결과가 썩 마음에 들지 않습니다.


일단, 값을 입력받는 방식 차제를 아래 그림들 처럼 고정된 상태에서 선의 걸리적 거림 없이,

6면체의 각 면과 같이 회전하면서 값들을 받아야, 입력값을 신뢰할 수 있을 것 같았습니다.


Arduino GY-273 HMC5883L Magnetometer Compass Tutorial

http://henrysbench.capnfatz.com/henrys-bench/arduino-sensors-and-input/arduino-gy-273-hmc5883l-magnetometer-compass-tutorial/



위와 같이 하려면, 아래 장치 처럼, 무선모듈을 추가해야 하고, 배터리로 구동시켜야 합니다.


* Tutorial: How to calibrate a compass (and accelerometer) with Arduino

https://thecavepearlproject.org/2015/05/22/calibrating-any-compass-or-accelerometer-for-arduino/



저는 이렇게 연결하고 윙윙 휘둘렀습니다.

그래서 몇 개씩 값이 튀기도 하고...



혹시... 혹시 나중에 기회가 되면, 그땐 위의 전문가들 처럼 해보고 싶네요.


And

Hardware | Arduino 를 DIY 해보자 - 2

|

1. Arduino Nano 를 DIY 해보자


이 글은 아래 포스트에서 이야기한, arduino 를 직접 만들어보기 2탄 입니다.


* Hardware | Arduino 를 DIY 해보자 - 1

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


처음 DIY 대상으로 arduino nano 입니다.

일단, 회로 보는 EAGLE 프로그램에서 뽑은 part list 를 구입에 필요한 것만 정리해 봤습니다.


-------------------------------------------------------------------------------------------------------
|                  name                  | value         | type                                       |
-------------------------------------------------------------------------------------------------------
| C1, C4, C6, C9                         | 100nF         | 0603 SMD                                   |
| C3, C7, C8                             | 1uF           | 0805 SMD                                   |
| C2, C5                                 | 4.7uF 16V     | 0603 SMD Tantalum capacitor                |
-------------------------------------------------------------------------------------------------------
| RP1, RP2                               | 1k Ohm        | CAY16 Network resistor SMD                 |
| L, PWR, RX, TX                         | LED           | 0805 SMD                                   |
-------------------------------------------------------------------------------------------------------
| D1                                     | SS1P3L-M3     | Schottky diodes & rectifier 30V 1A         |
| F1                                     | 500mA 6V      | 0603 SMD MF-FSMF050 Resetable Fuse         |
-------------------------------------------------------------------------------------------------------
| J1, J2                                 | 15 x 2        | single row male 2.54mm pich pin head       |
| J3                                     | USB Mini B    | USB Mini B type female socket              |
| J4                                     | 6             | double row male 2.54mm pitch pinhead       |
| SW1                                    | 157           | SMD tactail switch                         |
-------------------------------------------------------------------------------------------------------
| IC1                                    | FT232RL       | SSOP28 USB UART interface IC               |
| IC2                                    | LM1117IMPX-5.0| SOT223 Linear regulator                    |
| IC3                                    | ATMEGA328P-AU | TQFP32 8-bit Microcontroller               |
| Y1                                     | 16MHz         | SMD Crystal ceramic resonator              |
-------------------------------------------------------------------------------------------------------


0603 SMD 및 CAY16 network resistor 등, 소형화에 특화된 부품들로 구성되어 있습니다.

Oscillator 마저도 SMD 타입 입니다.


정품 arduino nano 의 앞면과 뒷면 사진 입니다.



최신 arduino nano 는 ATmega328 chip 크기가 더욱 작아진 MLF (Micro Lead Frame) 형식으로,

ATmega328-MU 가 실장되어 있습니다.


참고로, 이 ATmega328-MU 의 Package type 은 32M1-A 라고 하네요.

Atmel-42735-8-bit-AVR-Microcontroller-ATmega328-328P_Summary.pdf



아래는 밑면입니다.



맨 왼쪽 밑부분에 0603 크기의 fuse 가 있으며,

중간 부분에 SMD 형식의 network resistor 가 실장되어 있습니다.


공간을 최대한 적게 차지하도록 작은 부품들을 사용되어 있습니다. 다만 구하기 힘든 부품들입니다.





2. 구입 부품 최종 확인


정품 nano 에 사용된 SMD 크기는 0603 이지만, 받은 보드는 0805 SMD 로 수정되었으며,

다른 부붐들도 보다 범용적이고 큰 부품들로 변경되어 있다는 것을 알 수 있습니다. 아래 파일은 그 회로도 입니다.


* BL-386

BL-386.pdf


* BL-386(Silk)

BL-386(Silk).pdf


참고가 될 수 있도록 arduino nano 의 official 자료를 아래에 올려 놓습니다.


* Arduino Nano V3.2

Arduino_Nano-Rev3.2-SCH.pdf


아래는 무료로 받은 보드 윗면입니다.

부품 크기가 0805 SMD 죠? 그리고 reset switch 마저도 큼지막 합니다.



아래는 밑면입니다.



모두 0805 SMD 이며, 왼쪽 윗부분의 diode 도 큼지막 합니다.

특징으로는 oscillator 가 4 pin 이며, 정사각형의 모양입니다. 이런건 처음이네요.


이 보드를 설계하신 분의 배려가 느껴집니다.

Arduino Nano 의 보드 자체 크기가 0805 를 충분히 커버할 수 있으므로, 궂이 0603 SMD 를 쓸 이유는 없는 것이지요.


다음에 준비하고 있는 Duemilanove 에서도 0805 SMD 를 그대로 사용하고 있어,

추가 부품을 그렇게 많이 구입하지 않아도 되어서 다행입니다.


최종적으로 실제 필요한 부품을 다시 정리해 봤습니다.


-------------------------------------------------------------------------------------------------------
|                  name                  | value         | type                                       |
-------------------------------------------------------------------------------------------------------
| C1, C3, C4, C7, C9                     | 0.1uF         | 0805 SMD                                   |
| C5, C6                                 | 22pF          | 0805 SMD                                   |
| C8                                     | 10uF          | 0805 SMD                                   |
-------------------------------------------------------------------------------------------------------
| R1, R2, R3                             | 1k Ohm        | 0805 SMD                                   |
| R4, R5, R6, R7                         | 680 Ohm       | 0805 SMD                                   |
| L, PWR, RX, TX                         | LED           | 0805 SMD                                   |
-------------------------------------------------------------------------------------------------------
| D1                                     | SS14          | Schottky diodes & rectifier 30V 1A         |
-------------------------------------------------------------------------------------------------------
| J1, J2                                 | 15 x 2        | single row male 2.54mm pitch pinhead       |
| J3                                     | USB Mini B    | USB Mini B type female socket              |
| J4                                     | 6             | double row male 2.54mm pitch pinhead       |
| SW1                                    | 3 x 6 x 2.5mm | SMD Tactile switch                         |
-------------------------------------------------------------------------------------------------------
| IC1                                    | FT232RL       | SSOP28 USB UART interface IC               |
| IC2                                    | LM1117IMPX-5.0| SOT223 Linear regulator                    |
| IC3                                    | ATMEGA328P-AU | TQFP32 8-bit Microcontroller               |
| Y1                                     | 16MHz         | 3225 SMD Crystal ceramic resonator         |
-------------------------------------------------------------------------------------------------------



필요한 부품 리스트를 만들면서 알게된, 배려가 깃든 보드의 특징은 다음과 같습니다.


* no network resistor

저항을 한데 모아 회로를 단순화 하기 위한 부품으로 SMD 용으 구하기 힘드나,

위의 보드에서는 모두 0805 SMD 로 변경되었습니다.


* no fuse

Fuse 가 생략되었습니다.

사실 arduino nano 는 과전류에 사용될 목적으로 만들어 진 것이 아니므로, 단순화를 위해 삭제된것 같습니다.


* bigger crystal

좁쌀만한 oscillator 가 아닌, 좀더 큰 resonator 로 변경되었습니다.


* bigger diode

Diode 도 일반적으로 사용되는 큰 부품으로 대체되었습니다.


* bigger switch

RST switch 도 큰걸로 대체되었습니다.


* all 0805 SMD based

그렇습니다. 0603 SMD는 모두 0805 SMD 로 변경되었습니다.


배려가 깃든 보드인 것을 조사하면서 알게 되니 감사한 마음이 저절로 듭니다.

이 자리를 빌어 다시한번 감사의 말씀 드립니다.


이제 각 부품 구입을 정리해 봅니다.





3. Capacitor

필요한 캐페시터의 용량은 다음 세가지 입니다.

- 0.1uF = 100nF
- 22pF
- 10uF

아래 링크에서 구입했습니다.
Duemilanove DIY 할 때도 겹치는 부품들과 nano 에만 사용되는 10uF 를 추가로 구입했습니다.

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


동시에 다른 arduino 를 준비하다 보니, 겹치는 부품들이 꽤 있습니다.



이런 부품을 공유할 수 있어서 좋네요.



8pin DIP socket 이 필요해서 555 주문할 때, 따로 10uF 을 주문했습니다.



얘만 투명 릴에 왔네요.







4. Resistor

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

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


위의 세트에는 다음 저항들이 포함되어 있고, 딱 680 Ohm 은 없습니다.


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

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



처음 구매한 제품이구요.


Duemilanove 제작시에 필요할 것 같아서 구입해둔 세트에는 680 Ohm 이 없네요.
그래서 새롭게 한세트 더 구입합니다.

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


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

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 저항 구입할 일은 없겠네요.




5. LED

Duemilanove 와도 겹치는 부품입니다.

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





6. Diode

원래는 SS1P3L-M3 이나, 수정된 보드에선 SS14 로 변경되어 있습니다.
Duemilaove 용으로 구입한 세트에 SS14 가 포함되어 있어서 추가 구매는 필요 없었습니다.

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





7. Switch

Original arduino nano 에서는 대략 1210 SMD 정도 크기의 RST switch 가 큰걸로 2510 SMD 급으로 변경되어 있습니다.

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


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

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




8. USB female socket

Arduino Nano 사양서 상, Mini USB 이면 됩니다.

* 10PCS Short Type SMD Mini USB Connector Micro USB 5pin B type Female Jack For Mobile Phone Micro USB Jack Connector


잘 도착하여 받아본 부품 입니다.



다만, 요즘 Micro USB 추세라, Micro USB 도 구매합니다.

Mini USB 와 비교시 pin 간의 간격만 다를 뿐, pin 순서는 동일했습니다.


* 10pcs Micro USB connector 5pin seat Jack Micro usb Four legs 5P Inserting plate seat Mini usb connector Free shipping 


역시 Micro USB 가 더 단순하고 깔끔한 느낌을 줍니다.



Pin 간격이 좁을 뿐, 순서는 동일합니다.



혹시 몰라, 조금 높이가 있는 Micro USB 도 구매합니다.

* 10pcs/lot Micro USB 5P Connector Mini USB Jack Socket sink 0.72 FLAT MOUTH Width 1.0


다만, 요놈은 도착까지 3개월이 걸렸네요.






9. Pin head

예전에 male pinheader 가 필요했을 적에 구입해 놓은게 있어, 따로 구입하지 않았습니다.

* Hardware | 2.54mm pin header 구매하기


물론 검정 버전도 같이 가지고 있습니다.







10. ICs

이제 마지막으로 IC 주요 부품들 입니다.

FT232RL
- SSOP28 USB UART interface IC

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


Duemilanove 용으로 구입한 세트에 모두 포함되어 있습니다.



LM1117IMPX-5.0
- SOT223 Linear regulator

Regulator 인데, 소형이면서 5V / 800mA 대응의 제품은 많은 업자가 팔지도 않을 뿐더러 조금 비쌉니다.
가잘 적절해 보이는 제품이 밑의 링크라서 구입합니다.

* 10PCS/LOT LM1117IMPX-5.0-NOPB SOT223 IC N06B NO6B REG LINEAR 5V 800MA SOT223-4 LM1117IMP-5.0


사양 대로 LM1117IMPX/5.0 을 받고 싶었으나, 사진과 동일한 제품이 왔군요.



5V/800mA 사양대로라면 특별히 문제될껀 없다고 봅니다.



확대 사진입니다.



가지고 있는 arduino micro 를 확인해 보니, AMS1117 / 5.0 이군요.



ATMEGA328P-AU
- TQFP32 8-bit Microcontroller

워낙 유명한 chip 이라 쉽게 찾을 수 있습니다.
가격도 좀 있고 하니, 이번 프로젝트에 끌어들인 동료에게 구입을 의뢰합니다.

* 1PCS ATMEGA328P-AU QFP ATMEGA328-AU TQFP ATMEGA328P MEGA328-AU SMD new and original IC







16MHz Oscillator
- 3225 SMD Crystal ceramic resonator

Oscillator 는 길쭉한것이 아니라 정사각형 모양에 4개의 접점이 있는 모양입니다.


치수는 대략 2mm 조금 넘는것으로 보입니다.
다른 제조사 spec. sheet 를 찾아본 결과, 한쪽 면의 접점 거리가 2.1mm 인 것이 SMD 3225 형식이라는 것을 알아 냈습니다.


형식만 알면 제품을 선택하는 것은 그리 어렵지 않습니다.

AliExpress 에서 검색하니 바로 나오네요. 그 중에서 16MHz 제품을 선택해 줍니다.


* 10pcs SMD 3225 active crystal oscillator OSC 16MHZ 16M 3.2*2.5 3.3V 25PPM

- https://www.aliexpress.com/item/10pcs-SMD-3225-active-crystal-oscillator-OSC-16MHZ-16M-3-2-2-5-3-3V-25PPM/32776378121.html



잘 도착했구요.



Oscillator 치고는 직사각형으로 생겨서 신기합니다.






11. 조립

열풍기가 없으므로, 액체 플럭스를 이용하여 납땜해 갑니다.



인두 팁으로 납땜을 하다 보니, 아무래도 사용되는 납이 많아져 버립니다.

특히 소자 밑으로 스며들게 해야 하는 oscillator 가 가장 힘들었습니다. (좀 지저분하게 되었죠?)


표면에 안착되지 않은 듯 해서 납을 좀 많이 먹여버리기도 하고, 네 귀퉁이의 소자가 붙어버린 것 같아서 납을 빨아들이기도 하고.



0805 SMD 의 LED 소자는 납땜 하는 열로 인하여 안쪽 구조가 쉽게 망가질 수 있어서 신경이 많이 쓰였습니다.



신기한 것은, anode / cathode 가 쉽게 구분될 수 있도록 띠가 마킹 되어 있었습니다.



위의 사진 처럼, 돌기가 있는 쪽이 + 극이네요.



설계대로라면 USB mini B 이어야 하지만, 요즘은 micro USB 로 통합되는 분위기라서 micro USB 를 장착해 봤습니다.

리드선의 순서는 동일해서, 간극만 맞추고 납땜하면 되었습니다.


잘 안착되게 리드선을 밑으로 구부려서 납땜 해야 하는데, 그러지 않아서 납을 많이 먹여도 떠버리네요. (위 사진)



micro USB 부분의 접점이 잘 되지 않자, 조금 많이 인두로 지졌더랬습니다.

그랬더니 패턴이 나가버렸네요. ㅠㅠ (망함)



micro USB 를 PC 에 연결하면 LED 도 들어왔다 나갔다 뭔가 하는것 같은데, PC 에 인식이 되지 않았습니다.

pinheader 까지 다 납땜 해버렸는데...


이번 작업은 망했어요.

다시 이 기판을 주문하여 도착하면 다시 시작하려 합니다.


그러기 전에 열풍기로 작업해야 겠습니다.

열풍기가 준비 되면, 그 때 다시 arduino DIY 를 시작하겠습니다.


And

Hardware | 납땜 주변 용품

|

납땜 취미를 가지다 보면, 인두기부터 시작하여 납땜을 잘 되게 해주는 flux, 인두팁 관리용 제품 등, 다양한 용품이 필요합니다.

향후 작은 SMD 소자를 잘 납땜하기 위해서도 꼭 필요한 물건들이 되겠습니다.


관련된 제품 중에는 일본산이 많습니다. 마침 출장간 김에 부품을 준비해 봅니다.


참고로, 본 일본 제품 구매는, 지금의 무역분쟁이 발생하기 전, 올 5월달에 구매했던 내용입니다.





1. 소포왔다~!


필요한 물품들을 AliExpress 에서 구매해도 되나, SMD를 잘 납땜하기 위해서는 좋은 품질의 용품이 필요하니,

마침 일본 출장 때, Amazon Japan 에서 구매하여 호텔로 배달시켰습니다.



출장 중, 호텔 프론트에서 받는 소포란... 뭔가 업무에 중요한 물건이라도 된 듯 표정으로 받아 들고 옵니다.



박스 하나와 서류 봉투같은 것, 두 개 왔습니다.

업무를 마치고 홀가분한 마음으로, 에어컨 빵빵한 호텔방에서 홀라당 빤쓰 차림으로 기분 좋게 하나씩 뜯어 봅니다.



아... 이게 얼마만에 주문하여 받아보는 물품이던가.

작년 말에 필요했었지만, 저번 출장 때는 생각을 못해 구매를 놓쳐버려, 이번 출장 오자마자 바로 주문하고 받았습니다.



물건 부피는 다 합쳐도 크지 않지만, 배송 상 쉽게 배송할 수 있도록 적어도 이 사이즈의 박스로 배송한다고 어디선가 들었습니다.

중국 AliExpress 는 거의 편지봉투 수준인데...






2. Tip Refresher


정확한 명칭이 이건지 모르겠지만, 인투팁 피막에 엉겨붙은 불순물들을 날려주는 용품입니다.


* goot チップリフレッサー BS-2

https://www.amazon.co.jp/gp/product/B0016VDHIE/



이놈은 낱개 주문이 안되고, 한꺼번에 7개를 주문해야 배송해준다고 해서, 평생 쓸꺼 한꺼번에 샀습니다.



Before / After 모습을 그림으로 보여주고 있구요, 인두팁을 300~360도로 가열한 다음 사용하라고 되어 있습니다.



하나 까서 열어 봅니다.

손끝으로 만져보면, 무슨 금속 가루와 화학약품을 풀로 이겨서 굳혀 놓은것 같은 느낌입니다.



산화되어서 도저히 납땜이 되지 않는 저의 인투팁 등장.



달군 다음 살짝 fresher 에 뭍혀 봤습니다.



지지직~ 흠... 뭔가 변화가 별로 없네요?



아차차, 온도를 450 도로 맞춰 놨었네요.

310 도 정도로 낮춘 다음 다시 fresher 에 지져 봅니다.



오오오옷!

팁의 윤기가 돌아 왔어요~! 신기.


까슬까슬한 페이스트같은 게 녹으면서, 피막을 벗겨 내고 (사진상 페이스트에 뭍어있는 검붉은 색 부분)

혼합된 금속 가루들이 코팅되는 느낌입니다.


처음 구매했을 때의 때깔까지는 복원해 주지는 못하지만, 그럭저럭 사용할 만 하게 되었습니다.

효과 있네요.





4. Tip Recovery


이 제품도 인두 tip 을 재활시켜주는 물건입니다.


* goot チップリカバリー ST-45

https://www.amazon.co.jp/gp/product/B01LWO95KZ/



Tip Refresher 와 비교하여 뭐가 좋은지 몰라서 두개 모두 구매해 본 것입니다.



이놈은 Tip Refresher 와는 반대로, tip 을 완전히 식힌 다음, 이 고무같은 것에 문지르라고 합니다.



고무긴 고무인데, 금속과 혼합되어 있어서, 팁을 문지르면 팁 표면이 갈리는 느낌이 납니다.



살살살 문지르면, 지우개 똥 만들어 지듯, 문지른 주위로 똥이 만들어지고 우수수 떨어집니다.



느낌 상 이게 더 효과가 좋아 보입니다. 깔끔하게 갈렸어요.



별로 많이 문지르지도 않았는데, 저렇게 시커멓게 되는군요.



갈린 부분을 코팅하고자 Tip Refresher 도 해줬습니다.

이 두 물품은 같이 쓰는게 맞는 듯 하네요. 갈아서 벗겨주고, 코팅해주고.





5. Flux


이 제품은 납땜을 이쁘게 해주는 flux 입니다.

SMD 납땜에는 필수라고 할 수 있겠습니다.


이걸 납땜할 자리에 도포하고 납과 함께 지지면, 신기하게도 부품 다리와 PCB 패턴에 납이 잘 모입니다.


* goot プリント基板フラックス BS-75B

https://www.amazon.co.jp/gp/product/B004ANR7KY/



이놈만 병으로 되어 있어서, 뽁뽁이 봉투로 배달된 놈 입니다.



솔직히 이 가격에 이 용량은 좀 아닌것 같아요.



PCB 에 알아서 적정량 잘 발라주고, 잘 납땜하라고 설명하고 있습니다.



금싸라기 같은 용액이라, 일단 약통에 1/3 만 부어서 사용해 보도록 합니다.



주사기 같이, 끝이 아주 미세하게 뚤려 있서, 방울로 액체를 떨어트릴 수 있는 용기가 있으면 좋겠으나,

그런건 없으므로, 버릴 약통을 우선 사용했습니다.



가장 하고 싶었던, 가드다란 다리가 많은 chip 을 PCB에 납땜해 보기로 합니다.



이번에 해보려는 arduino nano DIY 기판 입니다.

이 액체 flux 가 도착하기 전까지 시작하지 못했던 arudino DIY 입니다.


* Hardware | Arduino 를 DIY 해보자 - 1

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


살짝 도포한다는게, 약병 구명이 너무 커서 한 5방울치 떨어진 것 같아요.



오호호~!!! 기대 이상으로 잘 되었습니다.

신기하게 납들이 금속으로 가서 붙네요. 저런 가느다란 다리임에도 불구하고 전혀 힘들지 않았습니다.


또한, 이 액체는 송진이 원료중에 하나라서, 솔방울 냄새가 나요.


그치만 이 용액만으로는 양이 부족할 듯 하여 알아보던 중,

미국 Amazon 에서는 1리터 짜리가 17 USD 하는 액체 flux 가 좋다고 너tube 에서 봐서 구매했습니다.


사실은 미국에서 출장오시는 분에게 부탁해서... 이걸 가지고 먼저 일정에 있던 중국 들렸다가 서울 오셨슴...

(중국 세관에서 해명하느라 혼났다 함)


* MG Chemicals 836LFNC Lead Free NO Clean Flux, 1 Litre, Bottle

https://www.amazon.com/gp/product/B01MYEE84K/



역시 통큰 나라답게 1리터다! (20ml 가 말이 되냐!)



크고 아름답습니다.



Product of U.S.A. 임... 이라고 당당하게 써 있네요. 따봉.

가격차가 3배 이지만, 용량 차이는 50배나 차이나는 goot (20ml) 놈과 비교해 보면...

효과는 별 차이가 없습니다.





6. Solder Wick


이 제품은 납을 빨아주는 솔더윅 입니다.

이미 알리에서 중국 제품을 구매했지만, 완전 효과 없슴.

원래 내가 기술이 없어서 안되는 것인지 제품이 이상한 것인지 확인하고 싶었습니다.


* goot はんだ吸取り線 CP-3015

https://www.amazon.co.jp/gp/product/B001PR1KPQ/



내가 기술이 없어서 납이 제대로 빨리지 않은 것이면, 많이 사두면 쓰레기만 늘어가는 것이니, 한 개만 구매해 봅니다.



납 위에서 인두로 지지라고 합니다.

중국제로도 그렇게 했는데 말이지...



길이는 1.5m... 미국의 기상을 본받자.



쥐똥만한 길이로 감겨져 있습니다.



ESP8266 의 Flash ROM chip 을 대용량으로 교체할 때, 사용해 봤습니다.

액체 flux 뿌리고 지져 댔습니다.



야이C... 잘됩니다.

깔끔하게 납이 흡수되어 기판에 붙어 있던 Flash ROM chip 이 분리 되네요.


* Hardware | ESP-01 or ESP8266 사용기 - 4

https://chocoball.tistory.com/entry/Hardware-ESP01-or-ESP8266-using-4


이로써 알리발 중국 제품은 전혀 효과 없음이 증명되었습니다.





7. Iospropyl Alchohol


기판 세척제로는 위험한 TCE, 친환경 세척제 등이 있다고 합니다만,

소독약으로 쓰이는 이소프로폴 알콜 99% 도 기판 세정에 딱이라고 하더군요. 인체에 해도 거의 없고.


그치만 99% Isopropyl Alchohol 을 구하긴 힘듭니다.

그래서 대체제로 소독용 에탄올을 구입했습니다. 1000원.


농도를 보니 83% 네요.

깔끔하게 세척해주지는 못하지만, 그나마 기판에서 불순물을 벗겨내서 날려 줍니다.



Flux 를 사용하면 아무래도 찌꺼기가 남습니다.

마무리는 에탄올 들이 붙고, 칫솔로 쓱싹쓱싹 하면 나름 깨끗해 집니다.







FIN


납땜 스테이션도 교체하고 싶고, 열풍기도 필요하고, Bench Power Supply 도 필요하고...

일단, 최소한 SMD 부품을 납땜 할 수 있는 용품은 준비가 되었네요.


이제 arduino nano DIY 를 시작해 보려 합니다.


And
prev | 1 | next