반응형

이번 게시글은 아래 지난 게시글 핵심노드 설명 4편에 이은 설명입니다.  순서는 크게 상관없지만 다른 노드의 설명과 Node-RED의 기초적인 설명을 참고하려면 맨 앞쪽 링크를 참고해 보세요.

【Node-RED #⑤】노드-레드! 핵심노드 설명 4편/ Core Node Description! #4

①  delay 노드

  delay 노드는 입력 받는 메시지를 일정한 규칙에 따라 지연해서 전달하도록 해주는 노드입니다.

지연 전달하는 몇 가지 조건 설정을 할 수 있는데요,  예를 들어 아래처럼 5초의 시간 delay를 시켜볼 수 있습니다.   확인을 위해 1번 debug 창은 바로 연결하였고,  2번 debug 창은 5초의 시간 delay를 거치도록 하였습니다. 

1. 타임스템프(inject 노드)의 속성 값으로 전달할 적당한 메시지를 아래처럼 작성합니다. 

 

2. delay 노드의 속성은 아래처럼 해주세요. 

 

3. 그리고 배포하기를 누르고 Inject 버튼을 누르면 아래처럼 debug 창으로 결과를 확인해 보면,  delay가 없는 출력과 비교해서 5초의 설정에 따라 5초의 delay가 정확히 발생하는 것을 알 수 있습니다.

 delay 속성중에는 방금과 같은 고정 값 지연(Fixed delay) 외에,  일정 범위 값 안에서 랜덤으로 지연시킬 수 있는 속성도 사용 가능합니다.

또한, 기본(default) delay 값으로 예를 들어 3초를 설정하고,  특정 메시지(페이로드) 마다 delay를 다르게 설정하여 구분해 줄 수도 있습니다.  (아래 예시)

먼저,
1. 아래처럼 노드를 구성해 주세요.  

2.  delay 노드의 속성은 아래처럼 "msg.delay에 지연을 설정"으로 바꾸고 시간은 default 값으로 임의로 3초를 지정해 줍니다.

 

3.  'A' inject노드에는 단순한 전달 메시지만 입력합니다.

 

4. 'B' inject 노드에는 둘 째줄에 있는 'msg.topic'을  'msg.delay'로 바꿔주고, 속성을 '0~9' number 형식으로 바꾼 다음, delay 값 5000 millisecond (5초)를 입력해줍니다.

 

5.  결과를 실행해 보면, 'A inject'노드를 눌렀을 때, delay (variable) 노드에 기본 값으로 설정된 3초를 기다린 후 A의 메시지(페이로드)를 debug 창으로 전달(출력)했으며, 

 

6.  'B inject'노드를 눌렀을 때는 B inject 노드에 설정된 delay 값이 적용되어 5초를 기다린 후 B의 메시지(페이로드)를 debug 창으로 전달(출력)하는 것을 알 수 있습니다. 

 

7. 그 밖에, delay 노드 사용할 때  inject 노드에서 Reset 기능을 설정할 수 있는데요, 예를 들어, A나 B노드의 inject를 실행하고 설정된 delay 값이 완료되기 전,  Reset inject노드를 누르면 delay가 취소되고 결국 debug창으로 페이로드가 전달되지 않게 됩니다.  (이 실습을 위해 아래처럼 Reset inject 노드를 추가해 주세요)

그리고 리셋(Reset) inject 노드의 속성은 아래처럼 합니다.  일반 inject 노드를 추가해서 두 번째 줄에 있는 msg.topic 항목의 topic 글자를 지우고 reset를 입력합니다.(자동완성 기능 제공)   그리고 속성창에 있는 속성을 Boolean(불린)으로 변경하고, true값으로 설정 확인해 주면 됩니다. 

실습은 먼저 A 혹은 B inject 노드(여기서는 5초로 설정된 B 노드를 클릭)를 클릭 한 다음 5초가 되기 전 Reset inject노드를 클릭하면 delay가 취소되고 debug창으로 아무런 페이로드가 전달되지 않는 것을 볼 수 있습니다. 

8. 아래처럼, 플러쉬(Flush) inject 노드를 추가해 주는데요, 마찬가지로 일반 inject 노드를 추가해서 두 번째 줄에 있는 msg.topic 항목의 topic 글자를 지우고 flush를 입력합니다.   그리고 속성창에 있는 속성을 Boolean(불린)으로 변경하고, true값으로 설정확인해 주면 됩니다.   Flush 기능은 delay 타임이 적용되고 있든 그렇지 않든 클릭하는 즉시 페이로드를 전달시키는 기능입니다. 

 

반응형
반응형

이번 게시글은 아래 지난 게시글 핵심노드 설명 3편에 이은 설명입니다.  아래 게시글 링크를 먼저 참고해 주세요.

【Node-RED #④】노드-레드! 핵심노드 설명 3편/ Core Node Description! #3

①  trigger 노드

 trigger 노드는 메시지를 일정한 규칙에 따라 전달할 수 있도록 해주는 노드인데요, 예를 들면, 메시지에 따라서 일정간격으로 메시지를 전송하도록 하거나, 특정 메시지를 수신하면 홀드 시키거나 하는 등 이벤트를 줄 수 있는 노드입니다.   또한 시스템에서 무한루프에 빠져 있는 경우와 같은 오류등을 감지해 줄 수 있는 와치독 타이머(Watchdog timer)와 같은 역할도 줄 수 있습니다.    정리하자면 노드 플로우에서 흐름을 멈추거나 다시 트리거 시켜주는 등 제어가 가능한 노드라고 볼 수 있습니다. 

그럼, 실습을 위해 아래처럼 노드를 구성해 주세요.

 

1) "타임스탬프" (인젝트) 노드의 설정화면입니다. 

 

2) "STOP" 인젝트 노드의 설정화면입니다.

 

3) "RESET" 인젝트 노드의 설정화면입니다.

 

4) "trigger"노드의 설정화면입니다. 

송신데이터에는 "1"을 적어 놓았는데요,  전달하고 싶은 특정 문자를 적거나하면 되고,  초기화 조건에 "stop"을 적어 놓았는데요,   "STOP" 인젝션을 누를 때 "STOP" 메시지가 전달되면 트리거를 멈추도록 하고 있습니다. 

그럼, 여기서 아래처럼 trigger노드의 속성을 수정해 주면, 3초 간격으로 송신데이터"1"을 반복 송신하게 됩니다. 

 

이때, STOP 인젝터를 클릭하게 되면, 아래처럼 trigger가 멈추게 되고 디버그 창으로도 더 이상 메시지가 전달되지 않게 됩니다.

여기서 기본 트리거 간격을 1초로 바꾸고,   2초 간격의 Trigger 타임스탬프를 하나 더 추가해 볼게요.   그래서 1초 간격으로 트리거 되는 상태에서 추가한 인젝터를 누르게 되면, 2초 간격으로 트리거 시킬 수도 있습니다. 

그리고, 각각의 속성을 아래처럼 입력하거나 수정해 주세요. 

실행해 보면,  처음 기본 "타임스탬프"를 클릭하면 trigger에 설정한 대로 1초 간격으로 "1"이라는 메시지가 디버그창으로 전달되다가, "Trigger 2 sec"인젝터를 클릭하는 순간 2초 간격으로 "1"메시지가 전달되는 것을 볼 수 있습니다. 

 

②  join 노드

 Join 노드는 수신된 메시지들을 지정된 규칙에 따라 하나의 메시지로 변환해 주는 기능 등을 수행합니다. 
우선 Join 노드의 기능알 알아보기에 앞서 직전 게시글에서 다루었던 Split 노드로 메시지를 분리해보고 나서, 여러 개의 메시지가 수신될 때 이를 합쳐서 출력해 보도록 하겠습니다. 

그럼, 아래처럼 Sprit 노드가 포함된 플로우를 구성해 주세요. 

타임스탬프 노드는 아래처럼 해주세요.

다음, Split 노드 속성창인데요,  아래 보시면 '분할 항목'에 아무것도 입력 되어 있지 않은 것처럼 보이지만, "공백 한 칸"이 입력되어 있습니다. 주의해 주세요.  만약 공백을 입력하지 않을 경우, 메시지는 Split 되지 않고 모두 이어져서 하나로 전달 됩니다.

그리고서 배포 후 타임스탬프를 클릭해서 실행하면 아래처럼, 한 줄의 메시지가 각각 분리된 것을 볼 수 있습니다. 

다음으로, 아래처럼, Join노드를 구성해 주시는데요, 다섯 개의 타임스탬프 입력을 Join 노드에 연결한 플로우를 구성해주세요,  각각의 타임스탬프에 있는 메시지를 합쳐서 디버그창으로 출력해 볼게요.

아래는, Data1의 세부 속성 모습인데요,  Data2~Data5의 속성도 동일한 형태로 설정해 주세요. 

다음으로, Join 노드의 속성을 아래와 같이 설정해 주세요.    동작부분에는 수동으로 해주시고, 출력 부분에는 문자열로 선택합니다.  다음으로 연결문자 항목에는 아무 입력도 없을 경우에는 메시지들이 모두 붙어서 출력되며, 공백, '콤머', '+' 기호 등등 메시지들을 결합하고자 하는 문자가 있을 경우 입력하면 됩니다.   그리고 "지정수의 메시지파트를 수신 후" 항목에 5를 입력하여, 5개의 타임스탬프 메시지가 입력되면 자동으로 출력되도록 설정을 하였습니다.   그리고  "첫 메시지수신후부터 타임아웃 후" 항목에 10을 입력하거나 하게 되면, 첫 메시지를 수신하고 10초가 지날 경우 자동으로 입력된 메시지가 출력되는 설정입니다. 

이제 무입력, 공백 한칸, 콤머, + , /  으로 연결문자를 각각 입력해서 결과를 보면 아래처럼 결합되어 출력되는 것을 볼 수 있습니다.  물론 타임스탬프 누르는 순서를 바꾸면 출력도 바뀐 순서대로 결합되어 나오게 됩니다. 

그럼, 다음으로 Join 노드의 속성 중에서 "출력"부분의 항목을 아래처럼 "배열"로 변경해서 실행해 보세요. 

이렇게 하고, 결과를 출력해 보면, 아래처럼 데이터가 배열 형태로 결합되어 저장되는 것을 확인할 수 있습니다. 

그리고 마지막으로, 아래 Join노드의 속성에서 "출력"항목의 선택을 "key/value오브젝트"로 선택해 볼게요. 
이렇게 할 경우 사용할 값 항목에 보면 "msg.topic"으로 되어 있는데요, 이에 따라, 타임스탬프(inject) 노드에 있는 msg.topic 항목에다가, 예를 들어, 숫자 키값을 1~5 각각 입력해 주면,  key/value 오브젝트로 인식되어 결합처리해 줄 수 있게 됩니다. 

그럼, 타임스탬프를 순서대로 클릭해서 출력을 확인해 보면 아래처럼, key/value 오브젝트 형태로 데이터가 결합 정리되어 출력되는 것을 확인할 수 있습니다. 

 

반응형
반응형

이번 게시글은 아래 지난 게시글 핵심노드 설명 2편에 이은 설명입니다.  아래 게시글 링크를 먼저 참고해 주세요.

【Node-RED #③】노드-레드! 핵심노드 설명 2편/ Core Node Description! #2

①  Status 노드

Status(상태) 노드는 플로우 내에 있는 특정 노드들의 상태 메시지를 수신하는 역할을 합니다.   노드의 상태를 표시해 주는 기존 기능을 통해서 상태가 변경될 때 Status 노드는 관찰을 하는데요, 특정 노드의 출력을 감지하여 메시지를 출력하는 경우 등에 활용할 수 있습니다. 

예시)  예를 들어 아래와 같은 플로우가 구성되어 있을 때, debug2로 메시지(숫자'2')가 전달 되는 상황에서 Debug2로 메시지가 전달되면 "status 노드"를 통해서 이를 확인하는 플로우를 구성할 수 있습니다.

[ 지난 게시글에 입력한 Function node의 코드 설정입니다 ]

var msg1 = { payload: "1" };
var msg2 = { payload: "2" };
var msg3 = { payload: "3" };

