You are on page 1of 32

Giáo trình Robocon tóm tắt

Trương Trọng Toại

Buổi 2 .
TÌM HIỂU VỀ CÁC CẢM BIẾN TRÊN ROBOT
Như buổi 1 đã đề cập ,cảm biến trên robot được bố trí thành 3 tầng (Tầng dưới ,tầng giữa
,và tầng trên ).Buổi hôm nay ta sẽ đi sâu vào các loại cảm biến này .
1.Cảm biến tầng trên :
Trong Robocon tầng trên thường được trang bị Camera . Ta sẽ tìm hiểu kĩ về CMU
Cam . Ưu điểm của Camera này là được tích hợp chip xử lý ảnh sẵn nên việc ứng
dụng nó rất dễ dàng . Chỉ cần dùng những loại vi điều khiển thông thường vẫn có thể
giao tiếp tốt với CMU Cam .

www.nhom3c.com

Giáo trình Robocon tóm tắt

Trương Trọng Toại

(Hướng dẫn sử dụng và các phần mềm hỗ trợ sẽ được chỉ rõ trong CMUCam
Manual )
Chương trình tham thảo: Dùng PIC16F877A giao tiếp với CMU Cam .
// Spot Welding Mobile Robot V2 (Only Spot, No Welding Line)
// 2 PIC877: (1)for Welding Process; (2) for Tracking Line using Camera sensor
// PIC Comm.: Parallel (PSP)
// Camera Comm.: RS232
// Optimal Code: OK
//******************************
/* Parameters:
(1) Rmin;Rmax;Gmin;Gmax;Bmin;Bmax
(2) Sensitive
*/
//******************************
#include <16F877.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#fuses hs, nowdt, noprotect, put, nolvp, brownout
#use delay(clock=20000000)
#use rs232(baud=115200,parity=N,xmit=PIN_C6,rcv=PIN_C7)
#byte pie2 = 0x8c
#byte rcsta = 0x18

www.nhom3c.com

Giáo trình Robocon tóm tắt

Trương Trọng Toại

int16 Count1,Count2;
int16 WeldingSpeed=250;
char Packet=' ';
int16 mx=43;
int16 my=0;
int8 x1=0;
int8 y1=0;
int8 x2=0;
int8 y2=0;
int16 pixels=0;
int16 confidence=0;
int8 Rmin=160;
int8 Rmax=255;
int8 Gmin=170;
int8 Gmax=255;
int8 Bmin=100;
int8 Bmax=255;
int8 Sensitive=2;
int max=7;
int pos=0;
char c;
char s2[30];
int1 index=0;
int16 duty=300;
int16 duty1=300;
//****************************************
void get_string2(char * s,int max)
{
int len;
char c;
max--;
len=0;
do {
c=getc();
if ((c>=' ')&&(c<='~')&&(c!=13))
if(len<max) {
s[len++]=c;
//putc(c);
}
} while(c!=13);
s[len]=0;
return;

www.nhom3c.com

Giáo trình Robocon tóm tắt

Trương Trọng Toại

}
//****************************************
void get_M_Packet()
{
char c;
char Num[9];
int len=0;
max=8;
pos=0;
do {
c=getc();
if(c==' ') { // space
Num[len]=0;
switch (pos)
{
case 0:
Packet=(char)Num[0];
Pos++;
break;
case 1:
//mx=atoi(Num);
Pos++;
break;
case 2:
my=atoi(Num);
Pos++;
break;
case 3:
// x1=atoi(Num);
Pos++;
break;
case 4:
// y1=atoi(Num);
Pos++;
break;
case 5:
// x2=atoi(Num);
Pos++;
break;
case 6:
// y2=atoi(Num);
Pos++;
break;
case 7:
// pixels=atol(Num);
//Pos++;

www.nhom3c.com

Giáo trình Robocon tóm tắt

Trương Trọng Toại

break;
case 8:
//confidence=atol(Num); Pos++;
break;
default:
break;
}
len=0;
}
else
//if ((c>=' ')&&(c<='~')&&(c!=13))
if (c!=13)
if(len<max)
Num[len++]=c;
} while(c!=13);
// confidence=atol(Num);
return;
}
//****************************************
#INT_TIMER1
Sampling_Time()
{
//printf("TC %u %u %u %u %u %u\r", Rmin,Rmax,Gmin,Gmax,Bmin,Bmax);
printf("TC 160 255 170 255 100 255\r");
get_string2(s2, 10);
if(s2[0]=='N')
{
//getc();//Read :
output_d(222);
bit_clear(rcsta,1);//clear error
bit_clear(rcsta,4);//clear
bit_set(rcsta,4);//set
return;
}
get_M_Packet();
duty=duty1=WeldingSpeed;
if(my!=0)
{
duty=duty-(int16)((my-70)*Sensitive);
duty1=duty1+(int16)((my-70)*Sensitive);
}
set_timer1(3036);//100ms
Count2++;
return;
}
//****************************************

www.nhom3c.com

Giáo trình Robocon tóm tắt

Trương Trọng Toại

#INT_EXT
void EXT_isr()
{
if(input(PIN_C4)==0)
{
output_low(PIN_E0);//Brake
output_low(PIN_C5);//Brake
}
else
{
output_high(PIN_E0);//Run
output_high(PIN_C5);//Run
}
return;
}
//****************************************
main()
{
strcpy(s2,"ABCDE");
delay_ms(1000);
bit_clear(rcsta,1);//clear error
bit_clear(rcsta,4);//clear
bit_set(rcsta,4);//set
delay_ms(300);
printf("PM 1\r");//One Packet at a time
get_string2(s2, 10);
getc();//Loai bo dau :
output_d(1);
delay_ms(300);
printf("SM 0\r");
get_string2(s2, 10);
getc();//Loai bo dau :
output_d(2);
delay_ms(300);
//printf("SW 1 65 80 75\r");//1 65 80 75
printf("SW 34 1 46 140\r");
get_string2(s2, 10);
getc();//Loai bo dau :
output_d(3);
delay_ms(300);
printf("CR 18 44 \r");//Auto White Balance ON

www.nhom3c.com

Giáo trình Robocon tóm tắt

Trương Trọng Toại

get_string2(s2, 10);
getc();//Loai bo dau :
output_d(4);
/* write_eeprom(0,160);//Rmin
write_eeprom(1,255);//Rmax
write_eeprom(2,170);//Gmin
write_eeprom(3,255);//Gmax
write_eeprom(4,100);//Bmin
write_eeprom(5,255);*///Bmax
/* Rmin=read_eeprom(0);
Rmax=read_eeprom(1);
Gmin=read_eeprom(2);
Gmax=read_eeprom(3);
Bmin=read_eeprom(4);
Bmax=read_eeprom(5);*/
delay_ms(500);// Wait for slave available then read information for first time
SETUP_CCP1(CCP_PWM);
SETUP_CCP2(CCP_PWM);//Page 206 I/O PWM
setup_timer_2(T2_DIV_BY_1,255,1);
setup_timer_1(T1_INTERNAL | T1_DIV_BY_8);
setup_adc_ports(NO_ANALOGS);// Phai co lenh nay A Port moi co tac dung on
dinh
enable_interrupts(INT_TIMER1);
//enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
output_low(PIN_C0);//Dir
output_low(PIN_A5);//Dir
/*output_low(PIN_E0);//Brake
output_low(PIN_C5);*///Brake
output_high(PIN_E0);//Brake
output_high(PIN_C5);//Brake
while(1)
{
if(input(PIN_C3)==1)
WeldingSpeed=420;
else
WeldingSpeed=320;

www.nhom3c.com

Giáo trình Robocon tóm tắt

Trương Trọng Toại

if(Count2>1)
{
if(my<=140)
output_d((int8)my);
//if(duty>1000) duty=1000;
//if(duty1>1000) duty1=1000;
//if(my<=80 && my>=70) output_high(pin_a0);
//else output_low(pin_a0);
set_PWM1_duty(duty);//left wheel Note: Khong dung lenh nay nhieu lan, chi
dung thong qua duty
set_PWM2_duty(duty1);
Count2=0;
}
}
}
2.Cảm biến tầng giữa:
Trong Robocon cảm biến tầng giữa được trang bị thường là Cảm biến siêu âm ,thường
dùng là SFR02,SFR04,SFR08,… .Mình sẽ tập trung nguyên cứu SFR04 ,đây là loại được
sử dụng phổ biến .

www.nhom3c.com

Giáo trình Robocon tóm tắt

Trương Trọng Toại

Giới thiệu :
Cảm biến siêu âm SRF04 có khả năng đo được khoảng cách từ 3 cm đến 3m . Nó được
gắn trên robot kèm theo một động cơ RC Servo để dò vật cản .

Giao tiếp với SRF04:
Sơ đồ chân của 5 đầu ra của SFR04 :

Hình ảnh một robot sử dụng cảm biến siêu âm SRF04 :

www.nhom3c.com

Giáo trình Robocon tóm tắt

Trương Trọng Toại

Giản đồ xung của SRF04 :

Nguyên tắc hoạt động :
Vùng hoạt động của cảm biến siêu âm được xác định bằng cách truyền một xung âm
thanh ra bên ngoài .Xung này sẽ di chuyển với tốc độ âm thanh (xấp xỉ 0,9 ft/ msec)
trong vùng hình nón .

www.nhom3c.com

Giáo trình Robocon tóm tắt

Trương Trọng Toại

The

Và âm thanh phản hồi lại từ vùng này khi có bất kỳ vật cản nào trên đường đi của sóng
siêu âm .
Để xác định được vùng làm việc bạn cần 2 chân : Chân input trigger và chân tạo xung
output .
Cách sử dụng với SRF04 :
Để bắt đầu có thể làm việc với SRF04 bạn gởi tới chân input trigger của SRF04 một xung
cạnh lên một khoảng thời gian nào đó (ít nhất khoảng 10us) . Sẽ có xung falling
edge(mỗi xung có độ rộng một chu kỳ ) về trên chân input trigger ,sẽ có 8 xung này
.Mạch nhận tín hiệu sẽ không nhận trong một khoảng thời gian ngắn khoảng 100us để
tránh tiếng ồn từ âm thanh ban đầu này . Chân output vẫn giữ mức thấp cho đến khi
mạch nhận cho phép , và sau đó xung ra trên chân output và để biết được khoảng cách tới
vật thể ta đo chiều rộng của xung này . Tùy theo xung này ta sẽ biết được khoảng cách
tới vật thể hoặc không có vật thể trong vùng làm việc .
Giá trị xung thô trả về được tính bằng micro giây .Từ đó ta tính được khoảng cách thông
qua công thức sau :
s [m] = 344m/s * ti [s] / 2.
Với vùng phát hiện từ 3cm tới 3m ,ta có thể tính được độ dài của xung là từ 100us tới
18ms .
Nếu không có vật thể nào phát hiện ,chiều rộng xung sẽ là 36 ms .
Chương trình tham khảo : Sử dụng PIC16F84A
;---------------------------------------------------------------------;
cpu equates (memory map)
list
radix

p=16f84
hex

;----------------------------------------------------------------------

www.nhom3c.com

Giáo trình Robocon tóm tắt
status
porta
portb
PWM
count
temp
loop

equ
equ
equ
equ
equ
equ
equ

0x03
0x05
0x06
0x0c
0x0d
0x0e
0x0f

Trương Trọng Toại
; status equate
; port a equate
; port b equate
; PWM signal length
; general register
; general register
; general register

;--------------------------------------------------------------------c

equ

0

; status bit to check after subtraction

;--------------------------------------------------------------------; porta0 = input from sensor
; portb3 = command to sensor
; portb0 = command to servo

start

org

0x000

movlw
tris
movlw
tris
movlw

0x00
portb
0xFF
porta
0x00

; load W with 0x00 make port B output
; port B is outputs
; load W with 0xFF make port A input
; port A is inputs
; load W with 0x00 to set intial value

of B
movwf
portb
clrf
count
clrf
PWM
bsf
portb,3
movlw
d'4'
movwf
count
call
delay
bcf
portb,3
movlw
d'5'
movwf
count
A0LOW
btfss
porta,0
next instruction
goto
A0LOW
A0HIGH incf
PWM
call
delay
nop
btfsc
porta,0
high
goto
A0HIGH
movf
PWM,w
sublw
d'200'
btfsc
status,c
skip next instruction
goto
skip1
movlw
d'200'
movwf
PWM
skip1
movf
PWM,w
sublw
d'20'
btfss
status,c
skip next instruction
goto
skip2
movlw
d'20'
main

; set port b outputs to low
; clear count
; clear PWM
; tell sensor to make reading
; 4*3=12 clock delay
; delay
; end sensor command signal
; set the delay for measuring the output
; if the output has gone high, skip the
; else check again
; increment the length of the PWM signal
; delay for the count assigned above
; check to see if the output is still
; if it is, repeat
; move PWM to w
; subtract PWM cycle from 200 (2 msec)
; if PWM is greater than 200 (2 msec),

; else set the max PWM length to 200
; move PWM to w
; subtract PWM cycle from 200 (2 msec)
; if PWM is greater than 200 (2 msec),

; else set the min PWM length to 20

www.nhom3c.com

Giáo trình Robocon tóm tắt
movwf
PWM
movlw
d'1'
movwf
count
bsf
portb,0
LoopPWM call
delay
nop
nop
nop
decfsz PWM
goto
LoopPWM
bcf
portb,0
movlw
d'15'
rest of the PWM signal
movwf
loop
del15
movlw
d'255'
movwf
count
call
delay
decfsz loop
goto
del15
goto
main
skip2

Trương Trọng Toại

; set the delay for generating the PWM
; start the PWM pulse

;
;
;
;

decrement the PWM length
as long as PWM is greater than 0, loop
when done looping, stop the pulse
set the counter for generating the

; set the delay counter

;---------------------------------------------------------------------delay
del

movf
movwf
decfsz
goto
return

count,w
temp
temp
del

; delay loop
; 3 clock cycles per delay loop

;---------------------------------------------------------------------end
;---------------------------------------------------------------------; at burn time, select:
;
memory uprotected
;
watchdog timer disabled
;
standard crystal (4 MHz)
;
power-up timer on

3.Cảm biến tầng dưới:
Trong robocon thường sử dụng là cảm biến hồng ngoại . Ta sẽ tìm hiểu về Sharp
GP2D12IR .
Cách đây vài năm ,nhiều loại cảm biến hồng ngoại đo khoảng cách đã được Sharp giới
thiệu .Các cảm biến này được đóng góp nhỏ gọn ,tiêu thụ dòng rất ít ,và nhiều sự lựa
chọn cho tín hiệu output .
Hình ảnh của GP2D12:

www.nhom3c.com

Giáo trình Robocon tóm tắt

Trương Trọng Toại

Sơ đồ khối :

Giản đồ trạng thái

www.nhom3c.com

