BeagleBone:Программирование BeagleBone Black при помощи BoneScript

Материал из Онлайн справочника
Перейти к: навигация, поиск

Перевод: Максим Кузьмин (Cubewriter)
Перевел 1837 статей для сайта.

Контакты:

Проверка/Оформление/Редактирование: Мякишев Е.А.


Ambox content.png Черновик


Программирование BeagleBone Black при помощи BoneScript[1]

BoneScript – это библиотека Node.js, содержащая функции, созданные специально для BeagleBone Black. Она упрощает настройку и доступ к контактам BeagleBone Black. К примеру, с ее помощью можно управлять выходными данными, считывать значения с кнопки/датчика, управлять мотором и т.д. Если вам доводилось работать с Arduino, то многие функции покажутся вам очень знакомыми.

Введение

Преимущество платы BBB в том, что она очень хорошо подходит для проектов в области домашней автоматизации, т.к. обеспечивает простой доступ к интернету и множеству GPIO-контактов.

В этой статье я расскажу, как при помощи BBB создать веб-сервер, который управляет компонентом вывода данных (в данном случае – светодиодом) и дистанционно доступен через смартфон, ноутбук или планшет.

Общий план проекта

Плата BeagleBone будет хостить веб-сервер, устанавливая коммуникацию между веб-браузером и GPIO-контактами BeagleBone Black. Веб-сервер будет создан при помощи кода Node.js, и когда вы вобьете в браузер IP-адрес «http://192.168.7.2:8888», он откроет файл «index.html», хранящийся на BeagleBone Black.

Framework-web-server-beaglebone-black.jpg

«192.168.7.2» – это локальный IP-адрес вашей BeagleBone Black, а «8888» – это порт, который вы будете использовать.

Нажатие на кнопку в браузере активирует событие, и оно обращается к коду Node.js, который содержит пакет «socket.io», настроенный на прослушку событий. Далее, в зависимости от сообщения, присланного событием, код Node.js определенным образом взаимодействует (т.е. любо включает, либо выключает) с GPIO-контактами BBB.

Необходимые компоненты

  • Одна плата BeagleBone Black
  • Одна макетная плата
  • Один светодиод
  • Один резистор на 220 Ом
  • Один резистор на 470 Ом
  • Два провода-перемычки
  • Кабель MiniUSB
  • Кабель Ethernet

Подключение компонентов

Экспериментируя с новой технологией, лучше всего начать с включения/выключения светодиодов, а после того, как разберетесь, вместо светодиода можно подключить более сложный электронный компонент (например, реле), а затем управлять им со смартфона, даже не вставая с дивана.

Web-Server-LED.png

Установка «socket.io»

Для этого проекта нужно будет установить пакет Node.js под названием «socket.io». Чтобы сделать это, подключите BBB к интернету и впишите в терминал следующие команды:

sudo npm install update
sudo npm install -g socket.io

Первая команда обновляет уже установленные пакеты до последней версии, а вторая – глобально устанавливает «socket.io».

Этот пакет позволяет в реальном времени осуществлять коммуникацию между событиями веб-браузера и BeagleBone Black. Другими словами, когда вы кликаете на кнопку в веб-браузере, код Node.js мгновенно реагирует согласно сообщению в этом событии.

Создание папки и файлов

Для программирования BeagleBone рекомендую использовать Cloud9 IDE (подробнее об этом сервисе читайте тут).

Запустив Cloud9 IDE, откройте вкладку Workspace и создайте там папку с двумя файлами. Для этого проделайте следующее:

  1. Кликните правой кнопкой мыши на папку «cloud9» и в выпадающем меню выберите пункт «New Folder»
  2. Назовите новую папку «Projects»
  3. Кликните правой кнопкой мыши по папкt «Projects» и в выпадающем меню выберите пункт «New file»
  4. Назовите этот файл «index.html»
  5. Повторите шаг 3 и назовите новый файл «server.js»

Результат должен выглядеть следующим образом:

Bbb bonescript cloud9.jpg

Создание веб-страницы для управления светодиодом

Файл «index.html» устроен очень просто: заголовок формата H2, строчка для отображения статуса светодиода и две кнопки. Кроме того, в верхней части файла происходит загрузка модуля «socket.io», а ниже находится скрипт JavaScript для отправки сообщений на «server.js».

В целом код для создания веб-страницы выглядит следующим образом (см. комментарии, объясняющие принцип работы встроенного скрипта):

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.     <title>Home Automation Web Server with BeagleBone</title>
  5.        //  Веб-сервер на базе BeagleBone Black
  6.        //  для проектов в области домашней автоматизации
  7.     <script src = "/socket.io/socket.io.js" ></script>
  8.     <script>
  9.         // устанавливаем соединение с сервером:
  10.         var socket = io.connect();
  11.  
  12.         // меняем состояние светодиода:
  13.         function changeState(state){
  14.             if (state==1){
  15.                 // генерируем сообщение, меняющее состояние на «1»:
  16.                 socket.emit('changeState', '{"state":1}');
  17.                 // на веб-странице меняем статус светодиода на «ON»:
  18.                 document.getElementById("outputStatus").innerHTML = "Status: ON";
  19.             }
  20.             else if (state==0){
  21.                 // генерируем сообщение, меняющее состояние на «0»:
  22.                 socket.emit('changeState', '{"state":0}');
  23.                 // на веб-странице меняем статус светодиода на «OFF»:
  24.                 document.getElementById("outputStatus").innerHTML = "Status: OFF";
  25.             }
  26.         }
  27.     </script>
  28. </head>
  29.     <h2>LED</h2>
  30.     <p id="outputStatus">Status</p>
  31.     <button type="button" onclick="changeState(1);">ON</button>
  32.     <button type="button" onclick="changeState(0);">OFF</button>
  33. </div>
  34. </body>
  35. </html>

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

Последняя часть головоломки – файл «server.js».

В нем, во-первых, загружаем все необходимые модули и настраиваем контакт BeagleBone Black.

Во-вторых, инициализируем веб-сервер на порте «8888». В-третьих, при помощи «socket.io» устанавливаем соединение между «server.js» и «index.html». В-четвертых, вызываем функцию handleChangeState(), которая будет включать/выключать светодиод согласно сообщению, присланному от «index.html».

Обратите внимание на комментарии, объясняющие принцип работы кода.

  1. // загружаем модули:
  2. var http = require('http');
  3. var fs = require('fs');
  4. var path = require('path');
  5. var b = require('bonescript');
  6.  
  7. // создаем переменную «led», отсылающую к контакту P9_14:
  8. var led = "P9_14";
  9. // выставляем контакт светодиода в режим вывода данных:
  10. b.pinMode(led, b.OUTPUT);
  11.  
  12. // инициализируем сервер на порте «8888»:
  13. var server = http.createServer(function (req, res) {
  14.     // запрашиваем файлы:
  15.     var file = '.'+((req.url=='/')?'/index.html':req.url);
  16.     var fileExtension = path.extname(file);
  17.     var contentType = 'text/html';
  18.     // убираем знаки комментария ниже,
  19.     // если нужно добавить CSS на веб-страницу:
  20.     /*
  21.     if(fileExtension == '.css'){
  22.         contentType = 'text/css';
  23.     }*/
  24.     fs.exists(file, function(exists){
  25.         if(exists){
  26.             fs.readFile(file, function(error, content){
  27.                 if(!error){
  28.                     // страница найдена, пишем контент:
  29.                     res.writeHead(200,{'content-type':contentType});
  30.                     res.end(content);
  31.                 }
  32.             })
  33.         }
  34.         else{
  35.             // страница не найдена:
  36.             res.writeHead(404);
  37.             res.end('Page not found');  //  "Страница не найдена"
  38.  
  39.         }
  40.     })
  41. }).listen(8888);
  42.  
  43. // загружаем модуль «socket.io»:
  44. var io = require('socket.io').listen(server);
  45.  
  46. // если коммуникация установлена...
  47. io.on('connection', function (socket) {
  48.     socket.on('changeState', handleChangeState);
  49. });
  50.  
  51. // если кнопка нажата, меняем состояние светодиода:
  52. function handleChangeState(data) {
  53.     var newData = JSON.parse(data);
  54.     console.log("LED = " + newData.state);
  55.     // включаем или выключаем светодиод:
  56.     b.digitalWrite(led, newData.state);
  57. }
  58.  
  59. // показываем пользователю сообщение в консоли:
  60. server.listen(console.log("Server Running ..."));
  61.                       //  "Сервер запущен..."

Загружаем весь код

Вместо копипаста вы можете просто кликнуть здесь, чтобы загрузить весь код, необходимый для этого проекта. Затем распакуйте скачанный ZIP-архив и загрузите код на BeagleBone Black.

Запуск веб-сервера

Запуск веб-сервера выполняется очень просто. Нужно просто сохранить на BeagleBone Black оба файла, о которых рассказывалось выше. Для этого кликните в Cloud9 IDE на зеленую кнопку «Run», после чего в консоли программы должно появиться сообщение «Server Running...».

И это значит, что веб-сервер запущен! Откройте в браузере новую вкладку, впишите туда «http://192.178.7.2:8888» и нажмите  ↵ Enter . В результате должна открыться вот такая страница:

Bbb bonescript web page.png

Важно: Эта страница откроется, только если компьютер и BeagleBone Black подключены друг к другу напрямую через USB.

Если это не ваш случай, читайте следующий раздел. В нем описывается, как получить доступ к BBB через устройство, подключенное к вашей сети.

Доступ к веб-серверу с другого устройства

Чтобы получить доступ к этой веб-странице с любого устройства в сети, вам понадобится IP-адрес BeagleBone Black. Чтобы узнать его, откройте терминал и впишите туда следующую команду:

ifconfig

IP-адрес высвечен на картинке ниже красным цветом (в моем случае это «197.168.1.80»):

Bbb bonescript ifconfig1.jpg

Теперь впишите найденный IP-адрес (а после него – через двоеточие «8888»; к примеру, «197.168.1.80:8888») в веб-браузер, установленный на вашем устройстве.

Готово! Теперь светодиодом можно управлять удаленно.

Bonescript-web-server-led.gif

См.также

Внешние ссылки

  1. randomnerdtutorials.com - Programming the BeagleBone Black with BoneScript