return [msg1, msg2, msg3];

우선, 위와 같이 노드 플로우를 구성하고, Status의 설정과 디버그 1, 2, 3, 4의 설정은 아래와 같이 해주세요. 

 

이렇게 설정 후 '배포하기'를 누르고 'Hello world!'노드의 인젝션을 실행시키면 아래처럼, debug4를 통해서 상태를 수신하게 됩니다. 

 

②  Comment 노드

comment 노드는 플로우에 영향을 미치지 않는 노드로써, 설명 또는 주석을 작성할 때 사용되는데요, 설명이 필요한 플로우 주변에 넣거나 플로우 구간끼리 구분을 위해 넣어 놓을 수 있습니다. 아래 예시를 참고해 보세요. 



③  Split 노드

Split노드는 입력으로 들어오는 데이터를 설정한 규칙으로 분리 시키는 작업을 수행할 수 있는 노드입니다. 
메시지 내용을 줄 단위(엔터) 혹은 ','컴머나  '.'마침표 등과 같은 특정 문자(스트링) 단위로 구분을 하거나, 노드에 입력되는 메모리 버퍼 단위로 분리 가공할 수 있습니다. 

그럼, 예시로 split노드를 이용해서 전달할 메시지를 줄바뀜이 날 때마다 분리해 볼게요. 

예시①-1) 줄바뀜 ("\n")이 일어날 때 분리해 주는 예시

우선 아래와 같이 노드를 구성해주세요.  "데이터 노드"는 "Template"노드를 이용하면 됩니다. 

아래는 데이터 노드와, split 노드의 속성창 설정 내용입니다. 

 

이렇게 하고서, 타임스템프(인젝션)을 클릭해 보면, 아래처럼 데이터의 줄 바뀜이 일어날 때마다 데이터가 분리(Split)되는 것을 볼 수 있습니다.


예시①-2) 위 예시에서 콤머 ', '  와  마침표 '. ' 등의 여러 가지 문자로도 구분을 할 수 있으니 참고해 주세요. 

 

예시①-3) 마침표 ', '  문자로 데이터를 분리한 예시.

 

예시 ②)  입력되는 문자 길이로 일괄적으로 분리하는 경우. (split 노드에서 아래처럼 분할 부분을 고정장(영문표기: Fixed length of)으로 변경하고 구분하고자 하는 단위의 숫자를 입력해 주세요,  여기서는 3개의 스트링으로 입력) 

템플릿(Template) 노드의 데이터 설정은 아래처럼 했습니다. 

그래서 결과를 출력해 보면 아래처럼 출력되는 것을 볼 수 있습니다. 

 

예시 ③)  배열 단위로 데이터를 분리(구분)할 수 있습니다.  템플릿 노드의 데이터와 속성을 아래처럼 수정해 주세요.  ( 데이터를 배열형태로 바꾸고, 출력 형식을 'JSON'으로 변경합니다.)

그리고 Split노드의 속성은 아래처럼 구분해 주세요.  먼저 2로 입력하여 배열의 값을 두 개씩 묶는 경우입니다. 

결과 출력을 보면 아래처럼 배열값이 2개씩 분리되어 출력되는 것을 볼 수 있습니다. 

그럼, 이어서 배열 묶음을 3으로 변경해서 출력해보면 아래처럼 결과를 정확하게 얻을 수 있습니다. 

 

예시 ④)   오브젝트의 경우는 파이썬의 딕셔너리 구조와 같은 Key값을 기준으로 데이터를 분리할 수 있도록 해줍니다. 
split노드의 속성을 아래처럼 변경해 주세요. 

이를 실행하면 아래처럼 Key값을 기준으로 데이터가 분리되어 출력되는 것을 확인할 수 있습니다. 

 

④  Sort 노드

sort 노드는 입력데이터를 규칙에 따라 정렬해 주는 노드인데요, 정렬은 전달된 msg.payload값이나 JSONata 식을 통해서 정렬할 수 있습니다.   정렬방식은 값을 기준으로 오름차순과 내림차순으로 정렬되며, 수치로서 도 오름차순과 내림차순으로 정렬 가능합니다. 

먼저 템플릿 노드의 데이터를 아래처럼 입력해 주세요. 

Sort노드는 아래처럼 입력하는데,  먼저 "수치로써 비교" 부분을 체크해제하고 결과를 출력해본 후, 체크 후 결과도 차례로 출력해 보세요. 

내림차순의 경우도 동일하게 활용할 수 있습니다. 

또한, Sort노드에서 키값을 Json 표현식으로하여 변경하면 딕셔너리 자료의 Value값을 기준으로도 정렬할 수 있습니다.   예를 들어,  이름과 나이 형태로 된 딕셔너리 데이터가 있을 때,  나이를 기준으로 오름차순이나 내림차순으로 정렬이 가능합니다.  
먼저 "Template"노드를 아래처럼 입력해 주세요. 

그리고,  Sort노드는 아래처럼 수정해 주세요. 

 

그리고 인젝트 버튼을 클릭하여 결과를 출력해보면 아래처럼 나이를 기준으로 오름차순으로 출력된 결과를 볼 수 있습니다. ( 데이터가 안 보일 경우 ▼array [3]  부분의 삼각형을 눌러 아래로 펼쳐보세요)

 

끝으로 Sort노드에서 내림차순으로 바꾸어 출력해 보면 아래처럼 잘 출력되는 것을 확인할 수 있습니다. 


그럼, 이번 시간은 여기까지하고, 다음 시간에 핵심노드 설명을 이어가도록 하겠습니다. 
감사합니다. 

 

반응형
반응형

이번 게시글은 지난 게시글 핵심노드 설명 1편에 이은 설명입니다.  아레 게시글 링크를 먼저 참고해 주세요.

【Node-RED #②】노드-레드! 핵심노드 설명 1편/ Core Node Description! #1

⑥  switch 노드

스위치노드는  입력으로 들어오는 메시지를 분석하여 설정한 조건에 따라 메시지의 출력 방향을 조절할 수 있는 기능을 제공합니다. 

예를 들어, 인젝트(inject)에서 "Dog"라는 메시를 설정하고 switch노드에서 목적상 여러 개의 출력을 설정하였을 때,  "Dog"라는 메시지와 동일한(==) 출력 노드로만 메시지를 보낼 수 있습니다.   즉 메시지에 일정한 규칙을 설정하여 Flow의 방향을 조절할 수 있습니다.

우선, 앞의 인젝트(inject)노드에서 "Dog"라는 메시지를 설정함.

여기서 만약 아래 이미지처럼, 처음 맞는 조건에서 더 이상의 하위 조건들을 검사하지 않고 종료할 수도 있는 옵션도 사용할 수 있습니다.


 검토할 수 있는 조건의 종류는 아래와 같습니다.   인젝터에 있는 메시지 전체에 대해 판별하며, 일치할 경우 true값을 반환합니다.    

특히, JSONata를 지원하기 때문에, 좀 더 디테일하게 조건을 판별 처리할 수 있습니다. 
( JSONata는 JSON 데이터를 위한 경량 쿼리 및 변환 언어입니다. XPath 3.1의 '위치 경로' 시맨틱에서 영감을 받아 정교한 쿼리를 간결하고 직관적인 표기법으로 표현할 수 있습니다. 추출된 데이터를 조작하고 결합하기 위해 내장된 연산자 및 함수의 풍부한 보완이 제공되며 쿼리 결과는 친숙한 JSON 개체 및 배열 구문을 사용하여 모든 JSON 출력 구조로 형식화될 수 있습니다. 사용자 정의 함수를 생성하는 기능과 함께 고급 표현식을 구축하여 모든 JSON 쿼리 및 변환 작업을 처리할 수 있습니다.   참고 →  http://docs.jsonata.org/overview.html   )

⑦  Template 노드

템플릿 노드는 이름 그대로 원하는 형태로 본을 떠주는 노드라고 할 수 있는데요, 아래 예시를 참고해 보세요. 

예시 1)

이 경우, template의 속성은 아래처럼 되어 있습니다.  그리고, 전달할 내용(payload)을  {{  ...  }}  이중 괄호 묶어서 템플릿을 구성하면 됩니다. 

 

예시 2)

예시 3) 여기서 템플릿노드는 특정문자를 HTML 이스케이프 코드로 바꾸어 버리는 경우가 생기는데,  이럴 때는 {{ ... }} 이중 괄호가 아니라,  {{{ ... }}} 삼중 괄호를 사용해 주면 됩니다. 

아래 예시는 html에서 강조(bold) 태그인 <b> </b>를 사용한 메시지를 전달할 때 이중괄호와 삼중괄호를 비교한 예시이니 참고해 보세요.  

 

또한,  템플릿 노드에서는, HTML, JSON... 뿐 아니라,   mustache(머 스테치)라는 템플릿 문법을 지원하는데요, 머스테치는다양한 언어를 합쳐서 사용할 수 있는 하나의 템플릿 엔진으로,  Loop와 같은 로직 구문이 존재하지 않으므로, Logic-Less Templates라고 불리는 엔진입니다.  머스테치는 가장 심플한 템플릿 엔진 중 하나이며, 다양한 언어를 지원하기도 합니다. (C++, C#, PHP, Java, JavaScript, Python, Perl... 등 50여 개 이상 지원)

따라서 머스테치와 같은 템플릿 엔진을 사용한 템플릿 노드를 이용해서 사용자가 정의한 형태의 타입으로 메시지를 가공하는데 효과적으로 사용할 수 있는 노드입니다.  특히, HTML과 같은 웹페이지 출력 형태를 사용할 때 많이 사용하게 됩니다.   뒤에서 다루게 될 [http response] 노드와 함께, 웹으로 출력하는 것을 볼 수 있습니다. 

 

⑧ Complete 노드

노드들의 Flow에서,  어떤 노드들은 출력이 없는 노드들이 있습니다.  따라서 수행완료(처리)를 파악하는 것이 필요할 경우가 생기는데,  complete 노드는 이런 경우처럼 다른 노드의 메시지 처리가 완료되면 이를 체크할 수 있는 기능을 제공하는 노드입니다.   물론 출력이 있는 노드도 체크할 수 있습니다. 
아래 예시에서 보면,  Complete노드에서  "Hello World!" 메시지를 갖고 있는 인젝트(Inject) 노드의 출력 메시지를 감지하면 "debug 2"를 통해서 동일한 메시지를 출력할 수 있도록 하였습니다. 

 

물론 "debug 1" 메시지의 출력을 체크하여도 동일한 결과를 얻을 수 있습니다. 

다만 모든 노드가 이벤트를 발생시키는 것은 아니기 때문에,  Complete노드를 모든 노드에 적용할 수 있는 것은 아닙니다. 

⑨ Link in, out과  Link Call 노드

Link 노드는  플로우 화면에 배치된 노드와 플로우가 너무 복잡할 경우 실제 링크 연결을 대신하여, 즉 무선으로 연결시켜 줄 수 있는 역할을 하는 노드로서, 플로우를 간결하게 표현하는 데 사용할 수 있는 노드입니다. 

아래 예시를 보면, 인젝터에 있는 Hello world! 메시지와 Function 1의 메시지를 합친 출력을 "Link Out 1"노드 → "Link In 1"노드로 전달시켜 debug 1으로 출력시켜본 예제입니다. 

 

아래 "Link Out 1" 노드를 선택해 보면, 옵션에서 "Link In 1" 연결되었다는 표시를 볼 수 있습니다.

 

위와 같이 연결되기 위해서는 아래에 있는 Link Out노드와 Link In노드의 설정을 참고해 주세요.

 

또한 Link 노드를 아래 예시처럼 서부루틴 함수처럼 활용할 수도 있습니다.   (Link Call 함수 활용)

Link node의 옵션은 아래 이미지들을 참고하세요~

 

그리고 아래처럼, 여러 개의 Flow node에서 Link Call 하여 정말 서부루틴 함수 활용하듯 할 수 있습니다.

 

그리고 아래처럼, 플로우 화면 1과 화면 2로 나누어 좀 더 체계적으로 플로우노드를 구성할 수도 있습니다.

 

⑩  Catch 노드

Catch노드는 플로우에서 발생되는 에러를 감지하는 노드인데요,  모든 플로우를 설계하고서 어떤 예상치 못하는 에러가 발생하는 경우 의도적으로 에러를 발생시켜 플로우를 종료해야 되는 경우가 발생됩니다.  특히, 외부 서비스를 연동하거나 할 때 예를 들어, 외부 DB나 HTTP연동에서 응답이 없는 경우에 대한 처리를 해줄 필요가 있습니다.  이러한 경우 등에 catch 노드를 사용하여 대비하는 플로우를 짜는 것이 좋습니다. 

아래 이미지들은 Function 함수에서 에러를 발생시켜 이를 Catch노드에서 감지하도록 하여 에러 발생 내용을 debug 6 노드로 출력하도록 한 예시입니다. 

Function 노드 내용 :

var msg1 = { payload: "1" };
var msg2 = { payload: "2" };
var msg3 = { payload: "3" };

 

return [msg1, msg2, msg3];
 
function 노드에는 msg3에 대한 리턴이 없고 msg4로 잘못 리턴이 되어 에러가 발생하게 됩니다.

 

Catch노드에서는 에러를 체크할 노드로 "function 1"을 체크해 주세요.   물론 하나의 catch노드에서 플로우에 있는 여러 개의 노드를 동시에 에러 체크할 수 있습니다.

 

그리고 catch 노드와 연결된 메시지로 에러메시지를 출력하기 위해,  대상: msg.error.message  로 입력해 주세요.

 

에러가 나는 부분을 정상정으로 수정 후에는 아래처럼 정상 출력(작동) 되는 것을 볼 수 있습니다. 

 

그럼, 다음 게시글에서 핵심노드 설명 3편으로 이어가도록 하겠습니다.

감사합니다.

반응형
반응형

1.  노드 그룹

이번 글에서는 노드레드(Node-RED)에서 플로우를 작성하기 위한 기본 단위인 노드에 대해 설명 주요 노드를 중심으로 설명을 드리려고 하며,  이를 그룹별로 정리한 노드 그룹(Group)에 대해 설명하고자 합니다. 

아래는 노드래드를 실행하면 보이는 좌측 팔레트(Palette Side) 영역에 보이는 노드와 기본 노드 그룹에 대한 설명을 표로 정리하였습니다. 

이 노드는 Node-RED를 처음 실행하면 보이는 기본 그룹이며,   팔레트 관리 메뉴에서 추가적으로 필요한 노드를 라이브러리 검색으로 검색하여 추가시킬 수 있습니다. 
아래는 가장 많이 추가해서 사용되는 Dashboard 노드 그룹과 Raspberry Pi 노드 그룹입니다. 

2.  핵심 노드  설명

  ①  Inject 노드  

인젝트(Inject) 노드는 작업영역에 배치하면 Time Stemp(타임스템프)로 표시되는 노드이며,  좌측에 있는 버튼을 눌러 수동으로 플로우를 발생시킬 때 사용할 수 있는 노드입니다.   또는 일정한 시간 간격(인터벌)으로 플로우를 발생시킬 수 있습니다. 

(타임스템프 노드를 더블 클릭하여 이미지와 같이 설정할 수 있습니다)

또한 아래처럼 지정한 시간 간격, 일시 형태로도 설정이 가능합니다.

전달하는 기본 형태는 msg.payload와 msg.topic을 설정할 수 있는데, 메시지 타입을 숫자, 문자열(String), Josn 타입 등 다양하게 전달할 수 있습니다.

 

그리고 화면 아래  '+추가' 버튼을 클릭하면, 메시지를 추가하거나 삭제 그리고 메시지의 타입을 선택할 수 있습니다.  

inject 노드에서 전달할 수 있는 메시지의 주요 타입(속성)은 아래와 같습니다. 

 

②  디버그(Debug) 노드  

 디버그 노드는 아두이노IDE로 예시를 들자면 시리얼 모니터와 같은 기능을 하는 노드로 이해하면 됩니다.  플로우 사이에 이동되는 메시지를 파악하거나 탐색하기 위해 많이 사용되는 노드입니다.  편집기 화면에서 디버그 내용을 보기 위해서는 측면영역(Side Bar)에 있는 debug 탭을 클릭하면 그곳으로 출력됩니다. 

 

만약,  시스템 콘솔 (system console)로 출력을 선택하면, 아래처럼 Node-Red를 실행시킨 콘솔(터미널) 화면으로 출력 됩니다. 

 

또한, 노드 상태(node status)창으로 출력을 설정할 경우 플로우 작업영역의 노드 아래에 32 character까지 출력해 줍니다. 


그리고 이 옵션들은 중복해서 적용할 수 있습니다.  (동시 출력 가능함)
그리고 이과정에서 디버그 노드는 앞선 글에서도 다루었지만, 활성화 또는 비활성화할 수 있는데요, 필요치 않은 경우 비활성화시켜놓다가 다시 체크해 볼 상황이 되면 활성화시켜 확인해 보는 식으로 하면 편리하게 디버그 노드를 활용할 수 있습니다. 

 

③  함수(function) 노드  

 함수 노드는 전달 받은 메시지를 JavaScript를 활용하여,  처리하고 처리된 결과를 뒷 단의 노드로 전송할 수 있습니다.  사용자가 원하는 기능을 정의한다고 생각하면 됩니다. 

예를 들어 인젝트 노드에서 'Hello World!'라는 문자열을 받아서 문자열 전체 개수를 카운트하여 전달할 수 있습니다.  아래 이미지를 보면, 공백포함하여 정확히 '12'가 카운트되어 전달되는 것을 볼 수 있습니다. 

예제 1)  전달 되는 메시지(Hello World!)의 문자열 길이를 출력하는 함수(function) 넣기

▷  Function 함수 내용 :    var msg= { msg.payload.length );     return   msg;

 

예제 2)  다중 함수를 구성하여 기본 전달 메시지(Hello World!)와,  설명 문자열 출력과 전달되는 문자열의 길이를 출력하는 3중 출력 함수 Json코드 넣기.

함수에 입력된 JSON 코드 :

var msg2 = { payload: "메시지의 총길이는:" };
var msg3 = { payload: msg.payload.length };
return [ msg, msg2, msg3 ];

( ※ msg는 기본 전달되는 메시지여서 별도로 객체를 생성할 필요 없습니다)

이때, 함수(function) 노드의 설정창의 Setup탭에서 함수 노드 수를 3개로 변경해 주어야 합니다. 

그럼, 아래와 같이 디버그 창으로 동시에 원하는 3가지 형태의 출력 결과를 얻을 수 있습니다.

 

또한,  if 조건문을 넣어 원하는 입력일 경우 그대로 출력하고 그렇지 않을 경우 에러 메시지 등과 같은 것을 출력하는 등, 좀 더 다양하게 활용할 수 있습니다. 

① 원하는 입력('Hello World!')이 들어오면 설정한 대로 출력합니다.

1. 원하는 입력('Hello World!')이 들어오면 설정한대로 출력합니다.

 

② 만약 원하지 않는 입력('Nice World!')이 들어오면 다시 확인할 수 있도록 메시지를 출력할 수도 있습니다. 

2. 원하지 않는 입력 ('Nice World!')이 들어오면 다시 확인할 수 있도록 메시지를 출력합니다.

 위에서 입력한 function 코드는 아래와 같습니다. 

var msg2 = { payload: "메시지의 총길이는:" };
var msg3 = { payload: msg.payload.length };
var msg4 = { payload: "입력문자를 확인하세요!"};
if (msg.payload == "Hello World!") {
    return [msg, msg2, msg3];
} else {
    return [msg4];
}

 

예제 3) 하나의 디버그 노드로도 여러개의여러 개의 메시지를 순차적으로 출력할 수 있습니다. (한 번의 인젝션으로 여러 개의 메시지를 출력할 수 있음)

 

아래 function 내용을 참고하세요. 

또한, return 에서 대괄호 [ ]는 배열을 의미합니다. 따라서,  function 노드의 Setup에서 출력수를 2로 하고 디버그를 하나더 연결 후 아래와 같이 msg, msg1과  msg2, msg3를 배열의 요소로 따로 분류하면 각각의 디버그 노드로 분리되어 출력되는 것을 볼 수 있습니다.

[ [msg, msg1], [msg2, msg3] ] 으로 Function 코드를 수정하세요

 

배열로 분리된 리턴값이 디버그1과 디버그2로 각각 분리되어 출력됩니다

 

예제 4)  이벤트 로깅

 필요할 때마다 콘솔을 통해 무언가를 기록해야 하거나, 특정 노드에서 주의(경고)나 에러(오류)가 발생하는 상황에 대해 메시지를 출력하도록 할 수 있습니다. 
function 노드에 아래와 같이 코드를 입력하고 실행시켜 보면,  이벤트 로깅이 되는 것을 볼 수 있습니다. 단, node.log ()의 경우는 사이드바로는 출력되지 않고 콘솔로만 출력됩니다. 

node.log("로그 기록입니다.");
node.warn("주의 경고 사항발생!");
node.error("에러 발생~!");
 

그리고 이벤트 함수에 직접 메시지를 입력할 수도 있지만 아래처럼, 변수를 지정해서 할 수도 있습니다.
var msg1 = { payload:"로그 기록입니다."};
var msg2 = { payload: "주의 경고 사항발생!" };
var msg3 = { payload: "에러 발생~!" };
node.log(msg1.payload);
node.warn(msg2.payload);
node.error(msg3.payload, msg3);
return [[msg1, msg2, msg3]];

아래 이미지를 보면, 이벤트 로깅 함수에의해 발생되는 것(분홍색 표시)과  일반 메시지로 출력되는 것(주황색 표시)의 차이를 구분하실 수 있을 거예요.

 

④  Catch 노드  

catch 노드를 통해서는  노드 전체나 특정 노드에서 발생하는 에러가 있을 경우 이벤트 메시지를 발생시키도록 할 수 있습니다. 

 

⑤  Change 노드  

Change 노드는 Function노드에서 처럼 JavaScript  코드에 의존하지 않고 사용할 수 있는 노드로서, Node-RED에서 자주 사용될 수 있는 기능인,  payload값을 변경하거나, 설정, 삭제, 이동 같은 작업들을 처리해 줄 수 있는 노드입니다. 

Change노드의 설정으로 들어가보면 4가지 속성을 선택할 수 있는데요, 각각의 예시를 들어 볼게요.

예제 1)  값의 대입 (Set)   속성
Change노드의 설정부분에서 "값의 대입(Set)"으로 놓고 대입하고자 하는 값('Welcome!')을 입력해 놓으면,  인젝터에 입력값이 없는 경우에도 특정 값을 대입(설정,Set)시킬 수 있습니다. 

 

예제 2) 값의 치환(Change) 속성

치환 속성은 예를들어 인젝트 노드로부터 입력되는 값에서 특정 문자열을 검색하여 바꾸고자 하는 문자열로 변경해 주는 속성입니다.

"Hello World!" 문자열에서 Hello를 검색하고 이 문자열 대신 "Nice"로 치환하여 출력 하도록 합니다. 
그래서 결국 "Hello World!" 문자열은 Change 노드를 거친 결과 값은  "Nice World!"로 바뀌어 출력되게 되는거죠.


예제 3) 값의 삭제(Delete) 속성

값의 삭제(Delete)속성은 입력되는 payload 값을 삭제하도록 합니다. 아래처럼 Change의 속성을 값의 삭제로 변경하게 되면,  

Change 노드를 거친 "디버그 2" 노드로는 출력값이 나오지 않게 됩니다. 

 

예제 4) 값의 이동(Move) 속성

 값의 이동은 이동(Move)이라는 말보다는 추출이라는 말로 생각하면 더 빠르게 이해할 수 있는데요, 예를 들어, Raspberry Pi에 연결 된 dht11 온도센서가 있다면,  센서로부터 전달 받는 데이터(payload)는 오브젝트(객체)로 전달 받게 되는데요  즉, dht11이라는 정보 객체 속에는 온도값과 습도값의 데이터 집합(뭉텅이) 형태로 전달 받게 되는데, 실제로 활용하고자 하는 온도(Temperature) 값이나 습도(Humidity)값을 추출(이동-Move)해야 활용할 수 있게 되겠죠?   따라서 이런 상황에서 아래처럼, 이동(Move) 속성을 이용하여 플로우를 구성하여 사용할 수 있습니다. 

반응형
반응형

지난 시간에는  노드레드를 라즈베리파이 또는 윈도에 설치하는 것에 대해 다루었습니다.  이와 관련하여서는 아래 게시물을 참고해 주세요.
【Node-RED #1】라즈베리파이(Raspberry pi)에 Node-RED 설치하기

 이번 시간부터는 본격적으로 노드레드에 대해 알아보고 활용해 보도록 시작해 보겠습니다. 

1. Node-RED의 개념

 노드레드는 플로우(Flow) 즉, 흐름 기반의 프로그래밍으로써 시각적 표현에 매우 적합하고, 복잡하고 어려운 프로그래밍 사용을 자제하고, 사용자가 보다 쉽게 접근할 수 있도록 설계된 모듈입니다.   노드레드에서의 각 노드는 마치 블록코딩의 대명사인 스크래치의 블록과 유사한 개념으로  노드레드는 다수의 노드를 이용하여 각 노드별 원하는 요구사항에 맞는 플로우를 만들 수 있으며 이를 아두이노, 라즈베리파이 및 각종 센서, 디스플레이 등 제어모듈과 같은 하드웨어와 연결하여 시각적으로 보여주거나 제어가능하도록 ioT 시스템을 쉽게 구축할 수 있는 특징이 있습니다. 

아래는 노드레드 Flow 구성 및 편집 예시입니다.

이미지 출처 : nodered.org

아래는 노드레드 UI 예시입니다.

이미지 출처 : hackaday.com

아래는 노드레드 UI 예시입니다.

이미지 출처 :&nbsp;Yaser Ali Husen

아래는 노드레드 UI 예시입니다.

이미지 출처 :&nbsp;Yaser Ali Husen

 

기본 화면 구성은 아래 이미지와 같습니다.

① 노드레드 편집기 화면 구성

 

노드레드는 크게 4개의 영역으로 구성되는데요,,

→ ① 상단(Header) 영역에는 배포(Deploy) 메뉴와(Deploy) 팔레트관리와 같은 설정 메뉴가 배치되어 있습니다.

→ ② 팔레트(Palette) 영역은 각종 기능 구현해 주는 노드 블록들로 배치되어 있습니다.

→ ③ 측면(Sidebar) 영역은 노드에 대한정보/도움말/디버그/노드설정에 대한 메뉴로 구성되어 있습니다.

→ ④ 작업공간(Workspace) 영역은 노드들을 배치하고 이어주며 함수 노드에 프로그래밍을 하는 영역입니다.

 

상단(Header) 영역에 있는 배포(Deploy) 메뉴는 작업공간영역에서 완성된 노드들의 플로우를 실행시키는 역할을 합니다. 만약 UI(User Interface)가 있는 플로우라면 “http://localhost:1880/ui” 주소를 통해서 UI를 확인하거나 실행할 수 있습니다. 그리고 배포하기 옆에 세줄로 표시된 부분을 클릭하면, 라이브러리 추가 등 팔레트관리와 같은 설정 메뉴가 있는데, 제세한 내용은 이후 계속 설명이 됩니다.

팔레트(Palette) 영역은 작업영역 좌측에 있으며, 기본적으로 6개 그룹(카테고리)의 메뉴로 구성되어 있습니다. 여기에서 필요한 노드 블록을 선택하여 작업영역으로 끌어다 놓는 식으로 작업합니다. 기본 그룹 외에 추가적으로 팔레트관리 메뉴에 있는 라이브러리 추가를 통해 대시보드(dashboard)나 라즈베리파이(Raspberry Pi) 노드 그룹 같은 것들을 추가해서 사용할 수 있습니다.  
대략 2,700개 이상의 모듈을 추가 설치가 가능하며, 사용자 정의로 직접 모듈을 등록하고 관리할 수 있습니다.

 

측면(Sidebar) 영역은 노드 편집기 내의 유용한 도구를 제공하는 패널로 구성되어 있는데요, Information/Help/Debug/Configuration nodes/Context Data/Dashboard, 6개의 탭으로 구성되어 있습니다.

주로 Debug탭을 많이 활용하게 되는데요, 작업공간에서 사용한 디버그 노드의 출력을 확인할 수 있습니다. 측면영역은 작업영역 확보를 위해 숨김/보이기 처리할 수 있으며, (Ctrl+Space) 단축키도 할당되어 있습니다. 가령,  "Hello world!"와 같은 

 

작업공간(Workspace) 영역은 필요한 노드 블록을 끌어다 놓고 블록들 사이의 플로우(Flow)를 연결하며, 함수 노드의 경우 Javascript로 프로그래밍을 추가해 넣을 수 있는 작업 공간입니다. 노드들을 클릭하면 세부 설정을 변경하거나 코드를 입력할 수 있는 메뉴가 표시됩니다.  노드레드에서 노드는 플로우를 작성하는 기본 구성단위 요소입니다. 

작업공간 상단 우측에 보면 + 표시와 서브메뉴가 보이는데요,  이를 클릭하면 플로우 페이지를 추가하거나 보이기 감추기 등을 할 수 있습니다. 

또한, 불필요한 플로우 삭제는 아래처럼,  플로우를 더블클릭 후 나타나는 메뉴에서 플로우를 삭제할 수 있습니다.

 

그럼, 사용법을 익히기 위해 먼저 간단한 플로우를 작성해 볼게요.

▶ Hello world ! 문자 출력해 보기

프로그래밍을 배울 때 제일 처음 출력해 보는 것이 “Hello world!”인 것은 이제 국룰? 인데요, 여기서도 그 문장을 출력해 볼게요.

먼저 위 이미지처럼, 공통노드(common node) 그룹에서 inject(타임스탬프)를 플로우 작업화면으로 끌어다 놓으세요.   
그리고, 타임스탬프노드를 더블 클릭하면 설정창이 열리는데, 아래 ②번 부분을 클릭하여 전달할 메시지 타입을 String(문자열)으로 선택합니다. 

그런 다음, 아래 ④번과 같이 "Hello world !" 메시지를 입력하고 완료 버튼을 눌러주세요.

 

 이제 공통그룹에서 debug 노드를 ⑤ 위치에 끌어다 놓으세요. 

그리고 "Hello world! " 노드 끝에 있는 포인트를 마우스로 드래그하면 연결할 수 있는 주황색 선이 나오는데요,  이를 debug노드의 연결점에 이어 붙여주세요.  (아래 이미지 참조)


각각의 노드 오른쪽에 보면, 파란색 점이 있는 것을 볼 수 있는데요, 이는 현재 새로운 노드가 삽입되었거나, 변경 사항이 발생한 표시이며, 아직 배포(적용)되기 전이라는 뜻입니다.     그럼,  이 상태에서 상단메뉴에 보이는 "베포하기" 버튼을 눌러주세요. 

 

그럼, 아래처럼 파란색 점이 사라진 것을 볼 수 있습니다.     이제 "Hello world!"라는 전달 내용(payload)을 가진 타임스탬프 노드의 왼쪽 버튼 부분(Inject)을 클릭하면 디버그 노드로 전달이 이루어집니다.   이윽고 우측 Sidebar의 디버그 창으로 "Hello world !"가 출력되는 것을 볼 수 있게 됩니다.    또한, Inject 버튼을 여러 번 클릭하는 만큼 출력이 됩니다.

 

참고로,  노드레드의 언어 설정은 기본적으로  영어, 독일어, 일본어, 러시아어를 지원하며, 한글도 지원하지만 간혹 한글 표현이 조금 어색한 경우도 있습니다.  
언어 설정 메뉴는 상단메뉴의 "배포하기" 버튼 오른쪽에 있는 삼선을 클릭 후,  창 탭을 클릭하면 나옵니다.

그리고 디버그 창에 출력된 내용이 지저분하거나 하여 삭제하고 싶을 때는 아래 휴지통 버튼을 클릭하면 됩니다. 

 

참고로 디버그(debug) 노드를 클릭 후 보이는 설정메뉴 하단에 "ㅇ사용가능" 표시가 있는데요, 이를 클릭하면 "Ø사용불가능"으로 표시가 바뀌며,  해당 디버그 노드는 실행을 시켜도 디버그 창으로 메시지 출력이 되지 않도록 사용이 중단됩니다. 

아래 이미지처럼,  해당 노드는 점선으로 처리되며,  Inject 버튼을 눌러도 아무것도 출력되지 않게 됩니다.

 노드의 삭제는 삭제하고자 하는 개별 노드를 선택한 다음 Delete 키로 쉽게 삭제 가능합니다.
노드간 연결된 선도 마우스로 선택 후 Delete 키로 삭제할 수 있습니다. 

그럼  "Node-RED의 시작!" 첫 글은 여기까지 하고,  다음 게시글에서 계속 이어가도록 하겠습니다.

반응형
반응형

※ Node-RED 소개

노드레드는 플로우(Flow) 즉, 흐름 기반의 프로그래밍으로써 시각적 표현에 매우 적합하고, 사용자가 보다 쉽게 접근할 수 있는 모듈입니다.  노드레드는 다수의 노드를 이용하여 각 노드별 원하는 요구사항에 맞는 플로우를 만들 수 있으며 이를 아두이노, 라즈베리파이 및 각종 센서, 디스플레이 등 제어모듈과 같은 하드웨어와 연결하여 시각적으로 보여주거나 제어가능하도록 ioT 시스템을 쉽게 구축할 수 있는 특징이 있습니다. 

 

[ Node-red  예시 ]

이미지 출처 : nodered.org
이미지 출처 : hackaday.com

 바로 위 이미지에서도 볼 수 있듯이 그래픽 기반의 GUI 환경으로 인터넷에 연결된 장치들을 모니터링하거나 컨트롤 할 수 있는 웹 앱 대시보드를 보다 쉽고 빠르게 구성할 수 있으며,  예를 들어,  API를 활용한 일기예보, 버스나 지하철 시간표, 뉴스 기사 및 IoT 홈 네트워크 등 활용가능한 범위도 다양합니다.  구동을 위한 서버가 필요한 경우에는 라즈베리파이로 저비용으로 간단히 해결할 수 있습니다.   

Node Red는 2013년 초 IBM의 Emerging Technology Services 그룹의 Nick O'Leary와 Dave Conway-Jonse의 부수 프로젝트로 개발 시작 되었고, 2016년 10월 JS Foundation의 창립 프로젝트 중 하나가 되면서 오픈 소스로 개발되었습니다.

Node Red는 가벼운 Node.JS를 기반으로 하기 때문에 라즈베리파이와 같은 낮은 하드웨어 및 열악한 클라우드 네트웍 환경에서도 실행이 가능합니다.   또한 Node의 패키지 저장소에 있는 22만 개 이상의 노드 패키지 모듈을 활용할 수 있는 장점이 있습니다. 

Node Red에서 생성된 플로우는 JSON 형식의 데이터를 사용하여 저장되며, 자신이 디자인한 플로우를 JSON 포멧으로 온라인상에 공개하거나 다른 사람과 쉽게 공유할 수 있도록 디자인되었습니다.(Node-red 공홈 또는 깃허브 등). 
 이는 자신이 힘들게 처음부터 모든 Node를 다 구성할 필요 없으며 다른 사용자가 공유한 노드를 쉽게 추가 함으로써, 쉽고 빠르게 시스템을 구축할 수 있는 장점이 있습니다.   

노드레드는 다양한 환경에서 설치 및 활용할 수 있는데요, 라즈베리파이, 비글본 블랙과 같은 저비용 하드웨어 뿐아니라, IBM클라우드, 아마존 웹 서비스, 마이크로소프트 애저와 같은 클라우드기반에서도 잘 작동됩니다. 

그럼,  노드레드를 사용해보기에 앞서, Node.JS의 설치가 필요합니다.  링크 : https://nodejs.org/ko/download   
링크에서 설치하려는 시스템에 맞는 Node.JS를 설치하세요.    여기서는 라즈베리파이에 설치하는 것으로 진행합니다만,  윈도 PC에서 라즈베리파이를 원격으로 접속해서 제어하기를 원한다면 윈도용 Node JS를 윈도 PC에 설치할 수도 있습니다.   혹은 라즈베리파이이와 하드웨어 모듈 같은 연결을 활용하지 않고 윈도용 NodeJS를 단순히 윈도 PC에 설치하여 Node-Red를 활용할 수도 있습니다.    

참고로,  각 노드에서 함수 코드를 만들 때에는 자바스크립트(Java Script)를 기본 코딩 언어로 활용하게 됩니다.   

그럼, 본격적으로 Node-Red의 세계로 출발해 보아요~!  

※  라즈베리파이에 Node-Red 설치하기

15년도부터 라즈베리파이 OS(라즈비안)에는 NodeJS와 Node-Red가 기본으로 설치가 돼있습니다.
즉, Node-Red와 업데이트만 진행하면 됩니다.
하지만 이것과 상관 없이 아래 명령어를 이용하여 설치하면 기존 설치된 혹은 구버전 NodeJS와 Node-RED를 자동 제거부터 하고 설치가 진행되니 그대로 진행해도 됩니다.

$ sudo apt-get update
$ sudo apt-get upgrade
$ bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)
$ sudo apt-get update
$ sudo apt-get upgrade


그리고 위 명령어를 복붙복 하세요.  NodeRED 참고 공식 링크  : https://nodered.org/docs/getting-started/raspberrypi

아래 이미지들은 Node-Red 설치 진행 과정입니다.

Y를 두 번 입력

Y를 차례로 두 번 입력하여 설치해 주세요. 

그럼, 아래처럼 최신 버전의 Node JS (v16.19.1)와  Node-RED (v3.0.2)가 설치됩니다.  만약 구버전이 있다면 자동 삭제 됩니다. 

▶  부팅시 Node-RED가 자동으로 실행되도록 하려면 아래 명령어를 실행해 주면 됩니다.

$ sudo systemctl enable nodered.service

 - 만약 자동실행 설정을 해제하려면 아래 명령을 입력하세요. 

$ sudo systemctl disable nodered.service

 

▶ node-red의 서비스 시작은 아래 명령어로 시작하면 됩니다.   
Node-RED의 서비스 시작은 터미널에서 명령어를 입력하거나, 라즈베리파이 메뉴에서(개발 》Node-RED)   Icon을 클릭하여 실행 가능합니다.    명령어로는   $ node-red  또는  $ node-red start   하나를 입력하면 됩니다.

$ node-red start

 

▶ 이제 웹브라우저를 열어 Node-Red가 실행될 혹은 작업화면은 라즈베리파이의 IP 주소를 입력하면 되는데요,   기본 설치되어 있는 크롬미움 Chromium (크롬의 리눅스 버전)이나,  파이어 폭스(Fire Fox Web) 웹브라우저에서 아래 주소를 입력하면 됩니다. 
http://localhost:1880      또는  http://localhost:1880/ui/     

혹은 ip를 직접 입력하여   http://192.168.138.130:1880  또는 http://192.168.138.130:1880/ui로 입력하면 아래처럼 Node-Red 에디터(편집) 창이 나타나는 것을 볼 수 있습니다.   이 공간에서 플로우를 개발한다고 생각하면 됩니다.

