'분류 전체보기'에 해당되는 글 335건

  1. 2017.08.28 Hardware | Probe Clip 을 사용해 보자
  2. 2017.08.27 Life | Leatherman 레더맨 A/S 후기
  3. 2017.08.20 Hardware | Gyroscope GY-521 MPU-6050 을 사용해 보자
  4. 2017.08.17 Hardware | Resistor Network 을 사용해보자
  5. 2017.08.13 Hardware | LED bar graph 를 이용해 보자
  6. 2017.08.07 Life | 에어콘 수리 도전기 2
  7. 2017.08.02 Hardware | Soil Moisture Sensor 구동해 보기
  8. 2017.07.31 Hardware | MB102 Breadboard Power Supply Module 를 사용해 보자
  9. 2017.07.30 Hardware | Raindrops 모듈 구동해 보기
  10. 2017.07.29 Hardware | 저항을 구매해 보자

Hardware | Probe Clip 을 사용해 보자

|

1. Probe Clip


여러가지 sensor 들을 구입하다 보면, male pin 들이 납땜되지 않은 상태로 배달이 됩니다.



이건 이것대로 좋은 것 같습니다.

빵판을 이용하여 동작 확인이 아닌, 실장을 할 때에는 male pin 이 걸리적 거릴 수도 있고,

구부러진 pin 을 사용하는게 좋을 때도 있는 등, 상황이 바뀌기 때문이지요.


이를 해결하기 위해, Probe Clip 을 구매해 보기로 합니다.




2. Big Size Round Single Hook Clip for Test Probe


이름이 긴건 AliExpress 에서 그렇게 팔기 때문입니다.

사이즈가 Big Size 라고는 하지만, 사진상으로 적당해 보입니다.




다른 부품들과 함께 잘 도착했습니다.



구성물이 10개가 들어 있어서 왠만한 jumper 사용시 갯수는 충분할 것 같습니다.



개별 줌샷 입니다. 모양은 아주 단순합니다.



밑부분은 jumper 선을 체결할 수 있는 금속과 그 선을 밖으로 뺄 수 있는 구멍이 뚫려 있습니다.



Jumper 선을 체결할 수 있도록 되어 있습니다.

다만, 조금 복잡한 구조로 되어 있는데, 궂이 이럴 필요가 있나 싶습니다.

아마 좀더 복잡한 구조가 있는데, 간단하게 만들어 팔고 있는게 아닌가 합니다.

생산할 때는 기존 판금을 사용하면 추가 비용은 안들 터이니까요.



밑부분을 누르면 이렇게 hook 이 튀어 나옵니다. 이부분을 원하는 부분에 걸면 전기적으로 연결되는 것입니다.





3. Big Size 의 문제


Big Size 인 만큼, sensor 들의 pin 체결 구멍에 조금 큰 것이 문제입니다.

Male pin 의 간격은 2.54mm 인데, 두개를 동시에 연결하려면 hook 부분의 금속 자체도 잘 안들어갈 뿐만 아니라

뒤에 누르는 둥근 부분도 커서 간섭이 큽니다.


매번 귀찮다 하더라도 참고 쓰다가 좀더 작은 사이즈가 없나 찾아보게 됩니다.




4. Mini Grabber SMD IC Hook Probe Jumber Test Clip


제품명이 긴것은 그렇게 느끼는 것 뿐입니다.

가격은 비슷하나 갯수가 6개로 파는 제품을 찾았습니다.



이 제품은 SMD IC 다리들에게 걸 수 있도록 만들었다 하니,

원하는 크기에 딱 맞을 듯 합니다.


이런 시행착오을 겪어야 하는게 좀 번거롭습니다만, 이게 인생이라고 생각하고 주문합니다.




5. 도착


요즘 AliExpress 는 대략 2주 전후로 도착합니다.

예전에는 한달은 기본이었는데 말이죠.



궁딩이 부분을 누르면 앞에 hook 모양이 아닌, 집게 모양처럼 튀어 나옵니다.

의외로 잡는 힘이 쎄서 잘 고정되게 만들었습니다.

물론 크기도 작습니다.



궁딩이 부분의 플라스틱을 분리하면, 전선을 결합할 수 있는 구멍이 나옵니다.

구조도 단순하네요.





6. 전선 연결


각각의 색에 맞추어 jumper 선을 골라 주었습니다.

원래 양쪽에 pin 이 달려있는 breadboard 전용 jumber 입니다만, pin 부분을 잘라내고 피복을 벗겨 구리선을 노출시킨 후,

probe clip 의 동그란 구멍이 있는 밑부분에 말아주고 납땜을 해주었습니다.


이쁘게 되었네요! 만족스럽습니다.





7. 활용해 보기


구조적으로 Transistor Tester 에 Resistor Network 같은 부품은 측정할 수 없었으나,

이제 쉽게 할 수 있어요!


http://chocoball.tistory.com/entry/Hardware-Transistor-Tester



이제 원하는 sensor 에 직접 연결해 봅니다.



Big Size Clip 으로 했을 때에는 접점이 틀어지거나, 간섭으로 체결이 빠졌었는데,

이 mini Grabber 는 잡는 부분이 작을 뿐만 아니라, 힘도 좋아서 좀더 잘 고정이 됩니다.



전선 반대쪽에 pin 이 연결되어 있어서, 이제 편하게 빵판 활용시 sensor 동작 확인을 할 수 있을것 같습니다.




FIN

자 다음 센서~

And

Life | Leatherman 레더맨 A/S 후기

|

1. 멀티툴


어렸을 적에는 빅토르노스를 가지고 있던 친구들이 부러웠습니다.

딱히 쓸곳은 없었는데도 말이죠.


이건 남자들이 가지고 있는 로망이라고 생각해요.

장비에 대한 욕심. 이건 오래전 수렵생활 시대에 사냥을 위한 도구로부터 오는게 아닌가 합니다.


과거 사냥 장비가 전쟁때는 무기가 되었고, 현대인들에 있어서는 공구가 되었겠죠.


집에서 기계를 고친다던가 집안 곳곳을 수리할때마다 장비의 욕구는 점점 커져가죠.

그러다가 14년 전에 선물을 받습니다.


브렌드도 잘 몰랐던 "Leatherman" 이었습니다.

응? 빅토리노스가 아니네?




2. 레더맨


남자를 설레이게 하는 멀티툴 중에서 레더맨이라는 것이 있다니.

찾아 봤습니다.



멋지네요.

미군의 장비 유지보수에 사용되는 멀티툴 중에서도 인기가 있는것 같습니다.

또한 응급 의료진들에게도 요긴하게 사용되는 툴도 만들고 있었습니다.


빅토리녹스는 이제 멀리 갔습니다.


여기에 더 놀란것은 25년 워런티였습니다.

멀티툴은 한개밖에 없지만 메니아가 된 자신을 발견했습니다.




3. Juice Pro


14년동안 잘 쓰던 Juice Pro 입니다.



IT 종사자인 저에게 맞는 용도로 그때당시 나왔었죠.

LEATHERMAN 라는 각인이 멋집니다.



뺀치도 있습니다.

사진에는 보이지 않지만, 안쪽에 +/- 드라이버 헤드도 있습니다.



다만, 사진에서 보이듯이 알루미늄인데도 불구하고 녹이 슬었습니다.

몇 번 낚시에 가서 물고기 입에서 낚시바늘 빼낼때 사용했더니 이렇게 되었습니다.



문제는 녹이 번지면서 칼도 못꺼내게 되고, 가위도 사용할 수 없게 되었죠.

그 전에, 가위와 칼 등의 날 이빨이 빠지면서 문제가 있었습니다.




4. 워런티


레더맨의 워런티는 25년입니다.

아직 14년 밖에(?) 안지났으니 당연히 가능한 기간입니다.


http://www.leatherman.com/CustomerService-Warranty.html


원래는 미국으로 보내서 AS 를 받았다고 하였지만, 지금 (2017년) 은 한국 유통사가 대신해 주고 있었습니다.

14년 전에 16만원 주고 산 정품이라고 했으니, 문제는 없을것이라 생각했습니다.


정식 유통사는 "신명글로빅스" 입니다.


http://www.smglovix.co.kr/html/05service/service.php



본사는 강남에 있지만, 실제 AS 는 인천의 사무실에 보내야 합니다.

근무하는 사무실이 강남이고 지도를 살펴 보니 걸어서 10분 거리여서 직접 가려 했으나,

