FRC Türkiye Forum!
Encoder ile Robotu Düz İlerletmek - Printable Version

+- FRC Türkiye Forum! (http://forum.frcturkey.com)
+-- Forum: Teknik (http://forum.frcturkey.com/forumdisplay.php?fid=6)
+--- Forum: Programlama/Yazılım (http://forum.frcturkey.com/forumdisplay.php?fid=10)
+---- Forum: Java (http://forum.frcturkey.com/forumdisplay.php?fid=13)
+---- Thread: Encoder ile Robotu Düz İlerletmek (/showthread.php?tid=11876)



Encoder ile Robotu Düz İlerletmek - X-Sharc - 01-11-2019

Merhaba,

Tasarladığımız robotta iki motorunda aynı hızda dönmesini sağlamak istiyoruz. Bunun için encoderlar ile tur sayısını alıyoruz ve joystick kullanımı durduğunda, yani motoru çalıştırmadığımızda bu tur sayısı verisini sıfırlıyoruz. Ayrıca encoderlardan aldığımız veri farkını kullanarak da motoru hızlandırıyoruz, bu sayede robotun düz gitmesini amaçlıyoruz. 

Fakat bunları yaparken karşılaştığımız birkaç problem var. Öncelikle encoderlardan aldığımız veriler bir süre sonra belli bir sayıda (25 civarı) sabit kalıyor. Bu tur sayısı çıktısı olduğundan sürekli artması gerekmekte. Buradaki sıkıntının kaynağını bulmamızda yardımcı olursanız çok seviniriz. Ayrıca hâla motorları hızlandırma konusunda bir algoritmada karar kılmış değiliz, bu amaç için nasıl bir yol izlenebilir?

Kaynak dosyası ekte verilmiş durumda. Yardımcı olursanız çok seviniriz. Smile

package org.usfirst.frc.team6838.robot;


import edu.wpi.first.wpilibj.*;
import edu.wpi.first.wpilibj.drive.DifferentialDrive;
import edu.wpi.first.wpilibj.smartdashboard.SmartDashboard;

public class Robot extends IterativeRobot {
Victor Motor0= new Victor(0);
Victor Motor1= new Victor(1);
DifferentialDrive drive= new DifferentialDrive(Motor0,Motor1);
Joystick stick=new Joystick(0);
double dist =0.5*3.14/1024;
Encoder esit= new Encoder(0,1,true,Encoder.EncodingType.k4X);
Encoder esit1 = new Encoder(2,3,true,Encoder.EncodingType.k4X);
double m0 = esit.get();
double m1 = esit1.get();
double fark = m1 - m0;
double gidilen_mesafe1 = esit.getDistance();
double gidilen_mesafe2 = esit1.getDistance();


public void robotInit() {
esit.setDistancePerPulse(dist);
esit1.setDistancePerPulse(dist);
esit.reset();
esit1.reset();
}

public void autonomousInit() {

}

public void autonomousPeriodic() {

}

public void teleopPeriodic() {
drive.arcadeDrive(stick.getRawAxis(0), stick.getRawAxis(1));

SmartDashboard.putNumber("Tekerlek1", esit.get());
SmartDashboard.putNumber("Tekerlek2", esit1.get());
SmartDashboard.putNumber("Aradaki Fark", fark);
SmartDashboard.putNumber("Mesafe 1", gidilen_mesafe1);
SmartDashboard.putNumber("Mesafe 2", gidilen_mesafe2);


boolean m_stop = esit.getStopped();
boolean m1_stop = esit1.getStopped();
if(m_stop==false && m1_stop==false) {
esit.reset();
esit1.reset();
}
//deneyip 0.5 i daha uygun bir sayıyla değiştirmek lazım
//deneysel, henüz denenmedi
while (fark > 0.5) {
Motor0.set(fark++);
break;

}
}
public void testPeriodic() {
}
}