Сказка о золотом петушке

09/08/2018 16:50:18

Калинка, калинка, калинка моя,
В саду ягода-малинка, малинка моя.
Калинка, калинка, калинка моя,
В саду ягода-малинка, малинка моя.
(Из песни "Калинка", музыка народная, слова народные)

 

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


Виновник всей этой истории

Очередным изделием, которое по его замыслу должно было занять место в саду близ взрослой ели, стал резной петушок. С недавних пор он начал экспериментировать с цветами, собственноручно разукрашивая свои творения разными красками. Поэтому деревянный петушок, хотя и не должен был быть чем-то особенным на фоне десятков других более тонких работ, выделялся ярким оформлением. "Надо, чтобы он кукарекал!" - сказал я в шутку, когда впервые увидел его. "И чтобы крутился!" - добавил я немного погодя, не придавая особого значения словам. Но позже задумался. А почему бы и нет?! И слово уже вылетело, словно воробей, усевшись на ветку той самой ели, и опыт какой-никакой в плане автоматизации у меня тоже вроде имеется... Сказал? Делай! А как?

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

Набор для автоматизации петушка
Набор для автоматизации садового петушка

1. Компактный блок питания HDR-30-12 (12В)
2. Мини-ПК Raspberry Pi3
3. DC-DC преобразователь 12В -> 5В для питания RPi (синяя платка)
4. Драйвер двигателя на базе A4988 (красная платка с маленьким радиатором)
5. Двигатель Hanpose 17HS4401S-PH5.18
6. Усилитель от старой компьютерной акустики Genius на базе TEA2025B (коричневая плата)
7. Велосипедная втулка переднего колеса для согласования мотора и петушка

 

Сказ об электронной начинке

Основной элемент конструкции, конечно же, Raspberry Pi 3. Прежде всего, нужно было решить вопрос с качественным и надежным питанием. "Малинка" требовательна к качеству питания, поэтому я не стал применять отдельный БП 220В->5В и подключение питания по USB кабелю. Я решил, что проще и надежнее было бы припаять хорошие провода непосредственно к RPi и использовать DC-DC конвертор 12В->5В (на фото выше синяя платка слева от RPi).


Подключение питания к RPi
- Лелик, но это же неэстетично!
-Зато дешево, надежно и практично!

Я установил на него последнюю версию Raspbian (Debian Stretch) и пакеты hostapd и dnsmasq согласно этой инструкции. Петушок у нас будет Wi-Fi точкой доступа, к которой можно будет подключиться для управления режимами работы и программирования.
Затем я установил такие пакеты как apache2, php7 и mpg123. Теперь петушок не просто Wi-Fi точка доступа, но также Web-сервер, для которого я позже напишу программу управления. Пакет mpg123 необходим для проигрывания mp3 файлов. Я скачал из Интернета два десятка mp3 файлов, содержащих различные крики петухов и загрузил их в RPi.

Звук я решил брать с аналогового выхода RPi. Да, этот звук не слишком чистый и ощутимо фонит, но для проигрывания mp3 с записанными воплями петухов - Hi-Fi качества не требуется.
Для воспроизведения звука я откопал на чердаке пожелтевшие от времени, уже почти антикварные компьютерные колонки Genius SP-303, которые каким-то чудом не выбросил. Я извлек из колонки плату усилителя, которая также будет запитываться от 12-вольтового БП (на фото набора коричневая плата).


"Старый конь борозды не портит"

Отдельная и самая сложная задача - вращение довольно массивного петушка. Я предполагал, что без труда смогу найти что-то готовое. Но не тут-то было! Ничего подходящего для моей задачи в близлежащий магазинах не нашлось. Возникала даже идея использовать двигатель от микроволновки, но не устроила скорость его вращения - слишком быстро. Петушок должен был крутиться медленно. Нужен был достаточно мощный двигатель с возможностью управления скоростью вращения вала. В результате я заказал шаговый двигатель с редуктором 1:5.18. Крутящий момент такого мотора - 40Н*см. Самое то!

Мотор для петушка
Очень рад был петушок, что купили мы движок...

Для того, чтобы управлять таким двигателем с помощью Raspberry Pi нужен драйвер. Я применил драйвер на базе чипа A4988 в режиме микрошага 1/16. В таком режиме можно добиться очень плавного вращения петушка с нужной скоростью (условно от 1 оборота в секунду до 1 оборота за 10 минут).

К Raspberry Pi я подключил драйвер 5 проводами: GND (земля), VDD (питание +5В), STEP (шаг, GPIO23), DIRECTION (направление вращения, GPIO24), ENABLE (активность, GPIO18).


Подключение драйвера двигателя к RPi

Прежде, чем использовать GPIO в Raspberry их нужно инициализировать.
Для этого в /etc/rc.local я прописал следующие команды

echo 18 > /sys/class/gpio/export
echo 23 > /sys/class/gpio/export
echo 24 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio18/direction
echo out > /sys/class/gpio/gpio23/direction
echo out > /sys/class/gpio/gpio24/direction
echo 1 > /sys/class/gpio/gpio18/value

Пин Активности (ENABLE, GPIO18) сразу переводится в логическую единицу. В этом режиме питание мотора отключается и никакие команды он не принимает.
Если пин оставить в состоянии логического нуля, то на двигатель будет подаваться питание, а сам двигатель будет слегка греться, даже если команды на вращение на него не поступают. Этот пин я  буду активировать только тогда, когда это действительно нужно.

Для написания программы управления двигателем я, как обычно, использовал PHP. Сначала традиционный hello world!

<?php

system("echo 0 > /sys/class/gpio/gpio18/value"); // подаем питание на мотор
$gpio = fopen("/sys/class/gpio/gpio23/value", "w");
$speed = 3000;
while(true)
{
            fwrite($gpio, "1");
            usleep(10);
            fwrite($gpio, "0");
            usleep($speed);
}
?>

Вот и все. Принцип предельно простой. Двигатель поворачивается на крохотный шаг при каждом появлении на GPIO23 логической единицы. Таким образом, скорость движения мотора регулируется паузой. Чем короче пауза, тем быстрее вращается вал двигателя. Для записи информации в файл gpio23 я использовал функцию fwrite(), а не system(), потому что system() выполняется существенно медленнее, что мешает.

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




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


В настоящем петушке из продуктового магазина внутри тоже упаковано плотно. Я видел.


Сказ о механике

Согласование двигателя с довольно массивным и тяжелым петушком - отдельная история. Поломав немного головы, мы решили сделать так.


Это не перпетуум мобиле, хотя и похоже

Петушок будет установлен на шестиугольный подиум-башенку, в котором планировалось разместить электронику и механику. К этому же подиуму должен крепиться специальный массивный деревянный элемент также шестиугольной формы, выполненный из двух стянутых между собой шпильками брусков. Внутри бруса зажата велосипедная втулка. Та самая, которая видна на первой фотографии. Именно эта втулка будет передавать крутящий момент от двигателя к петушку. К верхней части втулки закреплена круглая металлическая пластина, диаметр которой совпадает с диаметром круглого основания петушка. К ней и будет крепиться петушок.


Вот людям делать то нечего...

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


"Резинка" в хозяйстве и быту лишней не бывает. Выручит, когда сильно надо...

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

 

Сказ о Web-интерфейсе

Теперь осталось только разработать красивый Web-интерфейс для управления петушком и доработать скрипт управления мотором, чтобы он мог получать команды от Web-интерфейса.
Сначала о Web-интерфейсе. Нужно было соблюсти какую-то общую стилистику, поэтому получилось вот так.


Аутентичный Web-интерфейс для управления петушком

HTML + CSS + jQuery + шрифт "Руслан". Исходники в конце статьи.
В статье приведу только ту часть, которая относится к jQuery и передаче команд.

    $(".onoffswitch-checkbox, .slider-input").change(function () {
        if ( $("#sw1").is(':checked') ) cmd = "RUN"; else cmd = "STOP";
        var speed = $("#slider-input1").val();
        speed = ((speed - 100 ) * -1 ) * 80 + 300;
        cmd = cmd + ":" + speed;
        if ( $("#sw2").is(':checked') ) cmd = cmd + ":1"; else cmd = cmd + ":0";
        if ( $("#sw3").is(':checked') ) cmd = cmd + ":1"; else cmd = cmd + ":0";
        $.get("/cmd.php?"+Math.random(), { cmd:  cmd }, function(data) {} );        
    });

В качестве параметров в скрипт cmd.php передается строка вида "RUN:4000:0:1", четыре поля с разделителем в виде двоеточия. "RUN" - запустить вращение, 4000 - скорость, 0/1 - направление вращения, последнее поле 0/1 - разрешать петушку проигрывать mp3 файлы с кукареканьем или нет.

Для межскриптового взаимодействия я применил разделяемую память PHP и функции shmop. Самое простое и очевидное - использовать для обмена данными файлы. Но, во-первых, операции с файлами медленные, а во-вторых, в данном случае мы имеем дело с Flash-накопителем microSD, который не очень-то любят большое количество операций записи. При работе с памятью такой проблемы нет.

