You are on page 1of 20

Đồ án VI ĐIỀU KHIỂN: Robot tự cân bằng 1

Mục lục:
I. Giới thiệu ............................................................................................................................ 2

II. Thiết kế cơ khí..................................................................................................................... 4

1. Nguyên lý hoạt động


2. Nguyên liệu chuẩn bị
3. Các bước thực hiện
4. Giới thiệu mô hình

III. Mạch điện ........................................................................................................................... 7

1. Giới thiệu linh kiện quan trọng


2. Mạch phát tín hiệu RF
3. Mạch thu tín hiệu RF
4. Mạch điều chỉnh tốc độ động cơ
5. Mạch điều chỉnh cân bằng

IV. Chương trình điều khiển ........................................................................................... 11

1. Code điều khiển


 Mạch phát tín hiệu RF
 Mạch thu tín hiệu RF
 Mạch điều chỉnh tốc độ động cơ
 Mạch điều chỉnh cân bằng

V.Kết luận ......................................................................................................................................

VI. Tài liệu tham khảo ..............................................................................................................


Đồ án VI ĐIỀU KHIỂN: Robot tự cân bằng 2

Chương 1:
GIỚI THIỆU
1.Đặt vấn đề :
Để giúp cho sinh viên trong quá trình học tập và nghiên cứu môn học Vi
điều khiển tốt hơn.
Đồ án xe hai bánh điều khiển tự cân bằng được thầy Lê Trung Khanh yêu
cầu với mục đích khuyến khích các bạn sinh viên rèn luyện kỹ năng làm việc
nhóm và tự nghiên cứu học hỏi.
Dưới đây là những điều mà nhóm làm đề tài 3 đã đúc kết được.

2.Mục đích nghiên cứu :


2.1. Mục tiêu đề tài:
Mục đích nghiên cứu của đề tài là thiết kế được mô hình xe 2 bánh tự cân
bằng di chuyển được trên địa hình phẳng, dưới đây là những mục tiêu đề ra
của nhóm:
- Tìm hiểu nguyên lý cân bằng của xe.
- Tìm hiểu về con PIC 16F887 , MPU 6050
- Thiết kế các mạch điều khiển.
- Lập trình vi điều khiển.
2.2. Phương pháp nghiên cứu:
Xây dựng mô hình lý thuyết:
- Tham khảo các mô hình trong các tài liệu tham khảo.
- Phác thảo mô hình trên giấy.
Xây dựng mô hình thực tế:
- Thiết kế khung sườn, cơ khí mô hình.
- Điều khiển động cơ ( bánh xe ).
- Thực hiện mạch thu nhận tín hiệu .
- Thực hiện mạch điều chỉnh tốc độ động cơ.
- Nghiên cứu cảm biến cân bằng.
- Thiết kế mạch điều chỉnh cân bằng.
- Lập trình vi điều khiển.
Đồ án VI ĐIỀU KHIỂN: Robot tự cân bằng 3

3.Giới hạn của đề tài:


Vì đây là mô hình xe 2 bánh tự cân bằng nhỏ nên mục đích chính của đồ
án này là xe có thể tự cân bằng và di chuyển được. Sau này có thể phát triển
thêm vài chức năng như vận chuyển được một số vật nhẹ.
Đồ án VI ĐIỀU KHIỂN: Robot tự cân bằng 4

Chương 2:
THIẾT KẾ CƠ KHÍ
1.Nguyên lý hoạt động:
Mô hình xe 2 bánh điều khiển tự cân bằng này dùng cảm biến đo gia tốc
góc nghiêng MPU 6050 để đo gia tốc góc giữa thân xe và mặt đất.

2.Nguyên liệu chuẩn bị:


Dưới đây là những nguyên liệu mà nhóm đã dùng để thiết kế ra mô hình xe
2 bánh tự cân bằng :
Nguyên liệu Số lượng

Mica 15x10 cm 3

Trụ đồng dài 6cm 8


Bánh xe 2
Động cơ DC (3-9V) 2

Khoan + Ốc vít + Máy hàn,..


Đồ án VI ĐIỀU KHIỂN: Robot tự cân bằng 5