Giáo trình Robocon tóm tắt

Trương Trọng Toại

Một số đặc tính của GP2D12 :

Absolute Max Ratings
Parameter

Symbol

Rating

Unit

Supply Voltage

VCC

-0.3 to +7

V

Output Terminal Voltage

VO

-0.3 to VCC+0.3

V

Operating Tempurature

Topr

-10 to +60

°C

Storage Tempurature

Tstg

-40 to +70

°C

Remarks

Operating Supply Voltage
Parameter

Symbol

Operating Supply Voltage

VCC

Rating

Unit

4.5 to 5.5

V

Remark

Electro-Optical Characteristics
Parameter
Measuring distance
range
Output Terminal
Voltage

Symbol

Conditions

delta L *1
VO

Output voltage
difference

delta
VO

Average supply
current

Icc

Min. Typ. Max. Unit
10

L = 80 cm *1
Output change at L change (80 cm
-> 10 cm) *1

L = 80 cm, *1

www.nhom3c.com

-

80

cm

0.25 0.4 0.55

V

1.75 2.0 2.25

V

-

33

50

mA

Giáo trình Robocon tóm tắt

Trương Trọng Toại

L: Distance to reflected object
*
1 Using reflected object: White paper (Made by Kodak Co. Ltd. gray cards
R-27, white face, reflective ratio: 90%)

Lý thuyết hoạt động :
Với sự giới thiệu về cảm biến GP2DXX của Sharp ,một phương pháp mới được sử dụng
phát hiện vật thể ở khoảng cách xa hơn, và không bị ảnh hưởng nhiều của điều kiện ánh
sáng xug quanh .
Cảm biến hồng ngoại sử dụng phương pháp trắc đạt tam giác (triangulation) và một
mảng CCD dài mỏng để tính toán khoảng cách và sự hiện diện của vật thể trong vùng
quan sát .
(Phương pháp trắc đạt tam giác sẽ được giới thiệu trong tài liệu kèm theo )
Ý tưởng cơ bản là : một xung của đèn IR được phát ra bởi đèn phát (emitter) . Tia sáng
này sẽ đi trong trường quan sát và hoặc là đụng vật thể ,hoặc là không đụng vật thể
.Trong trường hợp không gặp vật thể ,tia sáng sẽ không bao giờ phản hồi về và đọc là
không có vật thể .Nếu tia sáng phản xạ lại ,có vật thể . Cảm biến sẽ thu và tạo ra một
phép trắc đạc tam giác giữa 3 điểm : điểm phản xạ ,điểm phát và điểm thu .

Khác góc và khác khoảng cách
Tín hiệu Output :
Tín hiệu Output không tuyến tính .Bởi vì một vài phép lượng giác của tam giác trắc địa .

www.nhom3c.com

Giáo trình Robocon tóm tắt

Trương Trọng Toại

Đường cong quan hệ giữa khoảng cách và mức volt của GP2D12
Ở đây có hai điều lưu ý trong đường cong quan hệ trên :
Đầu tiên ,tín hiệu output khoảng cách nằm giữa vùng từ 10 cm tới 80 cm thì không tuyến
tính .
Thứ hai là trên đường cong có thể chia thành hai vùng ,một vùng nhỏ hơn 10 cm và vùng
từ 10 cm tới 80 cm .Hai vùng này đường đặc tuyến khác nhau . Nó có thể gây ảnh hưởng
đến robot của bạn nếu robot của bạn di chuyển chậm hoặc khi robot của bạn tiến lại gần
vật thể . Để tránh điều này cảm biến trên robot bạn có thể bố trí như hình dưới .

Ví dụ về vị trí đặt cảm biến trên robot
Góc của chùm tia hơi nhỏ ,vì khoảng cách giữa con phát và thu nhỏ chỉ có 16 cm .Nếu
bạn muốn tăng góc mở , bạn có thể sử dụng kết hợp 2 cảm biến hồng ngoại như ví dụ ở
hình dưới .

www.nhom3c.com

Giáo trình Robocon tóm tắt

Trương Trọng Toại

Ví dụ tăng góc quan sát của cảm biến
.

Việc sử dụng GP2D12 được liên kết nối tới 3 dây .Những kết nối này là : Ground ,Vcc
,và Output . Cảm biến sẽ đo khoảng cách và xuất ra output dưới dạng mức volt analog .
Bởi vì việc thu ánh sáng xảy ra liên tục , không cần xung clock . Nên tốn nhiều năng
lượng ,và có thể ảnh hưởng đến các ngoại vi khác ,và bộ xử lý nếu trên robot có nhiều
cảm biến này .
Tín hiệu Output có những xung gai nhỏ nên cần có thêm tụ lọc giữa Output và Ground .

www.nhom3c.com

Giáo trình Robocon tóm tắt

Trương Trọng Toại

