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 |