Будучи творческим человеком и техногиком, я обожаю при первой возможности апгрейдить своё оборудование. Время от времени я мониторю маркетплейсы в поисках чего-то новенького и в этот раз я наткнулся на настоящий мультитул для Embedded-разработчика — контроллер I2C/SPI/UART/JTAG в одной коробочке и всё это всего за 1.000 рублей... Конечно я не смог пройти мимо этой штучки и в рамках сегодняшней статьи хочу рассказать что оно из себя представляет и как с ним работать. Жду вас под катом!
❯ Что за устройство?
На самом деле такой формат статей для меня «в новинку», до этого я ни разу не делал обзоров на оборудование. Да и мой инструментарий слишком зауряден, чтобы делать ещё одну статью уровня «почему Quciko T12 лучше любой 900M станции» или «почему Вам не стоит покупать компрессорный люкей в 2025 году». Однако обзоров на сегодняшний гаджет я не нашёл, несмотря на его огромную пользу как для Embedded-разработчиков и инженеров, так и мастеров по ремонту смартфонов, планшетов и ноутбуков.
Во время подготовки статьи о том, как я написал BIOS для игровой консоли от Waveshare, в рекомендациях мне попадались другие товары от этого производителя — в том числе и сегодняшний гаджет. Меня сразу привлекла возможность переключения 3v3->5v логики и обширный набор поддерживаемых шин. В официальной вики были описаны следующие характеристики:
Шины: 1x SPI с двумя чип-селектами (можно подключить до двух устройств на одну шину), 1x I2C, 1x JTAG (полноценный, с ресетом!) и 2x UART с дополнительными линиями CTS/RTS для совместимости с классическими COM-портами.
Используемый контроллер: WCH CH347. Некоторым читателям чип может показаться знакомым по аналогии с классическим CH341A.
Питание: 5В, 3.3В, потребление ~65мА на VBus. Есть самовосстанавливающийся предохранитель на «входе».

Я сразу смекнул, что смогу использовать гаджет как для восстановления программно-убитых устройств по типу КПК, так и для отладки своих собственных самоделок, благо набор шин к этому располагает. Устройство приехало ко мне примерно через месяц, в небольшом пакетике и брендовой коробочке, в которую входило само устройство, кабель USB Type-B (ну почему не Type-C?), Dupont-провода в IDC-коннекторе для всех шин, а также небольшой мануал. Нареканий к доставке кроме скорости не возникло.
Сам гаджет представляет из себя компактную металлическую коробочку с «ушками» для удобного крепления на столе или стене. Сверху расположена шпаргалка по распиновке и режимам работы CH347, а также светодиодные индикаторы для UART.
Разбирается гаджет очень просто: достаточно лишь открутить несколько винтов с обеих боковых пластин устройства и перед нами открывается вид на плату. Схемотехника здесь простейшая: самовосстанавливающийся предохранитель, линейный регулятор AMS1117, который питает контроллер и нагрузку на VCC (до ~600мА), сам CH347, а также набор ключей для согласования режимов работы. CH347 — это не просто ASIC, а вполне себе полноценный микроконтроллер, прошивку которого можно обновить, правда SDK для использования CH347 как МК производитель не предоставляет.
После подключения гаджет радостно зажег индикатор PWR, подтвердив свою работоспособность, а значит пришло время протестировать возможные варианты использования!
❯ UART
С UART всё просто и понятно: нам достаточно лишь выбрать желаемый режим работы (M0 — двухканальный UART, остальные режимы — UART + I2C/SPI или UART + JTAG) с помощью тумблера и подключить/припаять Dupont'ы к соответствующим пинам на плате. UART здесь достаточно быстрый: при двухканальном режиме работы, на UART0 можно добиться до 9Мб/с (мегабод), а на UART1 — до 7.5Мб/с.
В качестве теста я решил снять лог загрузки со своего проекта самодельной игровой консоли. Для работы с UART я привык использовать Putty: сначала я припаял RX/TX и массу, затем запустил Putty и выбрал COM-порт, соответствующий первому каналу, установил бодрейт в 115200 и включил консоль:

