İçeriğe geç

Quadcopter projem ve tecrübeler…

Bu yazıda, 2013 yılının sonlarına doğru, sıfırdan yapmaya çalıştığım deneme amaçlı bir quadcopter projesini paylaşmak istiyorum. Yazı biraz uzun oldu, zira hem bir hatıra hem de quadcopter ya da drone yapımı için, kaynak arayanlara bir yol haritası olsun istedim. Çok fazla teknik detaya inmeden edindiğim tecrübeleri anlatmaya çalışacağım. Bu yazıyı 4 sene sonra yazdığım için görsel ve bilgi paylaşımı biraz derleme olabilir. Bu arada modelcilik hobisinde profesyonel olan arkadaşların, ilk zamanlarda yaşadıkları heyecanlı arayışı da yansıtabildiğimi umuyorum. Yazılan kodlar, profesyonel olarak kullanılan algoritmalara göre eksik, hatta yanlış da olabilir. Bu projedeki amaç, arkadaki mantığı anlamak idi. Şahsen yaptığım aracın havalandığını gördükten sonra bu sevinç bana yetmişti. Daha sonra geliştirme yapmadım.

Bu quadcopter projesi adına, yazılan Arduino kodlarını, ilgilenenler buradan indirebilirler. Dileyen alıp istediği gibi kullanabilir. Baştan belirtmekte fayda var, IDE olarak “Atmel Studio” kullanıldı. Yazılan kodlar C dilinde.

Bir de genel bir özet geçmek gerekirse, sırasıyla motor, esc, lipo, konnektör tipleri, pervane ve gövde şeklinde, genel mekanik aksamdan bahsedilmiştir. Daha sonra yavaş yavaş kodlamaya ve uygulanan algoritmaya değinilmiştir.

Arduino dünyasını keşfettikten sonra ilk projem, android telefon üzerinden bluetooth kontrollü araba yapmak olmuştu. İkinci aşamada ise çıtayı biraz yükselterek, uçan bir şey yapmak istedim. O sıralar popüler olmaya başlayan quadcopter yapımı ile ilgili İnternet üzerinden gördüğüm bir kaç videodan sonra aklımda deli sorular oluşmaya başlamıştı.

Belki bilmeyenler olabilir diye quadcopter nedir sorusunu cevaplarsak, artık daha çok drone diye anılsalar da, quad kelimesi ile anlatılan 4 sayısıdır. Ve basit olarak 4 pervanesi ile helikopter tarzı hareket kabiliyetine sahip uçabilen bir araçtır.

Hemen ilk yaptığım versiyonu göstermek istiyorum, ve ekliyorum: aşağıda anlatılanlardan belki de daha önemli olan şey uçan cihazlarda jumper ve breadboard ikilisi kullanmamak gerekiyor, malum quadcopter zangır zangır titrerken kablolar yerinde durmuyor 🙂 🙂 🙂

İlk soru: motor türü nedir ve yerel olarak bulabilir miyim?

Hemen araştırmalara başladım. Aklımdaki ilk soru ise itme gücünü sağlayacak motorlar üzerineydi. Genelde uzaktan kumandalı arabalarda görmeye alıştığımız motor tipi fırçalı tip motordur. Dönen kısmı, yani şaftı, orta kısımda bulunur ve merkeze yerleştirilen bir mil döner. Ama burada durum farklı. İlk öğrendiğim şey,  eğer quadcopter yapmaya çalışıyorsak bunların işimizi görmeyeceği idi. Bir quadcopter uçurmak için, bize yüksek verimli ve yüksek tork değerlerine sahip bir motor lazım. Dolayısı ile BLDC kısaltması ile anılan “Brushless DC” tipi motorlar kullanmak gerekiyormuş. Ve bir de bu tip motorları kullanırken, ESC denilen “electronic speed controller” diye anılan bir sürücüye ihtiyacımız varmış. Tamam bunlar cepte. Peki nereden temin edecektim? Genelde insanlar Hobbyking, ebay, dx, aliexpress, bangood vs. gibi siteleri kullanıyordu. Bunların özelliği Hong Kong ya da Çin merkezli olmaları, ürün çeşidinin ve muadillerinin çok olması ve ücretsiz olarak dünya üzerinde hemen hemen her yere kargo yollaması. Ama ücretsiz kargo istiyorsanız da beklemeniz gerekiyor, bazen teslimat süresi 1 ayı bulabiliyor.

Bir kaç forum, site ve sosyal medya grubu araştırması sonucu, yerel olarak temin edebilir miyim diye düşünmeye başladım. Aradığım mağazayı sonunda buldum.

Art Tech C2830-21

Motor ve ESC

Modelcilik üzerine bir bilgim olmadığı için, planım satıcıya ne yapmak istediğimi söylemek ve önerilerine uymaktı. O sıralar Tekirdağ / Çorlu’da, Türk hava kurumunun modelcilik üzerine satış yapan bir dükkanı vardı. Satıcı “cessna” tipi motor ve “EMAX” marka ESC verdi. Her ne kadar quadcopter için alsam da Cessna ismi sanırım aldığım motorun bu ucak modelinde kullanılmasından geliyordu. Aldığım motor “Art Tech C2830-21” model bir motordu, satıcının önerdiği esc sürücüsü ise Emax marka 18A lik bir cihazdı. Ben tabii hemen meraktan neden diye araştırmaya başladım. Motorun datasheet dokümanını buldum. Burada “maximum current” diye belirtilen kısımda 15A yazıyordu, o halde satıcı 18A’lik ESC bunun üzerinde olduğu için bana tavsiye etti diye düşündüm.

Art Tech Brushless Motor model: C2830-21 Datasheet

Dimensions (mm) Ø30×28 Maximum sustained current (A) 15
Shaft diameter (mm) 3 No load current (A) 1.5
Weight (g/oz) 48/1.7 Internal resistance () 124
Output Power (W) 80 Thrust (oz) 14/16
No load KV (rpm/V) 1500 Suitable propeller 8060/1047
Batteries 2 cell Li-Po Use for model Coota

Datasheet dokümanından aldığım bilgileri incelerken diğer farkettiğim şey de “thrust” yazan kısım oldu. Sonuçta bu alet uçacaksa bir kaldırma gücüne ihtiyacı vardı. İnternet üzerinde motorlar ile farklı ölçülerde pervane kullanımına göre farklı itme güçleri olduğunu öğrenmiştim. Datasheet tablosunda da thrust kısmında iki değer gözüküyor “14/16 oz” diye, bu iki değerin alt kısımda “Suitable propeller” yani uygun pervane kısmındaki alternatiflere göre yazıldığını anladım. 8060 pervane ile 14 oz, 1047 ile 16 oz kadar itme sağlıyormuş. “Oz” dediğimiz birim ise “ounce / ons” diye geçer ve bir kütle birimidir. Biz mesela gram kullanıyoruz, çevrim yaparsak 1 oz yaklaşık 28,3 gram yapıyor.

