라즈베리파이와 아두이노를 활용한 전력 제어

라즈베리파이와 아두이노를 활용한 인터넷 릴레이(전력)제어

Posted by 최일규 on 2017. 12. 24

라즈베리파이와 아두이노를 활용한 인터넷 릴레이(전력)제어

웹으로 아두이노를 컨트롤하는 방법은 여러가지 방법이 있는것으로 알고 있습니다.

아두이노 우노R3와 시리얼 와이파이 모듈을 (ESP8266) 활용하여 직접 아두이노에 마이크로 웹서버를 구축하고 컨트롤하는 방법이 있을수 있겠구요.

라즈베리파이와 아두이노를 연결해서 라즈베리파이에 웹서버를 구축하고, 시리얼로 아두이노를 제어하는 방법도 있을 수 있겠네요.

저는 개인적으로 라즈베리파이에 리눅스를 설치하고 웹을 구축하는 방법이 익숙해서

그런지 이 방법을 선호합니다.

 

하드웨어 연결은 너무나 간단합니다. (참고로 릴레이는 5V용입니다.)

릴레이 아두이노
VCC 5V
GND GND
IN ~10

 

 

그리고,

일단, 아두이노 스케치 프로그램은 다음과 같이 작성합니다.

위에서 릴레이 IN과 아두이노~10핀 연결했기 때문에 스케치 코드에서도 pinMode는 10번으로 셋팅합니다. 

시리얼로 문자를 수신받아, "1" 이면 ON하고 "0" 이면 OFF합니다.

void setup() {
  Serial.begin(9600);
  pinMode(10, OUTPUT);
}

void loop() {
  String input = "";

  while (Serial.available() > 0) {
    input += (char) Serial.read();
  }

  Serial.println(input);
    
  if(input == "1") {
    digitalWrite(10, HIGH);
  } else if(input == "0") {
    digitalWrite(10, LOW);
  }
}

 

아두이노는 잘 몰라 인터넷에서 여러가지 방법을 찾아보다가 위와 같은 코드로 정리가 됐네요 ^^

 

웹 화면은 다음과 같이 제작합니다. 단순히 ON, OFF 하는 버튼을 배치합니다.

디자인은 HTML로 단순하게 제작하기도 하지만, 좀 세련된 디자인을 원하시면 부트스트랩 (https://getbootstrap.com)을 이용하면 간단히 제작이 가능합니다.

화면을 디자인할 코드고 좀 장황하지만, 부트스트랩을 이용한거 외 실제 동작은 하단 Ajax코드입니다.

Ajax코드에서는 버튼을 누를때, 서버로 ON 또는 OFF로 값을 넘기는 작업입니다.

<!doctype html>
<html>
<head>
    <meta name="viewport" content="width=device-width, user-scalable=no">
    <title><%= title%></title>

    <link rel='stylesheet' href='/stylesheets/style.css' />

    <script src="https://code.jquery.com/jquery-3.2.1.min.js" integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4=" crossorigin="anonymous"></script>

    <!-- 합쳐지고 최소화된 최신 CSS -->
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">

    <!-- 부가적인 테마 -->
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap-theme.min.css">

    <!-- 합쳐지고 최소화된 최신 자바스크립트 -->
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/js/bootstrap.min.js"></script>

</head>
<body>
<div class="row">
    <div class="col-sm-5">
        <button type="button" id="on" class="btn btn-danger" style="width:49%;height:120px;font-size:30px">ON</button>
        <button type="button" id="off" class="btn btn-success" style="width:49%;height:120px;font-size:30px">OFF</button>
    </div>
</div>
<script>
    $(function() {

        function remoteOnOff(signal) {
            $.ajax({
                url: '/remote/' + signal,
                dataType: 'text',
                type: 'GET',
                contentType: 'application/x-www-form-urlencoded',
                data: "",
                success: function (data, textStatus, jQxhr) {
                    console.log(data);
                },
                error: function (jqXhr, textStatus, errorThrown) {
                    console.log(errorThrown);
                }
            });
        }

        $('#on').click(function(e) {
            remoteOnOff('on');
            e.preventDefault();

        });

        $('#off').click(function(e) {
            remoteOnOff('off');
            e.preventDefault();
        });

    });
</script>
</body>
</html>

 

아래 서버코드에서는 화면으로 부터 수신된 값을 받아, 시리얼로 명령을 내리는 부분입니다.

라즈베리파이 또는 맥북에서 Node.js  Express에서 시리얼 포트를 열고 "1"과 "0"으로 아두이노와 연결된 시리얼 포트로 데이터를 전송하는 코드입니다. 

const express = require('express');
const SerialPort = require('serialport');
const router = express.Router();

//라즈베리파이 시리얼 포트
const port = new SerialPort('/dev/ttyACM0', {
    baudRate: 9600
});

/**
 * 화면 렌더링
 */
router.get('/remote', function(req, res, next) {

    let options = {
        title : '웹 리모트컨트롤러'
    };
    res.render('remote', options);
});

/**
 * ON/OFF 액션
 */
router.get('/remote/:id', function(req, res, next) {
    let val = req.params.id;

    if(val === 'on') {
        port.write('1');
    } else if(val === 'off') {
        port.write('0');
    } else {
        console.error('error');
    }

    res.status(200).json({status: 1, message: 'success'});
});

module.exports = router;

 

이렇게 간단한 코드로 아두이노를 제어할 수 있다는 것이 저도 좀 놀랍구요.

원격에서 전력을 제어하는 주제는 흥미롭고  활용분야가 높을거라 생각됩니다.

결과는 동영상으로 촬영해 봤습니다.

 

앞으로 해야할 일은 릴레이에 220V를 연결해 직접 전원을 켰다 끄는 작업이네요

찌릿찌릿한 전기맛을 보지 않도록 기도해야겠군요 ㅎㅎ