LED7 đoạn đơn

Một phần của tài liệu Nghiên cứu, phát triển hệ thống ĐIỀU KHIỂN ĐÈN GIAO THÔNG sử dụng hệ điều hành FreeRTOS (Trang 31)

Cấu tạo và nguyên lý hoạt động

Mỗi đèn LED 7 đoạn có chân đưa ra khỏi hộp hình vng, mỗi chân sẽ được gán cho một chữ cái từ a đến g tương ứng với mỗi chân led. Những chân khác được nối lại với nhau thành một chân chung.

Như vậy bằng cách phân cực thuận (forward biasing) các chân của led theo một thứ tự cụ thể, một số đoạn sẽ sáng và một số đoạn khác không sáng cho phép hiển thị ký tự mong muốn. Điều này cho phép chúng ta hiển thị các số thập phân từ 0 đến 9 trên cùng một led 7 đoạn.

Chân chung được sử dụng để phân loại LED 7 đoạn. Vậy LED 7 thanh có 2 loại chính là:

 Chân Anode chung (CA) (chân + các LED mắc chung lại với nhau)  Chân Catode chung (CC) (chân – các LED mắc chung lại với nhau) Cách hoạt động loại CC: Tất cả các chân cathode được nối với nhau và nối đất, hay logic là 0. Mỗi phân đoạn được chiếu sáng bằng cách sử dụng điện trở đặt tín hiệu logic 1 (hay mức high) để phân cực thuận từng cực anode (từ a đến g) .

Hình 2. 17. LED 7 đoạn chân Cathode chung (CC)

Cách hoạt động của loại CA: Tất cả các chân anode được nối với nhau với logic là 1. Mỗi phân đoạn được chiếu sáng bằng cách sử dụng điện trở tín hiệu logic 0 (hay low) vào các cực cathode (từ a đến g) .

Hình 2. 18. Đèn LED 7 đoạn chân Anode chung (CA)

Nói chung loại CA phổ biến hơn trong 2 loại. Loại CA không thay thế được cho loại CC trong mạch điện, và ngược lại vì cách nối đèn led bị đảo ngược.

Tùy vào chữ số thập phân nào được hiển thị mà một bộ đèn led cụ thể sẽ được phân cực thuận. Ví dụ để hiển thị chữ số 0, cần phải chiếu sáng 6 đoạn tương ứng là a, b, c, d, e và f. Như vậy các số từ 0 đến 9 có thể hiển thị bằng 1 led 7 đoạn như hình bên dưới.

o Kết nối IC 74HC595 với đèn LED 7 đoạn

Bảng 2. 10. Kết nối 74HC595 với LED 7 đoạn

LED 7 đoạn 74HC595 1 (e) Q4 (4) 2 (d) Q3 (3) 4 (c) Q2 (2) 5 (dp) Q7 (7) 6 (b) Q1 (1) 7 (a) Q0 (15) 9 (f) Q5 (5) 10 (g) Q6 (6)

2.2.7 Khối động cơ Servo

Yêu cầu thiết kế

Khối này điều khiển Barrier kéo lên, hạ xuống.

Gồm 4 servo tương ứng với đèn đi bộ 1, 2, 3, 4 là servo 1, servo 2, servo 3, servo 4.

Phương án phần cứng

Vì hệ thống nhỏ nên ta sẽ chọn loại động cơ servo 5V mini là đủ đáp ứng cho yêu cầu điều khiển, tối đa giải pháp kinh tế.

Kết nối Arduino

Bảng 2. 11. Kết nối Arduino với Servo.

STT Servo Arduino Uno

1 3.3V 3.3V

2 Control pin Pin 10 (servo 1), Pin 2 (servo 2), Pin 3 (servo 3), Pin 13 (servo 4)

3 GND GND

Giải thích nguyên lý

Khi có tín hiệu từ Arduino gửi về thơng qua Control Pin, Servo sẽ điều khiển Barrier kéo lên/ hạ xuống.

Hình 2. 20. Dây cắm Test Board

Hình 2. 21. Cáp USB

Hình 2. 22. Điện trở 220 Ohm

2.3 Thiết kế phần mềm

2.3.1 Lập trình Arduino

Arduino là một nền tảng điện tử mã nguồn mở dựa trên phần cứng và phần mềm dễ sử dụng được dùng để xây dựng các dự án điện tử.

Tất cả các bo mạch Arduino đều có một điểm chung là vi điều khiển. Một bộ vi điều khiển về cơ bản là một máy tính thực sự nhỏ.

Với Arduino, bạn có thể thiết kế và xây dựng các thiết bị có thể tương tác với mơi trường xung quanh nó. Bo mạch Arduino về cơ bản là một công cụ để điều khiển thiết bị điện tử. Nó có thể đọc đầu vào bằng bộ vi điều khiển đã được tích hợp.

Những tính năng chính như:

o Bo mạch Arduino có thể đọc tín hiệu đầu vào tương tự hoặc kỹ thuật số từ các cảm biến khác nhau và biến nó thành đầu ra như kích hoạt động cơ, bật / tắt đèn LED, kết nối với đám mây và nhiều hành động khác.

o Bạn có thể kiểm sốt các chức năng của bo mạch bằng cách gửi một bộ hướng dẫn đến bộ vi điều khiển trên bo mạch thông qua Arduino IDE (được gọi là phần mềm tải lên).

o Không giống như hầu hết các bảng mạch lập trình trước đây, Arduino khơng cần thêm một phần cứng (được gọi là bộ lập trình) để tải mã mới lên bảng mà chỉ cần sử dụng cáp USB.

o Arduino IDE sử dụng phiên bản C ++ đơn giản hóa, giúp việc học lập trình trở nên dễ dàng hơn.

Các cài đặt chương trình Arduino IDE

Bước 1: Truy cập địa chỉ http://arduino.cc/en/Main/Software/... . Đây là nơi

lưu trữ cũng như cập nhật các bản IDE của Arduino. Bấm vào mục Windows Zip file for non admin install như hình minh họa.

Hình 2. 23. Các bản IDE của Arduino

Ta sẽ được chuyển đến một trang mời quyền góp tiền để phát triển phần mềm cho Arduino, tiếp tục bấm JUST DOWNLOAD để bắt đầu tải.

Hình 2. 24. Chọn Just Download để cài đặt

Bước 3: Chạy file trong thư mục arduino-1.8.16\ để khởi động Arduino IDE

Hình 2. 25. Giao diện Arduino IDE

Vùng lệnh: Bao gồm các nút lệnh menu (File, Edit, Sketch, Tools, Help). Phía dưới là các icon cho phép sử dụng nhanh các chức năng thường dùng của IDE được miêu tả như sau:

Hình 2. 26. Vùng lệnh của Arduino IDE

Những thơng báo từ IDE sẽ được hiển thị tại vùng thông báo. Để ý rằng góc dưới cùng bên phải hiển thị loại board Arduino và cổng COM được sử dụng. Luôn chú ý tới mục này bởi nếu chọn sai loại board hoặc cổng COM, bạn sẽ khơng thể upload được code của mình.

Hình 2. 27. Vùng thơng báo của Arduino IDE

2.3.2 Thư viện FreeRTOS

FreeRTOS là một hệ điều hành thời gian thực (RTOS) được thiết kế đủ nhỏ để chạy trên một vi xử lý. FreeRTOS chỉ cung cấp chức năng lập lịch thời gian thực lõi, truyền thông liên tác vụ, định thời và đồng bộ. Điều đó có nghĩa nó thực sự được mơ tả như một nhân thời gian thực, hoặc thực thi thời gian thực. FreeRTOS khả dụng với 35 kiến trúc xử lý, với hàng triệu nhà phát triển sản phẩm... Dự án khởi động cho LM3S811 có thể được biên dịch lại dễ dàng để chạy bất kì bộ vi điều khiển Cortex M nào của Texas Instruments.

