Tags

Bài 1: Các bước chuẩn bị

Để bắt tay vào chế tạo 1 con Robot bạn cần

1. Kiến thức :

– Kiến thức cơ sở về điện tử: tôi nghĩ rằng nếu đã tốt nghiệp PTTH thì kiến thức điện tử của bạn đã có thể dùng để chế tạo 1 con Robot đơn giản.

– Kiến thức lập trình Vi điều khiển: bạn có thể học lập trình Assemble hoặc C.

2. Phần mềm:

– Trình duyệt: tùy mục đích làm Robot mà bạn sẽ chọn loại VĐK phù hợp, trên cơ sở đó sẽ chọn trình duyệt tương ứng. Trong loạt bài này tôi sẽ hướng dẫn Lập trình C cho VĐK T89C51 trên trình duyệt RIDE 51. Trên cơ sở đó bạn có thể viết lại cho VĐK của mình trên trình duyệt tương ứng.

– Phần mềm mô phỏng: Protues hỗ trợ rất mạnh về mô phỏng trực quan. Bạn sẽ thấy rất tiện nghi khi làm việc với nó, tiết kiệm thời gian, và giảm chi phí mua những linh kiện ko cần thiết…

3. Phần cứng: nếu có tiền thì…

– Nếu là người chưa có kinh nghiệm về VĐK, bạn nên mua cho riêng mình 1 KIT để học, có sẵn VĐK, LCD, speaker … để tiết kiệm tiền, tránh và các cổng Analog và Digital để cắm các thiết bị ngoài như sensor hoặc motor.

– 2 motor DC cỡ nhỏ.

– Sensor: 2 sensor hồng ngoại nhận dạng vạch trắng- đen, 1 sensor hồng ngoại xác định khoảng cách.

*** Tôi mua tất cả những linh kiện này tốn hơn 2 triệu đồng.

– Ngoài ra bạn có thể mua thêm các linh kiện cần thiết cho mục đích của mình, ví dụ sensor đo nhiệt độ, độ ẩm …

*** Lời khuyên: bạn ko nên vội mua bất cứ thứ linh kiện nào khi mà chưa thấy nó cần thiết. Vì hầu hết các linh kiện đều có thể mô phỏng được.

Khi nào nắm chắc kiến thức và cảm thấy thật sự cần thiết phải mua thì mới mua. Để dành tiền cho những mục đích xa hơn. Còn nếu 2 triệu ko là vấn đề lớn với bạn thì cứ mua.

4. Quan trọng nhất: là bạn thực sự thích thú về Robot và mong muốn tự mình có thể chế tạo Robot.

5. Thời gian rảnh: Hãy sắp xếp thời gian học tập và nghỉ ngơi hợp lý để bạn có 1 khoảng thời gian rảnh, yên tâm ngồi nghiên cứu về Robot. Đừng để nó ảnh hưởng đến kết quả học tập hoặc công việc chính của bạn.

Bài 2: Lập trình điều khiển động cơ DC

2.1. Trong bài này, tôi sẽ hướng dẫn thiết mạch, mô phỏng trên Proteus và viết chương trình cho VĐK để điều khiển động cơ DC.

Khi làm thực tế lưu ý: Mạch điều khiển động cơ DC gồm 2 phần: mạch logic và mạch công suất. Do mạch công suất có thể sử dụng điện áp cao, còn mạch logic thì dùng điện áp thấp (dưới 5V), nên cần thiết phải cách ly 2 phần này ra để bảo vệ mạch logic. Có nhiều phương pháp để giải quyết vấn đề này, trong đó có phương pháp dùng Opto và dùng IC. Để đơn giản hóa, tôi dùng IC L293D có tích hợp sẵn mạch khuyếch đại và cách ly 2 mạch logic – công suất.

Xem mạch ở hình dưới

File gửi kèm

2.2. Driver cho mạch điều khiển động cơ này như sau:

/*————————————————————————–*/

// Program : Pulse width modulation by PCA module

// Description : Generate pulse width modulation signal on CEX3 and CEX4

// : using PCA function

// Filename : dc_motor.h

// C compiler : RIDE 51 V6.1

/*————————————————————————–*/

#define ch1 1 // Define constant

#define ch2 2 // Define constant

#define all 3 // Define constant

#define motor_pulse 115 // Define constant

sbit dir_a1 = P2^0; // bit drive motor0

sbit dir_a2 = P2^1; // bit drive motor0

sbit dir_b1 = P2^2; // bit drive motor1