Всё работает! В целом, гаджет можно использовать и для прошивки более сложных устройств: например многие смартфоны и кнопочные телефоны всё ещё имеют альтернативный режим прошивки через UART, а ретро-телефоны Samsung и LG так вообще не имеют альтернатив — если нет специального JIG, то остаётся лишь вызванивать RX/TX с разъёма и подпаиваться напрямую к UART процессора!
❯ SPI/I2C
С SPI и I2C уже всё чуточку интереснее. Дело в том, что как вы уже могли понять — чип использует свой собственный проприетарный протокол для организации моста между программой на ПК и шиной данных. Для работы с этим протоколом производитель предоставляет уже готовую библиотеку для Windows начиная с 2000, так что возможно у чипа есть перспективы для оживления легаси пром. оборудования. Для Linux же есть альтернативные драйвера, которые пробрасывают CH347 как обычные spidev и i2c-dev устройства.

Для проверки коммуникации можно использовать специальную тестовую программу из SDK, которая позволяет отправлять произвольные данные и даже прошивать флэшки 25 'ой и EEPROM'ки 24'ой серии.

Давайте же попробуем написать что-нибудь полезное! Например, подключим к гаджету 1.8-дюймовый дисплей и что-нибудь на него выведем.
С разводкой дисплея проблем не возникает: SDO к MOSI, SCK к CLK, VCC к VCC и BL (питание подсветки), однако для управления DBI-дисплеями необходимы ещё две дополнительные линии: D/C (линия, определяющая как интерпретировать байт на входе), а также RESET для аппаратного сброса контроллера. И с этим проблем тоже не возникает: у контроллера есть как минимум четыре свободных GPIO, два из которых мы с вами и будем использовать для управления линиями дисплея — GPIO6 (CTS на UART1) и GPIO7 (RTS на UART).

