April 19, 2024

디바이스마트 미디어:

[66호] 원하는 색상으로 제어가 가능한 아두이노 IoT 스마트 무드등 키트 -

2021-06-25

★2021 ICT 융합 프로젝트 공모전 결과 발표! -

2021-05-12

디바이스마트 국내 온라인 유통사 유일 벨로다인 라이다 공급! -

2021-02-16

★총 상금 500만원 /2021 ICT 융합 프로젝트 공모전★ -

2021-01-18

디바이스마트 온라인 매거진 전자책(PDF)이 무료! -

2020-09-29

[61호]음성으로 제어하는 간접등 만들기 -

2020-08-26

디바이스마트 자체제작 코딩키트 ‘코딩 도담도담’ 출시 -

2020-08-10

GGM AC모터 대량등록! -

2020-07-10

[60호]초소형 레이더 MDR, 어떻게 제어하고 활용하나 -

2020-06-30

[60호]NANO 33 IoT보드를 활용한 블루투스 수평계 만들기 -

2020-06-30

라즈베리파이3가 드디어 출시!!! (Now Raspberry Pi 3 is Coming!!) -

2016-02-29

MoonWalker Actuator 판매개시!! -

2015-08-27

디바이스마트 레이저가공, 밀링, 선반, 라우터 등 커스텀서비스 견적요청 방법 설명동영상 입니다. -

2015-06-09

디바이스마트와 인텔®이 함께하는 IoT 경진대회! -

2015-05-19

드디어 adafruit도 디바이스마트에서 쉽고 저렴하게 !! -

2015-03-25

[29호] Intel Edison Review -

2015-03-10

Pololu 공식 Distributor 디바이스마트, Pololu 상품 판매 개시!! -

2015-03-09

[칩센]블루투스 전 제품 10%가격할인!! -

2015-02-02

[Arduino]Uno(R3) 구입시 37종 센서키트 할인이벤트!! -

2015-02-02

[M.A.I]Ahram_ISP_V1.5 60개 한정수량 할인이벤트!! -

2015-02-02

[34호]개 쾌변 (애완동물 배변패드 교체알람 시스템)

33 아두이노  (1)

2015 ICT 융합 프로젝트 공모전 입선

개 쾌변 (애완동물 배변패드 교체알람 시스템)

글 | 세종대학교 정승철

심사평

펌테크 개발자의 세심한 관찰력과 설문조사 등 세심한 노력이 반영된 창의적인 아이디어 출품작으로, 상업성도 충분히 지닌 작품이라 생각합니다.

JK전자 작품의 창의성이 높거나 기술 구현의 난이도가 어려운 편은 아니다. 하지만 실제 제품화 했을 경우에 실용성에 높은 점수를 주었다. 기술 구현에 있어서 보완을 하자면 애완 동물이 배변패드에서 20초 이상을 머물렀을 경우에 배변을 한 것으로 인식을 하고 있으나, 조금 더 정확하게 인지를 하려면 습도센서 등을 활용했으면 좋았을 것 같고, 작품에서는 배변의 횟수를 주인에게 알려주고 배변 패드의 교체 시기를 알려주고 있는데, 한번 더 나아가서 모터, 레일 등을 이용하셔 자동으로 배변 패드까지 교체 가능하도록 아디디어를 냈다면 더 좋았을 것 같다.

뉴티씨 기존에는 없었던 상품을 개발하는 것은 꽤 참신한 시도이고, 애완동물을 키우는 입장에서 이런 프로그램이 하나쯤 있었으면 좋겠다고 생각했다. 하지만, 배변 패드를 자동으로 치워 주었다면 어땠을까 하는 생각이 든다. 예를 들면, 혼자서 애완동물을 키우는 경우 장기 출장 중에는 배변 패드를 갈아줄 사람이 없기 때문에 문제가 발생하기 쉽기 때문이다. 그리고 적외선 센서가 아닌, 바닥에 수분 센서를 배치하여 좀 더 정확한 배변 감지를 했으면 어땠을까 하는 생각도 든다.

칩센 주제 선정과정이나 주제 그 자체도 훌륭하다. 실제 문제가 되고 있는 부분을 해결하기 위한 과정도 잘 기재하여 다양한 사람들의 관심을 받기에 충분해 보인다. 정보통신 기술이 실제 일상생활의 불편함을 해결해 주는 좋은 과제로 보인다. 사료 등의 정보를 넣은 부분은 좋지만 실제 배변패드의 센서값으로 배변 주기나, 기타 관련 정보도 분석 후 선택적으로 보여주는 방법이었으면 좀 더 좋았을 것 같다. 재미있는 아이디어이다.

