PJ 가전제품 원격 제어 어플리케이션

·2022년 4월 28일
3

프로젝트

목록 보기
3/3
post-thumbnail

개발 배경

  • IoT 시스템이 아닌 기존 가전제품들은 실외에서 원격 조작이 불가능하므로 가전제품 중 적외선 리모컨으로 조작이 가능한 제품을 야외에서 조작할 수 있도록 하기 위해
  • 음성 인식과 같은 편리한 방법으로 가전을 조작하기 위해

개발 기간

2019.7 ~ 2019.11


개발 환경

  • Android Studio
  • JAVA
  • JAVA Socket Server
  • Arduino

어플리케이션 구조

  • 인터넷이 연결된 스마트폰 두 대를 이용하여 이용자의 스마트폰으로 명령을 송신한다.
  • 적외선 송출기를 부착한 스마트폰으로 명령을 수신, 다시 적외선 송출기를 이용하여, 가전제품으로 명령을 송신한다.

개발 내용

레이아웃

  • Socket 서버를 이용해 통신하는 2개의 앱은 각각 Sender와 Receiver로 제작.


Sender에서 Device를 선택하면 나타나는 화면.

  • Android Studio를 이용해 리모컨 형태로 레이아웃을 구성.
  • 각 버튼을 누르면 저장된 신호를 서버에 전송.

Java Socket Server

