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

BÁO cáo bài tập lớn đề tài xe điều khiển từ xa

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 (689.38 KB, 20 trang )

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
VIỆN CƠ KHÍ

**********************

BÁO CÁO BÀI TẬP LỚN
Đề tài: Xe điều khiển từ xa

Giáo viên hướng dẫn:

TS: Bùi Đình Bá

Lớp:

Cơ điện tử

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

Nguyễn Văn Giang

20184424

Nguyễn Văn Thắng 20184617
Trương Quý Huy

Hà Nội 1-2018

20184490


LỜI NÓI ĐẦU


Ngày nay, nền khoa học kỹ thuật đang phát triển như vũ bão, rất nhiều các phát minh, sản
phẩm công nghệ mới ra đời. Các robot tự động đang là xu hướng cơng nghệ tương lai vì
sự tiện dụng, khả năng hoạt động chính xác trong các điều khiện khắc nghiệt với con
người. Một yêu cầu cơ bản của các robot tự động là khả năng hoạt động theo chức năng
mong muốn mà không cần sự can thiệp của con người trong quá trình làm việc. Đây là cơ
hội, cũng là thách thức cho các sinh viên kỹ thuật nói chung và sinh viên trường Đại học
Bách Khoa Hà Nội nói riêng. Để chuẩn bị kiến thức và kỹ năng cần thiết trong bối cảnh
nói trên, mơn học Đồ án 2 được đưa vào chương trình đào tạo kỹ sư Điện tử viễn thông
để cho sinh viên môi trường làm việc sáng tạo, thực hiện các ý tưởng kỹ thuật. Trong thời
lượng môn học này, dưới sự hướng dẫn của thầy Bùi Đình Bá, nhóm chúng em thực hiện
đề tài Thiết kế xe điều khiển từ xa bằng bluetooth.
Xe điều khiển là một trong những ý tưởng robot cơ bản nhất, có thể được sử dụng
cho mục đích vận tải trong quy mô nhỏ, hoặc kết hợp với các modun khác để thực hiện
các nhiệm vụ phức tạp hơn.


Mục Lục
Lời nói đầu………………………………………………………….1
I.
……………………………………………………….Giới thiệu chung
II.
……………………………………………………….Ý tưởng thiết kế
III. ……………………………………………………….Link kiện lựa chọn
IV. ……………………………………………………….Cách thực hiện
V.
……………………………………………………….Code
VI. ……………………………………………………….Kết quả chung.


I: Giới thiệu chung

Robot đã và đang xuất hiện trong cuộc sống của chúng ta từ lâu và ngày càng
trở thành một phần không thể thiếu trong cuộc sống hiện đại. Chúng đã góp phần
mình vào cơng cuộc lao động, chính robot đang làm nên một cuộc cách mạng về
lao động, khoa học, và đang phục vụ đắc lực cho các ngành khoa học như: Khoa
học quân sự, khoa học giáo dục, các ngành dịch vụ, giải trí.
Trong đề tài này, nhóm em sẽ thực hiện thiết kế một chiếc xe điều khiển từ xa từ
các bước đầu tiên như đưa ra yêu cầu chức năng, phi chức năng… cho tới bước
đưa ra sản phẩm mẫu hoàn chỉnh.

II: Ý tưởng thiết kế
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 đó.

III: Link kiện lựa chọn
Vì xe chỉ đơn giản là xe điều khiển từ xa nên các yêu cầu cơ khí của xe cũng
khơng cần cầu kỳ, chỉ cần đảm bảo độ bền và giá thành rẻ.
 Linh kiện cần thiết:
- 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 nhau
- Một bánh xe đa hướng gắn ở đầu xe
- 2 động cơ DC một chiều
- Nguồn pin 12V
- Arduino UNO
- Module điều khiển động cơ L298 mạch cầu
- Cảm biến khoảng các HC-SR04


1. Arduino UNO
- Như bộ não giúp chúng ta liên kết và điều khiển các linh kiện điện tử.


