Tải bản đầy đủ (.pdf) (28 trang)

báo cáo bài tập lớn môn kĩ thuật lập trình đề tài xe mô hình tránh vật cản điều khiển bằng bluetooth

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (3.39 MB, 28 trang )

<span class="text_page_counter">Trang 1</span><div class="page_container" data-page="1">

<b>TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘIVIỆN CƠ KHÍ</b>

<b>BÁO CÁO BÀI TẬP LỚN MƠN KĨ THUẬT LẬP TRÌNH</b><i><b>Đề tài: Xe mơ hình tránh vật cản điều khiển bằng Bluetooth</b></i> Giảng viên hướng dẫn: TS. Trương Công Tuấn Lớp: Cơ điện tử

Nhóm sinh viên thực hiện:

<b> </b>

<b> Hà Nội 8-2021</b>

1

</div><span class="text_page_counter">Trang 2</span><div class="page_container" data-page="2">

2. Sơ đồ thuật toán...15

a. Sơ đồ điều khiển bằng winform...15

b.Sơ đồ chạy tự động...16

V. Lập trình...16

1. Code Arduino:...16

2. Code Visual Studio giao diện điều khiển:...21

VI. Tài liệu tham khảo:...30

2

</div><span class="text_page_counter">Trang 3</span><div class="page_container" data-page="3">

Tự điều khiển bằng nút bấm trên window form

<b>3. Linh kiện cấu tạo :</b>

Giá đỡ kích thước 70*85mm

Hai bánh xe đường kính 35mm gắn vào 2 trục động cơ khác nhauMột bánh xe đa hướng gắn ở đầu xe

2 động cơ DC một chiềuNguồn pin 12VArduino UNO

Module điều khiển động cơ L298 mạch cầuCảm biến khoảng các HC-SR04

Động cơ SERVO Bluetooth HC-06

3

</div><span class="text_page_counter">Trang 4</span><div class="page_container" data-page="4">

I. Đặt vấn đề:

- Các loại máy móc thuần cơ khí ngày nay đã trở nên lỗi thời, việc sử dụng chúng trong sản xuất mất nhiều công sức và thời gian của người sử dụng. Do đó, sự kết hợp giữa các hệ thống cơ điện với điện tử và lập trình tạo ra những đột phá và công dụng vô cùng to lớn. Để chuẩn bị cho thời đại công nghiệp hiện nay, ngay từ khi ngồi trên giảng đường, sinh viên nên học và thực hành với những sản phẩm mang sự kết hợp như vậy. - Mục đích chính của đề tài là áp dụng các kiến thức đã học từ môn học Kĩ thuật Lập trình trong Cơ Điện Tử vào việc thiết kế 1 chiếc xe tự hành có khả năng tự động di chuyển tránh vật cản và điều khiển được qua Bluetooth.

- Robot có nhiệm vụ di chuyển theo bảng điều khiển trên máy tính đã được lập trình sẵn thơng qua Bluetooth có thể tiến, lùi, quay trái, quay phải, hoặc có thể tự nhận biết vật cản, khoảng cách và tránh vật cản đó.

II. Các linh kiện cụ thể1. Arduino UNO R3

Một board mạch chủ chính dùng để truyền và nhận dữ liệu từ người sử dụng đến các thiết bị điện tử khác.

4

</div><span class="text_page_counter">Trang 5</span><div class="page_container" data-page="5">

Các thông số cơ bản:

Điện áp hoạt động5V DC (chỉ được cấp qua cổng USB)

Điện áp vào khuyên dùng7-12V DCĐiện áp vào giới hạn6-20V DC

Số chân Digital I/O14 (6 chân hardware PWM)Số chân Analog6 (độ phân giải 10bit)Dòng tối đa trên mỗi chân I/O 30 mA

Dòng ra tối đa (5V)500 mADòng ra tối đa (3.3V)50 mA

Bộ nhớ flash<sup>32 KB (ATmega328) với 0.5KB dùng bởi </sup><sub>bootloader</sub>

2. Module điều khiển động cơ L298 mạch cầu H

5

</div><span class="text_page_counter">Trang 6</span><div class="page_container" data-page="6">