Việc lập trình sử dụng cảm biến này thì rất đơn giản ,các bạn chỉ cần dùng vi điều khiển
nào có tích hợp sẵn bộ ADC ,và đọc vào là có thể biết được khoảng cách .
Cảm biến dò đường trong Robocon :
Như buổi 1 đã phân tích ,có rất nhiều phương án bố trí cảm biến để có thể dò đường và
đếm vạch được .Trong phần này ,chỉ ví dụ một phương án đó là sử dụng 8 cảm biến đặt
thẳng hàng (Dùng led siêu sáng và quang trở ) ,vừa dò đường vừa đếm vạch .
Sơ đồ mạch cảm biến :
+5V
+5V

R7
1K

R7
1K
R3
2.2K

R8
1_+IN1

1

1

2

D31
INFARED LED_TRANSMITTER

D32

0

0

0

2

0

2

0

2

INFARED LED_RECEIVER

1

INFARED LED_RECEIVER

1

1

1

2
D32

1_+IN2

1_-IN2

1_-IN1

2

R8
10K

10K

D31
INFARED LED_TRANSMITTER

R6
47K

3

R6
47K

3

R3
2.2K

0

+5V
+5V

R7
1K

R7
1K
R3
2.2K

R8
1_+IN3

1_-IN4
1

2
D32

2

0

0

0

U7 LM339
1_OUT2
OUT2
1_OUT1
OUT1
5V
+V
1_-IN1 -IN1
1_+IN1 +IN1
1_-IN2 -IN2
1_+IN2 +IN2

1
2
3
45+
67+

14
13
12
11+
109+
8-

OUT31_OUT3
OUT41_OUT4
GND
+IN4 1_+IN4
1_-IN4
-IN4
+IN3 1_+IN3
1_-IN3
-IN3

www.nhom3c.com

0

0

2

2

1

INFARED LED_RECEIVER

1

D31
INFARED LED_TRANSMITTER

D32
INFARED LED_RECEIVER

2

1

2

1

1

1_-IN3

0

R8
10K

10K

D31
INFARED LED_TRANSMITTER

R6
47K

3

R6
47K

3

R3
2.2K

0

1_+IN4

Giáo trình Robocon tóm tắt

D33

1
D33

D33

LED

LED

2

LED

2

LED

R9
R
P0.1

1_OUT3

P0.2

1_OUT4

0

2

C8
CAP NP

2

C8
CAP NP

2

C8
CAP NP

2

C8
CAP NP

0

P0.3
1

1_OUT2

1

1_OUT1 P0.0

R9
R

1

R9
R

1

R9
R

2

D33

2

+5V

1

+5V

1

+5V

1

+5V

Trương Trọng Toại

0

0

+5V

+5V

R7
1K

10K

R6
47K

10K

2+IN1
2-IN2

D32

1
D32
INFARED LED_RECEIVER

0

0

2

2

0

2

0

2

D31
INFARED LED_TRANSMITTER
1

INFARED LED_RECEIVER

2

1

2

1

1

2-IN1

D31
INFARED LED_TRANSMITTER

R8
3

R3
2.2K

R8

1

R6
47K

3

R3
2.2K

R7
1K

0

0

+5V
+5V

R7
1K

R7
1K
R3
2.2K

R8
2+IN3

2-IN4
1

1
D31
INFARED LED_TRANSMITTER

D32

0

0

www.nhom3c.com

0

2

0

2

1

INFARED LED_RECEIVER

2

2

2

1

1

1

2
D32

INFARED LED_RECEIVER

0

R8
10K

10K
2-IN3

D31
INFARED LED_TRANSMITTER

R6
47K

3

R6
47K

3

R3
2.2K

0

2+IN4

2+IN2

Giáo trình Robocon tóm tắt

Trương Trọng Toại
U7 LM339

2OUT2OUT2
2OUT1OUT1
5V
+V
2-IN1 -IN1
2+IN1 +IN1
2-IN2 -IN2
2+IN2 +IN2

OUT32OUT3
OUT42OUT4
GND
+IN4 2+IN4
2-IN4
-IN4
+IN3 2+IN3
2-IN3
-IN3

14
13
12
11+
109+
8-

1

D33

D33

D33
LED

P0.5

R9
R

2OUT3

P0.6

1

2OUT2

1

P0.4

R9
R

2OUT4

0

0

2

C8
CAP NP

2

C8
CAP NP

2

C8
CAP NP

2

C8
CAP NP

P0.7
1

R9
R

1

R9
R

2

LED

2

LED

2

LED

2

+5V

1

D33

2OUT1

0

+5V

1

+5V

1

+5V

1
2
3
45+
67+

0

0

89V51RD2B
U1

5V

R2
100k
C3
10uF

SW1

P1.0
P1.1
P1.2
P1.3
P1.4
P1.5
P1.6
P1.7

1
2
3
4
5
6
7
8

P3.0
P3.1
P3.2
P3.3
P3.4
P3.5
P3.6
P3.7

10
11
12
13
14
15
16
17

9
SW_PB_SPST
R1
8k2

C133p

0

0
Y1

18
19
20

XM/SM
C2 33p

0

J1
1
2
3
4
5
6
7
8
Port0

40
39
38
37
36
35
34
33
32

5V
P0.0
P0.1
P0.2
P0.3
P0.4
P0.5
P0.6
P0.7