only 인천 사무실에서는 한다는 것을 전화를 통해서 알고 택배로 보냈습니다.


AS 보내기 전에는 사이트에서 등록하거나 전화로 AS가 가능한지를 먼저 확인해야 합니다.


http://smgstore.co.kr/html/cscenter/as.php



센터에 물건을 보내고, 도착한 당일 바로 물건을 다시 보냈더군요.

확실한 우체국 택배로 보내주셨습니다.



신명글로빅스에서 보내주신 뒤 3일반에 물건을 다시 받았습니다.



도착한 우체국 택배 박스 입니다.



박스를 보니 zippo 의 AS 도 하는군요. (웹사이트를 통해서도 알 수 있슴)



포장은 뽁뽁이로 싸져 있었습니다.

금속덩어리라 박스를 뚤고 나와 다른 물건을 망가트릴 수는 있지만, 자체로 망가질 확률은 아주 낮기 때문에

적당한것 같습니다.



보낼 때, 같이 보냈던 파우치는 그대로 왔습니다.





5. Juice XE6


받은 물건은 Juice Pro 가 아닌 Juice XE6 입니다.

Pro 는 이미 생산 종료가 되었기 때문이죠.


직접 수리는 하지 않고, 리퍼 제품으로 보내준다 하더니만 그대로 된것 같습니다.



외관은 Pro 와 XE6 는 거의 같습니다.

이름이 세겨진 패널이 울퉁불퉁 한게 특징이네요.



사이드의 각인에 PAT PEND 가 있었지만, XE6 는 그냥 LEATHERMAN 만 세겨져 있습니다.

이 부분은 좀 아쉽네요. (Patent Pending - 특허 등록)



문제가 되었던 뺀치는 잘 동작 합니다.

Pro 의 뺀치와 다른 점은 전선을 끊을 수 있는 부분이 달려있다는 것입니다. 이건 편리하겠네요.


전체 샷 입니다.

일단 예전에 녹슬었던 Pro 와 다르게, 잘 동작한다는 것에 만족합니다.





6. 차이


궁금해서 Wikipedia 에서 찾아 봤습니다.


https://en.wikipedia.org/wiki/Leatherman



차이는 XE6 가 먼저 생산되었고, 3가지 툴이 더 있다고 나와 있습니다.

그런데 제가 보기에는 Pro 에 있던 핀셋과 이쑤시게가 없어서 XE6 가 더 적은게 아닌가라고 생각했는데,

Wikipedia 에서는 XE6 가 더 많아고 나오네요.


그리고, Pro 는 개인적으로 선물 받은 것이고, 애정이 있었는데, 다른 제품이 오니 조금 섭섭하긴 했습니다.

또한, Pro 는 일시 생산된 제품이라 희소성이 있었을것 같아요. 각인도 다르고.


AS는 최고인 듯 하지만, 기존 제품을 그대로 잘 쓸껄 이라는 후회는 있습니다.




7. 다른 제품


다음으로 구입하고 제품은 2개가 있습니다.


* Wave

포켓용에서 거의 오리지널이라고 할 수 있죠.

Amazon 의 링크를 걸어 봅니다.


https://www.amazon.com/Leatherman-Rebar-Multi-Tool-Black-Sheath/dp/B019EN7E7A/ref=sr_1_2?s=power-hand-tools&ie=UTF8&qid=1503764204&sr=1-2-spons&keywords=leatherman&psc=1


정말 아름답습니다.



여기에 damascus 교환용 blade 가 있습니다.


https://txtoolcrafters.com/products/damascus-blade-kit-for-leatherman-wave-charge-plain-edge



이 조합이면 완전체가 될 듯 하네요. 꼭 나중에 구성해 보고 싶습니다.



* Raptor

응급 의료진이 급하게 환자들의 의복을 자르거나 할 때에도 쓰일 수 있게 만들어진 가위 입니다.

동전도 그리 큰 힘 들이지 않고 자른다고 하니, 인생의 필수품이라는 느낌이 듭니다.


https://www.amazon.com/Leatherman-Raptor-Shears-Compatible-Holster/dp/B00BHZJB2K/ref=sr_1_1?ie=UTF8&qid=1503764253&sr=8-1&keywords=leatherman+raptor





FIN

AS 는 만족스러웠습니다. (만세 Leatherman)

그래서 Leatherman 의 노예가 되기로 결심했고, 다음 구입할 제품을 이미 정해놨습니다. (구매시기는 미정)

And

Hardware | Gyroscope GY-521 MPU-6050 을 사용해 보자

|

1. 자이로스코프

드론이 호버링 하거나 방향전환시 필요한 것중 하나가 위치조정 일것 같습니다.

이런걸 가능하게 하는 센서가 "Gyroscope" 입니다.


중력을 이용하여 자기의 위치를 알아내는 센서가 있다는게 신기할 따름입니다.


AliExpress 에서 검색해 보니, 1.09 USD!

아니 이게 1천원정도의 가격이라고?





2. 원리

전통적인 자이로스코프는 원심력을 이용하여 자기 위치를 되돌리려는 성질의 기구가 있습니다.


https://en.wikipedia.org/wiki/Gyroscope



그런데, 이걸 반도체 안에 센싱하는 소자들을 구성하여 만든게 이번에 리뷰하는 MPU-6050 칩 입니다.



그림을 보니 중력을 이용하여 이동하는 mass 와 그걸 감지하고 원래로 복원하려고 하는 스프링 등으로 구성되었네요.

그 작은 반도체 안에 저런것을 만들어 놓다니. 거기에 1.09 USD 처럼 저렴하다는 것에 한번 더 놀랍니다.


관련된 문서는 아래에 있습니다.


IMU_Wk8.pptx

AN3461.pdf


어디선가 배웠던 "코리올리 효과"를 이용한다고 합니다.

참고해 보세요.




3. 도착

잊을만 하고 있을 적에 도착하였습니다. 거진 한달 걸린것 같습니다.



구성품은 GY-521 breakout 보드와 구부러진 male pin 과 똑바른 male pin 이 각각 들어있습니다.



Chip 을 보면 중간 부분에 희미하게 MPU-6050 이라고 적혀 있습니다.



좀더 잘 찍힌 제품사진은 다음과 같습니다. Chip 이 잘 보이네요.



뒷면입니다. MPU-6050 을 사용한 제품 중, 가장 일반적으로 사용되는 breakout 보드는 GY-521 이라고 하네요.



구부러진 pin 을 납땜하느냐, 곧은 pin 을 납땜하느냐 고민했습니다.

향후 어떤 보드 위에 설치하게 될 것이냐를 상상하여, 그 보드가 평평할 듯 하여 곧은 pin 을 납땜하였습니다.





4. Pinout

Breakout 보드에는 8개의 pinout이 있지만, 실제로 사용되는 것은 5개, 또는 6개만 사용됩니다.


    GY-521   | Arduino Nano
----------------------------
     VCC     |     3.3V
     GND     |     GND
     SCL     |     A5
     SDA     |     A4
     AD0     |     GND
     INT     |     D2
----------------------------


GY-521 pinout 에 대한 몇가지 지식을 적어 봅니다.

- 원래 3.3V 가 구동 voltage 이지만, GY-521 은 자체 레귤레이터가 있어서 5V 도 가능합니다.

- Arduino 에는 2개의 MPU-6050 을 연결할 수 있게 되어 있고, AD0 의 high/low voltage 로 구분합니다.

- SCL 은 I2C 의 clock 담당이고, SDA 는 data 를 담당합니다.


관련된 내용을 영문 페이지들에서 가져와 봤습니다.


The MPU-6050 can have address of 0x68 or 0x69, depending on if the AD0 pin is held high or low.

Without anything connected, it was at 0x68 for me.


AD0 can be used to control the I2C-address. If it is connected to ground then the address is 0x68 and if it is connected to VLOGIC then the address is 0x69. The data sheet for the chip states that VLOGIC ranges from 1.71V to the working voltage of the chip. To find out the address the I2C scanner sketch can be uploaded to the Arduino when it is connected to the GY-521. The result can be viewed through the serial monitor. For the GY-521 the I2C device is found at address 0x68. This means that ADO must be connected to a pull down resistor. This holds the signal at 0V.


The gyro module communicates with the Arduino through I2C serial communication via the serial clock (SCL) and data (SDA). The MPU6050 chip needs 3.3V but a voltage regulator on the GY-521 board allows you to give it up to 5V.


