Node Red를 사용한 Raspberry Pi 코딩 : 신호등

Node RED는 특히 하드웨어 장치에서 입력을 제어하거나 수신하기 위해 Raspberry Pi에서 사용할 때 한동안 저에게 관심이있는 도구입니다. 우수한 Low Voltage Labs 신호등을 사용하여 Raspberry Pi에서 GPIO 핀을 제어하는 ​​방법을 보여주는 일련의 게시물의 일부로 Node RED 로이를 수행하는 방법을 확인하기로 결정했습니다 .

다른 프로그래밍 환경에서 동일한 신호등을 제어하는 ​​데 관심이 있다면 다른 기사를 확인하십시오.

Node RED는 이벤트 기반 애플리케이션을위한 "로우 코드"프로그래밍 환경입니다. 컴파일러 또는 인터프리터를 통해 실행하기 전에 일련의 소스 파일에 모든 로직을 작성하는 대신 연결된 "노드"의 순서도로서 Node RED 애플리케이션을 빌드합니다. Node.js 런타임 위에 구축 된 Node RED는 브라우저에서 이러한 흐름을 구축 할 수있는 그래픽 환경을 제공합니다. 흐름의 일부 노드에는 고정 된 용도가 있고 다른 노드는 속성 양식을 사용하여 구성 할 수 있으며 일반 JavaScript / Node.js 논리를 작성하여 노드의 동작을 구현할 수도 있습니다. 노드는 JSON 메시지로 데이터를 전달합니다.

일반 컴퓨터에서 Node RED를 사용할 수 있지만 Raspberry Pi에서 시도하여 Pi의 GPIO 핀을 사용하는 애플리케이션 개발을 위해 제공하는 기능을 확인하고 싶었습니다.

프로젝트 개요

평소처럼 손에 들고 있던 신호등 LED를 사용하여 영국 신호등 패턴을 모델링하기로 결정했습니다. 그것에 익숙하지 않은 사람들을 위해 영국에서는 신호등이 다음과 같이 순환합니다 ( 고속도로 코드 참조 ).

  • 스타트
  • 빨간색 만 : 그만!
  • 빨간색과 노란색 (황색) : 그만! (그러나 빛이 곧 ...)
  • 녹색 만 해당 : 길이 맑으면주의해서 진행하십시오!
  • 노란색 (황색) : 이미 정지선을 통과 한 경우 턴을 완료하고 아직 통과하지 않았다면 정지선을 넘지 마십시오.
  • 시작으로 이동
여기서 우리가 구축 할 것…

제 목표는 경험이없는 상태에서 작동하는 신호등 시퀀스로 빠르게 이동할 수 있는지 확인하는 것이 었습니다. 이 방법을 비디오 튜토리얼로보고 싶으 시다면 제가 따라 가면서 만들었습니다.

시작하기

그래픽 데스크톱 환경이 필요하지 않았기 때문에 Raspbian lite 운영 체제와 함께 Raspberry Pi 3를 사용했습니다. 신호등은 Pi의 GPIO 핀 4 개에 연결됩니다. 이들 중 하나는 접지 핀이어야하고 나머지 세 개는 세 개의 LED 조명을 각각 제어하는 ​​데 사용됩니다. 저는 GPIO 핀 9, 10, 11에 저를 연결했습니다. 또한 Pi를 제 무선 네트워크에 연결 한 다음 여기에 최신 버전의 Node.js를 설치했습니다.

Pi에서 운영 체제를 설정하고 조명을 GPIO 핀에 연결하는 방법을 보려면 이에 대한 전체 연습이 포함 된 이전 기사 를 확인하십시오 .

Node RED를 사용하려면 먼저 설치해야합니다! SSH로 Pi에 연결되면 Node RED가 npm을 사용하여 설치됩니다.

$ sudo npm install -g --unsafe-perm node-red

$ node-red

http://<IP Address of Raspberry Pi>:1880/

신호등 흐름 구축

Node RED를 처음 시작하면 다음과 같은 빈 흐름 작업 공간이 표시됩니다.

Node RED의 빈 흐름.

이것은 드래그 앤 드롭 인터페이스이며 왼쪽에있는 사용 가능한 옵션에서 흐름에 대한 노드를 선택합니다.

신호등 상태 모델링

우리는 애플리케이션의 상태가 무엇인지 이미 알고 있습니다. 신호등은 빨간색, 빨간색 + 노란색, 녹색 또는 노란색 상태 일 수 있습니다. "함수"노드를 사용하여 Node RED에서 이들 각각을 모델링 할 것입니다. 함수 노드를 사용하면 그것이 나타내는 흐름의 단계에 대해 임의의 JavaScript 코드를 작성할 수 있으며 나중에 수행 할 것입니다. 따라서 왼쪽 영역에서 각 상태의 흐름으로 함수 노드를 드래그합니다.

