Bạn có biết có thể biến một chiếc điện thoại quay số cổ điển thành một tổng đài nội bộ mô phỏng chỉ với một bo mạch ESP32? Dự án RetroPhone ESP32 trên GitHub chính là câu trả lời, mang đến trải nghiệm điện thoại bàn thực thụ mà không cần đăng ký dịch vụ viễn thông. Đây là giải pháp mã nguồn mở dành cho người yêu thích đồ cổ và maker muốn tái tạo âm thanh, hồi chuông và quay số của hệ thống POTS (Plain Old Telephone Service).
Thank you for reading this post, don't forget to subscribe!Những điểm chính
- Dự án RetroPhone mô phỏng tổng đài điện thoại cổ điển trên ESP32, hỗ trợ đổ chuông thực tế, âm mời quay số, quay xung (rotary) và quay tone (DTMF).
- Bạn có thể kết nối nhiều điện thoại cũ với nhau qua WiFi để gọi và nói chuyện mà không cần VoIP hay dịch vụ viễn thông.
- Phần cứng sử dụng module SLIC, DTMF decoder và ESP32; phần mềm viết bằng C++ trên PlatformIO với Arduino libraries.
- Dự án đang trong giai đoạn phát triển, đã có thể đổ chuông, phát âm thanh trạng thái cuộc gọi và cấu hình qua mã sao (star-codes).
- Phù hợp với người có kiến thức điện tử cơ bản và đam mê retro tech; dự án còn nhiều thách thức kỹ thuật như nhiễu âm và xử lý tín hiệu chuông cao áp.
RetroPhone ESP32 là gì và giải quyết vấn đề gì?

RetroPhone ESP32 là một dự án mã nguồn mở trên GitHub, do tác giả Kevin Townsend phát triển, với mục tiêu tái hiện toàn bộ trải nghiệm tổng đài điện thoại truyền thống trên những chiếc máy cũ. Dự án giải quyết vấn đề nan giải: làm sao để những chiếc điện thoại quay số, điện thoại nút bấm vẫn có thể reo, có âm quay số, và gọi được cho nhau trong phòng trưng bày retro, mà không phải mua dịch vụ viễn thông thật hay VoIP đắt tiền. Với ESP32 làm trung tâm, dự án kết hợp phàn cứng SLIC, DTMF decoder và phần mềm viết bằng C++ tạo ra một mạng điện thoại nội bộ hoàn chỉnh. Hiện tại, dự án hỗ trợ đổ chuông vật lý, âm báo trạng thái cuộc gọi (ring, busy, error), quay xung và quay tone, cũng như phát thông báo bằng file MP3. Tác giả cũng chia sẻ kinh nghiệm thực chiến, từ việc xử lý tiếng ồn khi khởi động I2S đến vấn đề lọc tần số 20Hz của tín hiệu chuông. Bạn có thể xem chi tiết tại repository gốc trên GitHub.
Những tính năng nổi bật của dự án

Dự án RetroPhone cung cấp nhiều tính năng mô phỏng trung thực hệ thống điện thoại cũ, từ đổ chuông đến quay số và thông báo giọng nói. Sau đây là các tính năng chính hiện có và một số mục tiêu đang phát triển.
Tính năng đã hoạt động
- Đổ chuông vật lý: kích hoạt bằng nút nhấn, dùng module SLIC KS0835F tạo điện áp chuông cao (cần cả chân RM và FR).
- Âm báo cuộc gọi: dialtone, busy tone, ringback tone có thể cấu hình theo tiêu chuẩn Bắc Mỹ hoặc Vương quốc Anh.
- Phát thông báo MP3: hệ thống ghép nhiều đoạn MP3 để tạo thông báo động như số bạn vừa quay không hợp lệ.
- Quay số xung và tone: hỗ trợ cả điện thoại quay số cơ và điện thoại nút bấm DTMF; có thể cấu hình qua mã sao (ví dụ * hay 22).
- LED RGB: hiển thị trạng thái cuộc gọi bằng màu sắc và hiệu ứng.
Tính năng đang phát triển
- Kết nối trung kế qua WiFi hoặc dây để gọi giữa các thiết bị.
- Trợ lý giọng nói khi quay số operator (như Alexa).
- Trang web cấu hình và thống kê trạng thái.
- Xử lý cuộc gọi đến từ xa qua Internet.
Hướng dẫn cài đặt và sử dụng cơ bản