Layout 은 다음과 같습니다.



실제 연결한 사진입니다.






5. I2C

Arduino 와의 인터페이스가 I2C 입니다.

우선 잘 인식 되는지 확인해 보도록 합니다.


Arduino IDE 의 Library Manager 에서 "i2cdetect" 를 인스톨 하여 돌려봅니다.



소스는 간단합니다.


#include "Wire.h"
#include "i2cdetect.h"

void setup() {
	Wire.begin();
	Serial.begin(9600);
	Serial.println("i2cdetect example\n");
	Serial.print("Scanning address range 0x03-0x77\n\n");
}

void loop() {
	i2cdetect(); // default range from 0x03 to 0x77
	delay(2000);
}

결과는 다음과 같이 잘 나옵니다.

잘 인식 되었네요.



다만 MPU6050 전용 sketch 를 돌리기 위해서는 "I2Cdev.h" 가 IDE 에 등록이 되어야 합니다.

필요한 파일은 아래 링크에서 다운로드 받을 수 있습니다.


https://github.com/jrowberg/i2cdevlib



다운로드 받은 zip 파일 내부를 보면 "I2Cdev" 라는 폴더가 있습니다.

이 "I2Cdev" 폴더를 IDE 의 library 폴더 하위에 copy 하면 library 등록이 됩니다.


- I2Cdev path : i2cdevlib-master > Arduino > I2Cdev

- library path : Arduino > library


아래는 다운로드 받은 zip 파일의 path 입니다.



아래는 Arduino 의 library path 입니다.



이제 I2C 준비는 완료 되었습니다.




5. MPU-6050 sketch

이제 MPU-6050 을 구동해 볼 차례 입니다.


위에서 다운로드 받았던 zip 파일인 "i2cdevlib-master.zip" 에서 다음 path 에서 찾아보면,

"MPU6050" 이라는 폴더가 있습니다.


- I2Cdev path : i2cdevlib-master > Arduino > MPU6050


이 폴더를 I2Cdev 와 동일한 library 폴더에 옮겨 놓으면 sketch example 을 사용할 수 있게 됩니다.

 


소스는 다음과 같습니다.


// I2C device class (I2Cdev) demonstration Arduino sketch for MPU6050 class using DMP (MotionApps v2.0)
// 6/21/2012 by Jeff Rowberg 
// Updates should (hopefully) always be available at https://github.com/jrowberg/i2cdevlib
//
// Changelog:
//      2013-05-08 - added seamless Fastwire support
//                 - added note about gyro calibration
//      2012-06-21 - added note about Arduino 1.0.1 + Leonardo compatibility error
//      2012-06-20 - improved FIFO overflow handling and simplified read process
//      2012-06-19 - completely rearranged DMP initialization code and simplification
//      2012-06-13 - pull gyro and accel data from FIFO packet instead of reading directly
//      2012-06-09 - fix broken FIFO read sequence and change interrupt detection to RISING
//      2012-06-05 - add gravity-compensated initial reference frame acceleration output
//                 - add 3D math helper file to DMP6 example sketch
//                 - add Euler output and Yaw/Pitch/Roll output formats
//      2012-06-04 - remove accel offset clearing for better results (thanks Sungon Lee)
//      2012-06-01 - fixed gyro sensitivity to be 2000 deg/sec instead of 250
//      2012-05-30 - basic DMP initialization working

/* ============================================
I2Cdev device library code is placed under the MIT license
Copyright (c) 2012 Jeff Rowberg

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
===============================================
*/

// I2Cdev and MPU6050 must be installed as libraries, or else the .cpp/.h files
// for both classes must be in the include path of your project
#include "I2Cdev.h"

#include "MPU6050_6Axis_MotionApps20.h"
//#include "MPU6050.h" // not necessary if using MotionApps include file

// Arduino Wire library is required if I2Cdev I2CDEV_ARDUINO_WIRE implementation
// is used in I2Cdev.h
#if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
    #include "Wire.h"
#endif

// class default I2C address is 0x68
// specific I2C addresses may be passed as a parameter here
// AD0 low = 0x68 (default for SparkFun breakout and InvenSense evaluation board)
// AD0 high = 0x69
MPU6050 mpu;
//MPU6050 mpu(0x69); // <-- use for AD0 high

/* =========================================================================
   NOTE: In addition to connection 3.3v, GND, SDA, and SCL, this sketch
   depends on the MPU-6050's INT pin being connected to the Arduino's
   external interrupt #0 pin. On the Arduino Uno and Mega 2560, this is
   digital I/O pin 2.
 * ========================================================================= */

/* =========================================================================
   NOTE: Arduino v1.0.1 with the Leonardo board generates a compile error
   when using Serial.write(buf, len). The Teapot output uses this method.
   The solution requires a modification to the Arduino USBAPI.h file, which
   is fortunately simple, but annoying. This will be fixed in the next IDE
   release. For more info, see these links:

   http://arduino.cc/forum/index.php/topic,109987.0.html
   http://code.google.com/p/arduino/issues/detail?id=958
 * ========================================================================= */



// uncomment "OUTPUT_READABLE_QUATERNION" if you want to see the actual
// quaternion components in a [w, x, y, z] format (not best for parsing
// on a remote host such as Processing or something though)
//#define OUTPUT_READABLE_QUATERNION

// uncomment "OUTPUT_READABLE_EULER" if you want to see Euler angles
// (in degrees) calculated from the quaternions coming from the FIFO.
// Note that Euler angles suffer from gimbal lock (for more info, see
// http://en.wikipedia.org/wiki/Gimbal_lock)
//#define OUTPUT_READABLE_EULER

// uncomment "OUTPUT_READABLE_YAWPITCHROLL" if you want to see the yaw/
// pitch/roll angles (in degrees) calculated from the quaternions coming
// from the FIFO. Note this also requires gravity vector calculations.
// Also note that yaw/pitch/roll angles suffer from gimbal lock (for
// more info, see: http://en.wikipedia.org/wiki/Gimbal_lock)
#define OUTPUT_READABLE_YAWPITCHROLL

// uncomment "OUTPUT_READABLE_REALACCEL" if you want to see acceleration
// components with gravity removed. This acceleration reference frame is
// not compensated for orientation, so +X is always +X according to the
// sensor, just without the effects of gravity. If you want acceleration
// compensated for orientation, us OUTPUT_READABLE_WORLDACCEL instead.
//#define OUTPUT_READABLE_REALACCEL

// uncomment "OUTPUT_READABLE_WORLDACCEL" if you want to see acceleration
// components with gravity removed and adjusted for the world frame of
// reference (yaw is relative to initial orientation, since no magnetometer
// is present in this case). Could be quite handy in some cases.
//#define OUTPUT_READABLE_WORLDACCEL

// uncomment "OUTPUT_TEAPOT" if you want output that matches the
// format used for the InvenSense teapot demo
//#define OUTPUT_TEAPOT



#define INTERRUPT_PIN 2  // use pin 2 on Arduino Uno & most boards
#define LED_PIN 13 // (Arduino is 13, Teensy is 11, Teensy++ is 6)
bool blinkState = false;

// MPU control/status vars
bool dmpReady = false;  // set true if DMP init was successful
uint8_t mpuIntStatus;   // holds actual interrupt status byte from MPU
uint8_t devStatus;      // return status after each device operation (0 = success, !0 = error)
uint16_t packetSize;    // expected DMP packet size (default is 42 bytes)
uint16_t fifoCount;     // count of all bytes currently in FIFO
uint8_t fifoBuffer[64]; // FIFO storage buffer

// orientation/motion vars
Quaternion q;           // [w, x, y, z]         quaternion container
VectorInt16 aa;         // [x, y, z]            accel sensor measurements
VectorInt16 aaReal;     // [x, y, z]            gravity-free accel sensor measurements
VectorInt16 aaWorld;    // [x, y, z]            world-frame accel sensor measurements
VectorFloat gravity;    // [x, y, z]            gravity vector
float euler[3];         // [psi, theta, phi]    Euler angle container
float ypr[3];           // [yaw, pitch, roll]   yaw/pitch/roll container and gravity vector

// packet structure for InvenSense teapot demo
uint8_t teapotPacket[14] = { '$', 0x02, 0,0, 0,0, 0,0, 0,0, 0x00, 0x00, '\r', '\n' };



// ================================================================
// ===               INTERRUPT DETECTION ROUTINE                ===
// ================================================================