Bir de bu tip motorlarda “kv” denen bir değer var. O da uygulanan voltaj başına “rpm” cinsinden ne kadar hızlı döndüğünü ifade ediyormuş. RPM terimi “revolutions per minute” yani dakikada kaç tur atıldığı demek. Örnek tabloda motorumuz için 1500 değeri verilmiş. Teknik detayları çok daha derin olsa da kabaca motorumuza, mesela yine tabloda önerilen “2 cell Li-Po” yani ortalama 7,4 volt seviyesinde bir güç bağlarsak, 1500 çarpı 7,4 aşağı yukarı 11000 rpm yapar. Çok hızlı değil mi? Tabii bu kv değeri, bağlayacağımız pervanenin cinsi ve motorun mekanik dayanımı gibi parametreler bir biri ile ilişkili imiş. Örnek olarak adi bir plastikten yapılmış bir pervane bu hız seviyelerini kaldıramayarak deformasyona uğrayabilir ve sonuç olarak quadcopter uçmayabilir.

Neden satın aldığım fırçasız DC motor 3 kablolu?

Bir diğer araştırma yapmam gereken konu ise, neden bir motorun isminde DC, yani “direct current” ibaresi olup da 3 adet kablo bağlantısı gerektirmesiydi. Bildiğimiz DC motorların iki kablosu olur, DC güç kaynağının ya da basitçe bir pilin pozitif ve negatif uçlarını bu kablolara bağladığımız zaman bir yöne döner, bağlantı sırasını değiştirince de diğer yöne döner. Peki bu BLDC denen fırçasız motorlardaki 3 kablonun sırrı neydi?

İşin sırrı faz kavramında… 3 kablo aslında 3 faza denk geliyormuş. Art arda bu kablolar vasıtasıyla motorun ilgili fazı uyarılarak dönme sağlanıyor. ESC bu faz değişimlerini sağlarken kendisi de dışarıdan DC güç alıyor, yani artı ve eksi. Buna ek olarak da bir kontrol bağlantısı mevcut.

IMG_3135 (2)
EMAX 18A ESC

Fotoğrafta görüldüğü üzere sol taraftaki kalın kırmızı ve siyah kablolar ile DC güç beslemesi yapılıyor. İnce 3 kablolu soket ise kontrol soketi. Daha öncede servo motorlar ile uğraşmış olanlar bilirler. Bunlar bir nevi servo bağlantısı ve motorun hızı servo kontrolü mantığı ile yapılıyor. 5 volt, GND ve kontrol sinyali bağlantısı yapılıyor. 5V (Kırmızı kablo) ve GND (ground – siyah kablo) kısımlarını pilin + ve – ucu gibi düşünebiliriz. Ancak burada 5V dışarıya voltaj vermek için. Mesela uzaktan kumanda sisteminin alıcısı, direk olarak ESC ye bağlanacak ise alıcıya güç vermek için kullanılabilir. Sinyal kablosunu ise (beyaz kablo) üzerindeki voltajın belli aralıklarda değişen bir kablo olduğunu, voltaj değişiminin ise bir grafik ile ifade edilebildiğini anlamak gerekiyor. Kablo renkleri genel olarak siyah, kırmızı ve beyaz olmakla birlikte ufak farklılıklar olabilir. Mesela GND için siyah yerine kahverengi kullanılabilir. Aldığımız ESC’nin datasheet dokümanını incelemekte fayda var.

Bir diğer öğrendiğim ufak bilgi de, resimde sağ tarafta motora giden 3 adet mavi kablodan her hangi ikisinin motor kabloları ile olan bağlantı sırasının değiştirilmesi, dönme yönünü tersine çeviriyormuş.

RC tipi PWM Kontrolü

ESC için vermemiz gereken sinyali biraz daha inceleyelim. RC tipi servo mantığı ile çalışan sistemde, PWM denen bir kontrol tekniği var. Bu teknikte kontrol sinyali 20 milisaniye aralıklarda ya da periyotlarda değişim gösteriyor. RC tipinden kastım uzaktan kumanda ile modelcilik yapılan dünyadan bahsediyorum, zira RC “remote control” yani “uzaktan kumanda” anlamına gelmektedir. Genel olarak ifade edersek, 20 milisaniye içinde kontrol kablosu üzerindeki voltaj 1 milisaniye ile 2 milisaniye arasında 5 volt seviyesinde tutuluyor. 1 milisaniye en düşük, 2 milisaniye ise en yüksek değer olarak düşünebiliriz. Geriye kalan süre boyunca 0 volt seviyesinde olan sinyalimizin yaklaşık 1,5 milisaniye kadar “ON” konumunda (5 volt seviyesinde) tutulması da orta değer anlamına geliyor. Bu sınır değerler biraz değişebilir. Mesela aralık 1 – 2 mili saniye değil de 0,9 – 2,1 mili saniye olabilir. Teknik olarak yapılması gereken, ESC datsheet dokümanının incelenmesi ve forumlarda kullandığınız marka model ESC ile diğer insanların tecrübelerinin araştırılması olmalı. Hatta elimizde RC alıcı verici seti ve bir de osiloskop varsa tadından yenmez. Kumanda üzerindeki joystikleri hareket ettirdikçe alıcı üzerinden gelen sinyali incelemek gerek.

 

RC PWM kontolü

 

Bir de bu düşük, yüksek ve orta değer ne demek onu açıklamak gerekiyor. Aslında ne ile etkileşimde olduğunuza göre değişebilir. Bir servo motor sürüyorsak en düşük değer 0 açısını kastedebilir,  orta 90 dereceyi ve en yüksek ise 180 derece dönmeyi ifade edebilir. Quadcopter sürmek için kullanacağımız ESC’lerde ise gaz anlamına geliyor. Yani en yüksek değer “full throttle” diye tabir edilen “tam gaz” anlamına geliyor. Sinyalin ON durumda olduğu süre azaldıkça motorların hızı azalıyor.

IMG_3134 (2)
ESC ve Motor bağlantısı

Li-Po kullanımı

ESC nin kontrol sinyalini ve motor bağlantılarını öğrendik. Şimdi de bir batarya bağlamamız gerekiyor. Yapacağımız alet uçacağı için bize doğal olarak bir pil lazım. Kalın kablolara, polariteye dikkat ederek bir pil bağlamamız gerekiyor. Yani ESC üzerinde + işareti olan kabloya pilin + ucu bağlanmalı, – ucuna ise pilin – ucu bağlanmalı. Peki nasıl bir pil kullanmalıyız.

