2015년 7월 25일 토요일

아두이노 보드 결선 회로도 디자인하기

아두이노 보드로 작업하다, 결선 방법을 이야기하고 싶을 때, 글로 쓰는 것 보다, 다음과 같은 그림을 보여주는 것이 100배 이해하기 쉽다.

이때 주로 이용하는 회로 디자인 도구가 Fritzing 이다. 매우 편리하다.


다음 링크에서 다운로드 받을 수 있다.

2015년 7월 24일 금요일

부재 가공용 장비 사용하기

이 글에서는 부재 가공을 위한 유용한 장비들을 정리한다.

3차원 이미지 스캔과 관련해, 주변에 있는 인형이나 책을 스캔해서 테스트하면 편하겠지만, 엔지니어링 분야 연구는 그렇게 해서는 폼이 안난다. 엔지니어링스러운 무언가를 갖다 놓고, 스캐닝하고 테스트해야 그럴듯 하다.

이 글에서는 MEP 부재 중 하나인 제일 테스트하기 좋고, 수치를 확인하기 좋은, 98mm 파이프를 이용했다. 다만, 시중에서 구입한 파이프는 길이가 너무 길어서, 사무실에서 테스트하고 스캐닝하기가 어려운게 함정이다.

그래서, 절단기와 연마기를 이용해, 절단하고, 절다면을 매끄럽게 다듬으면 될 것이라 생각했다. 사용했던 결과, 싸고 동작 잘되고 괜찬은 장비는 다음과 같았다.

1. 연마기: dremel trio
2. 소형 절단기: dremel 220 workstation
3. 중대형 절단기: dremel 쏘우맥스, 계양 절단기 등

손쉽게 절단, 연마하면 된다고 생각했으나, 처음에는 장비 조립, 사용법을 익히고, 사용하는 것도 힘들었다. 이는 별개로 치더라도, 막상, 장비를 사용해 부재 가공할 때 나는 소음, 먼지와 몸에서 난 땀이 들러붙어, 나를 힘들게 했다. 집진기도 없이 작업한 것도 함정이다. 이게 없으면, 먼지가 사방 팔방으로 날리고, 몸에 달라붙는다.

절단기 앞에서 부재를 밀어보면, 그 엄청난 소음에 겁이 난다. 게다가, 파이프 절단이 두부처럼 잘라지는 것도 아니라, 부재를 잘 고정시키고, 힘을 세게 주어, 밀어야 절단면이 그나마 매끄럽게 잘 가공된다. 이때, 방심하면, 손가락 하나 날라갈 수도 있다. 그래서, 장비를 사용하기 전에 안전한지 항상 신경써야 한다.


DJI 펜텀 3 드론 테스트

DJI 펜텀 3 드론이 잘 되는 지 테스트해 보았다. 사용법, 앱과 관련 설정을 익히는 데, 거의 하루 이상이 지나갔다. 레퍼런스는 다음과 같다.


튜토리얼대로 따라하니 잘 된다. 보람이 있다.



이제 다음과 같은 영상을 얻을 수 있다.


3D 이미지 스캔과 프린팅

본인이 하는 연구 중에 3차원 역설계 과제가 있다. 이와 관련해, MEP (기계, 전기 및 배관) 설비가 노후화되면, 스캔된 데이터가 잘 보관되어 있다면, 이를 이용해, 부재를 제작하는 데 도움이 되지 않을 까라는 당연한 생각을 해 보았다 (예를 들어 여수 등 화학단지 설비들은 수십년 이상이고, 설계도서도 잘 관리되지 않아, 유지보수하기가 매우 어렵다).

그럼 3차원 프린팅을 잘 활용하면 되지 않을까? 그래서, 테스트해보았다. 분말형 레이저 소성 가공이 가능한 고가의 3차원 프린터로 테스트해본다면 좋겠지만, 우리는 그럴만한 돈이 없다. 그래서, 저가 제품으로 테스트를 해 보았다 (1차 테스트는 초기 저가 모델로 테스트해 보았으나 모델 하나 출력하는 데 에러가 너무 많아, 설정에만 하루 종일 준비해야 했다-초창기 저가 적층형 프린터는 에러가 매우 많았다. 2차 테스트는 XYZ 프린팅사에서 개발한, 나름 안정화된 저가형으로 평가받고 있는 da Vinci AiO)로 테스트해보았다.


프린터가 이상이 없는 지, 여러가지 확인을 해 보았다. 다음은 테스트 결과이다.

AiO 프린터

 스캐닝된 모델을 재출력한 모습 (형상이 완전 똑같지는 않다)

스캐닝해서, 그 결과를 그대로 출력해보고, LOD (모델 상세도)를 줄여서 출력해보는 등등 여러가지 작업을 해 보았다. 저가형치고는 괜찬은 품질이다. 

