Bảng 6. 6: Sơ đồ nối chân LCD với Arduino MEGA
LCD 1602 Arduino MEGA 2560
VSS (Ground) GND
VDD (+ve) 5V
Constrast Voltage (Vo)
Register Select (RS) D12 Read/Write (RW) GND Enable D11 Data 4 D5 Data 3 D4 Data 2 D3 Data 1 D2 Backlight Anode 5V Backlight Cathode GND
Hình 6. 9: Các chân module LCD 1602
6.3.6 Thiết kế khối nguồn
Chính là nguồn Adapter, chuyễn đổi điện 220V thành điện 9V cung cấp nguồn cho các thiết bị hoạt động (Arduino MEGA, Bluetooth HC05…)
Hình 6. 10: Adapter
6.3.7 Thiết kế giao diện phần mềm trên điện thoại
Trong đồ án này giao diện gồm các Components sau:
Nút kết nối: dùng để kết nối Bluetooth giữa điện thoại với mơ hình. Thơng
qua Bluetooth điện thoại sẽ thể hiện các thao tác đang được thực hiện trên mơ hình.
Nút Pan: có tổng cộng 4 nút Pan tương ứng với 4 lỗi được cài đặt sẵn trong
hệ thống. Khi giảng viên muốn tạo lỗi trên mạch cho sinh viên chẩn đoán sẽ nhấn các nút Pan tương ưng.
Các label chân đỏ, chân đen, giá trị điện áp: dùng để hiện các số chân đỏ,
chân đen khi sinh viên thực hiện thao tác đo mạch. Thơng qua đó giảng viên có thể giám sát quá trình chẩn đốn của sinh viên
Canvas: dùng để vẽ và mô phỏng các chuyển động. Ở đồ án này Canvas vẽ
mô phỏng lại 2 que đo chuyển động của nó trên mạch điện. Giao diện của Canvas là hình mạch điện cịi giống với mạch điện trên mơ hình. Khi sinh viên dùng que đo chẩn đốn trên mơ hình chân nào thì trên điện thoại cũng xuất hiện que đo với chân tương ứng.
Bluetoothclient: là chức năng ẩn trên AI2, dùng để kết nối Bluetooth giữa
điện thoại và mơ hình
Clock: là chức năng ẩn trên AI2, với chức năng tương ứng với void loop()
trong lập trình vi điều khiển. Thời gian quét của Clock có thể tùy chỉnh. File: là chức năng ẩn trên AI2, dùng lưu q trình chẩn đốn của sinh viên và
lưu nó trong file trong điện thoại.
6.4 Thiết kế phần mềm
6.4.1 Thiết kế phần mềm điện thoại
Lưu đồ phần mềm điện thoại
Lập trình phần mềm điện thoại
Lập trình khối hiển thị được chia thành các phần như sau:
Bluetooth: khi giảng viên nhấn nút kết nối trên giao diện điện thoại sẽ tìm
địa chỉ Bluetooth cần kết nối, khi đó nút nhấn đổi thành đang kết nối để báo cho giảng viên biết. Sau khi điện thoại kết nối với module HC-05 thành cơng nút nhấn báo đã kết nối.
Hình 6. 14: Blocks để kết nối Bluetooth
Tạo file lưu: giảng viên nhập mã số sinh viên tại ô MSSV đồng thời đó cũng
là tên file được lưu lại trong điện thoại. Giảng viên khơng cần xem trực tiếp q trình sinh viên làm bài mà có thể nhập mã số sinh viên và xem lại. Tại ô DELAY sẽ là thời gian ngắt quãng giữa 2 thao tác của sinh viên, giảng viên có thể tùy chỉnh thời gian này.
Hình 6. 15: Nhập tên file lưu và chạy chương trình
Khi giảng viên muốn xem lại file đã lưu chỉ cần nhập mã số sinh viên mong muốn. Block file.GotText bật lại quá trình sinh viên đã thực hiện bằng cách tách các giá trị được lưu và hiện trên điện thoại vào các ô tương ứng đang được nhấn (ô này được ẩn trên giao diện), chân đỏ, chân đen và giá trị điện áp. Ví dụ: khi điện thoại nhận 1 chuỗi gửi là 2, 1, 6, 12*. Điện thoại sẽ hiểu là mơ hình đang được tạo lỗi 2 và nút Pan2 chuyển màu đỏ, sinh viên đang đo quen đỏ ở chân 1, que đen ở chân 6 và giá trị điện áp là 12V.
Hình 6. 16: Blocks của quá trình xem lại
Tạo lỗi: khi giảng viên nhấn nút Pan1 điện thoại sẽ gửi số 1 đến cho Arduino
khi đó Arduino sẽ chạy chương trình void PanLoi1 (), thiết lập chế độ chạy lỗi đứt dây 7-8 cho hệ thống.
Hình 6. 17: Blocks của nút Pan1
Khi giảng viên nhấn nút Pan2 điện thoại sẽ gửi số 2 đến cho Arduino khi đó Arduino sẽ chạy chương trình void PanLoi2 (), thiết lập chế độ chạy lỗi đứt cầu chì 3-4 cho hệ thống.
Khi giảng viên nhấn nút Pan3 điện thoại sẽ gửi số 3 đến cho Arduino khi đó Arduino sẽ chạy chương trình void PanLoi3 (), thiết lập chế độ chạy lỗi đứt rơ le 5- 6 cho hệ thống.
Hình 6. 19: Blocks của nút Pan3
Khi giảng viên nhấn nút Pan4 điện thoại sẽ gửi số 4 đến cho Arduino khi đó Arduino sẽ chạy chương trình void PanLoi4 (), thiết lập chế độ chạy lỗi đứt dây 11- 12 cho hệ thống
Hình 6. 20: Blocks của nút Pan4
Vẽ que đo trên Canvas: trước tiên khởi tạo tọa độ x, y của các điểm đo với
x = 0, y = 0. Khởi tạo tiếp toa_do là 1 dãy các tọa độ tương ứng với các điểm cần đo trên điện thoại. Các biến vi_tri_do, vi_tri_den tương đương với thứ tự tọa độ trong list toa_do.
Hình 6. 21: Blocks khởi tạo các biến
Giá trị các tọa độ trong list toa_do được xác đinh bởi 1 dãy 6 số được ngăn cách bới dấu phẩy, trước dấu phẩy là tọa độ x, sau dấu phẩy là tọa độ y. Blocks
segment text trong AI2 dùng để tách chuỗi trong toa_do, ta tuần tự tách 3 số 1 lần. Khi đã xác định tọa độ cần vẽ dùng blocks call Canvas.Drawline để các que đo.
Hình 6. 22: Blocks lập trình que đo
Vịng lặp Clock: vịng lặp này chỉ chạy khi điện thoại đã được kết nối
Bluetooth. Mỗi khi sinh viên thực hiện thao tác chẩn đốn trên mơ hình thì Arduino sẽ 1 chuỗi 4 số được phân cách bởi dấu phẩy giữa các giá trị và dấu sao (*) là kí tự kết thúc chuỗi. Vịng lặp sẽ tách các giá trị và hiện trên điện thoại các ô tương ứng đang được nhấn (ô này được ẩn trên giao diện), chân đỏ, chân đen và giá trị điện áp. Ví dụ: khi được thoại nhận 1 chuỗi gửi từ Arduino 2, 1, 5, 12*. Điện thoại sẽ hiểu là mơ hình đang được tạo lỗi 2, sinh viên đang đo quen đỏ ở chân 1, que đen ở chân 5 và giá trị điện áp là 12V.
Hình 6. 23: Giao diện trên điện thoại
Xem lại file lưu: giảng chỉ cần nhập mã số sinh viên, thời gian ngắt quãng
giữa 2 thao tác của sinh viên là có thể xem lại được q trình làm bài của sinh viên. Vòng lặp Clock2 đọc giá trị liên tục từ file mssv.txt, thời gian vịng lặp này giảng viên có thể hiệu chỉnh được. Giảng viên nhấn Play để bắt đầu đọc file, trong q trình đọc file giảng viên có thể dừng lại bằng cách nhấn nút Pause.
6.4.2 Thiết kế phần mềm vi điều khiển
Lưu đồ khối vi điều khiển
Lập trình khối xử lý tín hiệu (board Arduino MEGA)
Lập trình hiển thị giá trị khởi tạo lên LCD
Sau khi các giá trị được đo kiểm thì LCD sẽ có nhiệm vụ đọc các giá trị lên màn hình. Do màn hình LCD 16x02 chỉ hiển thị được 2 dịng nên ở đây ưu tiên hiển thị mảng thời gian và hiển thị về giá trị điện áp
Code kết nối chân và hiển thị giá trị trên LCD:
#include <LiquidCrystal.h> // Thêm thư viện LiquidCrystal
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);// Khởi tạo các chân LCD 12,11,5,4,3,2
Lập trình khai báo biến
Lập trình khai báo biến là khởi tạo các giá trị cần thiết cho chương trình. Giá trị a và olda là giá trị trạng thái tín hiệu mới và cũ của chân đỏ. Hai giá trị này sẽ được so sánh với nhau, nếu chúng giống nhau có nghĩa là thao tác đo kiểm của sinh viên khơng có gì thay đổi nên nó sẽ khơng xuất giá trị, ngược lại nếu chúng khác nhau sẽ xuất ra giá trị trạng thái cho que đo đỏ. Giá trị b và oldb cũng tương tự.
int a, b, olda, oldb, dienap, t;
Khai báo các mảng tương ứng với các trạng thái của mơ hình: trạng thái bình thường chưa có lỗi, trạng thái được tạo lỗi, trạng thái tháo các linh kiện trong mạch ra đo kiểm.
int BT[] = {0, 12, 12, 12, 12, 0, 0, 0, 12, 12, 12, 12}; // Chế độ hoạt động bình thường khi nhấn còi
int PAN1[] = {0, 12, 12, 12, 12, 0, 0, 0, 0, 0, 0, 0}; // Chế độ đứt dây 7-8 int PAN2[] = {0, 12, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // Đứt cầu chì 3-4 int PAN3[] = {0, 12, 12, 12, 12, 0, 0, 0, 0, 0, 0, 0}; // Đứt rơ le 5-6
int PAN4[] = {0, 12, 12, 12, 12, 0, 0, 0, 0, 0, 0, 0}; // Đứt dây 10-11 khi khơng nhấn cịi
int PAN41[] = {0, 12, 12, 12, 12, 0, 0, 0, 12, 12, 0, 0}; // Đứt dây 10-11 khi nhấn còi
int BTT[] = {0, 12, 12, 12, 12, 0, 0, 0, 0, 0, 0, 0}; // Chế độ hoạt động khi không nhấn nút
Khởi tạo biến M, S để thiết lập thời gian làm bài. Thiết lập trong trường hợp này là 10 phút
int M = 10; // phút int S = 00; // giây
Khởi tạo time1 và time2 để tạo độ trễ cho 2 sự kiện liên tiếp. unsigned long time2 = 0;
unsigned long time1 = 0;
Khởi tạo biến giatri để xác định chế độ hoạt động của mạch còi. Nếu giatri thay đổi sẽ thay đổi chế độ hoạt động
byte giatri = 0; // Chế độ hoạt động bình thường Lập trình chương trình thiết lập
Ở phần void setup() ta thiết lập các điểm quét ở chế độ Input_Pullup, khởi tạo LCD và khai báo các chân công tắc, nút nhấn
Code lập trình chương trình thiết lập: void setup() {
lcd.begin(16, 2); //Thông báo đây là LCD 1602 for (int i = 1; i < 13; i++)
{
pinMode(i + 41, INPUT_PULLUP); // Thiết lập chân ở chế độ Pullup }
Serial.begin(9600);
pinMode(22, INPUT); // Thiết lập chân công tắc mở acquy pinMode(23, INPUT); // Thiết lập chân cơng tắc mở cầu chì pinMode(24, INPUT); // Thiết lập chân công tắc mở rơle
digitalWrite( 10, HIGH); // Thiết lập chân 10 ở giá trị HIGH pinMode(8, INPUT); // Thiết lập chân cơng tắc cịi
pinMode(7, OUTPUT); // Thiết lập chân tín hiệu cịi pinMode(9, INPUT); // Thiết lập chân công tắc Start lcd.setCursor(1, 0); lcd.print ("Time: "); lcd.setCursor(7, 0); lcd.print("0"); lcd.setCursor(8, 0); lcd.print(M); lcd.setCursor(9, 0); lcd.print(":"); lcd.setCursor(10, 0); lcd.print("0"); lcd.setCursor(11, 0); lcd.print(S); lcd.setCursor(0, 1); lcd.print("Volt:"); } Lập trình chương trình qt phím
- Q trình qt dùng để xác định 2 que đo đang ở vị trí nào trên mơ hình mạch còi xe. Việc quét thực hiện lần lượt từ chân chân đỏ (tương ứng với D40) tới chân đen (tương ứng với D41).
+ Nếu chân đỏ đang ở điểm đo nào trên mơ hình thì giá trị a (giá trị khi chân đỏ được quét) bằng vị trí điểm đo. Trong mơ hình mạch cịi xe thì có 12 điểm tương ứng với 12 vị trí đo cần xác định. Nếu chân đỏ không đo điểm nào trên mơ hình thì giá trị a bằng 0.
+ Chân đen tương tự chân đỏ nhưng giá trị chân đen sẽ là giá trị b. - Code lập trình chế độ chương trình qt phím:
void quetphim() {
pinMode(40, OUTPUT); // Chế độ Output của chân đỏ pinMode(41, INPUT); // Chế độ Input của chân đen for (int i = 1; i < 13; i++) { // 12 điểm đo if (digitalRead(i + 41) == 1) { a = 0; } if (digitalRead(i + 41) == 0) { a = i ; // Chân đỏ đang ở vị trí i break; } }
pinMode(40, INPUT); // Chế độ Input của chân đỏ pinMode(41, OUTPUT); // Chế độ Output của chân đen for (int k = 1; k < 13; k++) { if (digitalRead(k + 41) == 1) { b = 0; } if (digitalRead(k + 41) == 0) {
b = k; // Chân đen đang ở vị trí i
break;}}
Lập trình chương trình chế độ cịi
Khi 1 hệ thống cịi xe hoạt động bình thường thì phải đảm bảo còi xe phải kêu khi nhấn nút còi. Việc này được thực hiện bằng cách đọc giá trị của chân nút nhấn (chân D8). Nếu chân tín hiệu đang ở chế độ HIGH tương ứng với việc đang thực hiện nhấn cịi, lúc đó cịi sẽ kêu. Nếu chân tín hiệu đang ở chế độ LOW thì cịi sẽ khơng kêu.
Hình 6. 27: Sơ đồ dây giữa nút nhấn còi và Arduino
Code lập trình chế độ cịi: void HORN()
{
if (digitalRead(8) == HIGH){// Đọc tín hiệu chân số 8 ở chế độ HIGH digitalWrite(7,1); // Còi kêu
}
else digitalWrite(7,0); // Cịi khơng kêu }
Lập trình chương trình reset
Reset được thực hiện khi sinh viên muốn bắt đầu thực hiện một bài làm mới. Chức năng Reset sẽ khơi phục tồn bộ giá trị trở lại giá trị ban đầu. Từ đó, sinh viên có thể hồn thành tốt bài làm của mình mà khơng ảnh hưởng tới bài làm của người khác. Việc Reset được thực hiện qua việc nhấn nút. Khi nhấn nút Reset trên board Arduino thì tương ứng với việc bạn nối trực tiếp chân Reset trên board vào chân GND thông qua điện trở. Vì vậy, nếu muốn reset board bằng nút nhấn thì bạn có thể nối chân Reset vào 1 chân tín hiệu và biến chân tín hiệu đó thành GND.
Code lập trình chương trình RESET: void Reset()
{
digitalWrite(10, LOW); // Biến chân 10 thành chân GND }
Hình 6. 28: Sơ đồ dây giữa nút nhấn RESET và Arduino
Khi sinh viên muốn bắt đầu thực hiện bài làm, thì bắt buộc sinh viên đó phải nhấn nút START để chương trình bắt đầu hoạt động. Việc này được thực hiện bằng cách đọc giá trị của chân nút nhấn (chân D9). Nếu chân tín hiệu đang ở chế độ HIGH tương ứng với việc đang thực hiện nhấn nút, giá trị t=1 (khởi tạo giá trị t=0). Khi t=1 thì chương trình được thực hiện, cịn t=0 thì chương trình chính khơng thực hiện.
Code lập trình chương trình RESET: void START() { if (digitalRead(9)==HIGH){ t=1; } }
Hình 6. 29: Sơ đồ dây giữa nút nhấn START và Arduino
Lập trình chương trình ở các chế độ hoạt động
Trong hệ thống mơ phỏng mạch cịi xe có tất cả là 5 chế độ hoạt động: Bình thường, Pan 1, Pan 2, Pan 3, Pan4.
Ở chế độ hoạt động bình thường, giá trị điện áp ở mỗi vị trí được tạo ra từ 2 mảng một chiều từ đó xác định giá trị điện áp của mỗi vị trí
+ Khi nhấn cịi: int BT[] = { 0, 12, 12, 12, 12, 0, 0, 0, 12, 12, 12, 12}; + Khi khơng nhấn cịi int int BTT[] = { 0, 12, 12, 12, 12, 0, 0, 0, 0, 0, 0, 0};
Khi vị trí chân đo hiện tại khác vị trí trước đó (a != olda, b != oldb) thì vị trí các chân đo và điện áp sẽ được gửi đi thông qua cổng Serial
Ngồi ra, ở mỗi chế độ có các cơng tắc tháo/lắp. Việc đóng/mở cơng tắc được xác định bằng cách đọc giá trị từ các chân tín hiệu (chân D22, D23, D24). Nếu nếu chân tín hiệu đang ở chế độ LOW thì cơng tắc được bật. Các lệnh trong cơng tắc được thực hiện.
Ở các chế độ còn lại, cách thức hoạt động cũng tương tự với chế độ hoạt động bình thường, chỉ thay đổi các giá trị điện áp.
Code lập trình chế độ hoạt động bình thường: void Binhthuong()
{
if (digitalRead(22) == 0) BATT(); // Công tắc acquy được bật if (digitalRead(23) == 0) FUSE();// Cơng tắc cầu chì được bật if (digitalRead(24) ==0) RELAY(); // Công tắc rơ le được bật
if ((digitalRead(22) == 1)&& (digitalRead(23) == 1) && (digitalRead(24) == 1) && (digitalRead(8)==1)) // Khi còi được nhấn
{
digitalWrite(7,1);
HORNBT(); // Còi kêu khi đang ở chế độ bình thường
}
else digitalWrite(7,0);
if (( a != olda) or ( b != oldb)) {
Serial.print(",");
Serial.print(a); // Xuất vị trí chân đỏ ra Serial Serial.print(",");
Serial.print(b); // Xuất vị trí chân đen ra Serial