Далее я начал изучать PDF-ку с документацией сомнительного качества и писать код инициализации. Начинается всё с получения контекста устройства с помощью функции CH347OpenDevice, которая принимает в себя индекс нужного контроллера в системе и возвращает непонятный идентификатор (вероятно WinUSB?). Интересно то, что в остальном API используется не идентификатор, а как раз тот самый индекс, который в большинстве случаев будет 0. Далее мы получаем информацию об устройстве и сверяем режим работы, если он отличается от нужного — выбрасываем исключение:
/* Initialize CH347 */
deviceHandle = CH347OpenDevice(deviceIndex);
if (!deviceHandle)
throw new std::runtime_error("Failed to open CH347 device");
mDeviceInforS info;
CH347GetDeviceInfor(deviceIndex, &info);
if (info.ChipMode != 1)
throw new std::runtime_error("Incorrect chip mode");
Далее настраиваем SPI-контроллер. На выбор есть все три существующих режима, настройки полярности и возможность вручную дергать один из двух доступных ChipSelect'ов, а также тайминги. Частота работы определяется предустановленным набором делителей — 60МГц, 30МГц, 15МГц и т.п. Не забываем настроить таймаут каждой USB-транзакции:
CH347SetTimeout(deviceIndex, CommunicationTimeout, CommunicationTimeout);
/* Initialize SPI bus & GPIO */
mSpiCfgS cfg;
memset(&cfg, 0, sizeof(cfg));
cfg.CS1Polarity = 0; /* CS0 = active low */
cfg.CS2Polarity = 0;
cfg.iActiveDelay = DefaultChipSelectDelay;
cfg.iByteOrder = 1;
cfg.iClock = 0;
cfg.iDelayDeactive = DefaultChipSelectDelay;
cfg.iIsAutoDeativeCS = 0;
cfg.iMode = 0;
cfg.iChipSelect = 0;
cfg.iSpiWriteReadInterval = DefaultChipSelectDelay;
if (!CH347SPI_Init(deviceIndex, &cfg))
throw new std::runtime_error("Failed to initialize SPI");
И инициализируем дисплей. Здесь есть важный момент: функция CH347GPIO_Set устанавливает состояние всего GPIO-контроллера в чипе и поэтому принимает в себя три битовые маски с конфигурацией каждого пина. Функции GPIO стандартные — вход/выход, плюс обработка прерываний с помощью специального callback'а:
CH347GPIO_Set(deviceIndex, 1 << config.IOReset, 1 << config.IOReset, 0);
this_thread::sleep_for(16ms); /* HW reset */
CH347GPIO_Set(deviceIndex, 1 << config.IOReset, 1 << config.IOReset, 1 << config.IOReset);
/* Software initialization */
SendCommand(EMIPICommandList::cmdSWRESET, 0, 0, 16);
SendCommand(EMIPICommandList::cmdSLPOUT, 0, 0, 0);
/* Framerate and refresh */
uint8_t frameRateControlRegister[] = { 0x01, 0x2C, 0x2D };
SendCommand(EMIPICommandList::cmdFRMCTL1, frameRateControlRegister, sizeof(frameRateControlRegister), 0);
SendCommand(EMIPICommandList::cmdFRMCTL2, frameRateControlRegister, sizeof(frameRateControlRegister), 0);
SendCommand(EMIPICommandList::cmdFRMCTL3, frameRateControlRegister, sizeof(frameRateControlRegister), 0);
SendCommand(EMIPICommandList::cmdFRMCTL4, frameRateControlRegister, sizeof(frameRateControlRegister), 0);
/* Power control */
uint8_t powerControlRegister1[] = { 0xA2, 0x02, 0x84 };
SendCommand(EMIPICommandList::cmdPWCTL1, powerControlRegister1, sizeof(powerControlRegister1), 0);
uint8_t powerControlRegister2 = 0xC5;
SendCommand(EMIPICommandList::cmdPWCTL2, &powerControlRegister2, sizeof(powerControlRegister2), 0);
uint8_t powerControlRegister3[] = { 0x0A, 0x00 };
SendCommand(EMIPICommandList::cmdPWCTL3, powerControlRegister3, sizeof(powerControlRegister3), 0);
uint8_t powerControlRegister4[] = { 0x8A, 0x2A };
SendCommand(EMIPICommandList::cmdPWCTL4, powerControlRegister4, sizeof(powerControlRegister4), 0);
uint8_t powerControlRegister5[] = { 0x8A, 0xEE };
SendCommand(EMIPICommandList::cmdPWCTL5, powerControlRegister5, sizeof(powerControlRegister5), 0);
uint8_t powerControlVCOMRegister = 0x0E;
SendCommand(EMIPICommandList::cmdPWCTL6, &powerControlVCOMRegister, sizeof(powerControlVCOMRegister), 0);
/* Addressing */
uint8_t madCtlMode = 0xC8;
SendCommand(EMIPICommandList::cmdMADCTL, &madCtlMode, sizeof(madCtlMode), 0);
uint8_t rasetRegister[] = { 0x0, 0x0, 0x0, 0x7f };
uint8_t casetRegister[] = { 0x0, 0x0, 0x0, 0x9f };
SendCommand(EMIPICommandList::cmdRASET, casetRegister, sizeof(rasetRegister), 0);
SendCommand(EMIPICommandList::cmdCASET, rasetRegister, sizeof(casetRegister), 0);
uint8_t colorMode = 0x05; /* RGB565 */
SendCommand(EMIPICommandList::cmdCOLMOD, &colorMode, sizeof(colorMode), 0);
SendCommand(EMIPICommandList::cmdDISPON, nullptr, 0, 0);
...
void CDisplay::SendCommand(EMIPICommandList command, uint8_t* data, size_t length, uint32_t delay)
{
uint8_t cmd = (uint8_t)command;
/* Send command */
GPIOSet(deviceIndex, config.IODataCommand, 0);
CH347SPI_Write(deviceIndex, 0, sizeof(cmd), sizeof(cmd), &cmd);
/* Send arguments (if any) */
if (data && length)
{
GPIOSet(deviceIndex, config.IODataCommand, 1);
CH347SPI_Write(deviceIndex, 0, length, length, data);
}
this_thread::sleep_for(chrono::milliseconds(delay));
}
Теперь можно запустить программу и посмотреть на результат. Если вы увидели шум (или мусор) на экране — значит вы всё делаете правильно и контроллер успешно проинициализирован.
Теперь можно что-нибудь вывести. Подготавливаем изображение, преобразовав в 16-битный массив пикселей, переводим контроллер в режим записи в VRAM, отправляем изображение:
void CDisplay::CopyFrameBuffer(uint8_t* pixels)
{
uint8_t cmd = (uint8_t)EMIPICommandList::cmdRAMWR;
/* Send command */
GPIOSet(deviceIndex, config.IODataCommand, 0);
CH347SPI_Write(deviceIndex, 0, sizeof(cmd), sizeof(cmd), &cmd);
GPIOSet(deviceIndex, config.IODataCommand, 1);
uint32_t frameBufferSize = config.Width * config.Height * 2;
uint32_t offset = 0;
CH347SPI_Write(deviceIndex, 0, frameBufferSize, 2, pixels);
}
И пишем небольшую демо-программу:
int main(int argc, char** argv)
{
CDisplayConfiguration config = {
ChipSelectIndex, ResetGPIOIndex, DataCommandGPIOIndex, 128, 160
};
CDisplay display(config);
display.CopyFrameBuffer(beach);
return 0;
}
Результат — на дисплее появляется картинка!
Потенциальных применений у такого гаджета много: можно сделать красивые анимированные часы, мониторинг датчиков, показ уведомлений или дублировать окно с основного ПК. А ведь когда-то ради такого покупали LPT-провода, дисплеи от Сименсов и вручную превращали параллельную шину в последовательную...
❯ Заключение
Вот такой интересный гаджет выпустила компания Waveshare — и, что радует, по очень приятной цене! Ссылку по понятным причинам прилагать не буду, но при желании вы сможете его найти на всех трёх крупных маркетплейсах. Кроме того, можно купить Breakout-плату с тем же самым чипом за ~500 рублей, но там не будет таких удобных переключателей и Dupont'ов.
К сожалению, теста JTAG в статье не будет. У меня пока нет готовых к работе необычных гаджетов, где можно было бы протестировать OpenOCD... однако мой HTC Dream всё ещё ждёт свою прошивку модема!
А если вам интересна тематика ремонта, моддинга и программирования для гаджетов прошлых лет — подписывайтесь на мой Telegram-канал «Клуб фанатов балдежа», куда я выкладываю бэкстейджи статей, ссылки на новые статьи и видео, а также иногда выкладываю полезные посты и щитпостю. А ролики (не всегда дублирующие статьи) можно найти на моём YouTube канале.
У меня также есть Boosty.
Очень важно! Разыскиваются девайсы для будущих статей!