Để chạy RetroPhone, bạn cần có kiến thức cơ bản về điện tử và lập trình ESP32. Dưới đây là các bước cài đặt dựa trên hướng dẫn trong README và kho tài liệu đi kèm.
- Chuẩn bị phần cứng: Bạn cần một board ESP32 (tác giả dùng Freenove WROVER CAM), module SLIC KS0835F (tương thích AG1171), module DTMF decoder MT8870, level shifter, op-amp LM358P, LED RGB WS2812, và các linh kiện thụ động. Xem sơ đồ mạch trong thư mục
docs/của repo. - Thiết lập môi trường phát triển: Dùng Visual Studio Code với extension PlatformIO. Clone repo về máy, mở thư mục dự án. Dự án sử dụng Arduino framework và các thư viện như Mozzi, FastLED, WiFiManager, ESP32 MP3 Player.
- Kết nối phần cứng: Nối chân của SLIC và DTMF decoder với ESP32 theo đúng sơ đồ. Chú ý chân SHK (hook switch) cần debounce do nhiễu tiếp xúc. Kết nối loa ngoài qua op-amp để nghe âm thanh.
- Nạp firmware: Mở file
src/main.cpphoặc theo hướng dẫn trongsrc/README.md. Cấu hình thông số như loại âm thanh (Bắc Mỹ/UK) trong code. Kết nối ESP32 với máy tính và nạp chương trình. - Cấu hình và chạy thử: Sau khi nạp, ESP32 sẽ tạo mạng WiFi captive portal (nhờ WiFiManager) để bạn nhập thông tin WiFi. Bạn có thể quay mã sao như
*11để thay đổi cài đặt. Nhấc máy, nghe dialtone, quay thử số 7 chữ số để nghe âm ring/busy/error. - Kiểm tra chuông: Nhấn nút gắn với chân trigger (hoặc gửi tín hiệu qua WiFi) để kích hoạt chuông vật lý. Chú ý: chuông cao áp có thể gây nhiễu âm thanh ở loa ngoài, tác giả đang thêm bộ lọc.
Lưu ý: Do dự án đang trong giai đoạn phát triển, bạn có thể gặp lỗi như treo khi đọc Preferences (cần delay 50ms) hoặc âm thanh bị pop khi khởi động I2S. Hãy tham khảo mục Challenges trong README để biết cách khắc phục tạm thời.
Ai nên dùng – ai không nên dùng?

RetroPhone không phải là giải pháp thay thế tổng đài VoIP thương mại, mà là dự án sở thích dành cho những ai yêu thích kỹ thuật và hoài cổ. Dưới đây là phân loại đối tượng phù hợp và không phù hợp.
Nên dùng nếu bạn
- Là nhà sưu tầm điện thoại cổ muốn chúng hoạt động thực sự trong phòng trưng bày.
- Là maker ESP32 muốn thử thách với dự án kết hợp phần cứng analog và phần mềm thời gian thực.
- Muốn tìm hiểu về tín hiệu điện thoại POTS, SLIC, DTMF mà không cần đầu tư thiết bị chuyên dụng.
- Thích đọc code C++ thực chiến và học hỏi từ một kỹ sư phần mềm dày dạn (tác giả ghi chú rất chi tiết).
Không nên dùng nếu bạn
- Cần một hệ thống điện thoại nội bộ ổn định, sẵn sàng cho sản xuất (dự án còn nhiều lỗi và đang phát triển).
- Không có kinh nghiệm hàn nối mạch điện tử hoặc đọc sơ đồ mạch (dự án yêu cầu kết nối thủ công).
- Hy vọng gọi ra mạng PSTN thật (dự án chỉ mô phỏng nội bộ, không kết nối với tổng đài thật).
- Không thoải mái với việc debug lỗi âm thanh pop, nhiễu tín hiệu chuông, và các vấn đề thời gian thực trên ESP32.
Những thách thức kỹ thuật đáng chú ý