위드로봇 그 효용성을 떠나서 자신의 아이디어의 필요성을 확인하기 위해 설문조사를 하고, 샘플 갯수가 부족하긴 하지만 그 결과로부터 연구 방향을 도출한 부분은 작품의 실용성과 기대효과 측면에서 무척 좋은 접근 방법이라 생각한다. 반면 PSD 센서를 통해 이 문제을 해결하려는 시도는 분명 오동작이나 미동작과 같은 생각하지 않았던 오류가 있었을 텐데 그 부분에 대한 설명이 보고서에 없어, 구현한 기술이 원래 문제를 잘 해결한 것인지 파악하기가 어렵다.

작품 제목
작품 제목은 “개 쾌변”이라고 지었다. 작품 제목의 뜻은 강아지를 키우는 가정에서 빈번하게 발생하는 ‘강아지가 지정된 자리에 대소변을 보지않는’ 불상사를 막고, 화목한 가정을 유지할 수 있게 도움을 주며, 강아지를 키우는 주인들에게 불편을 덜어주고자 작품을 만들었다. 따라서 이러한 의미를 내포하면서도 단순하게 “개 쾌변”이라고 지었다.

작품 개요
사용대상
강아지를 키우는 가정

필요성

34 ICT 개01
다음 통계조사에서 볼 수 있듯이 점점 애완견을 키우는 가정이 늘어나고 있음을 볼 수 있다. 우리나라 역시 마찬가지인데, 상대적으로 다른 국가들에 비해 애완견의 증가량이 적을 뿐인 것이지 전체적으로 애완견을 키우는 가정의 숫자는 점점 증가하고 있다. 이 작품은 우리나라뿐만 아니라 다른 나라에서도 상용화 될 수 있는 글로벌 작품이라고 할 수 있다.

배경지식
대부분의 애완견을 키우는 가정집은 강아지의 배변을 효율적으로 치우고, 보다 나은 위생관리를 위하여 다음 사진에서 볼 수 있는 것과 같은 배변패드라는 것을 사용한다. 이 배변패드는 애완견과 관련하여 가장 큰 두 가지의 특징이 있다.

34 ICT 개02
첫 번째는, 배변패드는 수분을 잘 흡수하고, 바닥이 젖지 않는다는 점이다. 따라서 바닥으로 그대로 물이 새는 신문지보다 훨씬 위생적이고 강아지의 소변을 관리하기 쉽다.
두 번째는, 대부분의 애완견들은 이미 변을 본 자리에는 대소변을 보지 않는다는 점이다. 이러한 특징 때문에 어느 정도 배변패드에 소변자국이 있으면 그때마다 배변패드를 새 것으로 교체를 해줘야 한다.

설문조사

설문조사 질문목록
1. 키우는 애완견의 몸무게는 몇 kg입니까?
2. 배변패드를 사용하십니까?
3. 애완견이 배변패드를 몇 번 사용 후 교체하는지?
4. 배변패드를 제때 갈아주지 않아서 애완견이 패드 외에 장소에서 변을 봐서 피해 본 경험이 있습니까?
5. 4번 항목에서 ‘그렇다’라고 선택한 경우, 패드 외 어느 장소에서 변을 봅니까?

다음과 같은 설문조사 질문 목록을 가지고 “강 사 모”라고 하는 애완견을 키우는 사람들이 모인 웹사이트의 카페에서 직접 조사를 실시하였고, 20명 정도의 회원이 설문조사에 응해주었다. 아래 사진은 실제로 답변을 담은 사진이다.

34개쾌변055
이에 따라서 설문조사에 대한 응답을 차트로 정리 해보았다.

34 ICT 개03

34 ICT 개04

설문조사에 응한 사람들의 경우에는 대부분 5kg이하의 집에서 쉽게 기를 수 있는 소형 견을 키우고 있었고, 20명 중 19명이 배변패드를 사용하고 있었다. 배변패드를 사용하는 사람들은 다양한 크기의 배변패드가 있지만, 대체적으로 강아지가 배변패드를 3번 정도 사용하고 새 것으로 교체한다고 답변을 주었다. 마지막으로 배변패드에 애완견의 소변을 충분히 봐서 새 것으로 교체해주어야 함에도 불구하고 교체해주지 않아 애완견이 소파, 카펫, 이불, 바닥 등에 변을 봤던 피해 경험은 20명 중 19명이 있었다. 그래서 배변패드를 왜 제때 교체해주지 않아서 피해가 생기는지 연구해보았다.