Các thông số cơ bản:
Vi điều khiển
Điện áp hoạt động
Tần số hoạt động
Dòng tiêu thụ
Điện áp vào khuyên dùng
Điện áp vào giới hạn
Số chân Digital I/O
Số chân Analog
Dòng tối đa trên mỗi chân
I/O
Dòng ra tối đa (5V)
Dòng ra tối đa (3.3V)
Bộ nhớ flash
SRAM
EEPROM

ATmega328 họ 8bit
5V DC (chỉ được cấp qua cổng USB)
16 MHz
khoảng 30mA
7-12V DC
6-20V DC
14 (6 chân hardware PWM)
6 (độ phân giải 10bit)
30 mA
500 mA
50 mA
32 KB (ATmega328) với 0.5KB dùng bởi

bootloader
2 KB (ATmega328)
1 KB (ATmega328)


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

Thông số kỹ thuật:
Driver: L298N tích hợp hai mạch cầu H.
Điện áp điều khiển: +5 V ~ +12 V
Dòng tối đa cho mỗi cầu H là: 2A (=>2A cho mỗi motor)
Điện áp của tín hiệu điều khiển: +5 V ~ +7 V
Dịng của tín hiệu điều khiển: 0 ~ 36mA (Arduino có thể chơi đến 40mA nên
khỏe re nhé các bạn)
 Công suất hao phí: 20W (khi nhiệt độ T = 75 ℃)
 Nhiệt độ bảo quản: -25 ℃ ~ +130 ℃






L298 gồm các chân:
 12V power, 5V power. Đây là 2 chân cấp nguồn trực tiếp đến động cơ.
o Bạn có thể cấp nguồn 9-12V ở 12V.
o Bên cạnh đó có jumper 5V, nếu bạn để như hình ở trên thì sẽ có
nguồn 5V ra ở cổng 5V power, ngược lại thì khơng. Bạn để như
hình thì ta chỉ cần cấp nguồn 12V vơ ở 12V power là có 5V ở 5V
power, từ đó cấp cho Arduino
 Power GND chân này là GND của nguồn cấp cho Động cơ.

o Nếu chơi Arduino thì nhớ nối với GND của Arduino


 2 Jump A enable và B enable, để như hình, đừng rút ra bạn nhé!
 Gồm có 4 chân Input. IN1, IN2, IN3, IN4. Chức năng các chân này tơi sẽ
giải thích ở bước sau.
 Output A: nối với động cơ A. bạn chú ý chân +, -. Nếu bạn nối ngược thì
động cơ sẽ chạy ngược. Và chú ý nếu bạn nối động cơ bước, bạn phải đấu
nối các pha cho phù hợp.


3. Cảm biến khoảng cách HC-SR04
Để đo khoảng cách giữa xe và vật cản.

Để đ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.
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

IV: Sơ đồ nối mạch
1. Arduino với Module điều khiển


2. Arduino với Cảm biến khoảng cách


o

V:


1. Code arduino chạy xe:
#include <Servo.h>
Servo myservo; // create servo object to control a servo
int pos = 0; // variable to store the servo position
/******** khai báo chân input/output**************/
const int trig = 10; // chân trig của SRF-05.