기능 노드 추가.

보시다시피 각 상태에서 어떤 조명이 켜져 있어야하는지 보여주기 위해이 노드의 이름을 지정했습니다. 이를 수행하려면 노드를 클릭하고 나타나는 대화 상자에서 이름을 설정하십시오. 우리는 아직 대화창의 "기능"부분에 코드를 추가하는 것에 대해 걱정하지 않을 것입니다.

함수 노드 이름 지정.

신호등은 한 상태에서 다른 상태로 즉시 전환되는 것이 아니라 일반적으로 상태간에 가변적 인 지연이 있습니다. 빨간색과 노란색 상태로 전환되기 전에 빨간색 표시등이 몇 초 동안 켜져 있고 빠르게 녹색 등으로 바뀝니다. 노드 RED에는이를 모델링하는 데 사용할 수있는 "지연"노드가 있습니다. 여기에서는 각 상태 후 지연 노드를 흐름으로 드래그했습니다.

지연 노드 추가.

각 지연의 기본값은 5 초입니다. 신호등이 작동하는 방식이 아니기 때문에 모든 지연 노드가 이와 같은 시간 동안 대기하는 것을 원하지 않습니다. 나중에 돌아와서 수정하겠습니다.

국가를 함께 연결

지금 당장은 흐름을 위에서 아래로 읽어서 상태의 순서를 추론 할 수 있습니다. 빨간색, 지연, 빨간색, 노란색, 지연 등. 인간으로서 우리는 조명 시퀀스가 ​​상단의 빨간색 상태로 돌아갈 것임을 알고 있습니다. 하단의 지연이 끝났을 때. 노드 RED는 화면에 노드의 배치가 완전히 임의적이기 때문에이 사실을 알지 못합니다.

Node RED에게 각 노드가 다른 노드와 어떻게 관련되는지 알려주려면 그 사이에 "커넥터"를 추가해야합니다. 각 노드의 오른쪽에있는 원형 아이콘을 클릭하고 연결선을 다음 노드의 왼쪽에있는 원형 아이콘으로 끌어 커넥터를 추가합니다. 오른쪽은 출력용이고 왼쪽은 입력 용입니다. 여기에서 모든 것을 연결했으며 오른쪽으로 이동하여 빨간색 상태의 흐름을 따르고 결국 빨간색으로 돌아올 때까지 계속할 수 있습니다.

커넥터 추가.

우리는 이제 무한 루프를 가지고 있지만, 한 번은 실제로 우리가 달성하고 싶었던 것입니다. :)

상태 전환 지연 구성

길이가 모두 같지 않도록 지연을 수정합시다. 지연 노드를 클릭하면 속성 대화 상자가 표시됩니다. 여기에서 지연 시간을 변경할 수 있습니다.

지연 구성.

나는 빨강과 빨강과 노랑 사이에 3 초 지연, 녹색 이전에 1 초 지연, 녹색 이후 5 초 지연을 유지했습니다. 마지막으로 빨간색으로 다시 전환하기 전에 노란색 사이의 지연 시간을 2 초로 줄였습니다. 지연 노드 시간을 변경하면 흐름의 레이블이 업데이트되어 새로운 지연도 표시됩니다. 따라서이를 확인하기 위해 속성 대화 상자를 파헤칠 필요가 없습니다!

어디서 시작하나요?

모든 것이 연결되어 있고 원하는 방식으로 지연을 구성 했으므로 흐름을 실행할 때 신호등처럼 작동하는 현실적인 전환 세트를 얻어야합니다. 그러나 Node RED에게 흐름이 실제로 시작되는 위치를 알려주는 것은 없습니다. 빛이 빨간색 상태로 시작한다는 것을 알고 있지만이를 알려줄 필요가 있습니다. 이를 위해 "inject"노드를 추가하고이를 빨간색 상태에 연결합니다.

주입 노드 추가.

다른 노드와 마찬가지로 주입 노드를 클릭하면 속성 대화 상자가 표시됩니다. 0.1 초 후에 주입 노드를 한 번 실행하도록 설정했습니다. 따라서 흐름을 시작하면 주입 노드로 시작하고 거의 즉시 빨간색 함수 노드 / 상태로 이동하고 거기에서 커넥터가 설명하는 무한 루프로 들어갑니다.

이제 영국 패턴 신호등의 작동을 설명하는 Node RED에 유한 상태 머신 을 기본적으로 구축했습니다 . 우리가 아직 수행하지 않은 것은 LED 신호등 LED를 각 상태에 대해 적절하게 켜거나 끄도록 설정하는 Raspberry Pi 전용입니다. 다음에 그것을 다루겠습니다.

빛을 비출 시간

Low Voltage Labs 신호등 LED 세트를 구성하는 3 개의 표시 등 각각은 GPIO 핀을 사용하여 Pi에 연결됩니다. Pi GPIO 핀은 입력 (버튼 또는 스위치 생각) 또는 출력 (부저 또는 조명 생각)에 사용할 수 있습니다. 이 경우 세 가지 출력이 있습니다. Pi에 설치할 때 Node RED는 GPIO 입력 및 출력을위한 노드와 함께 제공됩니다. 세 개의 출력 노드를 작업 공간으로 드래그하려고합니다.

GPIO 출력 노드 추가.

그런 다음 각각을 클릭하여 속성을 구성합니다.

GPIO 출력 노드 구성.

여기에서 GPIO 핀을 핀 9로 설정했습니다 (빨간색 LED가 여기에 연결됨). 또한 시작시 초기 상태를 0 (꺼짐)으로 설정하고 노드 이름을 "Red"로 지정했습니다. 노란색은 핀 10에, 녹색은 11에있는 다른 두 개에 대해서도 똑같이 할 것입니다. Node RED에는 Pi 보드 자체의 핀의 물리적 구성과 일치하는 멋진 테이블 레이아웃이 있습니다.

이 시점에서 왼쪽의 상태 머신 노드와 오른쪽의 LED 하드웨어를 나타내는 노드 사이에는 연결이 없습니다. 상태를 나타내는 각 기능 노드는 세 개의 GPIO 출력 노드 모두에 정보를 전달하여 해당 상태에서 LED를 켜야하는지 꺼야하는지 알려야합니다.

기능 노드 중 하나를 클릭하면 해당 속성이 표시됩니다. "빨간색"기능 노드를 선택하면 "빨간색" msg.payload상태에있을 때 3 개의 LED 각각이 있어야하는 상태를 설명하는 개체 에 설정할 코드를 추가 합니다. (노드 RED는 노드가 payload키가 포함 된 메시지 객체를 반환하여 통신 할 것으로 예상 합니다) :

함수 노드의 메시지 페이로드 구성.

따라서 빨간색 상태의 코드는 다음과 같습니다.

msg.payload = { "red": 1, "yellow": 0, "green": 0 };
return msg;

msg.payload = { "red": 1, "yellow": 1, "green": 0 };
return msg;

각 GPIO 출력 노드 "앞에"필요한 것은 조명의 전체 상태를 설명하는 객체를 수신하고 값 중 하나만 GPIO 출력 노드에 전달하는 또 다른 함수 노드입니다. 따라서 상태 머신 노드와 GPIO 노드 사이에 3 개의 함수 노드를 추가합니다. 이 중 하나는에서 red값을 msg.payload, 다른 하나 yellowgreen. 그런 다음 각각은 페이로드가 해당 값인 메시지를 반환합니다. 그러면 관련 GPIO 출력 노드에 직접 연결할 수 있습니다. 여기에서는 빨간색 값을 빨간색 GPIO 출력 노드에 전달할 함수 노드를 구성합니다.

빨간색 값만 전달합니다.

상태 개체에서 노란색 및 녹색 값을 가져 오기 위해 유사한 함수 노드를 추가 한 다음 해당 출력을 GPIO 출력 노드의 입력에 연결하면 다음과 같습니다.

각 LED의 상태를 읽기 위해 노드를 추가했습니다.

다음으로 우리는 마지막 연결을해야합니다! 왼쪽에있는 각 상태는 "Get Red", "Get Yellow"및 "Get Green"노드 각각에 연결되어야 LED의 전체 상태를 포함하는 메시지가 각각에 전송됩니다. 각 상태 함수 노드의 오른쪽에서 3 개의 "Get…"함수 노드 각각에 커넥터를 추가하여이를 수행합니다. 다이어그램은 약간 지저분 해지지 만 완료되면 다음과 같이 보입니다.

이제 모든 것이 연결되었습니다!

모든 준비가 완료되었지만 LED 조명 동작을 볼 수 있도록 어떻게 설정하고 실행합니까?

흐름 실행

드디어 흐름을 실행할 시간입니다! 이를 위해 "배포"버튼을 클릭합니다.

흐름 배포.

노드 RED는 수집 노드에서 시작하여 구성한 0.1 초 동안 기다린 다음 빨간색 상태 노드를 실행하고 커넥터를 따릅니다. 빨간색 상태 노드는 빨간색 표시등 만 1로 설정된 메시지 객체를 방출하며, 이는 세 개의 "Get…"노드 모두로 이동합니다. 그들은 그들이 나타내는 LED에 대한 메시지의 일부를 읽고 관련 GPIO 출력 노드로 전송되는 0 또는 1로 변환합니다. 그 동안 흐름의 상태 시스템 부분은 다음 상태로 이동하기 전에 구성된 시간 (초) 동안 지연 노드에 있습니다. Node RED는 파란색 사각형을 사용하여 주어진 시간에 어떤 노드가 활성 상태인지를 보여 주며, 각 옆에 상태가 표시 될 때 GPIO 핀이 0 (꺼짐) 또는 1 (켜짐)으로 설정되어 있는지 확인할 수 있습니다.

효과가있다!

이제이 예제가 빌드 된 방법에 대해 읽었습니다.이 빌드의 비디오 버전을보고 각 전체 단계를 수행하는 것을 볼 수 있습니다.

처음부터 자신의 흐름을 구축하지 않고이 프로젝트를 시도하고 싶다면 Node RED의 내보내기 옵션 (메인 메뉴에 있음)을 사용하여 JSON 파일을 생성하고 GitHub에서 사용할 수 있도록했습니다 . 이것을 가져 와서 가져 오기 옵션 (메인 메뉴에도 있음)을 사용하여로드하고 자신의 Pi에서 사용해 볼 수 있어야합니다. 또한 이것은 Node RED를 사용하려는 첫 번째 시도 였으므로 내가 잘못하고 있다고 생각하고 더 나은 아이디어를 제공 할 수 있다면 댓글에서도 듣고 싶습니다!

이 기사와 함께 제공되는 비디오를 즐기 셨기를 바랍니다. 더 많은 Raspberry Pi, IoT 및 일반 코딩 콘텐츠에 관심이 있으시면 Twitter에서 저를 팔로우 하십시오.

Suggested posts

React 자습서가 가르치지 않는 5 가지 주요 교훈

React 자습서가 가르치지 않는 5 가지 주요 교훈

React 개발자가 알아야 할 필수 개념과 교훈이 많이 있지만 대부분의 튜토리얼에서는 다루지 않습니다. 나는 당신이 알아야 할 가장 중요한 주제 중 일부를 직접 골랐지만, 자세히 다루기 위해 시간을 할애 한 기사는 거의 없습니다.

Express.js 시작하기

Express.js 시작하기

Express는 웹 및 모바일 앱을 만드는 경험을 즐겁게 만드는 기능 세트가 포함 된 Node.js 프레임 워크입니다.

Related posts

성능 최적화 된 A / B 테스트 솔루션

성능 최적화 된 A / B 테스트 솔루션

의제 : 소개 : TL;하지만 읽을 수 있습니다. A / B 테스트, CloudFront 및 Lamba @ edge에 대해 이미 알고있는 경우 AWS Lambda @ edge를 사용한 A / B 테스트로 직접 이동하십시오. A / B 테스트 란 무엇입니까? A / B 테스트는 웹 사이트의 두 가지 버전에 대한 사용자의 참여를 비교하는 데 초점을 맞춘 UX 연구 방법론입니다.

fp-ts (Typescript)에서 Option 및 둘 중 하나 사용

저는 함수형 프로그래밍을 좋아합니다. 몇 년 동안 실수를하거나 토끼 구멍을 뚫는 것으로부터 저를 몇 번 구해 주었기 때문입니다. 동일한 입력이 주어지면 출력이 항상 동일하다는 것을 알면 안심입니다.

Syncfusion Blazor 파일 업로드 구성 요소에서 이미지를 미리 보는 방법

Syncfusion Blazor 파일 업로드 구성 요소에서 이미지를 미리 보는 방법

Syncfusion Blazor 파일 업로드는 하나 이상의 파일, 이미지, 문서, 오디오, 비디오 및 기타 파일을 서버에 업로드하기위한 구성 요소입니다. 여러 파일 선택, 진행률 표시 줄, 자동 업로드, 끌어서 놓기, 폴더 (디렉터리) 업로드, 파일을 포함하는 다양한 기능을 갖춘 HTML5 업로드 구성 요소 (<input type =”file”>)의 확장 버전입니다. 검증 등.

6 React 개발자로서 후회

내가 일찍했으면하는 것

6 React 개발자로서 후회

React는 배울 수있는 훌륭한 도구입니다. 그것은 우리가 우리 자신의 방식으로 일을 할 수있게합니다.