Сегодня очень популярными становятся различные гаджеты, которые могут каким – либо образом отражать человеческие эмоции, работу его мозга и т.д. Особенно в этом деле преуспели японцы. Целый перечень устройств, которые позволяют необычным способом выражать ваше настроение: от меняющей цвет одежды до электронных кошачьих ушек.
На самом деле тема анализа работы мозга очень интересная и многогранная. К этому анализу можно подходить с разных сторон. Не лишь отслеживание активности этого органа при помощи электродов, прикреплённых к голове, но и считывание некоторых физиологические показатели. Сегодня я хочу поговорить именно о втором варианте (до нейрокопьютерного интерфейса мы доберёмся в одной из следующих статей).
И ещё одно наблюдение: популярными становится аксессуар, который в простонародье называется «кошачьи ушки». Это такой ободок с ушами, которые продаются повсеместно. И я подумал, что было бы интересно разработать устройство, которое могло бы выражать эмоции при помощи этих ушек. Как это должно работать: люди давно заметили, что по тому, как человек держит голову можно, в некоторой степени, судить о его настроении. Откуда, по-вашему, взялось выражение «повесил нос»?
В статье хочу рассказать о том, как были разработаны и собраны мои роботизированные ушки.
Для начала небольшой перечень требований, который я предъявил к будущему девайсу:
После того, как были сформулированы задачи, настал этап поиска инженерных и дизайнерских решений. Процесс был не очень длинным, всего пара – тройка эскизов и уже был определён внешний вид будущего устройства.
Теперь нужно определиться с конкретными компонентами.
Основа. В качестве основы были взяты мои старые, добрые наушники, которые, как выяснилось позже, очень хорошо подошли для этого. Из особенностей их конструкции стоит отметить лишь наличие каркаса в виде 2-х стальных стерженьков, покрытых резиновой нескользящей оболочкой. Именно на эту раму и крепятся все компоненты.
Сервоприводы были выбраны китайские с металлическими шестернями (всё, конечно, на втулках, без подшипников) и красивым полупрозрачным чёрным корпусом. К ним в комплекте также шли пластиковые чёрные качалочки. Тип серводвигателя – MG90S. С напряжением питания от 4,8 до 6 вольт (но можно и 3.3В, как выяснилось позже), весом в 14 грамм (что на 5 грамм тяжелее его синего пластикового собрата, того что на фото ниже).
Аккумуляторы. Решено было, что питаться всё будет от 2-х Li — po 3.7V – 380мАЧ – 25C. Здесь поясню немного: это самые маленькие литий — полимерные аккумуляторы, которые я лишь смог найти. «25С» характеризует способность данного элемента к токоотдаче. В этой формуле «С» — ёмкость аккумулятора. Если соединить их последовательно, то это будет неплохой источник энергии напряжением 7.4В и ёмкостью 380мАЧ. Кроме того, на этих аккумуляторах уже установлен контроллер заряда/разряда, который не даём им зарядиться выше напряжения 4.2 В и разрядится ниже 3.0 В (по другим данным, до 3.3В).
Управление. Здесь всё классически: микроконтроллер ATmega8 (кварцевый резонатор на 8МГц) в DIP корпусе, ведь это всё же прототип; импульсный преобразователь LM2575 на 3.3 вольта. Для всех компонентов делаем плату и не мучаемся с горой проводов. Чтобы синхронизировать работу ушей с движениями головы, решено было использовать акселерометр. Паять отдельно акселерометр я не стал, а взял из запасов плату с микросхемой MPU-6050. Это 3 – х осевой гироскоп и акселерометр в одном корпусе, с I2C интерфейсом (подтягивающие резисторы уже установлены). На плате датчика установлен стабилизатор напряжения на 3.3 вольт, что позволяет подключать её к источнику в 5В. Также присутствует светодиод индикации питания.
И самое интересное! Крепления всех элементов выполнены из чёрного ABS пластика с применением аддитивных технологий. Проще говоря, они напечатаны на 3D принтере.
И ещё немного о «железе», о самих ушках: как я уже писал, это довольно модная вещь сегодня, и найти её не составило труда. В ближайшем магазине были куплены самые симпатичные (и самые чёрные) ушки на ободке.
Разработка устройства
С комплектующими разобрались, теперь несколько слов о процессе разработки и несколько фотографий этого процесса.
Электроника
Принципиальная схема устройства очень проста, всё взято из даташитов на соответствующие микросхемы. Для большей стабильности к микроконтроллеру цепляем кварцевый резонатор.
Разработка печатной платы не заняла много времени, взял давно опробованный вариант, называю её «полуотладочной», несколько модифицировал и готово. Всё делал при помощи бесплатной версии программы DipTrace. Очень удобная во всех отношениях, есть возможность автотрассировки (которой я не воспользовался), единственное ограничение на бесплатную версию: лишь двусторонние платы и не более 300 выводов.
О том, как изготавливать двусторонние печатные платы ЛУТом я писал в этой статье. Потому здесь не буду подробно описывать этот процесс, а сразу покажу готовый результат.
Решил использовать несколько необычную для себя заливку для платы, получилось неплохо.
Микроконтроллер устанавливаем в панельку, чтобы случайно не повредить во время пайки. Стабилизатор и все электролитические конденсаторы устанавливаем в «лежачем» положении, чтобы не торчали. По возможности, я старался использовать SMD компоненты (размер 0805), в частности конденсаторы на кварце, резисторы на RESET и на светодиоде (всё для экономии пространства).
О подключении сервоприводов хочу сказать вот что: сначала, подключил их напрямую к аккумуляторам, т.е. 7.4В. При изменении положения они сильно дёргаются, что выглядит совсем не здОрово, да и шумно получается. Дело в том, что сервомашинки работают практически без нагрузки, что приводят к тому, что при установке угла, вал «проскакивает» нужное положение и получаются некоторые автоколебания. Чтобы избавится от этого, я запитал сервы от стабилизатора 3.3В и всё стало как нужно.
Механика
Что здесь сказать? Использование технологий 3D печати позволяет в разы ускорить разработку и создание прототипов устройств. Если что – то не понравилось, то легко переделывали. Были изготовлены держатели для аккумуляторов, сервоприводов и платы управления. При этом, всё сделано без единого гвоздя, без использования винтов и клея. Можно снять и установить обратно любой компонент, а самое главное: имеется возможность быстро менять взаимное расположение всех частей, чтобы добиться максимальной эстетичности конечного изделия.
Немного обманул, два винта есть. Они скрепляют качалку сервопривода и держатель уха. Это обычные винтики 3 мм с контргайками, чтобы не открутились. Поставил их для того чтобы можно было установить нулевой угол для каждого уха.
К слову о креплении ушек. Ободок, к которому они пришиты изначально – металлический каркас (стальной, я полагаю, как и в наушниках), обитый тканью, к которой и приделаны уши. Я решил сохранить часть рамы под ушами, чтобы те не теряли форму.
Сами же уши пришиваются к специальным креплениям армированными чёрными нитками.
Монтаж
Вы, наверное, догадались, провод, какого цвета я использовал для соединения компонентов, он в 2-х местах крепится к каркасу наушников чёрными стяжками, получилось очень гармонично, на мой взгляд.
Я отказался от использования выключателя и решил просто отсоединять разъём аккумулятора, что упрощает конструкцию. По – началу, порывался и у сервоприводов заменить провода, но потом передумал, и штатные хорошо смотрятся.
И последний штрих – плата акселерометра/гироскопа. Её я приклеил к стабилизатору (который ничуть не греется) при помощи двусторонней самоклеящейся полоски из строительного магазина (с их помощью картины на стены вешают). Получилось не лишь эстетично, но и практично: эта полоска обладает некоторой упругостью, потому и акселерометр тоже может немного двигаться, что позволяет немного гасить вибрации, мешающие ему работать (он и без них, к слову, шумит).
Софт
С софтом можно экспериментировать бесконечно, подбирая различные алгоритмы управления ушами, чтобы они смотрелись как можно более естественно. И это тема совершенно другой статьи. Здесь я хотел бы заострить внимание на функциях, обеспечивающих работу отдельных частей системы. Исходный код программы и прошивку прилагаю в конце статьи. Код хорошо прокомментирован, потому проблем возникнуть не должно.
Программа была написана на СИ++ в среде WinAVR – удобный и мощный программный пакет (компилятор и некоторые средства разработки), поддерживающий большое количество языков программирования и типов микросхем.
Немного о принципах управления сервомашинками. Управляются они при помощи сигнала широтно – импульсной модуляции (ШИМ/PWM). На частоте в 50 Гц. Угол поворота задаётся длительностью импульса. Для разных моделей сервоприводов эта длина различна, но в общем случае, 0 градусов – 0.8 мс, 170 градусов – 2,3 мс. Всё просто!
В микроконтроллере ATmega8 имеется 16 – битный таймер, с которым могут быть связаны два пина микроконтроллера (OC1A и OC1B). Для запуска ШИМ необходимо настроить таймер на генерацию частоты в 50Гц. Для этого выбираем режим FastPWM (mode 14), выставляем делитель на 8 и записываем в регистр ICR1 значение в 20000. Разумеется, более подробную информацию обо всех тонкостях работы с ШИМ и управлению сервоприводами вы можете прочитать либо в первоисточниках, либо в их многочисленных аутентичных переводах.
Инициализацию таймера я «упаковал» в небольшую функцию, которая запускается один раз.
void init_PWM (void) { // функция инициализации ШИМ и всех необходимых функций для управления сервоприводами
DDRB |=(1<<servo_1)|(1<<servo_2)|(1<<sistem_LED); // настраиваем пины сервоприводов и светодиода на выход
// настраиваем ШИМ для управления сервоприводом
TCCR1A = (1<<COM1A1)|(0<<COM1A0)|(1<<COM1B1)|(0<<COM1B0)|(1<<WGM11)|(0<<WGM10); // режим Fast PWM, состояние выводов меняется при преполнении счётчика, верхний предел задаётся ICR1
TCCR1B = (0<<CS10)|(1<<CS11)|(0<<CS12)|(1<<WGM13)|(1<<WGM12); // предделитель 8
ICR1 = 20000; // частота ШИМ сигнала
// длительность импульсаменяется от 2000 до 700
OCR1A = 1350; // выставляем сервопривод в среднее положение
OCR1B = 1350;
}
В процессе первых запусков выяснилась одна неприятная деталь, присущая данным сервоприводам. На выходном валу с металлической шестернёй имеется пластиковый стопор, который не даёт ему вращаться на 360 градусов (это сделано, чтобы спасти от «выкручивания» хрупкий переменный резистор, отслеживающий положение вала). Так вот, когда мы даём команду машинке повернуться в крайнее положение, именно этот стопор не даёт ей вращаться дальше и после нескольких таких команд он просто ломается! Машинку клинит, приходится разбирать её, вытаскивать, собирать.… Чтобы этого не происходило нужно программно ограничить угол поворота сервопривода. Для этого была написана ещё одна функция.
void servo_controller (unsigned int data_servo_1, unsigned int data_servo_2) { // функция, контролирующая работу сервоприводов
if(data_servo_1<850) { OCR1A = 850; } else if (data_servo_1>1800) { OCR1A = 1800; } // ели значения выходят за предлы диапазона, ограничесваем их
else { OCR1A = data_servo_1;}
if(data_servo_2<850) { OCR1B = 850; } else if (data_servo_2>1800) { OCR1B = 1800; }
else { OCR1B = data_servo_2; }
}
Далее – работа с акселерометром. Как я уже писал, микросхема MPU-6050 имеет I2C интерфейс и добрую сотню регистров предназначение многих из которых — загадка, при этом, говорят, что некоторые ещё и не отражены в карте регистров даташита. К счастью, нам и не нужно знать их все. Чтобы включить датчик необходимо лишь сбросить в 0 регистр с адресом 0x6B, остальные настройки оставляем по дефолту.
В микроконтроллерах AVR формально нет I2C интерфейса, потому что права на него принадлежат компании Philips, но об этом все забыли… и поместили в микроконтроллер, назвав его TWI (2-хпроводной интерфейс). Таким образом, мы получаем полноценный аппаратный I2C с другим названием.
В программе довольно много функций описывают работу с этим интерфейсом, потому я не привожу их здесь. Кроме того, они не являются образцом, есть куда более удачные примеры его реализации. И, тем не менее, мой вариант работает и с ним можно легко разобраться.
Стоит уделить внимание обработке данных с акселерометра. В силу многих причин показания акселерометра сильно «пляшут», даже если он лежит неподвижно. Это связано с внутренними шумами. Чтобы избавиться от них, применяют различные фильтры (вы думаете, зачем его в один корпус с гироскопом поместили?). Один из наиболее простых (но от того не менее эффективных) – фильтр скользящего среднего. Как он работает: накапливаем несколько значений (10) и считаем среднее арифметическое, на каждом следующем шаге берём новое значение и 9 с предыдущих шагов и снова считаем среднее арифметическое. Так мы получаем хорошее усреднение, что обеспечивает необходимую стабильность показаний акселерометра, главное правильно подобрать количество усредняемых значений (размер окна). Я использовал 50.
while (1==1) { // здесь реализован фильтр скользящего среднего значения для оси X и Y
if(i<50) {i=i+1;} else {i=0;} // если указатель на элемент массива не переполнился, инкрементируем его, иначе — 0
get_value_from_Axel(); // считываем показания акселерометра
value_return_Y [i] = AxY; // сохраняем значение по оси Y в ячейку массива
value_return_X [i] = AxX; // сохраняем значение по оси X в ячейку массива
for(unsigned char k=0; k<50; k++) { // суммируем все значения массивов
sum_Y = sum_Y + value_return_Y[k];
sum_X = sum_X + value_return_X[k];
}
AxY_angel=sum_Y/50; // вычисляем среднее арифметическое для элементов массива
AxY_angel = AxY_angel*1.5; // и домножаем на коэффициент, чтобы сервоприводы доходили до нужных точек
AxX_angel=sum_X/50;
AxX_angel = AxX_angel*1.5; // коэффициенты подбираются экспериментально и могут отличаться для правого и левого уха
sum_Y=0; // обнуляем суммы
sum_X=0;
servo_controller(1350+AxY_angel-AxX_angel,1350-AxY_angel-AxX_angel); // помещаем значения в функцию управления (микшер)
}
Но помните: чем больше размер окна, тем медленнее работает микроконтроллер, тем медленнее реакция ушек на движение головы, тем больше их стабильность.
И последнее, но не по значению – микшер. Я уже говорил, что можно придумать множество алгоритмов работы ушек. После некоторых размышлений, пришёл к выводу, что оптимальным будет такой: при наклонах головы в разные стороны – одну ухо опускается, другое поднимается, при наклонах головы вперёд – назад уши одновременно опускаются и поднимаются. Вопрос лишь в том, что делать, если одновременно происходят два события. Ответ: команды нужно совмещать. Это делается при помощи микшера, в случае моего простого алгоритма – банальным суммированием.
И наконец роботизированные кошачьи ушки готовы:
Вот и всё! Несколько фотографий готового устройства. И видео его работы.
Всем спасибо за внимание! Если возникнут вопросы, я с удовольствием отвечу на них в комментариях.
Список радиоэлементовОбозначение
Тип
Номинал
Количество
ПримечаниеМагазинМой блокнот
U1
МК AVR 8-битATmega81
с любым буквенным индексомU2
DC/DC импульсный конвертерLM2575-N1
D1
Диод Шоттки1N58191
D2
Светодиод3мм синий1
Y1
Кварцевый резонатор8МГц1
C1, C2
Конденсатор22 пФ2
СМД 0805C3
Конденсатор330 мкФ1
C4
Конденсатор100 мкФ1
L1
Катушка индуктивности100 мкГн1
R1
Резистор10 кОм1
СМД 0805R2
Резистор100 Ом1
СМД 0805Добавить все
Скачать список элементов (PDF)
Прикрепленные файлы: