PIC18F4431 ile Quadcopter

Başlatan z1rqdym, 06 Şubat 2015, 22:58:30

z1rqdym

Merhabalar.
Öncelikle forumda yeniyim ve ihtiyaç duymadıkça bir forum sitesine üye olmam.
Başta ete olmak üzere forumdaki bir çok kişinin yazdıklarıyla her zaman kendimi geliştirdim. Imkanlar dahilinde 7yıldır PIC konusunda kendimi geliştirdim. Makine Mühendisliği okumaktayım ve projem başlıkta da gözüktüğü gibi QUADCOPTER.
Dijital elektronik üzerine çok yoğunlaştım ve çok şey öğrendim. Analog elektronik konusunda orta derecede uygulama ve hesaplama bilgisine sahibim.

Benim merak ettiğim husus şu; Bir PIC aynı anda birden fazla görevi senkron bir şekilde ne kadar verimli çalıştırabilir?
Daha önce asansör, ev otomayonu ve güvenlik, gezer akıllı süpürge, mp3 çalar, dijital şarj cihazı gibi bir çok proje gerçekleştirdim ve gayet başarılı sonuçlandılar.
Ancak Quadcopter'e kadar hiç bir zaman dinamik bir sistem tasarlamadım. Ve baktığımızda yaptığım projeler hep statik çalışan sistemlerdi.

Quadcopter ile ilgili 300e yakın döküman 20ye yakın proje inceledim. Hiç biri bu takıldığım noktada takılmamışlar.
PID kontrol.
En az 6 eksen IMU.
RF iletişim.
Bunlar projemin zeminini teşkil eden ana unsurlar.
Sistem o kadar iyi ve tepkisel çalışmalıki;
I2C (yazılımsal) ile IMU'yu okuyacak. Konumunu ve eğimini hesaplayacak. Eğime göre ilgili 4 motor için PWM gönderecek (PID). RF ile (433MHz, quadcopter sadece atölyede uçacak) yönelim komutlarını alacak (USART). USART'dan alınan komutlar manchester kodu halinde alıncak ve çözülmesi gerekecek. Aldığı komuta bağlı olarak PID aktifken motorlara ilgili PWM gönderilecek. Ve bunca görevi layıkıyla PIC altından kalkmalı.
Özetle...
Sizce aynı anda
-I2C (Yazılımsal)
-USART(Veri alındı kesmesi aktif)
-PWM(donanımsal)
-Sin cos arctanjant

bu işlemler PIC 'i çok mu yavaşlatır.
Korkum quadcopterin parçalanması. Çünkü en ufak bir gecikme (500milisaniye) buna sebep olabilir.

Bunu tartışalım fikir alışverişinde bulunalım, çunku bir dönemdir bunu moduler olarak basardım ancak sistem haline alınca tökezlemeye başladım.

Herkese iyi forumlar :)

Burak

#1
Öncelikle PIC'i yavaşlatma gibi bir durum hiçbir uygulamada mümkün değil ... Ama PIC'e görev paylaşımı yaptırmada düzgün bir akış kullanmazsan işlemciye görevini düzgün yaptıramazsın ...
PID kontrol konusunda P - I - D parametrelerinin teker teker ayarlanması projenin başlangıç kısmı olmalıdır , öngörülü bir filtre methodu olan autotunning bu parametreleri an be an sistemin kararlılığını takip ederek kendiside bulabilir ama gerçekten zor bir algoritmadır ... IMU'lar ile haberleşme son derece hızlı bir haberleşme protokolü ile yapılır ... Bilinen veri gönderme alma protokollerinden SPI , I2C veya USART ile haberleşirler ... Bunların hepsi son derece hızlı bilgi alışverişinde bulunabilen protokollerdir ... RF iletişime gelince , Transceiver özellikte işlemcilere sahip RF entegrelerle çalışman işini garanti altına alacaktır ...