İşte burada “lithium polymer” kısaca li-po” denen pilleri öğrendim. Temel özellikleri yüksek kapasitede güç saklayabilmesi, hücrelerden oluşması, yüksek akım sağlayabilmesi. Ve tabii ki de şarj edilebiliyorlar. Lipo pillerin olumsuz şartlar altında patlayabildiğini de öğrendim. Mesela aşırı kullanım ile fazla deşarj olmaları ya da mekanik darbe sonucu hasar görmeleri bu olumsuz etkenler arasında olabilir. Bu yüzden LiPo saklama çantaları satılıyor. Ben hurdalıktan bir metal kutu bulmuştum onun içinde sakladım pillerimi.

Lipo için Cell kavramı

LiPo pillerde “cell” denilen bir kavram var, yani hücre sayısı. Mesela 3-Cell LiPo denilince 11,1 Volt anlaşılıyor. Nedeni her bir hücrenin 3,7 volt değerinde olması, 3 tanesi 11,1 Volt yapıyor. Aynı mantıkla 2-Cell LiPo ise 7,4 Volt değerinde. Sanırım en çok kullanılan 2 ve 3 hücreli piller. Ancak tek hücreli ya da daha çok hücresi olanlar da bulunmaktadır.

Mesela aşağıdaki resimde kalın ve siyah kalın kablolar güç aktarımı için, ince kablolar ise şarj ve LiPo Watch bağlantısı için kullanılıyor. Her bir hücre diğerine seri bağlanmış durumda. Volt metrenin siyah kablosunu en alttaki siyah kabloya, volt metrenin kırmızı kablosunu bir üstteki siyah kabloya tutarsak, normal dolulukta olan pilde 3,7 Volt okuruz. Volt metrenin siyah kablosu aynı yerde kalmak şartıyla, volt metrenin kırmızı kablosunu bir sonraki kabloya kaydırıp ölçüme bakarsak 3,7 Volt aralıklarla sonuç yükselecektir. Pil üzerindeki kalın kırmızı ve siyah kablolar ise direk olarak tüm hücrelerin sahip olduğu voltaj değerlerinin toplamına eşit bir voltaj verir.

11,1V LiPo

LiPo C değeri

LiPo pillerde diğer kavramlar ise C değeri, ingilizce “capacity” kelimesinin baş harfi ve “mah” değeri. İkincisinden başlarsak “mah” değeri, diyelimki 1000 mah olsun. Buradaki “h” saat demektir, ingilizce “hour” kelimesinin kısaltması. Diğer ibare “ma” ise miliamper kısaltmasıdır. Eğer ben 1000 mah değerindeki pilden 500 miliamper akım çekersem, bu pil bana 2 saat dayanabilir. Yani çekilen akımın miliamper cinsinden değeri ile maksimum kullanım süresinin çarpımı demek oluyor. 100 miliamper çekersem de 10 saat kullanabilirim

C değeri ise LiPo pillerde şarj için, sürekli kullanım için ve ani akım sıçramaları için çeşitli değerlerde belirtilebilir. Resimdeki pil işaret silinmiş olsa da sanırım 25C lik bir pildi.  Güvenli ve sürekli bir şekilde çekebileceğim akım değerini bulmak için mah değerini 1000’e bölüyorum yani amper-saat cinsine çeviriyorum. Daha sonra bana verilen sürekli çalışma için C değeri ile çarpıyorum Yukarıdaki resime dönersek 5200 mah değerini 5,2 şeklinde ifade ediyorum. Sonra 5,2 çarpı 25 işlemini yapıyorum. Sonuç 130 amper gibi devasa bir değer çıkıyor. Yine örnek olarak 100 amper sürekli akım çekersem benim pilim 5,2 amper-saat bölü 100 yani 0,052 saat dayanabilecektir. Dakika cinsinden 3,12 dakika…

Yazının başında Art Tech C2830-21 model bir motor için, datasheet dokümanında maksimum çektiği akım 15 amper verilmiş. Biz bunlardan 4 adet kullanacağız. Dolayısı ile eğer tam gaz verilirse toplamda 60 amper demek. Anlatmak istediğim motorlar gerçekten yüksek akım çekecekler. Dolayısı ile uygun ve sağlam pervane seçimi, hafiflik, yüksek verimli motorlar gibi etmenler uzun uçuş süresi için kritik önemde.

LiPo doluluk seviyeleri

Pillerdeki hücreleri sağlıklı tutmak için voltaj seviyelerine dikkat etmemiz gerekiyor. Tam şarj olunca her bir hücre 4,2 volt seviyelerine kadar çıkabiliyor. Uzun dönem saklama yapılacak ise 3,8 volt değerine getirip öyle depolamamız gerekiyor. Kullanım sırasında da 3 Volt değerinden aşağıya düşmemesi için özen göstermeliyiz.

Kaç C ile şarj etmeniz gerektiği, sabit çekilen akım, ani akım değerleri datasheet dokümanından ya da üreticinin sitesinden bakılmalıdır. Genelde bu değerler pilin üstünde de yazar ama bazen aldığınız pillerin üstüne işaretleme CD kalemi ile yapılıyor ve bu da zamanla silinebilir.

LiPo Watch

Saklama dışında dikkat edilmesi gereken pilin kullanım sırasındaki voltaj durumunu gözetlemek. Sanırım bu yüzden satıcı bana “LiPo Voltage Watch” şeklinde geçen cihazı verdi. Tek amacı kullanım sırasında pilin voltajını kontrol etmek. Gerçi belli bir değerin altına düştüğü zaman sesli uyarı veren tipi de varmış sonradan öğrendim. Çünkü quadcopter havada uçarken sürekli yere indirip voltaj seviyesine bakamayız, keyfi kaçar 🙂

 

LiPo Watch

Malzemeler

Quadcopter maceramda satıcıya danışarak, tamamen test amaçlı olarak topladığım ilk malzemelerimin tam listesi aşağıdaki gibiydi, hatta ilk fişimi hala saklarım resmini görebilirsiniz.

  • 11,1V 2250 25C Lipo Pil
  • 3,175 Alüminyum obak
  • KDS marka lipo şarj aleti
  • 7×5 ölçülerinde bir pervane
  • Emax 18A ESC BEC
  • Soket 50 A 3,5 mm
  • T konnektör
  • 80W Art Tech C2830-21 fırçasız motor
  • LIPO Volt Watch

IMG_3153 (2)

Motor, ESC, LiPo ve LiPo Watch dışındaki diğer malzemeler hakkında da bir kaç şey yazmak gerek.

Soketler

