- Camera diboom 998:
Độ phân giải 640x480, 310 nghìn điểm ảnh. Nhận tín hiệu đưa về PC
Hình 3.3 Camera nhận ảnh và truyền về máy tính.
- Thanh trượt:
Vật liệu: nhôm thanh(38x38), dày 4mm.
Tác dụng: vừa làm thanh trượt vừa làm thanh đỡ cho động cơ 1.
Hình 3.4 Thanh trượt.
- Thanh đỡ:
20
Tác dụng: giữ camera. - Động cơ 1:
Là động cơ hộp số(24v), tốc độ 5000rpm. Trên động cơ có gắn một con lăn để kéo ổ trượt lên hoặc xuống.
Hình 3.5 Động cơ trên dùng để nâng,hạ camera.
- Ổ trượt:
Gồm 4 con lăn gắn chặt bởi 2 tấm nhôm và được áp chặt vào thanh trượt. Tác dụng: nâng hạ camera nhờ thanh đỡ.
21
- Bánh trước:
Gồm 2 bánh ômi có tác dụng điều hướng đi của xe.
Hình 3.7 Bánh trước.
- Động cơ 2 và 3:
Là 2 động cơ DC(24v), tốc độ 6000v/p. Tát dụng: truyền chuyển động cho 2 bánh sau.
Hình 3.8 Động cơ 2,3 và hai bánh sau
- Bánh sau:
Gồm 2 bánh nhôm đươc bọc dây cao su làm tăng độ ma sát.
22
23 Chương 4: Thiết Kế Phần Mạch Điện 4.1Tổng quát Hình 4.1 Sơ đồ tổng quát của hệ thống. MÁY TÍNH CAMERA MẠCH VI ĐIỀU KHIỂN ATMEGA 32 MẠCH MAX 232 ĐỘNG CƠ DC 24V MẠCH ĐIỀU KHIỂN ĐỘNG CƠ DC 24V MẠCH ĐIỀU KHIỂN ĐỘNG CƠ DC 24V MẠCH ĐIỀU KHIỂN ĐỘNG CƠ DC 24V ĐỘNG CƠ DC 24V ĐỘNG CƠ DC 24V
24 4.2Mạch điều khiển
4.2.1 Yêu cầu:
Chip sử dụng trong mạch điều khiển phải có đủ ngõ vào/ra để đọc tín hiệu từ máy tính truyền xuống và để xuất tín hiệu điều khiển động cơ.
Mô hình sử dụng cổng Com kết nối hai chân PORTD.0 và PORTD.1 truyền tín hiệu cho vi điều khiển và 6 chân dùng cho xuất tín hiệu điều khiển các động cơ. Như vậy ít nhất phải có 8 ngõ dùng cho vào ra.
4.2.2 Giải pháp:
Thứ nhất:
Dùng họ vi điều khiển 89xxx có đủ ngõ vào ra. Ngôn ngữ lập trình dể hơn với người mới bắt đầu học. Nhưng chương trình thường dài dòng gây khó hiểu.
Thứ hai:
Dùng họ vi điều khiển Atmega. Nếu dùng Atmega 8 tuy đảm bảo yêu cầu đặt ra nhưng ít được sử dụng. Một cách khác là dùng Atmega 32 hoăc 64 sẽ tạo ra đủ ngõ ra, đáp ứng yêu cầu đặt ra mà không cần phải kết nối thêm IC nào khác.
Lựa chọn:
Với yêu cầu đặt ra nhóm quyết định chọn Atmega 32 làm chip chính trong mạch điều khiển. Vì có đủ ngõ ra vào, kết nối đơn giản và đáp ứng được yêu cầu đặt ra. Dưới đây là nguyên lý mạch điều khiển sau khi được thiết kế bằng phần mềm Orcad:
25 4.3 Mạch kích:
Nhóm đã chọn 3 mạch kích giống nhau: 1 Fet I RF 540 và 1 relay để kích cho 3 động cơ.
Hình 4.3 Sơ đồ nguyên lý của mạch điều khiển động cơ DC.
Nguyên lý hoạt động:
Mạch dùng hai tín hiệu điều khiển DIR+ và PWM+.Trong đó PWM+ là thành phần chính để điều khiển động cơ,DIR+ dùng để đảo chiều động cơ,hai chân DIR- và PWM- nối với GND của vi điều khiển.
Bình thường opto PC817 ở mức thấp relay 1 hoạt động ở chế độ bình thường chân số 6 và số 3 dẫn với nhau.Động cơ đi tới.
Khi có tín hiệu từ DIR+ thì opto PC817 dẫn relay 1 hoạt động chân số 6 và số 8 dẫn vớinhau,lúc này động cơ đang đi tới sẽ đảo ngược và đi lùi.
Tương tự như vậy,hai bên robot sẽ được đặt hai mạch kích Fet và Relay như trên.
Muốn robot đi tới thì opto PC817 hoạt động ở mức thấp,còn khi robot đi lùi sẽ ngược lại opto PC817 sẽ được kích từ chân DIR+
Khi robot rẽ trái thì một bên sẽ opto PC817 sẽ được kích,một con sẽ không kích.
26 Hình 4.4 :Đặc tính ngõ ra của IRF 540 Hình 4.5 : Mạch kích cho IRF540 Khi opto PC921 dẫn thì: Vg = (Vd / ( R6 + R7)) x R6. Vg = (12 / (0,1+0,33)) x 0,33= 9,21 (V).
27
Hình 4.5 : Mạch kích cho Relay
A1015 là transitor PNP,được kích khi có dòng đổ từ C qua B xuống mass.Bình thường opto PC817 chưa dẫn thì dòng Ib = 0A
Khi kích PC817 có dòng đổ qua transitor lúc này dòng Ib sẽ bằng: Ib = (12 – 0,7) / 1000 = 0,01 A
Ic = 0,01 x hf = 0,01 x 850 = 8,5 A
Điều kiện để transistor dẫn bão hòa khi Ic > Icbh Icbh = (Vcc- 0,7)/R
R: là là điện trở của động cơ khoảng 20Ω Suy ra: Icbh = (12-0,7)/20 = 500 mA
28
4.4 Động cơ truyền chuyển động chính:
4.4.1 Yêu cầu đặt ra:
- Công suất vừa do tải là chuyển động chính điều khiển mô hình . - Tốc độ quay chậm, moment quay lớn.
- Dừng nhanh và chính xác. - Có khả năng ghim vị trí. 4.4.2 Chọn động cơ: Điện áp định mức: 9v-48v Dòng điện định mức: 4A Tốc độ định mức: 5500-8320v/p 4.4.3 Chếđộ hoạt động:
Dùng PWM để điều khiển động cơ DC,tín hiệu sẽ xuất ra từ VĐK qua 2 chân PortD.4 và PortD.5 với tần số l à 125.000Khz,vì động cơ không cần quoay nhanh nên đây là tần số vừa đủ.Nếu PWM quá lớn sẽ làm cho động cơ quay quá nhanh dẫn đến khó điều khiển chính xác.
29
Chương 5
THIẾT KẾ PHẦN MỀM
5.1 Giao diện trên máy tính:
5.1.1 Yêu cầu:
-Giao diện thân thiện với người dùng.
-Tốc độ phải nhanh để đáp ứng sự thay đổi của đối tượng.
-Chương trình phần mềm phải giao tiếp được với VĐK nhận dữ liệu về từ PC.
5.1.2 Giải pháp:
- Dùng ngôn ngữ Visual C++.Net (VC++.Net )
Trong chương trình, nhóm đã được học qua ngôn ngữ lập trình này. Tập lệnh của nó rất mạnh, phần đồ họa cũng đẹp mắt. Đồng thời các hàm, các thư viện của nó cũng rất nhiều. Tuy nhiên, câu lệnh của VC dài dòng và nhiều, nếu người mới bắt đầu viết thì sẽ gặp nhiều khó khăn trong việc lựa chọn câu lệnh xử lý nào để chương trình thực hiện được và tối ưu.
- Dùng ngôn ngữ Visual Basic.Net (VB.Net)
Đây cũng là một ngôn ngữ rất mạnh trong lập trình giao diện đồ họa. Tuy nhiên nhóm chúng em chưa được học ngôn ngữ này, nhưng nhóm cũng đã có dịp tìm hiểu trước đây. Câu lệnh của VB.Net đơn giản hơn VC++.Net.
- Dùng ngôn ngữ CSharp (C#.Net)
Đây là ngôn ngữ kết hợp giũa VB.Net và VC++.Net.Tập lệnh của nó mạnh và đơn giản hơn của cả hai ngôn ngữ trên rất thích hợp cho những mới người lập trình và cũng rất đơn giản,dễ hiểu.Bên cạnh đó cũng có hỗ trợ nhiều source code trên Internet.Do đó nhóm chúng em chọn ngôn ngữ này để sử dụng.
Ưu điểm của các ngôn ngữ này là trình viết trên nền dotNET là khả năng ứng dụng linh hoạt, không phụ thuộc vào phần cứng và hệ điều hành của máy.
30
5.1.3 Thiết kế giao diện:
Đây là giao diện chính của chương trình:
Hình 5.1 Giao diện chính của chương trình.
- Phần nhận dạng khuôn mặt người là một PictureBox đọc ảnh từ webcam truyền lên máy tính.
- Phần tọa độ khuôn mặt hiển thị vị trí của khuôn mặt trong PictureBox.
31
Hình 5.3 Phần hiển thị tọa độ khuôn mặt.
- Phần điều khiển là các Button. Cho phép người dùng điều khiển bằng tay khi cần thiết.
32
- Cuối cùng là các button điều khiển chương trình và các hiển thị xung quanh.
Hình 5.5 Nút điều khiển chính.
5.2 Chương trình nhận dạng và xử lý:
5.2.1 Lưu đồ dãy thuật:
N Y Begin Camer Khuôn mặt người PC Xuất chuỗi ký tự ra serial port
33
5.2.2 Hoạt động của chương trình:
Nhấn nút Start để bắt đầu chương trình, một PictureBox sẽ nhận ảnh liên tục từ camera và sẽ nhận dạng đâu là khuôn mặt có trong ảnh. Một hình vuông được vẽ lên trong khuôn mặt để phát hiện là có người trong ảnh. Trong trường hợp không có ảnh được xác định, ta có các button điều khiển bằng tay để điều khiển robot di chuyển theo ý muốn. Trường hợp khác nếu có nhiều ảnh thì camera sẽ nhận khuôn mặt lớn nhất.
Phần xác định vị trí sẽ phát hiện tọa độ của khuôn mặt trên picturebox. Sau đây là ảnh mà camera nhận được và đoạn code giúp xác định vị trí khuôn mặt trên ảnh:
private void timer1_Tick(object sender, EventArgs e) {
using (Image<Bgr, byte> nextFrame = cap.QueryFrame()) {
if (nextFrame != null) {
Image<Gray, byte> grayframe = nextFrame.Convert<Gray, byte>(); var faces = grayframe.DetectHaarCascade(haar, 1.4, 4,
HAAR_DETECTION_TYPE.DO_CANNY_PRUNING, new Size(nextFrame.Width / 8, nextFrame.Height / 8))[0];
foreach (var face in faces) {
nextFrame.Draw(face.rect, new Bgr(1, double.MaxValue, 0), 3); Image<Bgr, byte> nextfram1 = nextFrame.Copy();
double toadox = (face.rect.X + face.rect.Width / 2); double toadoy = (face.rect.Y + face.rect.Height / 2); double d = 320 - toadox;
double g = 240 - toadoy;
textBox1.Text = "Khoang cach x :" + d.ToString(); textBox2.Text = "Khoang cach y :" + g.ToString(); textBox3.Text = toadox.ToString();
textBox4.Text = toadoy.ToString();
double khoangcach = face.rect.Width/10 * face.rect.Height/10; if (d > 20) { label3.Visible = true; label6.Visible = false; label7.Visible = false; } if (d < -20) { label6.Visible = true;
34 label3.Visible = false; label7.Visible = false; } if (d == 0) { label3.Visible = false; label6.Visible = false; } textBox4.Text = khoangcach.ToString(); if (khoangcach > 400) { label8.Visible = true; label7.Visible = false; } if (khoangcach < 400) { label7.Visible = true; label8.Visible = false; } } imageBox1.Image = nextFrame;
Khi đã bắt được 1 khuôn mặt gần nhất trong số nhiều khuôn mặt hoặc chỉ có 1
khuôn mặt duy nhất trong ảnh. Dựa vào hình chữ nhật vẽ được lên khuôn mặt sẽ được so
sánh với vị trí của khuôn mặt chuẩn. Cuối cùng dựa vào sự so sánh đó, sẽ truyền xuống VĐK các ký tự tùy thuộc người lập trình.
35
serialPort1.PortName = "COM1";
serialPort1.Open(); serialPort1.Write("A");
Sau khi nhận các ký tự từ PC truyền xuống VĐK sẽ xử lý dựa vào chương trình đã được nạp vào chip.
5.3 Chương trình trên chip Vi điều khiển:
5.3.1Yêu cầu:
-Chương trình phải đáp ứng nhanh,tốc độ xử lý cao. -Nhận dữ liệu từ máy tính chính xác.
-Tự động dò tìm, nhận dạng khuôn mặt.
-Phải điều khiển động cơ nhanh chóng và mịn.
5.3.2 Giải pháp:
Có hai phương án là dùng ngôn ngữ Assembly và ngôn ngữ C -Viết bằng ngôn ngữ Assembly:
Chương trình Assembly thì đơn giản và dễ dàng cho người mới bắt đầu học VĐK,câu lệnh gần với lệnh của máy .Tuy nhiên, chương trình Assembly sẽ trở nên khó khăn và phức tạp với những chương trình dài,có nhiều vòng lặp,điểm rẻ nhánh.vv..
Chương trình viết bằng C thì câu lệnh sẽ rõ ràng hơn so với ngôn ngữ Assembly.Nhưng vẫn còn mặt hạn chế là trình biên dịch sẽ gây ra nhiều lỗi mà người lập trình không thể nhận ra.Có rất nhiều chương trình viết bằng ngôn ngữ C như : CodeVisionAVR C Compiler,Bascom.v.v..
Nhóm chúng em chọn chương trình CodeVisionAVR để viết cho VĐK vì đây cũng là chương trình dễ hiểu và dễ dàng sử dụng,Hơn nữa trước đây nhóm cũng đã học qua trong môn VĐK.
36 5.3.3 Lưu đồ chương trình VĐK: N N N N Y Y Y Y N N N N Y Y Begin ‘a’||’A’ Kiểm tra chuỗi k=getchar(); ‘b’||’B’ ‘c’||’C’ ‘d’||’D’ ‘e’||’E’
dilui() sangphai sangtrai(
dung() ‘G’ ‘F’ ditoi() dixuong dilen(
37
5.3.4 Chương trình con:
ditoi(): dilui():
sangphai(): sangtrai():
dilen(): dixuong(): dung():
PC xử lý và truyền liên tục các chuỗi ký tự xuống VĐK qua cổng serial port. VĐK sau khi nhận được 1 trong các chuỗi từ PC truyền xuống, dựa vào đoạn chương trình đã được nạp sẵn trong chip Atmega32 sẽ xuất tín hiệu điều khiển động cơ liên tục. ditoi PWM1=80;Dir1=0; PWM2=80;Dir2=0; dilui PWM1=80;Dir1=1; PWM2=80;Dir2=1; sangph PWM1=80;Dir1=1; PWM2=80;Dir2=0; sangtr PWM1=80;Dir1=0; PWM2=80;Dir2=1; dilen PWM0=80; Dir0=0; dixuon PWM0=80; Dir0=1; dung PWM1=0; PWM2=0; PWM0=0;
38 5.3.5 Chương trình chính viết cho VĐK: void ditoi(void) { OCR1A=0; OCR1B=0; PORTC=0; delay_ms(20); OCR1A=80; OCR1B=80; } void dilui(void) { OCR1A=0; OCR1B=0; PORTC=0x06; OCR1A=80; OCR1B=80; delay_ms(20); } void sangphai(void) { OCR1A=0; OCR1B=0; PORTC=0x02; OCR1A=80; OCR1B=80; delay_ms(20); } void sangtrai(void) { OCR1A=0; OCR1B=0; PORTC=0x04; OCR1A=80; OCR1B=80; delay_ms(20); } void dilen(void) { OCR0=0; PORTA=0; OCR0=100; delay_ms(10); } void dixuong(void) { OCR0=0; PORTA=0x01; OCR0=160; delay_ms(10); }
39
5.3.6 Chương trình vòng lặp chính:
40 5.4 Kết quả thực nghiệm đạt được:
Thực hiện thí nghiệm với khuôn mặt chuẩn: Đối
tượng Số lần Ánh sáng
Khoảng
cách phát hiện không
phát hiện Độ chính xác %
Người 50 Ban ngày 0.2-2 50 0 100%
Người 50 Ban ngày 2-3.5 35 15 70%
Người 50 Đèn điện 0.2-2 50 0 100% Người 50 Đèn điện 2-3.5 30 20 60% Người 50 x >4 4 46 8% Ảnh có mặt người 50 x 0.2-1 20 30 40% Đối tượng khác 50 x >0.2 0 50 0%
Thực hiện thí nghiệm với khuôn mặt không chuẩn: Đối tượng Số lần Ánh sáng Nghiêng (Độ) Khoảng cách Phát hiện Không phát hiện Độ chính xác % Người 50 Ngày 0-20 0.2-2 40 10 80% Người 50 Điện 0-20 2-3.5 15 35 30%
Nhận xét: Đối với ánh sáng ban ngày thì tỉ lệ chính xác sẽ cao hơn so với ánh sáng điện, hay ban đêm..kết quả cũng sẽ chính xác hơn với những khuôn mặt người nhìn thẳng. Tuy nhiên, tốc độ nhận dạng quá nhanh cũng ảnh hưởng đến robot, làm cho robot di chuyển nhanh và khoảng cách làm việc sẽ bị ảnh hưởng(chạy quá nhanh,không còn bắt được khuôn mặt, việc xác định vị trí khó khăn,… ).
41
Chương 6
KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN
6.1 Những điều đã làm được:
Hoàn thành thiết kế và thi công phần cơ khí mô hình robot bám đối tượng.
Thiết kế và thi công mạch điều khiển, mạch kích các động cơ DC dùng trong đố án.
Thiết kế giao diện điều khiển trên máy tính, thực hiện thành công giao tiếp giữa máy tính và vi điều khiển.
Viết xong chương trình hoạt động xử lý trên PC và chương trình điều khiển nạp cho chip Atmega32. Chương trình hoạt động thành một quy trình liên tục từ khâu nhận ảnh cho đến truyền tín hiệu, xử lý và điều khiển.
6.2 Những điều chưa làm được:
Chương trình giao diện người dùng vẫn còn chưa chuyên nghiệp.
Vấn đề bảo mật cho người dùng vẫn chưa thực hiện được.
6.3 Hướng phát triển của đề tài:
Tín hiệu nhận từ camera truyền về PC. Sau khi xử lý, các chuỗi ký tự được truyền xuống VĐK, tất cả đều thực hiện không dây thông qua wireless hoặc bluetooth.
Phát triển đề tài thành 1 sản phẩm có thể ứng dụng vào thực tế hay làm mô hình dạy học.
42
TÀI LIỆU THAM KHẢO
1. Trần Lê Hồng Dũ,”Phát hiện khuôn mặt dựa trên đặc trưng lồi lõm”,ĐH
Quốc gia tp Hồ Chí Minh,2005.
2. Phạm Thế Bảo,NguyễnThành Nhựt,Cao Minh Thịnh,”Tổng quan xác định khuôn mặt người”,Báo cáo khoa học tp Hồ Chí Minh,2003.
3. Jens Fagertun,”Face Recognition”,Technical University of Denmark,2005.
4. Noor AlSheala , Hasan AlOdail, ”Face Recognition System” ,College of Computer Science and Engineering,2008.
5.
43
PHỤ LỤC
I. Giới thiệu trình biên dịch Code Vision AVR
Code VisionAVR là trình biên dịch lai C, môi trường tích hợp phát triển và tự động khởi tạo chương trình cho vi điều khiển họ AVR của hãng Atmel.
Để debugging chương trình, sử dụng trong giao tiếp nối tiếp, IDE xây dựng giao diện giao tiếp người dùng Terminal.
Bên cạnh thư viện C chuẩn, Code VisionAVR có thư viện cho phần cứng.Code VisionAVR có công cụ tự động khởi tạo chương trình hay và mạnh (CodeWizardAVR). Cho phép bạn ghi tất cả code cần cho việc thực thi nh anh chóng như:
Thiết lập truy xuất bộ nhớ ngoài.
Định nguồn reset chip.
Định Port xuất/Nhập.
Khởi tạo ngắt ngoài.
Khởi tạo USART và ngắt điều khiển bộ đệm trong giao tiếp nối tiếp.
Khởi tạo chuẩn giao tiếp ISP.
Khởi tạo LCD.
Khởi tạo bộ so sánh tương tự.
Khởi tạo ADC.
Khởi tạo giao tiếp theo chuẩn 2 dây.