Şu an önündeki en büyük engel PID filtresini yazmak ... ve PID filtresi 8 bitlik işlemcilerle olmaz değil efektif olmayacak bir sayısal filtredir ... DsPIC'ler ile çalışman mümkünse işin kolaylaşacak ama bildiğim kadarıylada PicBasic'in DsPic desteği yok ...

Ayrıca PID konusunda ne kadar bilgi sahibisin bilmiyorum ama bu filtre feedback kontrol mekanizmasıyla çalışır ... Ama quadcopter gibi bir projede senin feedforward mekanizmasınada ihtiyacın olacak unutma ...  İleri besleme şart ... PID'nin sayısallaştırılmasında elimden gelen yardımda bulunurum ... Analog ifadelerden "S" , ayrık zamanlı "K" düzlemine geçiş yüksek matematik bilgisi gerektirir ... Diferansiyel denklem çözmek , fourier dönüşümlerine hakimiyet gerektirir ... Yolun neresindesin bilmiyorum ama yok ben bunlara bulaşmam modüler çalışacağım dersen gömülü quad driver modüller var ...

Burak
Ω Gens Una Sumus Ω

ete

#2
Qudcopter kontrolünün 8 bitik bir işlemci ile yapılabileceğini sanmıyorum. 18F serisinden bir işlemci seçip 80Mhz üzerinde çalıştırılır ise belki diyorum ama asıl başarı 16 bit yada 32 bit işlemcilerle sağlanır diye düşünüyorum.

8-16 ve 32 bit Picişlemciler için geliştirilmiş yeni bir Basic Derleyici çıkmış. Bu derleyici açıklamalara bakılırsa BAsic mantığı ile ama C dili düzeninde çalışıyormuş. Hatta daha fazla VB yazım şekline uygun bir şekli olduğu belirtiliyor. Şu anda ücretsiz olarak yüklenebiliyor. Başlangıç olarak denemeye değer diye düşünüyorum.

İşte Link,
http://www.firewing.info/pmwiki.php?n=Firewing.Download

Aslında sistem Arduino ya benzer bir platform yaratma şeklinde düşünülmüş ve yazılım bedava ama donanjım parayla sistemine göre çalışma istiyorlar. Donanımı kullanmadan kendi donanımınız için yükleyip program yazabilirsiniz. Sürekli kütüphane dosyaları genişletiliyor gibi gözüküyor.

Ete

Burak

#3
Evet hocam bir bootloader görmeden hedef board ile iletişim kurulamıyo bu sistemde yani tamamen arduino altyapısı ile hazırlanmış ... Keşke kendi işlemcimizi seçebileceğimiz basic tabanlı bir sisteme sahip olsaydı diye iç geçirmedim dersem yalan olur ... Derleyici arayüzü yine mecanique'e ait dolayısıyla bir Microcode açarmışcasına heyecan yarattı ama sonrası hüsran ...

Neyse konuyu fazla dağıtmayayım .

Neden 8 bitlik mimari ile "olmazın" yada efektif "olmazın" sebebini konuyu açan kişinin kafasına takılabilir ihtimalinden dolayı basitçe açıklayayım ....

PID filtresi bir dijital sinyal işleme algoritmasıdır ... Bu algoritmada 8 bitlik mimarilerde derleyiciler bize 16 bitlik toplam işlem kapasitesi sunuyorlar ... Ama gelgelelim ki , 16 bitte çalışabileceğimiz maksimum sayı değeri 65535 sayısı ....

PID algoritmasıyla çalışırken özellikle türevsel kazanç ve onun katkı ifadesi herzaman toplamsal integratif etkiyi baskılamaya ve clamp oluşturmalarına engel olacak şekilde algoritmaya katkıda bulunuyor (en azından set değeri altında) ... Yani integral ifadesinin sisteme olan etkisi baskılanmazsa set değeri üzerinde hatrı sayılır bir süre boyunca aşım ve oturma zamanınında uzamalar meydana geliyor ... Hatta kontrol teorisinde biz set değeri altındaki noktalarda integratif ifadeler toplamlara, türevsel ifadeler eksilmelere yol açıyor diye düşünebiliriz . (kabaca)

