Skip to content

Instantly share code, notes, and snippets.

@bttrem
Last active October 8, 2026 08:45
Show Gist options
  • Select an option

  • Save bttrem/30eefce2549c1a873f382b5cbdcb3541 to your computer and use it in GitHub Desktop.

Select an option

Save bttrem/30eefce2549c1a873f382b5cbdcb3541 to your computer and use it in GitHub Desktop.
Reverse engineering SES-imagotag G-Tag 6

Reverse engineering SES-imagotag G-Tag 6

После того как этот электронный ценник приобрёл известность в DIY-сообществе, опубликую некоторые свои наработки по G-Tag 6.

Куча бесполезных электронных ценников G-Tag 6 — YouTube автор shojkeee

Telegram-группа по SES-imagotag G-Tag 6: https://t.me/g_tag6 владелец ReallSeriously

Update: Коментариев уже больше сотни, часть по умолчанию скрыта под "Load earlier comments...", подгружайте если нужно. И пожалуйста, большие фотки и т.п. размещаем под спойлером.

Описание от производителя

Параметр Значение
Размеры, мм 69 × 35 × 10,5
Дисплей LCD, 256 × 128
Активная область, мм 52 × 25
Количество пикселей 32 768
Плотность пикселей 127 dpi
Цвет пикселей Чёрный / белый
Количество страниц 6*
Максимальное количество обновлений в час 150 000
Время работы от аккумулятора 5 лет — 2 обновления в день*

На плате есть две чёрные капли компаунда в форме восьмёрки — это бескорпусные микросхемы (COB, Chip-on-Board). Одна капля, скорее всего, скрывает RF-приёмник, а вторая — драйвер дисплея.

Антенна довольно крупная, с ферритовым сердечником. Есть информация, что RF-часть работает на частоте 36 кГц — Radio Force X4 (RFX4). Отреверсить протокол, скорее всего, маловероятно: нужна базовая станция от производителя и лицензионное программное обеспечение.

Дисплей

Самое полезное в этом устройстве — дисплей. Он потребляет мало энергии: ток потребления всей электроники составляет около 10 мкА ±.

Частота обновления — около 1 Гц. Забегая вперёд, можно разогнать её до нескольких десятков герц, но дисплей начинает заметно мерцать.

При загрузке дисплей долго инициализируется. Сначала он выводит изображение Busy..., а затем — изображение SES с логотипом производителя.

У дисплея, если не ошибаюсь, 33 36 выводов. В основном они используются для подключения конденсаторов подкачки и питания. Дисплей приклеен токопроводящим скотчем. Однако можно разрезать дорожки на задней стороне платы и подпаяться к достаточно крупным тестовым площадкам.

Некоторые полезные выводы дисплея, начиная с верхнего края:

Вывод Назначение Тестпоинт
1, 2 GND GND
3 DisplayCLK = 29 кГц — вход S1
4 1 Hz — выход 4
5 DIO S10
6 CLK S11
7 CS 7
8 RES 8

Обновление: Возникло некоторое недопонимание по вопросу питания дисплея. Для него нужно дополнительное +3(3.3) В, выводы выше это только часть подключения. Для питания можно подключить к цепям батарейки или где удобно. Дисплей может иногда работать на паразитном питании от цифровых входов, но это лотерея и не правильно.

Есть сходство с дисплеями ST730x: некоторые команды совпадают. Размер памяти экрана больше, чем 256 × 128, поэтому в некоторых пределах можно прокручивать изображение большего размера.

Также похоже, что есть несколько экранных страниц (6???). Командой 0x4D можно менять изображения Busy... и SES.

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

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

Тактирование и обновление изображения

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

Таким образом, сигнал 29 кГц — это входной тактовый сигнал. Его можно спокойно увеличить примерно в 10 раз: дисплей начнёт обновляться быстрее, но появится мерцание. Возможно, нужно еще менять настройки чтобы избавится от мерцания.

Протокол — двухсторонний 3-wire SPI, 9 бит на слово. В первом бите передаётся флаг «команда / данные». В драйвере, однако, можно обойтись только операциями записи.

Дисплею требуется инициализация. Впрочем, можно дождаться полной инициализации от штатного микроконтроллера ценника — конечного изображения с логотипом SES — и затем просто передавать свои данные. Полный экран занимает 4096 байт. Для такого варианта достаточно установить резисторы сопротивлением около 1 кОм в разрыв линий SPI между штатным микроконтроллером и дисплеем, а свой микроконтроллер подключить непосредственно к дисплею.

Для полноценного управления дисплеем со своего MCU нужно полностью перерезать дорожки SPI, RES и DisplayCLK.

SPI можно разогнать до 20 МГц и выше, но это никак не повлияет на FPS. Я пытался использовать DMA, но отказался от этой идеи из-за усложнения кода и аппаратной зависимости.

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

Драйвер

Я написал драйвер этого дисплея для библиотеки olikraus/U8g2 версии ^2.36.18.

Однако драйвер пока сильно захардкожен и специфичен для ESP32-C3. Выложу его позднее.

Тестовый код

Ниже приведён тестовый код на MicroPython для экспериментов( Raspberry Pi Pico - rp2040). Работать с ним гораздо удобнее, чем с вариантами на C-подобных языках:

Нажмите, чтобы развернуть MicroPython код
import rp2
import machine
import time

# Назначение GPIO пинов Raspberry Pi Pico
PIN_MOSI     = 3
PIN_CLK      = 2
PIN_CS       = 5
PIN_RESET    = 6   # Вывод сброса (Active LOW)
PIN_SYSCLOCK = 7   # Вывод генерации частоты накачки ~29 кГц (PWM)

# PIO программа для 9-битного SPI с паузой после 1-го бита
@rp2.asm_pio(
    out_shiftdir=rp2.PIO.SHIFT_LEFT, 
    autopull=True,                   
    pull_thresh=9,                   
    out_init=rp2.PIO.OUT_LOW,
    sideset_init=rp2.PIO.OUT_LOW     
)
def spi_9bit_with_delay():
    # Отправка 1-го бита (D/C)
    out(pins, 1)        .side(0)      
    nop()               .side(1) [4]  
    nop()               .side(0) [7]  
    
    # Цикл для оставшихся 8 бит
    set(x, 7)                         
    label("bit_loop")
    out(pins, 1)        .side(0)      
    nop()               .side(1) [1]  
    jmp(x_dec, "bit_loop") .side(0)   


# Инициализация конечного автомата PIO
sm = rp2.StateMachine(
    0, 
    spi_9bit_with_delay, 
    freq=2000000, 
    out_base=machine.Pin(PIN_MOSI), 
    sideset_base=machine.Pin(PIN_CLK)
)
sm.active(1)

# Настройка пинов управления
cs = machine.Pin(PIN_CS, machine.Pin.OUT, value=1)
reset_pin = machine.Pin(PIN_RESET, machine.Pin.OUT, value=1)

# Функция отправки 9-битного пакета
def write_9bit(is_data, byte_value):
    packet = ((1 if is_data else 0) << 8) | (byte_value & 0xFF)
    cs.value(0)                       
    sm.put(packet << 23)              
    while sm.tx_fifo() > 0:
        pass
    time.sleep_us(30)                  
    cs.value(1)                       

# Функция сброса и инициализации
def reset_and_init():
    print("init...")
    reset_pin.value(0)
    time.sleep_us(50)
    reset_pin.value(1)
    print(" end init 1")
    
    time.sleep_ms(50)
    write_9bit(is_data=False, byte_value=0x11) # Выход из сна. Нужна только эта команда для запуска 1Гц?
    
    # Очистка дисплея, можно не делать - будет мусор
    write_9bit(is_data=False, byte_value=0x2a) # c
    write_9bit(is_data=True,  byte_value=0x00) # d
    write_9bit(is_data=True,  byte_value=0x00) # d
    write_9bit(is_data=False, byte_value=0x2c) # d        
    for i in range(4096):
        write_9bit(is_data=True, byte_value=0xff)
        
    print(" end init 2")
    time.sleep_ms(10) # !
    write_9bit(is_data=False, byte_value=0x4c) # c
    write_9bit(is_data=True, byte_value=0x0c) # d
    write_9bit(is_data=True, byte_value=0x00) # d 
    write_9bit(is_data=True, byte_value=0x00) # d 
    time.sleep_ms(4)
    write_9bit(is_data=False, byte_value=0x4d) # c
    write_9bit(is_data=True, byte_value=0xff) # d
    write_9bit(is_data=True, byte_value=0x00) # d
    write_9bit(is_data=True, byte_value=0x7f) # d        
    time.sleep_ms(1)
    write_9bit(is_data=False, byte_value=0x4e) # c
    write_9bit(is_data=True, byte_value=0x60) # d 
    print(" end init 3")

# =================================================================
#    ЗАПУСК ПЕРИФЕРИИ И ДЕМОНСТРАЦИЯ
# =================================================================

# 1. Запуск постоянной генерации ~29 кГц на GPIO7
sysclock_pwm = machine.PWM(machine.Pin(PIN_SYSCLOCK))
sysclock_pwm.freq(29000)      # Установка частоты 29 кГц  29000 29000*5(быстрее в 5 раз, начинает мерцать)
sysclock_pwm.duty_u16(32768)  # 50% заполнение (меандр)
print("29 kHz GPIO7")

# 2. Вызов функции инициализации дисплея
reset_and_init()

# 3. Выводим тестовые полосы
write_9bit(is_data=False, byte_value=0x2a) 
write_9bit(is_data=True,  byte_value=0x00) 
write_9bit(is_data=True,  byte_value=0x00) 
write_9bit(is_data=False, byte_value=0x2c)         
for i in range(4096):
    write_9bit(is_data=True, byte_value=0x0f)

# Некоторые рабочие команды
# write_9bit(is_data=False, byte_value=0x28) # c display off
# write_9bit(is_data=False, byte_value=0x29) # c display on

# write_9bit(is_data=False, byte_value=0x10) # c Sleep in
# write_9bit(is_data=False, byte_value=0x11) # c Sleep out

# write_9bit(is_data=False, byte_value=0x01) # c Software reset 

Из этого кода можно полностью понять процес инициализации и отображения тестовой картинки на дисплее.

У меня есть две версии платы 2012 и 2014 года, возможно есть и другие. Можно допустить что какие-то команды в вашем ценнике окажутся другими.

Возможное применение платы ценника

Помимо дисплея-донора, из ценника, скорее всего, можно сделать RF-приёмник, потребляющий единицы микроампер и работающий на частоте 36 кГц.

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

@dyamirana

Copy link
Copy Markdown
Дашбордimage
Поделюсь своими наработками по RFX4, может кому пригодится. Собрал автоматический стенд: ESP32 формирует FSK-сигнал и подаёт на TEST, логический анализатор смотрит S8 и шину дисплея, а веб-дашборд гоняет кампании мутаций и сам определяет, принял ценник кадр или нет. Такой стенд реально работает: приём/отказ ловится автоматически по восстановлению экрана, так что можно прогонять сотни вариантов без ручного труда. Подтверждаю то, что уже звучало: вход TEST, S8 просыпается от ~600 мс преамбула, экран снимается по 3-wire 9-bit SPI (пиксели идут только из записей 0x2A/0x2C, двусторонние фазы это опрос статуса, их надо просто пропускать).

Что удалось вытащить про сам РЧ-кадр (захват с S2048, посылка 1980 символов):

Модуляция FSK, 600 бод, частоты ~37.8 и ~34.2 кГц, центр ~36 кГц, девиация ±1.8 кГц. Не QPSK. «Плавание» частоты на дампах это и есть девиация.
Линейный код импульсно-интервальный, поверх тактовой подложки 01. Бит несёт длина паузы между импульсами: 1 символ против 3, порог на 2. Не Манчестер.
Структура кадра: преамбул 324 символа, затем блок 108 символов, повторённый ровно 12 раз (мажоритарная защита важного поля), затем трейлер 360.
Универсальная единица данных это ячейка 27 символов. Полезная нагрузка блока это одна такая ячейка на смещениях 81–107, всё остальное синхронизация.
CRC на хвосте. Несущее поле трейлера это символы 1702–1857, оно обрывается ровно на 1857, дальше избыточный постамбул. Последние 8 символов это замыкающий CRC, ровно там, где патент WO2013072718A1 (того же производителя) кладёт контрольную сумму.
Про валидатор: это не простая контрольная сумма, одиночный флип символа всегда проходит. Поведение «один всплеск помех до 5 символов терпим, любой второй фатален» это следствие порогового квантования пауз, а не отдельного правила.

Где стена. По одному кадру нельзя однозначно перевести паузы в биты, восстановить полином CRC и семантику полей: нет известного эталона для привязки полярности и порядка бит. Дисплей эталон не даёт, порча адреса ведёт к отказу, а не к показу другого адреса.

Что реально сдвинет дело: захват заведомо другой посылки с того же S2048. Идеально нажатие EAN или адресация другого ценника. Сравнение двух кадров привяжет битовую сетку к известному изменению, и вот тогда CRC считается и можно синтезировать свою команду. Если у кого-то есть такой дамп (@dmg244, вроде записывал нажатия EAN), скиньте сырьё, приложу к своим и разберу поля.

@dmg244

dmg244 commented Sep 17, 2026

Copy link
Copy Markdown

Где стена. По одному кадру нельзя однозначно перевести паузы в биты, восстановить полином CRC и семантику полей: нет известного эталона для привязки полярности и порядка бит. Дисплей эталон не даёт, порча адреса ведёт к отказу, а не к показу другого адреса.

Что реально сдвинет дело: захват заведомо другой посылки с того же S2048.

@dyamirana абсолютно с вами согласен! Поэтому и прошу поискать хоть какую-то информацию сообщество, вдруг кому повезет. В моем первом дампе нажатие EAN и снято, два раза.

Пока выяснил что если зажать ESC + питание он переходит видимо в какой то режим сброса.

Фото IMG_20260917_161356

Отпускаешь ESC и следующий экран:
IMG_20260917_161325

Крэдл для него у меня есть, он оканчивается DB9 разъемом видимо для COM порта. Можно поробовать копать в сторону сброса через него. Хотя софт бы все решил думаю, там наверняка есть пункт установки/сброса пароля.

И еще, посылки он выдает по нажатию 4-х кнопок: EAN Ctl D1 D2. Раньше я думал что они все одинаковые, но теперь закралось сомнение. Давайте я сниму последовательно все четыре кнопки тогда для вас?

@dyamirana

Copy link
Copy Markdown

Кстати сам приборчик то очень похож на приборы от zebex
Например

Zebex Z-2030 image
Zebex Z-2121 image
Zebex PDL 20 image

Явно они делали для сеса.
Но может от них как-то софт или инструкции помогут...

Еще бы найти эти книжки...

Книжки image

@bttrem

bttrem commented Sep 17, 2026

Copy link
Copy Markdown
Author

Поэтому и прошу поискать хоть какую-то информацию сообщество, вдруг кому повезет

@dmg244 скачал в телеге, уже не могу найти где. SES_Portable_S2048_и_JEEGY_результаты_глубокого_технического_поиска. Посмотрите на 16 странице "Самый информативный набор экспериментов с живым S2048", может поможет

@dmg244

dmg244 commented Sep 17, 2026

Copy link
Copy Markdown

@bttrem спасибо, гляну!

Я вот что еще подумал, ценники все с разряженными батареями. По моим прикидкам где-то 4 года со снятия с эксплуатации они валялись до продажи (могу почти со 100% увереностью это предположить), у всех ADRESSE 0000 может им надо как то адрес программировать после замены батареи (раз в 5 лет)???? При таком массовом производстве врядли их шили с завода. А для этого явно штрих код с наклейки на нем надо сканировать и скорей всего терминалом этим. Я только пока не пойму что может значить YES.

@dyamirana а от этих моделей книжки не попадались?

@dyamirana

Copy link
Copy Markdown

@dmg244
https://fccid.io/JNF-Z-2121/User-Manual/user-manual-1222834
Но скорее всего сесовцы кастомный софт залили и мало чем поможет...

@dmg244

dmg244 commented Sep 17, 2026

Copy link
Copy Markdown

Пока писал еще подумал, покрутил ценник, и на каждом сбоку штрихкод и 6 цифр. Шесть цифр надо вводить в терминале CODE+ENTER.... Совпадение?

@dyamirana

Copy link
Copy Markdown

@dmg244
Вполне вероятно что это еще и внесение в базу через комп. Может посмотреть че там он еще в ком порт срет в этот момент на компе?

@Nednik2

