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

Будет много видео. Скажите пака-пака трафику!… Хотя, наверное, в 2019 году, такие вещи мало кого колышут…


Сам супер-контроллер создан на базе микроконтроллера Arduino NANO и имеет в системе свой уникальный идентификатор: 101 (для i2c-шины, по которой происходит общение между компонентами внутри робота) или head_DSArray1 – для лично меня, потому, что я так захотел.

Почему именно NANO? Потому, что у меня их уже была целая горсть… И еще парочка UNO… Но UNO в три раза больше и имеет избыточный для данных конкретных целей функционал (заточена под установку различных “шилдов”, которые в данном случае не планируется использовать).

Помимо этого, UNO имеет меньше аналоговых выходов, которые мне очень нужны (6, против 8 у NANO). И, поскольку, было понятно, что одним “супер-контроллером” в голове у собачки я палюбасу не обойдусь, то две, например, NANO дадут мне, при меньших габаритах, гораздо больше входов-выходов всех мастей, чем одна UNO.


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

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

Соответственно, в каркасе было запупырено очередное крепление, для размещения двух таких кроваток приблизительно по центру объема котла головы:

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


Сходу вылез и первый косяк с каркасом.

USB-разъем верхней из ардуин оказался крайне труднодоступен т.к. выходил четко в раму каркаса:

Не спасал даже шнурок с “угловым” разъемом. Он там умещался прямо впритык, но вытащить/вставить его, не вынув предварительно пердуину из ее кровати, было невозможно.

Пришлось перепечатать эту секцию черепа, предусмотрев, на этот раз, выкус в каркасе под разъем:

После этой модификации жизнь резко наладилась. Теперь можно было втыкать любой разъем в любую из ардуин. Хотя, впоследствии, я решил проблему с разъемами еще более радикально. Но об этом – позже.


Разобравшись т.о. с супер-контроллерами, можно было спокойно переходить к следующему этапу. Далее речь пойдет про нижнюю из этих двух ардуин. Именно она обзывается head_DSArray1.

Что на ней есть и чем она может управлять …

Да, собственно, всем тем, что было описано в предыдущих частях повествования:

  • управление пушкой
  • управление ушами
  • управление тремя датчиками касания
  • управление четырьмя светодиодами подсветки на морде лица
  • управление двумя звуковыми сенсорами
  • управление двумя сенсорами освещения
  • управление своей пьезо-пищалкой

Всего: 15 конечных “устройств”. Некоторые их этих устройств имеют свои контроллеры, другие в оных не нуждаются и взаимодействуют с супер-контроллером напрямую.

На уровне виртуального макета и принципиальной схемы это выглядит так:

Как видите, нана заряжена почти целиком. Осталось только два свободных аналоговых входа-выхода (А0 и А3). Они пока оставлены в резерве…

Почему именно эти устройства были собраны вместе под управлением общего супер-контроллера и, что, с его точки зрения, есть такое “управлять” ими?

Тут все просто, даже голову ломать не пришлось: состав устройств подбирался в соответствие с изложенной ранее “системой рефлексов”.

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

Итак…


Освещение

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

Ну уровне базовых функций, каждый из светодиодов умеет три основных режима: гореть, не гореть и мигать.

Все эти режимы – всецело управляемы со стороны мозга. Включая частоту мигания:

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

Пропукать in a round разными светодиодами мелюдию из вступительных титров к кинофильму “Челюсти”? Гемморно и долго программить “сценарий”, но технически – никаких препятствий для этого нет совершенно.

Чего они не делают – не меняют цвет. Потому что, во-первых, это прежде всего источники света, а RGB-светодиоды, в большинстве своем, не такие уж и яркие (это не совсем верное утверждение, только если именно “в целом и общем”).

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

В-третьих, супер-контроллер, который ими управляет, много еще чем управляет. А у контроллера количество выходов не бесконечно.

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


Помимо базовых функций, каждый из светодиодов имеет два условно-безусловных рефлекса. Первый из них: реакция на свет.

На видео хорошо видно, что один из светодиодов работает не синхронно. Когда зажигается свет, он гаснет позже остальных. Это не глюк. Мало того, это прямое доказательство того, что все работает исключительно, как задумывалось!

Дело в том, что робот может “видеть” разницу в освещенности справа и слева от себя. Соответственно, два правых светодиода руководствуются показаниями правого сенсора освещения, левые – левого.

И это еще не все! Для каждого светодиода в каждой паре, установлен свой уровень срабатывания. Т.о., нижний светодиод каждой пары будет загораться уже в полумраке (в зависимости от того, с какой стороны этот “полумрак” зафиксирован). А верхний светодиод каждой пары загорится только в кромешной тьме (в зависимости от того, с какой стороны зафиксировано неумолимое приближение Тьмы) .

Т.о., робот, как бы, может сам, на уровне своего условно-безусловного рефлекса, подбирать интенсивность испускаемого света сообразно обстановке.

У меня в комнате два источника освещения. Относительно головы робота во время съемки они расположены несимметрично. Вырубаются они вместе одновременно сразу нафиг. Тыц – и темнота. Но при включении – тот источник света, что находится правее от робота, врубается не сразу, а плавно…

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

Поэтому, интенсивность потока света с правой стороны нарастает постепенно. Как следствие, и светодиод с той стороны на морде у собачки реагирует не сразу, а по мере того, как свет плавно набирает “полные обороты”. И гаснет только после этого.

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

Вот тут я руками имитирую всякие возможные перепады освещения с разных сторон:

Этот рефлекс является условно-безусловным, потому что, в любой момент, мозг может задать каждому светодиоду какой-то конкретный режим работы. Например выключить совсем. И у такой команды будет абсолютный приоритет перед командами рефлекса.

Если же мозг не хочет от светодиода чего-то конкретного, то светодиод будет гореть или не гореть, в зависимости от освещения.

Это еще не все…


Выше говорилось, о двух рефлексах… Второй – реакция на звук.

Этот рефлекс так же, условно-безусловный. И имеет приоритет ниже, чем у рефлекса на свет. Соответственно, его могут перебить, как команды от мозга, так и рефлекс на свет. Если мозг не хочет ничего конкретного, а вокруг достаточно светло, но шумно, то можно поиграть, например, в “цветомузыку”.

Тут, все то же, что и для рефлекса со светом. Каждая пара справа или слева, руководствуется звуками, зафиксированными справа или слева от головы (“стерео-слух”, однако!). Точно так же, как для для рефлекса на свет, каждый светодиод в паре имеет свой порог чувствительности.

Результат:

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

И, да, разумеется, робот может точно так же реагировать, например, на такие простые вещи, как хлопки в ладоши:

В соответствие с ними, можно научить потом мозг что-нибудь делать… Не знаю… Что там обычно собаки делают, если им в ладоши похлопать?… Впрочем, легко же проверить:

Мнда… По ходу, я пришел к выводу, что имитировать роботом большинство ротвеллерских реакций – очень просто. Достаточно написать всего одну универсальную функцию: “недоуменно взирать, нихрена не делать“… Ладно, что-нибудь придумаю.

Оба рефлекса, как на свет, так и на звук, сделаны условно-безусловными сознательно. Ничто не мешало сделать их конкретно безусловными. Но я подумал, что не захочу посреди ночи получить в глаз заряд из какого-нибудь светодиода только потому, что робот засек, что стало темно или Пес рядом с кроватью взгавкнул о чем-то во сне.

Подводя итог по светодиодам:

  • Каждый из светодиодов может лично гореть или не гореть, вне зависимости от того, что там вытворяют остальные светодиоды.
  • Точно также независимо, каждый светодиод может мигать с заданной лично ему частотой.
  • Реагируют на два пороговых значения освещения (“полумрак”, “темнота”), различая “право” и “лево”.
  • Реагируют на два пороговых значения шума (“средненький шум”, “громкий шум”), различая “право” и “лево”.

