흰코
생각 정리소
흰코
전체 방문자
오늘
어제
  • Blog (11)
    • 넋두리 (1)
    • 개발 (9)
      • Embedded (7)
      • 개발 환경 (1)
      • Node.js (1)
    • IT (1)
      • 환경 설정 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 라즈베리 파이
  • Raspberry Pi

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
흰코

생각 정리소

라즈베리파이에서 Node.js 시리얼 통신 하기
개발/Embedded

라즈베리파이에서 Node.js 시리얼 통신 하기

2016. 9. 8. 03:11

Last Modified Date : 2016-09-08

 

Node.js 를 통하여 라즈베리파이에서 시리얼 통신 하는 방법에 대한 포스팅이다.

환경 : Windows10, Raspberry Pi 3, Raspbian Jessie Lite 2016-05-27

 

 

https://github.com/EmergingTechnologyAdvisors/node-serialport

 

serialport 모듈에 대한 깃헙이다. 모든 자료는 출처가 여기이다.

 

1. 설치

npm install serialport

를 통해 설치했는데 아래와 같이 오류가 났다.

(오류가 났지만 정상적으로 동작이 되는 것 같다.)

 

인스톨을 하는데 ~/ 위치에서 실행 하였더니, 해당 폴더를 기준으로 node_modules 라는 폴더가 생성되었다.

내가 Node.js 를 제대로 배우지 않아 이것이 중요한 것인지 모르겠으나, 알아두어야 할 것 같아 써두었다.

테스트 결과 ~/workspace 를 만들어서 해당 폴더에서 .js 파일을 실행 해 보았는데, 정상적으로 실행이 된다.

아무래도 폴더의 위치와는 상관이 없는 것 같다.

 

2. 테스트

제대로 동작이 되는지 확인을 해 보자.

먼저 아두이노에 아래 코드를 업로드하자

int in_data =0;
void setup(){
	Serial.begin(9600);
}
void loop(){ 
	if(Serial.available()){
		in_data = Serial.parseInt();
	}
	if(in_data!=0){
		Serial.println(++in_data);
		in_data=0;
	}
	delay(500);
}

이 코드는 시리얼 통신으로 들어온 값에 +1을 시켜서 다시 시리얼에 보내는 간단한 코드이다.

입력과 출력을 동시에 해 볼 수 있는 테스트용 코드이다.

딜레이가 너무 길다고 느껴지고 속도가 어느정도 나오는지 보려면 딜레이 부분을 주석처리해 주면 된다.

 

아두이노를 파이에 연결한다.

파이에 test.js 파일을 만들어주자 코드는 아래와 같다.

int in_data = 0;
void setup()
{
    Serial.begin(9600);
}

void loop()
{
    if (Serial.available())
    {
        in_data = Serial.parseInt();
    }
    if (in_data != 0)
    {
        Serial.println(++in_data);
        in_data = 0;
    }
    delay(500);
}

여기서 ttyACM0 부분은 자신의 아두이노 시리얼포트 번호에 맞게 바꿔주자.

(현재 나는 라즈베리파이 + 아두이노의 시리얼 통신 의 1번 방법으로 연결하였다)

이 코드는 시리얼 통신을 연결하고, 첫 연결에 한해서 1이라는 숫자를 보낸다.

그 뒤는 받은 값을 그대로 다시 시리얼로 보내는 코드이다.

 

두 코드를 합치면

파이가 1을 보냄 -> 아두이노가 1을 받고 2를 보냄 -> 파이가 2를 받고 2를 보냄 -> 아두이노가 2를 받고 3을 보냄 --(반복)

이 된다.

실행해보자.

 

1을 보낸뒤부터 2~21 까지 정상적으로 동작하는것이 보인다.

(루프를 빠져나오려면 Ctrl + C 를 누른다)

 

 

 

3. 2개의 아두이노와 통신

내가 하려는 프로젝트는 하나의 파이에 2개의 아두이노와 통신을 할 예정이다.

따라서 2개의 파이와는 어떻게 통신을 할 지 궁금하여 테스트 해 보게 되었다.

아두이노쪽 코드는 2번의 코드와 같다.

다만 서버쪽 node 코드만 조금 수정하여 2개로 나누어 보았다.

var SerialPort = require('serialport');
var port1 = new SerialPort('/dev/ttyACM0', {baudrate : 9600, parser : SerialPort.parsers.readline('\n')});
var port2 = new SerialPort('/dev/ttyACM1', {baudrate : 9600, parser : SerialPort.parsers.readline('\n')});
port1.on('open',
    function() {
        port1.write('1',
            function(err) {
                if (err) {
                    return console.log('Error on write: ', err.message);
                }
            console.log('1 written to port1');
        });
    });
port1.on('data',
    function(data) {
        console.log('Read and Send Data to 2 : ' + data);
        port2.write(data);
    });
port2.on('data',
    function(data) {
        console.log('Read and Send Data to 1 : ' + data);
        port1.write(data);
    });

가장 처음에 포트1로 보낸다.

1에서 읽은값은 그대로 2로 보내고, 2에서 읽은값은 그대로 1로 보낸다.

 

아주 정상적으로 작동하는 것을 볼 수 있다.

다만 아두이노 2개가 딜레이가 서로 달라 주고 받는 타이밍이 정확하진 않지만 테스트하기 위함일 뿐이므로 상관 없다.

 

저작자표시 (새창열림)

'개발 > Embedded' 카테고리의 다른 글

라즈베리파이 Node.js 최신버전 설치  (0) 2016.09.08
포토 커플러 SG-2BC 올바른 사용법  (1) 2016.08.09
Fritzing 설치와 사용법  (0) 2016.08.09
라즈베리파이 + 아두이노의 시리얼 통신  (4) 2016.07.27
라즈베리파이 OS 설치부터 기본 설정까지  (4) 2016.07.19
    '개발/Embedded' 카테고리의 다른 글
    • 라즈베리파이 Node.js 최신버전 설치
    • 포토 커플러 SG-2BC 올바른 사용법
    • Fritzing 설치와 사용법
    • 라즈베리파이 + 아두이노의 시리얼 통신
    흰코
    흰코

    티스토리툴바