Motoru aldığım zaman 3 adet kablo ucu ve yanında lehim yapılmamış soketlerden olduğunu farkettim. Nedeninin ise kimi insanların bu uçlara soket takıp ESC ye monte etmektense, direk olarak ESC ve motor kablolarını birbirine lehimlemeyi tercih etmeleri olduğunu öğrendim. Aşağıda soketlerin resimlerini görebilirsiniz. Bazen lehim yerinden kırılmalar olduğu için zaman içinde bol bol almışım.

İngilizce terim olarak “bullet connector” diye geçmektedir. Bağlantı yerinin çapına göre 2 mm, 3,5 mm, 4 mm gibi değişik ölçüleri vardır. Sanırım en yaygın olanı 3,5 mm olan boy. Benim aldıklarım da bu ölçüde. Mutlaka hangi ölçüyü seçmek gerektiğine dair teknik bir bakış açısı vardır. Bir sebebi soketlerin kaldırabildikleri maksimum akım olabilir. Bu konuyu hiç araştırmadım. Karşılıklı oldukları için erkek-dişi set halinde almak mantıklı olur. Bir de lehimden sonra, elektrik izolasyonu yapmak için ısıyla daralan makaronlardan kullanmalıyız.

Bullet Connector

T konnektör

T konnektör denen malzeme ise pil ucundaki bağlantının adı. Bazı yerlerde “Deans” diye geçiyor. Şekil olarak T ye benzediği için böyle deniyor olabilir. Zaman içinde daha başka bir çok çeşidi olduğunu öğrendim. Sonraları alternatif olarak “XT60” denen bir başka versiyonunu kullandım.  Bu soketlerin amacı sadece bir yönde bağlantı yapmanıza izin vermesi, yani eğer lehimleme doğru yapılmış ise + uç yerine – uç gelecek şekilde bağlayamazsınız.

T Konnektör

Genel olarak bu şekilde herhangi bir malzeme üzerinde sadece tek geçişe izin veren tasarımlara da “fail proof” (hatalara karşı korumalı) ya da daha kabaca “fool proof” (aptallara karşı korumalı) deniyormuş 🙂 Kaç ampere dayanıklı oldukları bilgisi ise sanırım T konnektör için 30 amper, XT60 versiyonu için 60 amperdi.

XT60 Konnektör

LiPo Şarj

LiPo kullanmamızın bir nedeni de şarj olabilmeleri. Dolayısı ile bir şarj aletine ihtiyacımız olduğu aşikar. Benim aldığım KDS marka. Bu cihazlar pil hücrelerini dengeli bir şekilde şarj ediyor. Dengeliden kasıt, tüm hücrelerin voltaj seviyelerini eşit hale getiriyor, yani tam şarjda 4,2 volt civarı.

Kullanımı basit, eğer pil hücrelerinde bir problem varsa kırmızı ışık hızlı hızlı yanıp sönüyor, şarj olurken yeşil ışık yanıp sönüyor, şarj olduğunda ise yeşil ışık sabit yanıyor. Bir de hem 2 hücreli yani 7,4 voltluk lipo hem de 3 hücreli pil şarjı için kullanılabiliyor.

LiPo Şarj Aleti

Pervaneler

İlk aldığım pervaneler zaman içinde hasar gördüğü için buraya resmini koyamıyorum, ama gri renkli olduklarını hatırlıyorum. Bildiğiniz pervane, ama bana verilen ölçülerin ne anlama geldiğini araştırmam gerekiyordu. Mesela 7×5 pervane demek yanlış hatırlamıyorsam 7 inç pervane çapı demekti, ikinci çarpan olan 5 rakamı ise biraz daha karışık. Ama bir benzetme anlamamıza yardım edebilir, vida adımını düşünün. Vida adımı bir tur dönme sonucu vidanın ne kadar ilerleyeceğini söyler. Pervanedeki bu ikinci çarpan da motor şaftına bağlı olan pervanenin bir tur dönmesi ile ne kadar yer değiştirme yapacağının bir ölçüsü. Bu sayı büyük olursa her bir dönüşte daha çok ilerleme oluyormuş, ama bir o kadar da motora yük binmesi demek.

Karbon fiber ve plastik pervane

Pervanelerin içinden motor miline sıkı otursun diye ortalama halkaları çıkıyor. Bunlara şaft adaptörü dendiğini gördüm. Amacı pervane ortasındaki deliği kullanarak istediğimiz motor şaftına göre ayarlamak.

Şaft adaptörü

Pervane yönü

Bir de quadcopter yapımında 4 pervanenin ikisi bir yöne dönerken, diğer ikisi ters yönde dönecek şekilde olmalıymış. Nedeni ise motorun dönmesinden dolayı, quadcopter aracının merkezinde oluşan ters yönlü tork kuvvetlerinin nötrlenmesi için. Eğer hepsi aynı yöne dönse idi, araç gövdesi sabit durmayacaktı, kendi ekseni etrafında dönecekti. Ters pervaneler yardımı ile iki motor saat yönünde dönerken, diğer ikisi saatin ters yönünde dönecek şekilde ESC bağlantısı yapılabilir. Böylelikle gövde sabit kalacaktır.

2xCW 2xCCW

Pervane Balansı

Pervanelerde bir diğer etken balans ayarı. Eğer pervane kanatları üzerinde ağırlık dağılımı homojen değilse, yüksek hızlarda titreşim oluyor. Titreşim de hem mekanik olarak motor yataklarını hem de kullanacağımız akselerometre üzerindeki okumaları kötü etkiliyor. Balans deyince karmaşık şeyler aklımıza gelmesin, ben elektrik bandı kullanarak yapmıştım. Ayar yaparken terazi gibi kanadın iki kolunu birbirine göre tartıyoruz. Hafif gelen tarafa ufak bant parçaları yapıştırıyoruz. Yaptığım düzenekte karşılıklı mıknatıslar arasında dengede duran metal çubuk, aslında dizel motorlarda enjektör iğnesini olarak kullanılıyormuş, bu parçayı bir arkadaşım tavsiyesi ile edindim ve çok işime yaradı. Enjektör iğnesinin ucu çok sivri ve malzemesi manyetik, böylelikle mıknatıslar yardımı ile havada yatay durabiliyor ve pervaneyi çevirirken sürtünme az oluyor.

 

Balansı, motor şaftının çevirdiği her şey etkiliyor. Mesela pervaneyi sabitlemek için kullanacağımız obak veya başka herhangi bir aparat da buna dahil.

Obak

Son olarak, obak denilen malzeme de, pervane motor şaftından uçup gitmesin diye kullanılan bir malzeme. Çok çeşitte ve kalitede alternatifleri mevcut. Obak üst kısmı sıkınca, alt tarafında bulunan ağzı, motor şaftını kavrıyor. Böylelikle pervane yerine sabitlenmiş oluyor.

Obak

Montaj şekli ise aşağıdaki gibidir.

Benim denk geldiğim bir de aşağıdaki gibi bir adaptör var. İsmi yanlış hatırlamıyorsam “saver” adaptör idi. Kullanırken set içinden çıkan o-ring ile pervaneyi sıkıştırarak sabitliyorsunuz.

Bazen de sipariş edeceğiniz motor ile beraber set olarak gelen parçalar da olabiliyor. Güzel yanı direk motor üreticisinin imal ettiği bir parça olması, dolayısı ile balans sorununun daha az olması gerektiğini düşünüyorum.

Motor ve hub

Ya da diğer insanlardan görüp benim de uyguladığım vidasız ve kestirme yolu deneyebilirsiniz. Burada pervaneleri motorun gövdesine sabitlemek için plastik kablo bağlarını kullanıyoruz.

Kablo bağı ile

Arduino ile fırçasız motor sürmek: ilk kod

Her neyse motor ve esc temin edilmişti. En önemlisi bu. Sıra motoru arduino ile nasıl döndürürüm sorusunun cevaplanmasında idi. Hemen bir kaç araştırma yaparak ilk kodlarımı yazdım. Kodu yazmadan önce aklımda tek bir şey vardı. Bu ESC kullanımında “arm” etme diye bir şey varmış. ESC’ye güç verildikten sonra cihaz sürekli bip sesi çıkarmaya başlıyor. Daha önce bahsettiğimiz en düşük değer için 1 milisaniye, en yüksek değer için 2 milisaniye limitlerini hatırlayınız. Arm etmek demek, güç verildikten sonra en düşük değeri vermek oluyormuş. Zaten ESC’yi arm ettiğiniz zaman, melodi şeklinde çıkan 3 – 4 tane bip sesinden anlıyorsunuz. Ben denemek için acaba 900 mikrosaniye olur mu diye kodu yazdım, çalıştı ve sonra nedendir bilmem, bir daha hiç değiştirmedim bu süreyi. Ne derler bilirsiniz, “çalışıyorsa kurcalama” 🙂

Ancak burada belirtmeliyim ki, arm etme güvenlik açısından daha karışık olduğu kurulumlar da var. Mesela güç verildikten sonra kumanda üzerindeki gaz kolu maksimum konuma getirilir, daha sonra minimum konuma düşürülür. Böylelikle uzaktan kumanda sisteminde, quadcopter üzerinde duracak alıcıdan hangi aralıklarda pwm sinyali geldiği kontrol ünitesine bildirilir ve ona göre bir kontrol programı yazılabilir. Ya da bazı modellerde, gaz kolu belli bir pozisyona getirildiğinde arm olabiliyor. Sağ alt köşe gibi.

#include <Servo.h>
Servo emaxesc;
int zaman;

void setup() {
  Serial.begin(9600);
  emaxesc.attach(3);
  
}

void loop() {
  if(Serial.available()){
    char komut = Serial.read();
    if(komut=='0'){
      zaman=900;
    }else if(komut=='1'){
      zaman=zaman+50;
    }else if(komut=='2'){
      zaman=zaman-50;
    }
    Serial.print("Zaman: ");
    Serial.println(zaman);
    emaxesc.writeMicroseconds(zaman);
  }
}

Kod açıklaması

Kod içinde yaptığımız, seri portu dinleyerek klavyede “0”, “1” ve “2” tuşlarına basılıp basılmadığını kontrol etmek. Eğer Arduino IDE üzerinden seri port ekranında “0” tuşuna basılıp gönder dersek, “zaman” değişkenine 900 değeri atanıyor. Yani arm ediliyor. “1” tuşuna her basışta değer 50’şer artırılıyor, gaz veriliyor. “2” tuşunda ise 50’şer azaltılıyor.

ESC kartının beyaz kontrol kablosunu, Arduino UNO üzerinde 3 nolu pine taktım. Kod içinde 3 nolu pine atanan “emaxesc” isimli bir “Servo” nesnesi var. ESC için mesela 900 mikrosaniyelik pwm sinyali üretmek istiyorsam bu nesnenin “writeMicroseconds” alt yordamını kullanmalıyım. Dolayısı ile zaman değişkeni içerisinde, mikrosaniye olarak ayarladığım süreyi “writeMicroseconds(zaman)” şeklinde kullanarak ESCye gönderiyorum.

IMG_3132 (2)
LiPo, ESC, Motor ve Arduino

Kartımıza programı yükleyip LiPo, ESC, Motor ve Arduino bağlantılarını yaparsak sürekli bir bip sesi duyuluyor. Klavyeden “0” tuşuna basılınca ESC’ye 900 mikrosaniyelik bir sinyal yolluyoruz ve bunu minimum değer kabul eden ESC melodik bir şekilde 3 – 4 defalık biplemeden sonra kurulmuş oluyor. “1” tuşu ile daha hızlı dönen motor, “2” tuşu ile yavaşlıyor.

İlk Çin siparişim

Artık motor sürmeyi öğrendiğime göre ihtiyacım olan diğer kritik parçaları edinebilirim. Zaten test amaçlı birer tane aldığım ESC ve motor sayısını 4 yapmam gerekiyor. Ben direk bir kaç araştırmadan sonra, başka bir motor almaya karar verdim. Çünkü ilk edindiğim Cessna motorlar yüksekti ve daha çok uçaklar için kullanılıyormuş. Ben kv değeri daha düşük yeni motor almaya karar verdim. Motor almışken 4 adet yeni ESC’leri de sepete ekledim.

Ek olarak gövde, yedek pervaneler ve IMU sensör aldım. Elimde 2 tane Arduino kartı olduğu için kontrol kartına gerek kalmadı. Bir tanesi kumanda için diğeri de quadcopter için.

Ben öğrenmişken tam öğreneyim diye kumandayı da kendim yapmak istedim. Bu iş için alıcı ve verici olarak kullanabileceğim “NRF24L01” modülü forumlarda gözüme çarptı, onu da siparişlerin arasına eklemiştim. Ancak bu yazıda kumanda yapımına değinmeyeceğim. Kod kısmını isteyen olursa kurcalayabilir.

NRF24L01 Transceiver modül

F450 gövde

Sanırım en çok rağbet gören gövde modeli bu. Orta boyutta ve model bittiği zaman yaklaşık 1 kg ağırlığa ulaşabiliyor. Gövde setinin içinden 4 adet bacak, alt ve üst zeminler ve vida seti çıkıyor. Uçmayı öğrenene kadar ben çok düşürdüm aracı. Kollar kırılabiliyor. Bence el altında yedeklerinin olması gerekir.

Gövde alırken dikkat etmemiz gereken bir nokta “power distribution board” denilen, quadcopter üzerindeki tüm güç aktarımı için merkez konumda olan bir kart. Bazı üretimlerde bu, model gövdesinin alt zemininde bütünleşik olarak geliyor. Eğer değilse ayrıca almakta fayda var, çünkü her ESC’den artı ve eksi 2 adet kablo, toplamda 8 adet kablo, ayrıca diğer elektroniği beslemek için kullanacağımız kabloları da düşününce bu güç dağıtım kartı bize düzen sağlıyor. Resimde bu kart, üzerinde parlak lehim alanlarının olduğu ufak karttır.

 

F450 frame

 

F450 frame

Bu gövdeler için en fazla 10 inçlik pervane öneriliyor yanlış hatırlamıyorsam. Ama unutmamız gereken, kullanmak istediğimiz gövde-motor-pervane kombinasyonu için araştırma yapmak olmalı. Eğer daha önce deneyen birisi varsa, en azından önceden bir fikrimiz olur. Ve tabii ki de pervaneyi çok büyük alırsak birbirlerine çarpacaklardır 🙂

Bu gövde ile yaptığım ikinci versiyon quadcopter videosunu da aşağıda izleyebilirsiniz.

IMU sensör

Gövdeyi de hallettiğimize göre şimdi bu aleti havada dengede tutacak elektroniğe gelelim. Quadcopter, 3 boyutlu ortamda x, y ve z eksenlerinde, ne kadar döndüğünü anlaması gerekiyor. Ancak, konu eksenler olunca havacılık terimleri “pitch“, “roll” ve “yaw” olarak değişiyor. Pitch aracın ön arka çizgisinin yere göre açısı, roll ise burun kuyruk hattına dik olan çizginin, yere göre açısı demek, mesela uçağı düşünürsek kanatların olduğu eksenin yere göre açısı demek. Quadcopter aracının ortasından asılı olduğunu düşünürsek de, kendi ekseni etrafındaki dönmesi de yaw olarak geçiyor.

Bu açıları tespit etmek için “Inertial Measurement Unit (IMU)” yani içerisinde temel olarak akselerometre ve jiroskop olan sensörlerden yararlanılıyor. Ek olarak manyetometre, barometre vb. gibi ek donanımları olan modüller de mevcut. Aşağıdaki resimde benim kullandığım GY-80 (10 DOF) modülünü görebilirsiniz. Buradaki DOF kısaltması “Degree of Freedom” demek. Mesela sadece 3 eksenli akselerometre içerseydi bu modül 3 DOF olacaktı. Bir nevi ölçüm yapabildiği eksen sayısı ve ölçüm tipi. Bu modülde, 3 eksen akselerometre, 3 eksen jiroskop, 3 eksen manyetometre (pusula) ve bir adet basınç sensörü bulunuyor. Basınç sensörü, quadcopter aracının, uçarken ne kadar yüksekte olduğunu anlamak için kullanılıyor.

GY-80 IMU
GY-80 IMU

Gövdenin 3 boyutta konumunu ölçmek

Akselerometre ne kadar eksen destekliyorsa, her bir eksen üzerindeki ivmeyi ölçüyor. Dünyanın yer çekim ivmesi olduğu için de bu özelliği kullanarak bir eksen boyunca oluşan eğimi bulabiliyoruz. İşin içine biraz trigonometri girse de çok karışık bir mantık değil. Diyelim ki x-ekseni üzerindeki eğimi ölçmek istiyoruz. x-eksenini aracın ön arka çizgisi olduğunu farz edelim. Eğer quadcopter havada yatay durumda duruyorsa x ekseni üzerinde bir ölçüm olmayacaktır. Ne zaman burun yere doğru eğilir işte o zaman bu eksen üzerinde ölçüm değerleri gelmeye başlar. Bu şekilde araç üzerindeki z ekseni de kaymış oldu. İşte x ekseni ve z ekseni üzerindeki, bu değer değişimlerinden yola çıkarak aracın istediğimiz eksen üzerindeki yere göre eğimini anlayabiliyoruz.

Jiroskop ise açısal hız ölçümü yapar. Akselerometre doğrusal ivmeye duyarlı ise, jiroskop da dönmeye duyarlıdır. 3 eksenli bir jiroskop ile quadcopter aracı üzerinde, 3 boyutta her bir eksen için oluşan dönmeleri anlayabiliriz. Biraz teknik ifade edersek, bir eksenin yere göre yaptığı açının, zamana göre türevini alıyormuşuz gibi bir ölçüm verir ve anlıktır. Akselerometre gibi yer çekiminden de etkilenmez.

Bir de quadcopter aracının önünün, sağa veya sola ne kadar saptığını anlamak için manyetometre kullanmak gerekli. Dünya üzerindeki manyetik alanı, içinde bulunduğumuz alan boyunca sabit kabul ediyoruz ve değerini internet üzerinden öğreniyoruz. Manyetometre ölçüm sonucu ile bu değeri karşılaştırarak dikey eksen üzerindeki dönme açısını buluyoruz.

Ölçümler için filtre kullanımı

Quadcopter üzerine yerleştireceğimiz motorlardan dolayı alet üzerinde ister istemez titreşimler olacaktır. Bu titreşimlerden en çok etkilenen ise akselerometre. Bu yüzden bir eksenin yere göre açısını ölçmek için hem jiroskop hem de akselerometre verisinden faydalanmamız gerekiyor. Sadece jiroskop olmaz çünkü “temperature drift” denen ve istenmeyen bir özellikleri var. Ölçüm değerleri sürekli sıcaklığa göre değişiyor. Hatta ölçüm yaparken algoritma içinde yine sensörden gelen sıcaklık değerine göre kalibrasyon yapmamız gerekiyor.

İlk başlarda “Kalman” filtresi gibi karmaşık ve öngörücü filtre tiplerini öğrenmeye çalışmıştım. Ancak sonra “Complementary Filter” diye tabir edilen bir filtre çeşidini uyguladım. Kullanımı basit. Mantık olarak biraz elektronikteki “high pass” ve “low pass” filtrelere benziyor. Denklem olarak ifade edersek:

 

Buradaki ifadede semboller aşağıdaki gibidir:

a : ilgilendiğimiz eksende bulmak istediğimiz açı değeri. Eşitliğin sağ tarafında da aynı “a” değişkeni var, nedeni ise, bu denklem, yazdığımız kodun içinde olduğu için, aslında sağ taraftaki a terimi, bir önceki kod döngüsündeki açı değeri anlamına geliyor.

gyro : Jiroskop modülünden gelen “derece/saniye” cinsinden ölçüm değeri.

zaman : Kısaca “saniye” cinsinden ölçüm yaptığımız periyot.

acc : Akselerometre modülünden gelen verilerin kullanımı ile elde edilmiş açı ölçümü, “derece” cinsinden.

0,98 / 0,02 : Bu çarpanlar ise hangi ölçüm kısmına daha çok ağırlık verileceğini belirliyor. Teknik hesaplamalar kısmı olsa da ben tecrübeleri takip ettim. Bu değerler gördüğüm forumlarda kullanılan genel değerler idi.

Mantık olarak 0,98 ile çarpılan kısım aslında, bir önceki açı ölçümünün üzerine, jiroskoptan gelen dönme verisi eklenerek yeni açı değerinin bulunması demek. İkinci kısım olan 0,02 ile çarpılan bölüm ise direk olarak akselerometre verilerinden elde edilen ölçüm anlamında. Jiroskoptan gelen sonuçlara daha çok güveniyoruz demek.

Benim elime geçen GY-80 modülündeki akselerometre ve jiroskop hizlamaları aşağıdaki gibiydi. Bazen x ve y eksenleri modül üzerinde belirtilenden farklı olabiliyor. Gidiş yönüne göre hesaplamalara dikkat etmek gerekiyor.

 

IMU ve eksenler

Algoritma Ana Döngüsü

Şimdi yavaştan kodlama kısmına giriş yapalım. Anlatacağım kodlar, videosu aşağıda olan proje içindi. Videoların görüntü kalitesinin biraz kötü olduğunun farkındayım. O zaman ki imkanlar bu kadardı 🙂

 

 

Quad7_4V.cpp ile başlayalım… (Proje dosyası için link – yazının başındaki ile aynı dosyadır)

int main(void)
{
  I2CInit();
  ADXL345Init();
  ADXL345RawCalibration();
  L3G4200DInit();
  HMC5883LInit();
  HMC5883LHeadingZero();
  
  SpiInit();
  nRF24L01Init(false);
  PwmInit();
  
  bool RunOnce1=false;
  bool RunOnce2=false;
  
  while(1)
    {
    if(TCNT1<TicksTo20mS/8){
      PwmRun();
      RunOnce1=true;
    }else if((TCNT1>=TicksTo20mS/8)&&RunOnce1){
      L3G4200DReadTrueXYZdps1();
      ADXL345GetPitchAndRoll();
      HMC5883LCalculateHeading();
      RunOnce1=false;
      RunOnce2=true;
    }else if((TCNT1>=3150)&&RunOnce2){
      L3G4200DReadTrueXYZdps2();
      
      ComplementaryFilterCompute();
      
      RunOnce2=false;
      
      if(Armed){
        PIDComputePitchOutput(FilterPitch);
        PIDComputeRollOutput(FilterRoll);
        PIDComputeYawOutput(FilterYaw1);
        PIDDo();
      }
      
      if(nRF24L01RxDataReady()){
        nRF24L01Receive(DataIn,4);//GetData
        DecodeDo(DataIn[0]);
      }
      
      PIDSetSetpoints((signed char)DataIn[1]+FilterPitchOffset,(signed char)DataIn[2]+FilterRollOffset,(signed char)DataIn[3]);
    }
  }
}

Açıklama

#include ile tabir edilen yerlerde, kullanılan kütüphanelerin programa tanıtılması var, bunları atladım. Verilen indirme linkinde bu kütüphanelerin hepsi bulunmaktadır.

Gelelim ana döngümüz olan ve sonsuz tekrara giren “while(1)” teriminden önceki tanımlamalara. Hemen göze çarpan “init” ifadeleri olacaktır. Tahmin edeceğiniz üzere, projede kullanılan modüllerin başlatılmasına yönelik alt yordamları içeriyor.

I2CInit: (I2C.h içerisinde bulunur.) IMU modülü üzerindeki ADXL345 (akselerometre), L3G4200D (jiroskop) ve HMC5883L (manyetometre) sensörlerini okumak için I2C protokolünü kullandım. Modül üzerinde SDA ve SCL ibareleri ile belirtilir. Arduino Uno üzerinde analog pinlerden sırasıyla A4 ve A5 pinleri kullanılabilir. Videodaki projede kullanılan Arduino Micro üzerinde ise, D2 ve D3 pinleri kullanılabilir. I2CInit altyordamı ile Arduino kartı üzerinde bu protokolün sağlıklı bir şekilde başlatılması sağlanmıştır.

IMU kısmı

ADXL345Init (ADXL345.h içerisinde bulunur.), L3G4200DInit (L3G4200D.h içerisinde bulunur.), HMC5883LInit (HMC5883L.h içerisinde bulunur.), alt yordamlarında ilgili modüllerin başlatılması için gerekli yazma işlemleri bulunmaktadır. Hangi register için hangi değerlerin yazılacağı datasheet dokümanları incelenerek bulunabilir.

ADXL345RawCalibration: (ADXL345.h içerisinde bulunur.) Quadcopter aracının düz ve yatay bir zemin üzerinden uçuşa geçeceğini kabul ederek, karta ilk güç verilmesi esnasında akselerometreden 10 adet ölçüm yaparak ortalamasını buldum. Daha sonra ölçüm değerleri x ve y eksenleri için 0, z ekseni için de 1 g olması gerektiğinden dolayı, varsa oluşan farkları offset olarak kullandım. Takip eden diğer ölçümlerde, bu offset değerlerini ölçüm sonucundan çıkardım.

HMC5883LHeadingZero: (HMC5883L.h içerisinde bulunur.) İçinde bulunulan ortamda, quadcopter çevresindeki manyetik alan ölçülerek en güçlü olduğu yöne “0” değeri atanır. Burada kapalı alanda değil de açık alanda uçurmanın önemi ortaya çıkıyor. Zira kapalı alanlarda manyetik alan, açık alanlardaki gibi düzgün olmayıp, kısa mesafelerde farklı değerler okunmasına sebep olabilir. Dolayısı ile aracın hangi yöne baktığına dair sağlıklı ölçümler alamayabiliriz.

Kumanda kısmı

SpiInit: (SPI_V2.h içerisinde bulunur.) Kablosuz iletişim için kullanılan nRF24L01 modülünü kontrol etmek için kullanılmıştır. İletişim protokolünün sağlıklı bir şekilde başlaması için gerekli işlemler bulunur.

nRF24L01Init: (nRF24L01_V2.h içerisinde bulunur.) Kullanılan nRF24L01 modülleri için oluşturulmuştur. Bir tane kumanda üzerinde bir tane de quadcopter üzerinde olduğu için, alıcı ve verici olarak iki farklı modda başlatılabilir.

PwmInit: (Pwm_V2.h içerisinde bulunur.) Motorları sürmek için Arduino içindeki zamanlayıcıları kullanacağımız için, ilk ayarlamalar yapılıyor.

Zamanlama tasarımı

Zamanlayıcılara gelmişken, hem “while(1)” döngüsüne bir girizgah olsun, hem de arka planda tasarlanan zamanlamalara değinelim. Timer1 zamanlayıcısını kullandım. Çarpan olarak ise 1/64 değerini kullandım. Yani Arduino kartımızın çalışma frekansı olan 16 MHz değerini 64 sayısına bölüyoruz. Bu da 250.000 Hz gibi bir değer verecektir. Bunun anlamı, Timer1 zamanlayıcısı, 1 saniye süresince 250.000 değerine kadar sayacaktır. Daha önceden öğrendiğim, 20 mS periyotlar ile motorları sürmem gerektiği bilgisi, burada devreye giriyor. Eğer Timer1,  1 saniyede 250.000 değerine kadar sayacaksa, 20 mS süresince 5000 tik atacaktır. Dolayısı ile bir “tik” uzunluğu 4uS olur. Bu değer önemli, çünkü artık kaç sayımdan sonra motorların hızını güncellemem gerektiğini biliyorum.

 

PWM Grafiği

PWM, akselerometre ve jiroskop zamanları

İlk adımda, yani 20 mS’lik sürenin başında motorları kontrol etmem gerekiyor, 900 – 2200 mikrosaniye aralığı, Timer1 sayacında tik cinsinden 225 – 550 tik aralığına denk gelecektir. Benim elimde 5000 adet tik var, kabaca 5000 sayısının 1/8 kadarında rahat rahat pwm kontrolümü yapabilirim. 625 tik, yani 2,5 mS lik bir süreyi motorların kontrolüne ayırdım. PWM grafiğinde siyah taralı alanda bu dilim gösterilmektedir.

İkinci olarak dikkat etmem gereken şey, jiroskop (L3G4200D) başlangıç değerlerini ayarlarken ODR (Output Data Rate), yani ölçüm sonuçlarını ne sıklıkla dışarı vereceği ile ilgili 100 Hz seçeneğini seçtim. Bu da her 10 mS’de bir elimde jiroskop ölçümü olacağı anlamı taşıyor. Madem benim 20 mS lik zaman aralığım var, o halde iki defa ölçüm yaparak ortalamasını alabilirim. Bu işlem PWM grafiğinde mavi G1 ve sarı G2 etiketleri ile belirtilmiştir.

G1 ölçümü, hemen PWM kontrolü için ayrılan bölümden sonra yapılıyor. G2 ölçümü ise 650 + 2500 tik sonra yapılıyor. 625 tik sonra aslında PWM kontrolümüz bitiyor ama biraz ekstra süre koymak istedim buraya. 2500 tik değeri ise 10 mS’lik süreye denk geldiği için eklendi. Yani ikinci ölçümler yaklaşık 12,6 mS sonra başlıyor.

İlk kısımda ayrıca akselerometre ve manyetometre ölçümleri yapılıyor. Sırasıyla A ve M etiketleri ile PWM grafiğinde belirtilmiştir. Bir de her bir 20 mS içinde, bu belirlediğim dilimler birer kez çalışsın diye, RunOnce1 ve RunOnce2 değişkenleri ile kontrol sağlanmıştır.

PID kontrolü

İkinci kısımda “ComplementaryFilterCompute” (Filter.h dosyasında) alt yordamı ile daha önce açıklanan filtreleme mantığı ile alınan ölçümler filtrelenmektedir. Daha sonra PID kontrolümüz gelmektedir. Burada tersten başlarsak, “nRF24L01RxDataReady” kontrolü ile kablosuz modülümüzden gelen ve quadcopter üzerinde ne yapmak istediğimize dair bilgi içeren, 4 byte uzunluğundaki “DataIn” nesnesindeki, ilk byte değerine bakıyoruz. Burada arm ve disarm gibi komutlar bulunmaktadır. Ayrıca geliştirme sırasında çeşitli şeyleri denemek için iliştirilmiş durumlar mevcuttur.

Daha sonra “PIDSetSetpoints” ile 3 boyutlu uzayda quadcopter aracının hangi eksenlerde hangi açılara sahip olmasını istiyorsak onları set ediyoruz. İlk etapta atladığımız arm edilmiş ise “PIDCompute” ve “PIDDo” ifadeleri ile de, olması istenen açı değerlerine gelene kadar, filtrelediğimiz açı ölçümlerini kullanarak, motorların güçleri değiştirilmektedir.

PID kontrolü dediğimiz zaman “Proportional, Integral, Derivative” kelimelerinin baş harfleri gelmelidir. Sırasıyla oransal, integral ve türevsel olarak dilimize çevrilmiş. Bu tekniği biraz araştırmak lazım, kısaca, istenen durum ve hali hazırda olan durum arasında  bir hata değeri elde ediyorsunuz. Daha sonra, terimlerin yazılış sırasıyla, şimdi, geçmiş ve gelecek durumlarının tespit ve tahminine göre, bunlar sensörlerden gelen bilgiler, bir ağırlıklı toplam alınıyor. Siz hangisine ağırlık vermek istediğinize göre ve sistemde gerçekleştirdiğiniz testlere göre P,I ve D katsayıları belirliyorsunuz. Sonuç olarak algritma, her döngüde, sistemi istenilen duruma getirmeye çalışıyor. Quadcopter için, istenilen durum, eksenlerin yere göre olmasını istediğimiz açıları oluyor. Araştırdığım kadarı ile integral kısmı kullanılmıyor, çarpanı sıfır.

Kumanda

Kodları içeren zip dosyasında bir de nRF24L01Receiver adında bir klasör var. Bu klasör, yine bir kendin yap örneği olan aşağıdaki kumanda için yazılmıştır. Yukarıda bahsedilen, DataIn nesnesi, bu kumanda tarafından gönderilen bilgiler ile dolduruluyor. Kumanda çok el yapımı olduğu için ve sadece veri yollamak için kullanıldığı için açıklamasına girmiyorum. Aslında hedeflenen ESC kalibrasyonu, canlı değer gönderimi gibi, bir nevi telemetri işlemleri idi, ancak hiçbir zaman yapmadım. Kodlar yine aynı Atmel Studio projesi içerisindedir. Kart olarak Arduino UNO kullanılmıştır.

 

Burada kesmek gerektiğini düşünüyorum, çünkü işin teknik ve standart tarafına yönelik internet üzerinde tonlarca bilgi var. Ben daha çok farkettiğim şeylere, karşıma çıkan yeni terimlere odaklanmak istedim. Farkettiğim en önemli kaynağın ise, sabır olduğunu söyleyebilirim. Biliyorum, kit halinde satılan modeller ile, daha keyifli zamanlar geçirilebilir. Ancak, bu el emeğinin, yalpalayarak da olsa, uçtuğunu görmek herşeye değerdi.

Kaynağınız açık, malzemeniz bol olsun…

 

İlk Yorumu Siz Yapın

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

%d blogcu bunu beğendi: