Реклама ⓘ
Главная » Радиоуправление
Призовой фонд
на апрель 2024 г.
1. 100 руб.
От пользователей

Реклама ⓘ

Роботизированные кошачьи ушки

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

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

И ещё одно наблюдение: популярными становится аксессуар, который в простонародье называется «кошачьи ушки». Это такой ободок с ушами, которые продаются повсеместно. И я подумал, что было бы интересно разработать устройство, которое могло бы выражать эмоции при помощи этих ушек. Как это должно работать: люди давно заметили, что по тому, как человек держит голову можно, в некоторой степени, судить о его настроении. Откуда, по-вашему, взялось выражение «повесил нос»?

В статье хочу рассказать о том, как были разработаны и собраны мои роботизированные ушки.

Для начала небольшой перечень требований, который я предъявил к будущему девайсу:

  1. Автономное питание.
  2. По одному сервоприводу на каждое ухо.
  3. Движение ушей должно быть синхронизировано с движением головы и выглядеть (насколько это возможно) естественным.
  4. Наушники были чёрными, значит, чёрным должно быть и всё остальное!

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

Теперь нужно определиться с конкретными компонентами.

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

Сервоприводы были выбраны китайские с металлическими шестернями (всё, конечно, на втулках, без подшипников) и красивым полупрозрачным чёрным корпусом. К ним в комплекте также шли пластиковые чёрные качалочки. Тип серводвигателя – MG90S. С напряжением питания от 4,8 до 6 вольт (но можно и 3.3В, как выяснилось позже), весом в 14 грамм (что на 5 грамм тяжелее его синего пластикового собрата, того что на фото ниже).

Аккумуляторы. Решено было, что питаться всё будет от двух 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 мм с контргайками, чтобы не открутились. Поставил их для того чтобы можно было установить нулевой угол для каждого уха.

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

Сами же уши пришиваются к специальным креплениям армированными чёрными нитками.

Монтаж

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

Я отказался от использования выключателя и решил просто отсоединять разъём аккумулятора, что упрощает конструкцию. По – началу, порывался и у сервоприводов заменить провода, но потом передумал, и штатные хорошо смотрятся.

И последний штрих – плата акселерометра/гироскопа. Её я приклеил к стабилизатору (который ничуть не греется) при помощи двусторонней самоклеящейся полоски из строительного магазина (с их помощью картины на стены вешают). Получилось не только эстетично, но и практично: эта полоска обладает некоторой упругостью, потому и акселерометр тоже может немного двигаться, что позволяет немного гасить вибрации, мешающие ему работать (он и без них, к слову, шумит).

Софт

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

Программа была написана на СИ++ в среде 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 (двухпроводной интерфейс). Таким образом, мы получаем полноценный аппаратный 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-бит
ATmega8
1 с любым буквенным индексомПоиск в магазине ОтронВ блокнот
U2 DC/DC импульсный конвертер
LM2575-N
1 Поиск в магазине ОтронВ блокнот
D1 Диод Шоттки
1N5819
1 Поиск в магазине ОтронВ блокнот
D2 Светодиод3мм синий1 Поиск в магазине ОтронВ блокнот
Y1 Кварцевый резонатор8МГц1 Поиск в магазине ОтронВ блокнот
C1, C2 Конденсатор22 пФ2 СМД 0805Поиск в магазине ОтронВ блокнот
C3 Конденсатор330 мкФ1 Поиск в магазине ОтронВ блокнот
C4 Конденсатор100 мкФ1 Поиск в магазине ОтронВ блокнот
L1 Катушка индуктивности100 мкГн1 Поиск в магазине ОтронВ блокнот
R1 Резистор
10 кОм
1 СМД 0805Поиск в магазине ОтронВ блокнот
R2 Резистор
100 Ом
1 СМД 0805Поиск в магазине ОтронВ блокнот
Добавить все

Скачать список элементов (PDF)

Прикрепленные файлы:

Теги:

Опубликована: 0 0
Я собрал 0 Участие в конкурсе 4
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 4.9 Проголосовало: 4 чел.

Комментарии (13) | Я собрал (0) | Подписаться

0
Публикатор #
На форуме автоматически создана тема для обсуждения статьи.
Ответить
0
BARS_ #
Кроме того, на этих аккумуляторах уже установлен контроллер заряда/разряда
Это всего лишь плата защиты, которая ничего кроме порога напряжения не контролирует и заряжать АКБ только через нее нельзя.
Ответить
0

