Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
Показываем прототип, который разрабатывали с нуля, не имея за спиной какого-то огромного опыта или доступа к чужим разработкам. Четыре месяца мы упорно трудились ради того, чтобы все наши статьи и материалы были не пустым звуком, а показывали перспективу нашего опыта, а также продвигали продукт к выходу на рынок. Рассмотрим как успехи, так и неудачи с сложностями. Как команда развивалась за это время, и какие технические решения были выбраны.
Некоторые части статьи будут написаны нашими инженерами, чтобы передать их опыт максимально правильно. Их я буду помечать, так что не пропустите.
Давайте с ними познакомимся: Максим и Коля - студенты, учащиеся на направлении “Автоматизированные системы обработки информации и управления”. У каждого из них есть серьезный фундамент в инженерии и программировании, но опыта реализации задач на практике не было. Из-за этого, конечно, приходилось разбираться с некоторыми сложностями, что называется, на ходу. Но в целом это им никак не мешало глобально, и в достаточно короткие сроки мы закончили прототип.
Итак приступим к рассказу, как мы ничего не имея на руках, с бюджетом в 25к рублей собрали полноценный прототип достаточно сложного устройства.
Будем двигаться в хронологическом порядке и разделим статью на 4 части: каждая часть - один месяц, чтобы были понятны контекст проблем и решение, к которому мы прибегали при имеющихся возможностях.
Август 2023. Закупка составляющих и начало разработки
Начало августа: команда пока что состоит из 4 человек (историю создания команды можете прочитать здесь), мы начинаем только продумывать бизнес-план и финансовую модель. По сути на данном этапе нет ничего кроме небольшого MVP Android-приложения и пары презентаций для конкурсов, которые мы проходили для составления гипотезы и ее проверки.
Почему получился бюджет 25к рублей? Как такое возможно? Все очень просто, команда все это время работала на вере в проект и искала финансирование. Так что затраты были необходимы только на материалы и подписку Apple Development.
Все само собой началось с закупки комплектующих. Какими они будут, мы решили довольно быстро, а вот собрать все это с нуля без серьезного опыта было уже серьезной задачей.
Далее инженеры:
"Что конкретно нам нужно для сборки прототипа?
Мы решили разрабатывать его на основе arduino uno — достаточно логичное и популярное решение для начальной стадии разработки.
Arduino uno — это плата микроконтроллера с открытым исходным кодом.
Я думаю, многие встречали множество видео на ютубе, где люди что-то мастерят с помощью нее. Также она распространена и в области робототехники.
Так как мы работаем с NFC, основой нашего прототипа стал модуль PN532 — RFID/NFC-сканер. То есть этот модуль может как работать с брелками и пластиковыми картами, так и взаимодействовать со смартфонами и nfc-метками.
Далее по списку нам необходимо: плата (в нашем случае arduino uno), реле, пару шин и электромеханический замок.
Закупив все комплектующие, мы приступили к разработке, окрыленные надеждой, что справимся с этой задачей максимум за неделю. Проблемы начали появляться с самого начала…"
По стоимости все это вышло в абсолютные копейки. На момент августа мы вообще думали, что управимся за 5000 — 6000 рублей на весь прототип. К сожалению, это оказалось не так. Одной из причин стало приложение для iOS, которое должно было иметь доступ к NFC. У Apple для этого необходима подписка разработчика, которая стоит 100$ в год. Нам повезло, и мы оплатили ее через Билайн на уже давно созданном Apple ID, у которого такая возможность была открыта.
По сути, сейчас для РФ это единственный удобный и быстрый способ. Для тех, у кого такого Apple ID нет, процесс будет сложнее и придется потратить на больше времени, и чек выйдет уже не в 100$, а в 120-140$.
Также в этот период начались поиски iOS-разработчика и нового Android-разработчика, а у инженеров — первая сборка прототипа:
“Плату для экспериментов мы заказали, конечно же, неоригинальную, и тут же возникла проблема с перепрошивкой — готовые куски кода для проверки работоспособности просто не хотели загружаться на плату. Поэтому пришлось посмотреть множество видео, чтобы понять, что проблема заключается в неправильных драйверах.
Дело в том, что родные драйвера, которые ставятся на компьютер при первом подключении, arduino не подходят. Не подходят также драйвера для оригинальных arduino. Нужно именно специальное приложение, которое установит драйвера для “паленых” китайских плат.
Чтобы установить новые драйвера, необходимо в диспетчере устройств удалить предустановленные, после чего установить необходимые драйвера через приложение. В целом все достаточно просто. Инструкция по установке.
Наладив этот момент, мы перешли к размышлениям: как же все-таки подружить arduino и NFC на телефоне. На первый взгляд задача вам может показаться простой — мы сами поначалу считали точно также.
Для того, чтобы проверить работоспособность модуля, мы сделали самый примитивный сканер, который можно представить. В комплекте с модулем считывания PN532 шли брелки и карты. Мы считывали их UID, которые использовали для открытия замка.
Обрадованные тем, что все идет очень гладко, мы решили, что основной костяк прототипа получится сделать за несколько дней, но мы сильно ошибались.
Основная задача состояла в том, чтобы при поднесении телефона срабатывало открытие замка. Как уже было сказано ранее, первоначально была идея сделать открытие замка на основе проверки полученного UID. Но в связи с этим появлялось множество вопросов:
Точно ли это будет безопасно?
Могут ли UID для разных устройств совпасть?
Как дистанционно дать доступ человеку, который находится сейчас, например, в другом городе?
Касаемо безопасности — существуют приложения на телефон, которые способны скопировать UID устройства. Поэтому, если злоумышленник узнает UID и эмулирует это значение — он сможет беспрепятственно открыть замок.
Последний вопрос оказался нерешаемым при использовании такого подхода. Ведь для того, чтобы замок открывался при поднесении определенного телефона, необходимо пройти первоначальную идентификацию. То есть запрограммировать ардуино таким образом, чтобы при нажатии на определенную кнопку UID устройства, находящегося в поле зрения сканера, заносился в массив с данными. В этом массиве содержались бы устройства, у которых есть право входа.
Но такой подход не решал некоторые наши задачи, которые мы хотели воплотить в будущем, качественно выделяющие нас на фоне конкурентов. Мы хотели и хотим выделяться от сотен однообразных умных замков, показать что-то новое и интересное, открывающее новый потенциал. Поэтому мы перешли к следующему большому этапу - этапу поиска решения безопасного открытия.”
Сентябрь. Танцы в темноте
Начало осени было с заголовком “все идет по плану”:
Подали заявку на грант с фондом в 3 000 000 рублей.
Нашли Android и iOS разработчиков и взяли в штат.
Началась полноценная работа над приложением.
Нашли дизайнера и начали работать над новым лого и бренд-листом.
Но из этого плана выбивался прототип. К сожалению, инженерная часть сложнее, чем разработка приложения, так как многие вещи не “загуглить”, а ChatGPT все проблемы не решит. Из-за этого следующий этап разработки затянулся на полтора месяца и вызвал очень много споров и огорчений в команде.
Далее инженеры:
“Итак, мы поняли, что распространенные сейчас технологии нам не подойдут. Но какой подход тогда подобрать и в какую сторону начать двигаться?
С помощью телефона можно перезаписывать метки. Есть множество примеров, как люди используют это в своих нуждах. Например, при касании телефоном метки открывается шлагбаум, включается лампочка или открывается какой-то сайт. Вариантов настройки море, но единственное ограничение - все действия должен уметь выполнять именно телефон.
Однако нам было нужно, чтобы действие выполнил сам замок без приема сигнала на открытие через WI-FI или Bluetooth.
У NFC метки есть одно замечательное свойство - NDEF запись, через которую можно передавать всю необходимую информацию. И устройство эту информацию может получать исходя из полученных данных, открывать замок или держать его закрытым.
Мы решили, что это именно то решение, которое нам нужно. Поэтому задачей, которой мы вплотную занялись, стало эмулирование nfc метки при помощи модуля PN532. Именно эта задача и заняла огромную часть времени. В интернете было много статей с указанием того, что такое сделать возможно. Однако ни одна попытка не увенчалась успехом.
Чем глубже мы закапывались в эту проблему, тем больше получали противоречий. Мы пытались использовать куски готового кода, перебирали множество разных библиотек, разбирались с их функциями и инструментами, которые они предоставляют. Мы даже пытались изменять код внутри самих библиотек, но попытки одна за другой проваливались.
NFC метка может работать либо в режиме чтения, либо в режиме записи. Нам нужно было наладить систему так, чтобы чтение метки происходило регулярно и не тормозило работу системы, но при этом была возможность перезаписать метку с телефона в любое время (как только подносим телефон, а не с задержкой). Да, была и такая проблема, но мы изучали все материалы и учились во время процесса создания продукта, так что не судите нас строго, это была большая работа, но главное, что есть результат. Модуль считывания блокировал возможность перезаписи метки, поэтому и возникала такая сложность.
Код, который решал некоторые проблемы, но все-таки не смог решить нашу. Он далеко неидеальный, это всего лишь наши наработки:
#include <Wire.h>
#include <Adafruit_PN532.h>
#define SDA_PIN 2
#define SCL_PIN 3
Adafruit_PN532 nfc(SDA_PIN, SCL_PIN);
void setup(void) {
Serial.begin(115200);
nfc.begin();
uint32_t versiondata = nfc.getFirmwareVersion();
if (!versiondata) {
Serial.print("Didn't find PN53x board");
while (1);
}
nfc.SAMConfig();
Serial.println("Waiting for an NFC card ...");
}
void loop(void) {
uint8_t success;
uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 };
uint8_t uidLength;
success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength);
if (success) {
Serial.println("Found an NFC card!");
Serial.print("UID Length: ");
Serial.print(uidLength, DEC);
Serial.println(" bytes");
Serial.print("UID Value: ");
for (uint8_t i=0; i < uidLength; i++) {
Serial.print(" 0x"); Serial.print(uid[i], HEX);
}
Serial.println("");
uint8_t ndefData[] = {0x03, 0x0D, 'T', 'e', 's', 't', ' ', 'N', 'D', 'E', 'F', ' ', 'D', 'a', 't', 'a'};
nfc.emulateTag(uid, uidLength, ndefData, sizeof(ndefData));
}
}
Это лишь маленький кусочек, который был похож на то, что мы пытались предпринимать. Решения искали на всех возможных сайтах, “пытали” ChatGPT, но результатов это никаких не дало - мы не смогли эмулировать метку, с которой можно было бы как-то взаимодействовать.
Состояние было близким к отчаянию, складывалось ощущение, что нужно обязательно решить задачу, которую до тебя никто не смог решить. И не факт, что сможет. В процессе поисков решения радостный настрой постепенно улетучивался. И в момент полного разочарования пришла мысль - а зачем делать то, что уже есть. Если не получается эмулировать метку, то зайдем просто с другой стороны. К сожалению, решение нам рассказывать запретили, сказали украдут :). Когда нашу разработку мы защитим патентом, расскажем во всех подробностях.”
Октябрь. Свет в конце тоннеля
Второй месяц осени оказался для команды одним из сложнейших. Начались мелкие конфликты и недопонимания. Из-за этого некоторые члены команды выпадали по продуктивности на недели. К ноябрю получилось все это устаканить, решить все вопросы и найти компромиссы, благодаря чему мы вышли на новый уровень продуктивности, и уже ноябрь стал месяцем успеха, но об этом чуть позже.
В этом месяце была одна хорошая новость: мы наконец-то решили сложность с прототипом, которая никак не давалась нам в сентябре.
Далее инженеры:
“После принятия решения о переходе к новому подходу дело пошло намного бодрее. Основной задачей стало то, как взять нужные данные с метки. Эта задача решилась достаточно быстро, но только со стороны кода. Arduino настолько капризная вещь, что не знаешь, как она поведет себя на следующий день. Бывали ситуации, когда вчера все работало идеально, а на утро ты решаешь проверить результат и все перестает работать.
Такие проблемы тоже приходилось решать, и в конце концов мы пришли к стабильно работающему варианту:
Стабильное открытие замка без ошибок и вылетов
Метка перезаписывалась без зависаний и не приходилось держать телефон около метки по 2 - 3 секунды, все происходило моментально
Питание равномерно распределялось между всеми модулями, и они не останавливали работу системы в самый неожиданный момент
Не происходило “внеплановых” срабатываний системы, когда, например, реле неожиданно начинало открываться
Однако это было только начало. Далее по нашему плану следовала сборка полностью рабочего замка.
Проблемы были и здесь: то не хватало питания самому электромеханическому замку, который мы подключали к нашей системе, то не хватало питания какому-то из модулей - все это также приходилось решать.
Когда в результате мы получили работающий вариант - счастлива была вся наша команда.”
Важно понимать, что параллельно шла разработка мобильных приложений сразу на две платформы. Это крайне связанные вещи, которые также имели свои трудности, но это мы обсудим в отдельной статье в начале следующего года, когда вся основная работа над ними закончится.
Ноябрь. Сборка стенда и результат
Самый успешный месяц за все время существование проекта:
Наладились все процессы командного взаимодействия.
Достигли четкой коммуникации между всеми участниками.
Закончили весь UX/UI приложений и их функционал.
Наши статьи начали набирать очень серьезные цифры.
Вышли на корпоративный блог на Habr.
Начали делать shorts.
Нашли первых партнеров.
и много что еще…
Перечислять на самом деле можно долго, но одно из самых ключевых событий - это окончательное завершение прототипа в конце месяца, который было не стыдно показать. Он выполнял все основные функции и при этом хорошо выглядел, но идем по порядку.
После того, как была готова техническая часть, все это необходимо было красиво подать. Вряд ли кто-то захочет смотреть на торчащие провода. Купить железный стенд за 20-30к рублей мы, конечно, не могли, поэтому пришлось изворачиваться:
“Нам потребовались материалы для изготовления стенда: доски толщиной в 4 сантиметра, брусья для изготовления косяков, дверные петли, ручки и все остальное. Также нужно было докупить полноценный врезной замок, который выполнял бы все необходимые функции.
Здесь возникла сложность с тем, что на российском рынке хороших вариантов, которые нам подходили, за адекватные деньги просто не было. Минимум 13 000 - 14 000 рублей, что нас не устраивало. Но тут нам подвернулась удача, и через знакомого нашего руководителя получилось достать этот замок за 2000 рублей, списанный с производства, но при этом абсолютно новый. Для будущего продукта мы уже нашли отличный вариант в Китае: значительно дешевле и не уступает российским аналогам.
Также нам нужно было достать инструменты - это тоже было нелегкой задачей. Передача инструментов из рук в руки выглядела, как сцена в фильме, в котором герои, чтобы замести следы, передавали что-либо через 5-6 человек.
Нам пришлось на время переквалифицироваться в плотников. Вся работа по сборке прототипа происходила в общежитии. На нас жаловались люди, что мы 5 часов, не переставая, сверлили. Но это было меньшей из неприятностей.
На этапе сборки, как вы могли догадаться, всё оказалось не так гладко. По непонятной для нас причине замок отказался взаимодействовать с нашей системой на основе arduino: после двух открытий система ломалась и переставала подавать признаки жизни.
Мы перепробовали все: меняли питание замка, меняли питание для arduino, перепаяли все контакты, заменили часть модулей. Мы уже начали задумываться над тем, что катушка замка была с дефектом и начала создавать электромагнитные волны, которые мешали работе нашей электроники. Да, мысль абсурдная, но на тот момент она казалась нам единственной возможной.
Мы решили попробовать с другим таким же замком, подключили его и…. Ничего не изменилось.
Тогда мы решили обратиться за помощью к специалисту, который работает в этой области, и у него получилось найти решение проблемы - дело было в шине, при помощи которой мы разводили питание по модулями arduino. По всей вероятности происходило падение напряжения, из-за чего работа ведущего модуля становилась некорректной.
И вот мы пришли к определенному и, не буду скрывать, долгожданному результату. Основа была налажена, оставалось напечатать корпуса для всей электроники и питания и разместить все это на стенде.
После мы начали готовить стенд к выступлению. Для начала мы решили его покрасить, потому что чистое дерево выглядело, прямо скажем, не очень презентабельно. Вся покраска так же,как и сборка, производилась в подъезде общежития на картонках. Ну а что делать, не все в офисах начинают :).
Кроме того, мы решили переделать корпуса для электроники, чтобы вся конструкция выглядела более компактно и привлекательно. Например, корпус с батарейками мы поместили в основной блок, что помогло нам сделать цельную конструкцию.
Для прототипа мы решили напечатать корпуса на 3D принтере. Была идея сделать железные корпуса, они были бы покрепче пластика, но через металл перезаписать метку невозможно, сигнал не проходит. Это, кстати, основная проблема того, почему метку нельзя просто вмонтировать в дверь: в железных считать ее будет невозможно.
Форма простая и понятная: модуль помещается в основной блок, закрепляется на двери, а сверху надевается крышка, которая все это дело закрывает. И сигнал через нее проходит идеально.
Для остальной электроники мы также сделали корпус (перепробывали более трех вариантов, пока не нашли оптимальный вариант на текущий момент).
Сейчас мы работаем над усовершенствованием системы безопасности, добавлением функций интеграции в умный дом, системой оповещений пользователя о посещении его дома и о возможном незаконном проникновении.”
Мы понимаем, что в любом случае это только прототип. Мы уже нашли контакты, с которыми будем работать по поводу производства программируемых модулей. Эти люди позволят вывести нас на стабильный и надежный во всех аспектах продукт. Работы еще предстоит много, но это тот самый первый шаг, который мы сделали.
В сумме все обошлось в 24 500 рублей:
8990 - подписка Apple Development для тестирования
~7000 - материалы и комплектующие для замка
~5000 - материалы для стенда
~3500 - другие мелкие расходы
Итог
Вы могли заметить, что наш путь был далеко не простым, но при этом мы ни разу не задумывались остановиться или бросить проект. В вашем проекте важна вера в себя, непоколебимая и четкая. Все сложности преодолимы, они часть пути, а не его преграда.
Пока наша история дошла только до прототипа. Мы уже ездили с ним на мероприятие, где успешно выступили. Дальше нас ждет финансирование, партнерство с производством, переход на программируемые модули и выход на рынок. Предстоит еще много этапов разработки, и, возможно, новые трудности будут еще объемнее. Но мы точно уверены, что справимся с ними.
Этой статьей мы хотим показать пример того, как это происходит в реальной жизни. Может кто-то вдохновится, кто-то в этом увидит интересное техническое решение. Главной задачей было показать, что все реально, даже если вы студенты, у которых практически нет никакого бюджета и опыта за плечами.
Если хотите посмотреть на наш продукт, опросы, внутреннюю кухню команды и многое другое вам сюда.
Всю остальную информацию о проекте и технологии можете найти на сайте.