이제 본격적으로 파이프를 이용해 테스트한다. 캘리브레이션을 하고, 다시, 3차원 포인트 클라우드를 획득해, 3차원 모델링을 하고, 출력을 한다. 이 과정이 거의 하루 종일 걸린다 (가끔 출력 시 모델이 엉키거나, 스캐닝이 잘 안되는 경우는 이 과정을 재반복한다). 출력만 하는 시간은 대략 3~4시간 이상 걸렸다.

3차원 이미지 스캐너 캘리브레이션 (캘리브레이션 후에는 결과가 좀 더 좋아짐)


  
 스캔된 파이프 포인트 클라우드를 3차원 모델로 모델링

이제, 모델링된 3차원 모델을 3차원 프린터로 출력된 형상의 정밀도를 확인해 보자.


정밀도 측정 (외경이 98mm이므로, 0.16mm오차)

보다 시피 약간의 왜곡이 있으나, 파이프 정도의 유지보수성이 효과가 있는 지, 문제가 무엇인지, 고려할 점이 어떤 것인지 등등을 확인하는 데는 큰 문제가 없었다.

차후, 시간이 더 있다면, 좀 더 자세한 내용을 정리하려 한다.

후기1 - 프린팅하다가, 카트리지가 인식되지 않아, 일주일을 그냥 날려 먹었다. 용산까지 가서 수리를 해와야 했기 때문이다. 3차원 프린터의 안전성과 성능은 돈과 지수적으로 비례했다.

후기2 - 국내 다수의 3차원 프린터들은 RepRap과 같은 해외 오픈소스 소프트웨어와 하드웨어를 조합한 것들이 많다. 3차원 프린팅 기술이 세계적으로 유명해지다보니, 이런 레퍼런스는 숨긴채, 개발자 행세를 하는 사람들도 많고, 그대로 가져와 저품질의 제품을 찍어내는 패브랩 회사들도 생겨났다. 이는 요즘 유명한 드론 분야도 마찬가지다.


오픈소스는 누구나 가져다 쓸수 있다. 그러므로, 이를 잘 이용한다면 큰 문제가 없다. 하지만, 브랜드 홍보를 위해, 레퍼런스 달지도 않고, 물건을 생산해 팔면서, 유지보수도 제대로 안해주는 제품을 판다는 것은 매우 문제가 많은 것이다. 시장이 혼탁해지는 것이다. 한번 당해본 입장에서 적어본다.



Current sensor 및 Relay 사용 방법

커런트 센서와 릴레이를 연동한 작업 방법을 간단히 기술해 본다.
릴레이는 전자적 스위치로 신호를 주어 고전압 전류가 흐르는 스위치를 켜고 끌수 있다.

1. 준비
회로 구성은 매우 단순하다. 다만, 테스트를 위해, 220V 전원선과 소켓을 릴레이와 같이 연결하고, 커런트 센서도 함께 연결해야 한다.


연결하였으면, 테스터로 제대로 연결되었는 지 테스트한다. 혹시 합선이 될 수도 있으므로, 숫전원 플러그의 양끝 단자를 테스터로 연결 검사해본다. 만약, 삐~ 소리가 난다면, 숫전원 플러그에 연결된 전선이 합선되게 연결된 것이다. 마찬가지로, 암전원 플러그의 양끝 단자도 테스터로 연결 검사해, 혹시 합선되지 않았는 지 확인해 본다.


  • 합선일 경우, 절대로 220V 전원을 연결하면 안된다. 합선 원인을 파악해, 다시 회로를 연결한다.
  • 전원이 연결된 상태에서, 릴레이나 주변 회로를 절대로 만져서는 안된다. 고전압으로 감전사고가 날 수 있다. 


2. 개발
릴레이를 켜고 끄는 것은 매우 단순하다. 만약, 릴레이 신호 핀이 아두이노 보드 8번핀에 연결되어 있다면, 아래와 같이 신호를 주면, 릴레이 스위치가 켜진다.

    digitalWrite(relay_pin, HIGH);

반대로 LOW신호를 주면 꺼지게 된다.

전류값은 커런트 센서에서 획득된 값을 이용해, 약간의 계산을 해야 한다. 만약, 커런트 센서가 A1핀과 연결되어 있다면, 다음과 같이 코딩을 하면, 소모 전류값을 Watt로 얻을 수 있다. 여기서, zero_sensor 값은 최초 setup() 함수 실행시 A1핀에서 얻은 커런트 센서 값이다.

  // Perform power measurement
  float sensor_value = getSensorValue(A1); 
  // Convert to current
  amplitude_current = (float)(sensor_value-zero_sensor)/1024*5/185*1000000;
  effective_value = amplitude_current/1.414;
  effective_power = abs(effective_value*effective_voltage/1000);  