Nednik2 commented Sep 17, 2026

Copy link
Copy Markdown

Немного работы с нейронкой и анализом

Details # SES S2048 / G-Tag 6 — сжатые результаты

Ценник SES G-Tag 6, терминал S2048 (поколение X3). Всё проверено на железе.

Радио (проверено на ценнике)

Параметр Значение
Модуляция 2-FSK без разрыва фазы (CPFSK), h=6
Скорость 600 бод
Верхний тон «1» 37 800 Гц = 63 периода/символ
Нижний тон «0» 34 200 Гц = 57 периодов/символ
Центр / девиация 36 000 Гц / ±1 800 Гц
Канал односторонний (ПК→ценник)
Приём окна ~0,52 мс каждые ~570 мс; пробуждение по наличию сигнала
Валидность FEC+CRC радиочипа; одиночные ошибки чинятся, свой пакет брутом не собрать

SPI: параметры и пины

Параметр Значение
Режим CPOL=0, CPHA=1, CS активный высокий, MSB first, 8 бит/CS
Обмен 1 байт на CS; ответ на чтение — в следующем кадре; запись → инверсное эхо
Мастер / слейв МК (U1) master / радио (U2) slave
Линия Роль Pico Вывод RDC2
s2 CLK GP8 pin 11 CH0
s3 MOSI (МК→радио) GP6 pin 9 CH1
s6 MISO (радио→МК) GP7 pin 10 CH2
s4 CS (акт. высокий) GP9 pin 12 CH3
s9 окно/wake (не data-ready) GP10 pin 14 CH4
s5 строб ~55 мкс после кадра — — CH5
s8 enable сессии — — CH6
GND земля GND pin 3/8/13 GND
— FSK-выход Pico GP2 pin 4 (CH5 опц.)

Эфирный кадр (1980 бит)

Смещение бит Кусок Назначение
0…324 преамбула 1010… несущая/AGC
324…1618 12 блоков ×108 бит (идентичны) будилка + синхра (повтор под окна)
1618…1980 данные 362 бита полезная нагрузка → 11 байт

Блок 108 бит = [будилка 81 бит] + [синхра 25 бит 0101010100110000011111101] + [00].
Данные (362 бита) → радиочип → 11 байт. Порча блока переживается (избыточность);
порча данных ломает декод.

Данные 362 бита → байты (локализация)

Биты Эффект порчи Смысл
1…135 ошибка 0F=40 защищённый заголовок (адрес/длина/CRC)
136…243 линейно укорачивает вывод тело payload (~2 байта на 27-бит блок)
244…351 CRC/избыточность хвост

Регистры SPI (радиочип)

Рег Дост. Значения Смысл
0x10 W 18 init при старте
0x0F R 10приём / 04готово / 00idle / 40,44ошибка статус
0x0E R 11 длина
0x0D R 11 байт RXDATA
0x03 W/R FIFO 4 байта самотест 21 43 65 87; после приёма FD FF 0F
0x20 R 07 опрос «жив»

Парсинг SPI-кадра

байт команды:  b7=1 команда | b6=1 чтение,0 запись | b5..0 = адрес
чтение:  кадр N = команда, кадр N+1 (MISO) = значение
запись:  кадр N = команда (эхо ~cmd), кадр N+1 = данные (эхо ~data)
Пример MOSI Разбор
E0 = 1110 0000 R 0x20 (жив)
CF = 1100 1111 R 0x0F (статус)
CD = 1100 1101 R 0x0D (данные)
90 = 1001 0000 W 0x10, далее байт данных

Раскодированный пакет (Wakeup)

04 00 3B 21 93 A2 72 22 A1 11 0D
 │  │  └────────── контент (байты 2..10) ──────────┘
 │  └ флаг статуса (00 ок; 01/FF при обрыве)
 └ тип

R 0E=0x11. Адреса 0000/DFFFF в байтах нет — радиочип снимает адрес и CRC сам.

Последовательность приёма

W10=18 → R20=07 → R0F=10 (приём) → …окна s9… → R0F=04 → R0E=11 → R0D×11 → W03=FD FF 0F

Поломанная передача: init + R0F=10, но 04 не наступает, МК ретраит.

@Mantridru

Mantridru commented Sep 27, 2026 •

Copy link
Copy Markdown

Во, наконец-то пробился, а то никак аккаунт создать не удавалось. Буквально на минуту, закинуть свою полезную информацию по сабжу. Информация "аппаратного" толка: рабочая схема подключения индикатора отдельно от основной платы с сохранением заявленного в шапке тока потребления на уровне 15 мкА:

Моя схема ses5 Кварц можно взять тот же, с платы ярлыка, я поставил обычный "часовой", на 32768 Гц. Генератор на транзисторе в режиме микротоков вполне обеспечивает работу индикатора, не увеличивая общий ток потребления - нет необходимости заводить откуда-то тактовый сигнал. Все это дело работало с обычным ESP32-WROOM и кодом от уважаемого **kohnorsob-source**, приведенного ранее в этой ветке. Итого: индикатор с собственным генератором, на отдельной плате, с собственной баратейкой CR2032 и потреблением 15 мкА может получать и сохранять в статике изображения, получаемые от ESP32, на который то подается питание, то снимается целиком. Удачная концепуия, я считаю, хотя с внешним RESETом там быоо не все благополучно, поэтому схему сброса пришлось усложнить по результататм экспериментов.
Details

@Mantridru

Mantridru commented Sep 27, 2026 •

Copy link
Copy Markdown
И еще чуть картинок: 444 ses_new (2) ses4_sample
Шлейф индикатора можно аккуратно оторвать от платы ценника, он хоть и приклеен, но имеет медную основу, которую при хорошем владении искусстовом пайки можно просто припаять на свою плату, что и было сделано.