FreeRTOS được thiết kế phù hợp cho nhiều hệ nhúng nhỏ gọn vì nó chỉ triển khai rất ít các chức năng như: Cơ chế quản lý bộ nhớ và tác vụ cơ bản, các hàm API quan trọng cho cơ chế đồng bộ. Nó khơng cung cấp sẵn các giao tiếp mạng, drivers, hay hệ thống quản lý tệp (file system) như những hệ điều hành khác. Tuy vậy, FreeRTOS có nhiều ưu điểm, hỗ trợ kiến trúc vi điều khiển khác nhau (PIC, AVR, MSP430, ARM…), kích thước nhỏ gọn, phát triển với nhiều trình biên dịch C khác nhau (GCC, OpenWatcom, Keil, IAR, Esclipse…), cho phép không giới hạn các tác vụ chạy đồng thời, không hạn chế quyền ưu tiên thực thi, khả năng khai thác phần cứng. Ngoài ra, nó cũng cho phép triển khai các cơ chế điều độ giữa các tiến trình như: hàng đợi (queue), cờ đếm (counting semaphore), loại trừ lẫn nhau (mutex).

FreeRTOS là một hệ điều hành nhúng thời gian thực (Real Time Operating System) mã nguồn mở được phát triển bởi Real Time Engineer Ltd, sáng lập và sở hữu bởi Richarf Barry.

FreeRTOS là một hệ điều hành nhúng rất phù hợp cho nghiên cứu, học tập về các kỹ thuật, công nghệ trong viết hệ điều hành nói chung và hệ điều hành nhúng thời gian thực nói riêng, cũng như việc phát triển mở rộng tiếp các thành phần cho hệ điều hành (bổ sung mơ-đun, trình điều khiển, chuyển đổi mơi trường thực hiện).

Cài đặt FreeRTOS trong Arduino IDE

Ở giao diện chính của Aruduino IDE, Sketch > Include Library > Manage

Libraries. Search từ khóa FreeRTOS và nhấn Install để cài đặt thư viện:

Hình 2. 28. Cài đặt thư viện FreeRTOS trong Arduino IDE

Một tác vụ là một chương trình, chương trình này chạy liên tục trong vịng lặp vơ tận và không bao giờ dừng lại. Trong FreeRTOS mỗi luồng thực thi được gọi là tác vụ. Một chương trình thường sẽ có nhiều tác vụ con khác nhau.

Hệ thống đèn giao thông gồm 3 chế độ chuyển đổi bình thường, giờ cao điểm, ban đêm. Để dễ dàng quản lý các chế độ nhóm chia hệ thống thành 3 tác vụ Task1 (chế độ bình thường), Task2 (chế độ giờ cao điểm), Task3 (chế độ ban đêm).

Tạo tác vụ

Nguyên mẫu hàm API xTaskCreate ()

BaseType_t xTaskCreate (TaskFuntion_t task_function, const char *task_name,

uint16_t stack_depth, void *param,

UBaseType_t priority,

TaskHandle_t *task_handler); Trong đó:

o task_function: Con trỏ đến task function được dùng để tạo task mới. o task_name: Con trỏ đến string chứa tên của task. Kích thước tối đa của

task name được quy định trong hằng số

configMAX_TASK_NAME_LEN (trong file config của FreeRTOS) o stack_depth: Độ lớn của stack được cấp phát cho task, Idle task sử dụng

stack_depth được quy định bởi hằng số

configMINIMAL_STACK_SIZE và stack_depth của task tạo ra phải lớn hơn giá trị này.

o param: Con trỏ đến đối số được truyền cho task, kiểu pointer to void. priority: Mức độ ưu tiên của task được tạo, với 0 là mức thấp nhất (của Idle task) max là configMAX_PRIORITIES -1.

