TOPIC : Node-RED 실습
작성일:
|
2015년
4월 4일
|
|
작성자:
|
최의신
|
1. 개요
이 문서는 두 가지의 실습을 진행한다.
첫 번째로 Node-RED에서 지원하는 하드웨어인
Arduino 보드를 연결하여 보드에 연결된 LED를 제어한다.
두 번째로 초음파 센서를 연결하여 장애물과의 거리에 따라 경고 LED를 켜는 실습을 진행한다.
2. 환경
1) 테스트
환경
l 운영체제
: Windows 7
l Node.js : 0.10.36
l Node-RED : 0.10.4
l Arduino mini (Atmega328P)
l USB To TTL UART
2)
Node.js 설치
다음의 링크에서 설치 파일을 받아 설치 한다.
http://nodejs.org/dist/v0.10.36/node-v0.10.36-x86.msi
2) Node-RED
설치 준비
일반적인 리눅스 환경에는 컴파일러가 설치되어 있어 별도의 컴파일러 설치가 필요 없다.
하지만 윈도우의 경우 컴파일러가 설치되지 않은 경우가 많기 때문에 설치가 필요 하다.
다음의 링크에서 설치 파일을 다운로드(setup.exe) 하고 실행
한다.
<Microsoft .NET Framework 2.0 SDK(소프트웨어
개발 키트)(x86)>
설치가 완료되면 다음의 경로를 시스템 환경변수 “PATH”에 추가한다.
C:\Program Files\Microsoft Visual Studio
8\VC\vcpackages
3)
Node-RED 설치
다음의 링크에서 0.10.4.zip 파일을 다운로드 한다.
다운로드 파일을 C 드라이브 루트에 압축해제 한다.
C:\node-red-0.10.4
CMD 창에서
C:\node-red-0.10.4 폴더로 이동 후 다음 명령어를 실행 한다.
> npm install -g node-red
> npm install --production
> npm install redis
> npm install mongodb
> npm install arduino-firmata
4)
Node-RED 실행 및 확인
Node-RED의 실행은 C:\node-red-0.10.4
폴더에서 node red.js를 실행한다.
그리고 브라우저에서 http://localhost:1880
주소로 접속하면 다음과 같은 화면이 나타난다.
3. Arduino 설정
Node-RED는 시리얼 포트를 이용해서 Arduino와 연결한다. 이렇게 연결된 Node-RED와 Arduino는 “Firmata”라는
프로토콜을 이용하여 통신을 한다.
Node-RED는 앞 단계에서 이미 “arduino-firmata” 라는 모듈을 설치 하였으므로, Arduino에만
이 프로토콜을 설치하면 된다.
1)
USB To TTL UART 설정
UART는 데이터 전송 속도를
115200으로 설정한다.
2)
Arduino IDE 설치
Arduino에 “Firmata”를
설치하기 위해서는 Arduino IDE가 필요하며, 다음의
링크에서 다운로드 할 수 있다.
http://www.arduino.cc/
여기서는 zip 파일을 다운로드 하여 C 드라이브 루트에 압축해제 한다.
C:\arduino-1.6.3
3) Firmata
설치 및 Arduino 다운로드
Firmata_v2.3.6.zip 파일의 Firmata 폴더를 Arduino IDE가 설치된 libraries 폴더로 복사한다.
하지만 Arduino 1.6.3에는 이미 이 라이브러리가 포함되어
있다.
Arduino IDE를 실행하고 Firmata
예제를 open 한다.
파일 > 예제 >
Firmata > StandardFirmata
도구 메뉴에서 Serial Port와 사용하는 Arduino 보드를 선택하고 파일 메뉴의 “업로드”를 선택한다.
컴파일 및 Arduino 업로드가 완료되면 보드에 있는 LED가 네 번 점멸된다.
4. Arduino 테스트
Node-RED
화면에서
Import 기능을 이용하여 아래의 코드를 입력한다.
CODE
[{"id":"d7663aaf.47194","type":"arduino-board","device":"COM3"},{"id":"40544aaf.c8b21c","type":"arduino
out","name":"","pin":"13","state":"OUTPUT","arduino":"d7663aaf.47194","x":717,"y":209,"z":"e0dac3ca.cf7f6","wires":[]},{"id":"7e8cf686.5f952","type":"inject","name":"tick","topic":"","payload":"","payloadType":"date","repeat":"0.1","crontab":"","once":false,"x":233.00000762939453,"y":193,"z":"e0dac3ca.cf7f6","wires":[["59bcd848.b60f7"]]},{"id":"59bcd848.b60f7","type":"function","name":"Toggle
output on input","func":"\n// initialise level as a
context variable if currently undefined \n// (context variables persist
between calls to the function)\ncontext.level = context.level || false;\n\n//
if it's a 0 make it a 1 else make it a 0...\ncontext.level =
!context.level;\n\n// set the payload to the level and return\nmsg.payload =
context.level;\nreturn msg;","outputs":1,"x":432,"y":203,"z":"e0dac3ca.cf7f6","wires":[["40544aaf.c8b21c"]]}]
|
COM3는 앞의 UART 설정에서
할당된 COM 포트로 변경한다.
Import가 완료되면 다음과 같은 Flow가 나타난다.
우측 상단의 Deploy 버튼을 눌러 Flow를 배포한다. 하지만 Arduino가
연결되지 않고 Node-RED 로그에는 COM3 포트를 찾을
수 없다는 메시지가 나타난다.
Node-RED를 재시작 하면 Arduino가
연결된 것을 확인할 수 있다. 그리고 Arduino 보드의
LED는 계속 점멸한다.
5. 초음파 센서를 이용한
충돌 감지
물체와의
거리를 측정하는 센서로 HC-SR04라는 제품이 있다. 이것은
초음파를 발생시켜 반사되어 돌아오는 음파를 감지하여 거리를 계산한다.
이번
실습은 초음파 센서에서 감지된 물체와의 거리가 50cm 이하인 경우 앞에서 실습한 Arduino 보드의 10번 pin으로
경고를 나타내는 LED가 켜지도록 Flow를 설계한다.
1) 준비물
l USB
To TTL UART : 2개
l 초음파 센서 (HC-SR04)
: 1개
l ATtiny85
: 1개
2) 초음파 센서 인터페이스
앞의 실습에서 Firmata 프로토콜을 올린 Arduino mini는 초음파 센서를 처리할 수 없다.
왜냐하면 펄스를 측정하기 위해 사용하는 delayMicroseconds 함수를
사용할 수 없기 때문이다.
그래서 작은 크기의 ATtiny85에 센서를 연결하고 0.5초 주기로 거리를 측정하여 시리얼 포트로 전송하도록 하였다.
3)
Arduino 프로그램
#include <SoftwareSerial.h>
const int echoPin = 1;
// Echo 입력 Pin
const int trigPin = 2;
// Trigger 출력 Pin
const int RX_PIN
= 3; // 시리얼 포트
const int TX_PIN
= 4; // 시리얼 포트
SoftwareSerial SOFT_SERIAL(RX_PIN, TX_PIN);
void setup()
{
SOFT_SERIAL.begin(9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
}
void loop()
{
long dis = getDistance();
SOFT_SERIAL.println(dis, DEC); // 측정 결과를 시리얼 포트로
전송한다.
delay(500);
// 500 msec
}
/*
* 초음파 센서로 장애물의 거리를 측정한다.
*/
long getDistance()
{
long duration, distance;
/* 측정
시작 펄스를 생성한다 */
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
/* 펄스
폭을 측정한다. */
duration = pulseIn(echoPin, HIGH);
/* 거리를
계산한다. ( cm ) */
distance = duration/58.2;
return distance;
}
|
4)
Flow
l 초음파 센서에서
0.5초 주기로 보내오는 사물과의 거리를 Serial port로
수신한다.
l 수신데 데이터의
거리 값이 50 cm 이하 이면 true를 전달하고 아니면
false를 전달한다.
이때 전달되는 목적지는 Firmata 프로토콜을 사용하는 Arduino mini 이다.
이때 전달되는 목적지는 Firmata 프로토콜을 사용하는 Arduino mini 이다.
l 디버깅을
위해 각 노드의 output을 debug 노드와 연결한다.
l 초음파 센서 (serial)
l 장애물 판단
(function)
l Yellow LED (arduino)
5) Import 코드 및 구현
[{"id":"d7663aaf.47194","type":"arduino-board","device":"COM6"},{"id":"c055905b.08fac","type":"serial-port","serialport":"COM7","serialbaud":"9600","databits":"8","parity":"none","stopbits":"1","newline":"\\n","bin":"false","out":"char","addchar":"on"},{"id":"5725fbd1.b9a3d4","type":"serial
in","name":"초음파 센서","serial":"c055905b.08fac","x":227,"y":427,"z":"e0dac3ca.cf7f6","wires":[["79a3c819.5a83e8","e92411a2.3b191"]]},{"id":"4e358141.17c578","type":"debug","name":"","active":false,"console":"false","complete":"false","x":741,"y":510,"z":"e0dac3ca.cf7f6","wires":[]},{"id":"79a3c819.5a83e8","type":"function","name":"장애물
판단","func":"if (msg.payload <
50)\n\tmsg.payload = true;\nelse\n\tmsg.payload = false;\n\nreturn
msg;\n\n","outputs":1,"x":466,"y":428,"z":"e0dac3ca.cf7f6","wires":[["b5f00071.702d8","4e358141.17c578"]]},{"id":"b5f00071.702d8","type":"arduino
out","name":"Yellow
LED","pin":"10","state":"OUTPUT","arduino":"d7663aaf.47194","x":749,"y":348,"z":"e0dac3ca.cf7f6","wires":[]},{"id":"e92411a2.3b191","type":"debug","name":"초음파
검출 거리","active":true,"console":"false","complete":"payload","x":470,"y":511,"z":"e0dac3ca.cf7f6","wires":[]}]
|
[참고자료]
[1] Arduino mini
[2] USB To TTL UART
[3] HC-SR04
This comment has been removed by the author.
ReplyDeleteThis comment has been removed by the author.
Delete질문이 있습니다.
ReplyDelete필요한 부품이
arduino pro mini 2개
usb to ttl uart 2개
attiny85 1개
hc-sr04 1개
이렇게 필요한 건가요?
그리고 실례가 안된다면 회로도 공유 해주실수 있으신가요?