31
30
29

5V
PSEN

28
27
26
25
24
23
22
21

P2.7
P2.6
P2.5
P2.4
P2.3
P2.2
P2.1
P2.0

1
2
3
4
5
6
7
8
9

RST

4k7

EA/VPP
P3.0/RXD
P3.1/TXD ALE/PROG
PSEN
P3.2/INT0
P3.3/INT1
P3.4/T0
P2.7/A15
P3.5/T1
P2.6/A14
P3.6/WR
P2.5/A13
P2.4/A12
P3.7/RD
P2.3/A11
XTAL2
P2.2/A10
XTAL1
P2.1/A9
GND
P2.0/A8

J3
1
2
3
4
5
6
7
8

Port1

VCC
P0.0/AD0
P0.1/AD1
P0.2/AD2
P0.3/AD3
P0.4/AD4
P0.5/AD5
P0.6/AD6
P0.7/AD7

AT89C51

J2
P0.0
P0.1
P0.2
P0.3
P0.4
P0.5
P0.6
P0.7

RN1

P1.0
P1.1
P1.2
P1.3
P1.4
P1.5
P1.6
P1.7

P1.0
P1.1
P1.2
P1.3
P1.4
P1.5
P1.6
P1.7

J4
1
2
3
4
5
6
7
8

P2.0
P2.1
P2.2
P2.3
P2.4
P2.5
P2.6
P2.7

Port2

www.nhom3c.com

1
2
3
4
5
6
7
8
Port3

P3.0
P3.1
P3.2
P3.3
P3.4
P3.5
P3.6
P3.7

Giáo trình Robocon tóm tắt

Trương Trọng Toại

Thực hành vẽ mạch cảm biến và làm mạch cảm biến : Sử dụng Orcad và vẽ 1 lớp tự làm
mạch bằng tay để test .

Lập trình dò đường :
Trong lập trình dò đường bạn có 2 cách để lập trình ,một là hỏi vòng liên tục ,hai là sử
dụng ngắt .Viết theo ngắt thì hay hơn vì xử lý được các sự kiện ngay lập tức ,còn hỏi
vòng phải mất thời gian quét nên có thể bỏ xử lý các tình huống không kịp thời .
Chương trình tham khảo :(Sử dụng ngắt )
#include<REG52.H>
#include<mod51rd2.h>
extern bit
nho_trai,nho_phai,co_cd1,co_cd2,co_cd3,enable_time,finish,finish1,finish2,enable_xoa,e
nable_dem,enable_vach,en_doduong;
extern unsigned char tocdo,tocdolx,tocdok,tocdoka,m;
extern unsigned int dem1;//,dem2,dem3;
void timer0_ISR(void) interrupt 1 using 1
{ unsigned char tocdol,tocdor;
dem1++;

www.nhom3c.com

Giáo trình Robocon tóm tắt

Trương Trọng Toại

m++;
if(m >= 250){m=1;}
if(tocdolx>=m){klen=0;}
else {klen=1;}
if(tocdok>=m){kqua=0;}
else{kqua=1;}
/////////////////////////////////////////////////////////////////
if ((P0 & 0x3C) == 0x3C) {finish=1;}
if ((P0 & 0x07) == 0x07) {finish1=1;}
if ((P0 & 0xF0) == 0xF0) {finish1=1;}
if ((P0 & 0xE0) == 0xE0) {finish1=1;}
///////////////////////////////////////////////////////////////////////////////////////
if(en_doduong)
{
switch(P0)
{// unsigned char tocdol,tocdor;
//**********************************************************************
**********
case 0xF3: // co 4 cam bien ben trai dk ve ben trai
{
nho_trai=1;
nho_phai=0;
finish = 1;
tocdol = tocdo - tocdo/6;
tocdor = tocdo + tocdo/4;
// chaytoi(tocdol,tocdor);
P1 = 0xFF;
dir0 = 0;
dir2 = 0;
CCAP4H = tocdor; // motor phai chay toi
CCAP2H = tocdol; // motor trai chay toi
CCAP1H = 0x00;
CCAP3H = 0x00;
} break;
//**********************************************************************
***************

www.nhom3c.com

Giáo trình Robocon tóm tắt

Trương Trọng Toại

case 0xCF: // co 4 cam bien ben phai dk ve ben phai
{
finish = 1;
nho_trai = 0;
nho_phai = 1;
tocdol = tocdo + tocdo/4;
tocdor = tocdo - tocdo/6;
// chaytoi(tocdol,tocdor);
P1 = 0xFF;
dir0 = 0;
dir2 = 0;
CCAP4H = tocdor;
CCAP2H = tocdol;
CCAP1H = 0x00;
CCAP3H = 0x00;
} break;
//**********************************************************************
**********
case 0xFF: //ko co cam bien
{
finish=1;
tocdol = tocdo/3;
tocdor = tocdo/3;
// chaytoi(tocdol,tocdol);
P1 = 0xFF;
dir0 = 0;
dir2 = 0;
CCAP4H = tocdor;
CCAP2H = tocdol;
CCAP1H = 0x00;
CCAP3H = 0x00;
} break;
//**********************************************************************
**********
case 0x00: //ko co cam bien
{
if (nho_trai)
{
// chaylui(15,0) ve ben phai.
P1 = 0xFF;
dir1 = 0;
dir3 = 0;
CCAP4H = 0x00;

www.nhom3c.com

Giáo trình Robocon tóm tắt

Trương Trọng Toại
CCAP2H = 0x00;
CCAP1H = 0;
CCAP3H = 25; //dong co phai lui
}
else
if (nho_phai)
{
//chaylui(0,15);
P1 = 0xFF;
dir1 = 0;
dir3 = 0;
CCAP4H = 0x00;
CCAP2H = 0x00;
CCAP1H = 25; // dong co trai lui
CCAP3H = 0;
}
else
{

tocdol = 0;
tocdor = 0;
// chaytoi(tocdol,tocdol);
P1 = 0xFF;
dir0 = 0;
dir2 = 0;
CCAP4H = tocdor;
CCAP2H = tocdol;
CCAP1H = 0x00;
CCAP3H = 0x00;
}
} break;
//**********************************************************************
***************
//**********************************************************************
***************
case 0x01: // co cam bien senln2 dieu khien lech toc do toan bo ve trai
{
nho_trai=1;nho_phai=0;
tocdol = 40;
tocdor = 200;
// quaytrai1(tocdol,tocdor);
P1 = 0xFF;

www.nhom3c.com

Giáo trình Robocon tóm tắt

Trương Trọng Toại
dir1 = 0;
dir2 = 0;
CCAP4H = tocdol;
CCAP2H = 0x00;
CCAP1H = tocdor;
CCAP3H = 0x00;

} break;
case 0x80: // co cam bien senrn2 dieu khien lech toc do toan bo ve phai
{
nho_trai=0;nho_phai=1;
tocdol = 200;
tocdor = 40;
// quayphai1(tocdol,tocdor);
P1 = 0xFF;
dir0 = 0;
dir3 = 0;
CCAP4H = 0x00;
CCAP2H = tocdor;
CCAP1H = 0x00;
CCAP3H = tocdol;
} break;
//**********************************************************************
*******
//**********************************************************************
***********
case 0xC0: // co 2 cam bien senln1 + senln2 dieu khien lech toc do vua ve trai
{
nho_trai=1;nho_phai=0;
tocdol = 150;
tocdor = 60;
// chaytoi(tocdol,tocdor);
P1 = 0xFF;
dir0 = 0;
dir2 = 0;
CCAP4H = tocdor;
CCAP2H = tocdol;
CCAP1H = 0x00;
CCAP3H = 0x00;
} break;
case 0x03: // co 2 cam bien senrn1 + senrn2 dieu khien lech toc do vua ve phai

www.nhom3c.com

Giáo trình Robocon tóm tắt

Trương Trọng Toại

{
nho_trai=0;nho_phai=1;
tocdol = 60;
tocdor = 150;
// chaytoi(tocdol,tocdor);
P1 = 0xFF;
dir0 = 0;
dir2 = 0;
CCAP4H = tocdor;
CCAP2H = tocdol;
CCAP1H = 0x00;
CCAP3H = 0x00;
} break;
//**********************************************************************
*******
case 0x02: // co cam bien senln1 dieu khien lech toc do nhieu ve trai
{
nho_trai=1;nho_phai=0;
tocdol = tocdo - tocdo/3 ;
tocdor = tocdo + tocdo/5;
// chaytoi(tocdol,tocdor);
P1 = 0xFF;
dir0 = 0;
dir2 = 0;
CCAP4H = tocdor;
CCAP2H = tocdol;
CCAP1H = 0x00;
CCAP3H = 0x00;
} break;
case 0x40: // co cam bien senrn1 dieu khien lech toc do nhieu ve phai
{
nho_trai=0;nho_phai=1;
tocdol = tocdo + tocdo/5 ;
tocdor = tocdo - tocdo/3;
// chaytoi(tocdol,tocdor);
P1 = 0xFF;
dir0 = 0;
dir2 = 0;
CCAP4H = tocdor;
CCAP2H = tocdol;
CCAP1H = 0x00;
CCAP3H = 0x00;

www.nhom3c.com

Giáo trình Robocon tóm tắt

Trương Trọng Toại

} break;
//**********************************************************************
*********
case 0x06: // co 2 cam bien senln + senln1 dieu khien lech toc do vua ve trai
{
nho_trai=1;nho_phai=0;
tocdol = (2*tocdo)/3;//35;//30
tocdor = tocdo + tocdo/4;//30;
// chaytoi(tocdol,tocdor);
P1 = 0xFF;
dir0 = 0;
dir2 = 0;
CCAP4H = tocdor;
CCAP2H = tocdol;
CCAP1H = 0x00;
CCAP3H = 0x00;
} break;
case 0x60: // co 2 cam bien senrn + senrn1 dieu khien lech toc do vua ve phai
{
nho_trai=0;nho_phai=1;
tocdol = tocdo + tocdo/4;//30
tocdor = 2*tocdo/3;//30;
// chaytoi(tocdol,tocdor);
P1 = 0xFF;
dir0 = 0;
dir2 = 0;
CCAP4H = tocdor;
CCAP2H = tocdol;
CCAP1H = 0x00;
CCAP3H = 0x00;
} break;
//**********************************************************************
*********
case 0x04: // co cam bien senln dieu khien lech toc do vua ve trai
{
nho_trai=1;nho_phai=0;
tocdol = tocdo-(1*tocdo)/3;
tocdor = tocdo+tocdo/4;
// chaytoi(tocdol,tocdor);
P1 = 0xFF;
dir0 = 0;
dir2 = 0;

www.nhom3c.com

Giáo trình Robocon tóm tắt

Trương Trọng Toại
CCAP4H = tocdor;
CCAP2H = tocdol;
CCAP1H = 0x00;
CCAP3H = 0x00;

} break;
case 0x20: // co cam bien senrn dieu khien lech toc do vua ve phai
{
nho_trai=0;nho_phai=1;
tocdol = tocdo+(tocdo/4);
tocdor = tocdo-(1*tocdo)/3;
// chaytoi(tocdol,tocdor);
P1 = 0xFF;
dir0 = 0;
dir2 = 0;
CCAP4H = tocdor;
CCAP2H = tocdol;
CCAP1H = 0x00;
CCAP3H = 0x00;
} break;
//**********************************************************************
****
case 0x0C: // co 2 cam bien senlt va senln dieu khien lech toc do vua ve trai
{
nho_trai=1;nho_phai=0;
tocdol = tocdo - tocdo/4;
tocdor = tocdo + tocdo/4;
// chaytoi(tocdol,tocdor);
P1 = 0xFF;
dir0 = 0;
dir2 = 0;
CCAP4H = tocdor;
CCAP2H = tocdol;
CCAP1H = 0x00;
CCAP3H = 0x00;
} break;
case 0x30: // co 2 cam bien senrt + senrn dieu khien lech toc do vua ve phai
{
nho_trai=0;nho_phai=1;
tocdor = tocdo - tocdo/4;
tocdol = tocdo + tocdo/4;
// chaytoi(tocdol,tocdor);
P1 = 0xFF;
dir0 = 0;

www.nhom3c.com

Giáo trình Robocon tóm tắt

Trương Trọng Toại
dir2 = 0;
CCAP4H = tocdor;
CCAP2H = tocdol;
CCAP1H = 0x00;
CCAP3H = 0x00;

} break;
//**********************************************************************
***************
case 0x08: //3 co cam bien senlt dieu khien lech toc do it ve trai
{
nho_trai=1;nho_phai=0;
tocdol = tocdo - tocdo/6;
tocdor = tocdo + tocdo/6;
// chaytoi(tocdol,tocdor);
P1 = 0xFF;
dir0 = 0;
dir2 = 0;
CCAP4H = tocdor;
CCAP2H = tocdol;
CCAP1H = 0x00;
CCAP3H = 0x00;
} break;
case 0x10: // co cam bien senrt dieu khien lech toc do it ve phai
{
nho_trai=0;nho_phai=1;
tocdol = tocdo + tocdo/6;
tocdor = tocdo - tocdo/6;
// chaytoi(tocdol,tocdor);
P1 = 0xFF;
dir0 = 0;
dir2 = 0;
CCAP4H = tocdor;
CCAP2H = tocdol;
CCAP1H = 0x00;
CCAP3H = 0x00;
} break;
//**********************************************************************
***********

www.nhom3c.com

Giáo trình Robocon tóm tắt

Trương Trọng Toại

//**********************************************************************
***********
case 0x18: //2 cam bien giua senlt + senrt
{
nho_trai=0;nho_phai=0;
tocdol = tocdo;
tocdor = tocdo;
// chaytoi(tocdol,tocdor);
P1 = 0xFF;
dir0 = 0;
dir2 = 0;
CCAP4H = tocdor;
CCAP2H = tocdol;
CCAP1H = 0x00;
CCAP3H = 0x00;
} break;
//**********************************************************************
******
default: // truong hop khong co cam bien nao
{
tocdol = tocdo/3;//-(2*tocdo)/3;
tocdor = tocdo/3;//-(2*tocdo)/3;
// chaytoi(tocdol,tocdor);
P1 = 0xFF;
dir0 = 0;
dir2 = 0;
CCAP4H = tocdor;
CCAP2H = tocdol;
CCAP1H = 0x00;
CCAP3H = 0x00;
}
}
if ((P0 & 0x3C) == 0x3C) {finish=1;}
if ((P0 & 0x07) == 0x07) {finish1=1;}
if ((P0 & 0xF0) == 0xF0) {finish1=1;}
if ((P0 & 0xE0) == 0xE0) {finish1=1;}
}
/////////////////////////////////////////////////////////////////////////////////////////

www.nhom3c.com

Giáo trình Robocon tóm tắt

Trương Trọng Toại

}

www.nhom3c.com