Giới Thiệu Mạch đếm sản phẩm dùng cảm biến hồng ngoại

Ví dụ về hệ thống bộ đếm.

Mạch đếm sản phẩm dùng cảm biến hồng ngoại : Trong bài viết này, mình sẽ thiết kế Mạch đếm sản phẩm dùng cảm biến hồng ngoại Chi tiết hơn, mình sẽ sử dụng cảm biến IR để phát hiện vật thể để làm bộ đếm.

Các Ứng dụng thường được sử dụng :

  • Đếm những người đi qua một lối đi hoặc lối vào nhất định. Ví dụ, trong các tòa nhà thương mại có các cổng kiểm soát sự ra vào hoặc hiện diện của người dùng thường được sử dụng để tối ưu hóa việc tiêu thụ năng lượng;
  • đếm đồ vật hoặc hàng hóa trong lĩnh vực công nghiệp;
  • Vân vân.

Mạch đếm sản phẩm dùng cảm biến hồng ngoại đếm sản phẩm dùng cảm biến hồng ngoại có thể được tạo ra không chỉ với công nghệ IR mà còn với các hệ thống hình ảnh nhiệt sử dụng một loạt các cảm biến phát hiện nguồn nhiệt hoặc sử dụng thị giác máy thường yêu cầu các thuật toán xử lý hình ảnh phức tạp.

Giới thiệu ứng dụng: bộ đếm với công nghệ IR

Khoảng cách từ đối tượng là rất quan trọng và trong một số trường hợp, cảm biến IR không thích hợp cho các ứng dụng này. Nếu khoảng cách từ vật thể lớn hơn 20-30cm, cảm biến siêu âm có thể là lựa chọn tốt hơn.

mình cần biết khi nào cảm biến IR thay đổi trạng thái của nó từ CAO sang THẤP và đếm số lần chuyển đổi này xảy ra: đây được gọi là phát hiện thay đổi trạng thái .  Để biết thêm thông tin về nguyên tắc hoạt động của cảm biến hồng ngoại .

Mạch đếm sản phẩm dùng cảm biến hồng ngoại hai chiều

Các bộ đếm cao cấp sử dụng phần cứng phức tạp cho quá trình đếm. Project của mình là một bộ đếm đối tượng đơn giản dựa trên Arduino và hai cảm biến IR. Chi tiết hơn, nó là bộ đếm từ 0 đến 9, trong đó cảm biến đầu tiên được sử dụng để đếm những vật đến, cảm biến thứ hai là những người đi ra. Sự khác biệt (IN – OUT) được hiển thị trên LED 7 đoạn.

Mô tả phần cứng: LED 7  đoạn

LED 7 đoạn và chân cắm của nó.

Tập trung vào LED 7 đoạn SMA42056,  đây là một linh kiện điện tử được thiết kế để hiển thị số và thường được sử dụng trong đồng hồ kỹ thuật số, đồng hồ điện tử và các loại LED số khác.

SMA42056 là LED 7 đoạn cathode chung với một đoạn bổ sung cuối cùng được gọi là dấu thập phân hoặc đơn giản là dấu chấm, được biểu thị bằng chữ P (Xem Hình 2), được sử dụng để hiển thị các số không phải số nguyên. Mỗi đoạn chỉ là một đèn LED đơn giản và thường được biểu thị bằng các chữ cái từ A đến G. LED 7 đoạn không nhúng một điện trở nối tiếp cho mỗi đèn LED và điều khiển chúng với điện áp một chiều không đổi có thể làm hư vĩnh viễn các điểm nối: tránh điều này mình sẽ sử dụng một điện trở nối tiếp 220Ω cho mỗi đèn LED.

Giải thích về Demo Bộ đếm hai chiều

Thiết lập bản trình diễn Bộ đếm đối tượng.

Mạch sẽ đếm các đối tượng không trong suốt đang đi qua hai cổng IR: cổng đầu tiên tạo ra số tăng trên bộ đếm tổng, cổng thứ hai tạo ra số giảm. Vì mạch khá đơn giản và sử dụng led một chữ số, ứng dụng của mình sẽ kiểm tra xem có hai điều đã xảy ra:

  1. Số đếm không được biểu diễn bằng số âm;
  2. Số đếm không được biểu diễn bằng số lớn hơn 9;

BOM (Bill of Materials) của mạch là:

  • Bo mạch Arduino UNO ;
  • 2 x cảm biến IR fc-51 ;
  • 1 x LED 7-đoạn SMA42056 ;
  • 8 x R = 220Ω .

Mạch nguyên lý

Sơ đồ được sử dụng trong bản trình diễn bộ đếm đối tượng

Để điều khiển LED 7 đoạn, mình cần có 7 PIN đầu ra kỹ thuật số như trong Hình 4. Ta cũng cần đọc thông tin từ hai cảm biến IR . Điều này yêu cầu sử dụng 9 chân kỹ thuật số.

Trong trường hợp, ta đã sử dụng chân từ D2 đến D10 của Arduino. Để làm rõ ràng hơn, mình đã xác định số PIN để gán tên riêng cho chúng. Lưu ý rằng, các tham số không đổi tại thời gian chạy và do đó, được xác định tại thời điểm biên dịch, mình đang sử dụng các chỉ thị tiền xử lý.

Sử dụng lệnh “define”, mình không chỉ giảm chiếm dụng bộ nhớ mà còn tối ưu hóa việc thực thi chương trình.

mình được xác định các chân kỹ thuật số (từ D2 đến D8) mà sẽ sử dụng để điều khiển led là DISP_PIN_x (x từ 0 đến 6). Hai chân đầu ra của cảm biến IR (D9 và D10) đã được xác định là IR1 và IR2.

/*===========================================================================*/
/* PIN-map. */
/*===========================================================================*/
#define DISP_PIN_0 2 /* digital pin input for segment A */
#define DISP_PIN_1 3 /* digital pin input for segment B */
#define DISP_PIN_2 4 /* digital pin input for segment C */
#define DISP_PIN_3 5 /* digital pin input for segment D */
#define DISP_PIN_4 6 /* digital pin input for segment E */
#define DISP_PIN_5 7 /* digital pin input for segment F */
#define DISP_PIN_6 8 /* digital pin input for segment G */
#define IR1 9 /* digital pin input for ir sensor */
#define IR2 10 /* digital pin input for ir sensor */

mình cũng đã xác định một số hằng số bổ sung:

  • NUMB_OF_PRESET, đó là số lượng đặt trước được lưu trữ trong Lookup table (tức là 10 vì mình sẽ sử dụng các chữ số từ 0 đến 9);
  • NUMB_OF_SEGMENTS, đó là các  đoạn hiển thị mà mình đang sử dụng;
  • MAX_NUMB, đó là giới hạn phạm vi đếm lớn nhất.
/*===========================================================================*/
/* Constant values */
/*===========================================================================*/
#define NUMB_OF_PRESET 10 /* Available preset */
#define NUMB_OF_SEGMENTS 7 /* Available segments */
#define MAX_NUMB 9 /* High counting range limit */

Có một số giá trị không đổi khác được khai báo trong code của mình, dù sao để dễ sử dụng, mình ưu tiên lưu trữ chúng vào một mảng bidimensional được gọi là displaySEG là một Lookup table: nói cách khác, nó là một tập hợp các mã PIN đặt trước cần thiết để hiển thị một chữ số nhất định trên màn hình hiển thị.

Trong khi các hàng biểu thị chữ số, các cột biểu thị từng đoạn (LED) của màn hình. Ví dụ, để hiển thị số 0, tất cả các đoạn ngoại trừ G phải được đặt là CAO (xem Hình 2). Phần tử đầu tiên của mảng lưu trữ cấu hình theo yêu cầu của mỗi DISP_PIN để hiển thị 0. Vì vậy, mình có thể sử dụng mảng displaySEG [0] trong một vòng lặp để đặt từng DISP_PIN theo giá trị đặt trước của mình và lấy số 0 của mình.

  /*===========================================================================*/
