Kod:
// QTR kütüphanesini ekliyoruz ve sabitlerimizi tanimliyoruz
#include <QTRSensors.h>
#define tabanhiz 150
#define sagmotorl 10
#define sagmotor2 9
#define sagmotorpwmpin 11
#define solmotorl 6
#define solmotor2 7
#define solmotorpwmpin 5
#define MZ80 8
#define taktik 12
#define LED 13
// QTR sensörümü bağlı olduğu pinlere tanımlayıp
//sensorlerden gelen veriler igin sensor dizisi olusturuyoruz
QTRSensorsAnalog qtra((unsigned char[]) {
A0, A1, A2, A3, A4 , A5, A6, A7
} , 8);
unsigned int sensors[8];
// Degigkenlerimizi tanimliyoruz
float Kp = 0.04; float Kn = 0.6; float Ki = 0.0001; int integral = 0;
int ekhiz = 0; int sonhata = 0; int hata = 0; byte K = 0;
int sagmotorpwm = 0; int solmotorpwm = 0; unsigned char zemin = 1;
int cizgisay = 0; long baslamazamani = 0; long doksanzamani = 50000;
void setup()
{
// Dijital olarak kullanacağımız pinlerin giriş veya çıkış olarak tanımlıyoruz
pinMode(sagmotorl, OUTPUT);
pinMode(sagmotor2, OUTPUT);
pinMode(sagmotorpwmpin, OUTPUT);
pinMode(solmotorl, OUTPUT);
pinMode(solmotor2, OUTPUT);
pinMode(solmotorpwmpin, OUTPUT);
pinMode(MZ80, INPUT);
pinMode(taktik, INPUT_PULLUP);
delay(1000); // kalibrasyon başlamadan ek süre koyuyoruz
//Kalibrasyon kodlari arduino üzerindeki led yanık olduğu sürece devama eder
digitalWrite(LED, HIGH);
// Kalibrsayonun otomatik gergeklesmesi robotumnza hafis sag sol kafa sallama yaptiriyoruz
for (int i = 0; i < 150; i++)
{
if ( 0 <= i && i < 5 ) hafifsagadon();
if ( 5 <= i && i < 15 ) hafifsoladon();
if ( 15 <= i && i < 25 ) hafifsagadon();
if ( 25 <= i && i < 35 ) hafifsoladon();
if ( 35 <= i && i < 40 ) hafifsagadon();
if ( 45 <= i && i < 50 ) hafifsoladon();
// Kalibrasyon dongusu 50yi astiktan sonra frenliyoruz bu esnada robotu
// Arduino uzerindeki led flash yapana kadar elle de kalibre edebiliriz
if ( i >= 50 ) {
fren1e(1);
delay(3);
}
qtra.calibrate();
delay(1);
}
// kalibrasyon döngüsünün çıktığını anlamak için Arduinoda bulunan yerleşik lede flaş yaptırıyoruz
// Bu esnada robotumuzun çizgi sensörünü çizgiye ortalıyoruz
flashyap();
// başlangıçta engel varsa durup bekler. MZ80 sensörü takılı olmalıdır
while (digitalRead(MZ80) == 2 LOW) {
frenle(l);
}
// Serial.begin(9600);
}
void loop() {
sensoroku();
//sensorlerioku_yaz();
dikcizgioku();
yol_ayrimi();
sag_sol_90();
engeldenatla();
if (cizgisay == 1 || cizgisay == 3 ) ekhiz = 1OO; else ekhiz = O;
if (cizgisay == 3) K = l;
}
if (cizgisay == 5) {
fren1e(10000);
}
//90 dereceden alınan zamana göre hızlanma komtlarımız
if (200 < (millis() - doksanzamani) && (millis() - doksanzamani) < 1200 ) ekhiz = 100;
if (1200 < (millis() - doksanzamani) && (millis() - doksanzamani) < 2400 ) ekhiz - 30;
if (2400 < (millis() - doksanzamani) && (millis() - doksanzamani) < 5000 ) ekhiz - 100:
// motorlara verilecek hız duzeltme oran hesebı PID
integral += hata; //çizgiden uzeklastikça hatalari toplar
if (abs(hata) < 500)integral = 0;
int duzeltmehizi = Kp * hata + Kd * (hata - sonhata) + Ki * integral;
sonhata = hata;
// Motorlara uygulanacak kesin hız ayarları
sagmotorpwm = tabanhiz + duzeltmehizi + ekhiz ;
solmotorpwm tabanhiz - duzeltmehizi + ekhiz ;
//***************
// motorlara hiz ayarlarinin uygulanması
// Burada motorlara uyqulanacek PWM degerlerine sınırlendırme getirilmiştir.
sagmotorpwm = constrain(sagmotorpwm, -50, 254);
solmotorpwn = constrain(solmotorpwm, -50, 254);
motorkontrol(solmotorpwm, sagmotorpwm);
}
void engeldenatla() {
if (digitalRead(MZ80) == LOW) {
motorkontrol(0, 150); delay(300); // önce sol motora fren verip sağ ileri yapıyor ve sola yönleniyoyoruz
motorkontrol(150, 150); delay(200); // biraz ileri gidiyor
motorkontrol(150, 0); delay(250); // sağ motora fren verip sol ileri yapıyor ve sola yönleniyoruz
motorkontrol(150, l50); delay(800): // biraz ileri gidiyor
motorkontrol(150, 0); delay(100); // biraz daha sağa yöne robotumuzu yönlendiriyoruz
do {
sensoroku(); //çizgi görene kadar kavis yaptırıyoruz
motorkontrol(150, 120);
}
while (hata == O);
}
}
void sag_sol_90() {
// sağa 90 derece var ise şartımız alttaki şekilde olacaktır
if (sensors[0] < 100 && sensors[1] < 100 && sensors[2] < 100 && sensors[3] < 100 && sensors[6] > 500 && sensors[7] > 700) {
// motorkontrol(-lOO,-250); delay(25); eğer hızlı bir motor kullanılıyorsa aktif edin
doksanzamani = millis(); // 90 derece geçişlerde zaman bilgisini alıyoruz
// robotumuznun ön sensör boşa çıktığında hata -3500 olur ve hata -3500 olduğunca
// sol motoru ileri sağ motoru geri çevirip sensör okumaya devam ediyoruz
do {
sensoroku();
motorkontrol(200, -50);
}
while (hata == -3500);
}
// sola 90 derece var ise şartımız alttaki şekide olacaktır
if (sensors[7] < 100 && sensors[6] < 100 && sensors[5] < 100 && sonsors[4] < 100 && sonsors[1] > 500 && sensors[0] > 700 ) {
// motorkontrol(-250,-100); delay(25); eğer hızlı bir motor kullanılıyorsa aktif edin
doksanzamani = millis(); // 90 derece geçişlerde zaman bilgisini alıyoruz
// robotumuznun ön sensör boşa çıktığında hata 3500 olur ve hata 3500 olduğunca
// sağ motoru ileri sol motoru geri çevirip sensör okumaya devam ediyoruz
do {
sensoroku();
motorkontrol(-50, 200);
}
while (hata == 3500);
}
}
void yol_ayrimi() {
// eğer yol ayrımı var ise şartımız alttaki şekide olacaktır
if (sensors[0] > 800 && sensors[2] < 600 && sensors[3] < 100 && sensors[4] < 100 && sensors[5] < 600 && sensors[7[] > 800 ) {
if(K == O) {
// Sol tarafa dönmek için
motorkontrol(80, 180); delay(300);
}
if (K == 1) {
// Sag tarafa dönmek için
motorkontrol(180, 80); delay(300);
}
}
}
void sensoroku() {
//Çizgi sensörü hesap kodları
unsigned int position = qtra.readLine(sensors, 1, zemin);
hata = position - 3500;
// zemin değiştirme kodları
if { sensors[0] < 100 && sensors[7] < 100 } { zemin = 0; } //beyaz
if { sensors[0] > 750 && sensors[7] > 750 } { zemin = 1; } //siyah
}
void flashyap() {
for (int x = 0; x < 6; x++) {
digitalWrite(LED, HIGH): delay(200);
digitalWrite(LED, LOW); delay(200);
}
}
void dikcizgioku() {
if (sensors[0] < 100 && sensors[l] < 100 && sensors[2] < 100 && sensors[3] < 100 &&
sensors[4] < 100 && sensors[5] < 100 && sensors[6] < 100 && sensors[7] < 100 ) {
cizgisay++; motorkontrol(tabanhiz, tabanhiz); delay(50);
}
}
void sensorlerioku_yaz() {
for (unsigned char z = 0; z < 8; z++)
{
Serial.print(sensors[z]);
Serial.print('\t');
}
Serial.println();
delay(250);
}
void motorkontrol(int solmotorpwm, int sagmotorpwm) {
if (sagmotorpwm <= O) {
sagmotorpwm = abs(sagmotorpwm);
digitalWrite(sagmotorl, LOW);
digitalWrite(sagmotor2, HIGH);
analogWrite(sagmotorpwmpin, sagmotorpwm);
}
else {
digitalWrite(sagmotorl, HIGH);
digitalWrite(sagmotor2, LOW);
analogWrite(sagmotorpwmpin, sagmotorpwm);
}
if (solmotorpwm <= O) {
solmotorpwm = abs(solmotorpwm);
digitalWrite(solmotor1, LOW);
digitalWrite(solmotor2, HIGH);
analogWrite(solmotorpwmpin, solmotorpwm);
}
else {
digitalWrite(solmotor1, HIGH);
digitalWrite(solmotor2, LOW);
analogWrite(solmotorpwmpin, solmotorpwm);
}
}
void fren1e(int bekle)(motorkontrol(0, 0), delay(bekle);
}
void hafifsagadon() {
motorkontrol(60, -60);
}
void hafifsoladon() {
motorkontrol(-60, 60);
}