А функционирует все довольно просто. При старте системы из rc.local запускается скрипт petya.php
Вот его полный код.

<?php
$cmd_id = shmop_open(42, "n", 0777, 100);
$cmd_id = shmop_open(42, "a", 0644, 100);
$cmd_a = array();
$speed = 2500;
$dir = 0;

while(true)
{
    $cmd = shmop_read($cmd_id, 0, 100);
    $cmd_a = explode(':', $cmd);
    echo "$cmd;";
    if ( $cmd_a[0] == "RUN"  )
    {
        system("echo 0 > /sys/class/gpio/gpio18/value");
        $gpio = fopen("/sys/class/gpio/gpio23/value", "w");
        $cnt = 0;
        while(true)
        {
            fwrite($gpio, "1");
            usleep(10);
            fwrite($gpio, "0");
            usleep($speed);

            $cnt++;
            if ( $cnt == 100 )
            {
                $cnt = 0;
                $cmd = shmop_read($cmd_id, 0, 100);
                echo $cmd.";";
                $cmd_a = explode(":", $cmd);
                $speed = intval($cmd_a[1]);

                if ( intval($cmd_a[2]) != $dir )
                {
                    $dir = intval($cmd_a[2]);
                    system("echo $dir > /sys/class/gpio/gpio24/value");
                }
                
                if ( $cmd_a[0] != "RUN" )
                {
                    system("echo 1 > /sys/class/gpio/gpio18/value");
                    break;
                }
            }
        }
    }
    sleep(1);
}

shmop_close($cmd_id);
?>

Скрипт периодически обращается в область памяти, где хранятся команды и выполняет их, запуская или останавливая вращение, изменяя скорость или направление.
А вот код скрипта, который вызывается с помощью jQuery и Web-интерфейса. Он только записывает команды в разделяемую память для скрипта petya.php

<?php
$cmd_id = shmop_open(42, "w", 0777, 100);
$cmd = $_GET['cmd'].":";
shmop_write($cmd_id, $cmd, 0);
shmop_close($cmd_id);
?>

Еще один скрипт cry.php также обращается в разделяемую память, чтобы проверить, разрешено ли кукареканье и проигрывает случайным образом файл, который содержится в соответствующей папке. Сейчас этот скрипт вызывается из cron. Но можно изменить скрипт, чтобы кукареканье происходило совершенно случайно в период с 4 утра до 20 вечера. Можно сделать так, чтобы петушок кукарекал количество часов или кукарекал только для того, чтобы созвать всех к обеду или ужину.

<?php
$cmd_id = shmop_open(42, "a", 0644, 100);
$cmd = shmop_read($cmd_id, 0, 100);
$cmd_a = explode(":", $cmd);
if ( $cmd_a[3] == 1 )
{
    system("amixer sset 'PCM' 100%");
    system("mpg123 /var/www/html/sounds/cry".rand(1,18).".mp3");
    system("amixer sset 'PCM' 20%");
}
?>

 

Зажгись

Возможно, вы обратили внимание на кнопку "Зажгись" в Web-интерфейсе петушка. Мне показалось, что одного только вращения будет мало, и что неплохо было бы сделать красивую подсветку основания петушка, в котором были проделаны окошки с имитацией витражей. Эта неожиданная мысль к сожалению пришла мне уже на этапе монтажа, когда практически все уже было готово, поэтому нужно было придумать какое-то простое решение из того, что было под рукой и валялось под ногами. Если бы я задумался об этом раньше, то непременно бы сделал RGB-подсветку. Но для начала сделаем что-то простое.

В качестве источника света я взял влагозащищенную RGB ленту, запаянную в силиконовую трубку, а в качестве драйвера (элемента между Raspberry Pi и лентой) маленькую одноканальную платку с транзисторами D4184. Можно было бы взять 4-х канальную L298N, которую я использовал с контроллерами MegaD, но для нее в боксе уже не было места. К тому же D4184 на небольших токах практически не греется, что для закрытого корпуса очень важно.


Когда красный цвет включает Raspberry Pi, он становится малиновым...

Да, только один канал, поэтому для подсветки я выбрал красный. Можно, конечно, было бы что-то придумать с диммированием, но для одного канала это не имеет большого смысла, поэтому пока ограничился только функцией включения и выключения. Но, повторю, технически нет никак проблем организовать RGB-подсветку. Только нужно было подумать об этом заранее. Как и о других интересных идеях, которые пришли в голову уже в процессе реализации задумки.

 

Сказки

Я решил, что обладая столь мощными по меркам задачи вычислительными возможностями, петушок не должен ограничиваться только кукареканьем. Поэтому я загрузил в него сказки русских классиков. Первым делом, конечно же, "наше все" - Александр Сергеевич Пушкин и "Сказка о золотом петушке".
Но тут возникла небольшая техническая сложность. А как управлять проигрыванием аудио-файлов через Web-интерфейс? Ведь очень просто с использованием HTML5 можно организовать воспроизведение медиа-контента на стороне мобильного устройства. Пара строк кода. Но требовалось, чтобы файл звучал не из планшета или телефона, с их помощью должно осуществляться только управление, а из акустики, подключенной непосредственно к Raspberry Pi. Я был уверен, что Интернет кишит Web-интерфейсами и frontend'ами для стандартной программы mpg123. Как же... Ну нет, так нет... велосипеды - это наш профиль! Даже втулка у нас от него родимого.

Как запускать и управлять mpg123 через Web-интерфейс? Нет ничего проще.
Оказывается консольная программа mpg123 имеет мощный инструмент - возможность получать команды с помощью именованных пайпов (pipe). Не знаю, как это правильно переводится на русский язык. Конвейер, канал? Да и не важно. Важно, что достаточно запустить mpg123 следующим образом:

mpg123 -R --fifo /var/www/html/tmp/mpg123_cmd

mpg123 создает пайп с именем mpg123_cmd, в который мы можем писать с помощью файловых функций простые команды:

load audio.mp3
pause
stop
jump +30s
и т.д.

Ну это же то, что надо! Я загрузил в RPi сказки Пушкина (и не только) в формате MP3 и сделал еще одну страничку с Web-управлением программой mpg123.

Web-frontend для mpg123
Сказка ложь, да в ней намек, добрым молодцам урок...

Теперь наш Петушок не только крутится и кукарекает, но и проигрывает сказки голосами Табакова, Смоктуновского, Калягина, Водяного и других замечательных актеров.
Достаточно кликнуть на название сказки, чтобы началось воспроизведение. Внизу страницы простейшая панель управления: пауза, стоп, перемотка на 30 секунд в одну и другую сторону. Все исходные коды "поделки" вы найдете внизу страницы.

 

Вишенка на торте

Не знаю, заметил ли читатель или нет, но у Web-странички петушка есть иконка (favicon). Однако это иконка не единственная. Мобильные ОС позволяют создавать ярлыки нужных сайтов на рабочем столе телефона или планшета. Это как иконка приложения, только открывается не приложение, а стандартный браузер. Поэтому для этих целей была сделана специальная иконка. Вот скриншот с экрана телефона.


Ну как родной!

А еще я ради смеха настроил в cron кукареканье петушка (даже если выключить его в Web-интерфейсе) в 4:50 утра. И получился интересный эффект. На дачах сейчас многие держат кур. Так вот наш петушок кукарекает первым, будет других, уже настоящих петухов, и все они начинают вопить... Поэтому данную функцию меня довольно скоро попросили деактивировать.

 

Вот и сказочке конец, а кто слушал...

Наверное, вы хотели бы узнать, как все это выглядит в реальности. Вот первая фотография с места установки петушка.


Примерка и пробный пуск

Видите под петушком башенку шестиугольной формы? Именно там установлена деревянная конструкция аналогичной шестиугольной формы с велосипедной фтулкой и мотором. Окна здесь непрозрачные. А вот на нижнем уровне окна прозрачные и через них просвечивает светодиодная лента. Она включается по вечерам автоматически. Выглядит подсветка очень эффектно.

А вот и видео с первого пробного запуска. Почти Кремль. Обратите внимание, имеется даже надвратная икона над проемом сооружения. А что, как на Спасской и Никольской башнях.




Говорят, что для тех, кто снимает вертикальное видео, есть отдельный котел в аду. Посмотрим.

Сначала колонка была установлена внутри основной башни, но звук был не очень. Поэтому отец позже смастерил еще один маленький разноцветный сказочный домик, который мы разместили повыше на дереве. А кроме того, он повесил на дерево цепь, посадил на нее кота, сделал лешего и начал вырезать... большую русалку, которую он планирует посадить на ветви! Фотографии того, что получилось в итоге, постараюсь сделать позже. Конечно, можно было бы предложить механизировать русалке хвост, но в этот раз я решил промолчать. Ведь инициатива, как известно, наказуема. Это только сказка скоро сказывается, да не скоро дело делается.

Исходники

 

 

Автор: Andrey_B
Любое использование материалов сайта возможно только с разрешения автора и с обязательным указанием источника.



Добавить комментарий:



Сортировка комментариев: Последние сверху | Первые сверху

2018-08-09 16:32:48 | Ruslan
Андрей, спасибо! Умеете поднять настроение.