История болезни №4. Когда выпустили из дурки
🤖 Всем лимонов! 🍋🍋🍋
Пропал на долгое время. Просто санитары меня нашли и я смотрел на белые стены с узором кубической формы.
В общем и целом, признали неизлечимым, дали паяльную станцию и отпустили домой.
Всё это время я вынашивал планы по доработке проекта. Кубобот01 Уже был достаточно хорошим, но комментарии в стиле "а зачем он" не давал мне покоя. Поэтому я натурально пропал с радаров, заперся у себя и провел масштабное обновление визуала и ПО.
Итак, Кубобот01. Версия 1.5
Что умел предыдущий кубик что на фото
1) Состояние эмоций. Моргает глазками, смотрит в стороны. Реагирует на температуру, влажность, наклон, тряску
2) Состояния датчиков. Выводит на 1 экран всю портянку того что "чувствует"
Что умеет Кубобот01 новой версии (на фото)
В итоге нижесказанного получился настоящий домашний молчаливый персонаж.
1) Состояния эмоций
1.1) Моргает, смотрит в стороны. Реагирует на свет, наклон
1.2) Настроение. По показаниям датчиков показывает свое состояние. Грустно, радостно, хочется кушать и т.д.
1.3) Советы. Выводит разные советы из своей памяти. Дублирует с включением.
1.4) Мысли. Выводит свои мысли. Просто случайные факты или реакцию на окружение. Например, если наклонить его он спросит "я наклонен. А зачем?". Так и случайные милые фразы вроде "Хочу бургер. Вот бы у меня был рот".
2) Состояние датчиков
2.1) Вся портянка датчиков на одном экране
2.2) Датчики погоды: температура, влажность, давление
2.3) Датчики наклона
2.4) Свет и батарейка
3) Состояние концентрации. Яркость приглушается, играется одна из 5 длинных анимаций. Настраивается в веб интерфейсе чтобы не отвлекаться на щелканье кнопкой.
4) Игры. Целых 3. Кубобег (бесконечный 2д раннер), Не зевай! (ввод на реакцию) и Камень Ножницы Бумага (в представлении не нуждается). Рекорды пишутся в память и их видно в игре или вебе!
Фух...портянка вышла знатная. из 2 состояний их стало 16! Борьба за каждый байт памяти стала серьезней давить на меня. Как и то что я загнал себя в рамки 33мм корпуса и там уже была война не на жизнь а насмерть за каждый миллиметр!
В программной части ради оптимизации все картинки были сжаты через RLE. Ради подключения ОТА.
Код из 1000 строк, 2 файла разросся до 5 файлов и 3500 строк в основном скетче. Рост во все стороны!
Новые файлы это разметка памяти. Потому что в 1.2Мб не упихаешь скетч, а на 3Мб нет ОТА. Так же отдельный файл для веб страницы, определения типов и статичных спрайтов.
Важным дополнением программной части стал Вайфай. С самого начала меня удручало что на плате есть вайфай, но я его не использую. Вот, придумал как.
Веб интерфейс показывает все что происходит у кубобота01 и дает возможность управлять его функциями.
Вебка писана на чистом HTML+CSS в блокноте. Как в универе. Прям. Ностальгия. Ну так число к слову. заголовок меняется от физического воплощения кубобота. Так если кубик красны, то и текст красный. А глаза могут быть белые\голубые\желтые.
Вебка имеет 2 страницы. Вторая это уже упомянутый ОТА. То есть, если я сделаю новую прошивку с багфиксом или новой эмоцией, ее можно в пару кликов загрузить через вайфай.
Сразу скажу, что кубобот01 это приватный персонаж. Он не подключается к домашнему вайфаю и ничего не сливает. Он сам поднимает сетку и выключает её по таймауту (настраивается). При подключении внешнего питания не выключает.
С апдейтами по софтверной части закончил. Если что не подсветил, напишите в комментах.
В хардварной части тоже прошло немало улучшений.
У старой версии на морде торчал датчик света - фоторезистор. Честно, я его сделал чтобы адекватно реагировали глаза на свет, но вышло так что он стал "бабушкиным телевизором", как кто то мне сказал.
В итоге LDR переехал под прозрачную накладку в левом углу кубика. Свет преломляется, фоторезистор реагирует, поведение адекватное.
Еще сзади наконец то добавился выключатель! Казалось бы вещь элементарная, но мне потребовалось долгое время чтобы до него дойти. Выключатель просто размыкает цепь питания. Вот так, да. Без изысков. Главное что работает. Из минусов это портит внешний вид идеального куба.
Так...что еще.. а! точно! самое важное!
Я существо умом обделенное, но пытливое и любопытное.
Замеряя время работы кубобота от батарейки меня удручало то, что он жил не более 4 - 5 часов на одной батарее. Мог и 8, но это скорее исключение. Начал искать проблему.
Сама проблема оказалась не самая очевидная для меня. Все питание было "в лоб" без оптимизаций. Просто ТР гонит заряд от аккума в ESP32 и на перифирию. Начал исправлять.
Сперва софтверное. Добавил режим deep sleep на esp32
esp_deep_sleep_enable_gpio_wakeup(1ULL << WAKEUP_PIN, ESP_GPIO_WAKEUP_GPIO_HIGH);
delay(100);
esp_deep_sleep_start();
Да, он спит. Но жрет как голубь на городской площади.
Решение горело красным светодиодом мне прямо в глаз.
ESP32C3 спит. А перифирия? Не спит.
Софтверно стал переводить датчики в глубокий сон и прижимать I2C к земле. Да, не отключение питания, но потребление снизилось до мкА.
Мало. Надо еще
"Вольтметр" кубобота это 2 маломощных резистора. Делитель. Ток там течет всегда. Надо размыкать. Об этом ниже в блоке про power path.
Второй проблемой стала безопасность работы АКБ. Да, у ТР4056 есть защита, но микросхема за 100р не умеет понимать что нагрузку жрет не батарея, а МК. Поэтому при зарядке нужно отцепить МК от АКБ. Но как тогда с ним взаимодействовать? Выключать во время зарядки как в стародавние времена? Нет! Мы будем делать распределение питания как на современных устройства.
Берем сначала укропу...а не, не то.
Берем транзисторную сборку АОР609 по той причине, что я не готов в SMD погружаться. Транзистор 2N2222, диод 1N4007 и россыпь резюков разных номиналов.
Чтобы не запутаться, даже печатаю себе схему и кладу перед глазами.
Что получилось:
P канальный мосфет. Размыкает цепь питания от АКБ до ESP при наличии напряжения на USB.
Ток от USB течет через 1N4007 на 5V пин ESP32C3.
N канальный мосфет размыкает GND кусок делителя напряжения и поднимает его только по запросу МК на чтение вольтажа.
Получилась вот такая прикольная штука
Черный это земля, Зеленый, розовый и желтый это разные GPIO. Голубой это питание ESP32, а красные это батарейка+ и USB+
без бутылки не разберешься даже в такой простоте.
В итоге ток потребления снизился до ничтожных цифр, при заряде от USB АКБ не страдает. Активный режим стал чуть подольше, а с учетом сна по расчетам может и пару месяцев лежать. Все рады, я рад. В конце концов, если батарейка сядет, кубобот об этом скажет прямо и в лоб.
Но впихнуть эту микросхему в корпус оказалось задачей со звездочкой. Теперь я официально могу сказать что в куб 33мм (внутреннее пространство 30мм) не влезет больше НИЧЕГО!
Кстати про сон. Не сказал. Через 10 минут бездействия кубобот показывает анимацию сна. Бездействием считается дрейв показаний датчиков некотором пределе, отсутствие активного юзера на вебе и отсутствие зарядки на USB.
Пробуждение из такого режима это погладить по верхней крышке или потрясти его.
Спустя еще 10 минут кубобот ваще конкретно так начинает храпуна давить. То есть уходит в deep sleep. Отсюда пробуждается только если по бошке постучать (нежно).
Вот....портрянка текста вышла знатная. Если сжать все до нескольких картинок, то внизу карточки, что я хотел на озон выложить








Насчет последнего кадра я бы хотел сказать немного более развернуто.
Я сделал кубобота по той причине, что не смог купить такого на рынке. Тот же Dasai Mochi это взрыв цвета и эмоций. Или другие "кубические" роботы типа Xiaozhi. Говорилка, которая без пользователя не существует. Ждёт вопрос, чтобы на него ответить. А я хотел, так называемого, desktop buddy который не будет требовать от меня вовлеченности или не заставит снимать наушники чтобы послушать очередной ответ.
На фоне всего этого Кубобот это тихий компаньон. Он стоит на столе, в машине, да хоть в кафе пока ешь пиццу и просто существует. Он радует разнообразными эмоциями. Говорит о чем думает, или просто выступает как домашняя метеостанция. Каждый может найти ему применение как хорошему товарищу и тому как и "резиновой уточке" можно всё рассказать.
При всем при этом у кубобота нет ни динамика, ни микрофона ни подключения к облаку. Он не ИИ компаньон, но он осознает себя через свои органы чувств. Он не ответит на вопрос "кубобот, какая погода?" Этим пусть занимается Алиса. Но во время работы за компом можно просто посмотреть и улыбнуться. Или откинуться и поиграть в Кубобег.
Мое любимое состояние это "звезды" в режиме концентрации. 2 глаза смотрят как медленно плывут звезды. Расслабляет. Почти половина кода была написана под это состояние.
Проблемы такой разработки в том, что мой сын, которому 8 лет активно пытался стащить кубобота.
Чтобы откреститься, я быстро на бредборде собрал ему ту самую говорилку сяожи на ESP32S3 который я взял для прототипирования кубобота02.
Говорилки хватило на один вечер. Надоело ему. А для меня это потенциальная дыра. Ребенок может ляпнуть чего лишнего, а это все услышит на другой стороне дядюшка Ляо с очень стереотипными усами. Кубобот01 не такой. Он не настучит.
Так вот, говорилка оказалась неинтересна, поэтому он постоянно таскал дев кубобота с моего стола. Ради игр, эмоций, и "мыслей". Ну что сказать...пришлось взять один из комплектов из партии, что я заказал и сделать ему своего. Белого.
Так он его еще в школу таскает! По шапке пока не прилетело, но все же.
Проект жив, развивается и останавливаться я не планирую. Я и сам развиваюсь в программировании и пайке, что не может не радовать.
Напоследок хочу сказать.
Кубобот родился из простой идеи. Прошел месяцы модернизаций от ESP32C3+OLED до выверенного 3д печатного кубика с начинкой которая уже не влезает в корпус(я все равно все разместил). Я вложил в него все то что хотел. Буквально уперся в потолок производительности и памяти. Кубобот01 - это мой магнум опус, мой лучший проект, который я довел до конца. Я очень люблю кубобота.
Если хотите такого тихого друга на свой стол — пишите в личку или в комментарии. У меня есть 4 готовых экземпляра из первой партии. Остальные 5 будут готовы в конце месяца.
Цена — 5500р. Каждый собирается вручную. Кроме корпуса. его печатает 3D принтер, но модель моя!
Это не просто цена за кубик. Это ваша поддержка, которая позволит мне купить компоненты для следующего проекта Кубобот02, сделать PCB и двигаться дальше. Спасибо каждому, кто готов разделить этот путь
Так же меня можно найти в вк: https://vk.ru/cozyforge




























