Механика
Детали ЧЯКа напечатаны на 3D принтере и после сборки нижней, средней и верхней частей склеены вместе.
Запорный механизм сделан электромеханическим, при этом основные запорные функции реализованы чисто механически, это затрудняет взлом ЧЯК путем манипулирования с зазорами и выниманием батареек.
Запорная система состоит из рейки с зубьями и бистабильной трещотки, которая позволяет двигаться лотку только в направлении закрытия. По достижению заданного промежутка времени серво совершает однократное движение туда-сюда и толкает трещотку, которая устанавливается во второе стабильное состояние “открыто”. ЧЯК остается открытым до тех пор пока пользователь механически не выдвинет лоток. При выдвижении лоток толкает трещотку и переводит ее во взведенное состояние снова.
Загрузчик сделан в виде барабана с 4 углублениями для сигарет. Чтобы избежать попытки достать сигарету через загрузчик, храповой механизм не позволяет движение в обратную сторону, со стороны которой сделаны отбойники.
На верхней крышке проделаны прорези, они позволяют ликвидировать возможные перекосы сигарет внутри коробки и вытрясать табачную крошку.
Интерфейс
Для контроля за временем, количеством сигарет в ЧЯКе, и количеством вынутых сигарет следит OLED display. Он выключен почти все время, чтобы не разряжать батарею и включается только по сигналу с центрального емкостного сенсора, срабатывающего при поднесении руки к ЧЯКу или сигнала с кнопки при загрузке сигарет. Еще одна кнопка фиксирует момент закрытия лотка и запускает следующий цикл задержки. Два дополнительных емкостных сенсора расположены на задней стенке и служат для подстройки счетчиков сигарет (необходимых, например, при смене батарей).
Электроника
Микроконтроллер это Teensy LC. Это ардуиноподобное устройство, совместимое с большинством ардуиновских библиотек, было выбрано из-за того, что в нем есть поддержка емкостных сенсоров (touch sense interface (TSI)). Сенсоры настолько чувствительны, что легко чувствуют поднесенную руку на расстоянии сантиметра. Teensy LC имеет так называемый LLWU режим, в этом режиме все модули находятся в спящем режиме, за исключением 1-kHz осциллятора. Из этого спящего режима можно выйти 4 способами a) получить прерывание с емкостного сенсора, b) получить прерывание с пина, с) получить переполнение 1-kHz счетчика (low-power timer, LPTMR), d) получить прерывание от alarm.
Вот тут автора и ожидала неприятность: в первоначальных планах было использовать TSI для вывода из спящего состояния при поднесении руки, а LPTMR для периодических прерываний для подстройки TSI уровней (зависят от окружающих условий) и контроля за временем. Но оказалось, что LPTMR используется для функционирования TSI, и, соответственно, не может быть использован как счетчик времени. (прерывание по переполнению LPTMR есть hardware triggering для TSI, и, конечно, должно быть быстрым, чтобы следить за сенсором. Обычно этот счетчик предустанавливается на минус один, чтобы TSI опрашивался с максимально возможно частотой в 1 kHz).
Другой возможностью было бы использование прерывание RTC alarm, но дело в том, что у Tenncy LC нет real time clock (RTC). Вернее RTC есть в самом процессоре, но нет разводки для RTC кварца на плате. Однако, разработчик процессора оставил некоторую лазейку для пытливых умов. 1кГц осциллятор (который работает в спящем режиме) может быть использован как источник для RTC регистров контроллера. Тогда получается, что RTC может считать не секундные интервалы (как при использовании кварца на 32кГц), а 32-ух секундные, если использовать 1 кГц осциллятор. Этой точности, конечно маловато. Но есть и выход.
Вот как это работает:
Есть RTC Time Prescaler Register (RTC_TPR). Этот 16-битный регистр считает импульсы осциллятора. При его переполнении RTC Time Seconds Register (RTC_TSR) увеличивается на единицу. В классическом режиме это и есть секунды, которые сравниваются с RTC Time Alarm Register (RTC_TAR), при совпадении генерируется alarm interrupt. При использовании обычного 32кГц кварца RTC_TSR не предустанавливается, а каждый раз считается с нуля (32768 до переполнения (секунды)). Но если мы каждый раз будем предустанавливать RTC_TSR с учетом того, что у нас медленный 1кГц осциллятор мы можем получать alarm interrupt вплоть до миллисекундной точности (не учитывая неточность самого осциллятора). Конечно, RTC_TAR тоже должен быть соответственно пересчитан.
Например, если мы хотим установить период в 87 секунд, мы должнв записать 2 в RTC_TSR (2*32768=65536ms=65.536s), 2 в RTC_TAR и 32768-(87*1000-65536)=11304 в RTC_TSR. Тогда до первого переполнения RTC_TPR пройдет 32.768-11.304=21.464 секунды, и к ним добавится два полных цикла 2*32.768=65.536, что составит как раз 21.464+65.536=87 секунд
В общем случае так:
void setAlarm(uint32_t seconds ) {
RTC_SR = 0; //disable RTC
RTC_TPR=32768-(seconds*1000%32768);
RTC_TSR=0; //RTC counter
RTC_SR = RTC_SR_TCE; //enable RTC
RTC_TAR = seconds*1000/32768;
}
И даже мы можем следить за общем временем (с точностью до погрешности 1kHz осциллятора), например, если в начале программы все RTC регистры были нулевые:
timeEllapsed=(RTC_TSR*32768+RTC_TPR)/1000
Точность 1kHz осциллятора невелика, но для наших целей вполне хватит. Надо учесть, что при запуске нового alarm мы модифицируем регистры RTC, поэтому, если надо следить за временем, до запуска alarm они должны быть запомнены, а после выхода из alarm interrupt пересчитаны снова с учетом времени проведенного в спячке. Подробно я описал это здесь:о RTC для Teency LC
В ЧЯК прерывание каждые 10 минут измеряет и запоминает уровень сигнала с емкостных сенсоров в отсутствии руки. Это сделано для того, чтобы можно было надежно отслеживать изменение сигналов при приближении. При background в ~500 единиц мы используем уровень превышения в ~20 единиц, это дает возможность чувствовать руку на расстоянии 5-10мм. Уровень background зависит от температуры и влажности, поэтому для надежности он должен быть периодически подстраиваем. Вот это, я считаю, есть недоработка разработчиков процессора. Почему они не дали возможности иметь одновременно wake up от TSI и какого-нибудь еще одного low power counter (всего-то надо было добавить еще один регистр), ведь периодическая подстройка уровней TSI практически обязательна, даже если не нужен таймер для других целей!
Теперь про потребляемую энергию. В LLWU спящем режиме Teensy LC при отсутствии обвеса потребляет около 15 uA. Нам надо было подключить еще OLED display и серво. Оба этих устройства имеют большие токи утечки даже в пассивном состоянии.
С OLED все просто, это Adafruit 0.96” Monochrome 128x64 OLED display, он питается от 3.3V, потребляет ток порядка 20 mA во включенном состоянии (зависит от количества задействованных пикселей) и управляется по SPI. То есть достаточно подключить его вход питания к 20 миллиамперному выходу Teensy LC (у Teency есть выходы разных типов) и готово. Когда все спит этот выход просто переводятся в 3-е состояние и ток через дисплей не идет, при wake up выход переводятся в output high state и становится Vcc для дисплея.
С серво немного сложнее. Серво в режиме ожидания потребляет ток около 2 мА, что, конечно, не приемлемо. Поэтому надо его полностью выключать на время сна. В отличие от классических Ардуин, Teensy LC имеет довольно небольшой выбор питаний: это или 1.7-3.3 В включенных прямо, или 2.6-5.5 В (c включенным внутренним voltage regulator). Обычно доступные серво работают как минимум от 1S Lipo, а это 3.3-4.2 В. Поэтому нам надо включить последовательно три стандартные батарейки, чтобы иметь от 3.3 (разряд) до 4.6 В (новые). Для большинства серво 3.3 В на пределе срабатывания, поэтому прямо выходы Teensy использовать нельзя (как для OLED). Да и ток во время вращения порядка 50 мА, что многовато для Teensy LC. Поэтому серво включен через MOSFET:
При таком включении может показаться, что это не безопасно так как при выключенном MOSFET напряжение на PWM ctrl входе превышает 3.3 В, а входы Tennsy LC не 5V tolerant (в отличие от классических Ардуин). Но опасаться этого не стоит, помня о том, что ток PWM сtrl очень мал, и опасаться за ограничивающий диод на входе процессора не надо (причина недопустимости превышения Vcc+0.5 именно в этом диоде), более того, при токах сравнимых с токами закрытого диода он даже не будет находится в открытом состоянии.
в ЧЯК я использую HK282 с порогом 3.3В (просто потому что были у меня). Какие нибудь более низковольтные и маломощные серво, может быть можно питать и напрямую с выходов Teensy, по схеме используемой для OLED.
В результате ток в режиме сна получился в около 50 uA, наверное, можно было еще уменьшить, но я решил, что этого достаточно (если только спит, батарей должно хватить больше чем на 4 года: 2000мАч/0.05мА).
Техническое
Печаталось на Monoprice Ultimate 3D принтер, PLA пластик, 0.4 мм nozzle, слой 0.2 мм. Для деталей запорного механизма слой 0.1 мм для точности. Пружинки тоже напечатаны на 3D принтере. Печатать долго. Например, средняя самая болшая часть (она имеет много внутренних деталей и двойные стенки для электроники и проводов) печаталась 20 часов. Скливалось циан-акрилатным клеем. Если внутри что-нибудь сломается, разобрать нельзя (защита от маньяков-курильщиков), придется разбивать как свинью-копилку и печатать заново (аргумент в пользу 3D принтеров). Чертежи и анимация сделаны в SolidWorks, среда разработки AtmelStudio (да, поддерживаются и AVR (teency) прямо из коробки, как и ардуино, через VisualMicro).
Комментарии (48)
sbnur
04.04.2017 10:04напоминает автопоилки в курятнике
plm
04.04.2017 11:12+4Я тут подумал, добавление в конструкцию дозатора чего-нибудь типа Denatonium benzoate сделает все сильно интереснее. Например, сигарета взятая раньше времени становится очень горькой (можно даже часы не показывать).
Hanggard
04.04.2017 14:40А я бы от автокормушки не отказался. Часто бывает сложно себя перебороть, а потом лишний вес набираю.
Find_the_truth
04.04.2017 10:32Легче заставить себя сделать такое устройство, чем заставить бросить курить?))
mukizu
04.04.2017 12:22+1Разным людям по-разному.
Например если у человека это просто привычка и сам процесс, а также сопутствующие запахи, вкус итд вызывают неприязнь — бросить проще, чем когда вы получаете от процесса или запаха удовольствие.andersong
04.04.2017 17:10Я так бросил. Однажды заболел — несколько дней валялся с высокой температурой, а главное, изменился вкус сигарет — стал просто отвратным. Несколько дней курил и давился, с каждым разом выдерживал всё меньше затяжек. Через несколько дней подумал: что-же я мучаюсь, это же отличный повод бросить! Не курю третий год.
И сейчас чувствую сильное отвращение при малейшем запахе табака, хотя курил 15 лет по пачке в день.
obelix662000
04.04.2017 19:00+1А почему вы считаете, что это устройство должно помогать бросить курить? Я, например, курить люблю и бросать не собираюсь, только не хочу курить слишком много, когда незаметно прикуриваешь одну за другой.
asmrnv777
04.04.2017 19:16Ну, кому-то это приносит удовольствие, но хочется ограничить себя в количестве.
ragesteel
04.04.2017 10:33+6А где чёрный ящик обычного человека?
master65
04.04.2017 11:13+1Внимание, вопрос. Что в черном ящике?
123150
04.04.2017 16:32+1Отвечает Александр Друзь
TheShestov
05.04.2017 10:17Моментально вспомнилось = )plm
04.04.2017 10:43Бросилось в глаза, что полусферический вырез вокруг сигареты для пальцев есть, но на видео им не пользуются. И вообще, раз уж печатать, можно было бы гораздо более удобный механизм выдачи нарисовать, для одной руки, хотя бы.
И вообще, флакончики с жижей надо уже выдавать такой машинкой :)
Tutanhomon
04.04.2017 11:13Я только не понял, для чего такая потная система загрузки сигарет, или это часть задумки — медитативная загрузка 80 сигарет по одной?
hungry_ewok
04.04.2017 11:16+2Всё украдено до нас.
«5 элемент», начало фильма. Правда там ГГ машинка выдавала сигареты с постепенно укорачивающейся табачной частью — типа постепенное отвыкание. ;)qlkvg
04.04.2017 14:36А задолго до этого портсигар с таймером был у Брежнева. Странно, что про него нет упоминаний.
Color
04.04.2017 12:42Прикольная штука.
А вообще, будущее за диспенсерами всего, я считаю. Можно себе так еду выдавать (ну определенную "вредную" еду, например), алкоголь, жвачки, талоны на интернет, печеные картофелины и так далее.
В рамках одной семьи количество начисляется каждому отдельно, а выдача происходит после активации устройства rfid картой или имплантантом.
А вообще можно и диспенсеры всего реализовать за реальные деньги, как в black mirror s1e2, только немного на других условиях.
Например, сегодня можно арендовать не просто квартиру, но и различные услуги по ее обслуживанию вместе с ней, например, уборка, обновление бытовой химии там, стирка. А если посмотреть дальше — то это аренда комплексного жилья, в котором можно приобрести (по факту или заранее) все нужное — бытовая химия, еда/напитки, информационные услуги и прочее.
Вообще, диспенсеры и торговые автоматы — вот куда нужно стремиться. Заменить злых продавцов добрыми машинами. Да что говорить, и другие профессии можно куда приятнее заменить машинами. И даже небо, и даже Аллах...
В общем, автору респект. Теперь нужно, чтобы сам пачки распаковывал, чтобы на вход не по одной штучке подавать, а сразу пачку или блок, ну или интерфейс автоматизированного склада
P.S.: это не сарказм, диспенсеры реально рулят
Find_the_truth
04.04.2017 13:17Какой-либо сбой, и мы остаемся без содержимого диспенсеров. А «богами» становятся «инкассаторы» диспенсеров. Хотя, можно создать диспенсеры для диспенсеров!
Color
04.04.2017 13:45Да, думаю, диспенсеры диспенсеров все решат
Ну а на случай сбоя есть аварийные диспенсеры
CrazyRoot
04.04.2017 17:22Диспенсеры говорите…
Кошачья кормушка для трех кошек.
Реагирует на RFID метку и запоминает мол этот уже пожрал больше не даем.
Самый сильный кот начал за шиворот притаскивать слабых, дабы кормушка выдала коту пожрать.
Дальше слабый отпихивался от кормушки и старшой получал еду. А младшие ходили голодными.
Женщину вынули, автомат засунули.safari2012
04.04.2017 17:41А можно ссылку на эту историю (про кошачий автомат)?
CrazyRoot
05.04.2017 09:37Эм… ролик на ютубе посвященный какой то из умных кошачих кормушек. Года 3 -4 назад. Уже и не вспомню как кормушка обзывалась…
dron41k
04.04.2017 13:51Ну и будешь ждать каждую сигаретку как манну небесную и вообще никогда не бросишь. Карра лучше почитать, там об этом написано.
MTyrz
04.04.2017 17:24+1import time import os timestamp = 3600 timecurrent = timestamp while True: time.sleep(1) timecurrent -=1 print(' ' + str(timecurrent)) if timecurrent == 0: print(' Можно курить!\n\n') timecurrent = timestamp os.system('pause')
ClearAirTurbulence
04.04.2017 18:21Можно придумывать всякую всячину, а можно перейти на электронные сигареты.
Заголовок спойлераВначале сомневался, что это поможет, но, как ни странно, помогает очень сильно. Буквально за пару недель полностью пропало желание курить обычные раковые палочки. Да, электронная сигарета тоже не сахар (дорого, возня с «жижами», сладковатый запах), но по сравнению с классическими сигаретами это просто рай. Плюс можно плавно переходить на безникотиновую смесь, т.к. основные компоненты привычки — сосание воздуха через мундштук и запах — остаются.
Самое сложное — найти приличный девайс, у которого не придется каждые пять минут менять испарители (т.е. не joyetech), и который удобно заправлять (с откидывающейся вбок крышкой).asmrnv777
04.04.2017 19:31Я за 2 года активного пользования электронкой нашел для себя только 2 жижи (из, наверное, пары сотен испробованных), от которых не воротит — обе одного производителя и весьма недешевые (1000 р за 30 мл).
Остальное из испробованных (имхо) по сравнению с нормальным табаком — гадость ужасная.ClearAirTurbulence
05.04.2017 01:11Нормальный табак — понятие относительное, и он точно не в сигаретах.
Найти жидкость, хотя бы отдаленно похожую на табак, сложно. Joyetech MLB\MAB более менее, на мой вкус, Red Smokers Captain Black тоже ничего. Но в итоге тупо перешёл на «фруктовые», которые поначалу не очень шли, а потом даже очень хорошо. Процесс шел параллельно со снижением содержания никотина. Результат — теперь запах сигарет воспринимается как отвратительный, курить их не хочется совсем.
При этом во времена курения сигарет провести хотя бы час без сигареты было мучительно, а сейчас я спокойно могу хоть целый день не парить.
Осталось плавно отказаться от парения :)
Mr_Krol
04.04.2017 18:49Где б купить такую?!
ClearAirTurbulence
05.04.2017 11:14Ага, сразу оптом, и расставить в разных местах, чтобы выдавали со сдвигом во времени.
klirichek
05.04.2017 11:37Интересно, как каждый «воюет» со склейкой PLA.
Я одно время «спаивал» детали обычным паяльником, пользуясь куском филамента как припоем.
А потом внезапно обнаружил, что он отлично клеится с помощью дихлорэтана. И на этом эксперименты закончились. А тут, вон, «суперклей» в ход пошёл…
AbnormalHead
Закончится все это закономерно — рядом с устройством будет лежать запасная пачка сигарет.
Abiboss
Можно использовать несколько таких устройств
Ommonick
И всего одну запасную пачку сигарет, что удобно.
Navij
Зашёл, чтобы написать точно такой же комментарий. Пока сам себя в руках держать не будешь, никакие ящики не помогут. Хотя подобная штука может помочь описать правила игры, которых ты будешь подсознательно придерживаться, если действительно хочешь ужать потребление. Я вот взял за правило — покупать сигареты только на мелочь в карманах. Из дома я выхожу редко, покупки в основном по карте, поэтому мелочи относительно мало на руках. Как результат — курить я натурально стал раза в три меньше. Так что при определённом желании, возможно, и этот ящик может кому-то помочь.