LỜI NÓI ĐẦUNgà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ì
Trang 1TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
VIỆN CƠ KHÍ
**********************
Đề 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 20184490
Hà Nội 1-2018
Trang 2LỜ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
Trang 3Mục Lục Lời nói đầu……….1
Trang 4I: 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
Trang 51 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 ATmega328 họ 8bit
Điện áp hoạt động 5V DC (chỉ được cấp qua cổng USB) Tần số hoạt động 16 MHz
Dòng tiêu thụ khoảng 30mA
Điện áp vào khuyên dùng 7-12V DC
Điện áp vào giới hạn 6-20V DC
Số chân Digital I/O 14 (6 chân hardware PWM)
Số chân Analog 6 (độ phân giải 10bit)
Dòng tối đa trên mỗi chân
Dòng ra tối đa (5V) 500 mA
Dòng ra tối đa (3.3V) 50 mA
Bộ nhớ flash 32 KB (ATmega328) với 0.5KB dùng bởi bootloader SRAM 2 KB (ATmega328)
EEPROM 1 KB (ATmega328)
Trang 62 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ơ
oBạn có thể cấp nguồn 9-12V ở 12V
oBê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
oNếu chơi Arduino thì nhớ nối với GND của Arduino
Trang 7 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
Trang 83 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
IV: Sơ đồ nối mạch
1 Arduino với Module điều khiển
Trang 92 Arduino với Cảm biến khoảng cách
Trang 10V:
Trang 111 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);
Trang 12digitalWrite(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)
Trang 13{
disangtrai();
delay(500);
}
if(khoangcachphai<khoangcachtrai) {
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);
}
Trang 14void 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 toá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);
}
Trang 15/*********** 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
{
Trang 16/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null ;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name=" disposing "> 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);
Trang 17this 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);
Trang 18this Name = "Form1" ;
this Text = "Form1" ;
this ResumeLayout( false );
}
#endregion
private System.IO.Ports.SerialPort serialPort1;
private System.Windows.Forms.Button button1;
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;
}
}
Program
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using 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;