▶ Samba 툴을 설치하여 윈도우 PC에서 "원격 데스크톱 연결"을 통해서도 가능합니다.  
  라즈베리파이 원격 데스트탑 연결 내용은 아래 게시글을 참고해 주세요. 
  ▷ 윈도PC에서 라즈베리파이 원격 제어하기 ( https://rasino.tistory.com/329 )

 

그리고 Node-RED 네트워크 사용자 추가나 Node-RED 기본 환경설정은 아래 명령어로 설정해 주면 되는데요, 

$ node-red admin init

아래와 같은 내용이 나타나며,  아래 경로의 settings.js 파일에 설정내용이 저장됩니다. 

  /home/pi/.node-red/settings.js

엔터를 하면, 다음으로 진행이 되는데요,   Yes와 No 메뉴 혹은 기타 선택 메뉴가 나타나면 키보드 화살표 위/아래 키로 선택해 주면 됩니다. 

Do you want to setup user security? Yes
 → User Security :    id (예시: pi )와 password (8자 이상, 예시: raspberry)  입력 후 엔터,  →  유저 추가 선택 (여기서는 No) 선택  (ID와 패스워드는 잘 기억해 두세요)
→  User permissions?full access를 선택  
→ Add another user?No 선택 (추후 선택 가능)

②  프로젝트 선택  :  Do you want to enable the Projects feature?No 선택

③ Flow 파일 설정:  Flow File settings?flows.json (기본값으로 저장)

④ 테마 에디터 및 텍스트 에디터 설정 :   Select a theme for the editor default?  두 가지 모두 default로 설정 

⑤ 외부 모듈 받아들일지 여부? :   Allow Function nodes to load external modules?Yes (기본값으로 저장)

 

이와 같이 설정하면 무난하며, 추후에 명령어로 다시 변경 가능합니다. 

 

이렇게 설정하고 재부팅하게 되면,  로그인 창이 뜨는데요,  조금 전에 만들어준 계정으로 로그인하면 됩니다.

(예시)  ID :  pi  ,     Password :  raspberry

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

(기타 참고)   라즈베리파이에 파이어 폭스 Firefox Browser 설치하기  명령어 (최신 버전)

$ sudo apt update
$ sudo apt install firefox-esr

 

아래는 NodeRED를 실행하고 간단한 문자(String) 출력과 함수 노드를 이용한 숫자 카운트를 해보는 모습입니다. 

 

물론 같은 WiFi망 혹은 내부 네트워크에서 접속하는 것이라면, 아래처럼, 윈도 PC에서 라즈베리파이 주소를 입력하면 Node-RED 편집화면에 접속하여 실행시킬 수 있습니다.   ( 예시,  http://192.168.138.130:1880/ )

단, 윈도에서 노드레드를 실행하기 위해서는 윈도에 윈도용 Node JS가 설치되어 있어야 합니다. 
링크 : https://nodejs.org/ko/download    (LTS 안정화 버전을 다운로드하세요)
node js 설치 확인 및 버전확인은 아래처럼 가능하며, 윈도에 설치한  NodeJS의 버전 확인은,  윈도》실행》 cmd 명령 프롬프트 실행 하여,  node  -v로 실치 및 버전을 확인할 수 있습니다.    또한,  라즈베리파이에서는 터미널에서 같은 명령어로 확인 가능합니다. 

 

참고로,  윈도에서 Node-RED 실행은 아래 이미지와 같이 "node-red"를 입력하면 됩니다.   Node-RED의 버전확인도 가능하고 Starting flows라고 표시되는 것을 확인할 수 있습니다. 


마지막으로,
▶ Node-RED의 플로우 편집화면은   http://localhost:1880  또는  http://192.168.138.128:1880 형태의 주소로 접속하면 되며,
▶ Node-RED의 Dash Board(대시보드) 결과 출력 혹은 컨트롤 화면은  주소 마지막에/ui를 붙인 주소를 입력하면 됩니다.   (예시,  http://localhost:1880/ui   또는 http://192.168.138.128:1880/ui )

 

 

그럼, 차후에 Node RED를 이용해서 라즈베리파이에 연결된 모듈이나,  MQTT 브로커와 연동된 통신 실습을 올려볼 예정입니다.   감사합니다.

 

반응형
반응형

라즈베리Pi#22 초음파 센서(HC-SR04) 사용하기!  with (파이썬 코드)
RaspberryPi Ultra-Sonic Sensor with Python !


 라즈베리파이에서 초음파 센서인 HC-SR04 모듈을 사용하는 방법에 대해 다루어 보겠습니다. 
코드는 파이썬으로 하고, "거리 측정기"를 예시로 진행해 보겠습니다.

 그리고, 내용 초반에 라즈베리파이에 직접 모니터와 키보드, 마우스 등을 연결하지 않고 자신의 주 PC인 윈도 PC에서 원격 접속으로 접속하여 동작시키는 방법으로 진행이 되는데요, (물론 직접 연결하여 진행해도 됩니다)

만약 원격 접속 제어 방법이 궁금하다면,  라즈이노 ioT(게시글) 블로그와  유튜브 영상을 참고해 주세요.

【라즈베리Pi#19】 윈도 PC에서 라즈베리 Pi 원격 제어하기

[ 윈도 PC에서 라즈베리 Pi 원격 제어하기 - 유튜브 영상으로 보기 ]

  원격 접속을 하면,  모니터 및 키보드와 마우스를 추가로 연결할 필요 없고, 멀리 떨어진 임의의 장소에 설치되었더라도, 네트워크만 연결되어 있으면, 제어할 수 있어 활용도가 높은 장점이 있습니다. 

 

실습 준비물

 위 실습 준비물을 준비해주시는데요, GPIO 40핀 어댑터&케이블은 없어도 실습을 진행할 수 있으나, 
있다면  핀 네임을 보며 연결할 수 있기에 좀 더 안정적으로 편하게 연결할 수 있습니다.

 브레드보드 또한 크게 사이즈 상관이 없으며,  작은 사이즈를 타이트하게 사용하거나 두 개 이어 붙여 사용할 수 있습니다.

라즈베리Pi 초음파 센서 연결도 

 위 이미지는 라즈베리파이 초음파 거리측정 회로 연결 도면입니다.  연결 도면을 보고 부품들을 연결해 주세요.

※  주의 사항!
아래 주의사항들을 반드시 숙지하고서 작업해 주세요~!

[ 라즈베리파이의 출력 ]
라즈베리파이의 GPIO 핀의 출력 허용 전류는 핀당 최대 8mA로(모든 핀 총합 50mA)로 제한되어 있기에 LED 이상의 모터 등과 같은 모듈을 직접 출력 제어하는 것은 라즈베리파이를 손상시킬 수 있습니다. 

[ 라즈베리파이의 입력 ]
최대 3.3V까지 입력이 허용되며, 신호 레벨의 임계값은 1.8V입니다.   즉, 1.8V 보다 크면 논리 1(High),  작으면 논리 0(Low)으로 인식합니다. 
입력 가능 전류는 핀당 최대 5mA를 넘지 않도록 해야 합니다. 

라즈베리파이의 GPIO는 3.3V 레벨로 동작하기 때문에 반드시 3.3V 이상의 전원 또는 신호 레벨이 입력되지 않도록 주의하세요~!

 아두이노와 달리 컴퓨터 시스템과 같은 라즈베리파이는 포트에 출력으로 할애할 수 있는 여유가 크지 않기 때문에 LED 이상의 부품들은 포트 출력으로 작동시키지 말고 VCC 전원을 싱크(Synk)하여 처리하거나, 별도의 전원을 공급하여 처리하는 것이 좋습니다. 
 또한, 라즈베리파이는 입력받을 수 있는 전압 또는 신호 레벨이 3.3V 이하여서, 초음파 센서의 Echo핀으로 받는 5V의 High 신호 레벨을 3.3V로 낮추기 위해 1 : 2 비율의 저항을 연결하여 아래 그림처럼 3.3V로 낮추어 입력받게 됩니다.

입출력 핀은 어떤 GPIO 핀을 사용해도 상관없으며, 코드에서 핀 번호와 일치시켜주면 됩니다.

그럼, 초음파 센서를 통하여 거리 측정하는 원리를 간단히 설명해 보겠습니다.

초음파 센서 모듈을 살펴보면, 송신 모듈과 수신 모듈이 한 세트로 되어 있는 것을 볼 수 있습니다.

아두이노에서 초음파 센서의  Trigger Pin으로 10us의 펄스 신호를 입력해 주면,  초음파 센서의 송신 모듈에서 25us짜리 8개의 음파를 발사하게 되고, 이 음파가 물체에 부딪혀 수신 모듈로 되돌아올 때, 에코 핀에서는 그 시간 동안만 High 신호를 출력하게 됩니다.

이 High 신호의 간격(시간)을 이용해 아두이노에서 음파의 속도를 적용하여 물체와의 거리 값을 계산하게 됩니다
〔 음파의 속도 : 343m/s (34,300cm/s) 〕

Echo Pin의 High 펄스 시간은 펄스가  발사되고 물체에 반사되어 되돌아오기(왕복)까지의 시간이기 때문에, 나누기 2를 해주면 물체와의 거리 값을 구할 수 있습니다.

distance = (check_time x 34300) / 2

다음은, 회로를 동작시킬 파이썬 코드입니다.

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)

TRIG = 23
ECHO = 24
print("초음파 거리 측정기")

GPIO.setup(TRIG, GPIO.OUT)
GPIO.setup(ECHO, GPIO.IN)

GPIO.output(TRIG, False)
print("초음파 출력 초기화")
time.sleep(2)

try:
    while True:
        GPIO.output(TRIG,True)
        time.sleep(0.00001)        # 10uS의 펄스 발생을 위한 딜레이
        GPIO.output(TRIG, False)
        
        while GPIO.input(ECHO)==0:
            start = time.time()     # Echo핀 상승 시간값 저장
            
        while GPIO.input(ECHO)==1:
            stop = time.time()      # Echo핀 하강 시간값 저장
            
        check_time = stop - start
        distance = check_time * 34300 / 2
        print("Distance : %.1f cm" % distance)
        time.sleep(0.4)
        
except KeyboardInterrupt:
    print("거리 측정 완료 ")
    GPIO.cleanup()

[ 위 코드 다운로드 ]

UltraSonic.zip
0.00MB

 

아래는 초음파 거리측정 회로를 연결한 실제 모습입니다.

이렇게 연결 커넥터(어댑터)를 이용하면 부품을 연결할 때 쉽고 간결하게 작업할 수 있습니다.

또한 핀 레이블이 적혀있어, 잘못 연결되는 실수를 줄일 수 있습니다.

그럼,  실습을 위해 라즈베리파이를 부팅시키세요.

 키보드와 마우스를 직접 연결하여 라즈베리파이에서 코드를 직접 실행시킬 수 있으며, 윈도 PC에서 “원격 데스크톱 연결” 기능을 사용하여 원격으로 실행할 수도 있습니다.
원격 데스크톱 기능을 사용하면 아래 사진처럼, 키보드나 마우스 연결이 필요 없어 Pi 주변이 깔끔해집니다.
물론 랜선 연결 대신, WiFi로 연결하면 더욱 깔끔해지겠죠.

그리고 이때,  네트워크 연결은 PC와 동일한 네트워크로 연결되어 있어야 합니다. 
일반적으로 라즈베리파이가 랜선 연결일 경우 원격 접속하는 PC도 랜선으로 동일한 내부 네트워크로 접속해야 하고, 
WiFi 연결할 경우 동일한 WiFi중계기에 접속된 PC나 노트북 등으로 원결 접속하면 됩니다.

그럼 윈도 PC에서 원격 데스크톱 접속(검색)을 실행시켜 주세요. (라즈베리파이에서 직접 실행시키는 분은 상관없습니다)


컴퓨터 항목에 라즈베리파이가 할당받은 IP주소를 입력하고 연결을 클릭하세요.

라즈베리파이가 할당 받은 IP주소는 사전에 한 번 라즈베리파이로 모니터를 연결하여 파악해 주세요.

ID와 패스워드를 화면처럼 소문자로 입력합니다.

일반적으로 User 이름과 패스워드를 특별히 다른 것으로 변경하지 않았다면, 아이디는  pi  ,  비번은  raspberry입니다.

부팅이 완료되면,   Raspberry Pi Configuration (환경설정) 메뉴로 들어갑니다. 

Interfaces 메뉴로 들어가서 (SSH)를 Enable로 체크해 주세요.

만약 설정이 바뀌었다면 재부팅을 하고 다시 원격으로 연결하세요.

그리고 원격에서 Pi 시작 메뉴의 종료(다시 시작) 메뉴가 작동하지 않는 경우: 원격에서 라즈베리파이를 종료시키는 명령어 (터미널 창 이용)를 사용해 보세요

$ sudo shutdown -h now

그럼 이제, 개발 메뉴에서 Thonny Python IDE를 실행합니다.

토니 파이썬에 코드를 입력하고 실행시켜 봅니다.

그럼, 초음파 센서의 정면으로 평평한 면적의  노트나 박스 같은 것을 준비해서 측정해 보세요.

아래는 실제 측정되는 모습입니다.

만약, 수치가 들쭉날쭉하다면,  초음파가 잘 반사될 수 있도록 센서의 각도와 반사판의 면적이 너무 작지 않은지? 등 확인해 보세요.

네, 이렇게 라즈베리파이에서 초음파 센서(sr-04)를 연결하고, 응용 예시로 거리측정까지 다루어 보았습니다.

 본 게시글의 내용을 따라 하기 쉽도록 영상으로도 만들었으니,  아래 유튜브 영상을 참고해 보세요. 
감사합니다. 

 

 

 

반응형
반응형

라즈베리Pi#21 서보(Servo) 모터 제어하기!  with (파이썬 코드)
RaspberryPi Servo-motor control with Python !

 안녕하세요 라즈이노 IoT 입니다.
이번 시간에는 라즈베리 Pi에서 각도단위로 매우 정확하게 움직이는 서보모터를 파이썬 코드로 제어해보는 실습입니다.
서보 모터는 다양한 곳에 활용하기 좋은 부품이기에, 이번 영상을 학습해 두면,  많은 도움이 되리라 생각됩니다.
이번 영상은 라즈베리pi에 모니터를 연결하지 않고, 윈도PC에서 원격 접속하여 진행합니다. 

만약 원격 접속 제어 방법이 궁금하다면,  라즈이노 ioT(게시글) 블로그와  유튜브 영상을 참고해 주세요.

【라즈베리Pi#19】 윈도 PC에서 라즈베리 Pi 원격 제어하기

[ 윈도 PC에서 라즈베리 Pi 원격 제어하기 - 유튜브 영상으로 보기 ]

  원격접속을 하면,  모니터 및 키보드와 마우스를 추가로 연결할 필요 없고, 멀리 떨어진 임의의 장소에 설치되었더라도, 네트워크만 연결되어 있으면, 제어할 수 있어 활용도가 높은 장점이 있습니다. 

먼저, 윈도 시작 메뉴 검색에서 ‘원격 데스크톱 연결’을 검색해서 실행합니다.

 


  라즈베리pi가 꺼져 있기에 지금은 접속이 되지 않는데요,  라즈베리pi의 전원을 넣어 부팅 시켜 볼게요. 
그리고 랜 케이블(또는 WiFi) 연결하여 네트워크에 접속할 수 있도록 합니다.
중요한 사실은 동일한(공유기) 내부 네트워크에 접속된 상태여야 원격제어가 됩니다. 
또는 외부에서 인지할 수 있는 공인 ip 주소를 할당받은 경우에  접속이 가능한데요,
만약  집에서,  같은 WiFi 공유기라 하더라도, PC(랜선) ↔ 라즈베리pi(WiFi) 연결은, 할당받는 사설 ip 대역이 달라서 접속이 안 될 수 있습니다.
그래서,   PC (LAN) ↔ 라즈베리pi (LAN)  , PC (wifi) ↔ 라즈베리pi (wifi) 연결해 주세요.
먼저, 서보모터를 아래 연결도와 실제 연결 모습을 참고하여 연결해 주세요.

※ 게시글 모든이미지는 클릭하면 확대됩니다

게시글 모든이미지는 클릭하면 확대됩니다



 회로를 연결할  때, +와 -가 합선이 되지 않도록 특별히 주의해주세요 .
합선이 되는 순간, 라즈베리pi가 큰 데미지를 먹게 되어 작동이 안 될 수 있어요.
  가급적이면,  별도의 전원을 준비해서, 아래 처럼 연결해서 사용하는 것이 합선에 대비할 수 있고 안전합니다. 

  그리고, 라즈베리파이의 GPIO핀으로는 출력 전류가 크지 않습니다(약, 50mA) ,  이런 출력을 서보모터 같은 것으로 강하게 뽑아 쓸 경우,  라즈베리파이에 손상을 입힐 수 있기 때문에, 별도의 전원을 달고 모터에 공급해주는 것이 좋습니다.   이 때,  두 전원의 GND는 서로 연결해 주어야 합니다.
 전원은, 보조 배터리나, 리튬이온, AA 건전지도 가능한데요, 약5v 정도를 구성해 주세요.
이때, 라즈베리Pi와 추가 전원의 GND(-)는 서로 연결해 주어야 합니다.  (일부 보조 배터리의 경우 잠시 배터리 사용이 없을 경우 절전 모드로 들어가버려, 전원이 꺼지는 경우가 있을 수 있습니다.  이럴 때는 , 다른 전원을 사용해 보세요)

서보모터 전용 전원을 추가한 연결도

 

그럼, 연결된 라즈베리파이를 부팅해서 네트워크까지 연결 시켜 주세요. 
그리고 처음에 한 번, 라즈베리pi에 모니터를 연결해서 할당 받는 ip 주소를 확인하여 적어두면 좋습니다.

그럼, 아래 이미지 처럼, 이렇게 확인해둔, ip를 입력하고 연결(N)을 클릭하세요.

 아래 이미지와 같은 메시지가 뜨면 예(Y)를 클릭합니다.

 

그럼, 리눅스계열 X윈도 원격 테스크톱 로그인 창이 뜹니다.

그럼,  여러분의 라즈베리파이의 삼바서버 설치 때, 유저(user)생성시 만든 user id와 비번을 입력하면 되는데요,
제 이전 영상에서는 ID와 비번은 아래와 같습니다.
username  : pi     
password  : raspberry  

로그인에 성공하면 아래와 같은 라즈베리파이의 라즈비안 OS의 화면이 열립니다.

그런데,  만약, 패스워드 비번에 문제가 없는데,  로그인이 되지 않는다면, 아래 이미지 처럼 SSH 접속 허용을 해주셔야 합니다.  (만약 SSH 허용 설정이 되지 않았다면, 라즈베리파이에 모니터를 연결하고 직접 로그인하여 설정해야 합니다)

원격접속이 되기 위해서는 사전에 SSH채널 허용함(Enabled)으로 되어 있어야 합니다

 네, 라즈베리 pi로 접속이 잘 된 것을 볼 수 있는데요, 먼저, 파이썬 코드를 작성할 텐데요, 파이썬 코드 작성은 선호하는 편집기나 혹은 메모장으로 작성해도 되는데요, 여기서는 라즈비안OS에 기본 내장된 Thonny Python IDE를 사용해 보겠습니다.
프로그램 위치는 아래 이미지를 참고해 주세요.

Thonny Python IDE 프로그램 실행 모습

먼저 서보 모터의 동작 원리에 대해 간략히 설명드릴게요.  
아래는 일반적으로 많이 사용되는 SG90 서보모터의 스팩입니다.

  서보모터는 DC 모터처럼 빠른 속도로 회전하는 용도로 사용하는 것은 아니며, 일정한 각도와 원하는 위치로 정확한 회전을 하기 위한 곳에 사용되는 모터입니다. 
예를 들어, RC-Car 앞바귀 좌우 회전, 로봇 팔다리 회전, 문 열고 닫기 등 무한 회전보다는 한정된 각도 내에서 정확한 위치제어가 필요한 곳에 많이 사용됩니다.
보다 더  정밀하고 파워를 필요로 곳에는 스텝 모터를 사용하면 되고, 서보모터는 저렴하면서 작은 크기와 낮은 소비전력으로 인해 활용성이 좋습니다. 
보통은, 90도 회전용, 180도 회전용이 주를 이루고 있으나 360도 무한 회전용도 있습니다.

서보모터는 20ms 주기의  펄스파에서 High 신호 파형을 1ms~2ms 범위를 가지고, 회전 각도가 정해지며, 180˚ 서보의 경우, 1ms 신호일 때, 0˚의 위치로 이동하며,  1.5ms 이면 90˚ ,   2ms 일 때 180˚의 위치로 이동하게 됩니다.

그래서,  1ms~2ms의 신호 범위로 0˚~180˚의 각도를 조절하게 됩니다.

단, 일부 서보모터의 경우 1~2ms 작동 범위의 오차가 다소 있으며, 180˚서보의 경우 실제적으로 움직일 수 있는 각도 범위는 2˚~177˚ 이하로 보는 것이 좋습니다.

만약 서보모터가 심하게 떨리는 증상이 있다면, 이 범위를 벗어난 신호 때문일 수 있습니다.

이미지 클릭하여 확대해서 보세요

 라즈베리pi에서 서보모터의 각도 변경은 ChangeDutyCycle (  ) 함수를 사용합니다. 
함수의 인자값으로 사용되는 듀티비는 화면과 같은 수식으로 구할 수 있습니다. 
서보모터를 0˚ 위치로 보내기 위해서는 1ms의 PWM 신호를 넣어주면 되는데요, 
- 1ms는 20ms 신호 주기의 5%에 해당됩니다.
  따라서 ‘5’%라는  인자값을 듀티비 함수에 넣어 주면, 서보모터는 0˚로 이동합니다.

서보모터를 180˚ 위치로 보내기 위해서는 2ms의 PWM 신호를 넣어주면 되는데요, 2ms는 20ms 신호 주기의 10%에 해당됩니다.  
따라서 ‘10’%라는  인자값을 듀티비 함수에 넣어 주면, 서보모터는 180˚로 이동합니다. 마찬가지로, 90˚는  인자값 7.5%를 함수에 넣으면 되고, 나머지 각도 계산도 동일한 방식입니다. 

문제는, 서보모터 제품별로 1ms~2ms(5%~10%) 작동 범위에 오차가 있을 수 있습니다.
실습에 사용된 일부 매우 저렴한 SG90 제품의 경우, 테스트를 해보니,  신호 주기를 0.6ms~2.4ms(3%~12%)의 범위로 하였을 때, 0˚~180˚의 각도 대부분을 제어할 수 있었습니다.  따라서  5%~10% 의 기본값을 적용해 보고  오차가 있을 경우, 듀티비 값을  조금씩  조절해서  각도를 최대로 안정적으로 움직이는 값을 찾아보면 됩니다.

실습 순서와 실습 파일은 화면을 참고하세요.

[ 실습 파일 링크 ] 
실습 파일 6개를 하나로 압축해 놓았습니다.

python-Code.zip
0.01MB

Thonny python IDE  편집기는 기본에 충실하고, 디버깅이 지원되며,  매우 직관적이고 사용법이 간단하여 많이 사용되고 있는 편집기입니다.  그럼, 첫 번째 실습 코드를 직접 작성하거나,  링크한 파일을 여세요. 

### (실습 1) 서보모터 각도 조절해 보기 (0도 위치로 돌리기) , 실습 파일 :  Servo1.py  ###
### 학습 자료 제공 페이지 : Rasino.tistory.com/341
# 서보는 PWM을 20ms(50hz) 주기로 동작시키고 펄스 폭(duty)만 조절해 위치(각도)를 조절함.
# 여기서 duty는 1주기 동안 High를 유지하는 기간이며, 
# 20ms 주기에 100% 면 20ms가 되는 것이고 10% 면 2ms 5% 면 1ms가 됨.
# 펄스 폭은 1ms 일때 0도 2ms 일때 180도, 중간값 1.5ms 일때 90도로 이동함.
# 단, 저렴한 서보는 3%~12%(0도~180도)의 동작 특성을 가짐.
# 만약 모터가 떨린다면, 이 범위를 벗어났기 때문이며, 0도에서 떨린다면
# 3%값에서 조금 올려주고, 180도에서 떨린다면 12%에서 값을 조금 내려주면 됨.

import RPi.GPIO as GPIO
import time

servo_pin = 18

GPIO.setmode(GPIO.BCM)
GPIO.setup(servo_pin, GPIO.OUT)

pwm = GPIO.PWM(servo_pin, 50)  # 50Hz (서보모터 PWM 동작을 위한 주파수)
pwm.start(3.0)  # 0.6ms

time.sleep(2.0)
pwm.ChangeDutyCycle(0.0)

pwm.stop()
GPIO.cleanup()

준비되었으면, 코드를 실행해보세요.
실행하면, 서보의 축이 0˚의 위치로 이동하게 됩니다.
코드에 대한 설명은 주석을 상세히 달아 두었으니 꼭 참고해 보세요.
그럼, 바로 이어서 실습2번 코드를 여세요.

2번 실습은 0˚→90˚→180˚ 단계로 회전을 하되 3회 반복하도록 하였습니다.

### (실습 2-1) 서보모터 각도 조절해 보기 (0도, 90도, 180도 조절하기)  실습 파일 :  Servo2.py ###

import RPi.GPIO as GPIO
import time
servo_pin = 18
GPIO.setmode(GPIO.BCM)
GPIO.setup(servo_pin, GPIO.OUT)
pwm = GPIO.PWM(servo_pin, 50)  # 50Hz (서보모터 PWM 동작을 위한 주파수)
pwm.start(3.0) #서보의 0도 위치(0.6ms)이동:값 3.0은 pwm주기인 20ms의 3%를 의미하므로,0.6ms됨.

for cnt in range(0, 3) :       # 0부터 3미만까지(3번) for문의 내용을 반복
    pwm.ChangeDutyCycle(3.0)   # 서보모터를 0도로 회전(이동)
    time.sleep(1.0)            # 서보 모터가 이동할 시간을 줌
    pwm.ChangeDutyCycle(7.5)  # 서보 모터를 90도로 회전(이동)
    time.sleep(1.0)            # 서보 모터가 이동할 시간을 줌
    pwm.ChangeDutyCycle(12.5)  # 서보 모터를 180도로 회전(이동)
    time.sleep(1.0)            # 서보 모터가 이동할 시간을 줌
    
pwm.ChangeDutyCycle(0.0)

pwm.stop()
GPIO.cleanup()

준비가 되었으면, 2번 코드를 다시 실행해 보세요.

실습 2-1 실행 모습

 

### (실습 2-2) 서보모터 각도 조절해 보기2 (0도, 45도, 90도, 135도 , 180도,...역순으로 조절하기)
조정된 듀티비 약 3%→12%를 적용하였습니다.   

import RPi.GPIO as GPIO
import time
servo_pin = 18
GPIO.setmode(GPIO.BCM)
GPIO.setup(servo_pin, GPIO.OUT)
pwm = GPIO.PWM(servo_pin, 50)  # 50Hz (서보모터 PWM 동작을 위한 주파수)
pwm.start(3.0) #서보의 0도 위치(0.6ms)이동:값 3.0은 pwm주기인 20ms의 3%를 의미하므로,0.6ms됨.
timeA = 0.6

for cnt in range(0, 3) :       # 0부터 3미만까지(3번) for문의 내용을 반복
    pwm.ChangeDutyCycle(3.0)   # 서보모터를 0도로 회전(이동)
    time.sleep(timeA)            # 서보 모터가 이동할 시간을 줌
    pwm.ChangeDutyCycle(5.5)  # 서보 모터를 45도로 회전(이동)
    time.sleep(timeA)            # 서보 모터가 이동할 시간을 줌
    pwm.ChangeDutyCycle(7.5)  # 서보 모터를 90도로 회전(이동)
    time.sleep(timeA)            # 서보 모터가 이동할 시간을 줌
    pwm.ChangeDutyCycle(9.5)  # 서보 모터를 135도로 회전(이동)
    time.sleep(timeA)            # 서보 모터가 이동할 시간을 줌    
    pwm.ChangeDutyCycle(12.5)  # 서보 모터를 180도로 회전(이동)
    time.sleep(timeA)            # 서보 모터가 이동할 시간을 줌
    pwm.ChangeDutyCycle(9.5)  # 서보 모터를 135도로 회전(이동)
    time.sleep(timeA)            # 서보 모터가 이동할 시간을 줌    
    pwm.ChangeDutyCycle(7.5)  # 서보 모터를 90도로 회전(이동)
    time.sleep(timeA)            # 서보 모터가 이동할 시간을 줌
    pwm.ChangeDutyCycle(5.5)  # 서보 모터를 45도로 회전(이동)
    time.sleep(timeA)            # 서보 모터가 이동할 시간을 줌
    pwm.ChangeDutyCycle(3.0)   # 서보모터를 0도로 회전(이동)
    time.sleep(timeA)            # 서보 모터가 이동할 시간을 줌

pwm.ChangeDutyCycle(0.0)
pwm.stop()
GPIO.cleanup()

실습 2-2를 실행한 모습입니다.

 

그리고 마지막 실습 파일 Servo3-3을 여세요.
3%↔12%(0˚↔180˚)의 값을 1%단위로  왕복하도록 구성했습니다.

### (실습 3-1) 서보모터 각도 조절해 보기 (0~180도까지, 1%단위로 조절하기)
조정된 듀티비 약 3%→12% (0˚→180˚)의 값을 1%단위로 움직이도록 하였습니다. 

import RPi.GPIO as GPIO
import time

servo_pin = 18
GPIO.setmode(GPIO.BCM)
GPIO.setup(servo_pin,GPIO.OUT)
pwm = GPIO.PWM(servo_pin, 50)
pwm.start(3.0)

for high_time in range (30, 125):
    pwm.ChangeDutyCycle(high_time/10.0) # for 반복문에 실수가 올 수 없으므로 /10.0 로 처리함. 
    time.sleep(0.02)
    
pwm.ChangeDutyCycle(3.0)
time.sleep(1.0)
pwm.ChangeDutyCycle(0.0)

pwm.stop()
GPIO.cleanup()

실습 3-1 실행 모습

 

### (실습 3-2) 서보모터 각도 조절해 보기 (0~>180도 까지만 1%씩 움직이기 x 3회)

 

import RPi.GPIO as GPIO
import time

servo_pin = 18
GPIO.setmode(GPIO.BCM)
GPIO.setup(servo_pin,GPIO.OUT)
pwm = GPIO.PWM(servo_pin, 50)
pwm.start(3.0)

for i in range (0,3) :    
    for high_time in range (30, 125):
        pwm.ChangeDutyCycle(high_time/10.0) # for 반복문에 실수가 올 수 없으므로 /10.0 로 처리함. 
        time.sleep(0.02)
    
    pwm.ChangeDutyCycle(3.0)    
    time.sleep(1.0)
    
pwm.ChangeDutyCycle(0.0)
pwm.stop()
GPIO.cleanup()

실습 3-2 실행 모습

 

### (실습 3-3) 서보모터 각도 조절해 보기 (0↔180도 1% 단위로 왕복 움직이기 x 3회)

import RPi.GPIO as GPIO
import time

servo_pin = 18
GPIO.setmode(GPIO.BCM)
GPIO.setup(servo_pin,GPIO.OUT)
pwm = GPIO.PWM(servo_pin, 50)
pwm.start(3.0)

for i in range (0,3) :    
    for high_time in range (30, 125):
        pwm.ChangeDutyCycle(high_time/10.0) # for 반복문에 실수가 올 수 없으므로 /10.0 로 처리함. 
        time.sleep(0.02)
 
    for high_time in range (124, 30,-1):
        pwm.ChangeDutyCycle(high_time/10.0) # for 반복문에 실수가 올 수 없으므로 /10.0 로 처리함. 
        time.sleep(0.02)
        
pwm.ChangeDutyCycle(0.0)
pwm.stop()
GPIO.cleanup()

실습 3-3 실행 모습

그리고, 터미널 창을 통해 명령어로 파일을 실행시켜 볼 수 있습니다.
우선, 파일 탐색창을 열어 파이썬 파일을 저장한 위치를 먼저 확인해보면 찾기 쉽습니다.
터미널 창을 열고, 리눅스 명령어를 사용하여, python 실습 파일이 저장된 위치로 이동하세요.



그리고, 아래 처럼, 파이썬 실행 명령으로 실행 시키면, 서보모터가 동작하는 것을 볼 수 있습니다.

명령어 : sudo python3  파일명
$ sudo python3  Servo3-2.py

【 설명 내용 영상으로 시청하기 】


네, 이렇게 해서 서보모터를 라즈베리pi에서 제어하기 위한 전반적인 내용을 다루었고,
파이썬 코드를 이용해서 직접 제어해 보았습니다.
감사합니다.

반응형
반응형

라즈베리Pi#20피에조 부저 사용하기!  with (파이썬 코드)
RaspberryPi Buzzer control with Python !

 안녕하세요 라즈이노 IoT 입니다.
이번 시간에는 라즈베리 Pi에서 부저를 사용해 보는 실습을 진행합니다.
GPIO 출력을 제어하여 부저를 울리는 방법을 설명드리며, 
주파수를 이용하여 음의 높낮이를 조절할 수 있기에, 실습5 에서는 간단한 동요를 출력해 보겠습니다.


1.  음계(Scale)와 옥타브(Octave)

  음계란, 음악에 쓰이는 음을 높이의 차례대로 배열한 음의 층계를 말합니다.   
음 높이는 Pitch.    

음계(Scale)

  "도, 레, 미, 파, 솔, 라, 시, 도" 의 8가지 음계를 옥타브라고 합니다.  즉, 옥타브는 어떤 음에서 완전 8도의 거리에 있는 음까지를 말하며, 물리학적으로는 주파수(진동수)가 두 배 차이나는 두 음 사이의 음정을 말하는데,  예를 들어, 음높이가 400Hz인 음과  800Hz인 음 사이의 음정은 옥타브라고 말하며, 인간의 귀는 이 두 음을 높이는 다르지만 서로 같은 음으로 인식합니다.  (예, 낮은 '도'와 높은'도',  낮은 '솔'과 높은 '솔')

옥타브
8 옥타브



2.  소리와 주파수 (음계 별 표준 주파수)


스피커나 부저를 통해서 듣게 되는 음도, 진동판의 떨림(주파수)에 의해 들을 수 있게 되는데요, 1초(Second)에 1회의 떨림을 1Hz라 부르며,  1초에 100회면 100Hz라 말합니다.  떨림(주파수)이 낮을수록 낮은음을 내게 되며, 높을수록 늪은 음을 내게 됩니다. 
음악에 사용되는 악기들의 종류는 매우 다양하고 많지만, 합주를 했을 때 음의 일치가 되는 이유는,  각각의 음 높이가 특정 주파수로 정리되었기에 가능합니다. 
아래가 각 음계 별 표준 주파수입니다.

이미지 참조 : control.cntc.ac.kr/cpu

 그럼, 이 번 실습에서 각 음계 별 주파수를 참고하여, 적당히 반올림한 수를 코드에 적용하면, 해당음의 소리를 출력할 수 있게 됩니다.   

 

 3. 부저의 종류와 특징 : 


    - Passive type : 전원만 가해서는 소리가 나지 않고, PWM 형태의 일정한 주파수일 때 소리가 나는 타입.
    - Active type : 전원만 연결해 주면 소리가 나는 타입.

위 이미지에서 녹색의 기판이 보이는 부저가 (좌) 패시브 타입이며,  PWM처리 회로를 내장하여 검은색으로 마감 처리한 부저가 (우) 액티브 타입 부저입니다.

  라즈베리 Pi의 포트에서 High 신호를 내보내어 직접 부저를 울릴 수도 있지만, 출력이 약할 수 있고, 포트를 통한 직접적인 출력을 제한하기 위해,  아래와 같은 Low level trigger 방식을 사용할 수 있습니다. 
이 방식은, GPIO 포트를 통한 직접적인 출력을 사용하지 않고, VCC 전원을 사용하게 함으로, 포트를 보호하게 되며, 부저에 충분한 전류를 공급할 수 있게 합니다. 

(Low level trigger 부저 연결회로도와 연결도)

 회로 연결을 보면, 입출력(I/O) 부분이 Low 신호가 되면, TR이 작동(스위치 On) 되어, VCC(+), Buzzer로 이어지는 전류가 E(에미터) - C(컬렉터)로 빠져나가면서, Buzzer를 울리게 됩니다.  그래서 이런 작동 형태를 '로우-레벨-트리거'(Low level trigger)라 말합니다.  
TR은 위 회로 기준으로,  가지고 있는 PNP타입의 TR 어떤 것이든 사용 가능합니다.
TR의 경우는  NPN 타입과 PNP타입으로 나뉘는데요,   PNP 타입도 제품 품번마다 E(에미터),  B(베이스),  C(컬렉터) 핀의  위치가 다르기 때문에  자신이 사용하는 TR의 스펙을 확인(검색 가능)해서 연결하면 됩니다. 

(좌)NPN 타입과  (우)PNP 타입 참고 이미지

즉,  같은 PNP 타입의 TR이라 하더라도, 위 이미지처럼, A1015품번의 경우 핀이 E C B의 순으로 되어 있지만,  
또 다른 PNP타입의 A9012 TR의 경우 핀 순서는 E B C로 되어 있습니다. (핀 배열 구분 주의!)   

또한 아래처럼,  액티브 타입 부저를 '로우-레벨-트리거' 방식으로 모듈화 한 제품도 있으니 참고하세요.
그림에 보면 TR과 저항이 내장되어 있습니다.(Low level trigger 방식)

모듈형 액티브 타입 부저

 

4.  라즈베리파이+부저 연결도 (실습을 위한 연결 도면)


 기본적으로 아래처럼 라즈베리 Pi 포트 출력으로 직접 부저를 작동시키는 연결을 하면 됩니다. 

또는 아래와 같이 TR과 저항을 이용한 Low level trigger 방식의 연결을 하여도 됩니다.  
이때, 사용한 TR은 PNP 타입의 A1015 품번을 사용했습니다. PNP타입의 다른 품번을 사용해도 되며, 이때는 ECB의 핀 배열이 다를 수도 있으니, 해당 TR의 스펙을 확인해 보세요.

 

또한 아래처럼, TR과 저항이 내장되어 모듈화 된 부저 모듈을 사용하여 간편하게 연결할 수도 있습니다.



부저를 이용한 실습

  (실습 1) 부저 1회 울리기

 : 아래 코드를 작성하여 동작시켜 보세요. 
부저가 1.5 동안 1회 울리고 종료됩니다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import RPi.GPIO as GPIO
import time
 
buzzer = 18
GPIO.setmode(GPIO.BCM)
GPIO.setup(buzzer, GPIO.OUT)
GPIO.setwarnings(False)
 
pwm = GPIO.PWM(buzzer, 262) # '262'는 음의 높이에 해당하는 특정 주파수
pwm.start(50.0)
time.sleep(1.5) # 1.5초간 음이 울리도록 시간지연
 
pwm.stop()
GPIO.cleanup()
cs

 

 (실습 2) 부저로 '도, 레, 미' 음 3회 반복 울리기

 : 아래 코드를 작성하여 동작시켜 보세요. 
부저가 1.0초 간격으로 도, 레, 미 음을 3번 반복한 후 종료됩니다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import RPi.GPIO as GPIO
import time
 
buzzer = 18
GPIO.setmode(GPIO.BCM)
GPIO.setup(buzzer, GPIO.OUT)
GPIO.setwarnings(False)
 
pwm = GPIO.PWM(buzzer, 1.0)  # 초기 주파수 설정을 1Hz로 함.
pwm.start(50.0)
 
for cnt in range(0,3):
    pwm.ChangeFrequency(262)   # 262는 4옥타브의 '도'에 해당되는 주파수 
    time.sleep(1.0)
    pwm.ChangeFrequency(294)   # 294는 4옥타브의 '레'에 해당되는 주파수 
    time.sleep(1.0)
    pwm.ChangeFrequency(330)   # 330은 4옥타브의 '미'에 해당되는 주파수 
    time.sleep(1.0)
 
pwm.ChangeDutyCycle(0.0)
 
pwm.stop()
GPIO.cleanup()
 
 
cs

 

 (실습 3) 부저로 '도레미파솔라시도' 음계 출력하기

 : 아래 코드를 작성하여 동작시켜 보세요. 
부저가 4옥타브 영역의 주파수인 '도, 레, 미, 파, 솔, 라, 시, 도' 음을 출력한 후 종료됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import RPi.GPIO as GPIO
import time
 
buzzer = 18
GPIO.setmode(GPIO.BCM)
GPIO.setup(buzzer, GPIO.OUT)
 
pwm = GPIO.PWM(buzzer, 1.0)   # 초기 주파수를 1Hz로 설정
pwm.start(50.0)               # 듀티비를 50%로 설정
 
scale = [262294330349392440494523]
 
for i in range(0,8):
    pwm.ChangeFrequency(scale[i])
    time.sleep(1.0)
 
pwm.stop()
GPIO.cleanup()
 
cs

 

(실습 4) 부저로 '도-레-미-파-솔-라-시- 도 -시-라-솔-파-미-레-도' 음계 출력하기

 : 아래 코드를 작성하여 동작시켜 보세요. 
부저가  '도, 레, 미, 파, 솔, 라, 시, 도' 음을 올리고 다시 내리는 형태로 출력합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import RPi.GPIO as GPIO
import time
 
buzzer = 18
GPIO.setmode(GPIO.BCM)
GPIO.setup(buzzer, GPIO.OUT)
 
pwm = GPIO.PWM(buzzer, 1.0)   # 초기 주파수를 1Hz로 설정
pwm.start(50.0)               # 듀티비를 50%로 설정
# 4옥타브 주파수 : 도(262)/레(294)/미(330)/파(349)/솔(392)/라(440)/시(494)/도(523)  
scale = [262294330349392440494523]
 
for i in range(0,8):
    pwm.ChangeFrequency(scale[i])
    time.sleep(1.0)
 
 
for i in range(7,-1,-1):
    pwm.ChangeFrequency(scale[i])
    time.sleep(1.0)
    
pwm.stop()
GPIO.cleanup()
 
cs

 

(실습 5) 부저로 '반짝반짝 작은 별' 동요를 출력해 봅니다.

 : 아래 코드를 작성하여 멜로디를 출력해 보세요.
부저가  '반짝 반짝 작은별' 계이름을 울리고 종료하도록 합니다. 
아래,  '작은 별' 악보를 참고하세요.  실습을 이해한 후, 다른 곡도 코딩하여 연습해 보세요.

작은 별 악보
작은 별 계이름
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
26
27
28
29
import RPi.GPIO as GPIO
import time
 
buzzer = 18
GPIO.setmode(GPIO.BCM)
GPIO.setup(buzzer, GPIO.OUT)
 
pwm = GPIO.PWM(buzzer, 1.0# 초기 주파수를 1Hz로 설정
pwm.start(90.0) # 듀티비를 90%로 높여 설정함(음 구분이 더 잘되고 조금 더 부드럽게 들림)
 
# == 동요 : 반짝 반짝 작은별 계이름 ==
#도도솔솔라라솔파파미미레레도 솔솔파파미미레 솔솔파파미미레 도도솔솔라라솔파파미미레레도
 
# 4옥타브:도(1)/ 레(2)/ 미(3)/ 파(4)/ 솔(5)/ 라(6) / 시(7)  
scale = [ 262 , 294  , 330 ,  349 , 392 ,  440 ,   494 ]
twinkle = [ 11556654433221, \
            55443325544332, \
            11556654433221 ]
try :
    for i in range(0,42):
        pwm.ChangeFrequency(scale[twinkle[i]])
        if i==6 or i==13 or i==20 or i==27 or i==34 or i==41:
            time.sleep(1.0)   # 2분음표 부분을 모두 1초로 출력
        else :
            time.sleep(0.5)   # 기타 4분음표는 모두 0.5초로 출력함 
    pwm.stop()
 
finally :
    GPIO.cleanup()
 
cs

 

자, 어떠신가요?   비록 단순 부저여서 음질이 좋지는 못하지만, 음 고유의 주파수를 이용하여 동요나 가요의 멜로디를 얼마든지 연주할 수 있습니다.

그럼, 아래 전체 과정을 담은 동영상을 함께 보면서 실습해 보세요. 

라즈베리파이에 부저 사용하기 영상으로 학습하기

 

반응형