Всем привет! Нас зовут Антон и Дима, мы ученики 11 и 9 классов. В 2022 году мы окончили «IT Школу Samsung». Нам предложили рассказать про опыт разработки нашего первого большого проекта — системы проката зонтиков. С этим проектом мы одержали победу в нескольких конкурсах, а сейчас мечтаем, чтобы система стала полноценным стартапом и у нее появилось много пользователей, которым она будет полезна.
Идея проекта
Итак, все знают про системы проката самокатов, велосипедов, Power bank’ов. Наша идея очень похожа на вышеперечисленное. Все мы время от времени можем оказаться под дождем без зонта. В связи с этим мы решили сделать систему проката данного аксессуара.
Аналоги
Прокат зонтов не считается новшеством. Подобные системы уже существуют в различных странах. Например, в Ванкувере есть полноценный “umbrella-sharing”. Запущенный в 2015 году сервис Umbracity позволяет предоставить зонтик каждому, кто в нем нуждается. Авторы проекта разработали сеть полностью автоматизированных интеллектуальных киосков, которые обеспечивают доступ к зонтам по требованию пользователей.
В России подобные автоматизированные системы проката зонтов пока не развиты. Это дало нам стимул для развития нашей идеи, и дальше мы расскажем об основных принципах ее реализации.
Наш проект состоит из двух частей: аппаратной и мобильного приложения. В начале разработки аппаратной части нам предстояло реализовать несколько сложных технических решений, например, проработать принцип выдачи зонтика из станции.
2 способа, как можно фиксировать и выдавать зонтик:
-
“Drag and take”: каждый зонтик заходит в специальный канал, из которого выйти может только с помощью клапана. Чтобы получить зонт, пользователю необходимо протащить его через канал (см. Umbracity).
-
Вращающийся круг: диск с вырезом, открывающим определенный слот с зонтом
Мы решили обратиться ко второму способу, потому что он легче в исполнении. Кроме того, такое решение позволяет ставить коробку как в вертикальном, так и в горизонтальном положении.
Выбор компонентов
Отбор компонентов мы начали с мотора. Он должен приводить в движение поворотный механизм. Шаговый двигатель типоразмера Nema17 — самый популярный для использования в 3D принтерах и небольших ЧПУ-станках. Модель 17HS4401 отличается своими характеристиками и невысокой ценой.
Для управления шаговым мотором нужен драйвер. Мы выбрали A4988. Обычно он используется для управления моторами 3D-принтеров, станков с ЧПУ, токарных станков, лазерных граверов. Этот драйвер имеет функцию дробления шага, что позволяет снизить уровень шума. Может применяться в устройствах с маломощными режимами работы, а также в оборудовании, где востребована высокая энергоэффективность моторов
Затем мы начали выбирать управляющую электронику. Среди компонентов обязательно должен быть модуль, который позволяет изделию выходить в интернет для связи с сервером. Мы решили использовать связку Raspberry Pi + Arduino. Одноплатник будет выполнять роль клиента в серверной части проекта, а микроконтроллер возьмет на себя задачу по управлению датчиками, моторами и модулями. На самом деле это связка “железяк” не оптимальна. Можно было бы поставить ESP8266, которая замещает обе платы. Но мы приняли такое решение, потому что уже имели опыт работы именно с Малиной и Ардуиной. Как видите, для первого прототипа это сработало!
Чтобы в корпусе не образовывалась плесень, решили установить вентилятор, который будет выветривать лишнюю влагу изнутри и охлаждать компоненты. Остановились на вентиляторах 120x120, так как они широко распространены и их можно купить в любом компьютерном магазине. Наш выбор пал на Aerocool Force 12.
Создание корпуса
Сперва нужно было разобраться, как соединять стенки корпуса воедино. Фанера — это материал (древесно-слоистая плита), изготовленный из шпона, который склеивается между собой. В самом начале мы хотели взять толстую фанеру (10 мм) и вкрутить в торец саморезы. Однако позже отказались от этой идеи из-за возможного расслоения фанеры при вкручивании деталей. Было принято решение использовать соединение типа шип-паз. Такой подход позволит легко собирать и разбирать конструкцию. Так как мы создавали прототип, решили, что детали будут фиксироваться методом “тугой посадки”. В промышленном варианте планируется добавить уголки.
Часть Raspberry PI
Одноплатник выполняет роль клиента: он подключается к интернету и слушает поля, которые ему принадлежат в базе данных. Например, станции с номером 100 принадлежит документ с именем “100_msk”, и она слушает следующие поля:
Поле |
Значение |
status |
Текущий статус станции. В режиме ожидания равен waiting. Если он изменяется приложением на giving/returning, станция триггерится |
umbrella |
Номер зонтика, который должна выдать станция. Во время ожидания переменная равна 0 |
issued |
Поле принудительного закрытия |
trueTake |
=true — если человек взял зонт |
Часть Arduino
Был написан скетч на C, выполняющий определенные действия по командам с Raspberry. Кусок кода, отвечающий за прослушивание Serial-portа на наличие команд:
void loop(void) {
if (Serial.available()) {
String incoming = Serial.readString();
if (incoming.startsWith("A")) {
incoming.remove(0, 1);
displayQrCode(incoming);
}
else if (incoming.startsWith("B")) {
incoming.remove(0, 1);
makeSound();
getUmbrella(incoming.toInt());
}
else if (incoming == "Z") {
backToZero();
}}}
Связь Arduino и Raspberry
Мы используем UART для общения Raspberry и Arduino. Скрипт, запущенный на малине, отправляет команды по USB-проводу. Arduino слушает их и выполняет. Они чем-то напоминают G-code, который используется в 3d-принтерах и ЧПУ-станках.
Команда |
Значение |
A<key> |
Установить на дисплее QR-код с секретным словом <key> |
B<n> |
Открыть ячейку (повернуть колесо) с номером <n> |
Z |
Возврат колеса выдачи в нулевую координату (закрытие) |
С-OP |
Подтвердить успешное открытие ячейки |
C-CL |
Подтвердить успешное закрытие ячейки |
Команды C-OP и C-CL отправляются с Arduino и сигнализируют об успешном выполнении команд B и Z.
Приложение
QR-коды
Для идентификации станции в приложении была сделана система обновляющихся секретных слов. На экране станции и в базе данных каждые 120 секунд обновляется QR-код, состоящий из номера станции и секретного набора символов.
Пользователь сканирует QR-код, приложение его сравнивает с тем, что лежит в базе данных. Если секретные слова совпадают, пользователь получает доступ к началу/концу аренды. Само слово генерируется на Raspberry Pi и затем с помощью команды A<word> отправляется на Arduino, которая переводит его в картинку и отправляет на экран.
Связь станции с приложением
Наверное, одной из самых сложных задач стала связь станции с приложением. Связь осуществляется посредством сервиса Firebase, с помощью базы данных (Firestore). На сервере у каждой станции есть свой документ. Приложение изменяет специальные поля (подробнее см.раздел про Raspberry PI), станция слушает изменение полей и выполняет требуемые действия.
Сохранение сеанса
Когда пользователь получает зонтик, начинается сеанс проката. Система записывает в поле activeSession строку, содержащую текущую дату и время. Если у пользователя уже будет запись в этом поле, приложение просто не даст ему взять зонт, потому что это будет считаться началом второго проката.
Если человек взял зонт, а затем вышел из приложения, у него должна остаться кнопка для возврата. Поэтому при запуске приложения у пользователя проверяется поле activeSession.
Карта
Основным элементом нашего приложения является карта. Она построена на основе Yandex Mapkit SDK. Данная библиотека "из коробки" обладает огромным функционалом, начиная с динамического отображения кластера точек, заканчивая автоматическим созданием маршрутов для различного вида транспорта. На карте отображаются значки станций, при нажатии на которые можно получить подробную информацию о каждой из них (Bottomsheet).
История
Раздел “История” состоит из двух частей:
RecyclerView с краткой информацией об арендах
Экран с полной информацией об аренде.
Давайте теперь подробнее разберем каждый элемент.
Плашка состоит из:
1. Адреса взятия зонтика
2. Даты аренды
3. Статуса аренды
Подробная информация:
1. Дата аренды
2. Карта
3. Маршрут от станции взятия до возврата.
4. Время начала аренды
5. Статус аренды
6. Время окончания аренды
7. Номер станции взятия зонтика
8. Номер станции сдачи зонтика
Заключение
Суммарное время работы над проектом — 9 месяцев. За это время были получены практические навыки в разработке Android-приложений. В процессе работы необходимо проявить следующие качества: аккуратность, умение выбирать оптимальное решение, инициативность, терпение, трудолюбие. Это был довольно трудный период. Порой нам казалось, что мы вообще не успеваем сделать все задуманное в срок. Нам приходилось сверхбыстро искать и анализировать информацию в интернете.
Конечно, ещё очень много работы впереди: продвижение, новые функции. Много внимания нужно уделить стандартам качественного кода, что изначально удалось не полностью, ввиду нехватки времени и небольшого опыта, но мы очень довольны тем, что есть уже сейчас и сколько знаний в результате мы приобрели.
Мы получили невероятный опыт во время выполнения проекта. Большая благодарность нашему преподавателю - Седову Федору! Именно под его грамотным руководством мы пришли к Гран-при конкурса проектов “IT Школа выбирает сильнейших!”, который проводит компания Samsung!
Совсем чуть-чуть про Антона
Меня зовут Воробьев Антон, мне 17 лет. В 2022 году я поступил в Высшую Школу Экономики на программу “Информатика и вычислительная техника”. Во время учебы на курсах «IT Школы Samsung» я получил невероятный опыт в разработке мобильных приложений. Я изучил Java, ООП и инструменты Android SDK. Я безумно благодарен людям, которые дали мне эту возможность! Однако опыт, полученный в «IT Школе Samsung», был для меня отнюдь не первым в IT. Я уже владел языками Python и C; умел моделировать в 3Ds max, Inventor; работать с 3D принтерами, имел опыт работы с микроконтроллером (Arduino). Сейчас я активно изучаю Kotlin. Каждый день я сажусь за компьютер и делаю какие-нибудь элементы. Хочу получить необходимые навыки, чтобы к 1-2 курсу института стать начинающим мобильным разработчиком в IT-компании.
Совсем чуть-чуть про Диму
Меня зовут Ледохович Дмитрий, мне 15 лет, я ученик 9 класса школы №1018. В начале учебного года я решил поступить в «IT Школу Samsung» и за весь год я ни разу не пожалел! За время обучения я получил колоссальный опыт в сфере Android-разработки. В «IT Школу Samsung» я пришёл с нулевым уровнем Java, однако программированием уже владел. Как и Антон, я уже знал Python, С, С++ а также имел опыт работы с микрокомпьютерами и микроконтроллерами. В будущем мне очень хочется продолжить свой путь в IT. Я собираюсь изучать Kotlin и затем связать с программированием свою жизнь!
Github: https://github.com/BlackFrogKok/UmbrellaProject
Подкаст “IT Школы Samsung” с участием Антона, Дмитрия и преподавателя Федора Седова:
Подробнее об обучении в IT Школе: myitschool.ru
Комментарии (3)
iig
08.09.2022 16:45+3Чтобы в корпусе не образовывалась плесень, решили установить вентилятор
А можно просто сделать корпус из решётки ;)
Calc
08.09.2022 16:50+3Может пригодится
ESP идея хорошая. Дешево, много каналов связи
есть in/out пины. Есть возможность зашить сертификаты для безопасности, BLE и Wifi, есть USB, можно повесить GSM модем и настроить управление по SMS.
шаговик - идея плохая. Слабый, мрет от перегрева, теряет шаги. Лучше взять любой мотор с редуктором, повесить на него энкодер и концевики. Допом можно добавить визуальный контроль наличия зонта
Вот это всё будет стоить как одна малинка (модем под вопросом)
И это можно разнести на 2 аккумулятора. Первый под мозги, второй под железо
Aquahawk
А как сушить мокрые зонты?