라즈베리파이에서 Node.js를 이용하여 아두이노와 시리얼 통신하기
라즈베리파이와 아두이노 사이를 USB로 연결하면 시리얼통신이 가능하다. 아두이노를 구입하면 포함된 USB 케이블을 사용하면 되므로 별도의 준비물은 필요없다. 여기서는 라즈베리파이에서 Node.js를 사용하여 시리얼통신 프로그램을 작성하려고 한다.
테스트 환경
라즈베리파이에 아두이노 개발환경 설치
라즈베리파이에 Node.js 및 SerialPort 피키지 설치
wget http://node-arm.herokuapp.com/node_latest_armhf.deb
dpkg -i node_latest_armhf.deb
npm install -g node-gyp
sudo npm install --unsafe-perm serialport
아두이노가 연결된 라즈베리파이 USB 포트명 확인
$ dmesg | tail
[ 135.232063] usb 1-1.5: New USB device found, idVendor=1a86, idProduct=7523
[ 135.232103] usb 1-1.5: New USB device strings: Mfr=0, Product=2, SerialNumber=0
[ 135.232122] usb 1-1.5: Product: USB2.0-Serial
[ 135.304746] usbcore: registered new interface driver usbserial
[ 135.304919] usbcore: registered new interface driver usbserial_generic
[ 135.305078] usbserial: USB Serial support registered for generic
[ 135.315865] usbcore: registered new interface driver ch341
[ 135.316041] usbserial: USB Serial support registered for ch341-uart
[ 135.316159] ch341 1-1.5:1.0: ch341-uart converter detected
[ 135.346394] usb 1-1.5: ch341-uart converter now attached to ttyUSB0
라즈베리파이 측의 Nodejs 시리얼 통신 코드
아래의 코드를 작성하여 라즈베리파이 /home/pi/node_serial.js 등으로 저장한다
VNC Viewer 에서 File Manager를 이용하여 디렉토리를 선택하고 빈 파일을 생성한 후에 파일 이름 위에서 마우스 우측을 누르고 Text Editor를 선택하면 윈도우의 메모장과 같은 기능을 사용하여 소스파일을 작성할 수 있다
var SerialPort = require("serialport").SerialPort
var 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) { // 아두이노로부터 전달된 데이터
console.log('data received: ' + data);
});
serialPort.write("Hello from Raspberry Pi\n", function(err, results) {
console.log('err ' + err);
console.log('results ' + results); //전송한 바이트 수
});
setInterval( function() { // 2초마다 아두이노에게 문자열을 전송하는 예
serialPort.write('Hello');
}, 2000);
});
참고로, 시리얼포트의 이벤트핸들러 함수에는 다음과 같은 것들이 있다
serialPort.on('open', showPortOpen);
serialPort.on('data', sendSerialData);
serialPort.on('close', showPortClose);
serialPort.on('error', showError);
위의 코드를 실행하려면 파일이 저장된 디렉토리로 이동하여 다음과 같이 입력한다
아래의 결과 화면처럼 일단 포트가 열렸다면 성공이다
$ node node_serial.js
open
아두이노 측에서 대응하는 시리얼 통신 코드
라즈베리파이로부터 받은 문자열을 그대로 되돌려 전송하는 에코우 기능
void setup()
{
Serial.begin(9600);
}
String msg = "";
void loop()
{
if(Serial.available())
{
msg = Serial.readString();
Serial.println(msg);
}
}
라즈베리파이에서 시리얼통신 프로그램(/home/pi/node_serial.js) 실행
통신 양단(라즈베리파이, 아두이노)의 코드가 완성되었으므로 아두이노에 프로그램을 업로드하고, 라즈베리파이에서 다음과 같이 명령하면 시리얼 라즈베리파이 터미널에서 통신의 결과를 확인할 수 있다
$ node node_serial.js
open
data received: Hello
data received: Hello
data received: Hello
data received: Hello