Raspberry Pi/Power on off, Web

IoT, Power ON, OFF example

Soul-Learner 2016. 6. 26. 00:00

라즈베리파이, 아두이노, 디지털 릴레이를 사용한 원격전원 ON/OFF 제어


사물인터넷(IoT), 전원원격제어를 만들어 보자


테스트 환경

라즈베리파이 B+, Jessie, Node.js

Arduino UNO

Digital Relay ( NER-11340 )


Web --(HTTP)--> 라즈베리파이(Node.js) --(USB Serial)--> Arduino -(GPIO)--> NER-11340 Digital Relay --(Power Cable)--> 220V Lamp



                                                         

Arduino UNO


NER-11340 디지털 릴레이

상세정보 : http://www.neromart.co.kr/goods/view?no=11340

2개의 릴레이를 장착한 릴레이 모듈


사용법

전원: VCC, GND

제어: IN1(1번 릴레이이 신호입력), IN2(2번 릴레이 신호입력)

220V 출력: K1(1번 릴레이 220V 출력), K2(2번 릴레이 220V 출력)

NC : Normal Close (입력신호가 없을 때 연결되는 접점)

NO : NOrmal Open(입력신호가 없을 때는 열려(Open)있고 신호가 있을 때 닫히는(Close) 접점


COM 단자에 220V 입력선을 연결하고 1번 릴레이 입력단자(IN1)에 5V 입력신호를 가하면 NO 단자를 통해 220V가 출력된다

이때 IN1 단자에 입력신호를 가하지 않으면 NC 단자를 통해 220V가 출력된다


1. 제품소개


이 제품은 ARDUINO/AVR/PIC/ARM/PLC 등으로 릴레이 2개를 독립적으로 제어할 수 있습니다.
릴레이가 켜질 때 상태를 표시하는 ON LED를 내장하고 있습니다.

포토커플러를 사용하여 릴레이 구동용 전원과 제어신호용 전원이 분리 설계되어 있습니다.
(절연이 안되어있으면 릴레이는 코일로 구성되어 있기 때문에 역기전력에 의해 고장의 위험이 있습니다.)
입력 신호는 3.3V ~ 5V 가능하여 릴레이를 ON/OFF 할 수 있습니다.
Low Level(0V) 에서 릴레이가 ON 동작합니다. High Level(5V) 에서 릴레이는 OFF 동작합니다.



2. 상세사양


◆ 릴레이 동작전압 : 5V

◆ 릴레이 갯수 : 2 채널

◆ 릴레이 출력 사양 (한국릴레이 HR702NHDC05V)        

    AC 출력 : 10A 120V / 6A 250V

    DC 출력 : 10A 24V

◆ 릴레이 신호 입력

    VCC : 5V 전원 입력

    GND : 0V 전원 입력

    IN1 : 1채널 신호 입력( Low 0V 일 때 RELAY ON, High 5V 일 때 RELAY OFF )

    IN2 : 2채널 신호 입력( Low 0V 일 때 RELAY ON, High 5V 일 때 RELAY OFF )

◆ 릴레이 부하 출력

    COM : 공통

    NO : 평상시 단선(Normal Open)

    NC : 평상시 단락(Normal Close)

◆ 작동 온도 : (섭씨) -40도 ~ +85도

◆ 모듈 크기 : 41mm x 63mm

◆ 모듈 무게 : 대략 33g


3. 핀아웃(Pin Out)


아두이노에서 NER-11340디지털 릴레이를 제어하는 예제 코드

아두이노 3번 핀을 NER-11340의 IN1에, 4번 핀을 IN2에 연결하고 테스트함

// # Arduino Sample Code

// # www.neromart.co.kr

// #

// # Description:

// # The sketch for using the RELAY-M1(CH2)-5V

// # 

// # Connection:

// #        IN1 pin  -> Digital pin 3
// #        IN2 pin  -> Digital pin 4

// #

 

int Relay1 = 3;

int Relay2 = 4;

  

void setup()

{

  pinMode(Relay1, OUTPUT);     //Set Pin3 as output

  pinMode(Relay2, OUTPUT);     //Set Pin4 as output

}

void loop()

{

  digitalWrite(Relay1, HIGH);   //Turn off relay

  digitalWrite(Relay2, HIGH);   //Turn off relay

  delay(2000);

  digitalWrite(Relay1, LOW);    //Turn on relay

  digitalWrite(Relay2, LOW);    //Turn on relay

  delay(2000);

}



라즈베리파이에서 실행될 웹서버 프로그램(web_node_serial.js, power_control.html)

웹브라저에서 아래의 파일을 요청하면 GET 방식일 경우에는 power_control.html 이 보여지고 power_control.html 화면에서 버튼을 누르면 POST 방식 요청이 아래의 프로그램으로 전달되는데 이때는 웹브라우저에서 'ON' 혹은 'OFF' 문자열이 전달되므로 그 문자열을 Arduino 에게 전달해주는 역할을 한다. 

/home/pi/www/web_node_serial.js

var http = require('http');
var fs = require('fs');
var formidable = require('formidable');
var util = require('util');

var server = http.createServer(

	function(req, res) {
		if(req.method.toLowerCase()=='get') {
			displayForm(res);
		}else if(req.method.toLowerCase()=='post'){
			processAllFieldsOfTheForm(req, res);
		}
	}
);

function displayForm(res) 
{
	console.log('GET');
	fs.readFile('power_control.html', function(err, data){
		res.writeHead(200, {
			'Content-Type':'text/html',
			'Content-Length':data.length
		});
		res.write(data);
	});
}


function processAllFieldsOfTheForm(req, res) 
{
	console.log('POST');
	var form = new formidable.IncomingForm();
	form.parse(req, function(err, fields, files) {
		res.writeHead(200, {
			'Content-Type':'text/plain'
		});

		serialSend(fields.msg, res);
		console.log("Form Received:"+fields.msg);

		res.write('Received from Webbrowser:'+fields.msg+'\n\n');
	});
}

server.listen(8088);
console.log('Server running at port 8088');

function serialSend(web_data, res) {

	var SerialPort = require("serialport").SerialPort;
	serialPort = new SerialPort("/dev/ttyUSB0",
	{ 	baudrate: 9600,
		dataBits:8,
		parity:'none',
		stopBits: 1,
		flowControl: false
	});

	serialPort.on("open", function() {
	
		console.log("open");
	
		serialPort.on("data", function(data) {
			res.write('Received from Arduino:'+data+'\n\n');
			res.end();
			console.log('Received from Arduino:' + data+'\n');
		});
	
		serialPort.write(web_data, function(err, results){
			console.log('err: ' + err);
			console.log('results : '+ results);
		});
		/*
		serialPort.close(function(err){
			console.log('port closed', err);
		});
		*/
		serialPort.on("error", function(err) {
			console.log('error : '+ err);
		});
	
		serialPort.on("close", function(){
			console.log("closed");
		});
	});
}


/home/pi/www/power_control.html

웹브라우저를 통해 라즈베리파이에서 대기중인 web_node_serial.js 에 GET 방식으로 접속하면 아래의 화면이 보여진다

http://라즈베리파이의 IP:아래 프로그램의 포트번호/web_node_serial.js 으로 접속하면 된다. 실행되면 웹브라우저에 버튼(ON/OFF)이 한개 보여진다

<!doctype html>
<html>
<head>
<meta charset='utf-8'>
<title> Power ON/OFF </title>
<style type="text/css">
	#svrMsg { border:1px solid gray;}
</style>
<script src="https://code.jquery.com/jquery-2.2.4.min.js"
	integrity="sha256-BbhdlvQf/xTY9gja0Dq3HiwQF8LaCRTXxZKRutelT44="
	crossorigin="anonymous"></script>
<script>
$(function(){
	//alert('jquery ready!');
});

function ajaxRequest() {
	var param = {};
	var cmd = $('button#switch').text();
	param.msg = cmd;
	$.ajax(
	{	url:'web_node_serial.js',
	 	type:'post',
		data:param,
		dataType:'text',
		success:function(res) {
			$('div#svrMsg').text(res);
			if(cmd=='ON') {
				$('button#switch').text('OFF');
			}else{
				$('button#switch').text('ON');
			}
		},
		error:function(xhr, status, err){
			$('div#svrMsg').text(err);
		}
	});
}
</script>
</head>

<body>
<p>
 Power ON/OFF
<p>
<label for="svrMsg">Server Msg</label>
<div id='svrMsg'></div>
<button id='switch' type="button" onclick='ajaxRequest();'>ON</button>
</body>
</html>


Arduino 에서 실행될 프로그램

라즈베리파이와 시리얼 통신을 하여 웹브라우저에서 전달되는 ON/OFF 문자열에 따라 3번 핀으로 디지털 신호 HIGH/LOW 출력하여 NER-11340 디지털 릴레이를 제어하는 기능을 한다. 라즈베리파이에 아두이노 개발환경을 설치하고 Arduino IDE에서 아래의 코드를 작성하여 아두이노에 업로드하면 바로 작동하기 시작한다. 'ON' 문자열이 전달되면 3번 핀으로 HIGH 신호를 출력하므로 3번핀에 연결된 NER-11340 디지털 릴레이 모듈의 1번 릴레이 입력신호로 전달되어 1번 릴레이는 NO 단자로 220V를 출력하고 NC 단자는 열려서 0V가 된다

/* Digital Relay ( NER-11340) Control
  Arduino PIN 3 --> NER-11340 Digital Relay PIN IN1
*/
String msg = "";
void setup()
{
 pinMode(3, OUTPUT);	// for Digital Relay 
 Serial.begin(9600); 
 //msg = "OFF";
}

void loop()
{

  if(msg=="ON") {
    digitalWrite(3, HIGH);
  }else{
    digitalWrite(3, LOW);
  }

  if(Serial.available())
  {
    msg = Serial.readString();
    Serial.println(msg);
  }
}


작동 테스트

라즈베리파이에서 다음 명령으로 Node.js 코드인 web_node_serial.js 을 실행한다.

$ cd /home/pi/www

$ sudo node web_node_serial.js


웹브라우저에서 http://라즈베리파이의 IP:포트번호/web_node_serial.js 으로 접속하여 ON/OFF 버튼을 눌렀을 때 220V 백열전구가 켜지거나 꺼지면 성공이다