목차

1. 디버깅 콘솔

1) 개요

2) 1.8인치 TFT LCD 모듈

핀 연결

1.8인치 TFT LCD 모듈 아두이노(Uno/Pro Mini) 비고
SCK 13
SDA 11
A0 9
RESET 8
CS 10
GND GND
CC VCC +5V, +3.3V 모두 가능
LED+ 3 (PWM) PWM 핀이면 아무나 가능
LED- GND
SD MISO 12
SD SCK 13 LCD의 SCK와 동일
SD MOSI 11 LCD의 SDA와 동일
SD CS 4

제품 사진

아두이노 프로 미니에 연결한 사진.

3) 소스 코드

소스코드의 길이가 길어 링크로 대신함
디버깅 콘솔 소스코드

2. 원격 가스 잠금 시스템

집에 가스렌지 스위치가 월패드로 원격 닫힘 기능이 가능하지만 ZIGBEE가 지원되지 않아 외출 중에 가스를 잠글 수 없는 구조로 되어있다.
DIY 하기 귀찮아 인터넷에서 검색 해 봤으나 인터넷에서 팔리는 제품의 경우 필자의 집에서는 적용하기 어려운 구조라 이를 직접 만들어 적용해 보기로 한다.
집 밖에서 외출중에 원격으로 가스 밸브를 잠그는 것이 본 프로젝트의 목적이기 때문에, 보안을 위해 웹 페이지가 아닌 Android 프로그램을 통한 Packet 통신으로 구현하도록 한다.

(1) 프로젝트 시나리오

  1. Micro Switch로 밸브 잠김 여부 확인
  2. IOT용 프로토콜인 MQTT 브로커를 이용하여 본 기기 제어
  3. 현재 밸브 상태를 MQTT 브로커에 전달.
  4. MQTT 앱이나 브로커 웹페이지에서 밸브 잠금 명령을 보내면 기기에서 기기 잠그기 위한 Micro Servo 동작.
  5. 밸브가 잠기면 Micro Switch가 감지하여 릴레이를 이용하여 Servo Motor에 가는 전원을 차단.
  6. 사용자가 밸브를 OPEN하면 Micro Switch의 점점이 떨어지면서 릴레이를 이용하여 Servo Motor에 전원을 공급.
  7. 테스트를 위한 테스트 버튼 장착.

(2) 재료

  1. ESP8266 12E WIFI 보드 : 외부에서 원격으로 제어하려면 WIFI가 되야지…
  2. 마이크로 스위치 : 밸브가 닫혔는지 여부를 확인하기 위한…
    pds.devpia.com_maeul_251_top_pds_33000_32467_microsw.jpg
  3. 택트 스위치 : 공장도 초기화를 위한…
    pds.devpia.com_maeul_251_top_pds_33000_32466_tactsw.jpg
  4. 저항 : 1K ~ 10K 2개 (마이크로 스위치, Reset용 스위치에 사용)
  5. MICRO SERVO : 아두이노 키트에 들어가는 SERVO 모터
  6. 여러색깔의 점프선
  7. 5VDC 전원공급용 어뎁터 (220VAC 용)
  8. 5V 릴레이 : 밸브 닫힘 상태에서는 Servo 모터의 전원 차단용.
  9. NPN 트랜지스터 : ESP8266은 3.3V를 사용하기 때문에 5V 릴레이 동작시키기 위한 Switching용.
  10. 만능 기판
  11. Xiaomi Desktop Lamp Open Source
    샤오미에서 만든 ESP8266칩을 사용하는 Desktop Lamp의 소스가 인터넷에 공개되어있다. 이를 이용해서 프로젝트를 진행해 볼까 한다.
    https://github.com/Torxgewinde/Desk-Lamp-Alternative-Firmware

(3) 프로젝트 진행 상황

개시 : 2019년 01월 18일

작업 명 진행 상황 진행 율
1. 프로젝트 구상 통신 프로토콜 남음 95%  
2. 재료 준비 완료 100%  
3. 회로도 제작 완료 100%  
4. HW 제작 완료 100%  
5. HW 디버깅(유닛 테스트) 모두 정상 동작 확인 완료 100%  
6. 아두이노 프로그램 제작 제작 완료 100%  
7. 테스트 테스트 완료 100%  

개발 완료 : 2019년 02월 27일

덫붙여

현재 본인의 집에 본 기기가 필요 없게 되 버렸다.
신규 아파트의 경우 월패드에서 동작되는 모든 기능이 스마트 앱을 이용하여 폰에서 동작하도록 되 있다.
그 결과 그 앱으로 밸브를 잠글 수 있게 되었다.
그래도 테스트까지 마무리하여 향후 다른 프로젝트에 사용할 수 있는 기반을 만들었다.

(4) 회로도

IOT 기기를 만들기 위한 회로도는 아래 그림과 같다.

