PID var olan bir problemin çözümünde Oranı, integrali ve Türevi toplayarak bir hata oranı çıkarır ve bunu minimuma indirgemek için bir yol geliştirilir. Daha sonra PID'nin detaylı açıklamasını yaparım. Bu yazıdaki amacım hani hep gördüğünüz virajları çok hızlı dönen çizgi izleyenlerin nasıl yapıldıklarını nacizane göstermek.
Malzemeler:
- Arduino Nano veya UNO
- Pololu QTR 8RC Kızıl ötesi sensör dizisi
- Pololu TB6612FNG Motor Sürücü
- 2 Adet Redüktörlü 6V DC Motor
- 9V Tercihen Duracell Pil (Arduino beslemesi için)
- 11.1V bir Li-Po pil (Motor sürücü için)
Bağlantı Şeması:
Kaynak Kodu:
#include <QTRSensors.h>#define Kp 0 // Kendi deneyimlerinizle bulmanız gerekli küçük bir değer ile başlayıp, büyütebilirsiniz en kararlı Kp değerini bulana kadar..#define Kd 0 // Bunu da küçük bir değerden başlatın ve deneyimleyerek büyütün. ( Not: Kp < Kd)#define rightMaxSpeed 200#define leftMaxSpeed 200#define rightBaseSpeed 150 // robot için kp ve kd değerlerini tutturduysanız şayet motorların dönmesi gereken hız budur#define leftBaseSpeed 150 // yukarıdaki değer ile aynıdır#define NUM_SENSORS 6 // kullanılan sensör numarası siz 8ini de kullanabilirsiniz.#define TIMEOUT 2500 // Sensörlerden başlangıçta kusursuz değerler almak için 2.5 sn. bekle#define EMITTER_PIN 2#define rightMotor1 3#define rightMotor2 4#define rightMotorPWM 5#define leftMotor1 12#define leftMotor2 13#define leftMotorPWM 11#define motorPower 8QTRSensorsRC qtrrc((unsigned char[]) {14,15,16,17,18,19 /*,20,21*/}, NUM_SENSORS, TIMEOUT, EMITTER_PIN);unsigned int sensorValues[NUM_SENSORS];void setup() {pinMode(rightMotor1, OUTPUT);pinMode(rightMotor2, OUTPUT);pinMode(rightMotorPWM, OUTPUT);pinMode(leftMotor1, OUTPUT);pinMode(leftMotor2, OUTPUT);pinMode(leftMotorPWM, OUTPUT);pinMode(motorPower, OUTPUT);int i;for (int i = 0; i < 100; i++) // tercihe bağlı alandır ya robotunuzu hatta yürüterek kalibre edin veya bunu otomatik yapın./* otomatik kalibrasyon için burasının yorumunu kaldırınif ( i < 25 || i >= 75 ) // sensörleri, karşılaşılabilecek en aydınlık ve en karanlık okumalara maruz bırakmak için sola ve sağa çevirin.turn_right();elseturn_left(); */qtrrc.calibrate();delay(20);wait();delay(1000); // Ana döngüye girmeden önce botu konumlandırmak için 1 saniye bekleyin}int lastError = 0;void loop() {unsigned int sensors[6];int position = qtrrc.readLine(sensors);int error = position - 2500;int motorSpeed = Kp * error + Kd * (error - lastError);lastError = error;int rightMotorSpeed = rightBaseSpeed + motorSpeed;int leftMotorSpeed = leftBaseSpeed - motorSpeed;if (rightMotorSpeed > rightMaxSpeed) rightMotorSpeed = rightMaxSpeed;if (leftMotorSpeed > leftMaxSpeed) leftMotorSpeed = leftMaxSpeed;if (rightMotorSpeed < 0) rightMotorSpeed = 0;if (leftMotorSpeed < 0) leftMotorSpeed = 0;{digitalWrite(motorPower, HIGH);digitalWrite(rightMotor1, HIGH);digitalWrite(rightMotor2, LOW);analogWrite(rightMotorPWM, rightMotorSpeed);digitalWrite(motorPower, HIGH);digitalWrite(leftMotor1, HIGH);digitalWrite(leftMotor2, LOW);analogWrite(leftMotorPWM, leftMotorSpeed);}}void wait() {digitalWrite(motorPower, LOW);}{codeBox}
Her türlü soru ve sorununuz için aşağıya yorum bırakabilirsiniz...{alertSuccess}
15 Comments
Turnright turnleft fonksiyonları nerede?
ReplyDeleteHocam kodda direk sağ ve sol yok, sağın soldan daha hızlı veya daha yavaş sürülmesi var.
DeleteHocam kodda direk sağ ve sol yok, sağın soldan daha hızlı veya daha yavaş sürülmesi var.
ReplyDeletePololu QTR 8RC Kızıl ötesi sensör dizisi yerine cny70 kızıl ötesi sensörlerden oluşan el yapmı bir kart kullanırsak aynı kütüphaneyi kullanabilir miyiz ? Ne yapmamız gerekiyor acaba ?
ReplyDeleteKullanabilirsiniz ama kütüphanenin derinlerine inip gerekli optimizasyonları manuel olarak set etmeniz gerekmekte.
Deletekütüphane kullanımı şart mı ? bir de pıd ile kontrol konusunda çok bir bilgim yok nereden detaylı bilgi edinebilirim ilginiz için teşekkür ederim şimdiden sağolun .
DeleteHayır şart değil, el ile de implement edebilirsiniz. PID algoritmasını da buradan anlayabilirsiniz:
Deletehttps://www.csimn.com/CSI_pages/PIDforDummies.html
Teşekkürler
ReplyDeleteTekrardan merhabalar , qtr8a ile 1000 rpm motorlu bir çizgi izleyen robot geliştirdim bu robot yumuşak dönüşleri alırken 90 derecelik dönüşlerde sıkıntı yaşıyor.Ayrıca yavaş bir şekilde sürdüğüm zaman (bunu koddan ayarlıyorum 45 gibi bir değerden bahsediyorum ) 90 derecelik dönüşleri biraz zorla da olsa alabiliyor .Sizce sıkıntı kp kd değerlerinde midir ? Ne tarz kp kd değerleri atamalıyım acaba ?
ReplyDeleteŞimdiden teşekkür ederim .
Merhabalar. Hocam bende bir haftadır bu konuda çalışıyorum. İnternetteki neredeyse tüm kodlar QTR8RC ye göre yazılmış. Bende Analog 8A kullanmaya çalışıyorum ama kod optimizasyonunu yapamadım bir türlü. Sizden örnek kodları talep edebilir miyim ?
DeleteMerhaba, çalışma güzel olmuş ama birkaç sorum olacak. kp ve kd nedir? açılımları nedir ve neye göre bulacağız? neden positiondan 2500 çıkarıyoruz?
ReplyDelete18. satırda 'QTRSensorsRC' does not name a type diye bir hata alıyorum çözümünü bilen var mı
ReplyDeleteAYNI SORUN BENDE DE BULUNMAKTA SORUNUN ÇÖZÜMÜNÜ BİLEN ARKADAŞ YAZARSA ÇOK MÜTEŞEKKİR KALIRIM.
ReplyDelete18. satırda 'QTRSensorsRC' does not name a type diye bir hata alıyorum çözümünü bilen var mı
ReplyDelete'QTRSensorsRC' does not name a type hata alıyorum çözümü bulan var mı?
ReplyDeleteKonuyla ilgili yorum giriniz.