volatile bool mpuInterrupt = false;     // indicates whether MPU interrupt pin has gone high
void dmpDataReady() {
    mpuInterrupt = true;
}



// ================================================================
// ===                      INITIAL SETUP                       ===
// ================================================================

void setup() {
    // join I2C bus (I2Cdev library doesn't do this automatically)
    #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
        Wire.begin();
        Wire.setClock(400000); // 400kHz I2C clock. Comment this line if having compilation difficulties
    #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE
        Fastwire::setup(400, true);
    #endif

    // initialize serial communication
    // (115200 chosen because it is required for Teapot Demo output, but it's
    // really up to you depending on your project)
    Serial.begin(115200);
    while (!Serial); // wait for Leonardo enumeration, others continue immediately

    // NOTE: 8MHz or slower host processors, like the Teensy @ 3.3v or Ardunio
    // Pro Mini running at 3.3v, cannot handle this baud rate reliably due to
    // the baud timing being too misaligned with processor ticks. You must use
    // 38400 or slower in these cases, or use some kind of external separate
    // crystal solution for the UART timer.

    // initialize device
    Serial.println(F("Initializing I2C devices..."));
    mpu.initialize();
    pinMode(INTERRUPT_PIN, INPUT);

    // verify connection
    Serial.println(F("Testing device connections..."));
    Serial.println(mpu.testConnection() ? F("MPU6050 connection successful") : F("MPU6050 connection failed"));

    // wait for ready
    Serial.println(F("\nSend any character to begin DMP programming and demo: "));
    while (Serial.available() && Serial.read()); // empty buffer
    while (!Serial.available());                 // wait for data
    while (Serial.available() && Serial.read()); // empty buffer again

    // load and configure the DMP
    Serial.println(F("Initializing DMP..."));
    devStatus = mpu.dmpInitialize();

    // supply your own gyro offsets here, scaled for min sensitivity
    mpu.setXGyroOffset(220);
    mpu.setYGyroOffset(76);
    mpu.setZGyroOffset(-85);
    mpu.setZAccelOffset(1788); // 1688 factory default for my test chip

    // make sure it worked (returns 0 if so)
    if (devStatus == 0) {
        // turn on the DMP, now that it's ready
        Serial.println(F("Enabling DMP..."));
        mpu.setDMPEnabled(true);

        // enable Arduino interrupt detection
        Serial.println(F("Enabling interrupt detection (Arduino external interrupt 0)..."));
        attachInterrupt(digitalPinToInterrupt(INTERRUPT_PIN), dmpDataReady, RISING);
        mpuIntStatus = mpu.getIntStatus();

        // set our DMP Ready flag so the main loop() function knows it's okay to use it
        Serial.println(F("DMP ready! Waiting for first interrupt..."));
        dmpReady = true;

        // get expected DMP packet size for later comparison
        packetSize = mpu.dmpGetFIFOPacketSize();
    } else {
        // ERROR!
        // 1 = initial memory load failed
        // 2 = DMP configuration updates failed
        // (if it's going to break, usually the code will be 1)
        Serial.print(F("DMP Initialization failed (code "));
        Serial.print(devStatus);
        Serial.println(F(")"));
    }

    // configure LED for output
    pinMode(LED_PIN, OUTPUT);
}



// ================================================================
// ===                    MAIN PROGRAM LOOP                     ===
// ================================================================

void loop() {
    // if programming failed, don't try to do anything
    if (!dmpReady) return;

    // wait for MPU interrupt or extra packet(s) available
    while (!mpuInterrupt && fifoCount < packetSize) {
        // other program behavior stuff here
        // .
        // .
        // .
        // if you are really paranoid you can frequently test in between other
        // stuff to see if mpuInterrupt is true, and if so, "break;" from the
        // while() loop to immediately process the MPU data
        // .
        // .
        // .
    }

    // reset interrupt flag and get INT_STATUS byte
    mpuInterrupt = false;
    mpuIntStatus = mpu.getIntStatus();

    // get current FIFO count
    fifoCount = mpu.getFIFOCount();

    // check for overflow (this should never happen unless our code is too inefficient)
    if ((mpuIntStatus & 0x10) || fifoCount == 1024) {
        // reset so we can continue cleanly
        mpu.resetFIFO();
        Serial.println(F("FIFO overflow!"));

    // otherwise, check for DMP data ready interrupt (this should happen frequently)
    } else if (mpuIntStatus & 0x02) {
        // wait for correct available data length, should be a VERY short wait
        while (fifoCount < packetSize) fifoCount = mpu.getFIFOCount();

        // read a packet from FIFO
        mpu.getFIFOBytes(fifoBuffer, packetSize);
        
        // track FIFO count here in case there is > 1 packet available
        // (this lets us immediately read more without waiting for an interrupt)
        fifoCount -= packetSize;

        #ifdef OUTPUT_READABLE_QUATERNION
            // display quaternion values in easy matrix form: w x y z
            mpu.dmpGetQuaternion(&q, fifoBuffer);
            Serial.print("quat\t");
            Serial.print(q.w);
            Serial.print("\t");
            Serial.print(q.x);
            Serial.print("\t");
            Serial.print(q.y);
            Serial.print("\t");
            Serial.println(q.z);
        #endif

        #ifdef OUTPUT_READABLE_EULER
            // display Euler angles in degrees
            mpu.dmpGetQuaternion(&q, fifoBuffer);
            mpu.dmpGetEuler(euler, &q);
            Serial.print("euler\t");
            Serial.print(euler[0] * 180/M_PI);
            Serial.print("\t");
            Serial.print(euler[1] * 180/M_PI);
            Serial.print("\t");
            Serial.println(euler[2] * 180/M_PI);
        #endif

        #ifdef OUTPUT_READABLE_YAWPITCHROLL
            // display Euler angles in degrees
            mpu.dmpGetQuaternion(&q, fifoBuffer);
            mpu.dmpGetGravity(&gravity, &q);
            mpu.dmpGetYawPitchRoll(ypr, &q, &gravity);
            Serial.print("ypr\t");
            Serial.print(ypr[0] * 180/M_PI);
            Serial.print("\t");
            Serial.print(ypr[1] * 180/M_PI);
            Serial.print("\t");
            Serial.println(ypr[2] * 180/M_PI);
        #endif

        #ifdef OUTPUT_READABLE_REALACCEL
            // display real acceleration, adjusted to remove gravity
            mpu.dmpGetQuaternion(&q, fifoBuffer);
            mpu.dmpGetAccel(&aa, fifoBuffer);
            mpu.dmpGetGravity(&gravity, &q);
            mpu.dmpGetLinearAccel(&aaReal, &aa, &gravity);
            Serial.print("areal\t");
            Serial.print(aaReal.x);
            Serial.print("\t");
            Serial.print(aaReal.y);
            Serial.print("\t");
            Serial.println(aaReal.z);
        #endif

        #ifdef OUTPUT_READABLE_WORLDACCEL
            // display initial world-frame acceleration, adjusted to remove gravity
            // and rotated based on known orientation from quaternion
            mpu.dmpGetQuaternion(&q, fifoBuffer);
            mpu.dmpGetAccel(&aa, fifoBuffer);
            mpu.dmpGetGravity(&gravity, &q);
            mpu.dmpGetLinearAccel(&aaReal, &aa, &gravity);
            mpu.dmpGetLinearAccelInWorld(&aaWorld, &aaReal, &q);
            Serial.print("aworld\t");
            Serial.print(aaWorld.x);
            Serial.print("\t");
            Serial.print(aaWorld.y);
            Serial.print("\t");
            Serial.println(aaWorld.z);
        #endif
    
        #ifdef OUTPUT_TEAPOT
            // display quaternion values in InvenSense Teapot demo format:
            teapotPacket[2] = fifoBuffer[0];
            teapotPacket[3] = fifoBuffer[1];
            teapotPacket[4] = fifoBuffer[4];
            teapotPacket[5] = fifoBuffer[5];
            teapotPacket[6] = fifoBuffer[8];
            teapotPacket[7] = fifoBuffer[9];
            teapotPacket[8] = fifoBuffer[12];
            teapotPacket[9] = fifoBuffer[13];
            Serial.write(teapotPacket, 14);
            teapotPacket[11]++; // packetCount, loops at 0xFF on purpose
        #endif

        // blink LED to indicate activity
        blinkState = !blinkState;
        digitalWrite(LED_PIN, blinkState);
    }
}


