Với hệ điều hành mạnh mẽ nhƣ android việc điều khiển và hiển thị tình trạng hoạt động là rất đơn giản, Trong MIT APP INVERTOR để phân tích một gói dữ liệu thành các phần tử khác nhau để điều khiển thì chúng ra sử dụng công cụ split nằm trong khối code list. Để hiện thị các thông số theo dạng số liệu lên các TextBox, chúng ta cần thày đổi thuộc tính .text của nó theo thông số gửi lên từ arduino.
62
Chƣơng 6. KẾT QUẢ NGHIÊN CỨU VÀ ỨNG DỤNG TRÊN XE CÂN BẰNG 6.1. Thiết kế phần cứng cho hệ thống thông tin
Phƣơng thức truyền dữ liệu qua Bluetooth,điện thoại smartphone andriod hoạt động nhƣ một smartkey có thể điều khiển,tìm xe trong bãi,khóa xe khi cần.dƣới đây là sơ đồ nguyên lý cơ bản của hệ thổng truyền và nhận thông tin.
Hình 6.1:Sơ đồ nguyên lý hệ thống quản lý thông tin và điều khiển
63 Sơ đồ đi dây các cảm biến công tác và relay điều khiển
Hình 6.3 Sơ đồ mạch điện 6.2. kết quả hiển thị
64
Hình 6.5 Hiển thị kết quả theo đồng hồ số.
Hình 6.6 Kết quả điều khiển đèn chiếu sang.
Mạch đƣợc tích hợp và bố trí một cách gọn gàng, và đƣợc gắn ngay phần điều khiển của xe cân bằng.
65
6.3. Code lập trình tham khảo
[code]
int tempPin = A4; int lightPin = A0; int voltPin = A3; int ampePin = A2; int Rbutton = 4; int Lbutton = 5; int Flbutton = 6; int Hbutton = 7; char start; #define headlight 9 #define rightled 10 #define leftled 11 #define PIN_DO_2 2 #define PIN_DO_3 3
volatile unsigned int pulses; volatile unsigned int pulses_1; unsigned int rpm;
unsigned int rpm_1; unsigned int rpm2; unsigned int vantoc; unsigned long timeOld; #define HOLES_DISC 2 #define HOLES_DISC_1 2 void counter1() { pulses++; } void counter2() { pulses_1++; } void setup() { Serial.begin(9600); pinMode(Hbutton, INPUT);
66 pinMode(Rbutton, INPUT); pinMode(Lbutton, INPUT); pinMode(Flbutton, INPUT); pinMode(headlight, OUTPUT); pinMode(rightled, OUTPUT); pinMode(leftled, OUTPUT); digitalWrite(9, HIGH); digitalWrite(10, HIGH); digitalWrite(11, HIGH); pinMode(PIN_DO_2, INPUT_PULLUP); pinMode(PIN_DO_3, INPUT_PULLUP); pulses = 0; pulses_1 = 0; timeOld = 0;
attachInterrupt(digitalPinToInterrupt(PIN_DO_2), counter1, FALLING); // ngat dem xung
attachInterrupt(digitalPinToInterrupt(PIN_DO_3), counter2, FALLING); // ngat dem xung
}
void loop() {
// tính nhiệt độ động cơ
float reading = analogRead(tempPin); float volt_temp = reading * 5.0 / 1024.0; unsigned int temp = volt_temp * 100.0; // cdas
int cdas = analogRead(lightPin); // tính điện áp accu
int sensorValue = analogRead(voltPin);
float voltage = 11*sensorValue * (5.0 / 1024.0); // dong dien
int RawValue = analogRead(ampePin);
float VoltageA2 = (RawValue / 1024.0) * 5000; // Gets you mV float Amps = ((VoltageA2 - 2500) / 100);
if (millis() - timeOld >= 1000) {
detachInterrupt(digitalPinToInterrupt(PIN_DO_2)); detachInterrupt(digitalPinToInterrupt(PIN_DO_3)); rpm = (pulses * 60) / (HOLES_DISC);
67 rpm2 = rpm /100; // chia 10 100 1000 de hien thi len dong do
rpm_1 = (pulses_1 * 60) / (HOLES_DISC_1); timeOld = millis();
pulses = 0; pulses_1=0;
attachInterrupt(digitalPinToInterrupt(PIN_DO_2), counter1, FALLING); attachInterrupt(digitalPinToInterrupt(PIN_DO_3), counter2, FALLING); Serial.print(voltage); Serial.print("|"); Serial.print(rpm_1); Serial.print("|"); Serial.print(rpm2); Serial.print("|"); Serial.print(temp); Serial.print("|"); Serial.print(Amps); Serial.println("|"); } delay(100);
//CODE ĐIỀU KHIỂN ĐÈN if(Serial.available() > 0){ start = Serial.read(); } else{ }
int RStatus = digitalRead(Rbutton); if ((RStatus == HIGH) ) { digitalWrite(10,LOW); delay(400); digitalWrite(10,HIGH); delay(400); } else { }
int LStatus = digitalRead(Lbutton); if ((LStatus == HIGH)) {
68 delay(400); digitalWrite(11,HIGH); delay(400); } else { }
int HStatus = digitalRead(Hbutton); int FlStatus = digitalRead(Flbutton);
if ((HStatus == HIGH)||(FlStatus == HIGH)) { digitalWrite(9,LOW); } else { // ngƣợc lại digitalWrite(9,HIGH); } switch (start) { case 'A': digitalWrite(11, HIGH); // tìm xe digitalWrite(10,HIGH); delay(400); digitalWrite(11, LOW); digitalWrite(10, LOW); break;
case '9': // off den xin nhan digitalWrite(10, HIGH); //
digitalWrite(11, HIGH); // break;
case '3': // ĐÈN HEAD LIGHT digitalWrite(headlight, LOW); // break; case '5': // ĐÈN FLASH digitalWrite(headlight, LOW); // break; case '6': // ĐÈN HAZA digitalWrite(10, LOW); digitalWrite(11, LOW); delay(400); digitalWrite(10,HIGH); digitalWrite(11,HIGH); // delay(400);
69 break;
case '1': // ĐÈN XIN NHAN TRÁI digitalWrite(11,LOW);
delay(400);
digitalWrite(11,HIGH); // delay(400);
break;
case '2': // ĐÈN XIN NHAN PHẢI digitalWrite(10, LOW);
delay(400);
digitalWrite(10,HIGH); delay(400);
break;
case '4': // off den xin nhan digitalWrite(10, HIGH); // digitalWrite(11, HIGH); break; case 'D': if ((cdas>150)){digitalWrite(headlight,LOW);break;} // if ((cdas<150)){digitalWrite(headlight,HIGH);break;} // } } [/code]
70
Chƣơng 7. KẾT LUẬNVÀ ĐỀ NGHỊ
Kết quả đạt đƣợc: Đề tài “Thiết kế hệ thống thông tin và quản lý xe cân bằng thông
qua điện thoại thông minh”.Đã hoàn thành một số nội dung chủ yếu sau: Chế độ định vị xe trong bãi.
Hiển thị giá trị điện áp acquy,nhiệt độ môi trƣờng,tốc độ xe,số vòng quay của bánh đà trên xe cân bằng trên điên thoại smartphone.
Thiết lập hệ thống điều khiển đèn tín hiệu trên điện thoại smartphone. Thiết lập hệ thống điều khiển chiếu sáng tự động.
Hạn chế của đề tài:
Vì lắp ráp trên xe hai bánh nên đề tài có một số hạn chế nhất định về mặt ứng dụng: Chƣa truyền đƣợc nhiều tín hiệu truyền từ arduino qua android.
Các thông số chỉ đƣợc truyền và quản lý trong bán kính 30m. Chƣa thay thế hoàn toàn các nút điều khiển cơ.
Màn hình hiển thị bị chói sáng khi hoạt động trong môi trƣờng có cƣờng độ ánh sáng mặt trời mạnh.
Hƣớng phát triển
Với xu hƣớng truyền dữ liệu và điều khiển không dây, kết nối bluetooth có thể làm đƣợc những công việc không cần tốc độ truyền nhanh nhƣ mạng LAN, CAN. Phù hợp cho các điều khiển tiện ích trên xe, màn hình điều khiển cũng dẫn thay thế cho các nút điều khiển cơ, thực tế đã cho thấy các công ty ô tô đã đi trƣớc trong lĩnh vực sử dụng màn hình hiển thị để điều khiển xe thay cho toàn bộ các công tắc. Hiện nay, một số dòng xe hạng sang nhƣ BMW, AUDI, Infiniti… đã thay thế toàn bộ các công tắc cơ chỉ còn lại hai cần gạt chính để điều khiển xin nhan báo rẽ và điều khiển các công việc khác nhƣ gạt mƣa hay điều chỉnh chế độ CCS trên ô tô. Sở dĩ vẫn còn những công tắc gạt này vì, thói quen sử dụng của ngƣời tiêu dùng, mặt khác những công tắc này cũng mang lại thẩm mỹ nhất định trong nội thất của chiếc xe.
Một chiếc xe hiện tại thì có rất nhiều tính năng và chế độ điều khiển, một việc và công tắc truyền thống không thế làm hết các nhiệm vụ này đƣợc, sẽ có rất nhiều công
71 tắc, cần gạt chế độ, rất nhều bó dây và điều này rất tốn chi phí sẳn xuất cũng nhƣ khó khắn trong công tác bảo dƣỡng sửa chữa. truyền dữ liệu không dây thì khác, chúng ta quản lí các lệnh ( các chế độ, nhiệm vụ ) thông qua dữ liệu số. hƣ hỏng sữa chửa về mặt tín hiệu sẽ không còn nữa, chúng ta chỉ cần quan tâm đến nơi nhận và nơi gửi tín hiệu của hệ thống.
Đề nghị sau khi kết thúc đề tài.
Với khó khăn chúng em gặp phải, đề nghị cuối cùng là chúng em mong muốn trong quá trình học, các môn học lập trình sẽ trở nên thân thiện và sống động hơn, thu hút đƣợc nhiều bạn trẻ yêu thích và phát triển đƣợc nhiều hơn các ứng dụng từ công nghệ Bluetooth và các hệ điều hành nhƣ Android, IOS, và lập trình ứng dụng AVR, Arduino. Để làm đƣợc nhƣ thế, nhà trƣờng cần thêm vào quá trình học vào các cuộc thi, các đề tài nghiên cứu khoa học, thậm chí là các môn học có liên quan tới. với các bạn khóa sau, điều khiển một chiếc xe ô tô qua điện thoại thông minh sẽ là một đề tài rất là thú vị, cuốn đồ án này phần nào mang lại các bạn đó một lƣợng kiến thức vừa đủ và tiếp tục nghiên cứu phần khuyết của đề tài này.
72
DANH MỤC TÀI LIỆUTHAM KHẢO
[1] https://www.arduino.cc/
[2] http://www.tinhocsoctrang.com/2015/10/khoi-lenh-code-blocks-trong-app-inventor.html [3] http://ai2.appinventor.mit.edu
[4] ThS Nguyễn Văn Hiệp, giáo trình lập trình android trong điều khiển ứng dụng, Đại học quốc gia thành phố Hồ Chí Minh, 2016
[5] Phạm Quang Huy – Lê Cảnh Trung lập trình điều khiển với arduino, Nhà xuất bản khoa học và kỹ thuật, 2015
73
PHỤ LỤC
Hƣớng dẫn sử dụng Arduino
Arduino IDE là nơi để soạn thảo code, kiểm tra lỗi và upload code cho arduino
Hình 1. Arduino IDE
a.Arduino Toolbar: có một số button và chức năng của chúng nhƣ sau :
Hình 2: Arduino Toolbar.
Verify : kiểm tra code có lỗi hay không
Upload: nạp code đang soạn thảo vào Arduino New, Open, Save : Tạo mới, mở và Save sketch
74 Serial Monitor : Đây là màn hình hiển thị dữ liệu từ Arduino gửi lên máy tính
b.Arduino IDE Menu:
Hình 3: IDE Menu
File menu:
Hình 4: File menu.
Trong file menu chúng ta quan tâm tới mục Examples đây là nơi chứa code mẫu ví dụ nhƣ: cách sử dụng các chân digital, analog, sensor …
75 Edit menu: Hình 6: Edit menu Sketch menu: Hình 7: Sketch menu
Trong Sketch menu :
Verify/ Compile : chức năng kiểm tra lỗi code. Show Sketch Folder : hiển thị nơi code đƣợc lƣu. Add File : thêm vào một Tap code mới.
76 Tool memu:
Hình 8: Tool menu.
Trong Tool menu ta quan tâm các mục Board và Serial Port
Mục Board : các bạn cần phải lựa chọn bo mạch cho phù hợp với loại bo mà bạn sử dụng nếu là Arduino Uno thì phải chọn nhƣ hình:
77 Nếu các bạn sử dụng loại bo khác thì phải chọn đúng loại bo mà mình đang có nếu sai thì code Upload vào chip sẽ bị lỗi.
Serial Port: đây là nơi lựa chọn cổng Com của Arduino. Khi chúng ta cài đặt driver thì máy tính sẽ hiện thông báo tên cổng Com của Arduino là bao nhiêu, ta chỉ việc vào Serial Port chọn đúng cổng Com để nạp code, nếu chọn sai thì không thể nạp code cho Arduino đƣợc.
Hƣớng dẫn lập trình androi mit app inventor 2
Để sử dụng đƣợc App Inventor, các bạn truy cập vào địachỉ ai2.appinventor.mit.edu. Sau đó tiến hành đăng nhập bằng tài khoản Google của bạn để mở trang quản lí các project.
Hình 10.Cửa xổ quản lí các project.
78 Hình 11. Giao diện thiết kế Project
Giao diện thiết kế Project hiện ra rất đơn giản. Bên trái là các control bao gồm: User Interface, Media, Sensor, Social,… để sử dụng các bạn chỉ cần click chuột và kéo thả vào Screen. Ở giữa là Screen mô phỏng màn hình ứng dụng của chúng ta, bên phải là cửa sổ
quản lí các Component, Media, và Property cho từng Control. Các bạn hãy kéo thả các
Label, Button đặt vào các Layer để đƣợc giao diện sau nhé! Các bạn nhớ chọn thêm Control Bluetooth Client trong phần Connectivity nhé! Để cho đơn giản, ta nhấp vào các button và chọn Rename đặt tên theo ý chúng ta.
79 Sau khi đƣợc giao diện nhƣ trên, chúng ta sẽ tiến hành phần “code”. Các bạn bấm vào Tab “Blocks” ở góc trên bên phải màn hình nhé!
80 Cửa số “code” hiện lên, bên trái là các khối lệnh: Control, Logic, Math, Text,… và các khối lệnh ứng với mỗi button. Để thực hiện một lệnh nào đó, ta sẽ thực hiện thao tác kéo thả (click chuột vào khối lệnh và kéo vào màn hình.
81 Những khối lệnh màu vàng đất có nghĩa là các sự kiện “event”.
“When Screen1.Initialize do” có nghĩa là khi Screen1 đƣợc khởi tạo sẽ thực hiện lệnh đằng sau do.
“When moveforward.TouchDown do” có nghĩa khi sự kiện touchdown xảy ra với nút moveforward thì sẽ thực hiện lệnh đằng sau do.
Tƣơng tự với những câu lệnh còn lại nhé!
Chúng ta cần phân biệt các sự kiện Click, TouchDown, TouchUp : Click: có nghĩa quá trình ấn vào một button và lấy tay lên. TouchDown: có nghĩa là việc ấn vào một button.
TouchUp: có nghĩa là việc đang nhấn một button và lấy tay ra Cuối cùng Đóng gói ứng dụng thành file *.apk
Bây giờ chúng ta sẽ đóng gói ứng dụng ra file apk và cài lên điện thoại thôi nhé! Để xuất ra đƣợc file apk các bạn chọn Build và chọn App(provide QR code for .apk) nếu muốn tạo một QR code cho file apk. Chọn dòng còn lại nếu muốn lƣu file lên máy tính.