Công nghệ

Bạn có thể show cho mình lưu đồ thuật toán của một máy giặt không?

Written by lbtmicr06

Có. Nếu mục tiêu của bạn là học cách một vi điều khiển điều khiển máy giặt, ta có thể nhìn máy giặt như một hệ thống điều khiển gồm đọc cảm biến → quyết định trạng thái → điều khiển motor/van/bơm → chuyển sang trạng thái tiếp theo.

Image

Image

Image

Image

Image

1. Lưu đồ thuật toán tổng quát của máy giặt

Một máy giặt cửa trên/cửa ngang hiện đại có thể khái quát như sau:

                         ┌───────────────┐
                         │    START      │
                         └───────┬───────┘
                                 │
                                 ▼
                    ┌────────────────────────┐
                    │ Khởi tạo vi điều khiển │
                    │ - GPIO                 │
                    │ - Timer                │
                    │ - ADC                  │
                    │ - cảm biến             │
                    └───────────┬────────────┘
                                │
                                ▼
                     ┌─────────────────────┐
                     │ Người dùng chọn     │
                     │ chương trình giặt   │
                     └──────────┬──────────┘
                                │
                                ▼
                     ┌─────────────────────┐
                     │ Nhấn START ?        │
                     └──────────┬──────────┘
                                │
                           Chưa ─┴─ Có
                           │          │
                           └──►       ▼
                              ┌────────────────┐
                              │ Kiểm tra cửa   │
                              │ đã khóa chưa?  │
                              └───────┬────────┘
                                      │
                                Chưa ──┴── Có
                                 │           │
                                 ▼           ▼
                           Báo lỗi       CẤP NƯỚC
                                             │
                                             ▼
                                  ┌────────────────────┐
                                  │ Đã đủ nước chưa?   │
                                  └─────────┬──────────┘
                                            │
                                      Chưa ──┴── Có
                                       │           │
                                       └────►      ▼
                                           ┌──────────────┐
                                           │    GIẶT      │
                                           │ motor quay   │
                                           │ trái ↔ phải  │
                                           └──────┬───────┘
                                                  │
                                                  ▼
                                         Đã hết thời gian?
                                                  │
                                           Chưa ──┴── Có
                                            │           │
                                            └────►      ▼
                                                ┌────────────┐
                                                │ XẢ NƯỚC   │
                                                │ chạy bơm   │
                                                └─────┬──────┘
                                                      │
                                                      ▼
                                             Đã hết nước?
                                                      │
                                               Chưa ──┴── Có
                                                │           │
                                                └────►      ▼
                                                   ┌────────────┐
                                                   │   RINSE    │
                                                   │ Cấp nước   │
                                                   │ + đảo      │
                                                   └─────┬──────┘
                                                         │
                                                         ▼
                                                  Còn lần xả?
                                                    │       │
                                                   Có      Không
                                                    │         │
                                                    └─────►   ▼
                                                           ┌──────────┐
                                                           │  SPIN    │
                                                           │ Vắt      │
                                                           └────┬─────┘
                                                                │
                                                                ▼
                                                       Giảm tốc / dừng
                                                                │
                                                                ▼
                                                           KẾT THÚC
                                                                │
                                                                ▼
                                                              END

Đây là lưu đồ cấp cao. Nhưng nếu chúng ta muốn học lập trình vi điều khiển thì nên đi sâu hơn.


2. Thực tế máy giặt không chỉ có “giặt → xả → vắt”

Bên trong chương trình điều khiển, ta có thể hình dung máy giặt là một state machine:

                   ┌──────────────┐
                   │    IDLE      │
                   │ Chờ người dùng│
                   └──────┬───────┘
                          │ START
                          ▼
                   ┌──────────────┐
                   │ DOOR LOCK    │
                   └──────┬───────┘
                          │
                          ▼
                   ┌──────────────┐
                   │    FILL      │
                   │   Cấp nước   │
                   └──────┬───────┘
                          │ Đủ nước
                          ▼
                   ┌──────────────┐
                   │    WASH      │
                   │    Giặt      │
                   └──────┬───────┘
                          │
                          ▼
                   ┌──────────────┐
                   │    DRAIN     │
                   │     Xả       │
                   └──────┬───────┘
                          │
                          ▼
                   ┌──────────────┐
                   │    RINSE     │
                   │    Giũ       │
                   └──────┬───────┘
                          │
                          │ lặp lại
                          └──────┐
                                 │
                                 ▼
                           ┌───────────┐
                           │   SPIN    │
                           │    Vắt    │
                           └─────┬─────┘
                                 │
                                 ▼
                           ┌───────────┐
                           │   END     │
                           └───────────┘

Đây chính là tư duy State Machine (FSM) rất quan trọng khi lập trình các thiết bị điện tử thực tế.


3. Nhưng vi điều khiển phải đọc rất nhiều cảm biến

Ví dụ trong lúc FILL – cấp nước, thuật toán không đơn giản là:

Valve_ON();

mà có thể là:

              CẤP NƯỚC
                  │
                  ▼
          Mở van cấp nước
                  │
                  ▼
       Đọc cảm biến mức nước
                  │
          ┌───────┴────────┐
          │                │
       Chưa đủ            Đủ
          │                │
          ▼                ▼
      tiếp tục          Đóng van
      cấp nước             │
          │                ▼
          └──────────►  SANG GIẶT