А ещё я держу все свои мобилы в одной корзине при себе (в смысле, все проекты у одного облачного провайдера) — Timeweb. Потому нагло рекомендую то, чем пользуюсь сам — вэлкам.
Комментарии (74)

MaFrance351
15.11.2025 14:10Заинтересовался. Поискал поподробнее.

Оказывается, даже прогеры EEPROM на этих чипах уже делают. По отзывам даже лучше, чем "народный" CH341A.

bodyawm Автор
15.11.2025 14:10CH341 сам по себе в оригинале был мостом USB - SPI :) В 347 просто жтаг добавили.

mozg37
15.11.2025 14:10а можно и за 200 аналогичную на алике найти

bodyawm Автор
15.11.2025 14:10О чем я и написал в конце статье) Waveshare интересен тем, что это самостоятельная коробочка которую можно закрепить на столе и использовать когда надо, в то время как для копеечных борд корпус нужно печатать самому.

010011011000101110101
15.11.2025 14:10а что, ардуина нано или esp32 не делают всё то же самое?

bodyawm Автор
15.11.2025 14:10Кроме JTAG (DirtyJTAG не в счет) - в целом делают, но софтовый мост придется писать самому или брать чужой велик. А здесь Industrial Grade изделие - подключил и работай

Moog_Prodigy
15.11.2025 14:10До Industrial Grade ему малость не хватает развязок. Ну и в целом я бы такое в станок не поставил. А на столе поиграться - сойдет =)

bodyawm Автор
15.11.2025 14:10Ну я имел ввиду что где-нибудь на столе в мастерской для чтения логов поставить самое то. Или для DIY'щиков/инженеров)

releyshic
15.11.2025 14:10для DIY'щиков/инженеров как раз и надо, чтобы не сгорало (было с развязками). А там внутри место есть под платы развязок или туда не приколхозить?

Moog_Prodigy
15.11.2025 14:10
Ну куда тут колхозить. Проще найти конкретный адаптер с развязками или передрать часть этой и сделать нормально. Можно еще usb-usb развязку поставить снаружи, от компа изолирует, но не между интерфейсами.

tigreavecdesailes
15.11.2025 14:10Софтовый мост не нужен, достаточно в esp32 залить micropython и все i2c/spi/uart/gpio доступны в скрипте на питоне который, к тому же, можно выполнять в REPL режиме на ПК к которому подлключен этот esp!

NutsUnderline
15.11.2025 14:10а можно залить в avr и все i2c/spi/uart/gpio доступны в скрипте на .asm :) :) :)

Goron_Dekar
15.11.2025 14:10Чем отличается от bus pirate?

