Сегодня существует множество различных языков программирования и программного обеспечения для управления Raspberry Pi, включая Python, язык C для встраиваемых систем, Flask и т. д.

Чтобы расширить горизонт применения мощного одноплатного компьютера Raspberry Pi, сегодня мы будем использовать очень популярную среду на основе javascript (Node.js) для управления линиями GPIO Raspberry Pi локально, а также глобально, настроив его как веб-сервер. Первоначально Node.js был разработан для Google Chrome, но позже он стал применяться для других задач и проектов.
В этом уроке мы будем управлять светодиодом, подключенным к Raspberry Pi, используя два метода. Сначала мы просто напишем код javascript, используя Node.js, чтобы мигать светодиодом. Во втором методе мы создадим HTML-страницу с двумя кнопками для включения и выключения светодиода. Эта HTML-страница будет размещена на Raspberry Pi и может быть открыта в любом веб-браузере. Итак, здесь Raspberry Pi будет выступать в роли веб-сервера. Схема подключения Raspberry Pi для этого проекта выглядит следующим образом:

Для начала установим Node.js на Raspberry Pi. Сначала проверьте версию ARM-ядра с помощью этой команды (в данном случае версия 7):
uname –mЗагрузите установщик, скопировав следующую ссылку в терминал. Не забудьте изменить версию в приведенной ниже ссылке:
wget https://nodejs.org/dist/v4.6.1/node-v4.6.1-linux-armv[version]l.tar.gzИзвлеките файлы, используя команду ниже:
tar -xvf node-v4.6.1-linux-armv[version]l.tar.gzНаконец, выполните эти команды, чтобы добавить важные файлы в локальные каталоги:
cd node-v4.3.1-linux-armv[version]l
sudo cp -R * /usr/local/
Теперь Node.js установлен на Raspberry Pi. Проверьте версию узла для подтверждения с помощью этой команды:
node –versionПрежде чем приступить к созданию сервера Node.js, сначала мы рассмотрим, как написать скрипт для мигания светодиодом с помощью node.js (пакет npm onoff). Мы будем использовать диспетчер пакетов npm для установки onoff-модуля, используя следующую команду:
npm install onoffТеперь мы напишем скрипт для мигания светодиодом. Откройте редактор nano и укажите имя файла с помощью команды:
nano blink_led.jsЕсли вы являетесь новичком в Node.js, вам лучше посмотреть документацию по npm для лучшего понимания скрипта. Итак, сначала объявим переменные для led, delay и GPIO. Мы используем Raspberry Pi GPIO 4 для подключения светодиода.
var Gpio = require('onoff').Gpio;
var LED = new Gpio(4, 'out');
var blinkInterval = setInterval(blinkLED, 500);
Теперь мы реализуем функцию, чтобы начать мигать светодиодом:
function blinkLED() {
if (LED.readSync() === 0) {
LED.writeSync(1); //set output to 1 i.e turn led on
} else {
LED.writeSync(0); //set output to 0 i.e. turn led off
}
}
Аналогичным образом, сделаем функцию, чтобы остановить мигание:
function endBlink() {
clearInterval(blinkInterval);
LED.writeSync(0);
LED.unexport(); // отключаем GPIO для освобождения ресурсов
}
setTimeout(endBlink, 10000);
Полный код Node.js для программы мигания светодиодом приведен в конце этого урока. Поэтому скопируйте и вставьте код в файл led_blink.js, который мы создали ранее с помощью команды nano, сохраните файл с помощью Ctrl + x, затем нажмите Y и нажмите Enter. Чтобы запустить скрипт, откройте терминал и введите следующую команду:
node blink_led.js
Вы увидите, что светодиод будет мигать в течение 10 секунд, после чего он перестанет мигать. Теперь же перейдем к более интересной части данного руководства, в ней мы собираемся создать собственный веб-сервер, из которого мы можем управлять линиями GPIO, используя веб-страницу. Для этого сначала нам нужно создать HTML-страницу и написать сценарий для выполнения back-end задачи, то есть для управления линией GPIO. Сначала создайте каталог для хранения всех файлов в одном месте.
mkdir nodejs_serverВнутри папки nodejs_server создайте еще одну папку для сохранения файла HTML.
cd nodejs_server
mkdir views
Если вы хотите добавить изображения на свою страницу html, вы должны сделать другую папку с именем public внутри основного каталога, то есть в папке nodejs_server. В общей папке создайте папку изображений и сохраните все изображения в этой папке. Теперь мы сделаем HTML-страницу. Для этого откройте текстовый редактор с именем файла index.ejs. В скрипте нет ничего необычного. Это только HTML-файл, который позволяет включать и выключать кнопку. Скопируйте и вставьте HTML-код ниже в текстовый редактор и сохраните его.
<meta name="viewport" content="width=500, initial-scale=1">
<div class="BorderMargin">
<image src = '/images/example.jpg' alt="LED" style="width:500px;height:250px;" align="left">
<h1>Welcome to Nodejs Server</h1>
<form action="/led/on" method="post">
<button type="submit" class="button">LED On </button>
<button type="submit" formmethod="post" formaction="/led/off" class="button button3">LED Off</button>
</form>
<a>Led Status: <%=status %></a>
</div>
Теперь мы должны написать код javascript. Мы используем node express framework для ответа на HTTP-запросы, выполняемые пользователем. Откройте терминал и откройте текстовый редактор с именем index.js в папке nodejs_server, затем скопируйте и вставьте ниже код java-скрипта и этот файл.
var express = require('express');
var app = express();
var path = require('path');
var gpio = require('rpi-gpio');
gpio.setup(7, gpio.DIR_OUT);
app.set('view engine', 'ejs');
app.use(express.static(path.join(__dirname, 'public')));
console.log(path.join(__dirname, 'public'));
app.get('/', function(req, res){
res.render('index',{status:"Press Button"});
});
app.post('/led/on', function(req, res){
gpio.write(7, true, function(err) {
if (err) throw err;
console.log('Written True to pin');
console.log(path.join(__dirname, 'public'));
return res.render('index', {status: "Led is On"});
});
});
app.post('/led/off', function(req, res){
gpio.write(7, false, function(err) {
if (err) throw err;
console.log('Written False to pin');
console.log(path.join(__dirname, 'public'));
return res.render('index',{status: "Led is Off"});
});
});
app.listen(3000, function () {
console.log('Server Started on Port: 3000!')
})
Внутри каталога nodejs_server мы должны выполнить следующую команду для установки библиотек node.js:
npm installТеперь ваш сервер готов к работе. Чтобы запустить локальный сервер, выполните следующую команду внутри каталога nodejs_server:
node index.jsВы увидите сообщение на терминале, что ваш сервер запущен на определенном порту.

Теперь откройте свой браузер и откройте URL-адрес Raspberry Pi с номером порта, то есть raspberrypi:3000. Убедитесь, что ваш Raspberry Pi и ноутбук, в котором вы открываете браузер, связаны с одной и той же сетью. В браузере вы сможете увидеть страницу вроде такой:

Нажимая кнопки, вы будете изменять состояние светодиода. Ниже приведен код для мигания светодиодом с помощью Node.js.
var Gpio = require('onoff').Gpio;
var LED = new Gpio(4, 'out');
var blinkInterval = setInterval(blinkLED, 500);
function blinkLED() {
if (LED.readSync() === 0) {
LED.writeSync(1); //set output to 1 i.e turn led on
} else {
LED.writeSync(0); //set output to 0 i.e. turn led off
}
}
function endBlink() {
clearInterval(blinkInterval);
LED.writeSync(0);
LED.unexport();
}
setTimeout(endBlink, 10000);
Далее приведен код для мигания светодиодом с использованием веб-сервера Node.js.
var express = require('express');
var app = express();
var path = require('path');
var gpio = require('rpi-gpio');
gpio.setup(7, gpio.DIR_OUT);
app.set('view engine', 'ejs');
app.use(express.static(path.join(__dirname, 'public')));
console.log(path.join(__dirname, 'public'));
app.get('/', function(req, res){
res.render('index',{status:"Press Button"});
});
app.post('/led/on', function(req, res){
gpio.write(7, true, function(err) {
if (err) throw err;
console.log('Written True to pin');
console.log(path.join(__dirname, 'public'));
return res.render('index', {status: "Led is On"});
});
});
app.post('/led/off', function(req, res){
gpio.write(7, false, function(err) {
if (err) throw err;
console.log('Written False to pin');
console.log(path.join(__dirname, 'public'));
return res.render('index',{status: "Led is Off"});
});
});
app.listen(3000, function () {
console.log('Server Started on Port: 3000!')
})
© digitrode.ru