[Перевод] Analog Redial: доступная для доработки аналоговая телефонная система

Analog Redial превращает старые аналоговые телефоны в небольшую телефонную систему, открытую для доработок. Подключите один или два аппарата — дисковых или кнопочных — и вы получите настоящий гудок, звонок (вызовы между ними), автоответчик и набор коротких сервисных (кодов набора, или диал-кодов), которые делают разные интересные вещи — всё это настраивается через веб-страницу. Система также умеет общаться с Home Assistant, так что код набора может включить свет, или телефон может зазвонить, когда сработает дверной звонок. Добавьте плату Bluetooth — и ваш дисковый телефон станет гарнитурой для сотового телефона!
Всё открыто: аппаратная часть в KiCad, прошивка на ESP-IDF, написанная на C (лицензия MIT), и последовательная консоль для доступа к любой части железа.

Зачем я это построил
Этот проект начался как способ использовать наш жёлтый настенный дисковый телефон, знакомый мне с детства. Один дисковый телефон мог позвонить на другой, и моему ребёнку нравилось с ним играть. Первая версия работала на Raspberry Pi и неплохо справлялась долгие годы, но эта версия на базе ESP32 обладает множеством функций, да ещё и дешевле в сборке.
Почему бы просто не купить VoIP-адаптер? Дело в гибкости и функциях. На устройстве Grandstream (прим. переводчика: Grandstream — производитель VoIP-оборудования, в том числе ATA-адаптеров) нужно набрать *47, а затем адрес другого телефона… И это не самое простое решение. В то же время Analog Redial — это целая телефонная система сама по себе, которую можно улучшать под себя.
Набирайте что угодно
ESP32 видит каждую цифру, которую вы набираете, поэтому любой номер может отвечать за своё. План набора — это просто таблица. Значения по умолчанию:
Номер | Что происходит |
321 | Звонок другому телефону, если эта функция включена |
211 | Запись сообщения (скачать с веб-страницы позже) |
0 | Помощь оператора (сообщение задаёте заранее) |
899 | Запись приветствия автоответчика |
412 | Запись сигналов модемного набора — а почему бы и нет? |
314 | Произносит первые 100 цифр числа пи |
8675309 | Звонок Дженни (прим. переводчика: отсылка к известной американской песне «867-5309/Jenny») |
846 | Установить таймер звонка через N минут |
1+(код города)+(номер) | Звонок наружу через сотовый телефон (нужна плата Bluetooth) |
Добавляйте собственные коды и аудиофайлы прямо из браузера. Это может быть шуточная линия для детей, песня, музейный экспонат или телефон для записи поздравлений в гостевую книгу на свадьбе…
Bluetooth
Подключите плату Bluetooth (модуль BM64) к разъёму и свяжите её с сотовым телефоном. После этого:
Совершайте звонки с дискового телефона. Поднимите трубку и наберите 1+(код города)+(номер). Звонок уходит через ваш сотовый телефон, а звук идёт через старую трубку.
При входящем вызове звонит настоящий звонок аппарата. Поднимите трубку, чтобы ответить; положите её, чтобы завершить вызов.
Номер вызывающего абонента отображается в журнале активности на веб-странице.
Всё остальное продолжает работать. При подключённом сотовом телефоне, но без активного звонка, поднятие трубки по-прежнему даёт гудок и доступ ко всем локальным кодам набора.
Следующим на очереди для тестирования — более дешёвый Bluetooth-модуль DFRobot BT401 (около 3,50 $). Он должен обрабатывать звонки с помощью простого набора текстовых команд, но я пока его не тестировал.
Home Assistant
Поставьте одну галочку в настройках, и плата станет доступна Home Assistant через MQTT: состояние каждой линии, кнопка «позвонить на телефон», счётчик новых сообщений и событие при каждом поднятии трубки или наборе кода. Можно добавить коды, единственная задача которых — сообщить Home Assistant «набери 42 для включения света на крыльце».
Система также работает с обычными вебхуками, если вы предпочитаете обойтись без MQTT.
Один разъём, три способа использования
На плате есть четыре вывода, которые можно использовать для разных задач. Маленький разъём (J5) с перемычками выбирает, что именно они будут делать. Они выполняют только одну задачу за раз, так что вы выбираете нужный режим при сборке:
Вторая телефонная линия. Установите все четыре перемычки, и выводы запускают вторую линию: ещё один SLIC, ещё один разъём RJ12, и оба телефона могут звонить друг другу, работать в режиме интеркома или каждый иметь собственный автоответчик.
Карта microSD. Снимите перемычки, вставьте карту в слот — и записи, сообщения и собственные аудиофайлы будут сохраняться на карту вместо встроенной флеш-памяти на 4 МБ: это много часов записи, а карту можно вынуть и скопировать с неё данные. В этом случае плата становится однолинейной, поскольку карта и вторая линия используют одни и те же выводы.
Ваши собственные устройства. Без перемычек и без карты microSD четыре пина (GPIO18–GPIO21) свободны для ваших собственных проводов. Выберите код набора, вывод и время на веб-странице: наберите код — и вывод переходит в высокий уровень на указанное число секунд (или переключается). Подключите реле или MOSFET, чтобы открыть замок двери, включить зуммер или мигнуть лампой. Вывод выдаёт 3,3 В и лишь несколько миллиампер, так что для соленоида понадобится промежуточное реле. Большинство 5-вольтовых релейных модулей сработают, но проверьте свой.
Что ещё умеет система
Дисковый и кнопочный набор (импульс/тон). Оба работают на любой линии.
Звонок на другой телефон без проводов (VoIP без сервера требует двух однолинейных плат).
На каждой линии свой автоответчик со своим приветствием. Сообщения сохраняются на плате или на карте microSD, если она включена.
Режим интеркома: поднимите одну трубку, подождите несколько секунд — и второй телефон звонит.
VoIP: зарегистрируйте линию на Asterisk или FreePBX и звоните куда угодно, куда достаёт этот сервер.
Правильные телефонные звуки: гудки, сигналы возврата вызова и занятости, соответствующие вашей стране, плюс подавление эха.
Повседневные удобства: «тихие часы», чтобы звонок не срабатывал в 2 часа ночи; несколько запомненных сетей Wi-Fi; обновление прошивки по воздуху (OTA) прямо из браузера; и необязательный пароль для веб-интерфейса.
Как это работает
Каждая телефонная линия проходит через одну и ту же цепочку:
Телефон → RJ12 → SLIC AG1171 → кодек ES8388 → ESP32 → Wi-Fi / Bluetooth
SLIC (Silvertel AG1171) (прим. переводчика: SLIC — Subscriber Line Interface Circuit, «микросхема линейного интерфейса абонента»; она имитирует для телефона электрические условия настоящей телефонной линии АТС) — это то, что заставляет телефон думать, будто он подключен к настоящей телефонной линии: он подаёт ток шлейфа, формирует напряжение звонка и сообщает ESP32, когда поднята трубка.
Кодек (ES8388) преобразует звук трубки в цифровой сигнал и обратно. Один кодек обслуживает обе линии, как левый и правый каналы.
ESP32-C6 делает всё остальное: считает импульсы дискового номеронабирателя, распознаёт тональный набор, формирует все (интернационализированные) тональные сигналы и ритм вызывного сигнала, соединяет две линии и обслуживает веб-страницу и VoIP.
Плата Bluetooth подключается напрямую к аудиотракту первого телефона, так что звонок с сотового телефона вообще никогда не проходит через ESP32. ESP32 лишь сообщает ей, что делать.
Плата (v5)
Двухслойная плата вокруг DevKit-платы ESP32-C6, кодека ES8388 и одного или двух SLIC AG1171. На производстве устанавливаются компоненты для поверхностного монтажа; вы сами паяете DevKit, SLIC-и, разъёмы и несколько коннекторов.
Оригинальный 32-контактный или дешёвый клонированный 30-контактный модуль ESP32-C6. Посадочное место подходит как для настоящей DevKitC-1 от Espressif, так и для более дешевого клона; пара паяных перемычек на обратной стороне выбирает, какой из них используется.
Разъём для Bluetooth со своим собственным стабилизатором 3,3 В, для платы BM64.
Вторая телефонная линия, microSD или ваши собственные устройства (они делят четыре пина между собой), выбирается перемычками J5 и настройкой.

Настройка
Вам не нужно приложение или учётная запись. При первом включении плата создаёт собственную сеть Wi-Fi со страницей настройки; выберите свой Wi-Fi, и после этого плата доступна по адресу http://phone.local с любого телефона или ноутбука в доме. Есть полноценный веб-интерфейс для проверки записей платы, а также широкие возможности настройки.
Использование инструментов ИИ
Большую часть этого кода я написал с помощью Claude Code. Веб-интерфейс — это та часть, которая действительно это показывает: восемь вкладок настроек, файловый менеджер для аудио и записей, обновление прошивки прямо из браузера, настройка VoIP-номеров. Для хобби-проекта одного человека ИИ помог мне быстро реализовать такие вещи, как тональный набор, продвинутый веб-интерфейс и Bluetooth-соединение… всё это опиралось на мой исходный Python-код, написанный вручную.

Корпус для 3D-печати
Есть .step-файл платы, чтобы сделать собственный корпус, но вы также можете просто напечатать готовый корпус из файлов проекта.

Получить больше информации или собрать самому
Код, аппаратная часть и документация: GitHub: sdylewski/Analog-Redial
KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.