1
00:00:00,00 --> 00:00:14,700
Evet herkese merhaba. Önceki bölümde drivebase 
sınıfını yapmıştık motorları ve hız kontrol 
devrelerini ayarlamıştık

2
00:00:14,800 --> 00:00:19,600
Aynı zamanda numaralandırmalar için RobotMap'i 
hazırlamıştık.

3
00:00:19,700 --> 00:00:32,100
Ama henüz joysticklerimizden değer almaya 
aldığımız değerle drivebase'imize komut vermeye 
başlamamıştık bu bölümde ise nasıl yapacağımızdan 
bahsedeceğiz.

4
00:00:32,200 --> 00:00:41,200
Burda yapmamız gereken iki temel aşama var. 
Birincisi joysticklerden giriş almak ve ikincisi 
ise motorlarımıza güç vermek

5
00:00:41,300 --> 00:01:02,500
İlk yapacağımız şey OI adlı dosyaya gitmek. 
Bu dosya tüm veri giriş çıkışlarınızın yer 
alacağı dosyadır

6
00:01:02,600 --> 00:01:31,000
Bir joystick tanımlamak için ise public final 
Joystick left_Joy = new Joystick(); yazmanız 
gerekir

7
00:01:31,100 --> 00:01:35,900
Ancak parantezin içindeki bağlı olduğu portu 
yazarken tekrardan RobotMap e gidip joystickimizin 
bağlı olduğu portu tanımlayacağız

8
00:01:36,000 --> 00:02:31,200
Joystickin numarasını önceki numaradan sonra 
virgül koyarak tanımlıyoruz. Tanımlamalarınızın 
daha iyi gözükmesi için aralarına yorum ekleyebilirsiniz.

9
00:02:31,300 --> 00:02:36,100
Tanımlamalarınızı sınıflandırırken PWM ve 
CAN olarak da sınıflandırmaya çalışın ikisi 
birbirinden tamamen farklı sistemler olduğu 
için karıştırmak sıkıntı çıkarır.

10
00:02:36,200 --> 00:03:10,500
RobotMap'de tanımladıktan sonra OI dosyasına 
geri dönebiliriz. Ve parantezin içini robotmap 
den değeri alarak doldurabiliriz. Aynısını 
kopyalayıp sağ joystick için de yapıyoruz

11
00:03:10,600 --> 00:03:39,200
Eğer joystickleriniz eskiyse joysticklerinizde 
Deadzone adı verilen bir alan bulunabilir 
bu alan joystiği tutmasanız bile motorlara 
güç verilmesine neden olur.

12
00:03:39,300 --> 00:03:55,000
Bu soruna karşı bize yardımcı olması için 
ise public static final double JOY_DEADZONE 
adlı bir ölü alan tanımlayacağız

13
00:03:55,100 --> 00:04:17,700
Bu sayede ise eğer joystick değerleri bu 
değeri geçmiyorsa motorlara güç verilmeyecek. 
Şimdi 0.05 değerini kullanabiliriz

14
00:04:26,500 --> 00:04:33,700
Bunu sağlayabilmek için ise bazı metodları 
kullanmamız gerekecek.  İlk metodumuz sol 
joystickin X ekseninde değerini almak için 
olacak buna göre bir metod adı tanımlayın

15
00:04:33,800 --> 00:05:48,900
Bu metodun içine ise bir değişkene sol joystickten 
aldığımız değeri tanımlıyoruz. Ve ekranda 
gördüğüüz şekidle mevcut değerle ölü alanı 
karşılaştırıp kesin bir sonuç elde edeceğimiz 
kodu yazıyoruz.

16
00:05:49,000 --> 00:06:17,300
Ve yazdığınızı kopyalayıp diğer joystickler 
ve eksenler için yapabilirsiniz.

17
00:06:17,400 --> 00:06:22,200
Eğer farklı joysticklerde farklı ölü alanlarınız 
bulunuyorsa onlara özel bir şekilde yapmanızı 
öneririm burda yazılan değerler bizim joysticklerimize 
özel.

18
00:06:25,200 --> 00:06:54,300
Ayrıca sonraki adımlar için bir OI fonksiyonu 
oluşturmanız sizin adınıza çok yardımcı olacaktır.

19
00:06:54,400 --> 00:07:21,600
Şimdi komutlar paketinin altında yeni bir 
sınıf oluşturuyoruz ve adını TankDrive koyuyoruz. 
Ve superclass kısmından command'i seçiyoruz

20
00:07:21,700 --> 00:07:49,100
Bir komut dosyasının doğru bir komut dosyası 
olması için ilk önce komutunuz için bir fonksiyon 
oluşturmanız gerekir.

21
00:07:49,200 --> 00:08:18,300
Daha sonra bir tane protected void initialize 
fonksiyonu oluşturuyoruz. Burada bilmeniz 
gereken temel şey bu kodun superclass'ından 
miras aldığıdır.

22
00:08:18,400 --> 00:08:23,200
Komutu çalıştıracak olan protected void execute 
metodunu ekliyoruz.

23
00:08:23,300 --> 00:08:40,300
Aslında ihtiyacımız olmayacak ama bazı durumlarda 
işimize yarayabilecek bir metod olan interrupted 
i de ekliyoruz.

24
00:08:40,400 --> 00:09:00,600
Buradaki initialize metodu komut çalıştırıldığında 
ilk çalışacak metoddur ve sadece bir kere 
çalışır. Tank drive metodu asıl robotu sürmemizi 
sağlayacak metoddur ve komutu çalıştırdığımızda 
çalışmaya başlar

25
00:09:00,700 --> 00:09:11,300
Execute metodu ise komut çalışırken periyodik 
olarak çalışır. IsFinished ise komut bitirildiğinde 
çalışacak koddur.

26
00:09:11,400 --> 00:09:39,000
Interrupted ise eğer başka bir komut aynı 
alt sisteme ihtiyaç duyuyorsa bu ikilemde 
ne yapılcağının belirlendiği fonksiyondur

27
00:09:39,100 --> 00:09:43,900
Şimdi ise yapmamız gereken birkaç şey var. 
Öncelikle bu komuda hangi alt sistemleri 
kullanacağımızı belirtmemiz gerekiyor.

28
00:09:44,000 --> 00:09:54,800
Daha sonra ise yazdığımız metodlara neler 
yapmaları gerektiğini belirtmemiz gerekiyor.

29
00:09:54,900 --> 00:10:33,000
Bizim bu komutta drivebase alt sistemini 
kullanmamız gerekiyor bunun için ise tankdrive 
fonksiyonunun içine requires yazıp ihtiyacımız 
olan alt sistemi yazıyoruz.

30
00:10:33,100 --> 00:10:53,900
Komutlar genellikle referanslara ihtiyaç 
duydukları için robot dosyamızda bir yerde 
drivebase imizin bir instance olarak belirlenmesi 
gerekir.

31
00:10:54,000 --> 00:11:17,500
Ve bunu yapmak için de Robot.java dosyanıza 
girmelisiniz. Ve buraya public static Drivebase 
drivebase yazarak tanımlamalısınız.

32
00:11:17,600 --> 00:11:30,600
Robot Init kısmında drivebase = new Drivebase 
olarak tanımlamalısnız.

33
00:11:30,700 --> 00:12:00,600
Basit olarak bu komutun yapmasını istediğimiz 
joystick girişlerine göre motorlara çıkış 
vermesini sağlamak

34
00:12:00,700 --> 00:12:06,700
Çoğu fonksiyonu tamamladıktan sonra yapmamız 
gereken komut dosyasına gelip execute kısmına

35
00:12:06,800 --> 00:12:45,600
Robot.drivebase.setRaw(Robot.oi.getLeftJoyY,Robot.oi.getRightJoyY) 
yazdıktan sonra bu kod robotumuzu sürebilmemizi 
sağlayacaktır.

36
00:12:45,700 --> 00:12:50,500
Bu yaptıklarımıza ek olarak bir şey eklemek 
istiyorum bu işimize yarayacaktır.

37
00:12:50,600 --> 00:13:11,900
Çoğu joystickte bir gaz ayarlama slider'ı 
bulunacaktır. Her zaman tüm güçte gitmek 
istemiyorsak bu slider işimize yarayabilir.

38
00:13:12,000 --> 00:13:42,700
Komut dosyamıza geliyoruz ve double throttle 
= LEFT_JOY.getThorttle(); olmak üzere bir 
değişken tanımlıyoruz.

39
00:13:42,800 --> 00:14:12,700
Bu satırı ekledikten sonra ise önceden yazmış 
olduğumuz satırdaki değerleri thorttle değerleri 
ile çarpıyoruz ve işte bu kadar.

40
00:14:12,800 --> 00:14:35,700
Ancak bu değerler her zaman istediğimiz gibi 
olmayabilir bu sorunu çözmek için ise thorttle 
değerini tanımladığımız satıra yazılanları 
ekliyoruz.

41
00:14:35,800 --> 00:14:56,800
Bu kodun bize sağladığı şey ise örnmeğin 
tam güçte iken 1 değerini yarımda iken 0.5 
değeri gibi kesin ve oransal değerler almamızı 
sağlıyor

42
00:14:56,900 --> 00:15:12,100
Evet şu an tamamen çalışan bir tank drive 
robotumuz var ancak şimdi göstereceğim şey 
farklı alt sistemler ekleyecekseniz ve farklı 
tanımlamalar yapacaksanız önemli.

43
00:15:46,000 --> 00:15:56,500
Şu an aslında önemli bir şeyi kaçırıyoruz. 
Bu komut robot tarafından hiçbir şekilde 
çalıştırılmıyor bu komutun çalıştırılmasını 
da sağlamamız gerekli

44
00:15:56,600 --> 00:16:01,400
Drivebase dosyamıza gidiyoruz ve en alttaki 
fonksiyon olan initDefaultCommand'e dikkat 
ediyoruz.

45
00:16:01,500 --> 00:16:47,800
Bu fonksiyonun içine setDefaultCommand(new 
TankDrive); yazıp tank drive komutunu importluyoruz. 
Ve artık sonunda etrafta iki joystick ile 
sürebileceğiniz robotun kodu hazır.

46
00:16:47,900 --> 00:16:52,700
Sonraki bölümlerde biraz daha karmaşık olan 
CAN kullanımına ve bazı sensörlerin kullanımına 
çalışacağız.

47
00:16:52,800 --> 00:17:09,500
Şu anda kullandığımız motor kontrolörleri 
PWM olduğu için şu anlık CAN kullanmaya ihtiyaç 
duymuyoruz ancak TalonSRX gibi devreler kullanacağımızda 
CAN kullanacağız.

48
00:17:09,600 --> 00:17:13,000
İzlediğiniz için çok teşekkür ederiz artık 
temel olarak bir robotu programlamayı biliyorsunuz.