3.Các bước thực hiện :


B1: Cắt mica thành 3 miếng hình chữ nhật có độ dài 15x10 cm.

B2: Đánh dấu 4 cạnh của miếng mica để khoan đồng thời đánh dấu thêm 2
hình tròn đường kính 2cm để luồn dây điện.
Ở miếng cuối cùng đánh dấu thêm 4 vị trí để vắt ốc cho động cơ DC

B3 : Khoan các vị trí đã đánh dấu để gắn trụ đồng đồng thời gắn động cơ vào.
Đồ án VI ĐIỀU KHIỂN: Robot tự cân bằng 6

4.Giới thiệu mô hình :


Dưới đây là hình ảnh sau khi đã hoàn thành được mô hình xe 2 bánh tự cân
bằng:

 Đánh giá : Mô hình xe 2 bánh gồm có 3 tầng , mỗi tầng có 1 mục đích
khác nhau. ( Dự kiến )
Tầng dưới cùng đặt nguồn cấp cho toàn hệ thống.
Tầng giữa được dùng để mạch MPU 6050 góc và tự cân bằng .
Tầng trên cùng là để mạch modulo RF 433 và mạch điều chỉnh tốc
độ động cơ.
Ngoài ra, bộ điều khiển chứa mạch phát tín hiệu RF, đồng thời các nút bấm
để điều chỉnh tốc độ động cơ.
Đồ án VI ĐIỀU KHIỂN: Robot tự cân bằng 7

Chương 3:
MẠCH ĐIỆN
1. Giới thiệu một số linh kiện quan trọng trong các mạch điện:
1.1. Pic 16F887:
Bộ vi xử lý ngày càng phát triển hoàn thiện và được sử dụng hầu hết
tròng các hệ thống điều khiển trong công nghiệp cũng như trong các
thiết bị điện tử dân dụng. Chính nhờ vài trò, chức năng của vi xử lý đã
đem lại nhiều ưu điểm, nhiều tính năng đặc biệt cho các hệ thống điều
khiển.
Vi xử lý có rất nhiều loại bắt đầu từ 4 bit đến 32 bit, vi xử lý 4 bit
hiện nay không còn nhưng vi xử lý 8 bit vẫn còn mặc dù đã có vi xử lú
64 bit.
Trong đồ án nghiên cứu mô hình xe hai bánh điều khiển cân bằng
này , con PIC 16F887 đc dùng làm công cụ chính để lập trình vi điều
khiển.

Chức năng chính : Được lập trình để làm mạch điều khiển chính
cho toàn hệ thống . Trong đồ án , PIC 16F887 đảm nhận vai trò điều
khiển cả 3 mạch điện chính là mạch thu phát tín hiệu RF, mạch điều
chỉnh tốc độ và mạch điều khiển cân bằng.
Đồ án VI ĐIỀU KHIỂN: Robot tự cân bằng 8

1.2. MPU cảm biến gia tốc góc nghiêng 6050 :


Các thông số kỹ thuật của MPU 6050:
+ MPU 6050 module ( 3 trục góc + 3 trục gia tốc )
+ Chip : MPU 6050
+ Nguồn cấp 3-5V
+ Chuẩn giao tiếp : I2C
+ Chuẩn giắc cắm : 2.54mm

Chức năng : Dùng để đo độ khoảng cách của mô hình xe với mặt


đất để từ đó mạch cân bằng có thể điều chỉnh cho xe trở về vị trí cân
bằng
Đồ án VI ĐIỀU KHIỂN: Robot tự cân bằng 9

1.3. Mạch cầu H L289 ( Mạch điều khiển động cơ L289 ):


Là một module hữu ích, phổ biến với chức năng thông dụng.
Mạch này có thể điều khiển được 2 động cơ. Ứng dụng rất nhiều vào
các đề tài: điều khiển xe robot, điều khiển cánh tay robot (Cánh tay
robot 3 bậc bạn phải sử dụng tới 2 mô đun này), Arduino để điều
khiển động cơ sử dụng mô đun điều khiển động cơ…

Các thông số kỹ thuật của mạch cầu H L289:


+Driver: L298N tích hợp hai mạch cầu H.
+Điện áp điều khiển: +5 V ~ +35 V
+Dòng tối đa cho mỗi cầu H là: 2A
+Đ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
+Công suất hao phí: 20W (khi nhiệt độ T = 75 ℃)
+Nhiệt độ bảo quản: -25 ℃ ~ +130 ℃
Chức năng : Điều khiển động cơ.
Đồ án VI ĐIỀU KHIỂN: Robot tự cân bằng 10

2. Mạch thu phát tín hiệu RF:


2.1 Mạch thu phát tín hiệu:

(a) (b)

Nguyên lý hoạt động: Mạ ch giao tié p theo chuả n UART, là sẽ truyè n nhạ n
tín hiẹ u với nhau bà ng só ng có tà n só 433MHZ. Mọ t con sẽ có chức năng chỉ
phá t tín hiẹ u, con cò n lạ i có chức năng sẽ nhận tín hiẹ u. Khi nhá n mọ t nú t,
từng bit sẽ được gửi qua cho con nhạ n, cho tới khi nà o đủ 32 bit nó sẽ thực
hiẹ n lẹ nh ứng với từng 32 bit đó .
Đồ án VI ĐIỀU KHIỂN: Robot tự cân bằng 11

2.2 Mạch điều chỉnh tốc độ động cơ


Đồ án VI ĐIỀU KHIỂN: Robot tự cân bằng 12

Chương 4 :
LẬP TRÌNH
1. Code lập trình:
1.1. Mạch phát sóng dùng PIC 16F887:
2. #include <16F887.h>
3. #fuses NOMCLR, NOBROWNOUT, NOLVP, INTRC_IO
4. #use delay(clock = 8MHz)
5. #use fast_io(B)
6.
7. void send_signal(unsigned int32 number){
8. int8 i;
9. // Send 9ms pulse
10. output_high(PIN_B4);
11. delay_ms(9); //
12. // Send 4.5ms space
13. output_low(PIN_B4);
14. delay_us(4500);
15. // Send data (32 bits)
16. for(i = 0; i < 32; i++){
17. // If bit is 1 send 560us pulse and 1680us space
18. if(bit_test(number, 31 - i)){
19. output_high(PIN_B4);
20. delay_us(560);
21. output_low(PIN_B4);
22. delay_us(1680);
23. }
24. // If bit is 0 send 560us pulse and 560us space
25. else{
26. output_high(PIN_B4);
27. delay_us(560);
28. output_low(PIN_B4);
29. delay_us(560);
30. }
31. }
// Send end bit
32. output_high(PIN_B4);
33. delay_us(560);
34. output_low(PIN_B4);
35. delay_us(560);
36. }
37. void main() {
38. setup_oscillator(OSC_8MHZ); // Set internal
oscillator to 8MHz
39. output_b(0);
Đồ án VI ĐIỀU KHIỂN: Robot tự cân bằng 13

40. set_tris_b(0x0F); // Configure RB0,


RB1, RB2 and RB3 as inputs
41. port_b_pullups(0x0F); // Enable internal
pull-ups for pins RB0,RB1,RB2 and RB3
42. while(TRUE){
43. if(!input(PIN_B0)){ // If RB0 button is
pressed
44. send_signal(0x00FF00FF);
45. delay_ms(500);
46. }
47. if(!input(PIN_B1)){ // If RB1 button is
pressed
48. send_signal(0x00FF807F);
49. delay_ms(500);
50. }
51. if(!input(PIN_B2)){ // If RB2 button is
pressed
52. send_signal(0x00FF40BF);
53. delay_ms(500);
54. }
55. if(!input(PIN_B3)){ // If RB3 button is
pressed
56. send_signal(0x00FF20DF);
57. delay_ms(500);
58. }
59. }
60. }
Đồ án VI ĐIỀU KHIỂN: Robot tự cân bằng 14

1.2 Mạch thu sóng dùng PIC 16F887:


#include <16F887.h>
#fuses NOMCLR, NOBROWNOUT, NOLVP, INTRC_IO
#use delay(clock = 8MHz)
#use fast_io(D)
short code_ok = 0, repeated = 0, m1_dir = 1;
unsigned int8 nec_state = 0, i;
unsigned int32 rf_code=0;
#INT_EXT //Ngat ngoai // External interrupt
void ext_isr(void){
unsigned int16 time;
if(nec_state != 0){
time = get_timer1(); // Store Timer1 value
set_timer1(0); // Reset Timer1
}
switch(nec_state){
case 0 : // Start receiving IR data
(we're at the beginning of 9ms pulse)
setup_timer_1( T1_INTERNAL | T1_DIV_BY_2 ); // Enable Timer1 module
with internal clock source and prescaler = 2
set_timer1(0); // Reset Timer1 value
nec_state = 1; // Next state: end of 9ms
pulse (start of 4.5ms space)
i = 0;
ext_int_edge( H_TO_L ); // Toggle external interrupt
edge
return;
case 1 : // End of 9ms pulse
if((time > 9500) || (time < 8500)){ // Invalid interval ==> stop
decoding and reset
nec_state = 0; // Reset decoding process
setup_timer_1(T1_DISABLED); // Stop Timer1 module
}
else
Đồ án VI ĐIỀU KHIỂN: Robot tự cân bằng 15

nec_state = 2; // Next state: end of 4.5ms


space (start of 560µs pulse)
ext_int_edge( L_TO_H ); // Toggle external interrupt
edge
return;
case 2 : // End of 4.5ms space
if((time > 5000) || (time < 4000)){ // Invalid interval ==> stop
decoding and reset
nec_state = 0; // Reset decoding process
setup_timer_1(T1_DISABLED); // Stop Timer1 module
return;
}
nec_state = 3; // Next state: end of 560µs
pulse (start of 560µs or 1680µs space)
ext_int_edge( H_TO_L ); // Toggle external interrupt
edge
return;
case 3 : // End of 560µs pulse
if((time > 700) || (time < 400)){ // Invalid interval ==> stop
decoding and reset
nec_state = 0; // Reset decoding process
setup_timer_1(T1_DISABLED); // Disable Timer1 module
}
else
nec_state = 4; // Next state: end of 560µs
or 1680µs space
ext_int_edge( L_TO_H ); // Toggle external interrupt
edge
return;
case 4 : // End of 560µs or 1680µs
space
if((time > 1800) || (time < 400)){ // Invalid interval ==> stop
decoding and reset
nec_state = 0; // Reset decoding process
setup_timer_1(T1_DISABLED); // Disable Timer1 module
return;
}
Đồ án VI ĐIỀU KHIỂN: Robot tự cân bằng 16

if( time > 1000) // If space width > 1ms


(short space)
bit_set(rf_code, (31 - i)); // Write 1 to bit (31 - i)
else // If space width < 1ms
(long space)
bit_clear(rf_code, (31 - i)); // Write 0 to bit (31 - i)
i++;
if(i > 31){ // If all bits are received
code_ok = 1; // Decoding process OK
disable_interrupts(INT_EXT); // Disable the external
interrupt
}
nec_state = 3; // Next state: end of 560µs
pulse (start of 560µs or 1680µs space)
ext_int_edge( H_TO_L ); // Toggle external interrupt
edge
}
}
#INT_TIMER1 //tràn timer1 // Timer1 interrupt (used
for time out)
void timer1_isr(void){
nec_state = 0; // Reset decoding process
ext_int_edge( L_TO_H ); // External interrupt edge
from high to low
setup_timer_1(T1_DISABLED); // Disable Timer1 module
clear_interrupt(INT_TIMER1); // Clear Timer1 interrupt
flag bit
}
void main() {
setup_oscillator(OSC_8MHZ); // Set internal oscillator
to 8MHz
output_d(0); // PORTD initial state
set_tris_d(0); // Configure PORTD pins as
outputs
enable_interrupts(GLOBAL); // Enable global interrupts
enable_interrupts(INT_EXT_L2H); // Enable external interrupt
Đồ án VI ĐIỀU KHIỂN: Robot tự cân bằng 17

clear_interrupt(INT_TIMER1); // Clear Timer1 interrupt


flag bit
enable_interrupts(INT_TIMER1); // Enable Timer1 interrupt
while(TRUE){
if(code_ok){ // If the mcu successfully
receives NEC protocol message
code_ok = 0; // Reset decoding process
nec_state = 0;
setup_timer_1(T1_DISABLED); // Disable Timer1 module
if(rf_code == 0x00FF00FF && m1_dir){ // If button 1 is pressed (toggle
rotation direction of motor 1) //tien
m1_dir = 0;
rf_code = 0;
output_D(0x05);
}
if(rf_code == 0x00FF00FF && !m1_dir){ // If button 1 is pressed (toggle
rotation direction of motor 1) lui
rf_code= 0;
m1_dir = 1;
output_D(0x0A);
}
if(rf_code == 0x00FF807F){ // If button 4 is pressed (toggle rotation
direction of motor 2) // trai
m1_dir=1;
rf_code = 0;
output_D(0x04);
}
if(rf_code == 0x00FF40BF){
rf_code= 0; //phai
m1_dir=1;
output_D(0x01);
}
if(rf_code ==0x00FF20DF){ //dung lai
rf_code= 0;
output_D(0x00);
Đồ án VI ĐIỀU KHIỂN: Robot tự cân bằng 18

}
enable_interrupts(INT_EXT_H2L); // Enable external interrupt
}
}
}