@bttrem

bttrem commented Sep 28, 2026

Copy link
Copy Markdown
Author

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

@Mantridru

Mantridru commented Sep 28, 2026 •

Copy link
Copy Markdown
Предметное графоманство по вопросу Благодарю на добром слове :) Плату специально ваял под "лазерный утюг" с дорожками 0.25мм. Можно сделать вручную, но нужна все же набитая рука: при перегреве термотрансфертной бумаги дорожки "расползаютсся" и шаг почти сбивается с положенных 0.5 мм, как в моем случае. Могу сделать gerber-файл, желающие смогут заказать платы в Китае, например. Думаю на эту тему для себя: заказать штучек двадцать плат и распаять на них половину ярлыков. Но вот в чем затык: КУЧА свободного места пропадет за мои же деньги! Поэтому сейчас раздумываю, что бы еще туда напихать сразу: микроконтроллер какой, тот же ESP32 (то, что под железной крышечкой спрятано, две-три микросхемы ) или ATMегу в QFN-корпусе... Останавливает только то, что пока не хватет фантазии, куда такой чудо-индикатор можно вообще применить. "Зумеры придумали пейджер" (с), это я о "мешастике". Можно туда бы прицпить, сделав вполне себе серьезный мешастиковый пейджер: передал-принял, заснул, а индикатор пришедшее сообщение пять лет показывает от батарейки. Часы? Банально, хотя вот если "онемэ" напихать в часы, то даже где-то креативненько. Раз в минуту проснулся контроллер, считал время из RTC, закинул на экранчик с каким-нибудь хентаем вперемешку, уснул опять. Короче, пока в раздумьях. А плату наваять можно под задачу. Про диоды - все верно: универсальное решение для 3- и 5-вольтовых схем, без лишних наворотов. ВНЕЗАПНО: защитные диоды каким-то образом позволили уменьшить ток покоя до номинала, 15 мкА. Без них было 60 мкА... Ну и с RESETом не все гладко, если питать индикатор от своей батареи: уровень внешнего RESETа должен быть больше чем напряжение батарейки плюс прямое падение на диоде, то есть, вольта четыре. Во всех других реализациях RESETа, как например прочих входов, ток потребления уже 100 мкА :( Касаемо сайта - увы и ах, есть свои ограничения, поэтому все как Вы сказали, поэтому пишу здесь параллельно, вношу свои скромные пять копеек в общий труд. Мне интересен был только индикатор: приемник на 36 кГц будет весьма ущербным, даже если удастся его оживить. Да и смысла в нем, с неясной системой команд? Почему-то кажется, что там MSC-51, есть такое ощущение.
Details

@dmg244

dmg244 commented Sep 28, 2026

Copy link
Copy Markdown

@Mantridru

З.Ы.: а где тут спойлер делается? Графоманство свое спрятать под кат. :)

тут
и и под полем ответа ниже кнопочка Markdown is supported

36кГц изначально хотелось что бы ничего не трогать, батарейку заменил, один раз передатчик сваял, а не сотню ценников перепаивать. Свои команды конечно лучше будут.
Насчет универсальности, выскажу свои мысли: если оставлять родной корпус и самому на заводе у китайцев заказывать платки, то что-то типа основания нужно делать, на котором будет компактно обвязка дисплея и контакты питания с другой стороны припаяны. Как на родной плате. От дисплея и питания контактные площадки. В центре по максиму квадратный вырез, в него свою плату, хоть какую потом изготовить можно и вставить. Т.е. конструкция по типу рамки, на которой обвязка дисплея и контакты батарейки и внутреннего модуля. Платка там крошечная 33 см примерно, в одной заготовке от $1 от китайцев 1010см влезет 9шт. в партии 5 заготовок получим 45шт. Можно даже сборку обвязки заказать у китайцев (0306 или меньше по размеру), а самому дисплей и контакты пересадить. Это если родной корпус и универсальную.

Моя офигенная идея 1

@Mantridru

Copy link
Copy Markdown

тут
Благодарствуйте. Графоманство спрятал.
Насчет родного корпуса ничего не скажу, я не рассматриваю ценник в его оригинальной ипостаси или в виде "магнитиков на холодильник" ( "хорошая попытка, Сатана, но нет!" (с) ). Хотя бы потому что петлю индкутивную вокруг холодильника натягивать надо по полу, и мощности туда вкачать несколько ватт, ибо эта самая мощность от петли к антенне будет падать по квадрату расстояния, и что там выйдет по итогу (с крошечной магнитной антеннкой на металлической стенке холодильника), я сказать не берусь.
Поэтому я и не рассматриваю приемник, мне любопытен только индикатор.
В офигенной идее, если я ее правильно понял, вы дружно выбросили за борт десятка два обязательных деталей, тех же конденсаторов и пары диодов, которые обеспечивают работу самого индикатора. Но - алаверды - такю платку можно нарисовать, даже с дырочкой посередине. Вопрос только, зачем. Готовых идей ведь нет, я правильно понял?

@bttrem

bttrem commented Sep 28, 2026

Copy link
Copy Markdown
Author

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

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

@Mantridru

Copy link
Copy Markdown

ESP32 все-таки в эту дырочку просится. Но я его предметно не изучал, может ли он в каком-то там режиме от батарейки трехвольтовой работать без риска ее просадить в нголь или нет. Спящий режим, вроде, есть. А вот есть ли прерывания по WiFi или BLE - не в курсе, не программист. Если есть, то берем какую-нибудь самую мелкую реализацию ESP32, вписываем в платку, пишем говнокод и - вуаля! Тот же ярлык, но под кторый уже можно писать самостоятельно и без извращений, а засылать инфу на него хоть с вайфая, хоть с блютуса. И опять упираемся в ИДЕЮ: а что засылать-то, собственно?

@Mantridru

Mantridru commented Sep 28, 2026 •

Copy link
Copy Markdown

Необязательно, можно просто соединить антенный вход проводом,

Ну, это мы тогда 1-wire для себя откроем: уж тогда и питать по этому проводу сразу, а то глупо получится. Но надо ли?
З.Ы.: хочется странного: готовую библиотеку под АТМегу. Но не осилю. Если кто-то сделает - киньте ссылкой, камрады!

@bttrem

bttrem commented Sep 28, 2026

Copy link
Copy Markdown
Author

хочется странного: готовую библиотеку под АТМегу

Пора закопать стюардессу). А если серьезно, используйте нейросеть и меняйте код подо что угодно(ну почти)

@Mantridru

Mantridru commented Sep 28, 2026 •

Copy link
Copy Markdown

В моем случае сразу же можно выкапывать стюардессу обратно: нахлебался я уже с этими "нейросетями". Как-то посоветовали Kimi. Ну я возьми да и поведись на чудо-сеть: а наваяй-ка ты мне, родной(-ая, -ое) либу для управления хитрым индикатором TIC32UN. Кimi в ответ: "... да лех-хко! Как два пальца!.."
В итоге я потратил три дня, кучу нервов и атмег, чтобы в результате услышать что-то вроде "ну, не шмогла я, не шмогла...". Тьфу, время на ветер :( Оказалось, что хваленая big data - то еще фуфло: оперирует только с полными наборами данных, а про индикатору-то их и не было. И вот эта ваша "нейросеть" втирала мне дичь три дня и "не ответила за базар". Так что нет, спасибо: только ханд-маде!

@dmg244

dmg244 commented Sep 28, 2026

Copy link
Copy Markdown

Нейросеть мозг не заменит (пока во всяком случае), посоветоваься (бывает такое выдает о чем бы сам никогда не подумал), что-то перепроверить... А насчет того что выкинул все, вы невнимательно прочитали, я предлагал обвязку китайцам заказать на аппарате распаять, самую мелкую что будет включая часовой кварц (ну не художник я вырисовывать это). Уних там помоему акция даже была, за первый заказ бесплатно распаяют, а деталюшек там на копейку всего (самые мелки smd кондеры диоды). Итого 45шт. плат, ну выйдет что-то в районе ~$10/45=25руб. И ненадо самому морочится мелочь паять. Будет что-то типа сим карточек телефонных: SIM<=>миниSIM<=>наноSIM. SIM это плата c экраном и держателем батарейки, а наноSIM любое ядро, хоть STM, хоть ESP, хоть NRf, хоть мега. Что хочешь то и лепи, причем также можно заказать партию. Поменялась технология, выкинул, новое вставил (еще мельче, паяльником ткнул по точкам, зафиксировал и в корпус - дешево и сердито). А экран и батарейка корпус стандартные остались, на века... Думаю и отдельно можно плату с экраном использовать, по сути то-же что и сейчас делают с родной. Или сделать внутри платку под шлейф (или любой разъем) а контакты батареи не запаивать, и все.

@Mantridru

Copy link
Copy Markdown

Ну, как вариант, если с китайцами дружите... Я как-то не очень. Все это не отменяет главного вопроса: куда применить индикатор, что на него выводить? :)

@dmg244

dmg244 commented Sep 28, 2026

Copy link
Copy Markdown