Arduino 에 업로드 하여 확인해 봅니다.

Arduino IDE > Tools > Serial Monitor 를 열어서 확인해 봅니다.


Initializing 이 끝나고 준비상태가 되면, 어떤 character 든 보내면 측정이 시작됩니다.



Gyroscope 의 위치값들이 실시간으로 순식간에 측정이 되기 시작합니다.



잘 되네요.




6. Processing

3D 모델링을 통하여 Gyroscope 의 위치가 어떻게 보여지는지를 해봅니다.


다만, 우선 먼저 업로드 했던 sketch 를 조금 바꾸어서 업로드 해 놓을 필요가 있습니다.


- 코멘트 아웃 : #define OUTPUT_READABLE_YAWPITCHROLL

- 코멘트 제거 : #define OUTPUT_TEAPOT


이제 3D 가시화 하기 위해 "Processing IDE" 라는 프로그램을 다운로드 받고 인스톨 합니다.


https://processing.org/download/?processing



사용하는 OS 에 맞는 파일을 다운로드 받고 인스톨 합니다.



이제 Arduino MPU 6050 processing example 을 실행에 필요한 "Toxi" library 를 다운로드 받습니다.


https://bitbucket.org/postspectacular/toxiclibs/downloads/


지금 올라와 있는 최신 버전은 "toxiclibs-complete-0020.zip" 입니다.

다운로드 받으면 processing 폴더의 libraries 안에 copy 합니다.


- Program Files > processing > modes > java > libraries



아래는 copy 완료된 후의 libraries 폴더의 모습.



이제 processing 을 실행시킨 후, Arduino IDE libraries 폴더에 있는 MPU6050 example 에 있는 processing 용 파일을 엽니다.


- Arduino > libraries > MPU6050 > examples > MPU6050_DMP6 > Processing > MPUTeapot > MPUTeapot.pde



이것을 실행하기 전에 마지막으로 port 를 수정합니다.

저는 "COM6" 에 arduino 가 연결되어 있으므로 다음과 같이 수정하였습니다.


- String portName = "COM6";


Linux 의 경우는 "String portName = Serial.list()[0];" 을 활성화 하거나,

"String portName = /dev/ttyUSB0" 등과 같이 직접 기술해 주면 됩니다.



이제 준비는 완료 되었습니다.




7. 3D 결과

Processing 프로그램의 플레이 버튼인 "run" 을 실행시키면 다음 동영상 같이 비행체를 통하여 확인할 수 있습니다.



오오오오오!!! 정말 되었어!

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



신기한 센서를 이용하여 가시화 하니 재미 있네요.




8. 3D object 변경해 보기

못생긴 비행기 모양은 112 ~ 139 라인에서 구현해 놨습니다.

이 모양을 바꾸고 싶으면 이 부분을 수정하면 됩니다.


수정하는 내용은 아래 URL 을 참고하면 되겠습니다.


https://processing.org/tutorials/p3d/


translate(width/2, height/2, 0);
stroke(255);
rotateX(PI/2);
rotateZ(-PI/6);
noFill();

beginShape();
vertex(-100, -100, -100);
vertex( 100, -100, -100);
vertex(   0,    0,  100);

vertex( 100, -100, -100);
vertex( 100,  100, -100);
vertex(   0,    0,  100);

vertex( 100, 100, -100);
vertex(-100, 100, -100);
vertex(   0,   0,  100);

vertex(-100,  100, -100);
vertex(-100, -100, -100);
vertex(   0,    0,  100);
endShape();


적용하면 다음과 같이 변경됩니다. :-)






FIN

주말에 GY-521 센서 가지고 잘 놀았습니다.

향후 드론을 만들게 되면 사용하게 될까요?

And

Hardware | Resistor Network 을 사용해보자

|

1. LED bargraph

LED bargraph 를 이용하여 progress bar 를 표현할 수 있습니다.

바로 Aliexpress 에서 구매해서 놀고 있었습니다.


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


LED bargraph 는 LED 들을 하나의 뭉치로 만든 제품이지만,

LED 의 특성상 전압/전류를 제한하기 위해 필수로 저항을 달게 되어 있습니다.


그래서 LED bargraph 에는 다리 하나하나에 저항을 달아줘야 합니다.

당연히 아래와 같이 붙여주거나 전선의 스파게티화를 볼 수 있습니다.



그러던 중, 응?!!!!!

아래와 같은 사진을 접하게 됩니다.

이리 깔끔해 질 수 있다니!!!



확인해보니, "Resistor Network" 이라는 부품이었습니다.

예전 90년대의 PC mainboard 에도 많이 보았던 부품이 이것이었구나... 라고 추억에 젖어 봅니다.



점이 있는 부분이 공통선이고, 각각의 다리가 하나의 저항 역할을 합니다.

머리를 잘 쓴 제품이네요.



Resistor network 을 일반 저항을 이용해서 만들면 다음과 같다고 하네요.





2. 주문

바로 AliExpress 에서 제품을 찾아 봅니다.

LED 에는 보통 220 Ohm 이나 330 Ohm 이 많이 쓰이는 것 같습니다.


220 / 330 짜리를 주문합니다.

330 짜리는 나중에 LED 8x8 matrix 에서도 사용해야 해서 미리 주문해 놓습니다.



위의 제품은 331J 라고 표시된 제품인데, 의미는 330 Ohm 에 5% 의 오차라는 뜻이라 합니다.





3. 스펙

잠깐 스펙에 대해서 알아보도로 하죠.

참고한 문서는 다음과 같습니다.


 L-373215.pdf


Resistor network 은 단순한 "-1 Circuit Based" 와 각각을 짝으로 맟준 "-3 Circuit Isolated" 가 있고,

"-5 Circuit Dual Terminator" 등이 있다고 합니다.



넘버링의 의미는 다음과 같습니다.

마지막 숫자는 맨 뒤에 "0" 이 몇개가 오는지와, "J" 는 5% 의 의미랍니다.



새로운 것을 또 공부하게 됩니다. 즐겁네요.




4. 도착

부품이 도착하여 여러가지 확인해 봤습니다.



50개 단위가 적당할 것 같아서 50개 묶음을 주문했더랬습니다.

낱개의 사진입니다. 쪼만쪼만한게 귀엽네요.



220 Ohm 사진도 올려 봅니다.



330 Ohm 의 실제 저항을 측정해 봤습니다.

일반 저항보다 정도가 더 좋습니다.

아마 허용 와트(W) 용량은 작겠지만, 정도는 정말 좋네요.





5. 연결해 보자

LED bargraph 에 연결해 봤습니다.



한번에 하나밖에 점등을 못시켰는데, 이제는 한꺼번에 LED 를 킬 수 있습니다!

역시 좋네요.


GND 연결선들도 복잡하여 모두 resistor network 으로 대체해 봅니다.

전류나 전압이 떨어지겠지만 LED 점등에는 문제 없을것 같아, +/- 모두 resistor network 를 연결해 봅니다.



완전 깔끔해 졌습니다. 맙소사.




FIN

74HC595 칩이 도착하면, 이제 대망의 arduino 와 연결하여 컨트롤 해볼 예정입니다.

아... 너무 즐겁습니다.

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

Life | 에어콘 수리 도전기

|

1. 주인공

우리집에 있는 에어컨입니다.

거실에 있는건 실내 스탠드형 입니다.

안방에는 벽걸이형이 있구요. 2개가 하나의 실외기에 연결되어 있어서 2-in-1 이라고 하더군요.



정식 명칭은 "FNQ166DURW" 라고 하네요.



실외기 모델 번호는 "FUQ166DTU" 이고, 벽걸이형 실내기 모델은 "SJQ066SAQW" 입니다.




2. 증상

문제의 증상은 다음과 같습니다.


a. 실내기 벽걸이형은 문제 없슴

b. 실내기 스텐드형은 CH05 에러를 내며 실외기와 연동 ERROR

c. 실외기와 연동이 실패하면 멈춤


CH05 문제가 발생하면 신호선을 확인하라고 하네요.

CH05 에 대해서 메뉴얼을 보면 다음과 같이 나와 있습니다.



연결전선 확인이네요...




3. 분해

문제를 해결하기 위해 일단 분해를 합니다.

컨트롤 박스에서 실외기로 연결되는 부분을 확인해 보려 합니다.