1.3 Mạch điều chỉnh tốc độ


1. #include <16F887.h>
2. #device ADC=10
3.
4. #FUSES NOWDT //No Watch Dog Timer
5. #FUSES NOBROWNOUT //No brownout reset
6. #FUSES NOLVP //No low voltage prgming, B3(PIC16) or
B5(PIC18) used for I/O
7.
8. #use delay(crystal=20000000)
9. #DEFINE UP PIN_A3
10. #DEFINE DW PIN_A4
11. #DEFINE STOP PIN_A5
12. #DEFINE ENA PIN_C0
13.
14. UNSIGNED INT CAPDO=0;
15.
16.
17. VOID PHIM_THUAN ()
18. {
19. IF (!INPUT(UP))
20. {
21. DELAY_MS (20);
22. IF(!INPUT(UP))
23. {
24. IF (CAPDO<10)
25. {
26. OUTPUT_HIGH(ENA);
27. CAPDO++;
28. SET_PWM1_DUTY(CAPDO*25);
29.
30. DO {} WHILE (!INPUT(UP));
31. }
32. }
33. }
34. }
35.
36. VOID PHIM_NGHICH ()
37. {
Đồ án VI ĐIỀU KHIỂN: Robot tự cân bằng 19

38. IF (!INPUT(DW))
39. {
40.
41. DELAY_MS (20);
42. IF(!INPUT(DW))
43. {
44. IF (CAPDO<10)
45. {
46. OUTPUT_HIGH(ENA);
47. CAPDO++;
48. SET_PWM2_DUTY(CAPDO*25);
49.
50. DO {} WHILE (!INPUT(DW));
51. }
52. }
53. }
54. }
55. VOID PHIM_STOP()
56. {
57. IF(!INPUT(STOP))
58. {
59.
60. set_pwm2_duty(0);
61. set_pwm1_duty(0);
62. }
63. }
64.
65.
66.
67. void main()
68. {
69. SET_TRIS_A(0XFF);
70. SETUP_CCP1(CCP_PWM);
71. SETUP_CCP2(CCP_PWM);
72.
73. SETUP_TIMER_2(T2_DIV_BY_16,249,1);
74. set_pwm1_duty(0);
75. set_pwm2_duty(0);
76.
77. enable_interrupts(INT_RDA);
78. enable_interrupts(GLOBAL);
79. OUTPUT_LOW(ENA);
80.
81. WHILE(TRUE)
82. {
83. PHIM_THUAN();
84. PHIM_NGHICH();
85. PHIM_STOP();
86. }
Đồ án VI ĐIỀU KHIỂN: Robot tự cân bằng 20

87. }

Chương 5:
KẾT LUẬN

You might also like