Пушка

head_DSArray1 занимается обслуживанием всех ее внутренних функций. Он следит за предельными углами, переводом градусов в шаги сервопривода, направлением поворота и т.п. Мозг лишь отдает прямое указание, типа “ствол на N градусов со скоростью M” = 2 байта значений в одной команде:

Поскольку угол хода ствола не может превышать 150 градусов, то одного байта достаточно для передачи этого значения. Конечно, мозг может приказать поднять ствол вплоть до 255 градусов, но оное будет пресечено супер-контроллером. Любое значение, которой выше заданного предела, автоматически “обрежется” до самого этого предела. Т.е., прямо сейчас, любое значение от 150 градусов и выше, будет означать 150 градусов ровно.

То же самое и с нижним пределом. Оно, кстати, не 0… В соответствие со всякими особенностями сервопривода, расположением дырочек на его ведущем колесе и т.п., минимальный угол установлен в 5 градусов. Соответственно, если мозги и скажут 3 градуса, то супер-контроллер автоматически превратит их в минимальные 5.

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

Со скоростью, чуточку все иначе… Значение 0 означает, что скорость будет максимальной. Сколько серв выжмет из своего мотора, столько и будет. Любое другое значение (от 1 до 255) будет означать количество пропущенных циклов, в течение которых ствол может быть смещен на 1 градус. Соответственно, чем выше это значение, тем больше циклов будет пропущено, тем больше времени нужно будет стволу для достижения заданного угла. Это и определяет его скорость.

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


У пушки тоже есть рефлекс. Всего один. Зато абсолютно безусловный:

Т.е., если тюкать собачку пальцем по стволу, она будет им вздрагивать. Всегда. Не важно, выполняется команда от мозга или нет. Тюк – вздрыг. Она не может это контролировать. Безусловный рефлекс.

Т.о. вы сможете немного продлить свое бренное существование, ежели моя девочка решит вас укокошить. Просто тюкайте ее по носу постоянно – проживете чуть дольше. На минуту-другую… Дело в том, что выполнение команды от мозга всего лишь приостанавливается в момент срабатывания рефлекса. Между вашими тюками, неизбежно будет проскакивать рабочий цикл программы и, рано или поздно… Скорее всего – рано, если вы не Брюс Ли… Ну, потому, что вы не сможете тюкать ствол с той же скоростью, с которой бегает цикл контроллера. Хоть разок, да пропустите… Разок пропустите, другой… Пока не пропустите последнюю команду от мозга к пушке: DALEK MODE – ON! (“Exterminate! Exterminate! “)

О, я еще не закончил со этим рефлексом, подождите…

Опыты над моим уже имеющимся Псом из мяса показали, что если усадить его перед собой и начать методично тюкать ему по носу, то рано или поздно ему это надоест…

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

Так что и механической собачке я тоже заложил похожие способности: “клацнуть зубами” и “бурчать”, когда достали:

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

Долгота возмущенного бурчания так же непредсказуема. Она может бурчать на вас от двух до пяти секунд кряду.

После того, как вы ее задолбаете в очередной раз – все счетчики задолбанности на контроллере, само собой, сбрасываются и вы можете попробовать задолбать ее вновь. Но если решите устроить из этого соревнование, кто раньше задолбается до смерти – уверяю вас, она победит. Она то может делать это БЕСКОНЕЧНО! Ну, пока электричество в проводах есть… Однако, с учетом той малости, что потребляет этот серв и этот контроллер, то ампер-часы у вашего терпения закончатся намного-намного раньше, чем у нее.

Текущий итог по пушке:

  • Может наводиться по высоте на конкретный градус, в установленных пределах
  • Может делать это с различной скоростью. От “максимально быстро” до секунд или, даже, минут.
  • Реагирует на касания
  • Касаниями пушку можно натурально задолбать

Уши

Два уха, два серва:

В плане управления они ничем не отличаются от пушки: мозг может задавать каждому уху свой угол и скорость:

Простите, самих ушей все еще нет. Их имитируют перекладинки на сервах и уродские шайбы с гайками для сенсорики.

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


И для ушей тоже есть рефлексы.

Первый – безусловный рефлекс на касания…

Да, забыл там у пушки написать… Задолбанность определяется по количеству тюков в секунду. Если тюкать чаще одного раза в полторы секунды – включается “счетчик задолбанности”, который и приводит к вышеописанному результату. Если между сериями тюков делать паузу в секунду-две, то счетчик сбрасывается. Т.о. вы можете тюкать собачку безнаказанно, делая серии по пять тюков с паузой в секунду между ними. Так вы ее никогда не задолбаете. Сами – задолбаетесь довольно быстро. Она – нет.

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

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


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

“Угол настороженности” уха зависит от громкости и продолжительности звука. Поэтому, они всегда в движении, если уровень шума превышает некий заданный предел. Причем, имеют некую тенденцию к “охреневанию”: если громко будет достаточно долго, то уши на затылке разве, что узлом не завяжутся.

И в этом, робот просто почти один в один похож на моего живого Пса. Если кто-то просто сидит рядом и тихо ноет – им обоим похрен совершенно, не их проблемы. Хоть весь изнойся. И ухом не поведут. Буквально. Среагируют только на звуки ощутимо превышающие текущий звуковой фон (про тонкости “звукового фона” будет подробнее, когда доберусь до описания управления звуковыми сенсорами). И по мере нарастания интенсивности и продолжительности шума, уровень недоумевания и охреневания в их головах, выраженный в движениях ушей – усугубляется.

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

Итог по ушам:

  • Могут быть установлены на желаемый градус в заданных пределах.
  • Каждое ухо управляется индивидуально (для синхронного управления надо просто передавать одинаковые параметры каждому из ухов).
  • Могут делать это с различной скоростью. От “максимально быстро” до секунд и, даже, минут.
  • Реагируют на касания (безусловный рефлекс)
  • Касаниями их можно задолбать
  • Реагируют на громкие звуки (условно-безусловный рефлекс)

Пищалка

Я уже писал, что пищалка в составе этого супер-контроллера родилась, как средство мониторинга при его отладке.

Например, вот так она сопровождает процесс инициализации:

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

Да, естественно, я не могу различить все оттенки герцовости каждого отдельного писка и определить, что они значат. Но это и не нужно. Постепенно уши привыкают к определенной “правильной мелодии”. А, если что-то пошло не так, то “мелодия” сразу же меняется и становится на слух “неправильной“. Если мелодия стала “неправильной” при запуске – проблема в инициализации. Если при старте мелодия была “правильной”, а во время работы стали вдруг происходить странные вещи, то проблема в логике работы основного цикла, а не в инициализации устройств и назначении им начальных параметров. Это сильно ускоряет поиск и исправление ошибок.


Пускай и родилась пищалка, как временное решение местячковой задачи, но в какой-то момент было решено, что совершенно ничто не мешает сохранить ее в составе устройств робота. Урезав, конечно, ее “отладочный” функционал. Чтобы не лопотала постоянно без остановки, как спятившая белка или BB-8 какой.

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

Вон, рефлексы на касания, описанные выше, уже вовсю ею пользуются.

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

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

А поскольку уже решено, что КАЖДЫЙ супер-контроллер у робота будет иметь свою пищалку, то есть шанс, в параллель к свой основной акустической системе, собачка будет иметь еще и вторичную олдскульную полифонию, в лучших традициях NOKIA 3310. На кой хрен – не знаю. Но, как-то оно уже само собой есть по факту :-)


Очередь команд

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

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

И тут на выручку приходит алгоритм вида “очередь”. В данном случае, очередь типа FIFO (First-In-First-Out):

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