어디에서부터 분해해야 할줄 몰라 나사를 분리할 수 있는 부분을 살펴봅니다.

윗부분에 나사를 분리할 수 있는 부분을 찾았습니다.



나사 두개를 분리하니 상판 전면 패널이 분리되기 시작합니다.

따다다다닥!



윗상판을 분리하면 자연스럽게 그 밑에 있는 커버를 분리할 수 있게 됩니다.

컨트롤 박스에 접근하려면 상판 커버는 놔두고, 이 부분만 먼저 분리하면 됩니다. (나중에 안 사실)



중간 회색 커버를 분리하면, 컨트롤 박스가 달려있는 제일 밑칸의 커버를 분리할 수 있는 나사가 보입니다.

요놈 찾으려고 2주 걸렸습니다. (토/일 주말만)



나사를 분리하면 드디어! 하부 커버가 분리 됩니다.



짜잔~! 컨트롤 박스가 EMI 를 차단하기 위한 금속 커버가 보입니다.





4. 컨트롤 박스

커버를 분리하면 드디어 찾던 기판이 보입니다.

혹시 컨덴서가 부풀었나, 단선이 있나, 탄 흔적이 있나, 퓨즈가 나갔나 확인해 봅니다.

깨끗하네요.


저 아래 노란색 부분이 실외기와 연결된 부분입니다.


CH05 에러는 여기서부터 나가는 신호가 문제가 있다고 하는 것이니,

집중적으로 점검합니다.



커넥터를 분리하여 연결 금속을 화살표 방향으로 눌러줘 봅니다.

커넥터에 삽입 되었을 때, 접점을 확실히 잡아주기 위한 방법입니다.



이제 실내 스텐드를 찾아 봤지만, 시각적으로 실내기에는 문제가 없어 보입니다.




5. 실외기

실외기 뚜껑을 땁니다.

여기도 컨드롤 박스가 보이네요.



실외기 컨트롤 박스 뚜껑도 땁니다. (쉽게 분리됩니다)



PCB의 밑부분이 위로 올라와 있네요.

이 상태로는 부품의 상태를 알 수 없어서 나사들을 풀어보려 합니다.


... 만, 나사를 다 풀어도 걸려있는 선들과 커넥터들이 많아서 일단 포기합니다.



실외기의 팬 돌아가는 것도 소음이 심하니 한번 둘러 봅니다.

외관상 특이점은 보이지 않습니다.

모터 부분에 WD-40 을 뿌려보고 싶지만, 먼지와 열에 의하여 더 상태가 나빠진다고들 하니 청소기로 먼지만 빨아들여 봅니다.





6. 실외기 연결부

실외기 왼쪽 부분에 연결 커넥터들이 모여 있습니다.

퓨즈도 보이고 페라코어도 보이고 한데 뭉쳐 있네요.




손잡이 커버의 밑부분에 있는 나사 하나를 풀어주면, 커버가 쉽게 분리됩니다.



커버를 분리하니 시원하게 선들이 보입니다.



연결부를 바깥 시선에서 찍어본 사진입니다.

여기로 들어오는 선이 3가닥이 한데 뭉쳐져 유입되어 있고, 서로 엉켜 있습니다.


또한, 고정 플라스틱에 고정도 안되어 있습니다.

구조상 보면, 서로 연결하는 배선반 같은 부분과의 거리가 너무 짧아서 의미가 없어 보입니다.


기사님이 이렇게 복잡하게 연결해 놓으신 건, 살인적으로 바쁘셔서 이고 제품 설계 구조의 문제도 있어 보입니다.

구조라도 개선이 좀 되어야겠네요.



선이 인입하는 부위도 분리해 줍니다.

접지선도 무리한 힘이 가해지지 않도록 방향을 바꿔줍니다.

어느정도 깔끔해 졌습니다.



보기에도 좀 시원해졌네요.



새로 분리한 선은 다른 구멍으로 인입되므로, 수분이나 벌레의 인입을 막기 위해 쓰지 않는 걸레를 잘라서 말아 줬습니다.

... 만, 비올때 수분을 머금고 있다가 나중에 기판에 수분을 퍼트릴 수 있어, 이 방법은 단념합니다.



스폰지를 찾아 헤매이다, MeeGoPad 박스에 있는 쿠션을 사용해 봅니다.



인입 구멍에 맞추어 절단합니다.



이쁘게(?) 재단되었습니다.



딱 맞네요!



잘 끼워졌습니다만, 구멍이 완전히 막지는 못합니다.



결국 소파 닦았던 스폰지를 찾아서 잘 재단하여 체결합니다.

이제야 좀 마음에 평화가 찾아왔습니다.



뚜껑을 닫으니 정확하게 밀폐가 됩니다.



실제로 고친 부분은 없지만, 더이상 할 부분이 없으므로, 실외기 뚜껑을 닫습니다.




7. 호스 보수

실외기가 남향 베란다에 붙어 있어서 햇볕을 직접 쐽니다.

그래서 그런지 연결선 다발이 헤졌습니다.


빛과 열을 차단하면서 보호해줄겸 알루미늄 호일로 감싸 줍니다.

신호들이 지나갈 때, 온도가 뜨거워 짐으로써 높아지는 저항을 낮춰줄 수 있을것 같습니다.





8. 초기화

이제 할 수 있는 모든걸 마쳤으니, 스텐드 실내기를 초기화 합니다.

시작은 전원버튼과 온도를 낮추는 조절 버튼을 동시에 누르면 가능합니다.



시운전 초기화 장면입니다.



수리기 도전을 시작하기 전에는 계속 실패했는데, 이번에는 성공 했습니다.


배선이나 여러가지를 손본 결과일 수도 있겠지만, 하나의 팁을 알게 되었습니다.

그것은...


a. 스텐드형을 "제습"으로 바로 시작하지 않는다. (CH05 에러 뜸)

b. 벽걸이형은 실외기와의 연동에 문제가 없으므로, 벽걸이형을 먼저 키고 실외기가 돌기 시작 후,

   스텐드형을 시작하면, 문제 없이 가동된다.


그러나 이 방법은 결국 실패했습니다!

근본적인 해결에 대해서는, 이 글 맨 밑에 걸려있는 링크 글을 참고해 주세요.





FIN

이 제품 설치 및 설계 개선점을 적어 봅니다.


a. 남향이나 그늘이 아닌 직사를 받는 장소에 실외기를 설치하지 않는게 바람직하다.

b. 어쩔수 없이 햇볕쪽에 설치를 해야 한다면, 실외기 상부에 커버를 만들어 그늘을 형성하게 해준다.

c. 실외기 컨트롤 박스는 뚜껑과 가까워 열을 쉽게 전달받을 수 있어, 구조적으로 좋지 않다. (설계 개선 필요)

d. 실내기 연결선 부분은 여유롭게 구조를 만들고, 배선을 고정하는 장치를 개선할 필요가 있다. (설계 개선 필요)




What Next?

곰곰히 생각해 보면, 실외기 컨트롤 박스의 PCB 문제인것 같습니다.

한번 완전히 분해해 보고싶습니다. 부품중에 열화가 생긴 부분이 있을것 같습니다.


아니면, 아래 사진처럼 LG에서 잠깐 시험적으로 만든 "태양광 발전 패널" 을 뚜껑에 장착하면,

발전도 하고 그늘도 만들어주고 1석2조일 듯 합니다.



혹시 구매할 수 있나 해서 LG 마케팅 부서에 메일을 보내봤으나, 아직 답변은 못받았습니다.


역시 해결책은,

PCB 를 점검해서 교체하거나, solar panel 을 구하거나 만들어서 그늘을 만드는게 다음 해결책으로 보입니다.


점점 일이 커져가네요.





2018.07.30 update


결국 고쳤습니다.


* Life | 에어콘 수리 성공기

http://chocoball.tistory.com/entry/Life-air-conditioner-DIY-success


딱 1년만이네요.

자세한 것은 위의 포스트를 참고해 주세요.


And

Hardware | Soil Moisture Sensor 구동해 보기

|

1. 농작물 automation

향후 나이를 먹으면, 농사를 지을 생각입니다.

다만, 전자 기기 경험과 IT 경력을 이용하여 가능한 전자동으로 하고싶습니다.


일조량, 물주기, 항온 항습, 통풍, 영양소 확인 등등...

그 목적을 위해 오늘도 Arduino 를 이용하여 열씸히 놀고 있습니다.