PicBasic'in word düzeninde negatif ve pozitif kabul ettiği sayılar aslında şöyledir ... Bunlar two's complement olarak ifade edilir derleyici matematiğinde ve PID gibi bir filtrede bunlar bilinmeden zaten yola çıkılamaz ... Örneğin 32767 sayısı üzerindeki ifadelerin mutlak değerini aldığında derleyici sana   65536 - (değer)  ifadesini döndürür ... Yani integratif toplamlar 32767 değerini aştığında aslında birikeçteki değeri negatife döner ve işlemci bu toplamı yanlış yorumlar ... Örnekleme frekansını düşürerek integratif birikeçte (akümülatörde) ki toplam değerini 32767'yi aşmayacak hale getirme zorunluluğu senin PID filtreni güçsüzleştirir ... Bak altını çiziyorum özellikle ... OLMAZ DEĞİL , EFEKTİF OLMAZ ..... Kendi yazdığım bir PID hız denetimi algoritması 8 bitlik mimaride bir torna tezgahında delici motorun hız denetiminde kullanılıyor ... ve 2013'ten beride kullanılmakta ... hiç sorunda çıkarmıyor ... Ama quadcopter projesinde yüksek örnekleme frekansı PID filtresini doyuma o kadar hızlı ulaştıracak ki sen bile şaşıracaksın ... Benim yazdığım PID filtresinin bir alt rutin döngüsünün gerçekleşmesi 20 mhz çalışma frekasında 270-300 us alıyordu yanlış hatırlamıyorsam ... Bence bu muazzam bir hız ... Ama quad'da işler farklı ... çünkü quad'ın parçalanmaması için örnekleme frekansın yüksek olmalı ve buda yukarıda bahsettiğimiz dar 8 bitlik mimarinin önüne geçen hesaplara ulaşılmasından dolayı zor.

Umarım yazdıklarım faydalı olur .. Bu ifadeler bu mesleğin teorisinden uygulamasına yol katetmiş birisinin tavsiyelerdir ... Bana sorarsan quadcopter projesinden ziyade öncelikle küçük bir DC motorun PID hız denetimini 8 bitlik bir işlemciyle gerçeklemen ... Ondan sonra tersinir sarkaç gibi bir kontrol sistemini gerçeklemen , ondan sonrada çok eksenli bir sistemi kontrol etmeye çalışman , sıralama olarak doğru bir gidişat olacak ... Tekrar söylüyorum , sen kendi PID filtreni geliştirmeye çalışırsan ve karar verirsen ben şahsım adına elimden ne gelirse yardım ederim ..

Burak
Ω Gens Una Sumus Ω

Burak

Bir fikir olur belki diye kendi yaptığım PID DC motor hız denetimi projemin videosunu veriyorum . Linkten paylaşıma açtığım cloud hesabımdaki bir klasöre yönleneceksin ... iki tane video var .. Birisi yüksek devirde kontrol ettiğim , diğeri düşük devirde kontrol ettiğim iki farklı dc motorun videoları ...

https://drive.google.com/folderview?id=0B2LMU8aDiDWyOF91c0JnTWFUUHM&usp=sharing

Burak
Ω Gens Una Sumus Ω

z1rqdym

Öncelikle ilginiz ve yönlendirmeleriniz için teşekkür ederim.
Şunu belirtmeliyim BASIC bilmiyorum C bilgisayar programlamasını öğrendim ardından assembler(pic16 serisi komutlarını) iyice öğrendikten sonra Hi tech C, mikroC, CCS C kullandım. Bu üçüne hakimim. Algoritma oluşturmada sıkıntı yaşamadığım için BASIC dilinide öğrenirim orası hiç sıkıntı değil.