litalen
15.11.2025 14:10Откройте для себя FT2232/FT4232. Стоят столько же или лишь чуточку дороже (1000-1500р на одном популярном китайском маркетплейсе), а умеют больше, и история у них более давняя. При этом с USB Type-C, 4 канала (а не 2, у второй модели), управляются хоть питоном. Имеют 3.3В-пины, которые толерантны и к 5В. Конфигурационная прошивка давно разобрана, API - опенсорс. Их сила в MPSSE, и при помощи подобного можно даже замахнуться на чтение NAND.

bodyawm Автор
15.11.2025 14:10Пишете так, будто 2232 - сенсация) Давно знаем, но интересно было CH347 попробовать.
чтение NAND
Спасибо, но для работы с чем-то сложнее 24/25 у меня есть T48)

NutsUnderline
15.11.2025 14:10"прошивка" ftdi то конечно там закрытая, но открыты библиоеки и можно посмотреть какие байты слать для spi/i2c Ну а уж jtag через openeocd на ftdi это вообще база, к любому контроллеру начиная с отечественных

litalen
15.11.2025 14:10но интересно было CH347 попробовать
Теперь понял посыл статьи :)
у меня есть T48
Отсутствие опенсорсной читалки/писалки NAND конечно боль :(

x89377
15.11.2025 14:10
bodyawm Автор
15.11.2025 14:10У квасона нет переключалки 3.3В/5В)

pvvv
15.11.2025 14:10для spi/jtag ещё есть usb blaster за 2$ который питание буферов 1.8..5 берет снаружи, типа такого https://aliexpress.ru/item/1005008497994499.html
только китайцы в порыве оптимизации из некоторых таких клонов стали выходные буферы убирать вообще.
для всего остального, особенно чего-нибудь странного - ft[2]232h c mpsse

EmCreatore
15.11.2025 14:10Немного конечно неадекватоно, когда однин из главных плюсов инструмента - его дешивизна.
Все равно что выбирать самый дешевый молоток для забивания гвоздей, а лучше вообще первым попавшимся булыжником забивать.
Либо наоборот, давайте микроскопом забивать, т.е. приплетать сюда ПЛИС-ы
Да возьмите любую отладочную плату на микроконтроллере.
Например такую - https://www.renesas.com/en/design-resources/boards-kits/ek-ra8p1
Сконфигурируйте на ней WEB сервер.
И получите тысячи применений вместо четырех.
GPT-5.1-Codex влет напишет нужные крависые WEB , протокол обмена по JSON с платой, а на плате напишет обмен по всем современным интерфейсам: I2C, I3C, SPI, OSPI, QSPI, SDIO, UART, USART, 1WIRE, LIN, CAN, MODBUS, CANFD, USB, SSI, PDM, MMC, MIPI ...
И не нужно никах левых драйверов под Windows. Можно хоть с телефона рулить.
bodyawm Автор
15.11.2025 14:10GPT-5.1-Codex влет напишет нужные крависые WEB
На этом закончил читать

NutsUnderline
15.11.2025 14:10это наверное зумер :) :) :) на самом деле вопрос скорее всего заканчивается на доступности плат этого производителя

NutsUnderline
15.11.2025 14:10а почему не обычные esp32 ? там и дешевизна (ну что поделать, дешеман - это фишка автора, но не только его)
json кстати уже не модно теперь https://habr.com/ru/news/966734/comments/

EmCreatore
15.11.2025 14:10У esp32 мало пинов, мало современных интерфейсов, мало памяти и неудобная медленная отладка.
На RA8 можно делать полноценные анализаторы протоколов и перехватчики.
Сегодня мне GPT-5.1-Codex написал полноценное WEB приложение для перепрограммированися системы из десятков CAN узлов. За один день! сложнейшее приложение с сканированием сети, получением метаинформации, индикацией прогресса, разруливание конфликтов и т,д,
PriFak
15.11.2025 14:10а можно не WEB? а можно пожалуйста делать быстрый нативный код который будет просто работать?
На кой мне (да и всем) в промышленности веб приложения, это же бред
pvvv
15.11.2025 14:10Добро пожаловать в кроссплатформенное будущее, которое мы заслужили.
Если подразумевается что у пользователя может быть win/linux/macos/android/ios остаётся только браузер, чтобы единожды написанный код можно было запустить на всём вышеперечисленном.

PriFak
15.11.2025 14:10Я не могу себе представить, чтобы инженер електронщик, ембеддед програмист, использовал для отладки мак или телефон. Скорее всего это будет винда с легаси софтом, или линукс с немного менее легаси софтом.
Ну какой веб, я не буду прошивать stm с помощью web st-link UwU utility. И никто в здравом уме не будет.

pvvv
15.11.2025 14:10для отладки да, сложно представить использование телефона.
Но как только понадобится сделать любое простое устройство с подключением и управлением от ПК/мобилки (не знаю, измеритель чего-нибудь, дозиметр, например, какой-нибудь), которое надо отдать стороннему среднестатистическому пользователю, могу только пожелать удачи, пилить быстрый нативный код, N раз, который будет просто работать во всем этом зоопарке. Даже если там из пользовательского интерфейса всего пара кнопок и отображение значения/график. Идея засунуть это в веб причём на самом устройстве выглядит уже не столь безобразно.

EmCreatore
15.11.2025 14:10Я понимаю, откуда ноги растут. Ещё совсем недавно HTML-страницу со скриптами сделать обычному эмбеддеру было очень трудно. А тут ещё обмен по JSON и серверная часть. А серверная часть завязана на особенностях встраиваемых ограниченных стеков типа lwIP, NetX Duo или чего-то такого.
Но фишка в том, что сейчас идёт революция. Столпы рушатся.
Сегодня я за час перенёс веб-сайт с CMS Joomla и дорогого хостера на бесплатный облачный сервис со статическими страницами и функциями. Всё прошло идеально: полное сохранение содержимого и форматирования, очистка от всех артефактов Joomla и рекламных ссылок.
Ну а Joomla, думаю, конец — как пришёл конец Stack Overflow. И ещё придёт конец всем сайтостроителям и всей индустрии плагинов под них.
Да что там говорить. Мне Cloude Sonnet легко переделывает приложение с Delphi на новейшие технологии WinUI и XAML. Это конец большинству IDE и индустрии компонентов под них.
Нативы тоже шатаются.
Никто, конечно, JTAG/SWD-адаптеры пока не отменил, хотя RA8 сейчас грузится через USB свободно.
Но легаси точно уже не нужен. Как-то внезапно я заменил свои легаси-утилиты на питоновские скрипты, потому что Cloude идеально пишет и отлаживает код на питоне. Сам я в питоне ничего не понимаю.
И Web-интерфейсом я некоторое время назад заменил терминалы в своих устройствах.
Все Web-страницы мне пишет Cloude (ну иногда Codex, но он жутко медленный).
Первым делом на голые девайсы сразу портирую TCP-стек с Web-сервером. Если нет Ethernet или Wi-Fi, то запускаю через USB.
По сравнению с терминалами это земля и небо по удобству.

NutsUnderline
15.11.2025 14:10Но легаси точно уже не нужен.
Сам я в питоне ничего не понимаю
Сколько уж таких было :) Это хорошо когда хорошо работает. Если понадобиться что то допилить у "разработчика" могут быть проблемки. Но обычно проблемки у других потому что разработчик свалил в туман.
сразу портирую TCP-стек с Web-сервером
тоже Cloude ?

EmCreatore
15.11.2025 14:10Тут опять не могу согласиться.
К примеру, вы в курсе что у такого всеми любимого ESP32 нет нормальной хостовой библиотеки, чтобы сторонний микроконтроллер мог использовать ESP32 просто как WiFi модуль.
То что есть портировано на ESP32-P4 и это монстр из 1300 фалов!
Требующий немеренно динамической памяти, создающий 6 задач и кучу очередей, испещренный логами и многоэтажными макросами.
Так вот Cloude не за час, но за пару дней урезал этот кошмар до 20 файлов!
И в навесок модуль апгрейда софта написал через UART этого ESP.
Т.е. разработчики могут валить теперь в туман оптом, никто не заметит потери бригады бойцов.

NutsUnderline
15.11.2025 14:10я про другой "уровень", но на это (20 файлов) я бы тоже хотел поглядеть. огород оберток там просто прекрасный но в lwip есть и полезные строчки, которые по логике
на голые девайсы сразу портирую
чтобы сторонний микроконтроллер мог использовать ESP32 просто как WiFi модуль
для этого есть много других микросхем. для esp есть более менее стандартизированный at протокол ну и отдельная приблуда esp host через uart, но это скорее прошлое :)

EmCreatore
15.11.2025 14:10ESP32 хорош подменой MAC.
Европейские теперь MAC не очень то дадут менять, плюс у ESP32 попроще с региональными ограничениями на полосы и мощности.
Ну и скрость по SDIO у них достойная. Еще тестирую.