Một điểm mạnh của dự án RetroPhone là tác giả chia sẻ rất trung thực những khó khăn gặp phải, giúp người dùng sau tiết kiệm thời gian. Dưới đây là các challenge chính bạn sẽ phải đối mặt nếu tự build.
- Nhiễu tín hiệu chuông cao áp: Khi đổ chuông, tín hiệu 20Hz ảnh hưởng đến đường audio out của SLIC, gây ra tiếng ồn trên loa ngoài. Giải pháp dự kiến là thêm bộ lọc hoặc relay cách ly.
- Âm thanh pop khi khởi động I2S: Do chân DAC của ESP32 ở mức 0V rồi đột ngột chuyển sang mức giữa, gây tiếng *pop*. Tác giả đã thử dùng tín hiệu ramp nhưng chưa hoàn hảo. Có thể thêm điện trở kéo xuống 100K.
- Xử lý DTMF phần mềm không ổn định: Thư viện PhoneDTMF tiêu tốn nhiều thời gian trong main loop, làm gián đoạn tạo âm Mozzi. Chuyển sang DTMF decoder phần cứng MT8870 là giải pháp hiện tại. Tác giả đang thử nghiệm chạy DTMF trên FreeRTOS task.
- Debounce SHK (hook switch): Chân SHK từ SLIC bị nảy nhiều, đặc biệt khi cấp nguồn 3.3V thay vì 5V. Phải có logic debounce, nhưng khi đang đổ chuông thì không thể debounce lâu vì làm chậm phát hiện off-hook.
- Dừng dialtone kịp thời: Với điện thoại quay số cơ, khi quay số 1 đầu tiên, dialtone vẫn còn lưu trong buffer gây tiếng blip. Tác giả đã giảm kích thước chunk âm thanh từ 576 xuống 33 mẫu, và tạo callback dừng ngay khi phát hiện cạnh xuống SHK.
Những thách thức này cho thấy dự án thực sự là một quá trình học hỏi và mày mò, rất phù hợp với những ai yêu thích tinh thần open-source và không ngại đụng tay vào mạch.
Câu hỏi thường gặp
RetroPhone có thể gọi ra số điện thoại thật bên ngoài không?
Không. Dự án chỉ mô phỏng mạng nội bộ giữa các điện thoại kết nối với cùng một ESP32 (hoặc qua WiFi giữa các thiết bị). Nó không kết nối với mạng PSTN hay VoIP thật.
Tôi cần những linh kiện gì để bắt đầu?
Bạn cần ESP32 (khuyên dùng Freenove WROVER CAM), module SLIC KS0835F, DTMF decoder MT8870, level shifter, op-amp LM358P, LED WS2812, và các linh kiện thụ động. Xem sơ đồ trong thư mục docs/ của repo.
Dự án đã hoàn thiện chưa? Có thể sử dụng ổn định không?
Dự án đang trong giai đoạn work-in-progress. Các chức năng cơ bản như đổ chuông, dialtone, quay số đã chạy, nhưng còn lỗi nhỏ và chưa có tính năng gọi giữa các thiết bị qua WiFi. Chưa phù hợp cho sản xuất.
Tôi có thể dùng điện thoại không dây cũ thay vì điện thoại bàn không?
Có thể, nếu điện thoại đó sử dụng chuông điện tử và giao tiếp tương tự. Tác giả đã thử với Sony slimline và thấy chuông điện tử hoạt động với tín hiệu FR đơn giản, không cần RM.
Làm sao để cấu hình quay số mã sao trên điện thoại quay xung?
Với điện thoại quay xung (pulse dialing), bạn quay số 22 thay vì dấu *. Ví dụ: quay 2211 để vào chế độ cấu hình. Dự án có hỗ trợ tự động nhận diện.
Kết luận
RetroPhone ESP32 là một dự án thú vị dành cho những ai muốn hồi sinh điện thoại cổ điển một cách chân thực. Với mã nguồn mở, phần cứng phổ biến và tài liệu chi tiết từ tác giả giàu kinh nghiệm, bạn có thể xây dựng một tổng đài nội bộ mini ngay tại bàn làm việc. Dù còn nhiều thử thách, nhưng chính điều đó làm nên giá trị học tập và trải nghiệm. Nếu bạn yêu thích retro tech và không ngại mày mò, hãy ghé thăm repository RetroPhone trên GitHub ngay bây giờ và bắt đầu cuộc phiêu lưu của riêng mình.