- PWM hay thay đổi độ rộng xung là một kỹ thuật cho phép chúng ta điều chỉnh giá trị trung bình của điện áp đến thiết bị điện tử bằng cách bật và tắt nguồn với tốc độ nhanh. Điện áp trung bình phụ thuộc vào chu kỳ xung, hoặc lượng thời gian tín hiệu BẬT so với lượng thời gian tín hiệu TẮT trong một khoảng thời gian quy định.

6

</div><span class="text_page_counter">Trang 7</span><div class="page_container" data-page="7">

<b>Vì vậy: Tùy thuộc vào kích thước của động cơ, chúng ta có thể chỉ cần kết nối đầu ra </b>

Arduino với chân cua điện trở hoặc chân của MOSFET và điều khiển tốc độ của động cơbằng cách điều khiển đầu ra PWM. Tín hiệu Arduino cơng suất thấp bật và tắt chân tại MOSFET thơng qua đó động cơ công suất cao được điều khiển.

Điều khiển động cơ DC bằng mạch cầu H

Mặt khác, để điều khiển hướng quay, chúng ta chỉ cần đảo ngược hướng của dòng điện qua động cơ, và phương pháp phổ biến nhất để làm điều đó là sử dụng mạch cầu H. Một mạch cầu H chứa bốn chân chuyển mạch, điện trở hoặc MOSFET, với động cơ ở trung tâm tạo thành một cấu hình giống như chữ H. Bằng cách kích hoạt hai công tắc cụ thể cùng một lúc, chúng ta có thể thay đổi hướng của dịng điện, do đó thay đổi hướng quay của động cơ.

7

</div><span class="text_page_counter">Trang 8</span><div class="page_container" data-page="8">

3. Cảm biến khoảng cách HC-SR04 :

Cảm biến siêu âm có chức năng để đo khoảng cách bằng cách áp dụng công thức tính tốn khoảng cách dựa trên thời gian và vận tốc của sóng cao tần do nó phát ra.

*Thơng số kĩ thuật:Điện áp: 5V DCDòng hoạt động: < 2mAMức cao: 5V

Mức thấp: 0VGóc tối đa: 15 độ

Khoảng cách: 2cm – 450cm (4.5m)Độ chính xác: 3mm

8

</div><span class="text_page_counter">Trang 9</span><div class="page_container" data-page="9">

Tốc độ của âm thanh trong khơng khí là 340 m/s (hằng số vật lý), tương đương với 29,412 microSeconds/cm (10 / (340*100)). Khi đã tính được thời gian, ta sẽ chia cho

<small>6</small>

29,412 để nhận được khoảng cách.

4. Bluetooth HC-06:

-Module Bluetooth SLAVE cho phép vi điều khiển kết nối với các thiết bị ngoại vi: smartphone, laptop, usb bluetooth... thơng qua giao tiếp Serial gửi và nhận tín hiệu 2 chiều. Module bluetooth được tích hợp trên board cho phép bạn sử dụng nguồn từDC 3.5 - 5V.

- Module Bluetooth SLAVE cho phép vi điều khiển kết nối với các thiết bị ngoại vi:smartphone, laptop, usb bluetooth... thơng qua giao tiếp Serial gửi và nhận tín hiệu 2 chiều.

9

</div><span class="text_page_counter">Trang 10</span><div class="page_container" data-page="10">

- Module bluetooth được tích hợp trên board cho phép bạn sử dụng nguồn từ 3.5V đến 6V cung cấp cho board mà không cần lo lắng về chênh lệch điện áp 3V - 5V gây hỏng board.

- Module Bluetooth gồm 6 chân theo thứ tự: KEY, VCC, GND, TX, RX, STATE.Đây là module bluetooth SLAVE nghĩa là bạn không thể chủ động kết nối bằng vi điều khiển, mà cần sử dụng smartphone, laptop, bluetooth usb... để dị tín hiệu và kết nối (pair) từ smartphone, laptop, bluetooth usb... Sau khi kết nối thành cơng, bạn có thể gửi và nhận tín hiệu từ vi điều khiển đến các thiết bị này. - Khơng được gắn lộn dây Vcc và Gnd vì sẽ gây hỏng module bluetooth ngay lập tức.Mặc định, module bluetooth SLAVE sử dụng baud rate là 9600, PIN là 1234.

Tốc độ :

+Asynchronous : 2.1Mbps/160kbps10

</div><span class="text_page_counter">Trang 11</span><div class="page_container" data-page="11">

+Synchronous : 1Mbps/1Mbps.

