Сообщество - Arduino & Pi

Arduino & Pi

1 527 постов 20 917 подписчиков

Популярные теги в сообществе:

29

Лазерный дальномер на вебкамере с одноплатником

Продолжаю осваивать Python и работу с видео: сделал бюджетный лазерный дальномер на одноплатнике и вебкамере.

Делаю для себя, учусь Python и работе с железом. Никаких революционных изобретений тут нет)) можете просто за меня порадоваться или что-то конструктивно посоветовать. И нет, это не вайбкод - зачем учиться и вайбкодить - не понимаю.

Всем спасибо))

По железу:

- Raspberry pi 3b+

- вебкамера defender (ничего особенного)

- лазерный диод, управляемый npn-транзистором

- монитор за 3,5 тыс. руб.

Идея: лазерный луч жестко связан с камерой (у меня пока стоят неподвижно). Лазер дает проекцию луча на объект, камера получает изображения, а софт распознает на них пятно (которое всегда находится на одной прямой). Далее преобразование координат X, Y в расстояние Z от лазера до объекта.

Реализовал пока базу - все работает!

Работает на одноплатнике пока с фрэймрейтом 4-5 fps.

Софт буду допиливать - пока на python.

Проект выложил на github: https://github.com/Stan-public32/laser_scaner.git

Еще предстоит сделать:

  1. Оптимизировать код для ускорения работы.

  2. Исключить обработку пикселей, лежащих за пределами номинальной прямой на изображении.
    3. Скорректировать математикой погрешность от нелинейного преобразования (пока функция преобразования линейная).
    4. Поработать с фильтрацией изображения.

Показать полностью 6
8

Ruby и встраиваемые системы

Серия Жестокие эксперименты

Казалось бы, какое отношение «хипстерские скрипты для веб» могут иметь к жестким реалиям встариваемых систем, со всей их низкоуровневой работой и ограниченными ресурсами?

Увы, но реальность в очередной раз оказалась куда интересней предубеждений, так и появилась на свет эта статья.

Картинка для привлечения внимания, была <a href="https://pikabu.ru/story/ruby_i_vstraivaemyie_sistemyi_14168805?u=https%3A%2F%2Fwww.linux.org.ru%2Fgallery%2Fscreenshots%2F17359154&t=%D0%B2%D1%8B%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B0&h=9a8a66b46743b7807efe1138a0bf4288dbeeea6c" title="https://www.linux.org.ru/gallery/screenshots/17359154" target="_blank" rel="nofollow noopener">выложена</a> на ЛОР.

Картинка для привлечения внимания, была выложена на ЛОР.

Что это и зачем

Начну как обычно с цитаты:

mruby is the lightweight implementation of the Ruby language complying with part of the ISO standard. mruby can be linked and embedded within your application.

Словом, это такая особенная реализация языка Ruby, с упором на встраивание и встраиваемые системы — да да, тот самый «кровавый embedded», где царствует чистый C, ссылочная арифметика, malloc() и прочие кошмары и ужасы для современного разработчика.

И вдруг в этом царстве Аида появляетесь вы весь в белом и пишете что-то такое, высокоуровневое:

extend Yeah::DSL
set port: 3000

get '/hi/{name}' do |name|
"Привет #{name}"
end

ENV['SHELF_ENV'] = 'production'

puts "Запуск.."
__main__ [0]

И.. оно просто работает:

Запуск собранного бинарника. Обратите внимание на текст на русском.

Запуск собранного бинарника. Обратите внимание на текст на русском.

И даже вот так:

Ответ сервера в браузере. Обратите внимание на текст на русском.

Ответ сервера в браузере. Обратите внимание на текст на русском.

Круто?

Сколько там пудов соли нужно скушать, чтобы так просто работать с юникодом из чистого С, тем более в embedded среде?

Кстати вся эта «радость хипстера» еще и собирается в очень небольшой бинарник:

2 Мегабайта на все про все.