[Автор]
МеханикАртем #
Прошу прощения, но я не написал, что аккумуляторы нужно заряжать через "плату защиты". Да, мой косяк. Я использую дешёвенькую зарядку для li-on аккумуляторов. Для каждого аккумулятор своё зарядное устройство.
Ответить
-1
BARS_ #
Микруха TP4056 решит проблему зарядки
Ответить
0
гость #
4056 предназначена для 1 аккумулятора(3,6v) , а у автора используются 2 и последовательно. li-on акб не заряжают в последовательном соединении без "балансира", так что эта ТР4056 здесь не применима,нежели только по одиночке заряжать, или как простой вариант использование китайских зарядных устройств,или собрать ЗУ самому под нужное количество элементов на спец.микросхемах.
Ответить
0

[Автор]
МеханикАртем #
Я так и делал, по одиночке заряжал через эту микросхему, знаю, вариант не очень технологичный... Зато всё просто получилось.
Ответить
-1
BARS_ #
Поставить пару микросхем и переключатель для перекоммутации включения АКБ. Либо же делать балансир.
Ответить
0

[Автор]
МеханикАртем #
С балансиром мучится не хочется, вроде и схема - то у него простая, а вроде всё равно платку делать надо... Вот первый вариант мне очень нравится! В следующей версии так и сделаем!
Ответить
0
sergej_shaggy #
Браво. Идея оригинальная. Попробую для дочки сделать. А недочеты - они у всех есть. Как говорится - нет такой схемы, которую нельзя улучшить.
Отредактирован 30.01.2017 19:58
Ответить
0
Евгений #
Очень заинтересовала ваш проект . Хочу сделать практически то же самое , но с дальнейшим развитием и добавления степени свободы ушам (добавить по серве) . Вопрос в следующем :
1. я правильно понимаю что ваш скетч так же можно поднять на стандарной Ардуино плате с ATmega328?
2. из гиродатчиков у меня есть только (как я понимаю он довольно приличный) GY-85 платка. Подскажите алгоритм как подобраться к ее данным?... Ну или более детально опишите как вы действовали со своей.
Ответить
0

[Автор]
МеханикАртем #
1. Да, тем более, что ATmega328 имеет точно такую же распиновку, что и ATmega8 и сходный набор переферии (он просто быстрее).
2. Я с таким не работал, но взглянув описание - ничего там особенного нет, обычный I2C интерфейс (так же как и в моём случае)... А подбираться к данным - читать даташит на чип, который там стоит и выяснять.
Впрочем, если будете использовать Arduino, то есть готовая библиотека.
Ответить
0
Евгений #
Спасибо за оперативность. Погрузился я в библиотеки и прочие тонкости ардуино. Вопрос другого плана :
В описании вы говорите что используете показания акселерометра ( нет ошибки тут? ), гироскоп не используется ? то есть алгоритм тут : ускорение вниз- оба уха вниз, чем больше ускорение вниз, тем больше угол вниз и наоборот. Соответственно если ушки внизу и выключить систему, а затем включить , то ушки обратно вернутся только если взмахнуть назад головой. Верно? Использование данных гироскопа тут не правильнее будет?
Ответить
0

[Автор]
МеханикАртем #
Акселерометр здесь измеряет проекции ускорения свободного падения на оси Х и Y.
С гироскопом может и правильнее было, но с ним вот какая проблема: на выходе этого датчика мы получаем не угол, а угловую скорость, а её не очень удобно использовать для управления ушками. Чтобы преобразовать угловую скорость в угол наклона головы необходимо производить интегрирование (численными методами, разумеется), так вот, после нескольких взмахов головой такая система быстро потеряет ноль... Происходит это из-за того что производить интегрирование мы можем с конечной точностью, отсюда и проблемы. Для компенсации этого эффекта используются показания акселерометра (по вышеописанному алгоритму), таким же образом строятся системы стабилизации квадрокоптеров. А коль всё равно возится с акселерометром, то чего просто так гироскоп трогать?
Акселерометр, правда чувствителен к линейным ускорениям, но это не сильно мешает.
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется напряжение?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Квадрокоптер Syma X11
Квадрокоптер Syma X11
Сатфайндер Набор начинающего радиолюбителя
вверх