Fritzing 회로도 다운로드

(5) 납땜 완료 후 모습

(6) 실제 부품들을 연결하여 동작 중인 모습

(7) 프로그램 소스

사용한 녀석들

  1. MQTT
    • Mqtt는 IOT 기기를 위한 프로토콜이라 해도 무방할 정도로 IOT 기기에 최적화 되어있다.
    • 간단한 구조로 되어있어 Micro Controller와 같은 CPU로도 충분히 통신이 가능하다.
    • TOPIC이라는 URL과 비슷한 명령으로 서버로 데이터를 보내고, 서버에서 보낸 데이터를 수신한다.
    • MQTT는 일반적으로 1883번 포트를, SSL의 경우 8883번 포트를 사용한다.
  2. PubSubClient : MQTT Client Library
    • Adafruit MQTT를 사용하려다 packet parsing 구문에서 지정된 시간만큼 block되는 문제로 PubSubClient로 변경하였다.
    • 본 프로젝트에서는 Micro Servo, LCD, Sensor Check, Web Server등을 돌려야 하는 이유로 Adafruit Mqtt Client를 사용하지 않았다.
  3. io.adafruit.com
    • 내가 만든 IOT기기와 Mqtt 통신을 하기 위한 서버.
    • 무료로 테스트 할 수 있는 cloud 저장공간도 제공한다.
    • 최대 20개 sensor까지 무료 사용 가능.
    • 1분에 최대 30개 데이터.
    • 최대 10개 feed (topic)
    • 데쉬보드 최대 5개.
  4. 샤오미 Desktop Lamp 소스
    • 공장 초기화 해서 WIFI 잡을때 웹페이지로 WIFI 설정을 할 수 있는 WifiManager의 사용법을 참조함.
    • 파일별로 구조화가 잘 되어있어 나도 본 구조를 사용 중.
    • WebServer 사용을 잘 해 놔서 참조함.
    • 이런 저런 IOT 기기만들때 좋은 기능들이 있어 많이 참조함.

IDE와 툴 체인

아두이노 세팅

본 프로그램 소스 다운 로드

3. 아케이 게임용 조이스틱 DIY

PC용 아케이드 게임을 2인용으로 할 수 있도록 조이스틱을 제작한다.

프로젝트 개시 : 2018년 10월 02일
프로젝트 완료 : 2019년 03월 10일

부품 구하는데 시간이 오래 걸렸다.
현재 버튼이 뻑뻑해서 모두 교체할 예정이다.

1) 재료

(1) 아두이노 Pro Micro 호환 보드

(2) 조이스틱 모듈

www.elementzonline.com_image_cache_catalog_data_products_sensors_20and_20modules_joystick_20module_joystick_20module-500x500.jpeg

(3) 스위치 버튼

ae01.alicdn.com_kf_htb1aztwe93pl1jjszftq6alrvxap.jpg

◎ 연결 방법


(4) 조이스틱 Library

본 라이브러리를 사용하면 라이브러리 자체에서 본 기기를 조이스틱으로 장치를 생성시켜 준다.
조이스틱 모듈의 X와 Y의 아나로그 값하고 버튼의 상태만 라이브러리에 입력하면 조이스틱이 완성된다.

본인이 사용한 라이브러리는 다음 사이트로 이동하여 다운받는다.
Download Joystick Library by Matthew Heironimus

다음과 같은 장치로 인식된다.

2) 핀배열

조이스틱을 만들기위해 Arduino와 주변 기기들간 연결을 다음과 같이 한다.

아두이노 Pro Micro 주변 기기 비고
A2 JOYSTICK 모듈 VRx
A1 JOYSTICK 모듈 VRy
A0 버튼1
D9 버튼1
D10 버튼1
D11 버튼1
TX 버튼1 D1 핀 겸용
RX 버튼1 D0 핀 겸용
SDA 버튼1 D2 핀 겸용
SDL 버튼1 D3 핀 겸용

3) 조이스틱 완성된 형태

pds.devpia.com_maeul_251_top_pds_33000_32474_20190309_233138324_68945.jpg

4) 프로그램 소스

 
#include <Joystick.h>
 
const long pinJoystickAxisX = A2;
const long pinJoystickAxisY = A1;
const long pinButtonPlayerStart = A0;
const long pinButtonCoin = 9;
const long pinButtonA = 3;
const long pinButtonB = 2;
const long pinButtonC = 0;
const long pinButtonX = 10;
const long pinButtonY = 11;
const long pinButtonZ = 1;
 
Joystick_ Joystick;
 
 
 
 
struct
{
  bool analog;
  int pin;
  int state;
  int button;
  const char * name;
}   joystick_buttons[] = 
{
  { false, pinButtonA, LOW, 0, "buttonA" },
  { false, pinButtonB, LOW, 1, "buttonB" },
  { false, pinButtonC, LOW, 2, "buttonC" },
  { false, pinButtonX, LOW, 4, "buttonX" },
  { false, pinButtonY, LOW, 5, "buttonY" },
  { false, pinButtonZ, LOW, 6, "buttonZ" },  
  { true, pinButtonPlayerStart, 0, 8, "buttonPlayerStart" },
  { false, pinButtonCoin, LOW, 9, "buttonCoin" },
};
const long NUM_BUTTONS = sizeof(joystick_buttons) / sizeof(joystick_buttons[0]);
 
struct _AXIS_
{
  int pin;
  int value;
  const char * name;
}   joystik_axis[] = 
{
  { pinJoystickAxisX, 0, "AxisX" },
  { pinJoystickAxisY, 0, "AxisY" },
};
const long NUM_AXIS = sizeof(joystik_axis) / sizeof(joystik_axis[0]);
 
 
 
 
 
void setup()
{
  Serial.begin(9600);
  Serial.println("joystick startup...");
 
  // Initialize Joystick Library
  Joystick.setXAxisRange(0, 255);
  Joystick.setYAxisRange(0, 255);  
  Joystick.begin();
}
 
 
 
 
void loop()
{
  // Read pin values
  for (int index = 0; index < NUM_BUTTONS; index++)
  {
    int currentButtonState = LOW;
    auto & btn = joystick_buttons[index];
    if( btn.analog )
    {
      currentButtonState = analogRead(btn.pin);
      if( currentButtonState > 1000 ) currentButtonState = HIGH;
      else                            currentButtonState = LOW;
    }
    else
    {
      currentButtonState = digitalRead(btn.pin);
    }
 
    if (currentButtonState != btn.state)
    {
      btn.state = currentButtonState;
      Joystick.setButton(btn.button, currentButtonState);
      if( currentButtonState )
      {
        Serial.println(String(btn.name) + " is pushed");
      }
      else
      {
        Serial.println(String(btn.name) + " is released");
      }
    }
  }
 
  for (int index = 0; index < NUM_AXIS; index++)
  {
    int cur = 0;
    auto & axis = joystik_axis[index];
    cur = analogRead(axis.pin) / 4;
 
    if (cur != axis.value)
    {
      axis.value = cur;
      if( axis.pin == pinJoystickAxisX )
      {
        Joystick.setXAxis(cur);
      }
      else if( axis.pin == pinJoystickAxisY )
      {
        Joystick.setYAxis(256-cur);
      }
    }
  }
}

4. DRONE 제작

5. 화분 물주기 알림 센서

1) 개요

본 프로젝트는 사람들이 화분을 키우다가 물을 주지 않아 말라 죽는 상황을 조금이나마 해소하고자 하는 바람에 수분 측정 기기를 만들기로 한다.
본인 역시 화분 키우기에 익숙하지 않아 초기에는 물을 주기적으로 몇번 주다가 금새 까먹고 말려죽인 화분이 한 두개가 아니다.
현재 본인의 아이들 역시 화분에 씨앗을 키우고자 하고 있는데 본인처럼 물을 주지않고 화분의 식물이 목말라 죽는 문제를 미연에 방지하고자 한다.

본 센서는 LED로 화분 토양 속 수분의 양을 표시한다.
CDS 광 센서를 이용해서 집안에 불이 꺼질경우 LED 역시 작동을 중지해서 빛 공해를 어느정도 해소하도록 한다.
인체 감지용 레이더 센서를 이용해서 근처에 있는 사람이 감지 될 경우 소리로 관심을 유도토록 한다.

프로젝트 시작 : 2019년 03월 13일
프로젝트 종료 : —-년 –월 –일

2) 재료

3) 핀배열 (소재 연결)

DigisPark Pro-Mini 소재 설명
D5/A0 D2 RCWL-0516 디지털 사람 인기척 감지 센서
D4/A2 A1 CDS 아날로그 광조도 센서 (불꺼지면 동작 중지 : 빛공해 방지)
D3/A3 D8 스피커 소리 출력/알림 (PWM)
D2/A1 A0 습도센서 흙 습도 측정 센서
D1 D9 LED 물 부족 알림
D0

4) 회로 연결도



회로도 다운로드

5) H/W 완성

i.imgur.com_fv6cotb.jpg

6) 프로그램 소스 코드

A 동작 Sequence (Flow Chart)

B 소스 코드

6. DVD Writer를 이용한 CNC Laser 각인기

이번 프로젝트는 DVD Writer에서 떼어낸 리니어 모터와 레이저를 이용하여 각인기를 만들도록 한다.
CNC 각인기는 CNC 공작기계와 마찬가지로 가공하고자 하는 명령을 G-CODE로 입력하면 알아서 가공을 한다.
DVD Writer 2대에서 리니어 모터 2개와 레이저 2개를 빼내도록 한다.