package TCPServer;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class TCPServer {
	public static void main(String[] args) throws IOException { // 메인함수, IOException
		ServerSocket serverSocket_S = null; // 서버소켓 생성
		ServerSocket serverSocket_R = null; // 서버소켓 생성
		Socket clientSocket_S = null; // 서버소켓이 지정한 포트를 타고온 상대 ip를 저장할 수 있다. 샌더의 소켓
		Socket clientSocket_R = null; // 리시버의 소켓
		PrintWriter out = null; // String 타입의 문자를 보낼수 있는 변수.
		BufferedReader in = null;// stream 타입의 문자를 읽어서 저장할 수 있는 변수.

		serverSocket_S = new ServerSocket(9000); // 서버소켓 생성
		serverSocket_R = new ServerSocket(9001); // 서버소켓 생성
		System.out.println("연결 대기중");
		clientSocket_R = serverSocket_R.accept(); // 클라이언트로부터 데이터가 오는것을 감지한다.
		System.out.println("Receiver 클라이언트 연결");
		while (true) {
			try {
				// 서버 소켓을 만들고 연결을 기다린다.
				clientSocket_S = serverSocket_S.accept(); // 클라이언트로부터 데이터가 오는것을 감지한다.
				System.out.println("Sender 클라이언트 연결");

				// 클라이언트로 부터 데이터를 받는다.
				while (true) {

					out = new PrintWriter(clientSocket_R.getOutputStream(), true); // String 타입을 stream 형태로 변환하여 전송
					in = new BufferedReader(new InputStreamReader(clientSocket_S.getInputStream()));
					// 소켓에서 넘어오는 stream 형태의문자를 얻은 문자를 얻은후 읽어 들어서 버퍼스트림 형태로 in 에 저장.

					String inputLine = null; // in으로 받아들인 데이터를 저장할 string 생성
					inputLine = in.readLine(); // in에 저장된 데이터를 String 형태로 변환 후 읽어들어서 String에 저장
					System.out.println("클라이언트로 부터 받은 문자열:" + inputLine); // 저장된값 콘솔 출력
					out.println(inputLine); // 돌아온값을 다시 되돌려 보낸다. //String이 stream으로 변환되어 전송됨.
					if (inputLine == null) {
						System.out.println("Sender 클라이언트 연결 해제");
						break;
					}
				}

			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		/*
		 * out.close(); in.close(); clientSocket_R.close(); clientSocket_S.close();
		 * serverSocket_R.close(); serverSocket_S.close(); // 열린 모든것을 닫아준다.
		 */

	}
}

공유기를 통한 기기 간 통신을 위해서 PortFowarding 작업이 필요했다.

Arduino 활용 적외선 신호 분석

  • 아두이노 키트를 이용해 적외선 리모컨의 신호를 받아 16진수로 저장.

3.5mm 이어잭을 이용한 적외선 송신기 제작.

  • 3.5mm 단자는 Ground, Left, Right 세 개의 극으로 이루어져 있는데,
    적외선 송신도 Ground, VCC, Signal 세 극으로 이루어져 있어 이어잭을 이용한 적외선 송신이 가능하다.

각 신호를 WAV 파일로 변환.

  • 16진수로 입력 받아 둔 신호를 WAV파일로 변환하는 것은 어떤 웹사이트에서 제공되는 툴을 이용했지만
    현재는 해당 웹을 찾을 수 없어 기재하지 못했다.
  • 원리 :
    • 이어잭을 통해 송출할 수 있는 주파수는 가청 주파수인 20000Hz인데, 적외선 신호의 주파수는 38000Hz이다.
    • 38000Hz를 구현하기 위해 2개의 LED에 서로 반전된 19000Hz의 신호를 전달한다.

첫번째 동작 방식

  • 집에 비치해 둔 스마트 기기에 RemoteR 어플리케이션을 통해 조작하는 방식.
  • 버튼을 누르면 서버 통신 없이 직접 이어잭에 부착된 적외선 송신기를 이용해 가전 제어를 위한 신호 전송.

두번째 동작 방식

  • 음성 인식을 통해 미리 저장해 둔 문장이나 단어(예: TV 볼륨 높여줘, 에어컨 온도 낮춰줘)를 말하면 미리 저장해 둔 데이터와 비교하여 해당하는 신호 송출.
  • 음성 인식은 구글 어시스턴트를 이용해 구글 서버에 보낸 음성을 Text로 변환하여 다시 받아오는 방식.

세번째 동작 방식

  • 서버와 집에 비치된 스마트 기기에서 RemoteR 앱을 실행시켜 둔 후에,

    어플리케이션을 이용하여 어느 장소에서나 집에 있는 가전에 신호를 전송.

개발 결과

이용하는 데에 별다른 제품이 필요한 것이 아니라, 사용하지 않는 Android OS의 스마트폰과 이어폰 단자에 부착할 적외선 송출기만 있으면 사용 가능하다.

이런 이유로 수십, 수백만 원대의 최신제품이 아닐지라도, 어플리케이션을 잘 활용한다면 그에 못지않은 기능을 할 수 있을 것이다.


한계점

적외선 송신기의 한계

  • 적외선 신호를 가전 제품으로 전달할 때, 3.5mm 이어잭을 통한 출력의 제한으로 인해 좁은 방향으로 2미터 정도의 거리에서만 작동했다. 때문에 여러 가전을 하나의 송신기로 제어하기에는 한계가 있었다.

가전에 맞게 사용자가 커스터마이징이 불가능

  • 신호를 Aduino Kit을 이용해 16진수 신호로 입력 받고, 그 신호를 다시 .WAV 파일로 변환하여 어플리케이션에 저장해두는 복잡한 과정이 필요하기 때문에 사용자가 자신의 가전에 맞게 커스터마이징 할 수 없다.

실외에서 조작 시 현상확인 불가능

  • 신호를 전달하지만 신호를 전달 받은 가전제품이 다시 돌려주는 리턴이 없기 때문에, TV나 에어컨의 작동여부를 실외에서 조작할 때는 확인할 수가 없다는 한계점이 있다.

개발 후 소감

  • 서버의 구현, 적외선 신호, 음성인식에 대한 지식이 많이 부족한 상태에서 아이디어만을 가지고 프로젝트를 진행했다.
    구현하기 위해서 새로운 것을 학습하며 원리를 이해해나가는 것에 어려움도 많았지만, 결과가 나오고 나니 성취감으로 돌아왔다.

  • 적외선 신호를 이어잭으로 송출하는 방법을 떠올리는 데, 많은 시간이 들었다.

    처음에는 Android Studio에서 주어지는 라이브러리를 이용해 손쉽게 구현할 수 있을 것이라 생각했지만, 해당 라이브러리는 애초에 적외선 송신장치가 부착되어 있는 기기를 위한 것이었고,
    이어잭을 통해 보내기 위해서는 음성파일을 이용해야 한다는 생각은 들었지만 어떤 음성을 보내야 적외선 송신기가 어떤 신호를 보낼 지 알아내기 위해 힘든 과정을 겪었다.

  • 조금 더 많은 시간이 주어졌다면 송신기의 성능을 개선하기 위해 다양한 시도를 할 수 있었을 거란 아쉬움이 남는다.


프로젝트 정리 후 소감

  • 2년 전에 진행한 프로젝트를 블로그에 새롭게 정리하며 당시 프로젝트를 할 때 느꼈던 막막함, 괴로움 그리고 결국 그런 감정을 씻어낼 수 있었던 성취감을 조금이나마 재회할 수 있는 기회였다.
profile
SSAFY 7기

0개의 댓글