Professional Documents
Culture Documents
Bao Cao Ki Thuat Lap Trinh Co Dien Tu
Bao Cao Ki Thuat Lap Trinh Co Dien Tu
Lớp: Cơ điện tử
Hà Nội 8-2021
Mục lục
• Arduino UNO
• Module điều khiển động cơ L298 mạch cầu
• Cảm biến khoảng các HC-SR04
• Động cơ SERVO
• Bluetooth HC-06
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 đó.
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.
Thông số kỹ thuật:
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
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.
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
toá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 DC
• Dòng hoạt động: < 2mA
• Mức cao: 5V
• Mức thấp: 0V
• Góc tối đa: 15 độ
• Khoảng cách: 2cm – 450cm (4.5m)
• Độ chính xác: 3mm
*Các chân chức năng:
VCC Cấp nguồn cho cảm biến (5V) hoặc 3.3V ở cảm biến 3V3
TRIGGER Chân phát sóng âm. Là chu kỳ của của điện cao /thấp diễn ra.
ECHO Trạng thái ban dầu là 0V, khi có tín hiệu trả về sẽ là 5V và sau đó trở về 0V
GND Nối cực âm của mạch OUT
Không sử dụng
Để đo khoảng cách, ta sẽ phát 1 xung rất ngắn (5 microSeconds) từ chân Trig. Sau
đó, cảm biến siêu âm sẽ tạo ra 1 xung HIGH ở chân Echo cho đến khi nhận lại được
sóng phản xạ ở pin này. Chiều rộng của xung sẽ bằng với thời gian sóng siêu âm
được phát từ cảm biển và quay trở lại.
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 (106 / (340*100)). Khi đã tính được thời gian, ta sẽ chia cho
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.
- 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.
Thông số kỹ thuật:
• Điện áp hoạt động: 3.3 ~ 5VDC.
• Điện áp giao tiếp: TTL tương thích 3.3VDC và 5VDC.
• Chip CSR Bluetooth V 2 .0
• Baudrate UART( tốc độ hỗ trợ) có thể chọn được: 1200, 2400, 4800, 9600, 19200,
38400, 57600, 115200
9
*Thông số kĩ thuật:
• Khối lượng : 9g
• Kích thước: 22.2x11.8.32 mm
• Momen 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ển
góc quay theo ý muốn.
11
• UART truyền dữ liệu không đồng bộ, có nghĩa là không có tín hiệu đồng hồ để
đồng bộ hóa đầu ra của các bit từ UART truyền đến việc lấy mẫu các bit bởi
UART nhận. Thay vì tín hiệu đồng hồ, UART truyền thêm các bit start và stop
vào gói dữ liệu được chuyển. Các bit này xác định điểm bắt đầu và điểm kết thúc
của gói dữ liệu để UART nhận biết khi nào bắt đầu đọc các bit.
• Khi UART nhận phát hiện một bit start, nó bắt đầu đọc các bit đến ở một tần số cụ
thể được gọi là tốc độ truyền (baud rate). Tốc độ truyền là thước đo tốc độ truyền
dữ liệu, được biểu thị bằng bit trên giây (bps – bit per second). Cả hai UART đều
phải hoạt động ở cùng một tốc độ truyền. Tốc độ truyền giữa UART truyền và
nhận chỉ có thể chênh lệch khoảng 10% trước khi thời gian của các bit bị lệch quá
xa.
• UART sẽ truyền dữ liệu nhận được từ một bus dữ liệu (Data Bus). Bus dữ liệu
được sử dụng để gửi dữ liệu đến UART bởi một thiết bị khác như CPU, bộ nhớ
hoặc vi điều khiển. Dữ liệu được chuyển từ bus dữ liệu đến UART truyền ở dạng
song song. Sau khi UART truyền nhận dữ liệu song song từ bus dữ liệu, nó sẽ
thêm một bit start, một bit chẵn lẻ và một bit stop, tạo ra gói dữ liệu. Tiếp theo,
gói dữ liệu được xuất ra nối tiếp từng bit tại chân Tx. UART nhận đọc gói dữ liệu
từng bit tại chân Rx của nó. UART nhận sau đó chuyển đổi dữ liệu trở lại dạng
song song và loại bỏ bit start, bit chẵn lẻ và bit stop. Cuối cùng, UART nhận
chuyển gói dữ liệu song song với bus dữ liệu ở đầu nhận.
12
1. Sơ đồ nối mạch
13
2. Sơ đồ thuật toán
a. Sơ đồ điều khiển bằng winform
14
V. Lập trình
1. Code
Arduino:
#include <Servo.h>
#define trig 3
#define echo 2
Servo myservo;
#define enA 6
#define inA1 7
#define inA2 8
#define inB1 9
15
#define inB2 10
#define enB 11
int x=0; int
spd=0;
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();
break;
case 'f':
Tranh_Vat_Can(40);
break; case '1':
spd=100; break;
case '2': spd=125;
16
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);
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,
17
LOW);
digitalWrite(inA2, LOW);
digitalWrite(inB1, LOW);
digitalWrite(inB2,
LOW); }
{ Retrai();
delay(80);
} else
{
Rephai();
delay(90);
}
//Retrai();
//delay(100);
} else
{
if (KC_max == KC_Trai)
{
Retrai();
delay (150);
}
else
{
Rephai();
delay (180);
}
}
}
}
2. Code Visual Studio giao diện điều
khiển:
#pragma once namespace ProjectWinform1 {
{
public:
array<String^>^ tocdotruyen;
array<String^>^ speed;
MyForm(void)
{
InitializeComponent();
//
//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;*/
protected:
/// <summary>
/// Clean up any resources being used.
/// </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:
private:
/// <summary>
/// Required designer variable.
/// </summary>
22
System::Windows::Forms::MouseEventHandler(this, &MyForm::button5_MouseUp);
//
// button6
//
this->button6->Location = System::Drawing::Point(348, 156); this-
>button6->Name = L"button6";
this->button6->Size = System::Drawing::Size(60, 55);
this->button6->TabIndex = 6; this->button6->Text =
L"Right";
this->button6->UseVisualStyleBackColor = true; this->button6-
>MouseDown += gcnew
System::Windows::Forms::MouseEventHandler(this, &MyForm::button6_MouseDown);
this->button6->MouseUp += gcnew
System::Windows::Forms::MouseEventHandler(this, &MyForm::button6_MouseUp);
//
// button7
//
this->button7->Location = System::Drawing::Point(187, 156); this-
>button7->Name = L"button7";
this->button7->Size = System::Drawing::Size(60, 55);
this->button7->TabIndex = 7; this->button7->Text =
L"Left";
this->button7->UseVisualStyleBackColor = true; this->button7-
>MouseDown += gcnew
System::Windows::Forms::MouseEventHandler(this, &MyForm::button7_MouseDown);
this->button7->MouseUp += gcnew
System::Windows::Forms::MouseEventHandler(this, &MyForm::button7_MouseUp);
//
// button8
//
this->button8->Location = System::Drawing::Point(270, 156); this-
>button8->Name = L"button8";
this->button8->Size = System::Drawing::Size(60, 55);
this->button8->TabIndex = 8; this->button8->Text =
L"Stop"; this->button8->UseVisualStyleBackColor =
true; this->button8->MouseDown += gcnew
System::Windows::Forms::MouseEventHandler(this, &MyForm::button8_MouseDown);
//
// label2
//
this->label2->AutoSize = true; this->label2->ForeColor =
System::Drawing::Color::DarkGreen; this->label2->Location =
System::Drawing::Point(39, 33); this->label2->Name =
L"label2";
this->label2->Size = System::Drawing::Size(48, 17); this->label2-
>TabIndex = 9;
this->label2->Text = L"Status";
//
// label3
23
//
this->label3->AutoSize = true;
this->label3->Location = System::Drawing::Point(453, 350); this-
>label3->Name = L"label3";
this->label3->Size = System::Drawing::Size(39, 17);
this->label3->TabIndex = 10; this->label3->Text =
L"COM";
//
// label4
//
this->label4->AutoSize = true;
this->label4->Location = System::Drawing::Point(453, 392); this-
>label4->Name = L"label4";
this->label4->Size = System::Drawing::Size(70, 17); this->label4-
>TabIndex = 11;
this->label4->Text = L"Baud rate";
//
// label5
//
this->label5->AutoSize = true;
this->label5->Location = System::Drawing::Point(453, 432); this-
>label5->Name = L"label5";
this->label5->Size = System::Drawing::Size(49, 17);
this->label5->TabIndex = 12; this->label5->Text =
L"Speed";
//
// comboBox1
//
this->comboBox1->FormattingEnabled = true;
this->comboBox1->Location = System::Drawing::Point(234, 350);
this->comboBox1->Name = L"comboBox1"; this->comboBox1-
>Size = System::Drawing::Size(130, 24); this->comboBox1-
>TabIndex = 13;
//
// comboBox2
//
this->comboBox2->FormattingEnabled = true;
this->comboBox2->Location = System::Drawing::Point(234, 392);
this->comboBox2->Name = L"comboBox2"; this->comboBox2-
>Size = System::Drawing::Size(130, 24); this->comboBox2-
>TabIndex = 14;
//
// comboBox3
//
this->comboBox3->FormattingEnabled = true;
this->comboBox3->Location = System::Drawing::Point(234, 432);
this->comboBox3->Name = L"comboBox3"; this->comboBox3-
>Size = System::Drawing::Size(130, 24); this->comboBox3-
>TabIndex = 15;
24
}
private: System::Void button7_MouseDown(System::Object^ sender,
System::Windows::Forms::MouseEventArgs^ e)
{ this->serialPort1->Write("d");
}
private: System::Void MyForm_Load(System::Object^ sender, System::EventArgs^ e)
{ array<Object^>^ oBarray = SerialPort::GetPortNames(); this-
>comboBox2->DataSource = tocdotruyen; this-
>comboBox2->SelectedIndex = 1; this->comboBox3-
>DataSource = speed; this->comboBox1->DataSource
= oBarray; this->comboBox1->SelectedIndex = 0;
}
private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e)
{
}
private: System::Void button3_Click(System::Object^ sender, System::EventArgs^ e)
{ label1->Text = "Disconnected";
label1->ForeColor =
Color::Red; serialPort1-
>Close(); comboBox1->Enabled
= true; comboBox2->Enabled =
true; comboBox3->Enabled =
true;
}
private: System::Void button4_MouseUp(System::Object^ sender,
System::Windows::Forms::MouseEventArgs^ e)
{ serialPort1->Write("e");
}
private: System::Void button6_MouseUp(System::Object^ sender,
System::Windows::Forms::MouseEventArgs^ e)
{ serialPort1->Write("e");
}
private: System::Void button5_MouseUp(System::Object^ sender,
System::Windows::Forms::MouseEventArgs^ e)
{ serialPort1->Write("e");
}
26
27
Kết luận :
Tích cực :
- Hiểu được nguyên lý, cách thức hoạt động của cảm biến, linh kiện điện tử.
- Biết cách xây dựng, thiết kế xe tự hành, điều khiển xe thông qua Bluetooth.
- Sử dụng kiến thức đã học để lập trình điều khiển, xây dựng giao diện My form.
- Nâng cao khả năng hoạt động nhóm, biết phân chia công việc, hoạt động hiệu quả
hơn.
Hạn chế :
- Không thể gặp mặt nhau trực tiếp để cùng nhau lắp đặt , kiểm tra và vận hành.
- Khó khăn trong việc giao tiếp, cách diễn đạt ý để cho các thành viên khác hiểu,
các sự cố kỹ thuật, mạng.
- Khó khăn khi mua các linh kiện.
Quá trình thực hiện đề tài đã giúp chúng em thu được kết quả tốt, bổ sung nhiều phần
kiến thức chưa hiểu rõ trong quá trình học tập và hiểu rõ quá trình thiết kế, thực hiện 1 ý
tưởng kỹ thuật đơn giản. Môn học đã cho sinh viên chúng em môi trường làm việc thân
thiện, sáng tạo, kích thích sự tìm tòi. Chúng em xin gửi lời cảm ơn tới TS Trương Công
Tuấn đã tận tình hướng dẫn, góp ý chúng em trong quá trình thực hiện đề tài.
28