lap trinh robot tu dong voi pic16f877a
DESCRIPTION
22TRANSCRIPT
Lập trình Robot tự động đơn giản với PIC16F877A Biên soạn: EM-BOT Robot Team
© - (Feb 2010) DEMO VERSION Trang 1/14
LẬP TRÌNH ROBOT TỰ ĐỘNG ĐƠN GIẢNVỚI VI ĐIỀU KHIỂN PIC16F877A
Tóm tắtTài liệu hướng dẫn lập trình cho robot tự động dò đường theo vạch trắng và điều khiểncác cơ cấu (nâng hạ, gắp nhả quà) một cách cơ bản nhất.Vi điều khiển được sử dụngtrong tài liệu là PIC16F877A của Microchip.Lập trình bằng ngôn ngữ C với trình biêndịch CCS.
1 TÓM TẮT VỀ THIẾT KẾ ROBOT TỰ ĐỘNGRobot tự động trong các cuộc thi Robocon gồm 3 thành phần chính: Cơ khí,Mạch điện tử, Lập trình.
1.1 Cơ khíMột robot đơn giản gồm 2 động cơ truyền động cho 2 bánh xe bên trái và bênphải giúp robot di chuyển. Phía trước có thể là 1 hoặc 2 bánh tự do (bánh tựlựa, omni, mắt trâu,…). Để thực hiện được các công việc như nâng hạ trục,gắp nhả đẩy quá, robot được trang bị thêm các động cơ khác để truyền độngcho các cơ cấu này.Tất cả các bộ phận trên được bố trí trên một khung bằng nhôm, sắt,…Phần hướng dẫn chi tiết về thiết kế cơ khí sẽ được trình bày trong một tàiliệu khác. Tài liệu này chỉ tập trung vào phần lập trình.
Hình 1: Mô hình robot dò dường đơn giản
1.2 Mạch điện tử
Hình 2: Sơ đồ hoạt động của robot tự động
Lập trình Robot tự động đơn giản với PIC16F877A Biên soạn: EM-BOT Robot Team
(Feb 2010) DEMO VERSION Trang 2/14
1.2.1 Mạch ngõ vào (cảm biến, nút ấn, công tắc hành trình)Với robot đơn giản, ngõ vào thường là mức logic lấy từ cảm biến quang(quang trở, quang diode), nút ấn hoặc công tắc hành trình. Từ đó mạch viđiều khiển xử lý các tín hiệu này để xuất ngõ ra (thường là động cơ DC) chophù hợp.Cảm biến quang phải được che chắn cẩn thận để hạn chế ảnh hưởng từ cácnguồn ánh sáng bên ngoài.
C1
104
CTHT
SW2BIT0
5V
R310K
Hình 3: Mạch cảm biến, nút ấn và công tắc hành trình
1.2.2 Mạch vi điều khiểnMạch sử dụng vi điều khiển PIC16F877A của Microchip. Mạch nhận tínhiệu từ ngõ vào, xử lý và xuất ngõ ra qua một mạch cách ly bằng opto ramạch công suất.
RA5RA4
RC7
RC0
RA2RA3
RA0RA1
RB1RB2
RB4RB5
RB0
RB6RB7
RB3
RE0RE1
RC3RC4
RE2
RC5RC6
RD4
RD0RD1RD2RD3
RD5
Y1CRYSTAL
PIC16F877A
RA0/AN02
RA1/AN13
RA2/AN2/VREF-/CVREF4
RA3/AN3/VREF+5
RA4/T0CKI/C1OUT6
RA5/AN4/SS*/C2OUT7
RB0/INT33
RB134
RB235
RB3/PGM36
RB437
RB538
RB6/PGC39
RB7/PGD40
RC0/T1OSO/T1CKI15
RC1/T1OSI/CCP216
RC2/CCP117
RC3/SCK/SCL18
RC4/SDI/SDA23
RC5/SDO24
RC6/TX/CK25
RC7/RX/DT26
RD0/PSP019
RD1/PSP120
RD2/PSP221
RD3/PSP322
RD4/PSP427
RD5/PSP528
RD6/PSP629
RD7/PSP730
OSC1/CLKIN13
OSC2/CLKOUT14
VDD32VDD11
VSS31 VSS12
MCLR*/VPP1
RE0/RD*/AN58
RE1/WR*/AN69
RE2/CS*/AN710
C5 30p
C6 30p5V
RC1RC2
RESET
MCU MODULE
RD6RD7
Hình 4: Mạch vi điều khiển1.2.3 Mạch công suất điều khiển động cơ DC
Một số mạch thông dụng:
D141N5819
D13
1N581924V
C2104
MOTOR2
CON2
12
M2IRF540
R12330 2W
LS2RELAY
32
4
67
518
P-DIR2
P-PWM2
Q5B562
Q4D468
D121N5819
12V
D3QUANG TRO
D2LED
R1330
R233K
VCCVCC
-
+ U1A
LM324
3
21
R4 100K
CAMBIEN1
Vạch trắng: mức 1Nền: mức 0
Lập trình Robot tự động đơn giản với PIC16F877A Biên soạn: EM-BOT Robot Team
© (Feb 2010) DEMO VERSION Trang 3/14
Hình 5: Mạch công suất sử dụng 1 FET và 1 relay
U3
IR 2184
COM3
LO4
VB8
IN1
VCC5
SD2
VS6
HO7
U4
IR2184
COM3
LO4
VB8
IN1
VCC5
SD2
VS6
HO7
+C54.7u
+C1
4.7u
C6100n
C2100n
D1
DIODE
R4 4.7R
R6 4.7R R7
4.7R
R5
4.7R
D2
DIODE
+ C34.7u
C4100n
12V
IN2
Q1
IRF540
Q3
IRF540
Q2IRF540
Q4IRF540
24V
C7470n
+ C8470u
J1
MOTOR
12C14
104
IN1
Hình 6: Mạch cầu H điều khiển động cơ với Half Bridge Driver IR2184
Phần hướng dẫn chi tiết về mạch điện tử sẽ được trình bày trong một tàiliệu khác. Tài liệu này chỉ tập trung vào phần lập trình.
Lập trình Robot tự động đơn giản với PIC16F877A Biên soạn: EM-BOT Robot Team
© - (Feb 2010) DEMO VERSION Trang 5/14
2.2.3 Xử lý tín hiệu cảm biến (xem hình vẽ)Mục đích của việc dò đường là hướng cho robot đi theo 1 vạch thẳng màu trắngtrên một nền màu đậm (đen, xanh,…)Cảm biến được đặt ở giữa robot.
o Khi cảm biến số 3,4 nằm trên vạch trắng (mức 1): robot chạy thẳngo Khi robot lệch sang trái: quay phải để điều chỉnh robot về đúng vạcho Khi robot lệch sang phải: quay trái để điều chỉnh robot về đúng vạch
7 6 5 4 3 2 1 0 Trạng thái cảmbiến
Giữa vạch
Lệch trái mức 1
Lệch trái mức 2
Lệch trái mức 3
Lệch trái mức 4
Ngoài vạch
Lệch phải mức 1
Lệch phải mức 2
Lệch phải mức 3
Lệch phải mức 4
Ngoài vạch
Hình 7: Các mức độ lệch ra khỏi vạch trắng của robot
2.3 Chương trình điều khiển
#include <16f877A.h>#include <def_877A.h>#fuses HS,NOWDT,NOPROTECT,NOLVP#use delay(clock=20000000)
/* ĐỊNH NGHĨA CÁC CHÂN VÀ PORT */#define DIR_LEFT RC0#define EN_LEFT RC1
#define DIR_RIGHT RC3#define EN_RIGHT RC2
0
0
000000 0 0
000000 0 0
01
0 01 0 0 00
0 011 0 0 00
0011 0 0 00
1 0 0 00 0
1 1 0 0 00 0 0
10
0 1
000 0 0
00 10 0 0
00 11
0 1
00 0 0
1 0 00 0 0
Lập trình Robot tự động đơn giản với PIC16F877A Biên soạn: EM-BOT Robot Team
© - (Feb 2010) DEMO VERSION Trang 6/14
#define SENSOR PORTD/* KHAI BÁO CÁC CHƯƠNG TRÌNH CON */
void motor_left_forward();void motor_left_reverse();void motor_left_stop();
void motor_right_forward();void motor_right_reverse();void motor_right_stop();
void forward();void reverse();void stop();void turn_left();void turn_right();
/* CÁC CHƯƠNG TRÌNH CON */// Động cơ trái chạy thuậnvoid motor_left_forward(){DIR_LEFT=1; // chiều thuậnEN_LEFT=1; // cho phép chạy}// Động cơ trái chạy ngượcvoid motor_left_reverse(){DIR_LEFT=0; // chiều ngượcEN_LEFT=1; // cho phép chạy}// Động cơ trái dừngvoid motor_left_stop(){EN_LEFT=0; // không cho phép chạy}// Động cơ phải chạy thuậnvoid motor_right_forward(){DIR_RIGHT=1;// chiều thuậnEN_RIGHT=1; // cho phép chạy}// Động cơ phải chạy ngượcvoid motor_right_reverse(){DIR_RIGHT=0;// chiều ngượcEN_RIGHT=1; // cho phép chạy}// Động cơ phải dừngvoid motor_right_stop(){EN_RIGHT=0; // không cho phép chạy}// Chạy thẳngvoid forward()
Lập trình Robot tự động đơn giản với PIC16F877A Biên soạn: EM-BOT Robot Team
© - (Feb 2010) DEMO VERSION Trang 10/14
Tần số điều xung PWM:1)odmode.(peri.4
oscff
o setup_ccp1(mode) và setup_ccp2(mode) mode:
CCP_PWM: chọn chế độ PWM.CCP_OFF: tắt chế độ PWM.
o set_pwm1_duty(value) và set_pwm2_duty(value) Nếu value là giá trị kiểu int 8bit:
1_
period
valuecycleduty
Nếu value là giá trị long int 16bit:
)1(*41023&
_
period
valuecycleduty
Nếu không cần điều xung quá “mịn” thì nên điều xung ở giátrị value 8bit cho đơn giản.
Ví dụ: Ta muốn điều xung PWM với tần số 10kHz với tần số thạch anh(fosc) sử dụng là 20MHz (value 8bit).
500)1dmode(perio1)odmode.(peri.4
2000000010000
1)odmode.(peri.4
oscf
f
Với mode = [1,4,16] và period = 0-255 ta có thể chọno mode = 4; period = 124o mode = 16; period = 32
Để cho việc điều xung được “mịn” (chọn được nhiều giá trị duty cycle) tachọn mode = 4 và period = 124.Như vậy, để duty_cycle từ 0% đến 100% ta cho value từ 0 đến 125.
o value = 30 %3232.01124
30_
cycleduty
o value = 63 %4,50504.01124
63_
cycleduty
o value = 113 %4,90904.01124
113_
cycleduty
Code: setup_timer_2(T2_DIV_BY_4,124,1); setup_ccp1(CCP_PWM); set_pwm1_duty(30);
Sử dụng CCP1 và CCP2 cho động cơ trái và động cơ phải, ta có thể điềukhiển được tốc độ của 2 động cơ phù hợp trạng thái lệch khỏi vạch trắngcủa robot.
Các chương trình con tham khảo:Để việc lập trình được dễ dàng, ta nên tạo các chương trình con xử lý tốcđộ. Sau đây là chương trình tham khảo của hàm speed.
o Speed (tốc độ động cơ trái, tốc độ động cơ phải) Tốc độ: -100 đến 100 (chạy ngược 100% đến chạy thuận 100%) Ví dụ: speed(80,60) động cơ trái chạy 80%, phải 60%