const int echo = 11; // chân echo của SRF-05.
int tien1=7;
// chân IN - A của Module L298.
int tien2=5;
// chân IN - C của Module L298.
int lui1=4;
// chân IN - D của Module L298.
int lui2=6;
// chân IN - B của Module L298.
int dongcoservo=9;
// chân Orange của Servo.
int gioihan = 30;
int i;
int x=0;
unsigned long thoigian; // biến đo thời gian
int khoangcach;
// biến lưu khoảng cách
int khoangcachtrai,khoangcachphai;
void dokhoangcach();
void dithang(int duongdi);
void disangtrai();
void disangphai();
void dilui();
void resetdongco();
void quaycbsangphai();
void quaycbsangtrai();
void setup() {
// put your setup code here, to run once:
myservo.attach(9); // attaches the servo on pin 9 to the servo object
pinMode(trig,OUTPUT); // chân trig sẽ phát tín hiệu

pinMode(echo,INPUT); // chân echo sẽ nhận tín hiệu
pinMode(tien1,OUTPUT);
pinMode(tien2,OUTPUT);
pinMode(lui1,OUTPUT);
pinMode(lui2,OUTPUT);


digitalWrite(tien1,LOW);
digitalWrite(tien2,LOW);
digitalWrite(lui1,LOW);
digitalWrite(lui2,LOW);
// Serial.begin(9600);
myservo.write(90ư);
delay(500);

}
void loop()
{
khoangcach=0;
dokhoangcach();
if(khoangcach>gioihan||khoangcach==0)
{
dokhoangcach();
if(khoangcach>gioihan||khoangcach==0)
{
dithang();
}
}
else
{

resetdongco();
quaycbsangtrai();
khoangcachtrai=khoangcach;
quaycbsangphai();
khoangcachphai=khoangcach;
if(khoangcachphai<10&&khoangcachtrai<10){
dilui();
}
else
{
if(khoangcachphai>=khoangcachtrai)


{
disangtrai();
delay(500);
}
if(khoangcachphai{
disangphai();
delay(500);
}
}
}
//Serial.println(khoangcach);
}
void dithang()
{
digitalWrite(tien1,HIGH);
digitalWrite(tien2,HIGH);

//delay(2);
}
void disangtrai()
{
resetdongco();
digitalWrite(lui1,HIGH);
delay(250);
digitalWrite(lui1,LOW);
}
void disangphai()
{
resetdongco();
digitalWrite(lui2,HIGH);
delay(250);
digitalWrite(lui2,LOW);
}


void dilui()
{
resetdongco();
for(i=0;i<20;i++)
digitalWrite(lui1,HIGH);
digitalWrite(lui2,HIGH);
delay(700);
digitalWrite(lui1,LOW);
digitalWrite(lui2,LOW);
}
void resetdongco()
{

digitalWrite(tien1,LOW);
digitalWrite(tien2,LOW);
digitalWrite(lui1,LOW);
digitalWrite(lui2,LOW);
}
/******** chương trình đo khoảng cách SRF04 ***************/
void dokhoangcach()
{
/* Phát xung từ chân trig */
digitalWrite(trig,0); // tắt chân trig
delayMicroseconds(2);
digitalWrite(trig,1); // phát xung từ chân trig
delayMicroseconds(10); // xung có độ dài 5 microSeconds
digitalWrite(trig,0); // tắt chân trig
/* Tính tốn thời gian */
// Đo độ rộng xung HIGH ở chân echo.
thoigian = pulseIn(echo,HIGH);
// Tính khoảng cách đến vật.
khoangcach = int(thoigian/2/29.412);
}


/*********** chương trình quay cảm biến xang trái *********/
void quaycbsangtrai()
{
myservo.write(180);
// tell servo to go to position in variable 'pos'
delay(1000);
dokhoangcach();
myservo.write(90);

// tell servo to go to position in variable 'pos'
}
void quaycbsangphai()
{
myservo.write(0);
// tell servo to go to position in variable 'pos'
delay(1000);
dokhoangcach();
myservo.write(90);
// tell servo to go to position in variable 'pos'
}
void resetservo()
{
myservo.write(90);
}

2. Code visual studio giao diện điều khiển

namespace BLUETOOTH1
{
partial class Form1
{


/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.

/// </summary>
/// true if managed resources should be disposed;
otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
this.serialPort1 = new System.IO.Ports.SerialPort(this.components);
this.button1 = new System.Windows.Forms.Button();
this.button2 = new System.Windows.Forms.Button();
this.button3 = new System.Windows.Forms.Button();
this.button4 = new System.Windows.Forms.Button();
this.button5 = new System.Windows.Forms.Button();
this.button6 = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// serialPort1
//

this.serialPort1.PortName = "COM4";
//
// button1
//
this.button1.Location = new System.Drawing.Point(114, 50);
this.button1.Margin = new System.Windows.Forms.Padding(2);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(80, 19);
this.button1.TabIndex = 0;
this.button1.Text = "GO_AHEAD";
this.button1.UseVisualStyleBackColor = true;
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// button2
//
this.button2.Location = new System.Drawing.Point(125, 196);
this.button2.Margin = new System.Windows.Forms.Padding(2);
this.button2.Name = "button2";
this.button2.Size = new System.Drawing.Size(56, 19);


this.button2.TabIndex = 1;
this.button2.Text = "STOP";
this.button2.UseVisualStyleBackColor = true;
this.button2.Click += new System.EventHandler(this.button2_Click);
//
// button3
//
this.button3.Location = new System.Drawing.Point(114, 122);
this.button3.Margin = new System.Windows.Forms.Padding(2);

this.button3.Name = "button3";
this.button3.Size = new System.Drawing.Size(80, 19);
this.button3.TabIndex = 0;
this.button3.Text = "GO_BACK";
this.button3.UseVisualStyleBackColor = true;
this.button3.Click += new System.EventHandler(this.button3_Click);
//
// button4
//
this.button4.Location = new System.Drawing.Point(213, 81);
this.button4.Name = "button4";
this.button4.Size = new System.Drawing.Size(91, 23);
this.button4.TabIndex = 3;
this.button4.Text = "TURN RIGHT";
this.button4.UseVisualStyleBackColor = true;
this.button4.Click += new System.EventHandler(this.button4_Click);
//
// button5
//
this.button5.Location = new System.Drawing.Point(12, 81);
this.button5.Name = "button5";
this.button5.Size = new System.Drawing.Size(75, 23);
this.button5.TabIndex = 4;
this.button5.Text = "TURN LEFT";
this.button5.UseVisualStyleBackColor = true;
this.button5.Click += new System.EventHandler(this.button5_Click);
//
// button6
//
this.button6.Location = new System.Drawing.Point(12, 12);

this.button6.Name = "button6";
this.button6.Size = new System.Drawing.Size(75, 23);
this.button6.TabIndex = 5;
this.button6.Text = "AUTO";
this.button6.UseVisualStyleBackColor = true;
this.button6.Click += new System.EventHandler(this.button6_Click);
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(332, 277);
this.Controls.Add(this.button6);
this.Controls.Add(this.button5);
this.Controls.Add(this.button4);
this.Controls.Add(this.button3);
this.Controls.Add(this.button2);
this.Controls.Add(this.button1);
this.Margin = new System.Windows.Forms.Padding(2);


this.Name = "Form1";
this.Text = "Form1";
this.ResumeLayout(false);
}
#endregion
private
private
private
private

private
private
private

System.IO.Ports.SerialPort serialPort1;
System.Windows.Forms.Button button1;
System.Windows.Forms.Button button2;
System.Windows.Forms.Button button3;
System.Windows.Forms.Button button4;
System.Windows.Forms.Button button5;
System.Windows.Forms.Button button6;

}
}

Program
using
using
using
using
using

System;
System.Collections.Generic;
System.Linq;
System.Threading.Tasks;
System.Windows.Forms;

namespace BLUETOOTH1
{

static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}

From1 cs
using System;
using System.Collections.Generic;


using
using
using
using
using
using
using

System.ComponentModel;
System.Data;

System.Drawing;
System.Linq;
System.Text;
System.Threading.Tasks;
System.Windows.Forms;

namespace BLUETOOTH1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
openPort();
}
private void openPort()
{
if (!serialPort1.IsOpen)
{
serialPort1.Open();
}
}
private void closePort()
{
if (serialPort1.IsOpen)
{
serialPort1.Close();
}
}
private void button1_Click(object sender, EventArgs e)

{
serialPort1.Write("1");
}
private void button2_Click(object sender, EventArgs e)
{
serialPort1.Write("0");
}
private void button3_Click(object sender, EventArgs e)
{
serialPort1.Write("2");
}
private void button5_Click(object sender, EventArgs e)
{
serialPort1.Write("5");
}
private void button4_Click(object sender, EventArgs e)
{
serialPort1.Write("4");
}


private void button6_Click(object sender, EventArgs e)
{
serialPort1.Write("6");
}
}
}

Kết quả thu được


video-1609846128.
mp4

video-1609601288.
mp4

KẾT LUẬN CHUNG
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 Bùi Đình Bá đã tận tình hướng dẫn, góp ý chúng em trong quá trình
thực hiện đề tài.
Tư liệu tham khảo
-
- />


×