Kích thước của module chính: 28 mm x 15 mm x 2.35 mmNhiệt độ làm việc: 20-75 C

<small>0</small>

Độ nhạy: -80dBm 2.1

<b>Slave module Bluetooth hc06 giúp chúng ta kết nối các thiết bị có hỗ trợ </b>

Bluetooth với VDK ta có thể gửi hoặc nhận dữ liệu giữa hai thiết bị module sử dụng chuẩn giao tiếp UART giúp dễ dàng giao tiếp với VDK tốc độ baud tên module mật khẩu được cài đặt bởi tập lệnh AT. <b>Module Bluetooth HC 06</b> được cài đặt mặc định là slave nên chỉ có thể giao tiếp với các thiết bị Bluetooth ở dạng master.

<b>*Chức năng từng chân của modul HC-06</b>

+Chân UART_TXD có chức năng truyền dữ liệu tới RXD, nối với chân RXD của vi điều khiển.

+Chân UART_RXD có chức năng nhận dữ liệu do chân TXD truyền tới, nối với chân TXD của vi điều khiển.

+Chân VCC nối với nguồn từ 3-5V+Chân GND nối đất

<b>5. Động cơ Servo SG -90:</b>

-Servo là một dạng động cơ điện đặc biệt. Không giống như động cơ thông thường cứ cắm điện vào là quay liên tục, servo chỉ quay khi được điều khiển (bằng xung PPM) với góc quay nằm trong khoảng bất kì từ 0 – 180 . Mỗi loại servo có kích thước, khối lượng

<small>00</small>

và cấu tạo khác nhau. Có loại thì nặng chỉ 9g (chủ yếu dùng trên máy bay mơ mình), có loại thì sở hữu một momen lực bá đạo (vài chục Newton/m), hoặc có loại thì khỏe và nhơng sắc chắc chắn,...

- Động cơ servo được thiết kế những hệ thống hồi tiếp vịng kín. Tín hiệu ra của động cơđược nối với một mạch điều khiển. Khi động cơ quay, vận tốc và vị trí sẽ được hồi tiếp về mạch điều khiển này. Nếu có bầt kỳ lý do nào ngăn cản chuyển động quay của động cơ, cơ cấu hồi tiếp sẽ nhận thấy tín hiệu ra chưa đạt được vị trí mong muốn. Mạch điều khiển tiếp tục chỉnh sai lệch cho động cơ đạt được điểm chính xác. Các động cơ servo điều khiển bằng liên lạc vô tuyến được gọi là động cơ servo RC (radio-controlled). Trong thực tế, bản thân động cơ servo không phải được điều khiển bằng vơ tuyến, nó chỉnối với máy thu vô tuyến trên máy bay hay xe hơi. Động cơ servo nhận tín hiệu từ máy thu này.

</div><span class="text_page_counter">Trang 12</span><div class="page_container" data-page="12">

*Thơng số kĩ thuật:Khối lượng : 9g

Kích thước: 22.2x11.8.32 mmMomen xoắn: 1.8kg/cm

Tốc độ hoạt động: 60 độ trong 0.1 giâyĐiện áp hoạt động: 4.8V(~5V)Nhiệt độ hoạt động: 0 ºC – 55 ºC

Kết nối dây màu đỏ với 5V, dây màu nâu với mass, dây màu cam với chân phát xung của vi điều khiển. Ở chân xung cấp một xung từ 1ms-2ms theo để điều khiểngóc quay theo ý muốn.

<b>III. Phương thức giao tiếp UART</b>

Chuẩn giao tiếp UART:

• Theo định nghĩa, UART là một giao thức truyền thông phần cứng sử dụng giao tiếp nối tiếp không đồng bộ với tốc độ có thể định cấu hình. Khơng đồng bộ có nghĩa là khơng có tín hiệu đồng hồ để đồng bộ hóa các bit đầu ra từ thiết bị truyềnđi đến bên nhận.

• Trong giao tiếp UART, hai UART giao tiếp trực tiếp với nhau. UART truyền chuyển đổi dữ liệu song song từ một thiết bị điều khiển như CPU thành dạng nối tiếp, truyền nó nối tiếp đến UART nhận, sau đó chuyển đổi dữ liệu nối tiếp trở lại thành dữ liệu song song cho thiết bị nhận.

• Hai đường dây mà mỗi thiết bị UART sử dụng để truyền dữ liệu đó là:+ Transmitter (Tx)

+ Receiver (Rx)

12

</div><span class="text_page_counter">Trang 13</span><div class="page_container" data-page="13">

a. Sơ đồ điều khiển bằng winform

b.Sơ đồ chạy tự động

15

</div><span class="text_page_counter">Trang 14</span><div class="page_container" data-page="14">

V. Lập trình 1. Code Arduino:#include <Servo.h>#define trig 3 #define echo 2Servo myservo; #define enA 6#define inA1 7#define inA2 8#define inB1 9 #define inB2 10 #define enB 11int x=0;int spd=0;

16

</div><span class="text_page_counter">Trang 15</span><div class="page_container" data-page="15">

void setup(){

pinMode(inA1, OUTPUT); pinMode(inA2, OUTPUT); pinMode(inB1, OUTPUT); pinMode(inB2, OUTPUT); pinMode(trig,OUTPUT); pinMode(echo,INPUT); Serial.begin(9600); myservo.attach(5); myservo.write(90); delay(500);}

void loop() {

//Tranh_Vat_Can(40); bluetoothRobot();}

void bluetoothRobot(){

if (Serial.available() > 0) {

x = Serial.read(); }

switch (x) { case 'a': Tien(); break; case 'b': Lui(); break; case 'd': Retrai(); break; case 'c': Rephai(); break; case 'e': Dung();

17

</div><span class="text_page_counter">Trang 16</span><div class="page_container" data-page="16">

break; case 'f':

Tranh_Vat_Can(40); break;

case '1': spd=100; break; case '2': spd=125; break; case '3': spd=150; break; case '4': spd=200; break; case '5': spd=255; break; }}void Tien(){

analogWrite(enA,spd-15); analogWrite(enB,spd-30); digitalWrite(inA1, HIGH); digitalWrite(inA2, LOW); digitalWrite(inB1, HIGH); digitalWrite(inB2, LOW);}

void Lui()

{ analogWrite(enA,spd-15); analogWrite(enB,spd-30); digitalWrite(inA1, LOW); digitalWrite(inA2, HIGH); digitalWrite(inB1, LOW); digitalWrite(inB2, HIGH);}

void Retrai(){

analogWrite(enA,spd-15); analogWrite(enB,spd-30); digitalWrite(inA2,LOW);

18

</div><span class="text_page_counter">Trang 17</span><div class="page_container" data-page="17">

digitalWrite(inA1,HIGH); digitalWrite(inB1,LOW); digitalWrite(inB2,LOW);}

void Rephai(){

analogWrite(enA,spd-15); analogWrite(enB,spd-30); digitalWrite(inA1,LOW); digitalWrite(inA2,LOW); digitalWrite(inB2,LOW); digitalWrite(inB1,HIGH);}

void Dung(){

digitalWrite(inA1, LOW); digitalWrite(inA2, LOW); digitalWrite(inB1, LOW); digitalWrite(inB2, LOW);}

int TinhKC (byte goc) {

myservo.write(goc); delay(500); unsigned long times; int KC;

digitalWrite(trig,0); delayMicroseconds(2); digitalWrite(trig,1); delayMicroseconds(5); digitalWrite(trig,0); times = pulseIn(echo,HIGH); KC = int(times/2/29.412); return KC;

</div><span class="text_page_counter">Trang 18</span><div class="page_container" data-page="18">

{ Tien(); delay(100); }

else //(KC_phiaTruoc <= KC_choPhep) {

Lui(); delay(200); Dung();

int KC_Trai = TinhKC(180); delay (300);

int KC_Phai = TinhKC(0); delay (300);

int KC_max = max(KC_Trai,KC_Phai); if(KC_max <=KC_choPhep)

{ Lui(); delay(500); Dung();

int KC_Trai1 = TinhKC(180); delay (200);

int KC_Phai1 = TinhKC(0); delay (200);

if(KC_Trai1>=KC_Phai1) {

Retrai(); delay(80); } else { Rephai(); delay(90); } //Retrai(); //delay(100); }

else {

if (KC_max == KC_Trai) {

Retrai();

delay (150); }

20

</div><span class="text_page_counter">Trang 19</span><div class="page_container" data-page="19">

else { Rephai();

delay (180); }

} }}

2. Code Visual Studio giao diện điều khiển:

#pragma once

namespace ProjectWinform1 {using namespace System;

using namespace System::ComponentModel;using namespace System::Collections;using namespace System::Windows::Forms;using namespace System::Data;using namespace System::Drawing;using namespace System::IO::Ports;using namespace System::Text;/// Summary for MyForm/// </summary>

public ref class MyForm : public System::Windows::Forms::Form{

array<String^>^ tocdotruyen;array<String^>^ speed;MyForm(void){

//TODO: Add the constructor code here//

tocdotruyen = gcnew array<String^>{"4800", "9600", "19200"};speed = gcnew array<String^>{"100", "125", "150", "200", "255"};/*array<Object^>^ oBarray = SerialPort::GetPortNames();this->comboBox2->DataSource = tocdotruyen;comboBox2->SelectedIndex = 1;

this->comboBox3->DataSource = speed;this->comboBox1->DataSource = oBarray;comboBox1->SelectedIndex = 1;*/}

/// <summary>

/// Clean up any resources being used.

21

</div><span class="text_page_counter">Trang 20</span><div class="page_container" data-page="20">

/// </summary>~MyForm(){

if (components){

delete components;}

private: System::Windows::Forms::Button^ button1;private: System::Windows::Forms::Label^ label1;private: System::Windows::Forms::Button^ button2;private: System::Windows::Forms::Button^ button3;private: System::Windows::Forms::Button^ button4;private: System::Windows::Forms::Button^ button5;private: System::Windows::Forms::Button^ button6;private: System::Windows::Forms::Button^ button7;private: System::Windows::Forms::Button^ button8;private: System::Windows::Forms::Label^ label2;private: System::Windows::Forms::Label^ label3;private: System::Windows::Forms::Label^ label4;private: System::Windows::Forms::Label^ label5;private: System::Windows::Forms::ComboBox^ comboBox1;private: System::Windows::Forms::ComboBox^ comboBox2;private: System::Windows::Forms::ComboBox^ comboBox3;private:

public: System::IO::Ports::SerialPort^ serialPort1;private:

private: System::ComponentModel::IContainer^ components;protected:

void InitializeComponent(void){

this->components = (gcnew System::ComponentModel::Container());this->button1 = (gcnew System::Windows::Forms::Button());this->label1 = (gcnew System::Windows::Forms::Label());this->button2 = (gcnew System::Windows::Forms::Button());this->button3 = (gcnew System::Windows::Forms::Button());this->button4 = (gcnew System::Windows::Forms::Button());

22

</div><span class="text_page_counter">Trang 21</span><div class="page_container" data-page="21">

this->button5 = (gcnew System::Windows::Forms::Button());this->button6 = (gcnew System::Windows::Forms::Button());this->button7 = (gcnew System::Windows::Forms::Button());this->button8 = (gcnew System::Windows::Forms::Button());this->label2 = (gcnew System::Windows::Forms::Label());this->label3 = (gcnew System::Windows::Forms::Label());this->label4 = (gcnew System::Windows::Forms::Label());this->label5 = (gcnew System::Windows::Forms::Label());this->comboBox1 = (gcnew System::Windows::Forms::ComboBox());this->comboBox2 = (gcnew System::Windows::Forms::ComboBox());this->comboBox3 = (gcnew System::Windows::Forms::ComboBox());this->serialPort1 = (gcnew System::IO::Ports::SerialPort(this->components));this->SuspendLayout();

// // button1//

this->button1->Location = System::Drawing::Point(468, 33);this->button1->Name = L"button1";

this->button1->Size = System::Drawing::Size(75, 30);this->button1->TabIndex = 0;

this->label1->AutoSize = true;

this->label1->ForeColor = System::Drawing::SystemColors::MenuHighlight;this->label1->Location = System::Drawing::Point(111, 33);

this->label1->Name = L"label1";

this->label1->Size = System::Drawing::Size(100, 17);this->label1->TabIndex = 1;

this->label1->Text = L"Not connected";//

// button2//

this->button2->Location = System::Drawing::Point(42, 350);this->button2->Name = L"button2";

this->button2->Size = System::Drawing::Size(90, 28);this->button2->TabIndex = 2;

this->button3->Location = System::Drawing::Point(42, 392);this->button3->Name = L"button3";

this->button3->Size = System::Drawing::Size(90, 28);this->button3->TabIndex = 3;

this->button3->Text = L"Disconnect";this->button3->UseVisualStyleBackColor = true;

23

</div>

×