Konuya dönecek olursak...
PID kontrol, motor hızlarını hava direncine göre sabit tutmak için gerekli elbet.  Fakat ESC ler bunu hallediyor. Gönül isterdiki ESC yi kendim yapmak ama olmadı zaman kısıtlı.
Benim PID yi kullanmaya çalışma amacım quadı dengede tutabilmek. Normalde böyle bir şey yok. Şöyle yok, çok pahalı ve çok kanallı rf kumandalarda bu sistem 2 çubukla elle manuel sağlanıyor quadın hazır kontrol kartları buna uyumlu. O yuzden o tip quadlarda PID sadece IMU için kullanılıyor. O hazır gömulu kartları inceleme şansım oldu uzerlerinde 8bit atmel işlemci vardı en iyilerinde 16bit vardı. Motorla alakalı PID kullanılmıyordu. ESC , pwmle aldığı hız bilgisini çıkışta sabit tutmaya çalışıyor.

PID için kullandıkları filtre fonksiyonları(PID hesaplarına veri girmek için) Gyro verisini eğim verisiyle birleştirip daha temiz kararlı sonuçlar almak için. Gyrolar çok isabetli çalışıyor ama anlık için daha sonra sabit kaldıklarında çıkış sıfırlanıyor, eğim sensörüde uzun vadede doğru sonuç sağlıyor ancak anlık olarak verdiği sonuçlar parazitli hemde korkunç derecede.
Kalman filtresini araştırdım. Adapte (CCS C de) ettim ROM hafızasının yarısını kapladı. Eğime ve açısal hıza göre i j k birim vektörü cinsinden konum hesaplayana kadar çoktan o pozisyondan ayrılmıştım. Yinede sonuçlar doğru çıkıyordu yani o konuma göre.
Bahsettiğim yavaşlık buydu işte.

IMU dan aldığı veriler 100khz hızında I2C protokuluyle calışıyor. Ancak IMU 3.3v ile çalışıyor ama devresınde regulator var. Fakat data hattı 3.3volta pull up olsa bile 5volt ile donanımsal olarak Pic okuyamıyor(veri okunurken gelen veri 3.3v olduğu için). Bu yuzden yazılımsal I2C kullandım. Ilk başta sorun kutuphaneden kaynaklı sandım ve protokolu assembler ile yazdım. Çalıştı. Ama bir fark yoktu.
Sonuc olarak yazılımsal I2C ile 100khz hızında iletişim olunca ve bunu aralıksız okuması gerektiği için sistem efektif olamıyor.

RF kumandayı 433mhz modullerle yaptım. Çalışıyor ve binaların olduğu bir sokakta 200m ye kadar sıkıntı olmuyor.  Şöyle olmuyor verici 1250baud ile ayni veriyi 20kez gönderince. Bu da alıcının 20kez usart kesmesine girip gelen 20veriyi kıyaslayıp en az 10tanesi eşitse veri alındı şeklinde programlayinca. Benim bundan kurtulmam lazım en azından 20kez alıcının kesmeye gitmesini istemem. Manchester kod kullanmak istememiştim çunkubuda fazladan görev demekti.

Benim anladığım kadarıyla ya 5voltluk bir imu yada 3.3v pic kullanmam şart gibi.
Buda beni otomatik olarak dsPIC kullanmaya itiyor.
dsPIC ile PIC32 ler hemen hemen aynı fiyata sahip modelleri var.
O zaman yeni sorum;
dsPIC ya da PIC32 mimarisini assembler komut setini ve kaydedicilerini öğrenmem çok zamanımı alır mı? Yaklaşık 3buçuk ay kaldı proje teslimi için.


rf-man

Alıntı yapılan: Burak GÜNAY - 07 Şubat 2015, 13:17:11
Bir fikir olur belki diye kendi yaptığım PID DC motor hız denetimi projemin videosunu veriyorum . Linkten paylaşıma açtığım cloud hesabımdaki bir klasöre yönleneceksin ... iki tane video var .. Birisi yüksek devirde kontrol ettiğim , diğeri düşük devirde kontrol ettiğim iki farklı dc motorun videoları ...

https://drive.google.com/folderview?id=0B2LMU8aDiDWyOF91c0JnTWFUUHM&usp=sharing

Burak

Burak Bey ;

Bu videolardaki calisan gomulu PID PicBasic'de mi yazildi ? Yuksek devirdeki gordugum hata 10000 devirde 1 devir yani bu gordugum en iyi PID kontrolculerinden birisi . Bozucu etki uygulamissiniz ikinci videoda ona ragmen set degerini golge gibi koruyor . Burak bey nutkum tutuldu gercekten ... Bu kodu satmayi dusunurseniz sirket olarak satin almayi dusunuyoruz ozel mesajdan gorusebilirmiyiz  . tesekkurler.

Burak

Alıntı yapılan: rf-man - 07 Şubat 2015, 16:49:41
Burak Bey ;

Bu videolardaki calisan gomulu PID PicBasic'de mi yazildi ? Yuksek devirdeki gordugum hata 10000 devirde 1 devir yani bu gordugum en iyi PID kontrolculerinden birisi . Bozucu etki uygulamissiniz ikinci videoda ona ragmen set degerini golge gibi koruyor . Burak bey nutkum tutuldu gercekten ... Bu kodu satmayi dusunurseniz sirket olarak satin almayi dusunuyoruz ozel mesajdan gorusebilirmiyiz  . tesekkurler.


Evet Picbasicte yazdim ve satmayi dusunmuyorum.

Burak
Ω Gens Una Sumus Ω

Hattuşa

burak usta;
ETE hocamın verdiği link ve derleyici swordfish gibi birşey mi? malum o pek tutmadı sanırım, yada benim ilgimi nedense çekmedi. yada başaramamaktan korktum. zira protonda zar zor ayakta duruyorum.
bu frewing IDE hakkında yorumlarınız nedir?

Burak

#9
Pro-TR ;

Biliyorsunuz Visual Basic ve C temelli programlar modüler programlama dilleridir , program yapıları gereği birbirilerine entegre olabiliyorlar , hazır program modülleri ile include injeksiyonu özelliğine sahipler . ETE hocam bahsini açtıktan sonra Firewing'i araştırdım biraz ve şu şekilde söylemler var ; dil yapısı olarak terimler bazında Swordfish ile birbirilerine %90'lar derecesinde benzerlik gösteriyorlar ...Fark olarak tamamen ücretsiz olduğunu söylüyorlar .

Bu yaptıkları sistem arduino gibi sizi paket programlama ile karşı karşıya bırakıyor ve ben paket programlamayı sevmiyorum . Hazır kütüphaneler vb sistemler birazcık Geliştiricileri ve geliştiriciliği tembelleştiriyor ...

Burak

Ω Gens Una Sumus Ω

Burak

#10
Alıntı yapılan: z1rqdym - 07 Şubat 2015, 16:32:43
Öncelikle ilginiz ve yönlendirmeleriniz için teşekkür ederim.
Şunu belirtmeliyim BASIC bilmiyorum C bilgisayar programlamasını öğrendim ardından assembler(pic16 serisi komutlarını) iyice öğrendikten sonra Hi tech C, mikroC, CCS C kullandım. Bu üçüne hakimim. Algoritma oluşturmada sıkıntı yaşamadığım için BASIC dilinide öğrenirim orası hiç sıkıntı değil.

Konuya dönecek olursak...
PID kontrol, motor hızlarını hava direncine göre sabit tutmak için gerekli elbet.  Fakat ESC ler bunu hallediyor. Gönül isterdiki ESC yi kendim yapmak ama olmadı zaman kısıtlı.
Benim PID yi kullanmaya çalışma amacım quadı dengede tutabilmek. Normalde böyle bir şey yok. Şöyle yok, çok pahalı ve çok kanallı rf kumandalarda bu sistem 2 çubukla elle manuel sağlanıyor quadın hazır kontrol kartları buna uyumlu. O yuzden o tip quadlarda PID sadece IMU için kullanılıyor. O hazır gömulu kartları inceleme şansım oldu uzerlerinde 8bit atmel işlemci vardı en iyilerinde 16bit vardı. Motorla alakalı PID kullanılmıyordu. ESC , pwmle aldığı hız bilgisini çıkışta sabit tutmaya çalışıyor.

PID için kullandıkları filtre fonksiyonları(PID hesaplarına veri girmek için) Gyro verisini eğim verisiyle birleştirip daha temiz kararlı sonuçlar almak için. Gyrolar çok isabetli çalışıyor ama anlık için daha sonra sabit kaldıklarında çıkış sıfırlanıyor, eğim sensörüde uzun vadede doğru sonuç sağlıyor ancak anlık olarak verdiği sonuçlar parazitli hemde korkunç derecede.
Kalman filtresini araştırdım. Adapte (CCS C de) ettim ROM hafızasının yarısını kapladı. Eğime ve açısal hıza göre i j k birim vektörü cinsinden konum hesaplayana kadar çoktan o pozisyondan ayrılmıştım. Yinede sonuçlar doğru çıkıyordu yani o konuma göre.
Bahsettiğim yavaşlık buydu işte.

IMU dan aldığı veriler 100khz hızında I2C protokuluyle calışıyor. Ancak IMU 3.3v ile çalışıyor ama devresınde regulator var. Fakat data hattı 3.3volta pull up olsa bile 5volt ile donanımsal olarak Pic okuyamıyor(veri okunurken gelen veri 3.3v olduğu için). Bu yuzden yazılımsal I2C kullandım. Ilk başta sorun kutuphaneden kaynaklı sandım ve protokolu assembler ile yazdım. Çalıştı. Ama bir fark yoktu.
Sonuc olarak yazılımsal I2C ile 100khz hızında iletişim olunca ve bunu aralıksız okuması gerektiği için sistem efektif olamıyor.

RF kumandayı 433mhz modullerle yaptım. Çalışıyor ve binaların olduğu bir sokakta 200m ye kadar sıkıntı olmuyor.  Şöyle olmuyor verici 1250baud ile ayni veriyi 20kez gönderince. Bu da alıcının 20kez usart kesmesine girip gelen 20veriyi kıyaslayıp en az 10tanesi eşitse veri alındı şeklinde programlayinca. Benim bundan kurtulmam lazım en azından 20kez alıcının kesmeye gitmesini istemem. Manchester kod kullanmak istememiştim çunkubuda fazladan görev demekti.

Benim anladığım kadarıyla ya 5voltluk bir imu yada 3.3v pic kullanmam şart gibi.
Buda beni otomatik olarak dsPIC kullanmaya itiyor.
dsPIC ile PIC32 ler hemen hemen aynı fiyata sahip modelleri var.
O zaman yeni sorum;
dsPIC ya da PIC32 mimarisini assembler komut setini ve kaydedicilerini öğrenmem çok zamanımı alır mı? Yaklaşık 3buçuk ay kaldı proje teslimi için.

Assembly için zaten çok farklı bir komut seti kümesi yok , sadece assembler ile ulaşman gereken bank seçimleri  yeni ve farklı registerlara ulaşımlarda farklılık arz edebilir ... Seri iletişimde assembly biraz bezdirici olabilir .. Çünkü , bilginin shift edilmesinden sonra clock pulse'lerin stabil durumlarını hazır komut setleri ile bile karmakarışık kodlamalarla hallediyoruz ayrıca donanımsal olarak halledeceksin herşeyi assembly bana böyle bir projede şahsıma korkutucu geliyor ... 3 ay sürede bu projenin uygulamasına ar-ge'den zaman bulup ne zaman geçersin bilemem ... Yani sadece PID kodunu derleyicide 5.5  ayda yazmış bir adam olarak ben şahsen beceremem ama seni bilemem ...

Burak
Ω Gens Una Sumus Ω

Powered by EzPortal