3. 결과
다음과 같이, 광센서를 이용해, 특정 조도값 이하이면, 전원을 켜고, 끄는 테스트를 해 보았다. 큰 문제 없이 잘 동작 된다.


동작이 잘 된 것을 확인한 후에, 반듯이 전원선을 뽑고, 작업을 정리한다.

DHT 센서값 출력

이 글에서는 DHT 센서값을 출력해 본다. 그림에서 왼쪽이 DHT11, 오른쪽이 DHT22 타입이다.


DHT 센서 아두이노 라이브러리는 아래 링크에서 다운로드 받아 설치할 수 있다.

참고로 데이터시트는 다음과 같다. 

1. 회로 결선
아래와 같이 결선한다.

2. 코딩
아래와 같이 코딩한다.

// Example testing sketch for various DHT humidity/temperature sensors
// Written by ladyada, public domain

#include "DHT.h"

#define DHTPIN 2     // what pin we're connected to

// Uncomment whatever type you're using!
//#define DHTTYPE DHT11   // DHT 11
#define DHTTYPE DHT22   // DHT 22  (AM2302)
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

// Connect pin 1 (on the left) of the sensor to +5V
// NOTE: If using a board with 3.3V logic like an Arduino Due connect pin 1
// to 3.3V instead of 5V!
// Connect pin 2 of the sensor to whatever your DHTPIN is
// Connect pin 4 (on the right) of the sensor to GROUND
// Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor

// Initialize DHT sensor.
// Note that older versions of this library took an optional third parameter to
// tweak the timings for faster processors.  This parameter is no longer needed
// as the current DHT reading algorithm adjusts itself to work on faster procs.
DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(9600);
  Serial.println("DHTxx test!");

  dht.begin();
}

void loop() {
  // Wait a few seconds between measurements.
  delay(2000);

  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();
  // Read temperature as Fahrenheit (isFahrenheit = true)
  float f = dht.readTemperature(true);

  // Check if any reads failed and exit early (to try again).
  if (isnan(h) || isnan(t) || isnan(f)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }

  // Compute heat index in Fahrenheit (the default)
  float hif = dht.computeHeatIndex(f, h);
  // Compute heat index in Celsius (isFahreheit = false)
  float hic = dht.computeHeatIndex(t, h, false);

  Serial.print("Humidity: ");
  Serial.print(h);
  Serial.print(" %\t");
  Serial.print("Temperature: ");
  Serial.print(t);
  Serial.print(" *C ");
  Serial.print(f);
  Serial.print(" *F\t");
  Serial.print("Heat index: ");
  Serial.print(hic);
  Serial.print(" *C ");
  Serial.print(hif);
  Serial.println(" *F");
}

3. 결과
제대로 했다면, 시리얼 모니터에서, Humidity, Temperature, Heat index 값을 확인할 수 있다.



참고로 본인은 앞의 LCD 예제를 이용해, 그 값들을 LCD에 출력해 보았다. 이 값은 광센서값을 받아 Lux로 변환해 출력하는 코드가 실행되고 있다. 관련 내용은 Home automation 레퍼런스를 참고하였다.


참고로 조도값에 대한 설명은 다음 래퍼런스를 참고하길 바란다.





2015년 7월 23일 목요일

데이터값 LCD에 출력하기

센서 작업을 하다 보면, 가끔, 노트북 시리얼 통신이 아닌, LCD (liquid crystal display) 에서 직접 센서 데이터를 보고 싶을 때가 있다. 이럴 경우, LCD 1602 칩을 사용하면, LCD에 원하는 텍스트 값을 쉽게 출력할 수 있다.

관련 레퍼런스는 다음과 같다.
1. 회로 구성
핀 결선은 다음과 같다.
회로도는 다음과 같다. 사용한 저항은 1.5K옴이다. 


2. 코딩
스케치 코드는 다음과 같다.

/*
  LiquidCrystal Library - Hello World

Library originally added 18 Apr 2008
by David A. Mellis
library modified 5 Jul 2009
by Limor Fried (http://www.ladyada.net)
example added 9 Jul 2009
by Tom Igoe
modified 22 Nov 2010
by Tom Igoe

This example code is in the public domain.

http://www.arduino.cc/en/Tutorial/LiquidCrystal
*/

// include the library code:
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
//LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
LiquidCrystal lcd(0, 1, 2, 3, 4, 5);

void setup() {
  // set up the LCD's number of columns and rows: 
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.print("hello, world!");
}

void loop() {
  // set the cursor to column 0, line 1
  // (note: line 1 is the second row, since counting begins with 0):
  lcd.setCursor(0, 1);
  // print the number of seconds since reset:
  lcd.print(millis()/1000);
  delay(200);
}

3. 실행
실행 결과는 다음과 같다.


간단한 출력인데, 사용하는 핀이 많다는 것이 함정.