Ну раньше все дружили, теперь кто как... Там из дружбы то было герберы загрузить из ___CAD и список деталей. Ну и оплатить. А вот что выводить вопрос конечно. Я думал как информер умного дома, например погода на зеркале в ванной. У выходной двери предупреждения какие-то, например выключи утюг/свет, выходишь глянул. А что еще с ним сделать? Вся фишка в экономном показе информации, которая редко меняется, с отвязкой от проводов (поставил/приклеил/примагнитил, перенес). Ну можно с собой носить, добавить список сетей wifi (дом, работа, смартфон раздающий интернет) и что-то на него выводить из дома умного (поставить пищалку, пару кнопок (сенсоров), в памяти хранить погоду/сообщения и т.д. По сути пейджер и есть. Хотя сейчас все это смартфон заменяет. Тот же мештастик батарею выжрет, да и антенна нужна ему не плохая. Так что только прием и хранение с выводом по запросу. А технология wifi/lora/zigbee/.....

@dmg244

dmg244 commented Sep 28, 2026

Copy link
Copy Markdown

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

@Mantridru

Copy link
Copy Markdown

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

Ну, разве что. Поэтому я и говорю: индикаторы есть, а идей их применения - нет. Выйду с больничного, гляну на село -... То есть, в недалеком будущем поизучаю динамические характеристики экрана. Камрад писал в шапке, что до трехсот килогерц почти "разогнать" его можно, только мерцает. Вот и проверю, как да что. А заодно токи гляну, насколько подрастут. Тогда хоть в своих поделках применять можно будет, где информация обновляется доволно часто. Ну и исходный, микротоковый режим нието не отменял, особенно при каскадировании нескольких экранов в одну панель, как, опять же, было написано и сфоткано в начале темы.

@remontups

Copy link
Copy Markdown

Такие тоже взял 200 шт. И 50 из этой темы. Только я далек от написания библиотек. Максимум могу повторить чей то проект.

andrei-tatar/imagotag-hack#3

@kohnorsob-source

kohnorsob-source commented Oct 1, 2026 •

Copy link
Copy Markdown
Простите за оффтоп, плата лазерным гравером, может кому пригодится 1

Сверхбыстрая домашняя технология изготовления двусторонних плат (5 часов от схемы до железа)

Метод полностью построен на автоматизации с помощью лазерного гравера. Исключает капризы ЛУТа и дороговизну фоторезиста. Позволяет дома делать микроуровень (платы 23×39 мм под корпуса с шагом ножек вроде PUYA). Доля ручной работы — только пайка виасов.

🛠 Необходимый минимум (Бюджет ~8-9 тыс. руб.):

  • Самый простой диодный лазерный гравер (за ~7000 руб.) и ПО LightBurn.
  • Свежая черная матовая акриловая краска (автоэмаль KUDO, ~400 руб.). Важно: именно свежая! Пересохшая покроется микропорами и пропустит раствор, дорожки отвалятся при травлении.
  • Текстолит, жидкое олово (~350 руб.), хлорное железо, изопропиловый спирт, канцелярский нож и паяльник.

📋 Пошаговый техпроцесс:

  1. Подготовка: Обезжириваем двойной текстолит, наносим свежий матовый акрил KUDO с двух сторон с промежуточной сушкой.
  2. Базовая калибровка: Скотчем крепим деревянную подложку (жертвенный стол) на гравере. Экспортируем слои из EasyEDA в ЧБ контуры через Photoshop. По краям платы закладываем 4 реперных кружка (0.5 мм).
  3. Первое сверление: Прожигаем лазером реперные точки на голом акриле. Сверлим отверстия 0.35 мм (с рассверловкой до 0.5–0.6 мм) прямо в деревянную подложку. Сверлить нужно строго до прожига дорожек, чтобы не порвать медь.
  4. Выжигание верхнего слоя: Лазер счищает краску там где нет дорожек.
  5. Прецизионный переворот (Секрет центровки): Переворачиваем плату. Вгоняем в отверстия деревянной подложки обломки тонких швейных иголок. Сажаем плату обратной стороной на эти штифты. Фиксируем малярным скотчем, убираем иголки и прожигаем нижний слой. Смещение — доли мм. Для компенсации люфтов станка виасы закладываются 1 мм — так их и паять удобнее.
  6. Травление с промежуточной смывкой: Смываем нагар изопропилом. Травим в горячем хлорном железе. Секрет: как только плата чуть протравилась, достаем и под струей воды смываем темную поволоку (шлам), иначе она затормозит процесс и вызовет подтравы. Дотравливаем, промываем и обрезаем плату ножом.
  7. Пайка виасов: Прошиваем отверстия тонкой медной жилкой «змейкой». Пропаиваем с одной стороны с каплей флюса. С обратной стороны срезаем петли бокорезами-заподлицо (flush cutters) и прогреваем плоским жалом. Излишки припоя под брюхом чипа аккуратно подрезаем дремелем, чтобы микросхема легла ровно.
  8. Химическое лужение «на мокрую»: Опускаем плату в жидкое олово на минуту. Достаем и шлифуем влажной ватой с раствором — олово уплотняется, дорожки становятся зеркально-блестящими. Остатки раствора сливаем обратно в банку для экономии.
  9. Финиш: Покрываем плату флюс-гелем от окисления. На выходе — идеальная заводская эстетика.

Для перфекционистов: сверху можно повторно нанести краску KUDO и лазером выжечь инверсную шелкографию (до слоя блестящего олова).

Другая готовая плата (правда на этапе разработки были допущены ошибки :) )
2

@kohnorsob-source

Copy link
Copy Markdown
Эксперименты по ультра-низкому потреблению LCD-дисплея от ценников SES-imagotag (G-tag)

Приветствую всех причастных к реверс-инжинирингу и хардкорной схемотехнике!

Хочу поделиться результатами своих экспериментов по переводу графического LCD-дисплея от розничных ценников SES-imagotag в режим экстремального энергосбережения (Ultra-Low-Power).

Введение: зачем нужен внешний тактовый генератор?

При создании автономных устройств далеко не каждый микроконтроллер (МК) умеет генерировать тактовую частоту в глубоких режимах сна (Deep Sleep / STOP). Использование кастомного внешнего генератора решает три задачи разом:

  1. Позволяет полностью усыплять МК, не тратя драгоценные микроамперы на тактирование.
  2. Обеспечивает дисплею полную автономность.
  3. Избавляет от необходимости тянуть лишнюю линию тактирования от контроллера к экрану.

Шаг 1. Модификация «по живому» (Дремель-стайл)

Изначально на плате ценника установлены два чипа управления. Обычное перерезание дорожек или отключение питания оригинального чипсета проблему не решает: на плате остаются жуткие паразитные утечки тока вплоть до 7 мА.

Решение было радикальным: я взял дремель и физически высверлил обе родные микросхемы прямо до текстолита:

Удаление родных чипов дремелем

А подключаться можно прямо к пятакам без всяких разрезаний дорожек (главное не переусердствовать, под компаундом идет линия тактирования к S1).
6

Результат: После механического удаления чипов чистое потребление голого дисплея при тактировании от МК составило всего 2.5 мкА с периодическими бросками до 7 мкА (когда внутренние емкости матрицы перезаряжаются). Среднее потребление установилось на уровне ~4–5 мкА, что для графического LCD является великолепным результатом.


Шаг 2. Разработка внешнего тактового генератора

По рекомендациям я собрал RC-генератор на инверторе с триггером Шмитта 74HC14 (корпус SOIC-14). Использовал схему на двух последовательных каскадах для обеспечения надежного запуска. Номиналы времязадающей цепи: 16 пФ и 2 МОм (два резистора по 1 МОм последовательно).

Схема RC-генератора Готовая плата генератора SMD

Точную частоту замерить пока нечем (нет частотомера), но расчетная математическая частота с учетом паразитной емкости монтажа составляет в районе 25–35 кГц. Дисплей успешно завелся и выдал картинку.

Борьба за микроамперы:

В чистом виде этот генератор при питании от 3.3В начал дико жрать — порядка 75 мкА (из-за сквозных токов КМОП-структуры при медленных фронтах мегаомной RC-цепи). Чтобы принудительно задушить сквозной ток, я начал ставить резисторы в разрыв линии питания VCC самой микросхемы 74HC14:

  • Резистор 20 кОм: потребление упало до 32 мкА.
  • Резистор 100 кОм: потребление снизилось до 15 мкА, при этом напряжение на самом чипе генератора просело до 2.1 В.

В чем опасность: По даташиту нижний предел питания для серии 74HC составляет строго 2.0 В. У меня на руках запас всего в 0.1В. Если питать устройство от Li-ion аккумулятора через LDO-стабилизатор 3.3В, то при разряде батареи до нижних 3.0В стабилизатор просядет, напряжение на чипе упадет ниже 2.0В, и генерация сорвется. Однако практические тесты показали, что чип сохраняет живучесть: при впаивании резистора 200 кОм генератор продолжил стабильно молотить даже на 1.8 В.


Шаг 3. Тест готового кварцевого генератора

В качестве альтернативы я попробовал специализированный малогабаритный генератор YSO120TK на 32.768 кГц:

Генератор YSO120TK

Вердикт: Полная ерунда для Low-Power устройств. Мало того, что он дорогой (около 85 руб/шт), так он еще и стабильно жрет 115 мкА, и никакими внешними резисторами по питанию его аппетит урезать невозможно. Вычеркиваем.


Интересное наблюдение о частоте LCD

Дисплей оказался крайне всеяден к частоте тактирования. Ради эксперимента я опустил частоту ШИМ от МК до 1200 Гц. При этом дисплей стал «тупить»: инициализируется и грузится около 15 секунд, а сама картинка плавно прорисовывается за 3 секунды. Но потребление тока при этом падает настолько, что его не берут мои приборы — меньше 1 мкА! Идеальный задел для создания «вечных» девайсов, где скорость обновления не критична.


Текущий статус проекта и кастомная плата PUYA

Моя цель — добиться честной автономности устройства на уровне оригинальных ценников (чтобы работало годами от одной батарейки). Для этого я разработал и собрал собственную отладочную плату на базе микроконтроллера PUYA (PY32F030K18T6):

Кастомная плата на PUYA

Результаты замеров платы:

  • Режим глубокого сна (Deep Sleep): 5 мкА
  • Рабочий режим (Run): 500 мкА

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

Заключение и призыв к обсуждению

На данный момент мне удалось получить полностью автономный дисплей с общим потреблением 17 мкА (генератор + экран).

Сейчас жду посылку с Алиэкспресс с компонентами, чтобы попробовать собрать генератор Пирса по схеме от уважаемого Mantridru.

Поскольку в глубокой схемотехнике я не считаю себя профи, буду крайне благодарен за идеи и готовые схемы низкожрущих генераторов на 32 кГц, способных стабильно выдавать ток потребления меньше 15 мкА напрямую от 3.3В без костылей по питанию. Присоединяйтесь к обсуждению!

@bttrem

bttrem commented Oct 6, 2026

Copy link
Copy Markdown
Author

@kohnorsob-source а если по классике, генератор на инверторе. Внутри штатного микроконтроллера наверняка что-то подобное. Одиночные инверторы КМОП в 5-TSOP мелкие и недорогие, остальное с донора

@Mantridru

Mantridru commented Oct 7, 2026 •

Copy link
Copy Markdown

Поскольку в глубокой схемотехнике я не считаю себя профи, буду крайне благодарен за идеи и готовые схемы низкожрущих генераторов на 32 кГц, способных стабильно выдавать ток потребления меньше 15 мкА напрямую от 3.3В без костылей по питанию. Присоединяйтесь к обсуждению!

Details Дак это, камрад, уж проще генератора, чем я подсмотрел и реализовал, не придумаете точно ;) Как минимум для 15 мкА. Да и что там за генератор? Смех один. Банальнейший n-p-n транзистор BC847 (маркировка на кропусе 1G или 1Gw), желательно с "бетой" от 200 и выше, для экспериментов можно заменить нашим КТ3102Б, Г (БМ, ГМ). Кварц "часовой", 32768 Гц, выпаивается с любой старой материнки - цилиндрик 2х6 мм и две тонкие ножки сбоку. Можно поподбирать резистор в базовой цепи (3.6...4.7МОм). И все, собственно, вот Вам 15 мкА ВМЕСТЕ с индикатором :) Меня сейчас гложет мысль о том, чтобы кварц в таком же размере найти на 150...200 кГц, и я даже знаю, где, но пока я на больничном, а стенд на работе остался :( Кстати, если совсем заморочитесь, то меня можно переплюнуть: дорогущая LTC6906 Вам поможет ;) Больше ничего достойного я не нашел из схем с микротоками. А логику, даже КМОП, я даже не рассматривал. У них и в статике ток десятки микроампер, без всяких импульсов. Можно, конечно, "зарезать" ее последовательный разистором, но тогда не гарантируется, например, температурный диапазон. Транзисторный генератор с кварцем объективно выигрывает по простоте и доступности.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment