
Самодельный кассовый аппарат – это не только способ сэкономить на покупке промышленного оборудования, но и возможность адаптировать устройство под специфические задачи малого бизнеса или личного использования. В основе конструкции лежат микроконтроллеры ESP32 или Raspberry Pi Pico, которые обеспечивают необходимую производительность при минимальных затратах. Для печати чеков подойдет термопринтер ZJ-5890K с интерфейсом USB или UART, а в качестве дисплея – 16×2 LCD с I2C-модулем или OLED-экран на 0,96 дюйма. Важно сразу определиться с протоколом обмена данными: для локального хранения подойдет SQLite, а для облачной синхронизации – Firebase или MQTT.
Ключевые компоненты сборки включают блок питания на 5V/2A, который обеспечит стабильную работу устройства, и корпус из фанеры или пластика толщиной 3–5 мм, вырезанный лазером или фрезером. Для ввода данных потребуется мембранная клавиатура 4×4 или сенсорный экран ILI9341 с разрешением 320×240 пикселей. Если планируется работа с фискальным накопителем, необходимо учесть требования законодательства: в России для этого подойдет модуль ФН-1 с интерфейсом USB или RS-232. Без него устройство не сможет легально регистрировать продажи.
Программная часть строится на базе Arduino IDE или PlatformIO с использованием библиотек LiquidCrystal_I2C для дисплея, Adafruit Thermal для принтера и ESPAsyncWebServer для создания веб-интерфейса. Для обработки платежей можно интегрировать модуль QR-кодов через библиотеку QRCode или подключить NFC-ридер PN532 для бесконтактных карт. При сборке особое внимание уделите пайке контактов: используйте паяльную станцию с регулировкой температуры 250–300°C и флюс на основе канифоли. Некачественные соединения приведут к сбоям в работе устройства.
Первый этап тестирования – проверка работы принтера: отправьте тестовый чек с текстом и штрих-кодом в формате Code 128. Далее настройте взаимодействие с базой данных: создайте таблицу sales с полями id, product_name, price, timestamp и payment_method. Для защиты от сбоев добавьте функцию автосохранения данных каждые 5 минут. Если устройство будет работать в сети, обеспечьте шифрование трафика с помощью TLS и ограничьте доступ по MAC-адресу.
Выбор компонентов для базовой электронной схемы

Микроконтроллер – основа схемы. Для самодельного кассового аппарата подойдет STM32F103C8T6 (Blue Pill) или ATmega328P (Arduino Nano). STM32 обеспечивает тактовую частоту до 72 МГц, 64 КБ Flash-памяти и поддержку USB, что критично для связи с фискальным накопителем. ATmega328P дешевле, но требует внешнего модуля для работы с USB (например, CH340G) и ограничен 16 МГц. Оба варианта поддерживают UART, SPI и I2C – необходимые интерфейсы для подключения дисплея, клавиатуры и принтера.
Дисплей выбирайте с учетом разрешения и интерфейса. Для базовой модели достаточно монохромного OLED-экрана SSD1306 (128×64 пикселя, I2C) или TFT-дисплея ILI9341 (320×240, SPI). OLED потребляет меньше энергии и не требует подсветки, но TFT ярче и поддерживает цвет. Обязательно проверьте наличие библиотек для выбранного микроконтроллера: для STM32 с SSD1306 работают библиотеки U8g2 или Adafruit SSD1306, для ATmega328P – U8glib. Избегайте дисплеев с контроллерами ST7735 или ST7789 без аппаратной поддержки SPI – они замедляют работу системы.
Для ввода данных используйте матричную клавиатуру 4×4 (например, Keypad 4×4) или механические кнопки с подтягивающими резисторами. Матричная клавиатура экономит пины микроконтроллера (требует 8 GPIO), но механические кнопки надежнее при интенсивном использовании. Принтер выбирайте термопечатающий с интерфейсом UART или USB: модели ZJ-5804 или CSN-A2 совместимы с библиотеками EscPos и поддерживают шрифты 24×24 пикселя. Для хранения данных подключите microSD-модуль с логическим уровнем 3.3 В (например, Catalex MicroSD) – он работает через SPI и не требует дополнительных преобразователей напряжения.
Подключение дисплея и клавиатуры к микроконтроллеру

