심심해서 하는 블로그 :: [NodeJS] 시리얼 통신으로 아두이노 센서 값 받기

1. 아두이노 - 센서 조립


요새 설계과목에 제출할 과제로 스마트 스위치를 만들고 있어요. 라즈베리파이2랑 아두이노, 조도센서를 이용해서 날이 너무 밝으면 불을 꺼주고, 날이 너무 어두우면 불을 켜주는 기능을 만들고 있는데 그러려면 아두이노에서 센서 값을 받은 다음 라즈베리파이로 전송하는 과정이 설계상 필요하더라고요. 라즈베리파이2가 웹서버로 NodeJS를 사용하고 있는데 설마.. 시리얼 통신 패키지도 있나 했더니.. 정말 있네요.. node.. 당신은 도대체..


개발 보드 : 아두이노 나노, 조도 센서, 라즈베리파이2

OS : 라즈베리안 OS

언어 : NodeJS

(굳이 위의 개발보드와 OS가 아니더라도 가능합니다. 저도 Window에서 Test 후 파이로 옮겨서 수행했습니다.)



우선 조도 센서를 아두이노와 연결해요. 조도 센서는 TEMT6000 센서를 사용했습니다.

VCC - 5V, GND - GND, OUT - ANALOG 중 하나에 점핑 선을 연결해줍니다. 

아두이노 나노는 A0, A1 등등 A로 시작하는 곳이 ANALOG에요.

다른 조도 센서를 사용하시는 분이라면 제품 번호를 확인하시고 연결하세요. 



그리고 아두이노를 라즈베리파이에 USB 선을 이용해서 연결해줍니다. 그 후 SSH로 접속한 후  dmesg | tail 명령어를 입력해 USB 포트 번호를 확인합니다. 저는 ttyUSB0에 아두이노 나노가 있다고 하네요. 



Windows 환경이나 리눅스 쉘 커맨드에 익숙하지 않다면 연결 후 아두이노 스케치를 실행해서 USB 포트 정보를 확인할 수도 있습니다. 마찬가지로 ttyUSB0에 연결되어 있음을 알 수 있죠. 이 정보는 이어서 소개할 serialport 패키지를 사용하는데 필요하니까 반드시 알아 두시는 게 좋아요!!


2. serialport 패키지 사용하기


serialport는 웹서버로 주로 사용하는 NodeJS에서 센서 값을 읽고 기기를 제어할 수 있게 하는 패키지에요!!

우선 nodeJS 프로젝트를 만든 후 해당 경로에서 리눅스 명령어 쉘(Windows에서는 cmd) 아래의 명령어로 serialport 패키지를 설치합니다. 


npm install serialport --save


설치가 완료되면 자바 스크립트 파일을 하나 만든 후 아래와 같이 코드를 작성해 봅시다.


1
2
3
4
5
6
7
8
9
10
11
var SerialPort = require('serialport'),
      portName = '/dev/ttyUSB0',
      sp = new SerialPort(portName),
      sensorVal = 0;
 
sp.on('open'function(){
    console.log('Serial Port OPEN');
    sp.on('data'function(data){
        console.log("Light Sensor Value : ", data[0]);
});
}); 
cs


시리얼 포트를 통해 아두이노에서 송신된 데이터를 수신하는 코드에요. 성공적으로 수신하면 화면에서 조도 센서 값을 읽을 수가 있어요. 그리고 이제 아두이노 스케치를 이용해서 아두이노에서 시리얼 통신으로 센서 값을 보내는 코드를 작성해 봅시다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
void setup()
{
  // 전송 속도를 설정해줍니다.     
    Serial.begin(9600); 
}
void loop()
{
    int val;
 
    // 조도 센서의 측정된 값을 읽어옵니다. 
    // 센서에 연결한 아날로그 포트 번호를 매개변수로 지정합니다.
    // 저는 A1에 연결하였으므로 1번을 사용했습니다.
    val = analogRead(1);         
    
    // 조건문은 무시하셔도 됩니다. 
    // Serial.write(val)을 통해 시리얼 통신을 한다는 점만 기억하시면 됩니다.
    if(val > 40)
        Serial.write(val);    
    else if(val < 5)
        Serial.write(val);    
     
    delay(1000);
}
 
 
cs



센서 값을 시리얼 통신을 통해서 성공적으로 전송받을 수 있는 것을 확인하였습니다. 다시 말씀드리지만 이것은 NodeJS를 이용해서 작성된 코드입니다. 물론 NodeJS 외에도 다른 언어를 이용해서 라즈베리파이와 아두이노 간의 시리얼 통신이 가능합니다. 


도움이 되셨나요?? 아래에 하트 버튼은 저에게 큰 힘이 됩니다. 즐거운 하루되세요!! 

,