이 농사 automation 에서 토양의 수분 확인은 필수겠죠?

그래서 관련 센서들을 평소 찾아 다녔습니다.




2. Soil Moisture Sensor

네, 맞습니다. 한글로 번역하면 "토양 수분 감지기" 정도가 되겠습니다.

토양에 자동으로 물을 주려면 수분의 level 을 잘 감지해 내야겠죠?


AliExpress 에서 찾아 봅니다.



센서부에 금박이 칠해져 있고, 품질 좋은 것으로 호평받는 RobotDyn 사의 제품이 있습니다.

1.28 USD !!! 배송비 무료. 감사합니닷.




3. 도착

잊고 있었더니만 어느샌가 도착했습니다.



비닐 포장도 깔끔하게 되어 있고, 프린팅도 괜찮습니다.

간만에 괜찮은 품질의 제품을 만난것 같습니다.



개봉한 샷 입니다.



금빛 찬란하군요.





4. Layout

Pin 접속은 다음과 같습니다.


 Soil Moisture Sensor | Arduino Nano
-------------------------------------
          OUT         |     5V
          GND         |     GND
          VCC         |     D2
-------------------------------------


 128X64 OLED | Arduino Nano
----------------------------
     GND     |     GND
     VCC     |     3.3V
     SDA     |     A4
     SDL     |     A5
----------------------------

RobotDyn 제품의 원래 오리지날은 SparkFun 사의 "Soil Moisture Sensor" 일지도 모르겠습니다.


https://learn.sparkfun.com/tutorials/soil-moisture-sensor-hookup-guide


외관이 너무 비슷합니다.

그래서 고맙게도 IDE sketch 를 그대로 가져다 써도 잘 동작합니다.






5. Source

Sketch 는 다음과 같습니다.

OLED 를 붙여서 동작시키게 조금 수정하였습니다.


/*  Soil Mositure Basic Example
    This sketch was written by SparkFun Electronics
    Joel Bartlett 
    August 31, 2015

    Basic skecth to print out soil moisture values to the Serial Monitor 

    Released under the MIT License(http://opensource.org/licenses/MIT)
*/

#include "SPI.h"
#include "Wire.h"
#include "Adafruit_GFX.h"
#include "Adafruit_SSD1306.h"
#include "stdint.h"
 
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);


int val = 0; // value for storing moisture value 
int soilPin = A0; // declare a variable for the soil moisture sensor 
int soilPower = 7; // variable for Soil moisture Power

// rather than powering the sensor through the 3.3V or 5V pins, 
// we'll use a digital pin to power the sensor. This will 
// prevent corrosion of the sensor as it sits in the soil. 

void setup() {
	Serial.begin(57600); // open serial over USB
	
	pinMode(soilPower, OUTPUT); // set D7 as an OUTPUT
	digitalWrite(soilPower, LOW); // set to LOW so no power is flowing through the sensor
	display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
}

void loop() {
	// get soil moisture value from the function below and print it
	int result = readSoil();
	Serial.print("Soil Moisture = ");    
	Serial.println(result);

	// clear the buffer
	display.clearDisplay();
	
	// text display tests
	display.setTextSize(2);
	display.setTextColor(WHITE);
	display.setCursor(0,0);
	display.print("Soil\n");
	display.print("Moisture\n");
	isplay.print("\n  == ");
	display.print(result);
	
	display.display();

	// this 1 second timefrme is used so you can test the sensor and see it change in real-time.
	// for in-plant applications, you will want to take readings much less frequently.
	delay(1000); // take a reading every second
}

// this is a function used to get the soil moisture content
int readSoil() {
	digitalWrite(soilPower, HIGH); // turn D7 "On"
	delay(10); // wait 10 milliseconds 
	val = analogRead(soilPin); // read the SIG value form sensor 
	digitalWrite(soilPower, LOW); // turn D7 "Off"
	return val; // send current moisture value
}


출처는 SparkFun 사의 위의 사이트 입니다.




6. 동작 확인

Pin 을 연결하고 sketch 를 업로드 한다음 제대로 동작하는지 확인해 봅니다.



화분에 물주고 확인해야 하는데, 일이 커지므로 손기운으로 측정으로 해봅니다.

잘 되네요!!!



실측값을 토대로 실제로 흙속에 넣고 해봐야겟지만, 동작확인이 되었으니 충분합니다.


아마 흙속에 계속 넣고 있으면, 금박 등이 다 삵아서 제대로 동작되지 않겠죠?

지속적인 사용은 못할 듯 합니다.

실제 농작물 automation 에 사용하려면 수분이 직접 닫지 않고도 측정되는 센서가 필요할 듯 합니다.


동영상도 한번 찍어봤습니다.


간단하게 잘 동작하네요.




FIN

아~ 나의 농작 automation~!!!

And

Hardware | MB102 Breadboard Power Supply Module 를 사용해 보자

|

1. 빵판

전자부품을 이용하여 놀려면 빵판이 필요합니다.

AliExpress 에서 빵판을 구매하기로 하고 돌아봅니다.



큰것도 있고 작은것도 있고...

큰거는 부담스럽고, 작은 것은 프로토타입 만드는 용도 정도라, 반쪽 사이즈를 찾아봅니다.


당연히 있네요.




2. 주문

AliExpress 에서 딱 적당한 크기의 빵판을 팔고 있습니다.


https://ko.aliexpress.com/item/Breadboard-830-Point-Solderless-PCB-Bread-Board-MB-102-MB102-Test-Develop-DIY/32339925888.html



특히 좋은 것은 몇 개의 lead 선들과 전원 모듈을 같이 동봉되어 있네요.



바로 주문합니다. 무료배송인지는 항상 확인합니다.




3. MB102 Power Supply Module

주문한 빵판에는 MB102 Power Supply Module 이라는, 전원 공급장치가 있습니다.

Arduino 에 필요한 5V/3.3V 는 물론이거니와 USB를 통한 전원도 공급하는 모양입니다.


원래는 YwRobot 이라는 회사에서 정식으로 제조되는 물건인데,

중국분들이 클론을 제조해 팔고 있는 듯 합니다.


요렇코롬 생겼습니다.

빵판의 +/- 에 딱 다리가 맞게 되어 있습니다.



한쪽에 다리가 두개씩 되어 있습니다.

다음과 같이 끼우면 됩니다.



뒷면입니다.

워낙 구조가 간단하다 보니 그렇게 특별하지 않아 보입니다.





4. 구동

전원을 인가해 봅니다.

단, 어느정도의 voltage 를 넣어도 되는지 아무런 설명서가 동봉되어 있지 않습니다.

뭐 늘상 그러려니 하고 인터넷을 뒤져 봅니다.


뭔가 복잡한 회로도가 나왔습니다.

각 단자들의 연결과 부품들이 나와 있습니다.

이렇게 잘 나와 있으니 카피 뜨는건 정말 쉬울 듯 합니다.



좀더 찾아보니 input voltage 를 명시한 그림이 있네요.

그렇습니다. "6V ~ 12V" 를 DC로 입력하라고 그러네요.



적당한 DC adapter 를 골라서 꼽아 줍니다.

집에는 9V / 1A 어뎁터가 있어, 이것을 이용합니다.





5. 전압 확인

전원을 인가했을 때, 전압이 제대로 나오는지 확인해 봅니다.

우선, 점퍼를 3.3V 으로 옮겨 놓고, 빵판의 전원 라인에 3.3V 가 되는지 확인해 봅니다.


3.273V... 뭐 적정한것 같습니다.



이번에는 5V 에 점퍼를 옮겨 놓고 측정해 봅니다.

4.94V... 나쁘지 않은 것 같습니다.



빵판의 전원선에 연결하는 것 외에

보드상에서 바로 3.3V / 5V / GND 핀으로만 되어 있는 부분에 연결해 봅니다.


3.3V / GND 를 확인해 보면, 3.273V 가 나옵니다.

어찌보면 당연하네요. 동일한 레귤레이터를 거쳐서 3.3V / 5V 를 만들어 내므로, 전원 리드선에서 나오는 값과 같을 수밖에 없습니다.



아쉬우니 5V / GND 핀도 측정해 봅니다.

동일하게 4.94V 가 측정됩니다.



USB 를 통한 전원 공급도 문제 없는지 봅니다.

Arduino Micro 가 잘 동작하네요.



5V / GND 와 USB를 동시에 사용했을때도 검사해 봅니다.