Матричные клавиатуры 4×4 (например, мембранные модули) подключаются через резистивный делитель или сдвиговый регистр. Для прямого подключения к Arduino задействуйте 8 пинов: 4 строки и 4 столбца. Используйте библиотеку Keypad, указав конфигурацию: const byte ROWS = 4; const byte COLS = 4;. Подтягивающие резисторы на 10 кОм к строкам предотвратят ложные срабатывания. Опрос клавиатуры проводите в основном цикле с задержкой 50 мс для устранения дребезга контактов.
При работе с графическими дисплеями (OLED SSD1306) применяйте интерфейс I²C. Подключите SCL и SDA к одноимённым пинам микроконтроллера (для Arduino Uno – A5 и A4). Библиотека Adafruit_SSD1306 требует дополнительной зависимости Adafruit_GFX. Инициализируйте дисплей с разрешением 128×64: Adafruit_SSD1306 display(128, 64, &Wire, -1);. Для снижения энергопотребления отключайте подсветку при простое через пин VCC с помощью транзистора.
Если клавиатура и дисплей используют общие шины (например, I²C), добавьте подтягивающие резисторы 4,7 кОм на линии SCL и SDA. При конфликтах адресов измените I²C-адрес дисплея перепайкой резистора на плате (для SSD1306 стандартный адрес – 0x3C). Для клавиатур с аналоговым выходом (например, 1×16) подключите сигнальный пин к АЦП микроконтроллера и калибруйте пороговые значения напряжений в коде.
Проверьте целостность соединений мультиметром в режиме прозвонки перед подачей питания. При нестабильной работе дисплея (мерцание, артефакты) увеличьте ёмкость конденсатора фильтра на линии питания до 100 мкФ. Для клавиатур с механическими кнопками используйте алгоритм подавления дребезга на основе таймера: игнорируйте повторные нажатия в течение 100 мс после первого срабатывания.
Оптимизируйте энергопотребление, переключая дисплей в спящий режим при бездействии. Для HD44780 отправляйте команду 0x08 (выключение дисплея), для SSD1306 – display.ssd1306_command(SSD1306_DISPLAYOFF);. При возобновлении работы восстанавливайте состояние экрана из буфера в ОЗУ. Для клавиатур с подсветкой используйте ШИМ-сигнал на управляющем пине светодиодов, чтобы регулировать яркость.
Настройка программного обеспечения для учета продаж

Выбор ПО зависит от аппаратной платформы кассового аппарата. Для Raspberry Pi подойдет Odoo POS или Unicenta oPOS, для Arduino с экраном – LCD POS на базе библиотек LiquidCrystal и SD. Если сборка основана на ПК, рассмотрите Openbravo POS или Floreant POS. Убедитесь, что выбранное ПО поддерживает работу с фискальным регистратором через протокол ФФД 1.2 (для РФ) или аналогичные стандарты вашей страны.
Установите базу данных. Для большинства open-source решений потребуется PostgreSQL 12+ или MySQL 8.0. Настройте пользователя с правами только на необходимые таблицы (например, pos_sales, products). Пример команды для создания пользователя в PostgreSQL:
CREATE USER pos_user WITH PASSWORD 'secure_password';GRANT SELECT, INSERT, UPDATE ON TABLE pos_sales, products TO pos_user;
Настройте подключение к фискальному накопителю (ФН). В конфигурационном файле укажите параметры COM-порта или USB-драйвера. Для ФН АТОЛ 55Ф используйте библиотеку libfptr10 и задайте параметры:
port=COM3(или/dev/ttyUSB0для Linux)baudrate=115200model=55inn=1234567890(ИНН организации)
Проверьте соединение тестовой командой fptr.open() – в ответ должен вернуться статус 0.
Создайте структуру товаров. В большинстве ПО это делается через импорт CSV-файла с колонками: id, name, price, tax_rate, barcode. Пример минимального файла:
id,name,price,tax_rate,barcode 1,Хлеб,50.00,10,4601234567890 2,Молоко,80.00,10,4609876543210
Для автоматического обновления цен используйте API поставщика или скрипт на Python с библиотекой pandas для парсинга Excel-файлов.
Настройте налоговые ставки. В РФ используйте значения:
- 10% – для продовольственных товаров
- 20% – для остальных
- 0% – для льготных категорий (лекарства, детские товары)
В конфигурации ПО укажите соответствие ставок кодам товаров. Например, в Unicenta oPOS это делается через раздел Taxes → Tax Categories.
Реализуйте резервное копирование данных. Настройте cron-задачу (Linux) или планировщик Windows для ежедневного экспорта базы в файл с именем backup_YYYYMMDD.sql. Пример команды для PostgreSQL:
pg_dump -U pos_user -d pos_db -f /backups/backup_$(date +\%Y\%m\%d).sql
Храните копии на отдельном носителе или в облаке (например, Yandex.Disk с шифрованием). Для восстановления используйте psql -U pos_user -d pos_db -f backup.sql.
Настройте печать чеков. В драйвере принтера (например, Epson TM-T20II) установите параметры:
- Ширина бумаги: 58 мм
- Скорость печати: максимальная
- Кодировка: UTF-8
- Автоотрезка: включена
В ПО укажите путь к принтеру (например, /dev/usb/lp0) и шаблон чека. Минимальный шаблон должен включать:
- Название организации
- ИНН
- Номер чека и дату
- Список товаров с ценами и суммой
- Итоговую сумму и способ оплаты
- QR-код для проверки чека (если требуется законодательством)
Протестируйте систему на реальных данных. Создайте тестовый чек с 3–5 товарами, включая возврат и скидку. Проверьте:

- Корректность расчета налогов (сумма налога должна совпадать с
price * tax_rate / 100). - Передачу данных в ФН (проверьте лог
/var/log/fiscal.log). - Печать чека (текст не должен выходить за границы бумаги).
- Синхронизацию с базой данных (данные о продаже должны появиться в таблице
pos_sales).
При ошибках сверьтесь с документацией ПО и логами. Для Odoo POS логи хранятся в /var/log/odoo/odoo-server.log, для Unicenta – в ~/unicentaopos/logs/.
Создание корпуса и монтаж внутренних элементов

Корпус самодельного кассового аппарата должен выдерживать механические нагрузки и обеспечивать защиту электроники. Оптимальный материал – листовой алюминий толщиной 1,5–2 мм или фанера 10–12 мм с металлическими уголками для усиления. Алюминий легче обрабатывать, но фанера дешевле и проще в резке. Размеры корпуса зависят от габаритов компонентов: стандартный термопринтер (например, ZJ-5890K) требует минимум 150×100×80 мм, а блок питания формата ATX – 150×85×150 мм. Перед резкой составьте чертеж с припусками 5 мм на крепеж и вентиляцию.
Для доступа к внутренним элементам предусмотрите съемную крышку или откидную панель. В алюминиевом корпусе используйте петли с шариковыми подшипниками, в фанерном – рояльные петли. Крышку зафиксируйте винтами-барашками M5 или магнитными защелками. На внутренней стороне крышки закрепите схему подключения компонентов и предупреждающие наклейки о высоком напряжении (например, ISO 7010 W012).
Завершите монтаж проверкой зазоров и крепежа. Убедитесь, что ни один кабель не касается движущихся частей (например, роликов принтера) и не пережимается стенками корпуса. Проведите тестовый запуск с подключенным вольтметром: напряжение на выходах блока питания не должно отклоняться более чем на 5% от номинала (5 В ±0,25 В, 12 В ±0,6 В). При обнаружении вибраций усилите крепление проблемных узлов силиконовыми прокладками или дополнительными стойками.
Тестирование работы аппарата на реальных операциях

Начните с проверки базовых функций: пробития чека на сумму от 1 до 1000 рублей с разными типами оплаты (наличные, карта, QR-код). Зафиксируйте время генерации чека – оно не должно превышать 3 секунд. Если аппарат подключён к фискальному накопителю, убедитесь, что данные передаются в ОФД без задержек: откройте личный кабинет оператора и сверьте время отправки с временем пробития. При ошибках связи проверьте настройки сети (IP, порт, логин/пароль) и перезагрузите накопитель.
Проведите серию из 20–30 операций подряд с интервалом в 5–10 секунд между ними. Следите за температурой процессора и накопителя: при нагреве выше 60°C установите дополнительный радиатор или вентилятор. Если аппарат зависает, проанализируйте логи – чаще всего проблема в нестабильном питании или конфликте библиотек. Для диагностики используйте команду dmesg на Raspberry Pi или аналогичный инструмент для вашей платформы.
Проверьте работу с реальными товарами: внесите в базу 5–7 позиций с разными налоговыми ставками (НДС 20%, 10%, без НДС) и скидками. Пробивайте чеки с комбинациями товаров, включая частичный возврат и аннулирование. Особое внимание уделите корректности расчёта итоговой суммы – ошибки здесь чаще всего возникают из-за неверного округления или неправильно заданных налоговых правил в конфигурационном файле.
Имитируйте сбои: отключите питание во время печати чека, прервите соединение с банковским терминалом, введите некорректные данные (например, отрицательную сумму). Аппарат должен либо завершить операцию корректно, либо выдать понятное сообщение об ошибке с кодом для диагностики. Если фискальный накопитель блокируется после сбоя, потребуется перепрошивка или замена – это сигнал о проблемах с энергонезависимой памятью.
Завершите тестирование проверкой отчётности: сформируйте Z-отчёт и сверьте его с ручным подсчётом выручки. Разница не должна превышать 1 рубль. Если аппарат интегрирован с 1С или другой учётной системой, убедитесь, что данные синхронизируются без дубликатов и расхождений. При обнаружении несоответствий проверьте настройки экспорта (формат CSV/XML, кодировка, разделители) и логи синхронизации.