Đề tài thiết kế xe chạy theo đường vẽ sẵn được chúng em thực hiện dựa trên nền kiến thức về mạch điện tử, vi xử lý nói chung và vi điều khiển họ 8051 nói riêng. Thực hiện đề tài này là tiền đề để chúng em nắm được kiến thức các môn học trong các kì học, củng cố và bổ sung những kinh nghiệm còn
Trang 1HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIẾN THÔNG
KHOA KĨ THUẬT ĐIỆN TỬ 1
BÁO CÁO
ĐỒ ÁN THIẾT KẾ HỆ THỐNG NHÚNG
ĐỀ TÀI:
“Thiết kế robot dò đường theo vạch đen”
GVHD: TS.Nguyễn Ngọc Minh Lớp: D09XLTH1
Nhóm 1: Vũ Thanh Hường
Phạm Minh Khánh
Hà Nội, ngày 15 tháng 4 năm 2013
Trang 2ra, ADC, DAC, timer, ngắt… Ở máy tính thì các module thường được xây dựng bởi các chip và mạch ngoài
Hầu hết các vi điều khiển ngày nay được xây dựng dựa trên kiến trúc Harvard, kiến trúc này định nghĩa bốn thành phần cần thiết của một hệ thống nhúng Những thành phần này là lõi CPU, bộ nhớ chương trình (thông thường là ROM hoặc bộ nhớ Flash), bộ nhớ
dữ liệu RAM, một hoặc vài bộ nhớ định thời và các cổng vào/ra để giao tiếp với các thiết
bị ngoại vi và các môi trường bên ngoài- tất cả các khối này được thiết kế trong một vi mạch tích hợp Vi điều khiển khác với các vi xử lí đa năng ở chỗ là nó có thể hoạt động chỉ với vài vi mạch hỗ trợ bên ngoài
Đề tài thiết kế xe chạy theo đường vẽ sẵn được chúng em thực hiện dựa trên nền kiến thức về mạch điện tử, vi xử lý nói chung và vi điều khiển họ 8051 nói riêng Thực hiện đề tài này là tiền đề để chúng em nắm được kiến thức các môn học trong các kì học, củng cố và bổ sung những kinh nghiệm còn thiếu
Hà Nội, ngày 14 tháng 4 năm 2013 Nhóm sinh viên thực hiện
MÔ TẢ KĨ THUẬT
Trang 31 Phần mạch
Hai mạch chính sử dụng trong bài tập này là mạch SENSOR để dò đường và mạch VI
XỬ LÍ VÀ ĐỘNG CƠ để thu tín hiệu, xử lí và đưa ra tín hiệu điều khiển hai động cơ để dẫn hướng Ngoài ra, để nạp chương trình cho vi điều khiển, chúng em sử dụng mạch nạp ISP và nạp trực tiếp cho vi điều khiển
a Mạch Sensor
Đường đi của xe được vẽ bằng vạch đen nằm trên nền trắng Để xe nhận ra được đường đi, chúng em sử dụng các cặp led thu phát hồng ngoại đặt gần nhau Các led phát phát ra ánh sáng màu đỏ đục, các led thu có điện trở phụ thuộc vào có nhận được ánh sáng phản xạ từ đường đi hay không
Khi cặp thu phát ở vị trí nền trắng, ánh sáng từ led phát phát ra phản xạ trên nền trắng và tới led thu Led thu thu được ánh sáng này thì điện trở giảm xuống, điện áp ở cực Anot (+) của led thu gần về 5V Ngược lại, ở vị trí vạch đen, ánh sáng từ led phát phát ra không phản xạ lại được do bị vạch đen hấp thụ Led thu không nhận được ánh sáng này nên điện áp ở cực Anot của nó gần bằng 0 V Điện áp ra từ led thu được đem so sánh với điện áp chuẩn đã được tinh chỉnh hợp lý qua IC LM393 để cho ra mức logic 0-1, đưa vào
vi điều khiển xử lý
Hình ảnh minh họa như sau:
Trang 4
IC LM393 gồm 2 bộ so sánh:
Khi led ở ngoài nền trắng, mức điện áp trên led thu đo được là cao hơn so với mức
so sánh điện áp ngưỡng, ngược lại, mức điện áp thu đo được khi bắt vào vạch đen là thấp hơn so với mức so sánh điện áp Điện áp so sánh (Vref) được đặt qua biến trở 20k
Khi ở ngoài nền trắng: Vled thu >Vref nên Output=0
Khi bắt vạch đen: Vled thu <Vref nên Output=1
Để bắt đường được tốt, chúng em sử dụng 4 cặp led thu phát được bố trí như sau (LT: Led thu; LP: Led phát)
LT1 LT2 LT3 LT4
LP1 LP2 LP3 LP4
Chiều rộng của 2 Led giữa là 28mm ( ôm 2 bên vạch )
Sơ đồ nguyên lí:
Trang 5b Khối nguồn
Trong khối nguồn chúng ta sử dụng 1 bình ắc quy khô 12V.Mặt khác hệ thống điều khiển cần phải có nguồn 5V để cung cấp cho khối VI ĐIỀU KHIỂN và khối SENSORS
Để tạo nguồn 5V DC chúng ta sử dụng IC ổn áp 7805, với đầu vào gồm đất chung của toàn hệ thống và nguồn 12 V DC lấy trực tiếp từ nguồn ắc quy.2 IC ổn áp LM7805 được lắp một tản nhiệt loại nhỏ để tản bớt nhiệt khi hoạt động giúp khối nguồn cũng như toàn
bộ mạch hoạt động ổn định Cùng với hệ thống các tụ điện tạo ổn áp cho nguồn
Mạch nguồn như sau:
Trang 61 con IC 7805 cung cấp nguồn cho mạch chính và chip 1 con cung cấp cho sensor, cung cấp riêng để chống nhiễu cho sensor
Trong mạch nguồn có sử dụng một cầu chì kí hiệu là SW3 phòng xảy ra sự cố chập mạch, nhằm bảo vệ cho mạch nguồn cũng như các khối liên quan khác
c Khối vi điều khiển
Khối này gồm có Vi điều khiển AT89S52, mạch RESET, mạch tạo dao động, các led báo vạch về từ mạch SENSORS, Jumpers đầu vào dùng để nạp ISP
+ Vi điều khiển AT89S52 được chúng ta sử dụng vì nó có đầy đủ những chức năng của vi điều khiển AT89C51 Ngoài ra còn có thêm một timer (timer2) và có bộ nhớ Flash, công nghệ nạp ISP (In System Programming) tức là nạp mà không cần tháo chip ra khỏi mạch, giúp việc lập trình và test rất thuận tiện Giá thành thậm chí còn rẻ hơn AT89C51
Trang 7+ Mach RESET có chức năng reset lại hoạt động của vi điều khiển, được nối vào chân số 9 của vi điều khiển là chân tích cực cao Khi chân số 9 được set lên 1 thì vi điều khiển được reset lại Để chống rung khi ấn nút, chúng ta dùng một tụ hóa nối song song với nút ấn
+ Mạch DAO ĐỘNG sử dụng thạch anh 12Mhz, như vậy một chu kì máy là 1us, rất thuận tiện cho việc tính toán và lập trình Tuy nhiên có hạn chế là không thể truyền thông với máy tính qua cổng COM (đòi hỏi thạch anh 11.0592Mhz) Thạch anh này được nối đất với tụ gốm 33p để lọc nhiễu
+ Các Jumpers dùng để nạp ISP sử dụng mạch nạp ISP loại đơn giản, chỉ cần dùng 5 chân: GND, MOSI, MISO, SCK, RESET nối với cổng LPT của máy tính thông qua jack DB25 Sử dụng kiểu nạp ISP này rất thuận tiện khi lập trình và test xe vì không phải tháo chip (hạn chế hỏng, gẫy chân chip), tốc độ nạp chấp nhận được, ít khi bị lỗi, chi phí thấp + Các led báo vạch về dùng để phản ánh tình trạng của các led thu phát ở mạch SENSORS Khi một cặp thu-phát bắt vào vạch đen thì led báo tương ứng sẽ tắt và ngược lại Nói cách khác, các led báo này phản ánh vị trí lệch của xe so với vạch đen, từ đó giúp debug chương trình thuận tiện hơn rất nhiều
Trang 8d Khối điều khiển động cơ
Để điều khiển động cơ quay thuận ngược nhanh chậm, chúng ta không thể dùng trực tiếp các chân của vi điều khiển được vì dòng ra của chân vi điều khiển nhỏ Do vậy chúng
ta sử dụng IC L293D gồm hai mạch cầu H bên trong, mỗi mạch cầu H dùng điều khiển một động cơ có sơ đồ khối như hình vẽ:
Trang 9Trong khối này còn sử dụng một công tắc nguồn, có tác dụng bật tắt động cơ khi điều chỉnh vị trí của xe trước khi chạy
Bảng chân lý mô tả hoạt động của L293D trên một kênh như sau
Trang 10Sơ đồ nguyên lí chung:
Trang 112 Mô tả thiết kế Cơ Khí cho xe
Thân xe được làm từ một thanh nhôm hình hộp chữ nhật :12x25,,đằng trước có gắn bánh lái có thể quay 360o, do vậy chuyển động của xe phần lớn do hai bánh sau quyết định Hai bánh đằng sau được lắp vào hai trục của động cơ một chiều để lái chiều chuyển động của xe
Hai động cơ sử dụng là động cơ một chiều loại 12V được gắn chặt vào thân xe bằng các đai và ốc vít
Mạch SENSORS kết nối với mạch vi điều khiển qua sợi cáp 8 sợi trong đó có hai sợi cấp nguồn 5V và 6 sợi truyền tín hiệu của mạch SENSORS về cho vi điều khiển
Phần cơ khí của xe:
3.Thiết Kế Phần Mềm
Trang 12Lưu đồ thuật toán điều khiển:
XE CHUYỂN ĐỘNG
Trang 13CODE cho vi điều khiển
#include <REGX51.H>
KHỞI TẠO GIỚI THIỆU
DÒ ĐƯỜNG
LỆCH
YES NO
Cua trái
Or Cua phải
Đi thẳng
YES NO
Chương trình con khi bắt vạch đích VẠCH
Trang 14#define s1 P1_0
#define s2 P1_1
#define s3 P1_2
#define s4 P1_3
#define tien 1
#define lui 0
#define dc_trai_dung P2_3=0;P2_1=0;
#define dc_phai_dung P2_2=0;P2_0=0;
/*********Khai bao bien toan cuc************/
unsigned char xung2=50,dem_t0=0,xung1=50,dem_t1=0,so_vong=1;
/*********Cac ham con***********************/
//Ham tre
void tre(long time)
{
long i;
for(i=0;i<time;i++)
{}
}
//Khoi timer
void init_ngat()
{
TMOD=0x22; //Dat che do 8 bit tu nap lai cho timer 0 va timer 1
Trang 15EA=1; //Cho phep ngat toan cuc
}
//Ham thuc hien ngat timer 0
{
TR0=0; //Tat timer 0
dem_t0++;
if(dem_t0==100)
dem_t0=0;
if(dem_t0<xung1)
PWM1=1;
else
PWM1=0;
}
//Ham thuc hien ngat timer 0
{
TR1=0; //Tat timer 1
dem_t1++;
if(dem_t1==100)
dem_t1=0;
if(dem_t1<xung2)
PWM2=1;
else
PWM2=0;
}
void dong_co_trai(unsigned char trang_thai,unsigned char so_xung)
{
if(trang_thai==tien)
{P2_3=1;P2_1=0;}
else if(trang_thai==lui)
{P2_3=0;P2_1=1;}
xung1=so_xung;
}
void dong_co_phai(unsigned char trang_thai,unsigned char so_xung)
{
if(trang_thai==tien)
{P2_2=0;P2_0=1;}
else if(trang_thai==lui)
{P2_2=1;P2_0=0;}
xung2=so_xung;
}
void bao_vong()
{
if(so_vong==0)
Trang 16if(!up)
{
tre(10);
if(!up)
{
while(!up);
so_vong++;
if(so_vong>4) so_vong=1;
} }
if(!down)
{
tre(10);
if(!down)
{
while(!down);
so_vong ;
if(so_vong<1) so_vong=3;
} }
bao_vong();
}
while(!ok);
TR0=1;
TR1=1;
while(so_vong>0)
{
{
dong_co_trai(tien,100);
dong_co_phai(tien,100);
i=1;
}
else if(i!=2&&!s1&&s2&&!s3&&!s4)//lech phai 1
Trang 17dong_co_trai(tien,50);
dong_co_phai(tien,100);
i=2;
}
else if(i!=3&&!s1&&!s2&&s3&&!s4)//lech trai 1
{
dong_co_trai(tien,100);
dong_co_phai(tien,50);
i=3;
}
else if(s1&&!s2&&!s3&&!s4) //lech phai 2
{
dong_co_trai(tien,80);
dong_co_phai(tien,100);
tre(10);
if(s1&&s4)
{
dong_co_trai(tien,100);
dong_co_phai(tien,100);
while(s1||s4);
so_vong ;
bao_vong();
} else
{
dc_trai_dung;
dong_co_phai(tien,100);
while(!s3);
}
}
else if(!s1&&!s2&&!s3&&s4) //lech trai 2
{
dong_co_trai(tien,100);
dong_co_phai(tien,80);
tre(10);
if(s1&&s4)
{
dong_co_trai(tien,100);
dong_co_phai(tien,100);
while(s1||s4);
so_vong ;
bao_vong();
} else
{
dc_phai_dung;
dong_co_trai(tien,100);
while(!s2);
}
}
else if(s1&&s2&&!s3&&!s4) //gap goc vuong trai
Trang 18dong_co_phai(tien,100);
while(s1||s4);
so_vong ;
bao_vong();
}
}
}
/*********Ham chinh*************************/
void main()
{
P1=0xff;
s1=1;s2=1;s3=1;s4=1;
while(1)
{
TR0=0;
TR1=0;
init_ngat();
dc_trai_dung;
dc_phai_dung;
run();
}
}