/* Lookup table. */
/*===========================================================================*/
const byte displaySEG[NUMB_OF_PRESET][NUMB_OF_SEGMENTS] = {
/* A B C D E F G */
{ HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, LOW }, /* 0 */
{ LOW, HIGH, HIGH, LOW, LOW, LOW, LOW }, /* 1 */
{ HIGH, HIGH, LOW, HIGH, HIGH, LOW, HIGH }, /* 2 */
{ HIGH, HIGH, HIGH, HIGH, LOW, LOW, HIGH }, /* 3 */
{ LOW, HIGH, HIGH, LOW, LOW, HIGH, HIGH }, /* 4 */
{ HIGH, LOW, HIGH, HIGH, LOW, HIGH, HIGH }, /* 5 */
{ HIGH, LOW, HIGH, HIGH, HIGH, HIGH, HIGH }, /* 6 */
{ HIGH, HIGH, HIGH, LOW, LOW, LOW, LOW }, /* 7 */
{ HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH }, /* 8 */
{ HIGH, HIGH, HIGH, HIGH, LOW, HIGH, HIGH }, /* 9 */
};

mình cần các biến bổ sung là trạng thái của cảm biến IR được đặt tên là IRx_out (với x 1 hoặc 2), một biến để lưu trữ giá trị đếm và một biến chung được sử dụng trong các vòng lặp.

int IR1_out = HIGH; /* Avoiding initial false detections. */
int IR2_out = HIGH; /* Avoiding initial false detections. */
int counter = 0;
int i = 0;

Các chức năng được giải thích

setDisplayValue()

Hàm này viết một số từ 0 đến 9 trên màn hình. Chi tiết hơn, tham số n đại diện cho số hiển thị trên màn hình của mình. Lưu ý rằng n% 10 là bắt buộc để tránh tình trạng tràn bộ đệm cuối cùng.

void setDisplayValue(int n) {
for(i = 0; i < NUMB_OF_SEGMENTS; i++){
digitalWrite(DISP_PIN_0 + i, displaySEG[n % 10][i]);
}
}

initDisplay()

Đây không phải là một chức năng mà là một macro mà ridefine setDisplayValue chuyển 0 làm đối số. Macro này được sử dụng để đặt lại hiển thị khi khởi động. Lưu ý rằng bằng cách sử dụng các lệnh tiền xử lý, mình vẫn đang tối ưu hóa các bộ nhớ và hiệu suất tránh để tạo bản ghi kích hoạt bổ sung .

#define initDisplay() setDisplayValue(0)

increaseAndDisplay()

Chức năng này tăng bộ đếm và cập nhật màn hình. Lưu ý rằng, nếu bộ đếm lớn hơn MAX_NUMB thì nó sẽ kết thúc thành 1.

void increaseAndDisplay() {
counter++;
if(counter > MAX_NUMB) {
counter = 1;
}
setDisplayValue(counter);
}
decreaseAndDisplay()

Chức năng này giảm bộ đếm và cập nhật màn hình. Lưu ý rằng, nếu bộ đếm bằng 0 thì nó không có tác dụng gì: theo cách này, mình đang tránh các số âm.

void decreaseAndDisplay() {
if(counter) {
counter--;
setDisplayValue(counter);
}
}

Code chính

setup()
TRUNG TÂM SỬA CHỮA ĐIỆN TỬ QUẢNG BÌNH
MR. XÔ - 0901.679.359 - 80 Võ Thị Sáu, Phường Quảng Thuận, tx Ba Đồn, tỉnh Quảng Bình
Sửa điện tử tại Quảng Bình

Thiết lập () đặt các chế độ chân: IRx làm đầu vào và DISP_PIN_x làm đầu ra. Hơn nó gọi là initDisplay () hiển thị số 0 trên SMA42056 của mình .

void setup() {
Serial.begin (9600);
pinMode(IR1, INPUT);
pinMode(IR2, INPUT);
/* Setting Display related PIN as OUTPUT */
for(i = 0; i < NUMB_OF_SEGMENTS; i++){
pinMode(DISP_PIN_0 + i, OUTPUT);
} 
initDisplay();
}

loop()

Vòng lặp đọc các trạng thái IR được lưu trong chúng vào IRx_out. Khi IR phát hiện một đối tượng không trong suốt thì giá trị của nó là THẤP. Lưu ý rằng cần có độ trễ để tránh phát hiện sai.

void loop() {
IR1_out = digitalRead(IR1);
IR2_out = digitalRead(IR2);
if(IR1_out == LOW) {
increaseAndDisplay();
delay(500);
}
if(IR2_out == LOW) {
decreaseAndDisplay();
delay(500);
} 
delay(100);
}

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

53 − = 52