sbit dir_b2 = P2^3; // bit drive motor1

/************************************************** ***************************/

/*********************** Drive motor backward ********************************/

/************************************************** ***************************/

void motor_bk(unsigned char select_bk ,unsigned char speed)

{

TMOD &= 0xF0; // Refresh mode timer 0

TMOD |= 0x02; // Setup mode timer 0 (8 bit auto reload)

TH0 = motor_pulse; // Reload value for timer 0

TL0 = motor_pulse; // Initial value for count of timer 0

TR0 = 1; // Start timer 0

CMOD = 0x04; // Set CMOD PCA count freq. by pulse overflow timer0

if(select_bk==1)

{

CCAPM3 = 0x42; // Set CCAP Module 3 as 8 bit PWM

CCAP3L = 255-speed; // Set CCAP3L initial value by speed variable(set duty cycle)

CCAP3H = 255-speed; // Set CCAP3H reload value by speed variable(set duty cycle)

dir_a1 = 1; // set direction backward

dir_a2 = 0; // set direction backward

}

else if(select_bk==2)

{

CCAPM4 = 0x42; // Set CCAP Module 3 as 8 bit PWM

CCAP4L = 255-speed; // Set CCAP4L initial value by speed variable(set duty cycle)

CCAP4H = 255-speed; // Set CCAP4H initial value by speed variable(set duty cycle)

dir_b1 = 1; // set direction backward

dir_b2 = 0; // set direction backward

}

CCON = 0x40; // Set PCA counter run

}

/************************************************** ***************************/

/*********************** Drive motor forward ********************************/

/************************************************** ***************************/

void motor_fd(unsigned char select_fd, unsigned char speed)

{

TMOD &= 0xF0; // Refresh mode timer 0

TMOD |= 0x02; // Setup mode timer 0 (8 bit auto reload)

TH0 = motor_pulse; // Reload value for timer 0

TL0 = motor_pulse; // Initial value for count of timer 0

TR0 = 1; // Start timer 0

CMOD = 0x04; // Set CMOD PCA count freq. by pulse overflow timer0

if(select_fd==1)

{

CCAPM3 = 0x42; // Set CCAP Module 3 as 8 bit PWM

CCAP3L = 255-speed; // Set CCAP3L initial value by speed variable(set duty cycle)

CCAP3H = 255-speed; // Set CCAP3H initial value by speed variable(set duty cycle)

dir_a1 = 0; // Set direction forward

dir_a2 = 1; // Set direction forward

}

else if(select_fd==2)

{

CCAPM4 = 0x42; // Set CCAP Module 3 as 8 bit PWM

CCAP4L = 255-speed; // Set CCAP4L initial value by speed variable(set duty cycle)

CCAP4H = 255-speed; // Set CCAP4H initial value by speed variable(set duty cycle)

dir_b1 = 0; // Set direction forward

dir_b2 = 1; // Set direction forward

}

CCON = 0x40; // Set PCA counter run

}

/************************************************** ***************************/

/*********************** Break motor *****************************************/

/************************************************** ***************************/

void motor_stop(char select_stop)

{

if(select_stop==1)

{

dir_a1 = 0; // Break motor channel 1

dir_a2 = 0; // Break motor channel 1

CCAPM3 &= 0xFD; // Stop generate PWM at pin P1.6

}

else if(select_stop==2)

{

dir_b1 = 0; // break motor channel 2

dir_b2 = 0; // Break motor channel 2

CCAPM4 &= 0xFD; // Stop generate PWM at pin P1.7

}

else if(select_stop==3)

{

dir_a1 = 0; // Break motor channel 1

dir_a2 = 0; // Break motor channel 1

CCAPM3 &= 0xFD; // Stop generate PWM at pin P1.6

dir_b1 = 0; // Break motor channel 2

dir_b2 = 0; // Break motor channel 2

CCAPM4 &= 0xFD; // Stop generate PWM at pin P1.7

}

}

2.3. Đây là phần mô phỏng trên Proteus

Các thành phần chính gồm:

– AT89C51

– motor driver L293D

– 2 motor DC

– 2 leds hiển thị chiều quay động cơ: chiều thuận led sẽ cho ánh sáng xanh, chiều nghịch led cho ánh sáng màu đỏ

File gửi kèm

2.4. Thực hiện bài tập điều khiển đơn giản nhất

Robot của bạn được điều khiển chuyển động bằng 2 động cơ DC, như mô phỏng ở trên.

