라즈베리파이 node.js로 웹에서 LED 제어

라즈베리파이 에서 node.js 를 활용하여 웹에서 LED 를 제어해보자. Form 태그를 이용해 POST 요청을 받아서 원하는 GPIO 를 ON/OFF 해볼 것이다.

사전준비

웹앱의 구조를 손쉽게 만들기 위해서 express 프레임웍을 활용하자.
$ sudo npm install -g express
$ sudo npm install -g express-generator

코드를 수정한 뒤 서버를 껐다켜기 귀찮으므로, nodemon도 설치하자.
$ sudo npm install -g nodemon

기본설정

설치가 끝나면 express로 프로젝트를 생성한다. --view 옵션을 빼먹는다면 html을 jade로 작성해야 해서 대략 난감할 것이다.
$ express gpio_onoff --view=ejs

$ cd gpio_onoff
$ npm install

LED를 제어하기 위해 필요한 모듈도 설치하자.
$ npm install onoff

nodemon으로 웹서버를 실행하자
$ nodemon

/views/index.ejs 수정

처음 express 프로젝트를 접하면 도대체 무슨 파일을 수정해야 html을 고칠 수 있을까 혼란스러운데, .ejs 파일이 html파일이 된다고 생각하면 된다. 즉, index.ejs가 index.html로 변환되는 것이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!DOCTYPE html>
<html>
  <head>
    <title><%= title %></title>
    <link rel='stylesheet' href='/stylesheets/style.css' />
  </head>
  <body>
    <h1><%= title %></h1>
    <p>Welcome to <%= title %></p>
<!-- 추가할 부분 (5줄) -->
    <form action="/onoff" method="POST">
    	ON:<input type="radio" name="LED" value="on">
    	OFF:<input type="radio" name="LED" value="off"></br>
    	<button type="submit">Submit</button>
    </form>
  </body>
</html>

코드를 간단히 설명하면, Submit 버튼을 누르면 localhost:3000/onoff 주소로 POST 요청이 이루어진다. LED라는 이름을 갖는 변수는 웹에서 선택한 2개의 라디오 버튼에 따라서 on이나 off값을 갖게 된다.

localhost:3000/ 에 접속하여

와 같은 그림이 나오는지 확인해보자. 아직, Submit 버튼은 제대로 동작하지 않는다.

/routes/index.js 수정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
var express = require('express');
var router = express.Router();
 
//추가할 부분 (3줄)
var bodyParser = require('body-parser'); // Form 값을 읽어오기 위해 필요
var Gpio = require('onoff').Gpio,
	gpio21 = new Gpio(21, 'out'); // GPIO 21번 사용
 
/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index', { title: 'Express' });
});
 
//추가할 부분 (8줄)
router.use(bodyParser.urlencoded({extended:true}));
router.post('/onoff', function(req, res, next){
	if (req.body.LED === "on") {
		gpio21.writeSync(1);
	} else {
		gpio21.writeSync(0);
	}
})
 
module.exports = router;

참고로 $ gpio readall 을 통해 GPIO 핀 값들을 읽었을 때 BCM 번호가 onoff 모듈이 사용하는 번호이다. 예제에서 사용한 21번 GPIO는 라즈베리파이 3 버전에서 제일 우측 하단에 위치해 있고, 이름은 GPIO.29 이다.

코드를 간단히 설명하면, /onoff 주소로 POST 요청이 오게되면, 조건문을 실행한다. Form 에서 입력받은 LED 값이 on 이라면 GPIO 21을 켜고, 입력받은 LED 값이 off라면 GPIO 21을 끄는 것이다.

다 되었다.

결과 확인

http://localhost:3000 을 새로고침하여 확인해보자.

이걸 반복하면 다음과 같은 웹페이지도 만들 수 있다.

One Reply to “라즈베리파이 node.js로 웹에서 LED 제어”

  1. 혹시 라즈베리파이 node.js에서 서보모터도 제어할 수 있나요?
    자료를 찾기가 너무 어려워서 그러는데 혹시 간단하게라도 알려주실 수 있나 해서요..

Leave a Reply

Your email address will not be published. Required fields are marked *