Управление GPIO Raspberry Pi через Node.js

Управление GPIO Raspberry Pi через Node.js

В этом уроке мы разберём, как управлять выводами GPIO Raspberry Pi через веб-сервер с помощью Node.js и socket.io.

Комплектующие

Для данного урока потребуется минимум оборудования — по сути, всего одно устройство, зато весьма мощное:

  • Raspberry Pi 3

Из этого руководства вы узнаете, как управлять выводами GPIO на Raspberry Pi через веб-сервер на базе Node.js и socket.io. На веб-странице мы разместим кнопки для включения и выключения подключённого светодиода. Прежде чем приступить к созданию веб-сервера, необходимо установить несколько пакетов.

Установка Node.js на Raspberry Pi

Первым делом нужно обновить систему Raspberry Pi.

sudo apt-get update

После этого введите следующую команду для обновления всех установленных пакетов до актуальных версий.

sudo apt-get dist-upgrade

Выполните приведённую ниже команду, чтобы установить последнюю версию Node на Raspberry Pi.

curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -

Теперь, когда репозиторий пакетов NodeSource добавлен, можно перейти к установке Node.js.

sudo apt-get install -y nodejs

Для проверки успешности установки Node.js выполните команду, которая покажет текущую версию.

node -v

Установка onoff модуля

Для управления выводами GPIO Raspberry Pi через Node.js потребуется модуль «onoff». Установите его следующей командой:

npm install onoff

Установка socket.io для Node.js

Далее установите модуль веб-сокетов для Node.js, который обеспечит управление выводами GPIO Raspberry Pi прямо с веб-страницы.

npm install socket.io --save

Создание веб-сервера и файла HTML

Все необходимые пакеты установлены, и теперь пора создать веб-сервер и HTML-файл. Оба файла должны располагаться в одном каталоге.

Index.html

Начнём с HTML-файла, который сформирует кнопки управления в веб-браузере. Создайте файл командой nano index.html и вставьте в него приведённый ниже код.

<!DOCTYPE html>
<html>
<title>GPIO Control</title>

<body>
    <h2>Control GPIO 4</h2>
    <button type="button" id="state" onclick="LEDOn()" style="background-color:green;">ON</button>
    <button type="button" id="state" onclick="LEDOff()" style="background-color:red;">OFF</button>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.0.3/socket.io.js"></script>
    <script>
        var socket = io.connect(); //load socket.io-client and connect to the host
        function LEDOn() {
            socket.emit("state", 1); //send button state to server
        }

        function LEDOff() {
            socket.emit("state", 0); //send button state to server
        }
    </script>

</html>
</body>

</html>

Подключение светодиода к Raspberry Pi

Теперь подсоедините светодиод к GPIO 4, используя резистор номиналом 220 Ом, как изображено на схеме ниже:

Создание веб-сервера

Перейдём к настройке веб-сервера. Файл Node.js будет открывать запрошенный ресурс и возвращать его содержимое, а в случае ошибки — отдавать код 404.

Создайте файл командой nano webserver.js и вставьте приведённый ниже код.

var Gpio = require('onoff').Gpio; //require onoff to control GPIO
var LEDPin = new Gpio(4, 'out'); //declare GPIO4 an output
var fs = require('fs'); //require filesystem to read html files
var http = require('http').createServer(function handler(req, res) { //create server
  fs.readFile(__dirname + '/index.html', function (err, data) { //read html file
    if (err) {
      res.writeHead(500);
      return res.end('Error loading socket.io.html');
    }

    res.writeHead(200);
    res.end(data);
  });
});

var io = require('socket.io')(http) //require socket.io module and pass the http object

http.listen(8080); //listen to port 8080

io.sockets.on('connection', function (socket) {// WebSocket Connection
  var buttonState = 0; //variable to store button state

  socket.on('state', function (data) { //get button state from client
    buttonState = data;
    if (buttonState != LEDPin.readSync()) { //Change LED state if button state is changed
      LEDPin.writeSync(buttonState); //turn LED on or off
    }
  });
});

Веб-сервер и HTML-файл готовы, поэтому можно запустить сервер и приступить к управлению выводами GPIO Raspberry Pi.

Введите в терминале следующую команду для запуска веб-сервера:

node webserver.js

Затем откройте браузер и перейдите по адресу [Raspberrypi-ip]:8080

В моём случае это: 192.168.4.1:8080

На экране отобразятся две кнопки, и при нажатии на них светодиод, подключённый к GPIO4 Raspberry Pi, будет включаться или выключаться.