STDIO
Tìm kiếm gần đây
    • Nội dung
    • QR Code
    • 0
    • 0
    • Sao chép

    Đo Tốc Độ Động Cơ Sử Dụng Cảm Biến IR FC-03

    Bài viết hướng dẫn cách sử dụng cảm biến đo tốc độ IR FC-03 kết hợp với vòng xoay encoder 15 lỗ, để xác định tốc độ của động cơ DC. Khi có tốc độ, ta có thể thực hiện điều chỉnh tốc độ của động cơ để cho xe chạy thẳng, thông qua mạch L298.

    Kim Uyên

    27/05/2016
    07/08/2020
    6 phút đọc
    Đo Tốc Độ Động Cơ Sử Dụng Cảm Biến IR FC-03

    Để biết:

    • Quãng đường mà xe đã di chuyển?
    • Cho xe di chuyển một đoạn xác định, rẽ trái, rẽ phải.
    • Điều chỉnh tốc độ của từng động cơ để xe di chuyển thẳng.

    Các tính năng trên đều có thể làm được bằng cách sử dụng cảm biến tốc độ IR FC-03 để xác định tốc độ của động cơ DC quay bánh xe.

    Khi điều khiển các động cơ, về thông số kĩ thuật các motor được thiết kế với tốc độ bằng nhau nhưng thực tế mức độ bằng nhau chỉ là tương đối. Nó phụ thuộc vào nguồn điện cấp cho motor và độ chính xác của cơ khí.

    Từ mong muốn cân bằng tốc độ của các động cơ sao cho xe có thể chạy thẳng, việc lấy được vận tốc thực tế của 2 bánh xe khi đang di chuyển, từ đó cân bằng tốc độ mỗi bánh xe bằng cách điều xung cho IC L298.

    1 vấn đề khác là khi xe gặp vật cản, xe sẽ xoay trái hay phải một góc 90 độ theo hướng không có vật cản để đi về hướng đó. Vậy phải làm sao để xác định xe đã xoay đến đúng 90 độ để dừng lại không xoay nữa? Ý tưởng ban đầu là thực hiện gọi hàm delay (delta time). Tuy nhiên, sau khi thử nghiệm thực tế thì kết quả không như mong muốn, việc delay sẽ làm xe xoay một góc khác nhau tùy vào loại sàn (sàn gỗ, sàn gạch men, di chuyển trên thảm). Do mỗi loại sàn trên có độ ma sát khác nhau.

    Thiết bị cần chuẩn bị

    Cần chuẩn bị các thiết bị sau:

    • 1 x Arduino Uno R3.
    • 1 x Cảm biến tốc độ IR FC-03.
    • 1 x Đĩa encoder 15 lỗ.

    Cảm biến tốc độ IR FC-03

    IR FC-03
    Mặt trước IR FC-03
    Mặt sau IR FC-03
    Mặt sau IR FC-03

    Thành phần cấu tạo

    • 1 x Bộ thu phát ITR9608: chân số 2 có chứa diode phát tia hồng ngoại, chân số 1 chứa 1 phototransistor để thu nhận tín hiệu hồng ngoại.
    • 1 x IC LM393.

    Các chân cắm:

    • VCC: cảm biến chịu được mức điện áp từ 3.3 - 5V, chân này được nối với pin nguồn 5V của Arduino.
    • GND: nối với pin nguồn GND của Arduino.
    • DO: chân cho tín hiệu số đi ra của cảm biến (High / Low).
    • AO: chân cho tín hiệu tương tự đi ra từ cảm biến, chân này hiện không sử dụng.

    Nguyên lý hoạt động

    Đĩa encoder đọc tốc độ.
    Đĩa encoder

    Khi motor quay thì đĩa encoder quay, lúc này giá trị ở chân DO của FC-03 chuyển đổi liên tục từ LOW sang HIGH và từ HIGH sang LOW. Nguyên nhân là khi FC-03 được cấp điện, diode ở chân số 2 của ITR9608 phát ra tia hồng ngoại, nếu tia hồng ngoại được truyền thông qua lỗ của đĩa encoder, phototransistor nhận được tín hiệu và chuyển output của chân DO lên mức HIGH. Ngược lại, khi tia hồng ngoại bị cản bởi đĩa encoder, phototransistor không nhận được tín hiệu, chân DO được chuyển về mức LOW.

    Dựa vào nguyên lý ngày, để lấy được số vòng quay của động cơ trong một khoảng thời gian, chỉ cần đếm số lỗ mà FC-03 bắt được trong khoảng thời gian đó. Tức là đếm số lần mà pin 2 của Arduino chuyển từ HIGH sang LOW.

    Hiện thực với code

    Để bắt được sự thay đổi trạng thái của đầu ra DO trên FC-03, sử dụng kĩ thuật interrupt. Tác vụ được gọi bởi interrupt do sự thay đổi nào đó ở phần cứng, tác vụ này được gọi ngầm định bởi chương trình. Arduino đã hỗ trợ hàm thực hiện gọi interrupt, biến lưu số lỗ mà FC-03 bắt được sẽ tăng một đơn vị khi ngắt xảy ra (pin 2 có hiện tượng chuyển từ HIGHT sang LOW).

    Chương trình dưới đây thực hiện tính số vòng quay của motor trong một phút và in kết quả đến terminal.

    #define PIN_DO 2
    volatile unsigned int pulses;
    float rpm;
    unsigned long timeOld;
    #define HOLES_DISC 15
    
    void counter()
    {
      pulses++;
    }
    
    void setup()
    {
      Serial.begin(9600);
      pinMode(PIN_DO, INPUT);
      pulses = 0;
      timeOld = 0;
      attachInterrupt(digitalPinToInterrupt(PIN_DO), counter, FALLING);
    }
    
    void loop()
    {
      if (millis() - timeOld >= 1000)
      {
        detachInterrupt(digitalPinToInterrupt(PIN_DO));
        rpm = (pulses * 60) / (HOLES_DISC);
        Serial.println(rpm);
        
        timeOld = millis();
        pulses = 0;
        attachInterrupt(digitalPinToInterrupt(PIN_DO), counter, FALLING);  
      }
    }

    Giải thích:

    • Dòng 1: Định nghĩa pin 2 trên Arduino cho interrupt để nhận tín hiệu từ chân DO. Đối với board Arduino UNO, chỉ có 2 pin được sử dụng cho interrupt là pin 2 và pin 3.
    • Dòng 2: Khai báo biến lưu số lỗ mà FC-03 bắt được trong một giây. Biến được khai báo ở dạng volatile có nghĩa là ra lệnh cho trình biên dịch biết rằng giá trị của biến có thể bị thay đổi bởi một lời gọi hàm ngầm định nào đó. Vì thế, mỗi lần biến pulses được truy xuất, chương trình sẽ thực hiện load lại giá trị từ ô nhớ của pulses vào thanh ghi.
    • Dòng 3: Biến lưu giá trị tốc độ tính được; số vòng trên phút.
    • Dòng 4: Biến lưu giá trị thời điểm trước đó bắt đầu tính số lỗ đã đi qua.
    • Dòng 5: Số lỗ trên đĩa encoder.
    • Dòng 7 - 10: Hàm được gọi khi có interrupt xảy ra. Để tăng số lỗ mà cảm biến bắt được.
    • Dòng 15: Khai báo sử dụng pin 2 để nhận giá trị từ chân DO của FC-03.
    • Dòng 18: Ra lệnh khởi động interrupt. Hàm attachInterrupt có 3 tham số:
      • Pin interrupt: sử dụng hàm số digitalPinToInterrupt để chuyển từ pin trên Arduino sang pin của interrupt.
        • Pin 2: pin 0 của interrupt.
        • Pin 3: pin 1 của interrupt.
      • ISR: Hàm để gọi khi interrupt xảy ra. Hàm phải không chứa tham số và giá trị trả về là void.
      • Mode: Xác định khi nào interrupt sẽ được khởi động.
        • LOW - bất cứ khi nào pin interrupt ở mức LOW.
        • CHANGE - bất cứ khi nào pin interrupt thay đổi giá trị.
        • RISING - khi pin interrupt chuyển từ LOW sang HIGH.
        • FALLING - khi pin interrupt chuyển từ HIGH sang LOW.
    • Dòng 23: Mỗi một giây, tốc độ được thực hiện tính toán.
    • Dòng 25: Ra lệnh ngưng quá trình interrupt để thực hiện tính toán.
    • Dòng 26: Tính toán giá trị tốc độ dựa vào thời gian và số lỗ đếm được.
    • Dòng 31: Khởi động lại interrupt.

    Hình ảnh bên dưới là phần dụng cảm biến FC-03 trong xe. Mạch được sử dụng là mạch điều khiển động cơ L298 để điều khiển motor DC. 

    Kết quả

    ss5_result
    0 Bình luận
    Điện Tử Ứng Dụng

    Điện Tử Ứng Dụng

    Kiến thức điện tử, Arduino, Raspberry Pi, giới thiệu sản phẩm.

    Đề xuất

    Điều Khiển Động Cơ Bằng IC L298
    Hướng dẫn sử dụng IC L298 đã tích hợp sẵn mạch cầu H, ứng dụng trong ...
    Thỏa Thuận Sử Dụng Dịch Vụ STDIO
    Thỏa thuận này quy định về điều kiện giao kết hợp đồng, quyền lợi, nghĩa ...

    Khám phá

    Đo Khoảng Cách Trong Không Gian Với Cảm Biến SRF05 Và Arduino
    Hướng dẫn sử dụng cảm biến sóng siêu âm SRF05 để đo khoảng cách từ vật ...
    Thông Số Kỹ Thuật Arduino Uno R3 - Các Biến Thể và Lưu Ý
    Arduino board có rất nhiều phiên bản với hiệu năng và mục đích sử dụng ...
    Xác Định Vật Cản Bằng Cảm Biến Hồng Ngoại
    Hướng dẫn sử dụng cảm biến hồng ngoại - infrared sensor, ứng dụng trong ...
    Điều Khiển Động Cơ Servo Với Adruino
    Tìm hiểu cách hoạt động của động cơ servo và cách lập trình hoạt động ...
    Heap Sort - Thuật Toán Sắp Xếp Vun Đống
    Với độ phức tạp trong trường hợp xấu nhất bằng O (n log n), giải thuật ...
    SmartHome - Tổng Thể hay Rời Rạc
    Các thiết kế dựa vào tổng thể (1 giải pháp đóng gói) hay rời rạc từng ...
    Sự Khác Biệt giữa Wi-Fi và Zigbee
    Phổ biến trong hệ thống mạng không dây hiện nay đó chính là Wi-Fi và ...
    Sử Dụng graphics.h Để Xây Dựng Ứng Dụng Đồ Họa
    Hướng dẫn bạn đọc sử dụng Borland Graphics Interface để xây dựng ứng ...
    Khi bạn nhấn vào liên kết sản phẩm do STDIO đề xuất và mua hàng, STDIO có thể nhận được hoa hồng. Điều này hỗ trợ STDIO tạo thêm nhiều nội dung hữu ích. Tìm hiểu thêm.
    STDIO
    Trang chính
    Công ty TNHH STDIO

    30, Trịnh Đình Thảo, Hòa Thạnh, Tân Phú, Hồ Chí Minh
    +84 28.36205514 - +84 942.111912
    developer@stdio.vn

    383/1 Quang Trung, Phường 10, Quận Gò Vấp, Hồ Chí Minh
    Số giấy phép ĐKKD: 0311563559 do sở Kế hoạch và Đầu Tư TPHCM cấp ngày 23/02/2012

    ©STDIO, 2013 - 2020