2 Мегабайта на все про все.

Внутри будет «все и сразу»:

MRuby, все используемые библиотеки и само приложение.

Хотя на ЛОРе заметили, что «640кб хватит на всех» это как‑то многовато будет, все же напомню что мы живем в мире копеечных 128Гб флешек и битва за каждый байт свободного места уже не так актуальна как 10 лет назад.

Вполне допускаю, что подобное приложение показывает веб‑интерфейс в вашем домашнем роутере, показывает меню в телевизоре или крутит рекламу в автобусе  — словом находит применение в большинстве мест, где используются встраиваемые системы.

Поддерживаемые платформы

К сожалению не удалось найти одним списком все поддерживаемые MRuby платформы, поэтому ограничусь только конкретными найденными примерами.

Из самого интересного:

разработка для Sega Dreamcast и Nintendo Wii, для POS-терминалов, встраивание в iOS приложения.

Ну и собственно встраиваемые системы:

  1. ESP32 , шаблон проекта находится вот тут.

Внешний вид платы <a href="https://pikabu.ru/story/ruby_i_vstraivaemyie_sistemyi_14168805?u=https%3A%2F%2Fwww.elecbee.com%2Fru-23470-ESP32-Development-Board-WiFi-bluetooth-Ultra-Low-Power-Consumption-Dual-Cores-ESP-32-ESP-32S-Board&t=ESP32&h=12a93a311822828b9c62c8f0ac3f4522cf8697f0" title="https://www.elecbee.com/ru-23470-ESP32-Development-Board-WiFi-bluetooth-Ultra-Low-Power-Consumption-..." target="_blank" rel="nofollow noopener">ESP32</a>.

Внешний вид платы ESP32.

  1. RP2040 (Raspberry Pi), пример проекта находится тут.

  2. PIC32, пример вот тут.

Тестовый проект

Поскольку «малинки» в очередной раз под рукой не оказалось, было решено реализовать тестовый проект на банальном x86 — была собрана вся цепочка разработки, включая фреймворки, был реализован «Hello world» в виде веб‑приложения, работающего на встроенном веб‑сервере.

Все манипуляции производились на неподдерживаемой никем и нигде FreeBSD, так что скорее всего описанных ниже проблем со сборкой в более обычном Linux не будет.

Для тестового проекта использовалось вот это «чудо»:

Yeah! is a DSL for quickly creating shelf applications in mruby with minimal effort

Если кратко, то это своеобразная попытка реализовать «мини‑Rails, работающий на мини‑Ruby». Вполне себе успешная, надо отметить.

А теперь самое важное:

Фреймворки для mruby представляют собой надстройку, которая в процессе собирает сам mruby и добавляет себя в собираемые бинарники.

Звучит сложно и выглядит страшно, но для embedded-среды является привычным делом.

Так что нам будет нужно получить бинарники mruby и mrbc с упакованным внутрь фреймворком yeah и всеми библиотеками, а затем использовать этот билд для сборки уже своего приложения.

Для сборки фреймворка Yeah! требуется внешний «большой» Ruby и rake, будут работать как 2.x так и 3.x версии.

Клонируем проект с фреймворком Yeah!:

git clone https://github.com/katzer/mruby-yeah.git

Поскольку по‑умолчанию собирается только компилятор mirbc, без интерактивной консоли (mirb) и интерпретатора (mruby), чего не хватит для нормальной разработки конечного приложения, добавляем в файл build_config.rb:

conf.gem :core => 'mruby-bin-mruby'
conf.gem :core => 'mruby-bin-mirb'
conf.gem :core => 'mruby-bin-mrbc'

И запускаем сборку:

rake compile

Эта команда автоматически скачает зависимые репозитории, в том числе нужную ветку самого mruby. На данной стадии у автора появлялись две ошибки.

Первая — про заголовочный файл mingw.h:

In file included from /opt/work/tmp/mruby-yeah/mruby/build/repos/host/mruby-r3/r3/src/memory.c:34:
/opt/work/tmp/mruby-yeah/mruby/build/repos/host/mruby-r3/r3/src/mman.h:15:10: fatal error: _mingw.h: No such file or directory
15 | #include <_mingw.h>
| ^~~~~~~~~~
compilation terminated.
rake aborted!

В файле mman.h есть вот такая строка:

/* All the headers include this file. */
#ifndef _MSC_VER
#include <_mingw.h>
#endif

Переменная _MSC_VER не задается при сборке на FreeBSD, поэтому срабатывает вариант по умолчанию — для Windows и MinGW. В качестве исправления, я просто закомментировал этот блок, не заморачиваясь дальнейшими изысканиями.

Вторая ошибка также достаточно банальна и происходит из-за разницы в реализации функции mmap:

/opt/work/tmp/mruby-yeah/mruby/build/repos/host/mruby-r3/r3/src/mman.h:52:9: error: conflicting types for 'mmap'; have 'void *(void *, size_t, int, int, int, OffsetType)' {aka 'void *(void *, long unsigned int, int, int, int, unsigned int)'}
52 | void* mmap(void *addr, size_t len, int prot, int flags, int fildes, OffsetType off);
| ^~~~
In file included from /opt/work/tmp/mruby-yeah/mruby/build/repos/host/mruby-r3/r3/src/memory.c:27:
/usr/include/stdio.h:444:10: note: previous declaration of 'mmap' with type 'void *(void *, size_t, int, int, int, __off_t)' {aka 'void *(void *, long unsigned int, int, int, int, long int)'}
444 | void *mmap(void *, size_t, int, int, int, __off_t);
| ^~~~
rake aborted!

В этом же файле mman.h заменяем:

void* mmap(void *addr, size_t len, int prot, int flags, int fildes, OffsetType off);

на:

void* mmap(void *addr, size_t len, int prot, int flags, int fildes, __off_t);

И повторно запускаем сборку.

Если сборка прошла успешно то в папке build/host/bin будут готовые бинарники:

ls ./mruby/build/host/bin/
mirb mrbc mruby
Теперь с их помощью запускаем сборку уже нашего тестового приложения:

/opt/work/mruby-yeah/mruby/build/host/bin/mrbc -Btest_symbol ~/test.rb

Это сгенерирует файл test.c с вот таким контентом:

#include <stdint.h>
#ifdef __cplusplus
extern
#endif
const uint8_t test_symbol[] = {
0x52,0x49,0x54,0x45,0x30,0x33,0x30,0x30,0x00,0x00,0x01,0x3e,0x4d,0x41,0x54,0x5a,
0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x01,0x0c,0x30,0x33,0x30,0x30,
0x00,0x00,0x00,0xcd,0x00,0x01,0x00,0x05,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x3d,
0x1d,0x02,0x01,0x1f,0x02,0x00,0x2d,0x01,0x02,0x01,0x10,0x02,0x03,0x0e,0x03,0x0b,
0xb8,0x2d,0x01,0x04,0x10,0x51,0x02,0x00,0x57,0x03,0x00,0x2e,0x01,0x05,0x01,0x1d,
0x01,0x06,0x51,0x02,0x01,0x51,0x03,0x02,0x24,0x01,0x51,0x02,0x03,0x2d,0x01,0x07,
0x01,0x06,0x02,0x47,0x02,0x01,0x2d,0x01,0x08,0x01,0x38,0x01,0x69,0x00,0x04,0x00,
0x00,0x0a,0x2f,0x68,0x69,0x2f,0x7b,0x6e,0x61,0x6d,0x65,0x7d,0x00,0x00,0x00,0x09,
0x53,0x48,0x45,0x4c,0x46,0x5f,0x45,0x4e,0x56,0x00,0x00,0x00,0x0a,0x70,0x72,0x6f,
0x64,0x75,0x63,0x74,0x69,0x6f,0x6e,0x00,0x00,0x00,0x0e,0xd0,0x97,0xd0,0xb0,0xd0,
0xbf,0xd1,0x83,0xd1,0x81,0xd0,0xba,0x2e,0x2e,0x00,0x00,0x09,0x00,0x03,0x44,0x53,
0x4c,0x00,0x00,0x04,0x59,0x65,0x61,0x68,0x00,0x00,0x06,0x65,0x78,0x74,0x65,0x6e,
0x64,0x00,0x00,0x04,0x70,0x6f,0x72,0x74,0x00,0x00,0x03,0x73,0x65,0x74,0x00,0x00,
0x03,0x67,0x65,0x74,0x00,0x00,0x03,0x45,0x4e,0x56,0x00,0x00,0x04,0x70,0x75,0x74,
0x73,0x00,0x00,0x08,0x5f,0x5f,0x6d,0x61,0x69,0x6e,0x5f,0x5f,0x00,0x00,0x00,0x00,
0x33,0x00,0x03,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x34,0x04,0x00,
0x00,0x51,0x03,0x00,0x01,0x04,0x01,0x52,0x03,0x38,0x03,0x00,0x01,0x00,0x00,0x0d,
0xd0,0x9f,0xd1,0x80,0xd0,0xb8,0xd0,0xb2,0xd0,0xb5,0xd1,0x82,0x20,0x00,0x00,0x00,
0x4c,0x56,0x41,0x52,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x01,0x00,0x04,0x6e,0x61,
0x6d,0x65,0x00,0x00,0xff,0xff,0x45,0x4e,0x44,0x00,0x00,0x00,0x00,0x08,
};

Длинная "сопля" выше - ни что иное как готовый байткод mruby, записанный в виде статичного массива байт.

Параметр -Btest_symbol как нетрудно догадаться отвечает за название этого массива.

А вот так выглядит само приложение для запуска (файл test_stub.c):

#include <mruby.h>
#include <mruby/irep.h>
#include <test.c>

int
main(void)
{
mrb_state *mrb = mrb_open();
if (!mrb) { /* handle error */ }
mrb_load_irep(mrb, test_symbol);
mrb_close(mrb);
return 0;
}

Все что тут происходит это просто выдача байткода интерпретатору mruby при запуске обертки. Обратите внимание на строчку:

#include <test.c>

Это и есть включение файла с байткодом mruby.

Ну и наконец сборка конечного тестового приложения:

gcc -std=c99 -static -Os -s -I/opt/work/mruby-yeah/mruby/include -I. test_stub.c -o test_program /opt/work/mruby-yeah/mruby/build/host/lib/libmruby.a -lm -lpthread

Если все пройдет успешно, в текущей папке появится финальный бинарник test_program, который я запускал в самом начале.

Эпилог

Думаю изложенного материала хватит для того чтобы те из читателей, кто занимается встраиваемыми системами попробовали MRuby для своих задач, благо автору данная штука видится крайне перспективной.

Также как и правительству Японии, которая этот проект финансирует.

Просто потому что убирает целый класс проблем, связанных с разработкой прикладных систем на чистом Си — управление памятью, юникод, строки и так далее.

С нетерпением жду отзывов о реальном использовании.

P.S.

Статья была опубликована на Хабре, оригинал которой доступен в нашем блоге.

Показать полностью 5
33

Разработка автономного лабораторного блока питания с Power Delivery 140 Вт

Практически любой лабораторный блок питания привязан к розетке. Это не проблема, пока работа ведётся за рабочим столом. Но как только возникает необходимость выехать на объект, протестировать автомобильную электронику или запитать устройство вдали от сети, обычный лабораторный блок питания превращается в бесполезную коробку.

Мне захотелось объединить сразу несколько устройств в одном корпусе:

полноценный лабораторный блок питания;

аккумулятор большой ёмкости;

Power Delivery 140 Вт для зарядки ноутбуков и другой техники;

возможность зарядки самой батареи через USB Type-C.

Так появился этот проект.

Что хотелось получить
Перед началом проектирования я сформулировал несколько требований.

Во-первых, устройство должно быть полностью автономным.

Во-вторых, необходимо обеспечить большую выходную мощность.

В-третьих, хотелось отказаться от громоздких сетевых источников питания.

И наконец, устройство должно заряжаться современным способом — через USB Type-C с поддержкой Power Delivery.

Выбор силовой части
В качестве регулируемого источника питания был выбран RD6030.

Причин несколько.

Во-первых, он способен отдавать ток до 30 А.

Во-вторых, имеет удобный интерфейс управления.

В-третьих, производитель заявляет крайне низкий уровень пульсаций.

Именно последнее заявление и захотелось проверить экспериментально.

Почему аккумулятор, а не сетевой блок питания
Для получения минимального уровня шумов обычно используют дорогие лабораторные источники питания.

Однако даже качественные модели обладают остаточными пульсациями.

Аккумуляторная батарея лишена этой проблемы.

Фактически она представляет собой практически идеальный источник постоянного напряжения.

Поэтому вместо покупки дорогостоящего лабораторного источника питания было решено использовать аккумуляторную сборку.

Аккумуляторная батарея
Основой устройства стала батарея 5S6P из элементов 21700 ёмкостью 5000 мА·ч.

За безопасность отвечает BMS на 100 А.

Для зарядки используется двунаправленный модуль Power Delivery мощностью 140 Вт.

Таким образом один разъём USB Type-C выполняет сразу две функции:

зарядка батареи;

работа устройства как мощного повербанка.

Проектирование корпуса
Самой трудоёмкой частью проекта оказалось вовсе не проектирование электрической схемы, а создание корпуса.

Хотелось получить конструкцию, которая:

собирается без люфтов;

не требует большого количества крепежа;

легко разбирается;

выдерживает вес устройства.

В результате удалось сделать корпус, в котором крышка удерживает почти четырёхкилограммовый блок питания без дополнительных винтов.

Кроме того, RD6030 можно снять без инструмента — достаточно вставить пластиковую карту в специальные пазы.

Охлаждение
Несмотря на высокую эффективность преобразователей, при зарядке мощностью около 130 Вт выделяется заметное количество тепла.

Для контроля температуры были установлены датчики:

батареи;

платы BMS;

платы Power Delivery.

Дополнительно предусмотрен принудительный обдув.

Испытания показали, что наиболее горячим элементом оказался именно модуль Power Delivery.

Во время длительной зарядки его температура достигала примерно 100 °C.

При этом температура аккумуляторов практически не изменилась.

Проверка пульсаций
Отдельный интерес представляла проверка заявленного уровня пульсаций RD6030.

При измерениях выяснилось интересное обстоятельство.

Даже при отключённом щупе осциллограф показывал около 265 мВ.

После подключения к выходу блока питания значение практически не изменилось.

Под нагрузкой ситуация также осталась прежней.

Измерения показали, что основную роль здесь играет не сам источник питания, а уровень электромагнитных помех окружающей среды и особенности методики измерения.

Поэтому любые заявления о «нулевых пульсациях» требуют крайне аккуратной интерпретации.

Несколько практических советов
Во время сборки обнаружилось несколько нюансов.

Первое — порядок подключения BMS.

Подключать её необходимо в следующей последовательности:

Общий минус.

Балансировочные выводы B1–B4.

B+.

Общий плюс.

Нарушение этой последовательности способно вывести плату защиты из строя.

Второй важный момент касается проводов.

В проекте использованы разные сечения:

AWG14 — силовые цепи;

AWG16 — модуль Power Delivery;

AWG18 — балансировочные линии.

При этом толстые провода выполняют не только функцию передачи тока, но и дополнительно отводят тепло от силовых компонентов.

Итоги
В результате получился полностью автономный лабораторный блок питания, который сочетает функции регулируемого источника питания и мощного повербанка с поддержкой USB Power Delivery 140 Вт.

Проект ещё можно дорабатывать. Например, улучшить охлаждение модуля Power Delivery или добавить дополнительные функции управления. Но уже сейчас устройство полностью решает задачи, ради которых оно создавалось.

Все модели корпуса в формате STL, список комплектующих и материалы проекта доступны в открытом доступе, в описании под видео.

Как всегда снял для Вас видео с подробным разбором:

Показать полностью 8 1

Как ИИ ассистент меняет игру в Arduino/ESP32разработке

Как ИИ&#x2011;ассистент меняет игру в Arduino/ESP32&#x2011;разработке.

Как ИИ‑ассистент меняет игру в Arduino/ESP32‑разработке.

Код — не проблема.
Вместо бесконечного копипаста из форумов я получаю полностью готовый, отлаженный C/C++ скетч, написанный под конкретный набор библиотек (ESPAsyncWebServer, Max72xxPanel, EEPROM и т.д.). Всё, что обычно занимает часы (подбор функций, исправление конфликтов, написание конвертеров — например utf8rus), появляется в ответе за пару минут.

Код&#x202F;—&#x202F;не проблема.

Код — не проблема.

Оптимизация и надёжность.

  • Неблокирующий тайминг (millis() вместо delay()) – сервер обслуживает веб‑клиентов и одновременно скроллит текст.

  • Сохранение настроек в EEPROM – параметры (текст, скорость, яркость, шрифт) живут после перезагрузки.

  • Поддержка кириллицы – AI генерирует собственный конвертер UTF‑8 → CP1251, так что русские строки работают «из коробки».

Быстрый прототип без кода вручную.
Всё, что обычно требуют часы экспериментов и отладки, можно собрать через цепочку запросов к чат‑боту. Я задаю задачу, получаю готовый проект, загружаю в Arduino IDE и проверяю работу – без единой строки, написанной мной.

Как ИИ ассистент меняет игру в Arduino/ESP32разработке

Экономия времени и уверенность.

  • От идеи до работающего прототипа — минуты, а не недели.

  • Меньше «потерянных» часов на поиск библиотек, исправление ошибок компиляции и чтение даташитов.

  • Непрерывный «мозговой штурм»: можно сразу добавить новые функции (эффекты, меню, OTA‑обновления) – AI генерирует их на лету.

Скачать код можно тут.

Вывод:
ИИ‑ассистент превращает микроконтроллерную разработку из «борьбы с низкоуровневым кодом» в «конструирование функционала». Он пишет и оптимизирует код, рисует схему, учитывает особенности железа и даже добавляет русскую кириллицу. Для любого, кто хочет быстро собрать сложный проект на Arduino или ESP32, такой помощник – не игрушка, а реальный ускоритель разработки.

Надеюсь информация будет полезно! Спасибо за внимание, Всем добра!

Показать полностью 2
18

3D игра “Space Potatoes” для Arduino Uno на Raycasting движке

Идея игры и название “Space Potatoes” — отсылка к циклу рассказов Станислава Лема о Ийоне Тихом, а именно «Путешествие двадцать пятое», где главный герой вспоминает о том, как неподалеку от планеты Таирия на него напал хищный картофель.

Движок проекта был основан на проекте «Doom для Arduino Uno» от daveruiz (github.com/daveruiz/doom-nano).

Состав проекта

  • Микроконтроллер: Arduino Uno (ATmega328P)

  • Дисплей: OLED 0.96" 128x64 (SSD1306)

  • Ввод: Тактовые кнопки — 6 шт.

  • Звук: Пьезоизлучатель (зуммер)

  • Монтаж: Breadboard и провода-перемычки

Использовано ресурсов системы

  • RAM: 88.9% (использовано 1821 байт из 2048 байт)

  • Flash: 99.7% (использовано 32174 байт из 32256 байт)

Можно поиграть в онлайн симуляторе схем Wokwi

Можно поиграть в онлайн симуляторе схем Wokwi

Попробовать игру можно без сборки схемы в живую. Достаточно запустить клон проекта в симуляторе схем Wokwi (онлайн версия симулятора бывает долго грузица в зависимости от нагрузки на сервер): https://wokwi.com/projects/468449607199932417

Управление

  • LEFT (влево) — Поворот налево

  • RIGHT (вправо) — Поворот направо

  • UP (вверх) — Движение вперёд

  • DOWN (вниз) — Движение назад

  • FIRE — Стрельба / Атака кулаком

  • WEAPON — Сменить оружие

Ключевые особенности

  • 3D-графика: Рендеринг 3D-сцены с textures в реальном времени.

  • Игровой мир: 4 уровня (3 основных, 1 секретный).

  • Интерактивность: Открывающиеся двери, текстурированные и анимированные стены.

  • Боевая система: 4 типа оружия, 4 типа рядовых врагов, 3 типа боссов.

  • Игровой процесс: 3 уровня сложности, скрытые пасхалки.

  • Интерфейс и визуал: Анимированный HUD, анимированные заставки начала игры, хорошего и плохого финалов.

  • Аудио: Опция включения/выключения фоновой музыки.

  • Чит-код Konami: ↑ ↑ ↓ ↓ ← → ← → FIRE WEAPON

Игровые отсылки и пасхалки

Оружие

  • E_WEAPON_BLASTER — бластер (Star Wars)

  • E_WEAPON_PLASMA_CUTTER — лазерный резак (Dead Space)

  • E_WEAPON_BFG9000 — оружие BFG9000 (Doom)

Предметы

  • E_SEPULKI — сипульки (книги Станислава Лема о Ийоне Тихом)

  • E_METAL_BOX — куб-компаньон (Portal)

Текстовые цитаты в заставках

  • Вступление: "FAR FAR AWAY NEAR TAIRIYA" (отсылка к Star Wars)

  • Хороший финал: "TO INFINITY AND BEYOND" (фраза Базза Лайтера, Toy Story)

  • Плохой финал: "WASTED" (экран смерти, GTA)

Ссылка на GitHub: https://github.com/dotermine/3D-game-Space-Potatoes-for-Arduino-Uno

Показать полностью 5
19

Первый тяп-ляп на STM32 + ESP8266

  • Важное замечание, занимаюсь этим в свободное от основной деятельности время :)
    Изучаю электронику и микроконтроллеры ~2 месяца, с веб бекендом знаком относительно давно.

    Для ЛЛ: штука с которой можно отправлять сообщения на удаленный сервер (сайт), по командам что-то включать/выключать, стать успешным стримером на собственной стриминговой площадке! (точнее сказать... html страничка отображающая графику из склеенных пикселей на удаленном сервере на который они приходят от STM32).


    Видео-версия поста:

    https://rutube.ru/video/a8dc0cf622f6ba1cd9ab055a7aba4fc0/

    + Тоже самое видео только ютуб:

    https://www.youtube.com/watch?v=PIxWcxboZJY


    Попытка оформить пост в текстовом формате:
    Убедительная просьба посмотреть видео, так как писать я не умею, а нейрослоп за свой текст выдавать не хочу, да и в конкретном случае видео нагляднее.

  • Все начиналось с чтения «Чарльз Платт — Электроника для начинающих», попутно заказывая всякие непонятные штуки с Алиэкспресс, которые требуются в книге (а которые не требуются, летели в корзину заказов по принципу «дешево и прикольно выглядит», почти всё ценой до 200 р).

    Прочитав примерно половину книги, детали, которые требуются дальше, еще не успели приехать.

  • Но успели приехать: паяльный набор дурака новичка(привет синий паяльник), какой-то набор начинающего ардуинщика (как оказалось, огрызок) и куча всяких плат/флюсов и мешок электронных компонентов (начиная от таймеров, заканчивая самими нераспаянными микроконтроллерами и подложками для них).

  • Вот и решил, что помигаю светодиодом через плату, это же ненадолго... Ага.

    После мигания захотелось уже пощелкать реле через кнопку, потом попробовать вывести текст на дисплейчик двустрочный LCD1602, потом сделать импровизированный калькулятор и т. д. В конце концов я кое-как подключил уже другой экранчик 128*160 по SPI (спасибо логическому анализатору за 300 рублей) и вывел первую картинку Windows XP.

    И тут меня посетила мысль... У меня же есть джойстик! Что если поверх картинки будет другая двигаться, которой я буду управлять джойстиком?!

    Так я изобрел велосипед.

  • За этой идеей, помимо страшнючего для новичка интерфейса 3-х всадников апокалипсиса от компании ST (Cube IDE, Cube MX, Cube Programmer), меня ожидало еще и знакомство с FreeRTOS (а там и LVGL), так как на тот момент уже понимал, что дело пахнет писюнами и всё крутить в цикле на флагах не прокатит вдолгую. Хотя как я понял freeRTOS тоже цикл, но на стероидах.

    Так началось приключение длиною почти в месяц... Сопли, слезы, DMA. Короче, заработала шайтан-машина.

  • Что можно: менять цвет фона экрана, управлять яркостью ползунком (ШИМ), включать музыку, отправлять сообщения на удаленный сервер (или на локальный ПК, если указать порт), отправлять команды на запуск задач с удаленного сервера (или с локального ПК, предварительно установив импровизированное рукопожатие).Ну и конечно же, запустить стрим :)

  • На чем работает железо: LVGL графика, freeRTOS ОС (шутка про GNU), язык C (и храни господь HAL).

  • Сервер: Nginx, Docker, FastAPI (Django админка будет, наверное)

  • Что дальше? Скорее всего попытаюсь сделать что-то многофункциональное(возможно, даже полезное) и запихнуть это в плату за 100-200р ради спортивного интереса. Как дополнительный квест - утилизировать 100% времени микроконтроллера.

    А вообще хочу попробовать спроектировать свою кривую-косую плату(это же вроде ПЛИС? не?), где все будет на одном месте, а не то что stm32 -> esp8266, хотя я думал при покупке что это просто какой-то голый wifi модуль.

Первый тяп-ляп на STM32 + ESP8266
Показать полностью 1
19

Часы на ws2812b ring

Здравствуйте, изначально делал часики ради интереса но в итоге они оказались довольны удобные, поэтому остались у меня на рабочем месте.

Из компонентов:

-digispark attiny85

-DS3231

-Датчик освещенности

-Ws2812 ring 12 led

Это имитация стрелочных часов. Для удобства отметки 12, 3, 6 и 9 часов подсвечены тусклым желтым светом. Часовая стрелка реализована красным светодиодом, минутная - синим, а секундная - зеленым. Минуты и секунды отображаются с шагом в пять делений.

Яркость регулируется автоматически: днем есть хороший запас по яркости, а ночью при минимальной яркости часы не мешают и не слепят.

Также был добавлен микропереключатель, который при удержании отключает датчик освещенности от пина ATTiny85 для прошивки. Теоретически можно было обойтись и без него, но в процессе эксплуатации обнаружились баги, и чтобы не отпаивать провод при каждой перепрошивке, был установлен микрик.

Отдельных кнопок настройки нет - время задается непосредственно при прошивке. За год часы ни разу не сбились, поэтому усложнять конструкцию дополнительными элементами управления не было смысла.

Корпус - вещь сугубо индивидуальная. Не придумав ничего лучше, я собрал всю конструкцию навесным монтажом на толстом медном проводе, из которого также сделал ножки. Питание через Type-C.

Ускоренное видео работы.

Показать полностью 7 1
Отличная работа, все прочитано!

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества

Недвижимость и ремонт

Теги

Популярные авторы

Сообщества