Давным-давно, настолько что уже кажется неправдой, на соседнем ресурсе рассказывали про чудесный встраиваемый MP3-плеер, которым можно оснащать все, что угодно, даже MP3-плееры, если из них сначала вынуть собственный, а потом поставить этот. Короче, полезная вещь. Особенно, если хочется сделать детскую игрушку во-первых, своими руками, а, во-вторых — правильно, а не так, как думают те, кто их делает в промышленном масштабе.
Выглядел этот плеер как типичное китайское изделие, и я был очень признателен продавцам за то, что они не стали скрывать маркировку чипа, благодаря чему на Ebay я нашел даже более интересный вариант этой железки. Именно — со слотом microSD вместо флешки фиксированного объема (хотя флешка здесь тоже имеется).
И подумал, что раз у китайцев говорящие игрушки мне не слишком нравятся, то я сделаю свою. С Емелей, так сказать, и щуками.
КДПВ
И заодно видео для того же самого привлечения внимания, пусть даже без купальников и шкафов.
Развлекательные фразы при ожидании:
Переключение сказок, громкости и выключение карточками и встряхиванием:
Беспроводная зарядка:
Но вернемся к плееру. Помимо моей модификации с microSD, они выпускаются c флеш-памятью по крайней мере от 16Мбит до 64Мбит (т.е. от 2 до 8 мегабайт). Зачем я это говорю? Затем, что продавцы, бывает, сами не в курсе, что продают и могут настаивать, что модуль укомплектован 16 мегабайтами или даже 64 мегабайтами, тогда как это совсем не так.
Характеристики вкратце:
Формат MP3: все битрейты, стандарты 11172-3 и ISO13813-3 layer3
Интересно, что и свой модуль я покупал с приключениями. Заказал, приготовился ждать. Ближе к моменту окончания защиты PayPal предупредил продавца, что ничего не получил и посетовал, что при таком раскладе, наверное, придется этой защитой воспользоваться.
Продавец сообщил, что раз так, то вышлет мне еще один, если меня устроит такой вариант. Меня такой вариант устраивал, и спустя некоторое время я таки получил модуль. Из первой посылки или из второй (если она была) — мне неведомо.
Что огорчило при распаковке, так это уже заботливо распаянные гребенки. Вот честное слово, я бы хотел, чтобы их распаивали, скажем, на Arduino Pro Mini, а здесь бы клали рядом. Но в жизни все почему-то все шиворот навыворот.
Короче, печаль, если учесть, насколько муторно удалять гребенку только паяльником. Мое разрушающее ноу-хау: греем пин и дергаем его через размягченный пластик гребенки. Понятное дело, что воспользоваться ей уже не получится, но меня это уже не волновало.
По счастью на плате модуля размещаются и более полезные компоненты. Например, чип-декодер JQ6500 и флэш-память 25L3205 емкостью 32 Мбит (4 Мбайт), если меня не обманывает документация.
С оборотной стороны мы с неземной радостью наблюдаем слот для карт microSD и уже не такой оптимистичный, но все же разъем miniUSB, который служит для загрузки треков во флэш-память (но не на microSD, если, опять же, я все правильно понял). С другой стороны, кому надо пользоваться старым разъемом и непонятной реализацией USB-стыка, когда можно запросто записать все необходимое напрямую на карту?
Здесь же можно видеть светодиод состояния — он горит во время воспроизведения. И нельзя видеть маркировку пинов. С обратной стороны ее тоже не увидишь, поскольку есть она только на картинке продавца:
Вкратце о чем там. Полагаю, что о смысле VCC и GND догадываются все. Я только отмечу, что эти пины сквозным образом соединены на плате (не КЗ, а попарно — VCC-VCC, GND-GND), поэтому при необходимости плеер можно использовать как кросс питания для самоделок: подводим ток к нему и забираем с соседних выводов на другие потребители.
Пины SPK+ и SPK- служат для подключения динамика сопротивлением 8 Ом без дополнительного усилителя. Но это только монозвук, а для стерео служат выходы DAC-L и DAC-R (левый и правый каналы), которые следует использовать с внешним стереоусилителем.
Выводы Pl/Pause, Next/V+ и Pr/V- предоставляют базовое управление воспроизведением. Именно: воспроизведение/пауза, следующий трек (увеличение громкости), предыдущий трек (уменьшение громкости).
При этом воспроизведение/пауза переключается последовательным кратковременным соединением с землей, тогда как комбинация переключения трека и громкости использует два типа «нажатия» — короткое и длинное.
Примерная китайская схема выглядит так:
Также сразу на плате выведены контакты K1 — K5 для прямого воспроизведения пяти треков из памяти и примерный аналог этих пинов ADKEY с резистивным управлением:
Т.е. как видите, чтобы запустить плеер по минимуму, достаточно подключить к нему несколько кнопок, батарейку и динамик. И, конечно, не забыть про карточку памяти с музыкой или книжками — кому что по душе.
Полагаю, именно по этой причине чуть не в каждом описании этого модуля пишется о его применении в различных автономных автоинформаторах на транспорте, предприятиях и т.п.
Вывод VPP/IR служит для управления ИК-пультом, причем (все там же) сообщают, что туда можно подключить простой ИК-приемник, рассчитанный на модуляцию 38 КГц и пользоваться дешевым пультом.
Также выведены контакты для переключения режима воспроизведения и выбора источника воспроизведения (microSD/встроенная память). Должен заметить, что еще упоминается о нераспаянном сопротивлении, площадки которого размещаются над правым верхним углом чипа JQ6500. В зависимости от номинала им можно жестко задать режим переключения файлов при воспроизведении:
Переключение треков в любой момент
Воспроизведение одного трека без возможности включить другой до окончания первого
Воспроизведение одного трека по кругу, пока нажата и удерживается кнопка воспроизведения (в том числе и K1 — K5), и воспроизведение до конца и остановка, когда кнопка воспроизведения отпущена
Воспроизведение только при нажатой и удерживаемой кнопке воспроизведения (в том числе K1 — K5)
Но если честно, то для меня в свете наличия библиотеки для Arduino и желания сделать игрушку более полезными оказались последовательный порт (контакты RX/TX) и сигнал занятости модуля (BUSY).
Тем не менее, минимальный функционал модуля я проверил и получилось следующее. Как можно ожидать, если карты памяти нет, то воспроизведение работает с флэш-памяти, куда были записаны какие-то китайские треки. Если же карта памяти установлена, тогда играть плеер будет именно с нее.
Кнопочки воспроизведения/паузы, переключения треков и громкости работают без сюрпризов. То есть, как положено — переключают и регулируют.
Что касается порядка воспроизведения, то надо понимать, что плеер умеет играть не только из корня microSD, но также из папок. Насколько мне удалось сопоставить результаты, схема здесь следующая.
При последовательном воспроизведении сначала отыгрывается корень, затем — папки. Файлы сортируются по дате модификации. При этом что первым было записано на карту памяти, то первым и воспроизводится.
Что касается форматов, то из общения с китайскими плеерами я вынес, что обычный комплект декодеров это MP3, WMA и WAV. Этот оказался немного нестандартным и может MP3 и WAV. Windows Media, как ни старался, играть заставить не мог (пробовал тестовые файлы 8, 9 и 10 версии — без толку). Возможно, я, конечно, что-то делал не так.
В режиме ожидания плеер потребляет примерно 16 мА, тогда как при воспроизведении в зависимости от установленной громкости (декларируется 30 ступеней) и материала потребляемый ток легко уходит за 100 мА.
Максимальной громкости при этом вполне достаточно, чтобы даже попросить сделать потише, качество звука при использовании встроенного усилителя и более-менее приличного динамика вполне приемлемое для чего-нибудь простого вроде фоновой музыки или аудиокниг.
Теперь что касается управления через последовательный порт. Автор библиотеки рекомендует следующее подключение: TX напрямую к контроллеру, а RX — напрямую, если контроллер работает от 3,3 В и через резистор 1 кОм, если от 5 В.
Для хадкорных программистов тот же автор библиотеки публикует разбор протокола модуля. Но я, повторюсь, подошел к вопросу по-любительски, т.е. использовал готовую библиотеку.
И по этому поводу позволю себе дальше процитировать самого себя, который рассуждал, что нехорошо ограничиваться только плеером и Arduino и добавил в конструкцию простейший вибродатчик SW-18010P и всем известный считыватель карточек RC522.
Все только для того, чтобы полностью избавиться от кнопок, которые в развлекательной игрушке я посчитал лишними. Сами посудите: если кнопки есть, ребенок так или иначе будет их нажимать, причем чаще — случайно, чем сознательно. А сверхчастое переключение сказок все же не совсем правильно.
Здесь же получается как: вибродатчик служит для включения игрушки, когда ребенок берет ее в руки. Тот же датчик не даст игрушке выключиться, пока ребенок ее не положит на достаточно длительное время.
По поводу датчика также хочу заметить, что SW-18010P — более продвинутая версия очень распространенного SW-520 (который я хотел купить поначалу). Что важно для игрушек, так то, что они оба без ртути.
Но при этом конструкция SW-520d подразумевает замыкание контактов при перекатывании шариков:
А SW-18010P состоит из тонюсенькой пружинки, в просвете которой проденут более капитальный контакт. При покачивании контакт замыкается на пружинку — датчик срабатывает.
Кстати, срабатывает абсолютно незаметно для моего тестера, и я поначалу даже подумал, что китайцы прислали брак. Но потом взял себя в руки, подключил датчик к контроллеру и убедился, что он очень даже ничего.
Настолько ничего, что его можно использовать даже в простой охранной сигнализации. То есть, понятно, что кто знает — обойдет. Но по факту штука реагирует даже на несильные удары по поверхности, на которой располагается и на физическое перемещение в пространстве.
Имейте в виду, если что.
Что касается читалки карточек Mifare, то эта штука, на мой взгляд, крайне удобна для переключения сказок. Например, карточки можно прикрепить к книжкам, и тогда ребенок сможет послушать сказку, поднеся игрушку к книжке.
А еще карточки можно прикрепить к различным предметам, и тогда ребенок сможет послушать их описание и правила использования. Например, что вот эта белая фиговина — холодильник, и что мы там храним продукты, чтобы они не испортились, и что по этой причине открывать его почем зря не стоит. Или что вот то — духовка, и она может быть горячей, поэтому не нужно висеть на ее ручке и прикладывать ладошки к стеклу. Много чего можно придумать, тем более, что карточками служат использованные билеты метро (да, мне повезло, я в Москве), которые можно запросто насобирать в нужном количестве.
Поэтому пока я придумывал, как мы теперь заживем, то между делом достал из запасов контроллер ATmega328p, напаял его на макетную платку и прошил загрузчик Adruino через Arduino Mega 2560.
Для удобства вывел последовательный порт, сброс и землю на отдельный разъем для быстрого перепрограммирования. А то знаю себя — залью скетч, а потом одно не то, другое не так.
Рядом распаял еще и стабилизатор на 3.3В, так как RC522 по недоразумению питается именно от этого напряжения, тогда как остальные компоненты прекрасно чувствуют себя на универсальных 5В, которые я предполагал брать от простенького пауэрбанка на аккумуляторах типа 18650.
Решение использовать такой пауэрбанк, а не типичный плоский аккумулятор может показаться нелогичным. Но я подумал, что так как игрушка будет потреблять довольно приличный ток (только контроллер и плеер в режиме ожидания кушают около 40 мА), то возможность быстро заменить пустую батарейку на полную весьма кстати.
А еще мне пришлось добавить пьезокерамическую пищалку для звуковой индикации некоторых событий (чтение карточки, например). Это, скажете, вообще смешно — есть же динамик, так? Ну так, да не так. Динамик ведь подключен к плееру, а не к контроллеру. И еще добавил транзистор в качестве ключа, который отключает MP3-плеер во время сна, чтобы снизить потребление энергии.
Внимательный читатель может заметить, что плеер можно было бы запитать от цифрового пина контроллера, который прекрасно справился бы с включением и выключением. Я бы сам того хотел, но напоминаю, что это только в режиме ожидания плеер потребляет 16 мА. А когда музыка, то он легко забирает больше 100 мА, что уже как минимум вдвое превышает возможности ATmega. Поэтому я взял «любой» npn-транзистор с током коллектора 300 мА и подвел его к цифровому пину контроллера через резистор около 200 Ом.
Зато картридер потребляет в пределах 40 мА, поэтому питающий его стабилизатор можно подключать к цифровому пину контроллера. Так и сделал, но все равно не получилось, о чем — в конце.
Еще такой момент: плееру требуется динамическая головка сопротивлением не ниже 8 Ом. У меня такая была (динамик из системного блока), но звук у нее не очень. Еще были динамики сопротивлением 4 Ом (от типичной китайской колонки). В общем, соединил оба последовательно: один дает больше высоких, другой — низких, а вместе они просто классно звучат.
Осталась мелочь, т.е. зеркало души. Которое проще всего смастерить из пары соединенных последовательно светодиодов. Брутально-красные брать не стал — очень уж страшно. А вот янтарно-желтые глаза — самое оно.
Итак, макет игрушки собран и отлажен. Теперь самое главное: нужен донор телесной оболочки. Вообще, мне очень хотелось птицу-говоруна, но судя по цене соседних игрушек, удовольствие не совсем бюджетное. Особенно если учесть, что интерес ребенка — вещь непрогнозируемая.
Поэтому для начала я стал искать более доступного кандидата на трансплантацию. И такой нашелся: очаровательный еж Ивлин, продающийся в Детском мире.
Конечно, пришлось практически целиком избавиться от богатого внутреннего мира ежа. И заменить его самодельным, упакованным в обычную мыльницу. Впрочем, не совсем обычную. Дело в том, что в отличие от многих, у этой мыльницы плоская задняя сторона, поэтому там удобно размещать считыватель карточек — получится минимальная дистанция. С другой же стороны у мыльницы что-то вроде массажной щетки и даже есть отверстия, т.е. там идеально размещается динамик: звук будет выходить через отверстия, которые не будут перекрыты благодаря массажным шипам. Отверстий, правда, оказалось маловато, но не беда — я еще насверлил.
Тяжелее всего, должен признать, далась хирургия ежа. Во-первых, я не люблю шить. А пришлось прилично: сначала распорол, потом скрепил края, затем пришил шесть кнопок. Потом отпорол шесть кнопок и пришил четыре кнопки. Все почему? Потому что сначала пришил маленькие и неправильно, так что еж расстегивался.
Во-вторых, глаза. Светодиоды я, конечно, предусмотрительно приобрел диаметром 3 мм, чтобы уж гарантированно можно было изобразить ими зрачки. Однако высверлить отверстия в имеющихся глазах ежа Ивлина оказалось не так-то просто. Казалось бы: берешь гравер, ставишь в него нужное сверло — и вперед. Но выяснилось, что во время сверления пластик превращается в вязкую массу, где сверло слабенького гравера вязнет намертво.
И, должен сказать, еж со сверлом, торчащим из глаза, зрелище инфернальное.
Кстати, по этому поводу даже не знаю, что посоветовать. Я как-то извернулся и все-таки проделал отверстия, вставил в них светодиоды и залил эпоксидкой, а сверху покрыл бесцветным лаком для ногтей. Глаза также приклеил к ежу эпоксидкой, поскольку родное крепление погибло в процессе сверления. Результат получился не идеальным, но вполне терпимым.
Как еж работает, вы уже видели. Поэтому могу только продублировать текстом его текущую логику. Изначально еж находится в режиме сна. Если его взять в руки (или просто пошевелить, или пошевелить поверхность, на которой он лежит и т.п.), он проснется по прерыванию, которое сгенерирует датчик вибраций.
После этого через заданные интервалы еж будет говорить заранее заданные фразы, и если в течение некоторого времени ежа не трогать, он снова уснет. А если трогать — не уснет. А если потрясти некоторое время — начнет рассказывать сказку, выбранную в случайном порядке.
Если же к ежу (когда он не спит) поднести карточку, то еж начнет рассказывать сказку, которая ассоциирована с этой карточкой. Жесткой привязки нет, порядок будет меняться при замене сказок. Фиксированы только две служебные карточки: для регулировки громкости и принудительного усыпления ежа. Громкость, к слову, настраивается последовательным переключением трех ступеней (тихо — средне — громко).
Что до янтарных глаз, то они мигают по два раза (в цикле), когда еж проснулся, но молчит и меняют яркость, когда еж рассказывает сказку. Мне это показалось оптимальным вариантом.
В процессе сборки попробовал еще одну новацию: так как у пауэрбанка два разъема (вход и выход), то ко входу подключил имеющийся у меня адаптер беспроводной зарядки Qi. И таким образом получилось, что для перезарядки ежа, его совсем не нужно расстегивать — достаточно просто положить на ночь на беспроводной зарядник. Впрочем, как раз эта функция пока что в режиме тестирования.
Вообще, несмотря на кажущуюся простоту, некоторые вещи меня озадачили. Например, из кода вы можете заметить, что некоторые команды я отправляю плееру несколько раз подряд, да еще ставлю в конце таймаут. А все потому, что на практике в моей конфигурации только так и можно.
Также видно, что я зачем-то контролирую окончание воспроизведения по аппаратному сигналу плеера вместо того, чтобы простой командой включить ему режим воспроизведения только одного файла. Это тоже не просто так: почему-то у меня этот режим не работает, поэтому при окончании одной композиции плеер начинает играть следующую.
Еще любопытным может показаться то, что функция random для воспроизведения случайной композиции постоянно крутится в loop, вместо того, чтобы вызываться лишь когда она действительно нужна. Но тут такое дело: если вызывать ее только когда она нужна, то она почему-то в подавляющем большинстве случаев возвращает одно и то же значение. Зато если поставить в loop, тогда генерируются действительно псевдослучайные значения. Собственно, это я тоже на практике выяснил, когда пытался понять неадекватное поведение ежа.
Наконец, что меня совсем поставило в тупик, так это неспособность справиться с выключением картридера с помощью цифрового пина контроллера, от которого ридер и питается. Почему-то выходит так, что если пин выставить в LOW и затем в INPUT, то ридер не выключается.
При этом, если просто выставить LOW, то светодиод картридера «горит» вполнакала, напряжение на выходе стабилизатора, питающего ридер — около вольта. Если затем на пине контроллера сделать INPUT, это напряжение вырастает примерно до 3В.
Еще интереснее, что если сначала выставить пины контроллера, подключенные к SS и RST ридера в LOW и INPUT, а затем в это же положение перевести питающий пин контроллера, то ридер выключается. И даже потом включается после сна, если питающий пин перевести в OUTPUT и HIGH.
Однако при этом случается что-то непоправимое с таймерами. То есть, это я так считаю, потому что после такого финта (сна с отключением ридера) неадекватно работают глаза и счетчик встряхиваний, а оба эти процесса завязаны на millis(). Что происходит и как восстановить работу таймера, я не знаю, поэтому пока оставил, как есть — картридер продолжает питаться даже во время сна.
Если старшие товарищи помогут найти выход — буду очень признателен. Хотя с трудом верю, что старшие товарищи дочитают до этого места.
С учетом вышесказанного, код ежа Ивлина совсем неидеален, но вы всегда можете причесать его (код или ежа — выбирайте сами), оптимизировать, дополнить, сократить или иным образом приспособить к своим потребностям. Именно поэтому я его и прилагаю. А чтобы было проще использовать то, что есть, максимум настроек (старался вообще все, но получилось как обычно) находится не в коде, а в секции определения переменных. Там и конфигурация пинов, и временные задержки, и количество треков.
В секции описания номеров карточек следует понимать, что последние две карточки всегда «зарезервированы» для внутренних функций — переключения громкости и режима сна.
MFRC522 mfrc522(SS_PIN, RST_PIN); // объект MFRC522
unsigned long uidDec, uidDecTemp; // для отображения номера карточки в десятичном формате
byte bCounter, readBit, nShake, rnd;
byte vol = midVol; // уровень громкости при включении средний
unsigned long ticketNumber;
unsigned long offTimeOut = 0; // счетчик таймера автовыключения
boolean mp3ON = false; // флаг включенного плеера
boolean isInt = false; // флаг прерывания
byte ticketQ = 32; // количество карточек минус два (резерв на карточку-выключатель и громкость)
byte fileQ = 0; // счетчик MP3-файлов
// массив номеров карточек (в десятичном виде, написан на самой карточке), последние две служат для переключения громкости и режима сна. Заполните своими номерами, текущие только для примера
PROGMEM const uint32_t ticketSet[] = {2515217196, 2540548337, 2490970856, 2486466332, 2485920633, 35870611, 37836807, 37836806, 2377004330, 2522873668, 2514304566, 23472725, 2485702426, 2374853555, 2374391583, 2492957469, 2486467162, 2489280075, 2488031661, 2491726641, 2491720188, 2490968782, 2490968783, 2488900952, 2489969016, 2506562651, 2375447052, 2375449579, 2489276180, 2483389692, 2486466331, 2484789326};
При текущей конфигурации аккумулятора емкостью порядка 2500 мАч хватает примерно на сутки использования ежа. Не сказать, чтобы много, но надо понимать, что график все время разный и большая часть энергии тратится, надеюсь, в активном режиме. Что в некоторой степени позволяет пренебречь несостоявшимся полным уводом в сон всей электроники ежа.
Если дать себе труд посчитать примерный бюджет, то получится что-то вроде этого (в USD):
Плеер: 8,9
ATmega328p: 1,1
Макетная плата: 0,28
Считыватель RC522: 2,21
Динамическая головка: 0,99
Пьезокерамический излучатель: 0,77
Светодиоды: 0,12
Транзистор: 0,14
Стабилизатор: 0,13
Вибродатчик: 0,13
Мыльница: 0,99
Пауэрбанк: 0,75
Аккумулятор 18650: 3,9
Зарядный адаптер Qi: 1,65
Карта памяти: 3
Еж Ивлин: 6
Итого 31,06, но на деле чуть больше, потому что еще нужен провод для соединений и другие мелочи вроде термоклея, двустороннего скотча и синей изоленты.
Наверное, должна быть какая-то особо важная заключительная фраза, но у меня в голове ее точно нет. Наверное, имеет смысл сказать, что ребенка игрушка вполне устраивает, и это точно лучше (а часто — и быстрее), чем включать ноутбук.
ps. про Bluetooth-колонки я в курсе, это немного не то, даже если поместить такого милого ежа.
pps. вообще, существуют и другие модули с microSD, но о них мне сказать нечего, поскольку купил я, как обычно, что первое увидел.
Планирую купить+40Добавить в избранноеОбзор понравился+76
+135
За светлую голову и умелые оуки — однозначно жирный плюс!
Но «потряси — получишь сказку»?
Условный рефлекс «вытряхивать необходимое» не сформируется?
:)
напомнили :)… я первого «ежа препарировал» в 88году ;) 10см размером был желтый «кто-то» — медвежонок что ли… Внутрь вставлял спаянный мультивибратор с выводом на 102 красненькие светодиоды вставленные в глаза (моргали при поглаживании животика). На животике самопальный контакт был… — Девчонки когда его видели аж пищали ;) Все мои были — Такая замануха была, в годы обучения в училище ГА :))))
Представил себе эту штуку с датчиками препятствий и автовозвратом на зарядку. Особенно, как его заклинит на «дружок, хочешь я расскажу тебе сказку» в процессе полета )
с датчиками препятствий и автовозвратом на зарядку
Книга Хейзерман Дейв — Как самому сделать робот (1979!!! г.), где автор пошагово описывает изготовление робота из детского автомобиля. В финале робот слоняется по дому, подзаряжаясь по нужде. :)
Еж — терминатор — это круто, но… может быть лучше развивать воображение ребенка, мишка Тедди без единой микросхемы по прежнему любим многими. Сам обзор читался как фантастическое произведение, плюс!)
Так любые есть — и обычных, без всякой электроники, довольно. Вообще, если честно, то мне, конечно, было бы гораздо проще вообще ограничиться только плеером и несколькими кнопками — благо и такое возможно. Но показалось, что черная коробка со сказками будет несколько неправильным решением. Пусть лучше еж рассказывает.
да все равно как он называеться, хоть одноногий медведь из детской сказки! основная мысль в моей фразе: у детей воспитанных гаджетами не формируется воображения, а в последующем плохо с абстрактным мышлением, формируется великолепный человек-оператор, но вряд ли это будет тот, кто двинет науку вперед, напишет музыку или нарисует картину. Автор обзора техноначинку поместил все же в милую игрушку, и функция зверушки все же увлечь ребенка сказкой — не дал планшет в руки и поставил аудио книжку… однозначно плюс!..
От того что все это операторство пошло в основном из США. А дальше Вам стоит почитать хотя бы статью из вики, я даже для Вас ссылку приготовил (https://ru.wikipedia.org/wiki/%D0%9F%D0%BB%D1%8E%D1%88%D0%B5%D0%B2%D1%8B%D0%B9_%D0%BC%D0%B8%D1%88%D0%BA%D0%B0), что бы не утруждать Вас. Думать далее за Вас я не собираюсь. Но намекну — все дорогу он у нас в стране назывался плюшевым мишкой, но ни как не Тедди.
ссылка битая, уж потрудитесь переслать в личку, а еще умилен фразой «прочитать хотя бы..» это моя работа..25 лет… читано не перечитано… и между нами «вики» — не аргумент, есть работы посерьезнее из раздела «Физиология высшей нервной деятельности»
Я ориентировался на говорящую детскую книжку — заметно, что ее светодиоды привлекают ребенка, и поэтому так удается дольше удерживать внимание на самой сказке.
функция random для воспроизведения случайной композиции постоянно крутится в loop
Ни разу не программист, особенно последние лет 20, но:
If it is important for a sequence of values generated by random() to differ, on subsequent executions of a sketch, use randomSeed() to initialize the random number generator with a fairly random input, such as analogRead() on an unconnected pin.
Conversely, it can occasionally be useful to use pseudo-random sequences that repeat exactly. This can be accomplished by calling randomSeed() with a fixed number, before starting the random sequence.
Пруф1Пруф2
В паскале для этих целей использовалась функция Randomize, как щас помню :)
У меня с randomSeed неловко вышло. В том смысле, что меня переклинило, и я посчитал, что все входы/выходы контроллера заняты, поэтому псевдослучайный шум снимать уже неоткуда. Вместо этого попробовал использовать аргументом randomSeed текущее количество встряхиваний. Но это была еще более провальная идея, так как количество-то каждый раз будет разное, конечно, но пороговое значение, которое передается randomSeed всегда одинаково, на то он и заданный порог.
А так как время было позднее, то я решил остановиться на том, что заработало.
Поправьте, если я что-то неправильно понял. Сейчас алгоритм такой. Вибродатчик «висит» на аппаратном прерывании. По срабатыванию датчика обработчик прерываний отключается (как раз чтобы не было лишней реакции на дребезг), событие фиксируется, затем обработчик снова включается.
Количество срабатываний подсчитывается в течение определенного времени (чтобы исключить случайную тряску, когда ребенок, например, просто несет игрушку). Если за это время набралось пороговое значение — выполняется действие, счетчик сбрасывается. Если не набралось — только сбрасывается счетчик.
По-моему, в этой схеме не получается найти «неучтенный» дребезг на служебные цели. С другой стороны, пока что не больно-то и хотелось: во-первых, свой псевдорандом я получил, во-вторых, объективно ресурсов контроллера на все задачи более чем достаточно. Разве что удар по перфекционизму, но скрытая от глаз конструкция так выглядит, что по сравнению с ней это такая малость.
Нет, не учитывается. Пока что просто соберу статистику по использованию, если пожалуются на слишком частое повторение, то добавлю переключение на другой трек. Правда, наверное, в этом случае уже воспользуюсь одним из аналоговых входов для randomSeed.
Я имел в виду, что можно было бы просто зафиксировать факт сработки, а потом, скажем в течении 10мс, считать дребезг в отдельном счетчике. И использовать это число в качестве рандома.
И даже после randomize выборка легко повторяется… Сам недавно на дуньке столкнулся с этой проблемой… Пришлось к рандому кроме реинициализации добавить еще изменяемые пределы и их мапить на нужный числовой отрезок… Только так удалось более или менее рандомно выбирать 10 чисел из 20. Потом допили еще антиповторения если число было выбрано хоть раз за полсдение 10 циклов и только так удалось более или менее ровно генерировать. Хотя елси делать 10 выборок из 1млн, то вполне себе рандомайз сравляется.
Идея хороша. Даже реализация вышла. Но я дальше идеи не дошел. Ну точнее я даже комплектующих накупил. Но потом прикинул сколько это дело стоит уже сейчас… и направил эти вещи в дело, на котором заработал пару тысяч и за 800 рублей купил ребенку большую книжку с «планшетиком».
Хотя идея хороша, но с ребенком надо заниматься. Мы со старшей (6 лет) вместе печатаем пони и прочие игрушки на 3д принтере, потом совместно обрабатываем и разукрашиваем. С такой игрушкой она играет дольше чем с покупной.
За кадром остается то, что это игрушка не на «отвяжись». Это лишь одно дополнение ко всему. Пока что — просто послушать во время какого-нибудь из приемов пищи, потому что, повторюсь, ноутбук — не слишком хорошо, а книжку маме держать, читать и кормить одновременно не всегда удобно (точнее — всегда неудобно, но куда деваться).
Спасибо за обоснование покупки 3D-принтера, обязательно представлю эту концепцию на ближайшие публичные слушания. А то принтер хочется, а поди убеди :)
Я чуть ли не в первый месяц восстановил все потерянные заглушки батарейных отсеков от игрушек и так по мелочи в быту. Жена не спрашивает больше когда принтак начнет зарабатывать деньги. Просто понимает что он уже отбил половину )
FreeCAD. Пока устраивает. Крыжечка с язычком с отверстием под винтик для фиксации + 2 лапки зацепа с друго стороны лежащие на плоскости ниже — 5-10 минут с замерами. 20 минут на печать (крыжки печатаю и 80мм, хотя верхние слои 40, тогда заполнение ставлю 60).
Отличный обзор. По первой картинке думал какая-нибудь очередная фигня, но все же из-за любопытства зашел и не пожалел. По поводу бесконтактных карт, лучше использовать UHF, тогда не нужно будет тыкать книжкой прямо в моську))))
Спасибо ) Я особенно не выбирал карточные решения: считыватель уже был (давным-давно купил сразу несколько), мимо карточек в метро каждый день прохожу — так и насобирал их, сколько нужно.
Просто СУПЕР!!!
Вот еще пару идей для этого ёжика:
— говорит: «Хочу кушать!», когда нужно зарядить;
— на карточки наклеить название книжек — вроде как он читает (пусть даже и поп… эээ… «тылом» ).
Про кушать — отличная идея. Можно будет попробовать кинуть проводочек от аккумулятора на какой-нибудь аналоговый вход для контроля напряжения.
А клеить на карточки названия книжек — не очень. Дело в том, что жесткой привязки карточек к книжкам/сказкам нет, поэтому вся структура может поломаться при обновлении библиотеки (что-то добавил — и готов новый порядок). Здесь нужны какие-то двойные кармашки: чтобы и карточку в него положить, и этикетку, и чтобы все легко менялось.
А схожу-ка я к тебе в карму, друг. Немедленно вспомнил свое раннее детство, начало 80-х и подаренный на день рождения проигрыватель пластинок. Я несколько лет с ним в обнимку провел, какие только сказки не слушал-ставил. А тут целый ежик, да еще и с карточками по включению каждой сказки и беспроводной зарядкой! Очень, очень впечатляюще. Крепко жму руку.
Думаю, что не нарушен. Все, что в еже (включая самого ежа) куплено за свои собственные, тогда как п. 18 (с подпунктами) относится к
обзорам товаров, предоставленных магазином и/или производителем, бесплатно или со значительной скидкой, а также к обзорам товаров, выигранными в конкурсах
За подробный обзор — спасибо!
Давно собираюсь собрать себе говорящие (в темноте) часы-будильник с нарастающей громкостью звонка и дружелюбной установкой времени (два-три-четыре «стандартных» в памяти, и валкодер вместо традиционных кнопок). Очень даже может быть, что и…
"Мое разрушающее ноу-хау: греем пин и дергаем его через размягченный пластик гребенки" — дводилось делать подобное. На мой взгляд проще содрать пластик (поддеть скальпелем-тонкой отверткой-толстой отверткой и дальше равномерно сдвигать-сдергивать по пинам наружу. Даже и греть не обязательно. А металлизированные отверстия выдержат — не пострадают), и дальше выпаивать пины по одному.
А если конфетно-заводской вид не обязателен, то оставшиеся без пластика пины легко гнутся и можно восстановить перпендикулярность плате, после чего они нормально войдут в ответный разъем.
И промежуточный вариант — сдвинуть пластик на пару миллиметров, подгнуть пины, надвинуть пластик назад до упора его в плату.
Я все же очень надеюсь, что больше не придется сталкиваться с необходимостью выдергивать гребенку ) Мне кажется, это вообще какой-то эксклюзив был.
За идею с подгибанием спасибо. Правда здесь она все равно бы не сработала: я решил, что в детской игрушке надежнее будут паяные соединения, а не макетные провода. Да и места лишнего особо не было — даже относительно компактный бутерброд из трех плат в ежа помещается буквально вот только-только.
Но главное — ребенок доволен.
А автору плюс.
Но «потряси — получишь сказку»?
Условный рефлекс «вытряхивать необходимое» не сформируется?
:)
Все мои были— Такая замануха была, в годы обучения в училище ГА :))))Вам бы еще в этого ежа квадрокоптер встроить — летающий еж
ругающийся матомрассказывающий сказки, мегадевайс).
лазерныесветовые лучи пускает)Пруф1 Пруф2
В паскале для этих целей использовалась функция Randomize, как щас помню :)
А за обзор плюс — любопытная штука получилась.
А так как время было позднее, то я решил остановиться на том, что заработало.
Количество срабатываний подсчитывается в течение определенного времени (чтобы исключить случайную тряску, когда ребенок, например, просто несет игрушку). Если за это время набралось пороговое значение — выполняется действие, счетчик сбрасывается. Если не набралось — только сбрасывается счетчик.
По-моему, в этой схеме не получается найти «неучтенный» дребезг на служебные цели. С другой стороны, пока что не больно-то и хотелось: во-первых, свой псевдорандом я получил, во-вторых, объективно ресурсов контроллера на все задачи более чем достаточно. Разве что удар по перфекционизму, но скрытая от глаз конструкция так выглядит, что по сравнению с ней это такая малость.
Хотя идея хороша, но с ребенком надо заниматься. Мы со старшей (6 лет) вместе печатаем пони и прочие игрушки на 3д принтере, потом совместно обрабатываем и разукрашиваем. С такой игрушкой она играет дольше чем с покупной.
Спасибо за обоснование покупки 3D-принтера, обязательно представлю эту концепцию на ближайшие публичные слушания. А то принтер хочется, а поди убеди :)
Вот еще пару идей для этого ёжика:
— говорит: «Хочу кушать!», когда нужно зарядить;
— на карточки наклеить название книжек — вроде как он читает (пусть даже и поп… эээ… «тылом» ).
А клеить на карточки названия книжек — не очень. Дело в том, что жесткой привязки карточек к книжкам/сказкам нет, поэтому вся структура может поломаться при обновлении библиотеки (что-то добавил — и готов новый порядок). Здесь нужны какие-то двойные кармашки: чтобы и карточку в него положить, и этикетку, и чтобы все легко менялось.
Нет? Ну, вам не угодишь… :)
Кстати, а если просто самоклейки кусок? Вплоть до малярного скотча: легко отдирается и писать на нем нормально?
ps. это вы просто не пробовали отдирать малярный скотч от стекла, после того, как этот «бутерброд» провел пару месяцев на солнце )
Отличный обзор, отличный слог, отличная поделка!
Плюсище.
Сразу, после всех подпунктов 18.x:
А обзор интересный и тут вполне уместен. Замечательный и результативный DIY.
Уж всяко лучше стотысячного обзора какой-нибудь ерунды по п.18.
Давно собираюсь собрать себе говорящие (в темноте) часы-будильник с нарастающей громкостью звонка и дружелюбной установкой времени (два-три-четыре «стандартных» в памяти, и валкодер вместо традиционных кнопок). Очень даже может быть, что и…
"Мое разрушающее ноу-хау: греем пин и дергаем его через размягченный пластик гребенки" — дводилось делать подобное. На мой взгляд проще содрать пластик (поддеть скальпелем-тонкой отверткой-толстой отверткой и дальше равномерно сдвигать-сдергивать по пинам наружу. Даже и греть не обязательно. А металлизированные отверстия выдержат — не пострадают), и дальше выпаивать пины по одному.
А если конфетно-заводской вид не обязателен, то оставшиеся без пластика пины легко гнутся и можно восстановить перпендикулярность плате, после чего они нормально войдут в ответный разъем.
И промежуточный вариант — сдвинуть пластик на пару миллиметров, подгнуть пины, надвинуть пластик назад до упора его в плату.
За идею с подгибанием спасибо. Правда здесь она все равно бы не сработала: я решил, что в детской игрушке надежнее будут паяные соединения, а не макетные провода. Да и места лишнего особо не было — даже относительно компактный бутерброд из трех плат в ежа помещается буквально вот только-только.