Có, và đây là một chủ đề rất thú vị. Thực tế, nếu bạn mở bo mạch của một máy giặt hiện đại (Panasonic, LG, Samsung, Toshiba, Electrolux…), bạn sẽ thấy cách thiết kế của nó khá giống với một hệ thống nhúng (Embedded System) chuyên nghiệp chứ không phải chỉ là một chương trình Arduino viết nối tiếp.
Một firmware máy giặt tốt thường được chia thành rất nhiều module độc lập để dễ phát triển, bảo trì và sửa lỗi.![]()
1. Cấu trúc phần cứng của bo mạch máy giặt
Một bo mạch thường chia thành các khối sau:
AC220V
│
┌───────┴────────┐
│Nguồn Switching │
└───────┬────────┘
│5V/12V
│
┌─────────┴─────────┐
│ MCU │
│ STM32/Renesas/... │
└─────────┬─────────┘
│
────────────────┼──────────────────────
│
INPUT MODULES
Door Lock
Water Level
Temperature
Hall Sensor
Current Sensor
Keypad
LCD/LED
Rotary Encoder
────────────────┼──────────────────────
│
OUTPUT MODULES
Motor Driver
Water Valve
Drain Pump
Heater
Door Lock
Buzzer
Display
WiFi
Mỗi khối gần như độc lập.
2. Các module phần mềm
Firmware không viết kiểu:
loop()
{
mở van
quay motor
xả nước
...
}
mà thường viết như:
main()
↓
Scheduler
↓
Task
↓
Module
Ví dụ
main()
↓
Task 10ms
↓
Motor Module
↓
Motor Driver
3. Ví dụ chia module
Module nguồn
Power.c
Power_Init()
Power_Check()
Power_Shutdown()
Module bàn phím
Key.c
Key_Scan()
Key_Process()
Key_GetEvent()
Không nơi nào khác đọc chân GPIO trực tiếp.
Tất cả đều hỏi
Key_GetEvent();
Module hiển thị
Display.c
Display_ShowTime()
Display_ShowError()
Display_ShowMode()
Display_Update()
Module cảm biến mực nước
WaterLevel.c
WaterLevel_Read()
WaterLevel_Filter()
WaterLevel_GetState()
Module nhiệt độ
TempSensor.c
Temp_Read()
Temp_Filter()
Temp_GetTemp()
Module động cơ
Đây là module lớn nhất.
Motor.c
Motor_Start()
Motor_Stop()
Motor_SetRPM()
Motor_Reverse()
Motor_Brake()
Motor_PID()
Motor_DetectJam()
Module van cấp nước
Valve.c
Valve_OpenCold()
Valve_OpenHot()
Valve_Close()
Module bơm
Pump.c
Pump_Start()
Pump_Stop()
Module khóa cửa
Door.c
Door_Lock()
Door_Unlock()
Door_IsLocked()
Module báo lỗi
Error.c
Error_Set()
Error_Clear()
Error_Display()
Ví dụ
E1
Không có nước
E2
Không khóa cửa
E3
Motor quá tải
4. Module điều khiển trung tâm
Đây mới là “bộ não”.
Ví dụ
WashController.c
Nó không điều khiển relay.
Nó chỉ gọi các module.
Ví dụ
Door_Lock();
Valve_Open();
Motor_Start();
Pump_Start();
...
5. Thuật toán điều khiển
Thông thường được viết dưới dạng State Machine.
Ví dụ
POWER ON
↓
IDLE
↓
WAIT START
↓
LOCK DOOR
↓
FILL WATER
↓
HEATING
↓
WASH
↓
DRAIN
↓
RINSE
↓
SPIN
↓
END
↓
UNLOCK
Mỗi trạng thái chỉ làm đúng một việc.
Ví dụ
STATE_FILL
↓
if(level==FULL)
↓
STATE_WASH
6. Một State còn chia nhỏ
Ví dụ
STATE_WASH
↓
SubState 1
Quay thuận
↓
SubState 2
Dừng
↓
SubState 3
Quay ngược
↓
SubState 4
Dừng
↓
Lặp
Như vậy chương trình rất rõ ràng.
7. Scheduler
Máy giặt không chạy bằng delay.
Thường có timer 1ms.
Ví dụ
1ms
↓
Scheduler
↓
Task 5ms
Task 10ms
Task 50ms
Task 100ms
Task 500ms
Task 1s
Ví dụ
5ms
↓
Đọc Hall
10ms
↓
Quét bàn phím
50ms
↓
Đọc ADC
100ms
↓
Điều khiển PID
1s
↓
Cập nhật thời gian còn lại
8. Có phải dùng module để dễ sửa lỗi không?
Đúng.
Ví dụ
Motor không quay.
Bạn không cần đọc toàn bộ 100.000 dòng code.
Chỉ xem
Motor.c
và
WashController.c
Nếu hiển thị sai
chỉ xem
Display.c
Nếu báo E2
chỉ xem
Door.c
9. Máy giặt hiện đại còn có lớp trừu tượng (HAL)
Firmware tốt thường còn chia thành:
Application
↓
Control
↓
Service
↓
HAL
↓
Driver
↓
GPIO
Ví dụ
Application gọi:
Motor_Start();
Motor module không biết relay hay PWM nằm chân nào.
Nó chỉ gọi:
HAL_Motor_SetPWM();
HAL mới điều khiển:
TIM3->CCR1=500;
Nhờ vậy khi đổi vi điều khiển (ví dụ từ Renesas sang STM32), phần lớn mã điều khiển nghiệp vụ không cần thay đổi.
10. Nếu là máy giặt Inverter thì sao?
Máy giặt Inverter có cấu trúc còn phức tạp hơn. Ngoài các module trên còn có:
- Điều khiển động cơ bằng FOC (Field-Oriented Control) hoặc điều khiển vector.
- Điều khiển biến tần với cầu công suất IGBT hoặc MOSFET ba pha.
- PID tốc độ và PID dòng điện.
- Phát hiện mất pha, quá dòng, quá áp, quá nhiệt.
- Tự nhận dạng tải (quần áo ít/nhiều).
- Cân bằng lồng giặt trước khi vắt tốc độ cao (dựa trên tín hiệu Hall, encoder hoặc thuật toán ước lượng).
- Quản lý năng lượng và tối ưu chu trình giặt.
Góc nhìn dành cho dự án của bạn
Dựa trên các dự án Arduino mà bạn đã thực hiện (bộ điều khiển thời gian nhiều kênh, điều khiển relay bằng IR, menu LCD, RTC…), bạn đã tiếp cận đúng hướng của lập trình nhúng theo module. Nếu muốn nâng lên một mức chuyên nghiệp hơn, mình có thể hướng dẫn bạn xây dựng một firmware máy giặt mô phỏng theo kiến trúc công nghiệp, gồm khoảng 25–40 module (Scheduler, Event Queue, State Machine, Driver, HAL, Services, Controllers…), với cấu trúc gần giống firmware thực tế của các hãng điện tử. Đây là một bài học rất tốt để rèn kỹ năng thiết kế phần mềm nhúng có khả năng mở rộng và bảo trì.
Thường thì các module bàn phím và các cảm biến có trong máy giặt được kết nối với MCU qua các chuẩn kết nối i2c,uart,hay chuẩn nào
Đây là một câu hỏi rất hay. Câu trả lời là: không có một chuẩn duy nhất. Trong máy giặt, các cảm biến và thiết bị ngoại vi được kết nối với MCU bằng nhiều chuẩn khác nhau, tùy theo tốc độ, giá thành, khả năng chống nhiễu và yêu cầu an toàn.
Có thể hình dung như sau:
MCU
│
┌───────────────┼────────────────┐
│ │ │
GPIO ADC Input Communication
│ │ │
│ │ ┌──────┴─────────┐
│ │ │ │
Digital Analog Sensor I2C/SPI/UART/CAN
1. GPIO – phổ biến nhất
Khoảng 70-80% tín hiệu trong máy giặt chỉ là GPIO.
Ví dụ:
Công tắc cửa
Door Switch
ON/OFF
↓
GPIO
MCU chỉ đọc
if(DoorSwitch == ON)
Phao chống tràn
Float Switch
↓
GPIO
Nút bấm
Button
↓
GPIO
Relay feedback
Relay Contact
↓
GPIO
2. ADC (Analog)
Các cảm biến đo liên tục thường nối vào ADC.
Ví dụ:
Cảm biến nhiệt NTC
5V
│
NTC
│
R
│
GND
↓
ADC
MCU đo điện áp
↓
đổi sang nhiệt độ.
Cảm biến áp suất nước (Pressure Sensor)
Một số máy dùng
0.5V
↓
4.5V
MCU đọc bằng ADC.
Cảm biến dòng
Current Sensor
↓
ADC
3. Input Capture / Counter
Động cơ inverter thường có Hall Sensor.
Ví dụ
Hall A
Hall B
Hall C
↓
GPIO Interrupt
hoặc
Timer Capture
để đo RPM.
4. PWM
PWM chủ yếu dùng để điều khiển:
- Motor
- Van tỷ lệ
- Quạt
- Biến tần
Ví dụ
MCU PWM
↓
IGBT Driver
5. I²C
I²C được dùng khá nhiều nhưng không phải để nối tất cả cảm biến.
Thường dùng cho:
EEPROM
MCU
↓
24C02
24C04
24C64
RTC
DS1307
DS3231
LCD Driver
Ví dụ
PCF8574
↓
LCD
IO Expander
Ví dụ
PCF8575
↓
16 Input
Cảm biến thông minh
Một số cảm biến nhiệt độ số
LM75
↓
I2C
6. SPI
Ít gặp hơn I²C.
Thường dùng khi cần tốc độ cao.
Ví dụ
External Flash
↓
SPI
LCD TFT
SPI LCD
7. UART
UART chủ yếu dùng cho:
Debug
MCU
↓
TX RX
↓
PC
Trong nhà máy, kỹ sư cắm cáp UART để xem log.
Ví dụ
STATE=WASH
RPM=800
TEMP=42
LEVEL=FULL
Module WiFi
ESP8266
↓
UART
Bluetooth
HC-05
↓
UART
8. CAN
Máy giặt dân dụng ít dùng.
Nhưng máy công nghiệp có thể dùng CAN để kết nối:
- Board điều khiển
- Board inverter
- Màn hình HMI
9. RS485
Một số máy giặt công nghiệp lớn dùng
MCU
↓
RS485
↓
HMI
hoặc kết nối nhiều máy.
10. Board Inverter thường giao tiếp với MCU như thế nào?
Đây là phần khá thú vị.
Máy giặt inverter thường chia thành hai board:
Main Board
↓
Communication
↓
Inverter Board
Chuẩn giao tiếp có thể là:
- UART
- SPI
- I²C
- PWM + Feedback
- Giao thức nối tiếp độc quyền của nhà sản xuất
Ví dụ:
Main MCU
↓
UART
↓
Motor MCU
Main MCU gửi
RUN
800 RPM
CW
Motor MCU trả lời
RPM=798
CURRENT=1.4A
OK
11. Vì sao không dùng I²C cho mọi thứ?
Có ba lý do chính:
Thứ nhất: chống nhiễu. Máy giặt có động cơ, bơm, van điện từ và biến tần tạo ra rất nhiều nhiễu điện từ. Một công tắc cửa nối GPIO đơn giản thường ổn định và dễ bảo vệ hơn một cảm biến số đặt trên bus I²C.
Thứ hai: chi phí. Một công tắc cơ chỉ cần hai dây nối vào GPIO. Nếu dùng I²C, mỗi thiết bị phải có mạch điều khiển và địa chỉ riêng, làm tăng giá thành.
Thứ ba: độ tin cậy. Nếu một thiết bị trên bus I²C bị treo và giữ đường SDA hoặc SCL ở mức thấp, toàn bộ bus có thể ngừng hoạt động. Trong khi đó, nếu một công tắc nối GPIO bị hỏng, các cảm biến khác vẫn hoạt động bình thường.
12. Kiến trúc của máy giặt hiện đại
Một firmware điển hình có thể được tổ chức như sau:
MCU
│
┌───────────────┼────────────────────┐
│ │ │
GPIO ADC Communication
│ │ │
│ │ ┌─────────┼─────────┐
│ │ │ │ │
Door NTC Temp I²C UART SPI
Level Sw Pressure EEPROM WiFi Flash
Keys Current RTC Debug LCD
│
Hardware Drivers
│
Sensor Abstraction Layer
│
Control Algorithms
│
State Machine
│
Wash Program Logic
Đây cũng là cách thiết kế mà các hãng điện tử lớn áp dụng: phần cứng được trừu tượng hóa (Hardware Abstraction Layer – HAL), sau đó các thuật toán chỉ làm việc với các module như Door_IsClosed(), WaterLevel_Get(), Motor_SetRPM() mà không cần biết cảm biến đang kết nối qua GPIO, ADC hay I²C.
Theo những trao đổi trước đây về các dự án Arduino của bạn, mình nghĩ chủ đề này rất phù hợp. Nếu bạn muốn học cách viết firmware theo phong cách công nghiệp, mình có thể hướng dẫn xây dựng một firmware máy giặt mô phỏng (không điều khiển phần cứng thật) với khoảng 30 module, scheduler, state machine, HAL và driver, gần giống cách các hãng như LG, Samsung hay Electrolux tổ chức mã nguồn. Điều đó sẽ giúp bạn hiểu rõ cách một dự án nhúng lớn được thiết kế và bảo trì.