1. 애완견을 키우는 가정은 배변패드를 주로 집안 중 구석, 즉 자주 가지 않는 장소에 두었다. 그 이유는 냄새, 시각적인 불쾌함 등의 다양한 이유가 있었고 이로 인해서 집에 있음에도 불구하고 자주 가는 장소가 아니기 때문에 신경을 제대로 쓰지 못해서 원하는 장소에 애완견이 변을 보지 않는 피해가 발생하였다.
2. 집이 넓거나 아니면 취침, 일, 공부 등의 이유로 신경을 제대로 쓰지 못해서 피해가 발생하는 경우가 두 번째였다. 집에 가족이 있음에도 불구하고 신경을 못쓰는 가정이 꽤 많았고 실제로 나 또한 애완견을 키우는 입장으로써 신경을 못써서 피해를 본적이 꽤 많았다. 그래서 이러한 피해를 없애고자 아이디어를 제안하게 되었다.

제안한 해결방법
애완견이 배변패드에서 보통 10~20초 정도 대소변을 보기 때문에 배변패드에 적외선 센서를 달아서 애완견이 배변패드에 올라간 것을 감지한다. 3번 정도 감지가 되면 사용자의 스마트 폰으로 데이터를 전송하여 배변패드를 교체해야 된다는 푸쉬 메시지와 알림이 울리도록 하였다. 자세한 것은 아래에서 기술하였다.

작품설명
주요동작 및 특징
주요기능
시스템의 주요기능은 하드웨어 시스템에서 적외선 센서로 애완견이 배변패드에 10~20초 이상 올라간 것을 감지하여 카운트한 것을 PC에 시리얼 통신으로 데이터를 전송해 카운터가 3번 누적되면, TCP/IP 소켓통신을 통하여 스마트폰 어플리케이션으로 배변패드의 교체시기를 푸쉬 알림을 통해 알려준다. 아래는 그림을 통하여 한 눈에 주요기능을 파악 할 수 있도록 나타낸 것이다.

34개쾌변10

① 1단계에서는 적외선 센서가 강아지를 감지하고 강아지가 10~20초 이상 계속해서 배변패드 위에 있다면 2단계로 넘어가고, 그렇지 않으면 2단계로 넘어가지 않는다.
② 2단계에서는 적외선 센서가 강아지의 대소변 정보를 PC가 Arduino 시리얼 통신을 시스템으로부터 통해 받았다. 데이터를 받으면 PC에서 그것을 Count를 하게 된다.
③ 3단계는 Count 데이터가 3이 되면 배변패드를 교체해야 된다는 내용을 TCP/IP 소켓통신을 통해 스마트폰 어플리케이션으로 전송한다.
④ 스마트폰 어플리케이션은 그 데이터를 전송 받아서 푸쉬 알림을 받게 하여 사용자가 신경 쓰지 못하고 있는 경우에도 푸쉬 메시지를 보고 배변패드를 새 것으로 교체 할 수 있도록 하고, 여태까지 Count 데이터는 다시 0으로 초기화한다.

부가기능
부가기능으로는 강아지를 키우는 가정에게 꼭 필요한 정보, 예를 들면 좋은 배변패드 고르는 법, 좋은 강아지의 사료를 잘 고르는 법, 강아지 배변 가리기 훈련법, 어플리케이션 사용법 정보를 넣었다.

전체 시스템 구성
먼저 적외선 센서를 제어할 수 있는 하드웨어 보드인 Arduino UNO와 적외선 센서를 활용하여 회로를 구성하였다. 아래에서 전체적인 시스템을 도식화 하였다.

34개쾌변11
전체적인 시스템은 이렇게 System Architecture로 그려보았다. Arduino System에서 시리얼 통신을 통하여 PC로 데이터를 전송하고 PC는 TCP/IP 소켓통신을 통하여 스마트폰 어플리케이션으로 데이터를 전송하여 강아지 배변패드의 교체시기를 알려주는 것이다.

Arduino UNO 시스템
아래 사진은 실제 운용중인 시스템을 찍은 사진으로 왼쪽에 보면 실제로 배변패드 옆에 조그만 상자를 만들어 적외선 센서를 넣어서 강아지가 배변패드에 올라가는 것을 감지 할 수 있도록 만들었다. 가운데에 빨간색으로 동그라미 친 것이 바로 센서를 제어하는 Arduino UNO 보드이다. 오른쪽의 PC와 케이블을 연결하여 통신을 할 수 있도록 구축해놓은 상태이다.

34개쾌변12

스마트 폰 어플리케 이션

34개쾌변13

개 쾌변 어플리케이션의 메인화면
어플리케이션의 메인 화면으로 START 버튼을 누르게 되면 PC의 서버에 클라이언트로 Connection을 맺어 TCP/IP 소켓통신을 하게 되고 Count 데이터를 수신한다.

34개쾌변14

개 쾌변 어플리케이션의 메인화면
스마트폰 어플리케이션은 실제로 Count가 3일때의 데이터를 기다리는 것이고, Count가 3이 되면, 화면에 작은 메시지로 강아지의 배변패드를 갈아 달라는 메시지가 뜨고 알림이 울리는 것을 볼 수 있다.

34개쾌변15

배변패드에 관한 정보

34개쾌변16

도움말 메인화면

34개쾌변17

배변가리기 훈련법 정보

34개쾌변18

좋은 사료 고르는 법
그 외 5개의 화면에는 부가기능으로 애완견을 키우는 데 있어서 꼭 알아야 하는 필수 정보들을 넣었다.

개발환경
Arduino UNO 시스템

34개쾌변19 34개쾌변20

적외선 센서를 원하는 방식대로 제어하기 위하여 Arduino UNO를 사용하였고, Arduino UNO의 소프트웨어를 설치하고 소스코드를 작성하여 적외선 센서를 원하는 대로 제어하였다.

PC

34개쾌변21 34개쾌변22

PC에서는 시리얼 통신을 통하여 적외선 센서로부터 데이터를 수신하는 것과 Count의 값이 3이 되면 스마트폰으로 데이터를 TCP/IP 소켓통신을 통하여 송신하는 것 크게 2가지의 기능이 있다. 이클립스를 사용하여 자바 언어를 통하여 소스코드를 작성하였다. 그리고 Arduino 시스템과 시리얼 통신, 스마트 폰과 TCP/IP 소켓통신을 하기 위한 PC로는 삼성 NT-R480 노트북 모델을 사용하였다.

스마트폰 어플리케이션

34개쾌변23 34개쾌변24

개발폰으로 LG의 옵티머스 G 스마트폰을 사용하였고, 안드로이드 소프트웨어를 설치하여 자바언어를 작성하여 어플리케이션을 만들었다.

 

 

단계별 제작과정
통신환경 구축하기

34개쾌변25
첫 번째로 시행되어야 할 것은 통신환경을 구축하는 것이다. 통신 환경을 구축하기 위해서 Arduino 소프트웨어를 설치하고, PC에는 자바, 이클립스, 안드로이드를 설치하였다. 먼저 Arduino 시스템에서의 데이터를 RX/TX 통신코드를 통해 이클립스의 콘솔 창에 띄웠다. 그리고 이클립스에 띄운 데이터를 스마트폰 어플리케이션으로 TCP/IP 통신을 통해 전송하여 TextView에 띄우게 하는 것을 두 번째로 실시하여 통신환경을 구축하였다.

하드웨어 회로 구성
두 번째로 시행된 것은 하드웨어 회로를 구성하는 것이었다. Arduino 보드에 센서를 하나만 달 것이었으므로 저항이나 Capacitor를 달 필요는 없어서 센서의 데이터 시트만 보고 간단하게 회로를 구성하였다. Arduino 시스템의 회로는 데이터 시트를 보고 센서에 달린 빨간선은 5V, 검은선은 GND, 노란선은 아날로그 input에 연결하였다.

스마트폰 어플리케이션 기능구현 및 UI 꾸미기
우선 통신환경을 구축하는 작업에서 스마트폰 TextView로 원하는 데이터를 띄우는 것을 완료한 상태였기 때문에 소스코드 상에서 조건 문만 잘 걸어서 Count값이 3이 되면 알림과 푸쉬 메시지가 뜨게끔 만드는 것은 어렵지 않았다. 알림과 푸쉬 메시지가 뜨게 만드는 것은 오픈소스 코드와 안드로이드 책을 참고하여 구현하였다. 나머지 UI를 꾸미는 것은 MS 파워포인트를 이용하여 꾸몄다.

개선방향
개선방향이라고 생각되는 점은 먼저 PC를 거쳐야 한다는 것이다. 사실 블루투스 모듈이나 와이파이 모듈을 이용하여 Arduino 시스템과 스마트폰 어플리케이션끼리 직접 통신할 수도 있지만 그렇게 하지 않은 이유는 첫 번째로 단가를 줄이기 위해서다. 블루투스 모듈이나 와이파이 모듈도 꽤 값이 나가고 그것을 최대한 아껴보고자 PC를 거치게 만들었다. 두 번째로, 어차피 블루투스 모듈이나 와이파이 모듈을 사용하더라도 사용자가 집에 없는 경우엔 근거리 통신인 와이파이와 블루투스로도 한계가 있어 결국엔 PC를 거쳐 서버를 이용한 통신이 이루어져야만 완벽한 시스템이 될 것이다. 그렇기 때문에 일부러 PC를 거쳐서 통신을 하게끔 만들었다. 하지만, 아직 웹 서버를 운용하여 거리에 상관없이 통신하는 것은 좀 더 공부가 많이 필요한 부분이고 데모를 만든 것이기 때문에 이렇게 PC를 시리얼 통신으로 거쳐 통신을 하게끔 구현하였다.

참고자료

34개쾌변26 34개쾌변27

두 개의 도서와 구글에서 검색한 오픈 소스코드를 이용하여 Arduino 시스템을 구현하고 안드로이드 어플리케이션을 완성하였다.

소스코드
시리얼 통신 자바코드

package com.falinux.sample.serial;

import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Enumeration;

public class SerialSample implements SerialPortEventListener {
SerialPort serialPort;
/** The port we’re normally going to use. */
public static final String PORT_NAMES[] = { “COM4” };
/** Buffered input stream from the port */
public InputStream FromArduino;
/** The output stream to the port */
public OutputStream ToArduino;
/** Milliseconds to block while waiting for port open */
public static final int TIME_OUT = 2000;
/** Default bits per second for COM port. */
public static final int DATA_RATE = 9600;

ServerSocket PcServer;
Socket ClientSocket;
PrintWriter ToClient;
BufferedReader FromClient;
int port = 5456;

public SerialSample(int port) {
this.port = port;
System.out.println(“서버 시작합니다”);
try {
PcServer = new ServerSocket(port);
} catch (IOException e) {
e.printStackTrace();
}
}

public void communicate() {
System.out.println(“안드로이드 연결 대기중 …”);
try {

ClientSocket = PcServer.accept();
System.out.println(“연결 성공 !”);
} catch (IOException e) {
e.printStackTrace();
}
}

public void serialtotcp() {
CommPortIdentifier portId = null;
Enumeration portEnum = CommPortIdentifier.getPortIdentifiers();

// iterate through, looking for the port
while (portEnum.hasMoreElements()) {
CommPortIdentifier currPortId = (CommPortIdentifier) portEnum
.nextElement();
for (String portName : PORT_NAMES) {
if (currPortId.getName().equals(portName)) {
portId = currPortId;
break;
}
}
}

if (portId == null) {
System.out.println(“아두이노를 찾을 수 없습니다. Port를 확인해
주세요.”);
return;
}

try{
// open serial port, and use class name for the appName.
serialPort = (SerialPort) portId.open(this.getClass().getName(),
TIME_OUT);

// set port parameters
serialPort.setSerialPortParams(DATA_RATE, SerialPort.
DATABITS_8,
SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);

// open the streams
FromArduino = serialPort.getInputStream();
ToArduino = serialPort.getOutputStream();
ToClient = new PrintWriter(new OutputStreamWriter(
ClientSocket.getOutputStream()));
serialPort.addEventListener(this);
serialPort.notifyOnDataAvailable(true);
} catch(Exception e){
System.err.println(e.toString());
}

try {

FromClient = new BufferedReader(new InputStreamReader(
ClientSocket.getInputStream()));

while (true) {
String ClientMassage;
ClientMassage = FromClient.readLine();

if (ClientMassage == null || ClientMassage.trim().length() == 0) {
System.out.println(“연결 종료!”);
FromClient.close();
serialPort.close();
ClientSocket.close();
PcServer.close();
break;
}
System.out.println(“[Client] “ + ClientMassage);
}

} catch (Exception e) {
System.err.println(e.toString());
}
}

public static void main(String[] args) throws Exception {
SerialSample main = new SerialSample(5456);
main.communicate();
main.serialtotcp();

}

@Override
public void serialEvent(SerialPortEvent oEvent) {
if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
try {
int available = FromArduino.available();
byte chunk[] = new byte[available];
FromArduino.read(chunk, 0, available);
String ByteToString = new String(chunk, 0, chunk.length,
“UTF-8”);
System.out.print(ByteToString);
ToClient.print(ByteToString);
ToClient.flush();

} catch (Exception e) {
System.err.println(e.toString());
}
}
}
}

 

 

Leave A Comment

*