특별히 로드를 걸지 않아서 적절한 확인인지는 모르겠지만, 문제 없이 잘 나옵니다.



특별히 문제 없고 괜찮은 듯 합니다.

OLED 같이 항상 그 자리에 놓고 전원을 인가하는 module 일 경우는, 3.3V / GND 에 항상 연결해 놓고 사용해도 편할 것 같습니다.




6. 주의사항

아래 URL 에서 자세한 주의사항 및 spec. 정보가 있었습니다.


http://www.petervis.com/Raspberry_PI/Breadboard_Power_Supply/YwRobot_Breadboard_Power_Supply.html



이 사이트에서도 제품을 받고 사양을 믿고 바로 사용하지 말고, 꼭 디지털 미터기로 측정한 다음 사용해라고 나와 있습니다.

또한 어뎁터도 가능한 6.5V 근처의 것을 사용하라고 권장하고 있습니다.

이는, 어차피 5V / 3.3V 로 떨어트려 사용하므로, 레귤레이터에 무리가 없게 하려면, 낮으면 낮을 수록 좋을것 같습니다.


흠흠... 그렇군.





FIN

하나씩 알아가는 재미가 쏠쏠합니다.

And

Hardware | Raindrops 모듈 구동해 보기

|

1. 자동 와이퍼

요즘 차들은 비가 오기시작하면 자동으로 알아서 와이퍼가 움직여 줍니다.

또한 비의 양에 따라 와이퍼의 속도도 조절되죠.


어떤 센서가 있는지 찾다 보니, "Raindrop Senseor" 라는게 있네요.


안해볼 이유를 찾을 수 없습니다. 바로 구입해야죠.




2. 주문

역시 나의 친구 AliExpress. 역시 좋은게 있네요.



고마워요 무료배송.




3. 도착

도착샷 입니다.



잘(?) 포장해서 왔군요. 뭐 항상 이렇습니다.



검출부와 제어부로 되어 있네요.



센서가 양면으로 되어 있습니다.


컨트롤부의 자세한 사진입니다.

전원 LED가 있고, 비를 인식할때 켜지는 LED가 따로 있습니다.

감도 조절도 할 수 있네요.



뒷면은 MH-Sensor-Serise 라고 적혀 있습니다.

이게 Raindrop 전용이 아니라, +/- 를 통해서 입력받는 센서들 정보를 Arduino / Raspberry Pi 와 통신하기 위한 모듈로 보입니다.



다른 센서에서도 같이 쓰이는 사진을 발견했습니다. 완벽하게 똑같네요.



아래는 사양서 입니다.


rain_sensor_module.pdf





4. Layout

Pin 배열은 다음과 같습니다.


 MH-Sensor-Series | Arduino Nano
---------------------------------
        VCC       |     5V
        GND       |     GND
         D0       |     D2
         A0       |     A0
---------------------------------


 128X64 OLED | Arduino Nano
----------------------------
     GND     |     GND
     VCC     |     3.3V
     SDA     |     A4
     SDL     |     A5
----------------------------


빵판 구성입니다.



이번에는 OLED 도 같이 연결해 봤습니다.




5. Sketch

소스 스케치 입니다.


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

#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

int nRainIn = A1;
int nRainDigitalIn = 2;
int nRainVal;
boolean bIsRaining = false;
String strRaining;

void setup() {
	Serial.begin(57600);
	pinMode(2,INPUT);
	display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
}
void loop() {
	nRainVal = analogRead(nRainIn);
	bIsRaining = !(digitalRead(nRainDigitalIn));
	
	if(bIsRaining) {
		strRaining = "YES";
	} else {
		strRaining = "NO";
	}
	
	// clear the buffer
	display.clearDisplay();
	
	Serial.print("Raining: ");
	Serial.print(strRaining);  
	Serial.print("\t Moisture Level: ");
	Serial.println(nRainVal);
	
	// text display tests
	display.setTextSize(1);
	display.setTextColor(WHITE);
	display.setCursor(0,0);
	display.print("Raining: ");
	display.print(strRaining);
	display.setCursor(0,10);
	display.print("Moisture Level: ");
	display.print(nRainVal);
	display.display();
	
	delay(1000);
}


Serial Monitor 를 사용하지 않고 OLED 를 사용하니, PC 를 키지 않아도 좋네요.





6. 결과

1초 간격으로 비가 감지되었는지, 습도는 어느정도인지 표시해 줍니다.

이때는 LED가 전원쪽에만 켜집니다.



감지부에 물이 떨어지면, 꺼져있던 LED가 켜지고 비가 온다고 "YES" 로 표시가 변합니다.



OLED 와 LED 를 확대한 사진입니다.



물을 닦으면 바로 Raining 부분이 "NO" 로 변경됩니다.

감도는 좋네요.


아래는 과정을 보여주는 동영상 입니다.






FIN

이번 비오는 센서는 전기와 물이라는 서로 친화적인 특성인지 몰라도

반응이 아주 좋았습니다.

And

Hardware | 저항을 구매해 보자

|

1. 저항이 필요해

저항은 센서를 구동함에 있어 전압을 맞추기 위해 여러모로 필요합니다.

특히 LED 나 온도센서들은 민감해서 꼭 저항이 필수 입니다.


Arduino 취미에 있어서는 몇개쯤 구입해 놔야겠죠?

(콘덴서도 필요한데...)




2. 저항의 종류

AliExpress 에서 쉽게 찾아볼 수 있는 저항에는 두가지가 있습니다.

우리가 학교다닐 때 쉽게 접했던 누런색 바탕의 저항이 "탄소" 저항입니다.

요즘 전자기기를 분해해 보면 파란색 바탕의 저항이 "메탈" 저항입니다.


어떤것을 구매하는게 좋을까요? 찾아 봤습니다.


* 탄소 피막 저항

저렴하고 널리 쓰이는 유형으로 세라믹 기판에 탄소화합물 피막을 입힌 것.

열에 의한 값이 변하여, 정확도가 중요한 회로에서는 메탈 피막 저항기를 대체해서는 안된다고 합니다.


* 메탈 피막 저항

세라믹 봉에 금속 박을 얇게 증착시키고 홈을 파서 저항으로 만든 것.

1%의 정밀도도 쉽게 낼 수 있으며 온도에 따른 성능 변화도 적습니다.

하늘색 바탕에 색띠가 다섯 줄이면 1% 금속 피막 저항이라고 생각하셔도 좋습니다.


다만 와트 수를 높이기가 무척 어렵다는 것이 단점이라고 합니다.


시중에서도 1/8, 1/4, 1/2W까지는 비교적 쉽게 구할 수 있으나,

1W의 것은 찾기 어렵고, 2W이상은 생산되지 않는다고 보면 된다 합니다.


* 출처

http://blog.naver.com/casalsaudio/80061879019

http://blog.naver.com/paynoh/10171240920


자고로 "메탈 피막 저항"을 구매해야 하는군요.




3. 구매

AliExpress 에서 검색하면 많이 나옵니다.

저는 아래 재품을 구입하였습니다.


사실 300개라고 하지만, 저항이 여러가지라 그리 많은게 아닙니다.

테스트를 위해서는 가변저항을 향후 생각해 봐야겠네요.



무료배송에 이 가격이면 정말 고민이 되지 않습니다.




4. 도착

3주만에 도착했습니다. 그리 늦은건 아니죠.



같은 저항이 10개씩 묶음으로 들어 있습니다.



펼쳐봤습니다.



저항 종류는 다음과 같습니다.


10Ω  22Ω  47Ω 100Ω  150Ω  200Ω  220Ω  270Ω  330Ω
470Ω  510Ω  680Ω  1KΩ  2KΩ  2.2KΩ  3.3KΩ  4.7KΩ  5.1KΩ  6.8KΩ
10KΩ  20KΩ  47KΩ  51KΩ  68KΩ  100KΩ  220KΩ  300KΩ  470KΩ  680KΩ  1MΩ


왠만한 회로에서 여구하는 것은 다 있는것 같아요.




5. Sampling

LED 하면서 사용한 220Ω 을 측정해 봤습니다.

그리 나쁘지 않네요.



동일한 값의 다른 저항도 측정해 보니 비슷합니다.



그럼 조금 큰값인 2.2kΩ 을 측정해 봤습니다.



쓸만 한것 같습니다.




FIN

콘덴서는 한국제품 (예를 들면 삼양) 이 좋다고 하여 국산을 사보려 합니다.


And