Виртурилка для чайников - статья вторая

Материал из virt2real wiki
Версия от 13:14, 31 января 2014; Admin (обсуждение | вклад)

(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск


Содержание

Азы управления: введение

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

В этой статье мы с вами рассмотрим несколько простейших способов взаимодействия с виртурилкой, предназначенных для этих целей. Попутно будет частично рассмотрено устройство нашей админки – ранее мы не выкладывали ее обзоры, т.к. она постоянно росла и видоизменялась. На будущее хочу подсказать простую вещь – наша админка это большое количество собранных воедино реальных примеров работы с виртурилкой, с исходными кодами.

Что мы сегодня с вами будем делать:

  • Зальем новую прошивку
  • Выберем и настроим на виртурилке то, чем будем управлять (светодиодик)
  • Отберем управление светодиодом у системы
  • Порулим диодиком несколькими способами:
    • хардкорно (консоль)
    • через консольный скрипт
    • по ссылке с веб-странички
    • из формы с веб-странички
    • еще одним интересным способом
  • Обсудим как это можно использовать в реальности


Что понадобится для проведения экспериментов в этой статье. Самый минимум – это виртурилка с модулем WiFi, шнурок USB-MicroUSB для соединения с компьютером.


Заливаем прошивку и подключаемся

Для работы мы будем использовать прошивку от 30 января.

Работаем с файлом http://files.virt2real.ru/firmware/virt2real-board/1.1/30_01_2014_sdcard.img.zip.

Если файл по ссылке не скачивается - пройдите по предыдущей ссылке в тему с анонсом прошивки, там есть торрент-файл.


Процесс заливки прошивки и его особенности мы рассматривали в первой статье, но на всякий случай продублирую ссылку на инструкцию

Я использую для работы карточку MicroSD объемом 2 гигабайта. После того, как карточка готова, устанавливаем ее в разъем MicroSD виртурилки. На этом этапе работы нам не понадобится камера, поэтому я рекомендую ее просто отключить.

Вот как выглядит готовый к работе набор:


DSC0851.jpg


Подключаем шнурок MicroUSB к нашей плате и к компьютеру. Обратите внимание, что в этой версии прошивки у нас практически сразу после подключения загорается зеленый светодиод на плате – это сделано специально для быстрой индикации того, что плата "увидела" питание и начала загружаться (точнее загружать ядро линукса). На следующей стадии загрузки диод управляется уже из ядра и начинает показывать загрузку процессора (периодически помигивает).

Чем будем управлять

О разъемах

Виртурилка достаточно хорошо вооружена большим количеством разнообразных выходов, которыми можно управлять. Большинство из них выведено на два больших боковых разъема, еще называемые "гребенками". Если смотреть на плату сверху, повернув ее разъемом MicroUSB вверх, то левая гребенка имеет 44 "штырька", а правая – 42. Каждый разъем-"штырёк" на этой гребенке, еще называемый "пин", дает возможность воспользоваться одной из функций контроллера.

Забегая вперед (далеко вперед) скажу, что на самом деле многие пины могут выполнять несколько разных функций, которые можно указать в настройках. Это называется "мультиплексирование" выходов. Например, пину можно сказать "ты будешь у нас логическим выходом – т.е. уметь выдавать на выходе или 0, или 1" либо "теперь ты вход, будешь смотреть подали на тебя напряжение или нет". Возможные значения и функции пинов описаны в википедии, да и то пока не полный список.

На этом забегание вперед мы пока закончим, и вернемся в нашу зону комфортного освоения виртурилки. Давайте посмотрим на пины виртурилки в более комфортном для нас виде – в админке.


Смотрим макет

Итак, мы подключили виртурилку, она загрузилась. В эфире появилась точка доступа WiFi с именем virt2real – давайте к ней подключимся, введя пароль 12345678. После подключения набираем в строке браузера адрес 192.168.2.1 Мы оказываемся в админке – это панель управления, живущая на самой плате. Вводим логин root и пароль root.

В админке заходим в раздел “Макеты”, далее идем в “Макет платы”:


Maket v adminke.png


Приведенный макет интерактивный. Например, показаны светящиеся в данный момент светодиоды.

В случае, если диод на плате мигает – он отображается как постоянно светящийся.

Если навести мышку на любой пин то:

  • пин на макете подсвечивается
  • под платой появляется надпись, отображающая информацию о текущем пине
  • выбранный пин подсвечивается в списке, который находится на странице чуть ниже


Maket info o pine.png


На этом изображении я выбрал мышкой пин номер 25 - он подсвечен синим на макете.

Под макетом платы появилась надпись "25. GPIO1", и эта же надпись выделена синим цветом в списке под макетом.

Выбираем объект управления

В качестве простейшего примера мы возьмем один из пинов, который будет работать в режиме "либо 0, либо 1", и изменять его состояние. А чтобы мы могли воочию наблюдать, как это состояние меняется, мы возьмем пин, к которому подключен один из светодиодов на плате.

Немного технических подробностей для чайников со свистком

Давайте тут проясним еще один важный момент, который позволит избежать нам путаницы в дальнейшем.

На виртурилку установлен процессор DaVinci от Texas Instruments, который имеет, ни много ни мало, 338 ножек. Из них для наших пользовательских целей, т.е. для прямой работы с ними, используется примерно 104 ножки. Часть из них имеет название вида GPIOxxx, где xxx – число. Например GPIO6, GPIO74, GPIO103 и так далее. Кстати, GPIO расшифровывается как General Purpose Input-Output, что в переводе означает "ввод-вывод общего назначения".


Когда мы создавали виртурилку, часть этих "ножек" процессора была выведена на нашу плату в виде тех самых "гребенок", а другая часть подключена к различным устройствам на плате – например, к светодиодикам.


Все выведенные ножки нами были пронумерованы, и получили имена вида CONx – напрмер CON7, CON86. В данном случае CON это сокращение от "connector" - проще говоря "контакт".

Таким образом, если мы подведем курсор мышки на изображении на пин, то в табличке под макетом увидим надпись, например

40.  GPIO23/ pwm0

то это означает, что на выбранной ножке виртурилки с номером 40 (т.е. CON40) выведена ножка процессора GPIO23, которая также умеет выполнять функцию PWM.

С этим огромным количеством различных ножек вы будете разбираться уже по мере роста сложности тех задач, которые вы хотите решать с помощью виртурилки. А пока мы для себя решаем, что хотим работать с зеленым светодиодиком.

Для этого в нашей википедии подсмотрим, как называется ножка процессора, к которой он подключен: описание выводов виртурилки в Википедии

Ура, теперь мы знаем что зеленый светодиод живет на GPIO73!

Важное замечание: по сути при разработке платы мы просто использовали GPIO73 для подключения светодиодика. Отдельного вывода для GPIO73, к которому можно "подпаяться" и подцепиться для управления на плате нет. Именно поэтому данной ножке процессора (GPIO73) не соответствует ни одна нога виртурилки (CON), и вы не найдете этот коннектор на макете платы - там отображен только светодиод.

Забираем диодик у системы

Ну что-же, подготовительная часть почти закончена. Светодиод локализован, понятно через какой GPIO он управляется. Осталось только освободить его под наши нужды.

Сейчас он используется системой на двух этапах:

  • сразу после включения виртурилки для индикации процесса загрузки ядра линукса
  • после загрузки для индикации загруженности центрального процессора

Нам необходимо вежливо сообщить виртурилке, чтобы она его для своих нужд не трогала и оставила нам на поиграться. Сделаем это через админку. Заходим в раздел "Настройки", далее идем в пункт uEnv и там открываем подпункт "Периферия"


Adminka uenv txt.png

Мы видим настройки использования светодиодов системой. Черным цветом подсвечивается та опция, которая сейчас выбрана. У зеленого светодиода это "cpu0" - это означает, что он показывает загрузку процессора. Нажимаем на кнопку "Выкл" и жмем на надпись "сохранить" вверху страницы.

Теперь можно перезагрузить нашу плату ("Администрирование" - "Перезагрузка") – светодиодик в нашем распоряжении.


Немного подробностей о работе странички "Периферия" в админке

В этом разделе в понятном человекочитаемом виде вынесены настройки оборудования, которые живут в файле uEnv.txt на виртурилке. Их можно менять не только через данный интерфейс, но и просто меняя содержимое файла uEnv.txt Этот файл можно править, например, подключив MicroSD через кардридер к компьютеру – в появившемся разделе с именем boot данный файлик лежит в корне. Каждый раз при загрузке виртурилка "разбирает" содержимое файла, и потом соответствующим образом отображает все настройки в админке. Верно и обратное: если мы меняем что-либо в настройках uEnv в админке – изменения сохраняются в этот файл.

Напоследок давайте убедимся, что мы сделали все правильно. Для этого зайдем в админку и во вкладке "Периферия" посмотрим на текущий статус зеленого светодиода. Черным должна быть подсвечена самая первая кнопка "Выкл" - это значит что система светодиод не использует.


Управляем

Доступ к спинному мозгу

Сначала попробуем простой "хардкорный" способ.

Для этого заходим в админку, далее во вкладку "Мониторинг", затем "Консоль". Вводим там следующую команду:

 echo "set gpio 73 output 1" > /dev/v2r_gpio

и жмем Enter


Adminka console gpio command.png


Если все сделано правильно – то должен загореться зеленый светодиод.

Теперь пробуем его выключить:

 echo 2 "set gpio 73 output 0" > /dev/v2r_gpio

Диод погас. Ура! Он нас слушается!

Что происходит за сценой?

"/dev/v2r_gpio" - это имя файла, в который мы пишем команды. На самом деле это драйвер gpio "притворяется" файлом, чтобы с ним было проще работать. И в этот файл мы посылаем запись "set gpio 73 output 0" с помощью команды echo. В переводе на человеческий эта команда означает "установить ногу 73 на вывод информации и вывести туда состояние ноль", т.е. не подавать на ножку напряжение.

Облагораживаем решение - раз

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

Специально для этой статьи в админке добавлен модуль для экспериментов. Давайте заглянем в один скриптик.

Идем в “Мониторинг”, там в “Файл менеджер” и дальше пробираемся в папку var/www/modules/samples.


Samples module files.png


Там лежит файлик test.sh – давайте его откроем. Вот его код:


  1. #! /bin/sh
  2. echo "set gpio 73 output 1" > /dev/v2r_gpio


Если мы теперь вернемся назад в "Мониторинг" -> "Консоль" и там наберем команду:

 /var/www/modules/samples/test.sh

то светодиодик загорится. Соответственно, если в скрипте заменить 1 на 0 то при его вызове диод будет гаснуть.


Хозяйке на заметку: чтобы постоянно не кликать в разные пункты меню админки, в разных вкладках браузера можно открыть сразу несколько ее страничек. В одной консоль, в другой файл-менеджер. Ну и помните – когда вы находитесь в консоли, нажатие на клавиатуре клавиши "вверх" выводит предыдущую набранную команду.

Облагораживаем решение - два

Придадим управлению еще более человеческий вид – веб-страничка


Краткий ликбез. На виртурилке установлен веб-сервер. Все файлы находятся в папке /var/www. Когда вы набираете адрес виртурилки в браузере (допустим, 192.168.2.1), то на самом деле открывается файл index.php, лежащий в этой папке /var/www в корне. Но для наших экспериментов мы не будем ломать админку (хотя попробуйте – все в конце концов лечится перезаливкой прошивки на MicroSD), а воспользуемся домашней заготовкой.

Админка, в которую вы попадаете, позволяет создавать свои собственные странички. Все вкладки и странички, которые вы видите в админке, живут в папке /var/www/modules. Мы будем иметь дело с модулем samples, который живет в одноименной папке. Давайте отвлечемся на него и изучим его анатомию.


Немного анатомии модуля в админке

В папке /var/www/modules /samples живут следующие файлы:

description.php – это файл с описанием модуля. Если вы в него зайдете, то увидите, что в нем задаются параметры: name имя модуля title название модуля (выводится в меню в левой части админки) menu_part номер раздела в меню, в котором появится ссылка position позиция ссылки на модуль в разделе


Если вы откроете в админке меню "Обучалки" (имеющее 10-й порядковый номер), то в нем видна ссылка "Учебный модуль".

index.php – собственно файл, который запускается по ссылке на пункт меню модуля. Он ведет подготовительную работу для отображения содержимого, поэтому нам пока не интересен.

template.tpl – а вот это интересный экземпляр. Это файл шаблона странички. Говоря простым языком это практически готовая страничка формата HTML, но с некоторыми дополнительными возможностями. Обратите внимания – в файле нет стандартного заголовка и окончания страницы (тегов body например) и добавлять их не надо. Собственно, эта страничка и станет нашим первым примером для экзекуций. Дальше идут дополнительный файлы – несколько скриптов с расширением .sh и вспомогательные страницы на php.



Веб-страничка

Возвращаемся к нашей задаче. У нас есть скрипт test.sh, который зажигает (или гасит) светодиод при запуске. А давайте-ка запустим его с веб-странички!

Что мы сделаем: разместим на странице ссылку, которая будет вести на файл php, который и запустит наш скрипт. Вот нужное нам содержимое файла php:


  1. echo "Script /var/www/modules/samples/test.sh started!";
  2. echo "<pre>".shell_exec("/var/www/modules/samples/test.sh")."</pre>";


Первая строчка показывает сообщение, вторая - запускает скрипт и показывает текст, возвращенный скриптом.

Это содержимое уже имеется в файле simplerun.php, находящемся в папке с модулем.


Теперь мы на нашей страничке (напоминаю – это файл template.tpl) разместим такую вот ссылочку:

<a href="./modules/samples/simplerun.php">Start test.sh script</a>

При клике на нее запускается наш скрипт. Проверяем, как это работает: идем в админке в меню "Обучалки", далее в "Учебный модуль" и в самом верху страницы видим ссылку – это она и есть. На фото она выделена красным:


Adminka ssylka.png


При нажатии на нее запускается скрипт, и светодиод делает то, что ему положено.

Вот мы уже добились первого результата – нажатие на ссылку на страничке заставляет делать виртурилку то, что нам нужно. Будем развивать успех.

Текущее решение не очень красивое – просто ссылка, к тому-же при наведении на нее курсора выводится какой-то длинный путь вида "http://192.168.2.1/modules/samples/simplerun.php", да и гибкости решения нет.

Облагораживаем решение - три

Надо облагородить и добавить чуть больше универсальности. Сделаем кнопочку и возможность вводить адрес скрипта прямо на страничке – чтобы можно было со страницы запускать разные скрипты.

Для этого добавим на нашу страничку форму, в которую вводится имя скрипта. Вот ее код:

  1. <form action="/modules/{module_name}/run.php" method="post" target="_blank">
  2. 	<p class="bluetitle">Запустить скрипт</p>
  3. 	<p> <input type="text" name="path" value="./test.sh"> Путь к исполняемому скрипту </p>
  4. 	<p> <input type="submit"> </p>
  5. </form>


Для работы нам понадобится вспомогательный файл, который будет из формы получать адрес скрипта и его запускать. Файл назовем run.php и разместим в нем такое содержимое:


  1. $script_path = $_POST['path'];
  2. echo "Script $script_path <br>";
  3. echo "<pre>".shell_exec("$script_path")."</pre>";


Первая строчка этого кода отдает в переменную $script_path путь, который мы передаем из нашей формы. Вторая - выводит на вебстраницу содержимое переданной переменной $_POST['path']. Третья – запускает скрипт, находящийся по этому пути и отображает на странице текст, который этот скрипт вернул.


Получаем такую вот форму (выделена на рисунке красным прямоугольником):


Adminka uchebnaya forma 1.png


Обратите внимание, что для запуска не нужно указывать полный путь скрипта. Дело в том, что нужные нам файлы php запускаются из то-же директории, где лежат наши скрипты. Поэтому в окошке достаточно написать ./test.sh вместо /ar/www/modules/samples/test.sh

Что это нам дает: если в тестовом скрипте test.sh у нас установлена передача единички на нужный GPIO – светодиод горит. А в рядом расположенном скрипте test1.sh у нас прописан нолик. Поэтому если мы сначала жмем кнопку – запускается скрипт test.sh и зажигает зеленый огонек. Вернемся назад в нашу форму, и изменим в окошке имя скрипта на test1.sh – светодиод погаснет.

Ну вот, теперь не меняя ничего в коде мы можем как зажечь, так и погасить светодиод. Уже хорошо! Но мы успели нагородить нехилый огород. Нажимая кнопку, мы отправляем на виртурилку заполненную форму, которая запускает файл php с переданными параметрами, который в свою очередь запускает скрипт с записанными в нем параметрами. Никакой красоты однако. Зато мы разобрались в механике всего этого процесса.

Облагораживаем решение - четыре

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

Что мы сделаем: откажемся от использования скриптов bash вообще, и будем из php файла сразу записывать данные в файл драйвера GPIO, с возможностью выбора его номера, режима работы и состояния.

В качестве вспомогательного файла используется setgpio.php – это небольшая полезная утилитка, которую вы можете брать и в готовом виде использовать в своих первых проектах. Она получает три параметра – номер GPIO, режим работы и значение, которое нужно записать. А затем напрямую пишет эти данные в файл драйвера в нужном формате. Можете посмотреть код файла – он небольшой и вполне понятный.

У нас рождается такая вот форма:

  1. <form action="/modules/{module_name}/setgpio.php" target="_blank">
  2. 	<p class="bluetitle">Установить значение GPIO</p>
  3. 	<p> <input type="text" name="num" value="73"> GPIO number (номер GPIO) </p>
  4. 	<p> <input type="text" name="dir" value="output"> Направление работы: output или input (вывод или ввод) </p>
  5. 	<p> <input type="text" name="val" value="1"> Значение. Введите 0 или 1 </p>
  6. 	<input type="submit">
  7. </form>


Она передает введенные параметры в файлик setgpio.php и он делает свою работу.

Вот как она выглядит на страничке:


Adminka uchebnaya forma 2.png


Этот код уже размещен на тестовой страничке. В качестве эксперимента можете зажечь и погасить красный светодиод – номер его GPIO равен 74.

Облагораживаем решение - пять

А теперь небольшой бонус для самых любознательных. В самом низу страницы "Учебный модуль" находится элемент для ввода текста.

Для тестов воспользуйтесь клавишами 1 и 2. Смотрите за зеленым светодиодом.

Это решение еще более быстрое, красивое и легкое. На основе этого подхода легко строить продвинутые веб-рулилки для виртрилки.

Проанализировать происходящее оставляю вам в качестве домашнего задания. ☺ Все, что нужно для понимания, находится в файле template.tpl

Заключение

В этой статье мы рассмотрели основные принципы работы с GPIO и попробовали несколько различных способов доступа к ним. Если вы немного знакомы с веб-программированием, то можете самостоятельно создавать свои странички управления и наращивать их функционал. Более того, файлики можно загружать на виртурилку как на обычный FTP сервер, и совсем не использовать движок админки. (FTP может быть по умолчанию отключен в прошивке для экономии ресурсов - запустить его можно командой proftpd в консоли админки).

Что касается практических применений сегодняшних примеров - то в качестве управляемого GPIO можно выбрать выведенную на гребенку ножку и управлять простейшими внешними устройствами (а при использовании релейного модуля или своей связки реле - включать настольную лампу например). Эти примеры уже относятся к нашим следующим статьям.

В следующей статье планируется рассмотреть управление с приложений для Android и iOS, управление через интернет (а не из локальной сети, как сейчас), а также работу с внешними устройствами.


Обсуждение статьи в этой теме форума