Xây dựng chương trình lập trình

Một phần của tài liệu BÀI tập lớn XE dò ĐƯỜNG (Trang 36 - 58)

1. PHẦN ĐIỀU KHIỂN

Phần điều khiển : chính là phần làm cho robot hoạt động theo sự mong muốn của con người.

Phần điều khiển là tập hợp của rất nhiều các phần khác nhau trong đó có phần mềm và phần cứng :

+ Phần mềm là tập hợp những câu lệnh được người lập trình viết ra bằng một hay nhiều ngôn ngữ lập trình theo một trình tự nhất định, nhằm thực hiện các nhiệm vụ, chức năng, thao tác hay giải quyết một hoặc nhiều vấn đề nào đó.

+ Phần mềm thực hiện các chức năng của nó bằng cách gửi các chỉ thị trực tiếp đến phần cứng, phần mềm cần phải có phần cứng mới có thể thực thi được.

37

2. PHẦN MỀM VẼ MẠCH

Sử dụng phần mềm altiun disigner.

- Phần mềm altium designer là một phần mềm hỗ trợ thiết kế mạch điện tử. Được phát triển từ phần mềm protel của hãng altium. Là một phần mềm sử dụng đơn giản, tạo ra những sơ đồ nguyên lý, mạch thiết kế, mạch in, mạch mô phỏng...

- Đặc điểm :

+ Hỗ trợ mạnh mẽ cho việc thiết kế tự động, đi dây tự động theo thuật toán tối ưu, phân tích lắp ráp linh kiện.

+ Hỗ trợ việc tìm các giải pháp thiết kế hoặc chỉnh sửa mạch, linh kiện, netlist có sẵn từ trước theo các tham số mới.

+ Mở, xem và in các file thiết kế mạch dễ dàng với đầy đủ các thông tin linh kiện, netlist, dữ liệu bản vẽ, kích thước, số lượng…

+ Hệ thống các thư viện linh kiện phong phú, chi tiết và hoàn chỉnh bao gồm tất cả các linh kiện nhúng, số, tương tự…

+ Đặt và sửa đối tượng trên các lớp cơ khí, tùy chỉnh các lớp mạch in, chuyển từ schematic sang PCB, đặt vị trí linh kiện trên PCB.

+ Mô phỏng mạch PCB 3D, đem lại hình ảnh mạch điện trung thực trong không gian 3 chiều, hỗ trợ MCAD-ECAD, liên kết trực tiếp với mô hình STEP, kiểm tra khoảng cách cách điện, cấu hình cho cả 2D và 3D

+ Hỗ trợ thiết kế PCB sang FPGA và ngược lại.

- Hình ảnh phần mềm.

38

+ hình ảnh phần mềm khi đã mở ra và một số thanh ghi :

Ở mennu chính cần biết :

+ DPX : là nơi chứa nội dung về cập nhật các plug in, cài đặt cho phần

mềm khởi chạy script..

+ File : tạo các file thiết kế, mở thiết kế, lưu thiết kế...

+ View: điều chỉnh, tùy chọn các thanh công cụ hiển thị trong giao diện + Project : là nơi cho phép kiểm tra thiết kế, di chuyển, bỏ các file trong nó.

+ Place : công cụ lấy các kết nối trong thiết kế, bus, bus entry... + Design: thiết kế...

39

a. Khối nguồn.

Nguồn cấp nguồn cho toàn bộ mạch điện ở robot, nguồn được lấy là 12V sau đó đưa qua cổng IC ổn áp, lấy nguồn nuôi cấp cho vi điều khiển.

Mạch nguồn

b. Khối điều khiển

40

c. Khối sensor

Mạch cảm biến

d. Khối xử lý sensor

Mạch điều khiển cảm biến

Một số khối dưới dạng 3D :

41

42

4. NGÔN NGỮ LẬP TRÌNH

//Cod điều khiển robot dò đường với đường vạch màu đen : #include<mga16.h>

#include<stadio.h> #include<conio.h> #include<delay.h>

#define inA1 6 //Định nghĩa chân in1 của động cơ A #define inA2 7 //Định nghĩa chân in2 của động cơ A #define inB1 8 //Định nghĩa chân in1 của động cơ B #define inB2 9 //Định nghĩa chân in2 của động cơ B #define linesens1 10 //Định nghĩa chân cảm biến line 1 #define linesens2 11 //Định nghĩa chân cảm biến line 2 #define linesens3 12 //Định nghĩa chân cảm biến line 3 #define linesens4 13 //Định nghĩa chân cảm biến line 4 void setup() {

Serial.begin(9600);

pinMode(inA1, OUTPUT);//Set chân in1 của dc A là output pinMode(inA2, OUTPUT);//Set chân in2 của dc A là output pinMode(inB1, OUTPUT);//Set chân in1 của dc B là output pinMode(inB2, OUTPUT);//Set chân in2 của dc B là output pinMode(linesens1, INPUT);//Set chân cảm biến 1 là input pinMode(linesens2, INPUT);//Set chân cảm biến 2 là input pinMode(linesens3, INPUT);//Set chân cảm biến 3 là input pinMode(linesens4, INPUT);//Set chân cảm biến 4 là input }

43

darkLineFollower (inA1, inA2, inB1, inB2, linesens1, linesens2, linesens3, linesens4);

delayMicroseconds(1); }

void darkLineFollower (byte inR1, byte inR2, byte inL1, byte inL2, byte sen1, byte sen2, byte sen3, byte sen4)

{

//Hàm điều khiển robot bám line màu tối

//inR1, inR2 và inL1, inL2 là các chân tín hiệu lần lượt điều khiển động cơ di chuyển bên phải và trái

//sen1 đến sen4 là chân nhận tín hiệu từ cảm biến hồng ngoại switch (deviationDarkLine4Sensor (sen1, sen2, sen3, sen4)) {

case -1:

robotMover( inR1, inR2, inL1, inL2, 6);// rẽ phải break;

case -2:

robotMover( inR1, inR2, inL1, inL2, 6); break;

case 1:

robotMover( inR1, inR2, inL1, inL2, 5);// rẽ trái break;

case 2:

robotMover( inR1, inR2, inL1, inL2, 5); break;

case 0:

44

break; case 3:

robotMover( inR1, inR2, inL1, inL2, 5);// quay trái break;

} }

void robotMover (byte inR1, byte inR2, byte inL1, byte inL2, byte action) {

inR1 inR2 là 2 chân tín hiệu động cơ bên phải inL1 inL2 là 2 chân tín hiệu động cơ bên trái action= 0 đứng yên

action =1 đi thẳng action =2 lùi lại action =3 quay trái action =4 quay phải action =5 rẽ trái action =6 rẽ phải switch (action) {

case 0:// không di chuyển

motorControlNoSpeed(inR1, inR2, 0); motorControlNoSpeed(inL1, inL2, 0); break;

case 1://đi thẳng

45

motorControlNoSpeed(inL1, inL2, 1); break;

case 2:// lùi lại

motorControlNoSpeed(inR1, inR2, 2); motorControlNoSpeed(inL1, inL2, 2); break;

case 3:// quay trái

motorControlNoSpeed(inR1, inR2, 2); motorControlNoSpeed(inL1, inL2, 1); break; case 4:// quay phải

motorControlNoSpeed(inR1, inR2, 1); motorControlNoSpeed(inL1, inL2, 2); break; case 5:// rẽ trái

motorControlNoSpeed(inR1, inR2, 1); motorControlNoSpeed(inL1, inL2, 0); break; case 6:// rẽ phải motorControlNoSpeed(inR1, inR2, 0); motorControlNoSpeed(inL1, inL2, 1); break; default: action = 0; } }

void motorControlNoSpeed (byte in1, byte in2, byte direct) {

46

// in1 and in2 are 2 signal pins to control the motor // en is the enable pin

// the defauspeed is the highest // direct includes:

// 0:Stop

// 1:Move on 1 direct

// 2:Move on another direct switch (direct) {

case 0:// Dừng không quay digitalWrite(in1, LOW); digitalWrite(in2, LOW); break;

case 1:// Quay chiều thứ 1 digitalWrite(in1, HIGH); digitalWrite(in2, LOW); break;

case 2:// Quay chiều thứ 2 digitalWrite(in1, LOW); digitalWrite(in2, HIGH); break; //default: } }

boolean IFSensor (byte PinNumb) {

47

//1 tối

return(digitalRead (PinNumb)); }

int deviationDarkLine4Sensor (int PinNumb1, int PinNumb2, int PinNumb3, int PinNumb4)

{

int left = 0;

//biến kiểm tra lệch trái int right = 0;

// biến kiểm tra lệch phải

left = IFSensor (PinNumb1)+IFSensor (PinNumb2); //kiểm tra mấy cảm biến trái ở trong màu đen

right= IFSensor (PinNumb3)+IFSensor (PinNumb4); //kiểm tra mấy cảm biến phải ở trong màu đen

Serial.print("left="); Serial.println(left); Serial.print("right="); Serial.println(right);

if ((left!=0) || (right!=0))return left - right; else return 3;

// Kết quả trả về là 0 là không lệch Âm là lệch trái, Dương là lệch phải }

Để hiểu hơn về cod dưới đây sễ là cod chi tiết :

a. Cod cho bộ phận di chuyển :

#define inA1 6 //Định nghĩa chân in1 của động cơ A #define inA2 7 //Định nghĩa chân in2 của động cơ A

48

#define inB1 8 //Định nghĩa chân in1 của động cơ B #define inB2 9 //Định nghĩa chân in2 của động cơ B void setup()

{

pinMode(inA1, OUTPUT);//Set chân in1 của dc A là output pinMode(inA2, OUTPUT);//Set chân in2 của dc A là output pinMode(inB1, OUTPUT);//Set chân in1 của dc B là output pinMode(inB2, OUTPUT);//Set chân in2 của dc B là output }

void loop() {

robotMover (inA1, inA2, inB1, inB2,1); delay (1000);

robotMover (inA1, inA2, inB1, inB2,0); delay (1000);

robotMover (inA1, inA2, inB1, inB2,2); delay (1000);

robotMover (inA1, inA2, inB1, inB2,0); delay (1000);

robotMover (inA1, inA2, inB1, inB2,3); delay (1000);

robotMover (inA1, inA2, inB1, inB2,0); delay (1000);

robotMover (inA1, inA2, inB1, inB2,4); delay (1000);

49

delay (1000);

robotMover (inA1, inA2, inB1, inB2,5); delay (1000);

robotMover (inA1, inA2, inB1, inB2,0); delay (1000);

robotMover (inA1, inA2, inB1, inB2,6); delay (1000);

robotMover (inA1, inA2, inB1, inB2,0); delay (1000);

robotMover (inA1, inA2, inB1, inB2,7); delay (1000);

robotMover (inA1, inA2, inB1, inB2,0); delay (1000);

robotMover (inA1, inA2, inB1, inB2,8); delay (1000);

robotMover (inA1, inA2, inB1, inB2,0); delay (1000);

}

void robotMover (byte inR1, byte inR2, byte inL1, byte inL2, byte action) {

inR1 inR2 là 2 chân tín hiệu động cơ bên phải inL1 inL2 là 2 chân tín hiệu động cơ bên trái action= 0 đứng yên

action =1 đi thẳng action =2 lùi lại action =3 quay trái

50

action =4 quay phải action =5 rẽ trái action =6 rẽ phải action =7 rẽ lùi trái action =8 rẽ lùi phải switch (action)

{

case 0:// không di chuyển

motorControlNoSpeed(inR1, inR2, 0); motorControlNoSpeed(inL1, inL2, 0); break; case 1://đi thẳng motorControlNoSpeed(inR1, inR2, 1); motorControlNoSpeed(inL1, inL2, 1); break;

case 2:// lùi lại

motorControlNoSpeed(inR1, inR2, 2); motorControlNoSpeed(inL1, inL2, 2); break;

case 3:// quay trái

motorControlNoSpeed(inR1, inR2, 1); motorControlNoSpeed(inL1, inL2, 2); break;

case 4:// quay phải

motorControlNoSpeed(inR1, inR2, 2); motorControlNoSpeed(inL1, inL2, 1);

51 break; case 5:// rẽ trái motorControlNoSpeed(inR1, inR2, 1); motorControlNoSpeed(inL1, inL2, 0); break; case 6:// rẽ phải motorControlNoSpeed(inR1, inR2, 0); motorControlNoSpeed(inL1, inL2, 1); break;

case 7:// rẽ lùi trái

motorControlNoSpeed(inR1, inR2, 2); motorControlNoSpeed(inL1, inL2, 0); break;

case 8:// rẽ lùi phải

motorControlNoSpeed(inR1, inR2, 0); motorControlNoSpeed(inL1, inL2, 2); break; default: action = 0; } }

void motorControlNoSpeed (byte in1,byte in2, byte direct) {

// in1 and in2 are 2 signal pins to control the motor // en is the enable pin

52

// direct includes: // 0:Stop

// 1:Move on 1 direct

// 2:Move on another direct switch (direct)

{

case 0:// Dừng không quay digitalWrite(in1,LOW); digitalWrite(in2,LOW); break;

case 1:// Quay chiều thứ 1 digitalWrite(in1,HIGH); digitalWrite(in2,LOW); break;

case 2:// Quay chiều thứ 2 digitalWrite(in1,LOW); digitalWrite(in2,HIGH); b reak; //default: } }

b. Hàm xác định độ lệch line của robot:

#define sensor1 10 #define sensor2 11 #define sensor3 12

53

#define sensor4 13 void setup()

{

Serial.begin(9600);// thiet lap su dung serial gui tin hieu ve may tinh pinMode (sensor1, INPUT);

pinMode (sensor2, INPUT); pinMode (sensor3, INPUT); pinMode (sensor4, INPUT); } void loop() { Serial.print(IRSensor(sensor1)); Serial.print(' '); Serial.print(IRSensor(sensor2)); Serial.print(' '); Serial.print(IRSensor(sensor3)); Serial.print(' '); Serial.println(IRSensor(sensor4));

Serial.println (deviationDarkLine4Sensor (sensor1, sensor2, sensor3, sensor4));

delay (1000); }

boolean IRSensor (byte PinNumb) {

//0 sáng //1 tối

54

return(digitalRead (PinNumb)); }

int deviationDarkLine4Sensor (int PinNumb1, int PinNumb2, int PinNumb3, int PinNumb4)

{

int left = 0; //biến kiểm tra lệch trái int right = 0; // biến kiểm tra lệch phải

left = IRSensor (PinNumb1)+IRSensor (PinNumb2); //kiểm tra mấy cảm biến trái ở trong màu đen

right= IRSensor (PinNumb3)+IRSensor (PinNumb4); //kiểm tra mấy cảm biến phải ở trong màu đen

Serial.print("left="); Serial.println(left); Serial.print("right="); Serial.println(right);

if ((left!=0) || (right!=0))return left - right; else return 3;

//Kết quả trả về là 0 là không lệch Âm là lệch trái(-1;-2) Dương là lệch phải(1,2) 0 robot không lệch 3 robot đã mất vạch.

}

c. Cod cho cảm biến hồng ngoại dò đường :

#define sensor1 13 #define sensor2 12 #define sensor3 11 #define sensor4 10 void setup() {

55

Serial.begin(9600); // thiet lap su dung serial gui tin hieu ve may tinh pinMode (sensor1, INPUT);

pinMode (sensor2, INPUT); pinMode (sensor3, INPUT); pinMode (sensor4, INPUT); }

void loop() {

if (digitalRead (sensor1) == 0)Serial.print("Sensor1 = white "); else Serial.print("Sensor1 = black ");

if (digitalRead (sensor2) == 0)Serial.print("Sensor2 = white "); else Serial.print("Sensor2 = black ");

if (digitalRead (sensor3) == 0)Serial.print("Sensor3 = white "); else Serial.print("Sensor3 = black ");

if (digitalRead (sensor4) == 0)Serial.println("Sensor4 = white "); else Serial.println("Sensor4 = black ");

delay(1000); }

d. Cod cho điều khiển động cơ dc :

#define inA1 13 //Định nghĩa chân in1 của động cơ A #define inA2 12 //Định nghĩa chân in2 của động cơ A void setup()

{

pinMode(inA1, OUTPUT);//Set chân in1 của dc A là output pinMode(inA2, OUTPUT);//Set chân in1 của dc A là output

56

}

void loop() {

motorControlNoSpeed (inA1,inA2,1);// Cho quay 5 giay delay (5000);

motorControlNoSpeed (inA1,inA2,2); // Quay ngược lại 5 giay delay (5000);

}

void motorControlNoSpeed (int in1,int in2, byte direct) {

// in1 and in2 are 2 signal pins to control the motor // en is the enable pin

// the defauspeed is the highest // direct includes:

// 0:Stop

// 1:Move on 1 direct

// 2:Move on another direct switch (direct) { case 0:// Dừng không quay

digitalWrite(in1,LOW); digitalWrite(in2,LOW); break;

case 1:// Quay chiều thứ 1 digitalWrite(in1,HIGH); digitalWrite(in2,LOW); break;

57 digitalWrite(in1,LOW); digitalWrite(in2,HIGH); break; default; } }

58

TÀI LIỆU THAM KHẢO

Phần mềm thiết kế mạch điện tử: Altiun disigner, Proteus

Phần mềm lập trình C

Một phần của tài liệu BÀI tập lớn XE dò ĐƯỜNG (Trang 36 - 58)

Tải bản đầy đủ (PDF)

(58 trang)