이 블로그는 Web 환경을 이용한 원격 제어 기술에 필요한 지식을 공유 하기 위한 블로그 입니다.
실제 개발과 프로그램 예를 위하여 Raspberry Pi와 Raspberry Pi Pico, ATmega128 보드, Arduino Mega 보드(ATmega2560), WiFi 모듈을 사용 합니다.

raspi-node-GPIO

Node.js - Raspberry PI GPIO
Node.js 환경에서 Raspberry Pi GPIO(General Purpose Input Output)


  • Raspberry Pi GPIO(General Purpose Input Output)
    • Raspberry Pi에는 외부 장치와 연결을 위한 2줄의 GPIO Pin(40 Pin)이 준비되어 있다.

      Output pin은 Low(0V) 또는 High(3.3V) 값을 출력 하여 LED와 같은 외부 장치를 제어 할 수 있다.

      Input pin은 Pin의 상태 Low(0V) 또는 High(3.3V) 값을 입력 받을 수 있기 때문에 Push button switch 등의 상태를 입력 받을 수 있다.

    • Raspberry Pi 3의 GPIO Header
    • Raspberry Pi 3의 GPIO Header의 Pin 배치는 아래 그림과 같다.


    • onoff Module 설치 하기
    • Raspberry Pi의 GPIO Pin을 Node.js 환경에서 On, Off 제어 하기 위하여 onoff module을 이용 한다.

      • 다음 명령으로 onoff module을 설치 한다.
      • npm install onoff

      • 다음 명령으로 onoff module 설치 정보를 package.json파일에서 확인 한다.
      • cat package.json


  • Raspberry Pi LED 제어하기
    • Breadboard를 이용하여 Raspberry Pi와 LED를 다음과 같이 연결 한다
      • Raspberry Pi Pin11(GPIO17)과 330옴 저항,
      • 330옴 저항과 LED의 + 단자,
      • LED의 - 단자을 Breadboard의 GND 에 연결 한다.
      • Raspberry Pi의 GND(Pin9)과 Breadboard GND를 연결 한다.
      • Raspberry Pi와 LED, Button switch의 연결 사진(이 실험에서는 LED만 사용함)

      주: 아래와 같이 Raspberry Pi 터미널을 이용하는 것 보다 "원격 컴퓨터에서 PuTTY(SSH 프로토콜 이용)를 사용한 개발 환경"를 참고하여 Windows PC에서 PuTTY를 사용한 개발 환경을 이용하는 것이 더 편리하다.

    • 다음 명령으로 Node.js scripts를 저장할 Directory를 만든다.
    • mkdir nodetest

    • 다음 명령으로 nodetest Directory로 이동 한다.
    • cd nodetest

    • 다음 명령으로 Nano Editor를 사용하여 blink-led.js File을 만든다
    • nano blink-led.js

    • Nano Editor를 사용하여 blink-led.js File을 아래와 같이 편집 한다.
    • blink-led.js

      
      // onoff Module의 Gpio class를 Include 한다.
      var Gpio = require('onoff').Gpio;
      // GPIO17를 Output port로 사용한다.
      var LED = new Gpio(17, 'out');
      //blinkLED function을 500ms 주기로 실행한다.
      var blinkInterval = setInterval(blinkLED, 500);
      
      // LED를 blinking 하는 함수
      function blinkLED() {
        //check the pin의 상태를 check 한다. 만약 현재 상태가 0 이면(off),
        if (LED.readSync() === 0) {
          // LED를 Turn on(1) 한다.
          LED.writeSync(1);
        } else {
          // 만약 LED가 Turn on(1) 상태이면 LED를 Turn off 한다.
          LED.writeSync(0);
        }
      }
      
      // LED의 blinking 동작을 정지하는 함수
      function endBlink() {
        // Blink 주기를 결정하는 Interval timer를 정지 시킨다.
        clearInterval(blinkInterval);
        // LED를 Turn off 한다.
        LED.writeSync(0);
        // LED Port(GPIO17)를 해제한다.
        LED.unexport();
      }
      
      // 10초 후에 Blinking 동작을 정지한다.
      setTimeout(endBlink, 10000);
          

    • blink-led.js 프로그램 편집이 완료되면 "Ctrl+x"를 Press 하여 Code를 Save 하고 Nano Editor를 종료 한다.
    • 다음 명령으로 blink-led.js를 실행 한다. 프로그램이 정상으로 실행 되면 1초 간격으로 10초간 LED가 점멸 한다.
    • node blink-led.js


  • Raspberry Pi GPIO: LED와 Pushbutton
    • Breadboard를 이용하여 Raspberry Pi와 LED를 윗 예와 같이 연결 하고, Raspberry Pi와 Button switch를 다음과 같이 연결 한다.
      • 위 "Raspberry Pi LED 제어하기"와 같이 LED를 연결 한다.
      • Raspberry Pi Pin12(GPIO18)와 Button switch의 한 단자을 연결 한다.
      • Raspberry Pi Pin12(GPIO18)에 Button pull up 저항(10K)을 연결한다.
      • Pull up 저항(10K)의 다른 단자를 Vcc에 연결한다.
      • Button switch의 다른 단자와 Breadboard GND를 연결 한다.
      • 위 "Raspberry Pi LED 제어하기" 사진 참고요. 이 실험에서는 2개의 버튼 중 좌측 1개만 사용함.

    • nodetest Directory에 다음 명령으로 Nano Editor를 사용하여 button-led.js File을 만든다
    • nano button-led.js

    • Nano Editor를 사용하여 button-led.js File을 아래와 같이 편집 한다.
    • button-led.js

      
      // onoff Module의 Gpio class를 Include 한다.
      var Gpio = require('onoff').Gpio;
      // GPIO17를 Output port로 사용한다.
      var LED = new Gpio(17, 'out');
      // GPIO18를 Input port(Button)로 사용한다.
      // 'both': Button을 pressed 또는 released 하면 Interrupt가 발생한다.
      // Douncing time을 16mSec로 설정한다.
      var pushButton = new Gpio(18, 'in', 'both', {debounceTimeout: 16});
      
      // 처음 프로그램이 실행된 경우 현재 Button의 상태를 LED에 표시한다.
      LED.writeSync(pushButton.readSync());
      
      // PushButton(GPIO) Hardware interrupts 이 발생하면 실핸되는 callback function
      pushButton.watch(function (err, value) {
        // 만약 Error 가 발생하면,
        if (err) {
          //Error message를 Console에 출력한다.
          console.error('There was an error', err);
        return;
        }
        // Button 상태(0 or 1)에 따라 LED를 Turn on or off 한다.
        LED.writeSync(value); 
      });
      
      // 프로그램 종료시 실행되는 함수
      function unexportOnClose() {
        // LED를 Turn off 한다.
        LED.writeSync(0); // Turn LED off
        // LED Port(GPIO17)를 해제한다.
        LED.unexport(); //
        // Button Port(GPIO18)를 해제한다.
        pushButton.unexport();
      };
      
      // 이용자가 ctrl+c를 누른 경우 실행할 함수를 지정한다.
      process.on('SIGINT', unexportOnClose);
          

    • button-led.js 프로그램 편집이 완료되면 "Ctrl+x"를 Press 하여 Code를 Save 하고 Nano Editor를 종료 한다.
    • 다음 명령으로 button-led.js를 실행 한다. 프로그램이 정상으로 실행 되면 LED 가 Turn On 상태 이다. Button switch를 누르면 LED 가 Turn off 된다.
    • node button-led.js