Напрямую из мозга на исполнение в моторы не попадает ничего вообще никогда. Все инструкции мозга для сервов попадают сперва в очередь на супер-контроллере. Если на тот момент очередь пуста – ОК. Эта команда сразу же и выполнится. Если на тот момент в очереди есть какие-то другие команды переданные ранее, то новая команда будет выполнена, как только закончится выполнение всех предыдущих команд.

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

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

Есть один обходной трюк для мозга, заставить контролер выполнить команду (или их серию) НЕМЕДЛЕННО. В контроллер заложена специальная команда сброса очереди. Т.е. если мозг передаст сперва команду на сброс, а потом сразу команду для выполнения действия, то контроллер вмиг забудет все, что он делает или должен был сделать в порядке очереди. Т.о., переданная следом за командой сброса команда на выполнение действия окажется первой и сразу же начнет исполняться.


На текущий момент, в очереди для каждого из устройств может сохраняться до 100 инструкций-действий. При переполнении очереди, контроллер сообщит мозгу об этом прискорбном факте. Точнее, сам он сообщить ничего не может (согласно принципам работы шины i2c), но, зато, мозг, прежде чем отправить “сценарий” может посмотреть, сколько там чего заполнено.

Ограничение на 100 команд – высосано из пальца и задается константой в файле конфигурации. Просто, пока я еще берегу память в этом супер-контроллере… Хотя, сейчас, когда код в нем уже сформирован и отлажен, то, согласно моим подсчетам, это число смело можно увеличить в 10 раз минимум, прокачав каждую очередь для каждого из устройств до 1000 команд! Пока этого не делаю, потому, что пока это не нужно. 100 команд в очереди пока хватает. Дальше будет видно. Константу в файле конфигурации поправить – дело пяти минут.

Резюмируя. В данном супер-контроллере индивидуальные очереди формируются для:

  • Правого уха
  • Левого уха
  • Пушки
  • Пищалки

Дискретность движений

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

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

Отсюда проблема: как управлять всеми устройствами одновременно. Ну, т.е., вот есть три серва: пушка и два уха. Если я им буду отдавать команды по очереди, то они их и будут выполнять по очереди. А, как в этом случае повернуть сразу оба два уха на нужный угол синхронно/одновременно?

Есть разные приемы на этот случай. Как программные, так и “железные” (дополнительные платы с контроллерами, внешне драйверы моторов и т.п.).

Я пошел программным путем. Тут тоже много вариантов, но, в данном случае был выбран самый простой из них. Всего то три мотора с “декоративными” движениями – зачем огород городить?


У ардуины всегда есть некий рабочий цикл, который она гоняет бесконечно, пока включена. Все ее действия происходят внутри этого бесконечного цикла. Движения сервов, опрос датчиков, отслеживание нажатия кнопок и т.п.

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

Скажем, надо одновременно повернуть три мотора: первый на 10 градусов, второй на 20 градусов, третий на 110 градусов и все с разными скоростями. ОК: побежал цикл. Первый мотор на 1 градус. Второй мотор на 1 градус. Третий мотор на 1 градус. Повторять, пока все они не повернуться на заданный угол.

Скорость определяется пропусками в цикле. Сказано “скорость = 7”, значит поворот на 1 градус будет происходит на каждый 7 пробег цикла пока не будет достигнута заданная величина угла. Сказано “скорость 3” – на каждую третью итерацию цикла. И т.п.

Цикл бегает очень-очень быстро. Как следствие, не смотря на то, что команды на поворот отдаются поочередно, вам КАЖЕТСЯ, что они все крутятся одновременно. См. выше видео с ушами, например.

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


Итого, собачка начала потихоньку оживать.

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

И, кажется, все же, придется закладывать собачке два имени. LIKe9 – как официальное “заводское” наименование модели и…

Не, ну, помните, я говорил, что имя Сара моим домашним не нравилось? Так, вот… Парадокс ситуации в том, что, и жена, и дочь, теперь эту личинку робота исключительно только так и обзывают. Вот и доверяй после этого соцопросам… Люди, они такие странные, нелогичные и непоследовательные…


Продолжение читайте в следующих статьях цикла…