Yêu cầu: Lập trình cho Robot thực hiện các chuyển động sau:

– Chạy tới

– Chạy lui

– Rẽ phải

– Rẽ trái

2.4. Thực hiện bài tập điều khiển đơn giản nhất

Robot của bạn được điều khiển chuyển động bằng 2 động cơ DC, như mô phỏng ở trên.

Yêu cầu: Lập trình cho Robot thực hiện các chuyển động sau:

– Chạy tới

– Chạy lui

– Rẽ phải

– Rẽ trái

Mách nước:

Khi robot chạy tới thì 2 motor đều quay chiều thuận, 2 leds phát sáng màu xanh.

Khi robot chạy lui thì 2 motor đều quay chiều ngược, 2 leds phát sáng màu đỏ.

Khi robot rẽ phải thì motor phải quay chiều nghịch, motor trái quay chiều thuận (các leds phát sáng màu tương ứng)

Khi robot rẽ trái thì motor trái quay chiều nghịch, motor phải quay chiều thuận.

2.5. Lập trình điều khiển chuyển động

Đây là C Code để giải bài toán ví dụ trên. Code được viết trên trình duyệt RIDE 51

/*———————————————–*/

// Program : Basic Move

// Description: Robo-51 movement by simple function

// Filename : basic_move.c

// C compiler : RIDE 51 v6.1

/*———————————————–*/

#include <c51ac2.h>

#include <dc_motor.h>

#include <delay_robo51.h>

#define pow 200

void run_fd(int time_spin)

{

motor_fd(2,pow);

motor_fd(1,pow);

delay_ms(time_spin);

}

void run_bk(int time_spin)

{

motor_bk(2,pow);

motor_bk(1,pow);

delay_ms(time_spin);

}

void turn_left(int time_spin)

{

motor_fd(2,pow);

motor_bk(1,pow);

delay_ms(time_spin);

}

void turn_right(int time_spin)

{

motor_fd(1,pow);

motor_bk(2,pow);

delay_ms(time_spin);

}

void stop(void)

{

motor_stop(3);

}

void main()

{

while(1)

{

run_fd(1000);

stop;

turn_left(1000);

stop;

run_bk(1000);

turn_right(1000);

stop;

run_fd(1000);

stop;

turn_right(1000);

turn_left(200);

run_bk;

delay_ms(1000);

}

}

2.6 file.hex để nạp cho chip

bạn có thể dùng file này để nạp cho chip trong phần mô phỏng bằng proteus ở trên cũng như để nạp vào chip thật.

:03000000020003F8

:0F00030075810CE4787FF6D8FD75A0FF020146E9

:100012005389F0438902758C73758A73D28C75D9B2

:0400220004BF011105

:1000260075DD4274FFC39DF5EDF5FDD2A0C2A1803A

:0500360013EFB4020FFE

:10003B0075DE4274FFC39DF5EEF5FED2A2C2A37529

:03004B00D8402278

:10004E005389F0438902758C73758A73D28C75D976

:04005E0004BF0111C9

:1000620075DD4274FFC39DF5EDF5FDC2A0D2A180FE

:0500720013EFB4020FC2

:1000770075DE4274FFC39DF5EEF5FEC2A2D2A375ED

:03008700D840223C

:03008A00BF0108AB

:0B008D00C2A0C2A153DDFD22BF02088B

:0B009800C2A2C2A353DEFD22BF030E74

:0F00A300C2A0C2A153DDFDC2A2C2A353DEFD2243

:0D00B200E4FCFDECB50604EDB507005015AB

:1000BF007B6E7A04DBFEDAFC750A03750B6E0DEDB1

:0600CF0070E40C80E12248

:0D00D500E4FCFDECB50604EDB5070050118C

:1000E200784BD8FEE4F50875094B0DED70E80C80ED

:0200F200E52205

:1000F4008F037F027DC812004E1F12004E8B071221

:0301040000B22224

:100107008F037F027DC81200121F1200128B071285

:0301170000B22211

:10011A008F037F027DC812004E1F1200128B071236

:03012A0000B222FE

:10012D008F037F017DC812004E0F1200128B071234

:03013D0000B222EB

:060140007F0312008A2279

:100146007E037FE81200F47E037FE812011A7E0325

:100156007FE81201077E037FE812012D7E037FE808

:100166001200F47E037FE812012DE4FE7FC812011F

:0A0176001A7E037FE81200B280C673

:00000001FF

Theo http://dientuvietnam.net/forum