Nếu quá thời gian mà vẫn chưa đủ nước:

              CẤP NƯỚC
                  │
                  ▼
             Timer chạy
                  │
                  ▼
          Đủ nước chưa?
             │       │
            Có      Không
             │       │
             ▼       ▼
         đóng van   Timeout?
                     │
                ┌────┴────┐
               Chưa      Có
                │         │
                ▼         ▼
             tiếp tục   BÁO LỖI

4. Đến bước GIẶT thì thuật toán lại khác

Ví dụ máy giặt cần đảo chiều motor:

             GIẶT
               │
               ▼
        Motor quay thuận
               │
            5 giây
               │
               ▼
        Motor dừng
               │
           chờ 1 giây
               │
               ▼
        Motor quay nghịch
               │
            5 giây
               │
               ▼
        Motor dừng
               │
           chờ 1 giây
               │
               ▼
        Đã hết thời gian
        giặt chưa?
          │          │
         Chưa       Có
          │          │
          └───►      ▼
                 XẢ NƯỚC

Như vậy motor không đơn giản là:

ON

mà bộ điều khiển phải tạo ra một chuỗi trạng thái.


5. Đặc biệt quan trọng: bước VẮT

Vắt là phần thuật toán phức tạp hơn.

Ví dụ:

                    VẮT
                     │
                     ▼
             Kiểm tra cửa
                     │
                     ▼
             Khóa cửa OK?
                │       │
               Không    Có
                │       │
                ▼       ▼
              ERROR   Xả nước
                         │
                         ▼
                  Nước đã hết?
                         │
                         ▼
                    Có → START
                         │
                         ▼
                  Tăng tốc motor
                         │
                         ▼
                 Đọc tốc độ motor
                         │
                         ▼
                  Đạt tốc độ?
                    │       │
                   Chưa     Có
                    │        │
                    └────►   ▼
                         Duy trì tốc độ
                              │
                              ▼
                         Hết thời gian?
                              │
                              ▼
                             Có
                              │
                              ▼
                         Giảm tốc
                              │
                              ▼
                            STOP

Ở đây ta bắt đầu thấy rõ bản chất của lập trình điều khiển máy thực tế.


6. Nếu chuyển sang tư duy STM32

Ta có thể ánh xạ máy giặt thành:

             ┌──────────────────┐
             │     STM32        │
             └────────┬─────────┘
                      │
        ┌─────────────┼──────────────┐
        │             │              │
        ▼             ▼              ▼
     INPUT          PROCESS        OUTPUT
        │             │              │
        │             │              │
 ┌──────┴──────┐      │       ┌──────┴────────┐
 │             │      │       │               │
 ▼             ▼      ▼       ▼               ▼
Cảm biến     Nút     FSM     Van nước       Motor
mức nước     nhấn            Bơm xả         Heater
cửa                          Khóa cửa        ...

Ví dụ:

INPUT
 │
 ├── WATER_LEVEL
 ├── DOOR_SENSOR
 ├── START_BUTTON
 ├── TEMPERATURE
 ├── MOTOR_SPEED
 └── CURRENT_SENSOR
          │
          ▼
     VI ĐIỀU KHIỂN
          │
          ▼
       FSM
          │
    ┌─────┼─────┐
    ▼     ▼     ▼
  FILL   WASH  SPIN
    │     │     │
    ▼     ▼     ▼
  VALVE MOTOR MOTOR
         PUMP

7. Và đây chính là điểm liên hệ với chiếc đồng hồ bạn vừa làm

Hai chương trình nhìn bề ngoài hoàn toàn khác nhau, nhưng tư duy lập trình rất giống nhau.

Đồng hồ của bạn:

while(1)
{
    Clock_Update();

    Display_Scan();

    Button_Process();
}

Máy giặt:

Có thể khái quát:

while(1)
{
    Read_Sensors();

    Process_Buttons();

    WashingMachine_StateMachine();

    Control_Motor();

    Control_Valve();

    Control_Pump();

    Update_Display();
}

Tức là:

Đồng hồ của bạn đang là phiên bản rất đơn giản của một hệ thống điều khiển máy thực tế.

Bạn đã có:

HAL_GetTick()
     ↓
Timer phần mềm
     ↓
State/Mode
     ↓
Input
     ↓
Logic
     ↓
Output

Máy giặt chỉ mở rộng nó lên rất nhiều:

                   ┌───────────────┐
                   │   CẢM BIẾN    │
                   └───────┬───────┘
                           ↓
                    ┌─────────────┐
                    │   STM32/MCU │
                    │             │
                    │  FSM        │
                    │  Timer      │
                    │  Logic      │
                    └──────┬──────┘
                           ↓
              ┌────────────┼────────────┐
              ↓            ↓            ↓
            MOTOR         VAN          BƠM
              ↓            ↓            ↓
             GIẶT        CẤP NƯỚC       XẢ

Nếu bạn muốn học sâu về lập trình vi điều khiển, mình khuyên bước tiếp theo là chúng ta lấy chính máy giặt làm một “dự án STM32 lớn”: vẽ lưu đồ chi tiết từ IDLE → LOCK → FILL → WASH → DRAIN → RINSE → SPIN → END, sau đó biến từng trạng thái thành enum STATE và viết một chương trình C mô phỏng máy giặt trên STM32. Đây sẽ là bước rất tự nhiên sau chương trình đồng hồ của bạn.

About the author

lbtmicr06

Leave a Comment