pae1
15.11.2025 14:10в этом диалоге заметна разница между тем кто имеет доступ к ИИ и железу и тем, кто смотрит картинки

kenomimi
15.11.2025 14:10GPT-5.1-Codex влет напишет нужные крависые WEB
Не пишет ИИ пока что красивый фронт. Всё разуплотнено, коряво, и требует ручного допиливания...

tlittle
15.11.2025 14:10Вы уверены, что правильно трактуете слово "адекватно"? Неадекватно - выбирать дорогой инструмент без оценки экономической целесообразности. Если мне надо забить дома пару гвоздей - я предпочту купить самый дешёвый молоток, а не компрессорный автоматический инструмент от милуоки. Может быть не самый дешёвый, но уж точно не самый дорогой и навороченный - он мне потребуется в лучшем случае через месяц. А если надо просто выпрямить ржавый гвоздь где-то на на даче, чтобы временно закрепить провод, - булыжника будет достаточно, использовать его в моменте будет более адекватно, чем срочно ехать за фильдеперсовым молотком в город.

DrMefistO
15.11.2025 14:10У меня есть такой дома: в целом неплох, только расшатался USB-B быстро - чуть тронешь вырубается, плюс громоздкий.

bodyawm Автор
15.11.2025 14:10Статья по каким-то неведомым причинам улетела в черновик... Восстановил)

ponikrf
15.11.2025 14:10Eсли занимаетесь бюджетной автоматизацией - рекомендую обращать внимания на новые продукты wavesahre. Например у них есть из той же категории usb-> 4 rs485 или usb хаб в подобном формате, который можно на динрейку поставить.
А самое главное - для бюджетных вещей - у них очень неплохая схемотехника и общее исполнение

COTTONMAUS
15.11.2025 14:10почему Вам не стоит покупать компрессорный люкей в 2025 году
Ну хэзе хэзе, бро))
Я году так в 17м или 18м как купил себе паялку (паяло на 900х жалах + фен на турбине), так до сих пор ей пользуюсь ☺️

bodyawm Автор
15.11.2025 14:10Я скорее о том, что сейчас есть вполне недорогие столы с куда более мощными фенами)

ComboDro
15.11.2025 14:10Инженеры сильно не пинать.
Чтобы хоть мало мальски разбираться в вашей профессии, что нужно заканчивать или какие курсы проходить?

bodyawm Автор
15.11.2025 14:10Ну я самоучка, настоящим инженером меня назвать из за пробелов в базе. А так я лично читал документацию, спеки и схемы интересных для меня устройств

shoguevara
15.11.2025 14:10Я, конечно, понимаю и уважаю нежелание постить ссылку на площадки, которые торгуют девайсом, но на сайт производителя-то можно было?
Или хотя бы на официальный wiki?
bodyawm Автор
Друзья! На какое-то время я снова начну постить статьи раз в две недели, а не раз в неделю как обычно. Я тут в общем на диету подсел, достаточно строгую, но эффективную: был 153, за 2.5 месяца стал 128. Лимит 1.000 калорий в день, питание - один раз в сутки, всё это в сочетании с еженедельными двухсуточными полными отказами от еды.
В целом, чувствую себя неплохо, но пока ещё ищу баланс между максимальным похудением и работоспособностью. Например, после двухсуточного голодания съедание даже дольки чего-то сладкого (чисто для глюкозы) вызывает тремор, так что нужно быть осторожнее.
Если что, мне 24 - именно из-за молодого возраста выбрал такую строгую диету, поскольку если не привести себя в порядок сейчас, уже даже после 25-и это может быть куда сложнее.
bodyawm Автор
На следующей неделе расскажу о нашумевшей Linux-игровой консоли за 1.800 рублей - R36s. На самом деле, их бывает аж три ревизии, причём одна работает на экзотическом и очень редком MIPS-процессор и это не Ingenic!
Скрытый текст
Узнаем с вами что это за гаджеты, что у них "под капотом" и на что они способны помимо эмуляции ретро-консолей. Дааа, Vulkan в консоли до 2.000 рублей - это было что-то из области мечтаний даже 2-3 года назад...
bodyawm Автор
А, ну и ещё важное дополнение: статья - не реклама, а просто обзор. Я купил коробочку за свои кровные :)
xirahai
Интерфейс UART в этой коробочке с какими уровнями напряжения?
BerZerKku
В описании всё есть https://aliexpress.ru/item/1005005986911939.html?dp=46.48.62.177-frF9vNdA%2FP8&af=d99%3A&cn=1005005986911939&spm=a2g2w.productlist.search_results.7.6c5ceec1x8BmF1&_ga=2.146903671.1751165545.1761846138-1152193382.1719163987&aff_fcid=7d22a0662c884c4ea13ca77fe27932e4-1763223387311-06651-_c2RForq5&aff_fsk=_c2RForq5&aff_platform=api-new-link-generate&sk=_c2RForq5&aff_trace_key=7d22a0662c884c4ea13ca77fe27932e4-1763223387311-06651-_c2RForq5&terminal_id=3afc36ebb05947dfaf393928f9279e71&sku_id=12000035190638679
bodyawm Автор
3.3 и 5В. 1.8В нет :(
zhka
на диетуДержись, бро!
bodyawm Автор
Очень стараюсь)
AlexanderS
10 кг/мес - это совсем не хорошо. 2 кг/мес - это было бы отлично и организм будет успевать адаптироваться. Один мой знакомый как-то аналогично взялся за свой образ жизни (голодания, диеты, тренажерка) и за год-полтора угасил свой организм до операций по удалению камней в мочевом и удалением желчного. Сейчас он худой и подтянутый, но абсолютно не здоровый. Я как бы не ради поучить, я вообще эту тему не изучал, но с призывом к благоразумию.
bodyawm Автор
Да лан, норм, я контроллирую
Knkplua
Вы поступаете не очень мудро. Безопасной считается скорость до 1% массы (в разных источниках фигурируют 1-1,3 кг) в неделю. При большей скорости достоверно повышается риск повреждения сердца, печени, поджелудочной железы. Проблемой любого похудения является потеря мышечной массы. Без мышц тяжело не только двигаться, но и худеть, так как именно мышцы потребляют основную часть калорий. А Вам нужно сбросить, вероятно, еще 35-40 кг. Чтобы поддерживать мышечную массу, нужна физическая активность вообще и на самые массивные мышцы (бедра, плечевой пояс) в частности. Это невозможно, если не есть вообще. Просто сладкое (быстрые углеводы) лучше совсем не есть. Особенно после голодания это вызывает всплеск выделения инсулина, которые вызывает (усиливает) гипогликемию, вот Вас и трясет. Нужны медленные углеводы и жиры.
А в целом худеть очень надо, чем раньше, тем лучше (и проще). Крепкого Вам здоровья. Вас очень интересно читать. А для того, чтобы интересно писать, лучше быть здоровым, а не бороться с болезнями.
RTFM13
Я подпишусь в пользу физической активности.
Я правда никогда не весил 150 (тут еще вопрос в росте и составе этого веса). Но со 125 до 95 скинул во время ковида при возрасте за 40 за пол года без каких-то ощутимых побочек. И это без ограничений в еде. Единственное, я не ел (не ел до этого, и сей час почти не ем) все виды кондитерки, хлеб, макароны, картошку, сладкие соки и газировки и т.п. Т.е. все концентрированные углеводы. Мне просто не нравилось это есть. Мясо (в т.ч. жирное) свежие овощи фрукты ел без ограничений вообще.
А при голодании мышцы страдают первыми, такое похудение менее приятно и в процессе и в последствии.
bodyawm Автор
Я отказался от любой вредной еды с усилителями вкуса.
aronsky
Бро, не слушай никого, если тебе комфортно в таком темпе терять вес - то огонь. Я по 7.5 кг за месяц терял, правда я и весил не 150.
Главное - плавный выход. По длине выход может быть таким же как и весь период жёсткой диеты, иначе есть ненулевая вероятность сорваться. Ну и понимать, что в целом диета и контроль калорий - это на всю жизнь.
А, и еще лично водичка очень сильно помогала с минералами - у них часто есть небольшое количество подсластителей при том, что калорий там всё равно что-то вроде 7 на всю бутылку. Вот это малое количество подсластителя, который обычный человек не чувствует, для отказавшегося от сладкого ощущается как ложка сахара всухомятку. Короче помогает обмануть организм когда совсем тяжело.
bodyawm Автор
Я сломал себя с помощью силы воли, полностью отказавшись от еды с усилителями вкуса, соусов и прочей фигни. Теперь я чисто физически не тянусь к вредной еде т.к организм отвык от химозы и получает кайф от натур пищи.
В целом мне хорошо. Пришлось обменять некоторое число энергии в день на общую легкость.