o task_handler: con trỏ đến task sẽ được tạo, được dùng để truyền vào các API như vTaskDelete (), vTaskPrioritySet (). Có thể truyền NULL nếu không sử dụng.

Kết quả trả về:

o pdPass: task được tạo thành công

o pdFAIL: task không được tạo do thiếu bộ nhớ heap.

Ban đầu tạo 3 tác vụ Task1, Task2, Task3 có mức ưu tiên là như nhau là 1. o Task1

o Task2

xTaskCreate (Task2, "CheDo2", 256, NULL, 1, &TaskHandle_2); o Task3

xTaskCreate (Task3, "CheDo3", 256, NULL, 1, &TaskHandle_3);  Thay đổi mức độ ưu tiên

Khi chuyển đổi hệ thống thực hiện một chế độ nào đó thì tác vụ của chế độ đó sẽ được thay đổi lên mức ưu tiên cao nhất để được thực hiện.

Nguyên mẫu hàm API vTaskPrioritySet ()

void vTaskPrioritySet (TaskHandle_t task_handler, UBaseType_t new_priority); Trong đó

o task_handler: con trỏ đến task sẽ được tạo, được dùng để truyền vào các API như vTaskDelete (), vTaskPrioritySet (). Có thể truyền NULL nếu khơng sử dụng.

o new_priority: Mức độ ưu tiên mới.

Khi số lần người điều khiển nhấn nút chia hết cho 3 thì Task1 thay đổi độ ưu tiên của chính nó lên mức cao nhất là 2 để hệ thống hoạt động chế độ bình thường. Khi số lần nhấn nút chia cho 3 dư 1 thì Task1 thay đổi độ ưu tiên của Task2 lên cao nhất là 2 và thay đổi độ ưu tiên của nó về 1 để hệ thống hoạt động chế độ giờ cao điểm.

Task1

void Task1(void* pvParameters) { while (1) { if (butPushCounterM%3==0) { vTaskPrioritySet (TaskHandle_2, 1); vTaskPrioritySet (NULL, 2); vTaskPrioritySet (TaskHandle_3, 1); } Serial.println("Vao che do 1");

For (long point=30; point>0; point--) { if (butPushCounterM%3! =0) break;

s2. write (90); s4. write (90);

s3. write (0);

HienThiLED7doan (point, 8,5);

DenSang(0b0101100,0b10110010,0b00001000); delay (1000);

}

for (long point=5; point>0; point--) { if (butPushCounterM%3! =0) break; s2. write (0); s4. write (0); s1. write (0); s3. write (0); HienThiLED7doan (point, 8, 0); DenSang(0b00101010,0b10101001,0b00000100); delay (1000); }

for (long point=20; point>5; point--) { if (butPushCounterM%3! =0) break; s1. write (90); s3. write (90); s2. write (0); s4. write (0); HienThiLED7doan (point, 8, -5); DenSang(0b10010001,0b01000101,0b00000110); delay (1000); }

for (long point=5; point>0; point--) { if (butPushCounterM%3! =0) break; s3. write (0); s2. write (0); s4. write (0); HienThiLED7doan (point, 8, 0); DenSang(0b01001001,0b00100101,0b00000101); delay (1000); }

if (butPushCounterM%3==1) { vTaskPrioritySet (TaskHandle_2, 2); vTaskPrioritySet (NULL, 1); vTaskPrioritySet (TaskHandle_3, 1); } } }

Khi số lần người điều khiển nhấn nút chia cho 3 dư 1 thì Task2 thay đổi độ ưu tiên của chính nó lên mức cao nhất là 2 để hệ thống hoạt động chế độ giờ cao điểm. Khi số lần nhấn nút chia cho 3 dư 2 thì Task2 thay đổi độ ưu tiên của Task3 lên cao nhất là 2 và thay đổi độ ưu tiên của nó về 1 để hệ thống hoạt động chế độ ban đêm.

Task2 while (1) { if (butPushCounterM%3 ==1) { vTaskPrioritySet (TaskHandle_1, 1); vTaskPrioritySet (NULL, 2); vTaskPrioritySet (TaskHandle_3, 1); } Serial.println("Vao che do 2");

for (long point=40; point>0; point--) { if (butPushCounterM%3! =1) break; s2. write (90); s4. write (90); s1. write (0); s3. write (0); HienThiLED7doan (point, 8,5); DenSang(0b0101100,0b10110010,0b00001000); delay (1000); }

for (long point=5; point>0; point--) { if (butPushCounterM%3! =1) break; s2. write (0);

s1. write (0); s3. write (0); HienThiLED7doan (point, 8, 0); DenSang(0b00101010,0b10101001,0b00000100); delay (1000); }

for (long point=30; point>5; point--) { if (butPushCounterM%3! =1) break; s1. write (90); s3. write (90); s2. write (0); s4. write (0); HienThiLED7doan (point, 8, -5); DenSang(0b10010001,0b01000101,0b00000110); delay (1000); }

for (long point=5; point>0; point--) { if (butPushCounterM%3! =1) break; s3. write (0); s2. write (0); s4. write (0); HienThiLED7doan (point, 8, 0); DenSang(0b01001001,0b00100101,0b00000101); delay (1000); } if (butPushCounterM%3 ==2) { vTaskPrioritySet (TaskHandle_1, 1); vTaskPrioritySet (NULL, 1); vTaskPrioritySet (TaskHandle_3, 2); } } }

Khi số lần người điều khiển nhấn nút chia cho 3 dư 2 thì Task3 thay đổi độ ưu tiên của chính nó lên mức cao nhất là 3 để hệ thống hoạt động chế độ giờ cao điểm.

Khi số lần nhấn nút chia hết cho 3 thì Task3 thay đổi độ ưu tiên của Task1 lên cao nhất là 2 và thay đổi độ ưu tiên của nó về 1 để hệ thống hoạt động chế độ bình thường.

Task3

void Task3(void* pvParameters) { while (1) { Serial.println(butPushCounterM); if (butPushCounterM%3==2) { vTaskPrioritySet (TaskHandle_1, 1); vTaskPrioritySet (NULL, 2); vTaskPrioritySet (TaskHandle_2, 1); } Serial.println("Vao che do 3"); for (; ;) { if (butPushCounterM%3! =2) break; s1. write (90); s2. write (90); s3. write (90); s4. write (90); DenSang(0b01000010,0b00001000,0b00000001); HienThiLED7doan (0, 8, 0); delay (1000); DenSang(0b00000000,0b00000000,0b00000000); delay (1000); } if (butPushCounterM%3 ==0) { vTaskPrioritySet (TaskHandle_1, 2); vTaskPrioritySet (NULL, 1); vTaskPrioritySet (TaskHandle_2, 1); } } } b. Quản lý ngắt

Ngắt là sự kiện dừng công việc hiện tại của CPU, buộc CPU thực hiện một việc nào đó rồi mới quay trở lại thực hiện tếp công việc cũ. Trong hệ thống nhúng, khi có tín hiệu Interrupt, tác vụ đang chạy sẽ bị ngừng lại, thay vào đó Interrupt Service Routine (ISR) sẽ được thực thi. Sau khi ISR hồn thành cơng việc, tác vụ ban đầu sẽ được thực thi tiếp.

Hình 2. 29. Quy trình thực hiện ngắt

Trong Arduino Uno được hỗ trợ hai loại ngắt như sau:

o Ngắt số 0 được nối với chân số 2

o Ngắt số 1 được nối với chân số 3 Cấu trúc hàm ngắt trong Arduino

attachInterrupt (digitalPinToInterrupt (pin), ISR, mode) Trong đó:

o digitalPinToInterrupt (pin): Ngắt tại chân tương ứng với số pin muốn sử dụng để kích hoạt ngắt bên ngồi.

o ISR: Tên hàm ISR mà ta muốn gọi mỗi khi có ngắt

o mode: Kiểu ngắt đang sử dụng (Change, Rising, Falling, Low, High). Có năm loại kích hoạt ngắt Arduino:

o Change: Khi tín hiệu thay đổi ngay cả khi tín hiệu tăng hoặc tín hiệu giảm hoặc nếu tín hiệu ở trạng thái thấp ở 0 hoặc nếu tín hiệu ở trạng thái cao thì kích hoạt 5V.

o Rising: Trên một cạnh tăng, tín hiệu đi từ thấp đến cao có nghĩa là tín hiệu kích hoạt từ 0V đến 5V.

o Falling: Trên một cạnh giảm, tín hiệu đi từ cao xuống thấp có nghĩa là tín hiệu được kích hoạt từ 5V đến 0V.

o Low: Thấp là sự kích hoạt liên tục bất cứ khi nào tín hiệu ở mức thấp hay nói cách khác là tín hiệu trên 0V.

o High: Cao là sự kích hoạt liên tục bất cứ khi nào tín hiệu ở mức cao hay nói cách khác là tín hiệu trên 5V.

Trong hệ thống, nhóm sử dụng nút nhấn được nối với ngắt số 0 của chân số 2. int butM = 2;

int butPushCounterM =0; pinMode (butM, INPUT);

attachInterrupt (digitalPinToInterrupt (butM), button, RISING); void button () {

butPushCounterM++; }

Khi button được nhấn, tín hiêu đi từ thấp đến cao thì hàm button () được gọi và thực hiện tăng giá trị biến (butPushCounterM) lên 1.

2.4 Tổng kết chương 2

Trong chương 2, báo cáo đã nêu lên được các chức năng cần thiết của hệ thống là hiển thị đèn tín hiệu giúp phân luồng giao thơng tại ngã tư. Bên cạnh đó, chương 2 đã chỉ rõ sơ đồ nguyên lý, sơ đồ thiết kế các chức năng của hệ thống. Trình bày cụ thể cách kết nối giữa phần cứng và thiết kế thời gian chạy của từng đèn.

CHƯƠNG 3: KẾT QUẢ THỰC NGHIỆM3.1 Mơ hình hệ thống đèn tín hiệu giao thơng ở ngã tư 3.1 Mơ hình hệ thống đèn tín hiệu giao thơng ở ngã tư

Để thể hiện tính ứng dụng một cách trực quan của hệ thống vào thực tế nhóm đã tiến hành tiến hành thiết kế và thi công hệ thống đèn giao thơng như thực tế.

Hình 3. 1. Mơ hình hệ thống

3.2 Kết quả thực nghiệm

Tiến hành thực nghiệm 5 lần, mỗi lần thử nghiệm các đèn tín hiệu dành cho phương tiện giao thông, đèn dành cho người đi bộ và thanh chắn. Thời gian trễ cho phép của các đèn LED là 0.1 s đến 0.3 s và động cơ servo để điều khiển thanh chắn là 0.3 s đến 0.5 s.

Bảng 3. 1. Kết quả thử nghiệm của hệ thống

Số lần

thử Độ trễ của đèn tín hiệu (s) Độ trễ của thanh chắn (s)

2 0.3 1.625

3 0.5 2.125

4 0.3 2.75

5 0.2 4

Tiến hành chạy thử nghiệm các chế độ hoạt động đèn tín hiệu ở chế độ bình thường, chế độ giờ cao điểm và chế độ ban đêm thì hệ thống chạy theo các chế độ, hiển thị đèn tín hiệu và đèn đếm lùi đúng theo mục tiêu đề ra.

o Kết luận

o Đèn tín hiệu báo gần như đúng với khoảng thời gian cho phép, thời gian

Một phần của tài liệu Nghiên cứu, phát triển hệ thống ĐIỀU KHIỂN ĐÈN GIAO THÔNG sử dụng hệ điều hành FreeRTOS (Trang 31)

Tải bản đầy đủ (DOCX)

(63 trang)
w