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

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

Перевод: Максим Кузьмин (Cubewriter) Перевел 364226 статей для сайта.</br>Контакты:</br>* Skype: cubewriter</br>* E-mail: cubewriter@gmail.com</br>* Максим Кузьмин на freelance.ru
Проверка/Оформление/Редактирование: Мякишев Е.А.


Pixel Art Mini Meow Animated.gif Черновик


Программирование 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

См.также

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