Arduino Ile Çizgi Izleyen Robot Yapımı
Çizgi izleyen robotun çalışma prensibi :
İki farklı şekilde çizgiyi takip eder.
- Siyah zemin üzerinde beyaz çizgiyi takip etmek
- Beyaz zemin üzerinde siyah çizgiyi takip etmek
Robot hakkında bilgiler:
Kızılötesi sensörler sayesinde siyah veya beyaz çizgiyi takip eder.Kısaca algoritmadan baysedersek , ortadaki sensör çizginin üzerine geldiğinde robot düz devam eder.Soldaki sensörler çizginin üzerine gelirse sola, sağdaki sensörler çizginin üzerine gelirse robot sağa hareket eder.
Robotta kullanılan komponentler:
Arduino Uno
QTR-8RC Kızılötesi Sensör
L293D Motor sürücü kartı
Robot Kit
Qtr8rc üzerinde 8 tane alıcı verici bulunmaktadır.Arduino ile çizgi izleyen robot projesinde 5 tane sensör kullanarak çizgiyi takip ettirdik.Arduino bağlantısında istediğiniz 5 sensörü kullanabilirsiniz.Fakat 5 sensör de ard arda olmalı ki aksi halde aradaki boş sensörler çizgiyi takip etmeyeceğinden robotunuz çizgi dışına çıkabilir. Yazılımda sensörler analog 1 den 5 e kadar pinlere tanımlanmıştır.Burada dikkat etmeniz gereken nokta a5 den 1 e kadar ki bağlantınız sensör de soldan sağa aynı şekilde olsun.Motor sürücü arduino üzerine direk takılıyor.Sadece motor pinlerine bağlantılarını yapıp düz takıldığını kontrol etmelisiniz.
Afmotor Shield için Arduino Kodu:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
|
#include <AFMotor.h> #include <QTRSensors.h> AF_DCMotor motor1(1, MOTOR12_8KHZ ); AF_DCMotor motor2(2, MOTOR12_8KHZ ); #define KP .2 #define KD 5 #define M1_minumum_hiz 120 #define M2_minumum_hiz 120 #define M1_maksimum_hiz 210 #define M2_maksimum_hiz 210 #define MIDDLE_SENSOR 3 #define NUM_SENSORS 5 #define TIMEOUT 2500 #define EMITTER_PIN 2 #define DEBUG 0 QTRSensorsRC qtrrc((unsigned char []) { 19,18,17,16,15} ,NUM_SENSORS, TIMEOUT, EMITTER_PIN); unsigned int sensorValues[NUM_SENSORS]; void setup() { delay(1500); manual_calibration(); set_motors(0,0); } int lastError = 0; int last_proportional = 0; int integral = 0; void loop() { unsigned int sensors[5]; int position = qtrrc.readLine(sensors); int error = position - 2000; int motorSpeed = KP * error + KD * (error - lastError); lastError = error; int leftMotorSpeed = M1_minumum_hiz + motorSpeed; int rightMotorSpeed = M2_minumum_hiz - motorSpeed; // set motor speeds using the two motor speed variables above set_motors(leftMotorSpeed, rightMotorSpeed); } void set_motors( int motor1speed, int motor2speed) { if (motor1speed > M1_maksimum_hiz ) motor1speed = M1_maksimum_hiz; //MAKSİMUM MOTOR 1 HIZ LİMİTİ if (motor2speed > M2_maksimum_hiz ) motor2speed = M2_maksimum_hiz; // MAKSİMUM MOTOR 2 HIZ LİMİTİ if (motor1speed < 0) motor1speed = 0; // MİNIMUMMOTOER 1 HIZ LİMİTİ if (motor2speed < 0) motor2speed = 0; // MİNİMUM MOTOR 2 HIZ LİMİTİ motor1.setSpeed(motor1speed); //1.MOTOR HIZI motor2.setSpeed(motor2speed); // 2.MOTOR HIZI motor1.run(FORWARD); //İLERİ motor2.run(FORWARD); //İLERİ } void manual_calibration() { int i; for (i = 0; i < 250; i++) { qtrrc.calibrate(QTR_EMITTERS_ON); delay(20); } if (DEBUG) { Serial.begin(9600); for ( int i = 0; i < NUM_SENSORS; i++) { Serial.print(qtrrc.calibratedMinimumOn[i]); Serial.print( ' ' ); } Serial.println(); for ( int i = 0; i < NUM_SENSORS; i++) { Serial.print(qtrrc.calibratedMaximumOn[i]); Serial.print( ' ' ); } Serial.println(); Serial.println(); } } |
Projenin L298N entegresi ile yapımı:
Bu kısımda sadece motor sürücüyü değiştirdik. Sensör pinleri aynı ve bağlantılarında değişiklik yok.
Yukarıdaki L298N entegresinin datasheetine bakalım ve aşağıdaki gibi bağlantılarımızı yapalım.
Sol Motor için: output1 ve output2 pinleri motorun uçlarına bağlayın. input1 ve input2 pinleri arduinonun 9 ve 10. dijital pinlerine, enableA ise dijital 4. pine takın.
Sağ Motor için: output3 ve output4 pinleri motorun uçlarına bağlayın. input3 ve input4 pinleri arduinonun 11 ve 12 dijital pinlerine, enableB ise dijital 5. pine takın.
Enerji Pinleri: Supply voltage vs yazılı pin bizim motorlar için besleme pilimizin artı uç girişidir. 9v yeterlidir.
Logic supply voltage vss yazılı pini arduinonun 5v pinine takın.
currentsensingA ve currentsensingB pinlerini 0.47ohm 5W direnç üzerinden pilin eksi ucuna bağlayın.
Son olarak da Gnd yazılı pini hem arduinun hem de pilin eksi ucuna bağlayın.
Projenin L293B veya L293D Motor Sürücüleri ile Devresi:
L298N , L293B ve L293D Motor Sürücüleri için Arduino Kodu:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
//Robimek Robotik Sistemler - 2016 //Çizgi izleyen robot //www.robimek.com #include <QTRSensors.h> #define SolMotorileri 9 #define SolMotorGeri 10 #define SagMotorileri 11 #define SagMotorGeri 12 #define ena 4 #define enb 5 #define KP .2 #define KD 5 #define M1_minumum_hiz 120 #define M2_minumum_hiz 120 #define M1_maksimum_hiz 210 #define M2_maksimum_hiz 210 #define MIDDLE_SENSOR 3 #define NUM_SENSORS 5 #define TIMEOUT 2500 #define EMITTER_PIN 2 #define DEBUG 0 int lastError = 0; int last_proportional = 0; int integral = 0; QTRSensorsRC qtrrc((unsigned char []) { 19,18,17,16,15} ,NUM_SENSORS, TIMEOUT, EMITTER_PIN); unsigned int sensorValues[NUM_SENSORS]; void setup() { pinMode(SolMotorileri,OUTPUT); pinMode(SolMotorGeri,OUTPUT); pinMode(SagMotorileri,OUTPUT); pinMode(SagMotorGeri,OUTPUT); pinMode(ena,OUTPUT); pinMode(enb,OUTPUT); delay(1500); manual_calibration(); set_motors(0,0); } void loop() { unsigned int sensors[5]; int position = qtrrc.readLine(sensors); int error = position - 2000; int motorSpeed = KP * error + KD * (error - lastError); lastError = error; int leftMotorSpeed = M1_minumum_hiz + motorSpeed; int rightMotorSpeed = M2_minumum_hiz - motorSpeed; set_motors(leftMotorSpeed, rightMotorSpeed); } void set_motors( int motor1speed, int motor2speed) { if (motor1speed > M1_maksimum_hiz ) motor1speed = M1_maksimum_hiz; //MAKSİMUM MOTOR 1 HIZ LİMİTİ if (motor2speed > M2_maksimum_hiz ) motor2speed = M2_maksimum_hiz; // MAKSİMUM MOTOR 2 HIZ LİMİTİ if (motor1speed < 0) motor1speed = 0; // MİNIMUMMOTOER 1 HIZ LİMİTİ if (motor2speed < 0) motor2speed = 0; // MİNİMUM MOTOR 2 HIZ LİMİTİ analogWrite(ena,motor1speed); analogWrite(enb,motor2speed); digitalWrite(SolMotorileri,HIGH); digitalWrite(SagMotorileri,HIGH); digitalWrite(SolMotorGeri,LOW); digitalWrite(SagMotorGeri,LOW); } void manual_calibration() { int i; for (i = 0; i < 250; i++) { qtrrc.calibrate(QTR_EMITTERS_ON); delay(20); } if (DEBUG) { Serial.begin(9600); for ( int i = 0; i < NUM_SENSORS; i++) { Serial.print(qtrrc.calibratedMinimumOn[i]); Serial.print( ' ' ); } Serial.println(); for ( int i = 0; i < NUM_SENSORS; i++) { Serial.print(qtrrc.calibratedMaximumOn[i]); Serial.print( ' ' ); } Serial.println(); Serial.println(); } } |
Kaynak : Robimek