22 Mart 2022 Salı

Altium ile 74hc595 16 Bit DAC Tasarımı

 Merhaba arkadaşlar daha önceki yazımda size 16 Bit  için teorik olarak Dijital Analog Converter dizaynı yapmıştık  Arduino mikrodenetleyicisi ile kontrol edebildik bugün ise bu tasarımın devre şemasını ve Altium çizimini sizinle paylaşmak istiyorum. 480 Khz sinyal için diffarantiel pair olayına girmedim her bir direnç arasındaki mv cinsinden kaybı yazılım ile tolere edebiliriz. Bu devre kartının malzeme fiyatı  yaklaşık 10 lira günümüzde 16 bit D/A için 10 dolar üzerinde entegre/modül fiyatı bulunuyor.

Çıkışında Low pass filter var 47nF bir kondasatör için 1 Khz de orjinal sinyale çok yakın bir görünüm veriyor yakın bir zamanda kartı sipariş edip testlerini yapacağım. Onun dışında delikli pertinax ile deneysel bir devre tasarımı yaparak deneyebiliriz.

16 Bit Dac üst görünüm 

16 Bit Dac alt görünüm 


20 Mart 2022 Pazar

DAC Nedir ? Entegreleri neden pahalı ? Ucuz Ve Kaliteli DAC Yapalım

Merhaba arkadaşlar, bugün Mikroişlemci ve elektronik dünyasının vazgeçilmez çevrim işlemi olan dijital bir verinin analog olarak çıkış yönteminden bahsedeceğim. 

Günümüz dünyasında haberleşmenin elektronik için önemi büyük basit bir örnek ile açıklayım mikrofondan gelen analog sinyali uzaya taşımak istiyoruz ama bu datayı kimse çözemesin? analog olan bu sinyalin sayısal bir karşılığını kullanarak bu veriyi kripto edebiliriz karşı taraf da bunu tekrar çözüp ses sinyaline çevirmesi gerek. 

Eğer elektroniğe meraklı ve yeni öğrenen biriyseniz çoğu terime yabancılık çektiniz o halde Analog ve dijital sinyalden bahsedelim. 

Ucuz yöntemle kaliteli dac işlemi
DAC akış gösterimi

Analog Sinyal

Fiziksel sistemlerdeki ısı, sıcaklık, basınç, ağırlık, nem oranı, ışık şiddeti, ses şiddeti gibi büyüklükler olarak değişirler nedir bu analog? Bu büyüklükler elektronik ortama aktarmak için bazı enstrümanlar kullanırız mikrofon, sıcaklık sensörü yada bir kamera cihazı; ses, ısı, ışık gibi büyüklükleri genlik, akım, faz açısı veya frekans gibi elektriksel sinyallere çevirirler bu sinyaller anlık olarak düzgün olmazlar çok fazla gürültülü olabilirler iki kablo içerisindeki sinyal birbirine manyetik & endüktif  etkiye sebep olur birbirini bozabilir iyide dijital sinyal de böyle bir problem yok mu? yüksek frekansta çalışıyorsak var tabi şş orası sonra.. :) . 

Analog sinyallerde bir ortamdan başka bir ortama taşınırken elektriksel özellikleri kolay değişebilir, kayıp yaşanabilir  bozuk sinyal işimize pek yaramaz dijital sinyal ise az bozulmaya uğrar kısaca hdmi ile svideo sinyali arasındaki fark gibi püf noktamız bu olsun. 

Analog sinyaller sadece duyulabilir sinyaller olmayabilir eskiden teknoloji bu kadar gelişmiş değildi analog sinyaller kendi aralarında çevrimi yapılıyordu yani modüle edebiliyorduk yada genlik ile oynuyor faz açısını değiştiyor yada filtre ediyorduk ama bu analog in out için biraz mekaşetli ve pahalıydı çok fazla devre elemanı gerekiyordu  eski radyoların içini açın birde şimdiki radyoları boyutları epey küçüldü işte sebebi herşeyin dijital olması bu sinyallerin işlenebilmesi için devre elemanına ihtiyacımız yok. Mesela yeni nesil radyolarda rezanatör devresi bile yok çünkü mikroişlemciler geliştiğinden beri yazılım ile sayısal veriler ile oynamak kolay. Lütfen SDR için bir araştırma yapın ne dediğimi anlayacaksınız:) şimdi dijital sinyali kavrayalım. 


Analog sinyal gösterimi


Analog sinyal, T zaman aralığında [v1, v2, .. vn] kadar gerilim değeri alabilir bu gerilim kümesi iki referans gerilimin arasında zamana bağlı olarak değişir örn 3.567 volt olabilir. 

Az önce farkettiğimiz gibi 3.567 volt bir gerilim değeri ve T zaman aralığında, onlarca değerden bir tanesi, zamanı ne kadar daraltırsak virgülden sonraki sayılar giderek sabitleşir. Analog sinyalin bir frekans oluşundan kaynaklı olmakla frekansın  değişken özellikte olması bu gerilim değerinin zaman içerisindeki değişimi ile doğru orantlıdır. f = 1/T formülü ile T yani zamanın bize frekansı verdiğni anlarız. 

Bu blog yazısı DAC için yüzeysel formüller mantık anlatımı ve resim destekli similasyon çalışması içerir. 

Dijital Sinyal 

Dijital sinyal gösterimi


Yukarıdaki görsel dijital sinyali görüyoruz bu sinyal yani bu veri kümesi elektrikte 1 açık ve 0 kapalı anlamına gelen 2 lik koddan oluşur matematik modellemede binary taban sayısıdır. Dijital sinyal T zaman aralığında, TTL veya CMOS transistör modellemesinde 5.0 veya 3.3 voltdur mesela TLL de' [1:5 Volt 0: 0 volt]  olmak üzere 2 farklı değer alabilir.. 

Örnek, 256 decimal (10luk taban) Binary karşılığı 11111111 olarak kodlanmıştır 256 = 2^8 in karşılığıdır. 
Burada görüleceği üzere 256 Decimal sayısının karşılığı ikilik düzeyde 8 Bit anlamına gelir, her bir bit ikili sayıdan oluşur 1 ve 0 mikroişlemcilerin anlayacağı elektriksel dilin matematik gösterimidir.
 
Örneğin, ilk kez makine diline çevrilmiş meşhur 2 kelimeden oluşan Hello World ikilik koda çevrilirse:
01001000 01100101 01101100 01101100 01101111 00100000 01010111 01101111 01110010 01101100 01100100
Şeklinde olur. Her bir karakter 8 bit uzunluğundadır ASCII kodu olarak tanınır latin alfabesinin 7 bitlik bir karakter kümesidir İlk kez 1963 yılında ANSI tarafından standart olarak sunulmuştur.

Elbette aranızda bilenler vardır binary ikilik kod sistemi yazılım dilinde byte olarak tanınır ve her zaman hex veya decimal karşılığı bulunur 8 bit 1 bayttır matematikte anlatılan taban sistemi olan bu bilgileri lütfen araştırın.. 

İkilik kod, açık ve kapalı şeklinde olup elektrikte kullanabiliyoruz kapı devreleri, sayıcılar, register, flip flop vb transistör devreleri bir araya geldiklerinde veri depolayabilirler toplama, çıkarma veya diğer işlemleri yapabilirler. Matematik işlemini  1 mhz hızda yapabilen bir işlemci 1960 lı yıllarda çalışıyordu tek yapmamız gereken matematik modellerini dijital ortama aktarıp işlemek bir ses sinyali işleme fikrini geliştirmek o yüzden uzun sürmedi zaman geçtikte transistörler arttı ve mikroişlemcilerin işlem kapasitesi ve hızı da arttı şuanda Ghz seviyesinde. 

Şimdiye kadar sadece matematik ve bilgisayar dilinden bahsettik sayısal veriyi anlamış olduk bilgisayarların ve transistörlerin aç ve kapa özelliği ile aritmetik işlemler yapabilen yonga setlerine kısaca mikroişlemcilerin dünyasına teorik olarak göz attık bu yazı epey uzun soluklu olabilirdi henüz işin matematik tarafındayız. 
Fakat bu yonga setlerinin nasıl çalıştığı ram, rom, cpu, io, saat frekansı, timer... Gibi kavramlarını başka bir makalede ele alabiliriz. 

Şekil 2 Dijital Analog sinyal

Analog ve dijital sinyali anladık şimdi ise dijital sinyali nasıl analog sinyale pekala DAC nın ne olduğuna bakmanın tam sırası.. 

Kısaca DAC Nedir ?  

Başlıkta da yazığı gibi yukarda yazılanlardan yola çıkarak Şekil 2'deki sinyal tablosunun  sağdan sola Dijital sinyalin (DACD/AD2A, veya D-to-AAnalog sinyale dönüştürme veya birbirine çevrimi diyebiliriz. Örneğin, MP3 dosyasını insan kulağının anlayacağı şekle yani ses dalgalarına büründürmek gibi.. 

Dijital çıkış verebilen bir mikrodenetleyici ile başlayalım bu çok bildiğiniz Arduino Uno kartı işlemcisi olan Atmega328; seçimi ile bugünkü projede kullanacağız. Donanım konusunda iyi şirketlerin kullandığı Stm32, Arçelik gibi firmaların kullandığı AT80xx işlemciler olabilir ve çoğunun giriş çıkış, hız vb donanım özellikler değişkende olsa amaçları aynı. 

Mikroişlemci ile ürettiğimiz dijital SİNÜS sinyalinin bozulmaya uğramadan osiloskopta görmek için bazı donanımlar kullanmamız gerekir. Bu harici donanımlara genelde DAC entegreleri diyoruz. Bu makaleyi yazmamdaki olay hikayesi, tonlarca DAC anlatımı blog hatta haber siteleri olsa da teknik olarak inceleyip gerçek bir deney ile minumum 3 dolar olan bu entegreleri nasıl 1 dolara imal edebiliriz sorusu ile başladı. 

İşlemci üzerindeki dahili donanımlar gerçek proccessing işlemleri için yeterli değil Arduino gibi bir geliştirme kartı DAC İşlemi için PWM yöntemi kullandığını anladığımızda bu iki noktanın kavramını bu makalede anlayabileceğiz çünkü, DAC için mutlaka harici donanım kullanacağız LPF de dahil. 

Nasıl ? 



Analog değerler zamana göre sürekli (kesintisiz) olduğundan, bütün zaman dilimlerine karşılık gelen bir analog gerilim değeri vardır. Her analog değer için bir dijital değer oluşturmak karmaşık ve maliyetli olacaktır. Bu nedenle analog değer üzerinden belirlenmiş zaman aralıklarında örnekler alınır. Her örnek için seviyesine göre kodlanmış dijital bir değer üretilir.

Referans gerilim değeri bu yüzden vardır -Ref ve +Ref sinyal üretilen analog sinyalin minumun ve maksimum değerini ifade eder.

Şekil 3 DAC matematiksel modeli 


DAC işleminini matematiksel ifadeler ile doğrudan anlayalım  Şekil 3'e bakacak olursak sol taraftaki n kadar bit uzunluğunda dijital binary kodlaması görülüyor. Yukarıda anlattığım gibi örneğin n=16 bit sinyal 65536 farklı değer alabilir (2^n) bu 16 sıralanmış ikilik koddan oluşur.  DAC işleminde gerçek analog sinyale ne kadar çok yaklaşırsak çözünürlük dediğimiz resolution yani n o kadar artar ve sinyali daha kaliteli elde edebiliriz. 

Grafikte okunnduğu gibi, negatif ve pozitif referans değeri arasındaki çözünürlük;

V+ref = 5.0 volt
V-ref = 0 volt
n = 8 bit
Q = (V+ref - V-ref ) / 2^n = (5-0)/256 
Q = 0.01953125 volt
Tablo 1 8 bitlik bir DAC için çıkış değerleri


Her bir adım yaklaşık 0.02 volta karşılık gelmektedir. Kısa bir deyişle 0-5 volt aralığını n=8 bit, 256 adet eşit aralığa bölmüş olduk. İşte kavranması gereken nokta burası çözünürlük n kadar bit değeri ile doğrudan ifade edilmesinin sebebi ref gerilimin adım aralığı ile artıyor.  Tablo 1'de örnek değerler gösterilmiştir.

Vmax değeri maksimum digital kodun (n=8, 256) max referans gerilimin 1 bit aşağısında kalmaktadır.

(256)10 = (11111111)2 sayısı yaklaşık 4.98 volt analog çıkış gerilimi ile ifade edilmektedir. bu hata örnekleme hatası olarak adlandırılmaktadır.

Vmax = 5 volt ve n = 16 bit olduğunda 65536 farklı sayısal kod farklı gerilim değerini ifade eder adım aralığı artmış olur. Dezavantajı çözünürlük maliyet ile doğru orantılıdır günümüzde 16 bit DAC entegreleri minumum 5$ dan aşağı satılmazlar. 

Çıkış gerilimi V(x), ile x burada digital kodun decimal karşılığı anlamına gelir. 
V(256) = x*Q = 256*0.01953 =  4.9800 volt

R-2R Kedi Merdiveni

R-2R yöntemi op-amp ile beraber direncin gerilim bölücü özelliği kullanılarak D/A dönüşümü yapılabilir her bir R-2R direnç bölmesi Şekil 4'deki gibi birbirine seri bağlanarak (n kadar bağlantı, n kadar çözünürlük ifade eder) şekildeki anahtar doğrudan işlemcinin dijital pinine bağlanır bu 4 bit bir D/A çevirici yani;
Vref = 5, 
n = 4, 
Q = 5/2^n 
Q = 0.3125

V(x) = x*Q

16 adımlık dijital çevirici V(x) sinyali, x değerlerinin 16 farklı değeri ile analog sinyali bulabiliriz.  

Şekil 4 Dört bitlik ikilik ağırlıklı direnç D/A çevirici

Bu tip D/A çeviricilerin bir dezavantajı direnç değerleri aralığının ve sayısının farklı olmasıdır. Örneğin sekiz bitlik bir D/A çevirici için sekiz direnç kullanılmalı ve bu dirençlerin değerleri R ile 128R arasında olmalıdır. Direncin, toleransları ve sıcaklığa bağlı olan değişimlerine bağlı olarak sonuç değişeceğinden, kararlılığı düşüktür. 

R direnç değerleri, devrede R = 1k olabilir bu akımı etkiler D/A için gerilim değeri önemlidir ki zaten op-amp  burada akım değerini absorve edecektir.

Vo = -Vref * (8D3 + 4D2 +2D1 +D0) * 1/16
Tablo 2 4 bitlik R-2R D/A çıkış değerleri


Tablo 2 4 bitlik, ikilik ağırlıklı D/A çeviricinin sayısal veriye ait çıkış gerilim değerlerini göstermektedir




LFP (Low Pass Filter) Mantığı 


RC devresi adı geçen, genelde aktif ve pasif olmak üzere LPF olarak kullanılan şekildeki devre örneklerinden çok fazla var, aktif olanlar gerilim kazancı ile filtre edilmiş analog sinyalin gerilim  kaybını önler hatta yükseltebilir. Ses frekans endüstrisinde bass filtresi olarak adı geçtiği için zamanında çok fazlaca kurduğum bir devre, op-amp ile aktif filtre devresi yapılabiliyor  kondasatör seçimi ile giriş sinyalinin filtre edilecek frekansı belirlenebiliyor.

fc = 1/(2.π.R.C)  


 

LPF ile dijital sinyalin analog benzetimi sağlanabilir aşağıdaki şekilde bulunan STM32 den alınmış PWM sinyalin duty oranına göre LPF devresi ekleyerek analog gerilim benzetimi blog şeması gösteriliyor.



İşlemcilerin dijital pinlerinden doğrudan Analog sinyal çıkışı alamayız. PWM çıkışları ise duty cycle değeri ayarlanmış dijital bir sinyaldir ki bu sinyallerde LPF (Low Pass Filter) Devreleri ile analog sinyal değerleri PWM sinyalin duty ayarı ile yaklaşık tahmini yapılıyor fakat tahmin yanı sıra analog çıkış sinyali benzetimi için bu filtre devresini kullanmak gerekli sayılabilir.

Tek başına 2-2R Kedi merdiveni devresinden daha az performanslıdır 8bit 2-2R devresinin çıkışına bu devreden koymak yine yanlış olmaz sinyali analog sinyale yaklaştırmamız harmonikleri engeller ve temiz bir çıkış sağlar. 

Harici Donanım "DAC"


Çok popüler ve ucuz bir entegre devre D/A çevirici MC1408 veya eşdeğeri olan DAC0808 ‘dir. MC1408 standart 16 bacaklı DIP paket olarak gelir ve +5V ’luk Vcc ile minimum -5V, maximum -15V ‘luk VEE gerilimi gerektirir. MC1408’de, bir R/2R merdiven tipi D/A çevirici, akım yükseltecinden gelen referans akımını, 8 ikilik ağırlıklı akıma böler. Bipolar transistör anahtarlar (A1-A8), girişlerindeki ikilik bilgiye göre ikilik ağırlıklı akımları çıkış hattına bağlar. En yüksek değerlikli biti taşıyan girişin A1, en düşük değerlikli taşıyan girişin A8 ile gösterilmiştir. MSB ve LSB etiketlendirilmeleri normal etiketlendirilmenin tersinedir. Bu nedenle kullanılacak bir entegrenin veri sayfası dikkatle incelenmelidir. Şekil 19 MC1408’in blok diyagramını, bacak bağlantısını ve tipik uygulamasını göstermektedir.


I2C, SPI Haberleşmeli D/A 
Mcp4725 DAC Modülü



Örneğin yukarıdaki şekilde MCP4725 bulduğum en ucuz entegre, günümüz dolar kuru (15.00)  ile 29.99  (2$) gibi bir fiyatı var ; 12 bit (4096 örnekleme) olması aslında orta düzey işlerde yeterli çıkışta bir RC filtre ile tadından yenmez ve haberleşme protokolü desteklemesi hız olarak da yeterli özellikle SPI 4 mbit hatta 12 mbit'e kadar hız destekler. 

Onun dışında söylemek istediğim, çoğu entegre kedi merdiveni devresi kullanır pahalı olmasına sebep veren şey entegrenin üretim şekli olabilir. İçerisinde bulunan dirençlerin çok az toleranslı olması çıkış sinyalindeki kaybı aza indirmesi ile doğru orantılı olduğu için iyi bir direnç seçilmesi bu kaliteyi etkileyen bir faktördür.

MAX5891 RC filtre çıkışlı block diagramı 


MAX5891 16-Bit, 600Msps Destekleyen yüksek çözünürlük D/A entegresidir şuanda günümüzde 65 $ civarı fiyatı bulunmakta CMOS seviyesinde çalışmaktadır haberleşme olarak paralel port LVDS destekler 


Ucuz Yöntem



74HC595 Shift Register entegresini çoğunuz biliyorsunuz eminim. Bu entegre digital bir sinyali 8 bit çıkışa ayırır. Ve günümüzde fiyatı 1 lira civarında olması çok iyi alternatif, 2 adet 74hc595 ile 16 bit çözünürlüklü R2R yöntemini kullanarak DAC tasarımı yapacağız. Yukarıdaki görsel bu tasarıma ait yüzeysel block şemayı gösteriyor Mikroişlemci olarak Arduino'dan faydanalabiliriz. Stm32 deki gibi fazla kod gürültüsü ile uğraşmadan temiz bir kod ile amacımız 16 bit çözünürlüklü sinyal oluşturmak. Aynı devre ile 4, 8, 12 ve 16 bit D/A için deneyler yapmak istiyorum. 

Aşağıda D/A devre şemasının tam halini sizinle paylaştım bu şemayı bread-board üzerinde deneyeceğiz. n = 16 bit için toplamda 32 adet direnç kullandık. Hazır entegrelerden kabaca farkı giriş sinyalinin  clock sinyali ile alıyor bu clock sinyalinin maksimum fc frekansını hesaplayıp, hali hazırda devrenin gerçek değerlerini ve toleranslarını hesaba katarak çıkıştaki gerilim kaybını ölçeceğiz. Pahalı olan 16 bit entegre ile sinyal farkını göreceğiz.. MAX5891 Entegresi ile çıkış özelliklerini teorik olarak karşılaştıracağım.




Arduino'ya 2^16 / 96 =  682 adımlı bir kod yazdım bu kod 16 bitlik D/A için 682 adımlık analog gerilim sinyali üretecek proteus'daki ideal opamp -15, +15 besleme gerilimi değerine ayarlandı op-amp besleme geriliminde evirmeyen girişini yükseltiği için ;
V+ref = 15 volt
V-ref = -15 volt
n = 16 bit
Q = (V+ref - V-ref ) / 2^n = (15-(-15))/65536 
Q =  0.000457763672
Burada dikkat etmemiz gereken nokta 65536 adımın 682 adıma düşmesi yazılım ile adım aralığını düşürdüğümüzden dolayı her bir Q değeri aralığı yukardaki grafiğimize göre 0.04394 volt olmalı 

Dönüştürülmüş analog sinyalden kesit
Yukarıdaki (Volt-Time) sinyal grafiğine baktığımda müthiş hissetim adeta yarım dolarlık bir D/A entegresi tasarlamış oldum. İşlemini kabaca anlatabilirim aslında grafik testere uçlu bir sinyali gösteriyor olsa da aklınıza gelebilecek her türlü analog sinyalini üretebiliriz. Ses sinyali de buna dahil olsa da kaliteli bir ses frekansı alabilmemiz için bazı detaylara takılmak gerek PCMXX entegrelerinin neden pahalı olduklarına da hiç şaşmamalı.
Dönüştürülmüş analog sinyal çıktısı







Biraz amatör bir iş yapmış da olsam 16 bit D/A elde etmiş oldum yüksek sıcaklıklarda ve düşük sıcaklıklarda bu devreyi pratikte deneyerek kontrol etmek istiyorum. 

0 ile 65536/96 aralığında decimal dijital sayının 0 - (-15) volt aralığındaki dönüştürülmüş gerilim grafiğini clock, data, latch sinyali ile birlikte göstermektedir. Bir üstteki sinyal grafiği zoomlanmış hali olanı gösteriyor bariz farkla dijital kodun shift register aracılığı ile her latch ediltikten sonra sinyalin referans sinyale bölünmüş oranını aynı şekilde gösteriyor. Kabaca 0, -15 volt gerilimi  65536/96 oranında bölmektedir.

Bir problem var !

f = 1/T 
fc = 16Mhz = 62.5 ns

Ts - Ti = 249.143 - 249.368 
Ts- Ti = 0.225 ms 

=  225us 
f = 1/225us  = 4.444 Khz

Hesapladığımız zaman 62.5 ns mikroişlemcinin (Arduino UNO Atmega 328) saat darbe frekansı yani zaman aşımı süresi. 
 
Proteus similasyon aracında (ideal ortam) Arduino ile 74hc595 için haberleşme hızını 225 us zaman aşımı süresi ölçtüm. Ölü zaman aralığı olduğundan; çıkıştaki analog sinyal bu süre boyunca bir önceki durumu ile değerini çıkışta korur zaten arada op-amp devresi buffer olarak çalıştığı için sürekli olan sinyalde kopmalar olmaz register bir sonraki data için durumunu koruyor. 
Mesele şu ki 4.44 Khz Bant genişliğimiz bulunmakta bir ses örneklemesi 44.1 Khz bant genişliğinde çalışır yani bu değerin 10 katı. 74hc595 ile haberleşme süresi Arduino'nun çıkış zaman aralığı ile bağlantılıdır. Yazılımda shiftOut fonksiyonunu kullandık Arduino kütüphanesinin hazır bir fonksiyonu olmasından dolayı aşımını değiştirmek için kodu yeniden düzeltmemiz gerekiyor. Bildiğim kadarıyla ardunio dijital pin çıkışı frekansı 8 Mhz kadar destekleyebilir. 16 Bit ses sinyali işlemek için bir yöntem olması gerek yoksa bir işe yaramaz tabiki en azından ses üzerinden örnek verdiysem de sinyalin 4.4 Khz ile sınırlı kalmaması gerek.

74HC'nin datasheet incelemesinde giriş ile çıkış arasındaki zaman aşımı 1us yani 1 Mhz hızına kadar çalışabiliyor.  Buda bir ses frekansı işlemek için çok çok yeterli. Hatta bir video sinyali bile işleyebiliriz.!!

Çözüm: SPI Donanımı ile haberleşmek

Diğer çoğu d/a entegrelerinde olduğu gibi donanım yüksek frekansta haberleştiği için bant genişliği yeterli. 

Arduino forum sayfasında 74x595 için digitalWrite komutu haricinde maksimum 32 Khz civarı bir hıza ulaşıldığı tartışılmış, bu fonksiyon komutunun dışında bir kod ile sağlanmış shiftOut fonksiyonu da aynı şekilde digitalWrite fonksiyonunu kullanıyor buda hızı sınırlıyor.

f = 1/T 

Ts - Ti = 77.28520 - 77.28280
Ts- Ti = 0.0024 ms 

=  2.4us 
f = 1/2.4us  = 450 Khz

#digitalwrite speed
t = 4.64us 

Sonunda SPI ile 450 Khz haberleşme hızına ulaştım. Müthişşş!!!
16bit Latch Clock, Data dijital port çıkış grafiği

Grafikte en üstteki latch sinyali dijitalWrite komutu yavaş olduğundan spi data gönderme işlemi bittiği halde zaman kaybı yaratıyor az da değil 4.64us o yüzden Arduino kodu dışında farklı bir yöntemle latch yapmamız gerekiyor. Belki Ardinonun frameworkü bu bakımdan tercih edilmeyebilir.. 

Stm32 için özür dileyebilirim bir kaç sigorta ayarı, spi ile sağlam bir iş çıkartabilirmişiz. Cortex M ile awr ailesi tartışmamalı.. :)

  digitalWrite(pin_latch, LOW);
  SPI.transfer16(val); 
  digitalWrite(pin_latch, HIGH);


Final: Çıkışa LPF Ekleyelim 

Sonuca ulaştığımıza göre gözle göremeyecek kadar küçük bir sinyal olmasına karşın eğer çıkış frekansımız belli ise de çıkışta bir LPF kullanabiliriz neden olmasın. Genelde aktif LPF kulladığımdan bu projede de bir opamp olmasından dolayı sadece 1 kondasatör bu işi çözebilir mi ? evet bence çözebilir.. 

        
Aktif LPF Op-amp 


1/2πR37C1 frekans hesabı ile 500 Hz altıdaki sinyale 47nF kondasatör ekleyelim..




Low Pass Filter eklenmiş sinyal görüntüsü

Bakın bakın sinyalin analog sinyale ne kadar yakınlaştığına bakın ve böylelikle teorik olarak projeyi tamamladık bir sonraki yazıda bu projenin deneyini yapacağım elimdeki osiloskop bu iş için gayet yeterli diyede düşünüyorum.. Teşekkürler.




  • Arduino kodunu aşağıda bulabilirsiniz.
#include <SPI.h>
#define sbi(port, bit) (port) |= (1 << (bit))
#define cbi(port, bit) (port) &= ~(1 << (bit))

int pin_latch = 10,
    pin_clock = 13,
    pin_data  = 11;

void setup() {
  // put your setup code here, to run once:
  pinMode(pin_latch ,OUTPUT);
  pinMode(pin_clock, OUTPUT);
  pinMode(pin_data, OUTPUT);
  
  //SPI.setClockDivider(SPI_CLOCK_DIV2);
  SPI.setBitOrder(MSBFIRST);
  SPI.setDataMode(SPI_MODE0);
  SPI.begin();

  
}

void loop() {
  // put your main code here, to run repeatedly:
  for(int i = 0; i< 65536; i=i+1){
    shift_out(i);
    delay(1);
  }
}

void shift_out(int val){
   /*digitalWrite(pin_latch, LOW);
   shiftOut(pin_data, pin_clock, MSBFIRST, val>>8);
   shiftOut(pin_data, pin_clock, MSBFIRST, val);
   digitalWrite(pin_latch, HIGH);*/


  //digitalWrite(pin_latch, LOW);
  cbi(PORTB, 2);
  SPI.transfer16(val); 
  sbi(PORTB, 2);
  //digitalWrite(pin_latch, HIGH);
   
}

Deney yazım yakında..


Referanslar

https://www.youtube.com/watch?v=gYmY3izes8g
http://ee.tek.firat.edu.tr/sites/ee.tek.firat.edu.tr/files/LJ1B5_%20ADC_DAC_2.pdf


23 Kasım 2021 Salı

STM32 Geliştirme Kartı Tasarladım Flytrack V1.0

     Merhaba arkadaşlar, uzun zamandır yoktum evet buraları işden dolayı biraz ihmal ettim farkındayım takipçilerimden bir özür borcum var..

Evet bomba gibi bir projeyle geldim flytrack adı olduğu gibi iş yapan uçuş takibinde inanılmaz fırsatlar sunan küçük bir geliştirme kartı tasarladım yakın zamanda yazılımı ile beraber günceleyeceğim bu kartı aslında kendim için yaptım diyebilirim.

Biliyorsunuz ara sıra yamaç paraşütü yapıyorum gittiğimiz yerlerde termik vs yakayabilmemiz ve rüzgarı değerlendirebileceğimiz aygıtlara ihtiyacımız oluyor genelde cep telefonundan rüzgar hızını ve yönünü tayin etsemde sadece uçuşta bu yeterli olmuyor, uçuş yaparken irtifayı, katettiğiniz yolu, mesafeyi Yükseliş hızını(m/sn) öğrenmek istiyorsunuz piyasada bu tarz cihazlar elbette var örneğin en pöpüleri FLYMASTER bu cihazın özellikleri tabi ki saymakla bitmez.

flymaster


    Çok hassas sensöre sahip ve tepkileri hızlı.. Ayrıca ekranda uçuşunuz son 2 dakikalık grafiğini görebiliyorsunuz. 3 adet altimetresi var. Kapsamlı ve kolay bir menüsü var; Kişisel tercihinize göre birçok ayar yapabiliyorsunuz.

Flymaster variometre’de ‘‘next to climb indicator’’ özelliği var. Bunu; termik gösterici olarak çevirebiliriz. Ama bu görsel değil sesli bir uyarı. Normal variometrelerde ki tırmanırken (termik sırasında ısınan hava yükselirken kaldırıcı etkisini kullanarak pasif uçuş araçlarının yükselmesi) çıkan bip-bip, çöküşteki biiiip sesine ilave olarak cihazda üçüncü bir ton olarak bırr sesi var.  Termik yakınlarında iken ve termikten düşerken uyarı veriyor.

Bu uyarı uçuş sırasında manzarayı seyrederken aslında insan hisleri ile anlayabilsekte yükselmyi kaçırdığımız da oluyor bu tip cihazlar size saniyenin daha da altında tepkileri görmenizi sağlıyor.



    Ben de bu cihazdan esinlenerek ayrıca ısparta'daki uçuş ekibimin de tavsiyeleri üzerine böyle bir geliştirme kartı yapmayı istedim ve tasarladım biraz zamanımı aldı ama olsun. Altium Designer ile tasarladığım bu kartın resmini göstermeden önce  sizlere biraz içeriğinden bahsedeyim.

Yukarda ki anlattığım variometer cihazını aynı teknoloji yapısını kullanarak şema tasarlıyoruz evet bu şema da dikkat edeceğimiz en uç nokta GPS sensörü bu sensörü elime geçen bir cihazın içerisinden almayı düşündüm yani olay şu şekilde gelişti..

Uzun zamandır vario-meter yapmayı düşünürken bu adımı atmama Ankara'ya gelen samet abim vesile oldu (sağolsun) o da yakın zamanda suya düşen bir variometer'in çalıştırıp çalıştıramayacağım hakkında sorular sorarken, dedim ki kral; "tuzlu suya düşen bir cihazın pil takılıyken kısa devreler sonucu bozulan parçalar diğer ünitelere de zamanla zarar veriyor belirli bir zaman sonra da korozyon oluşuyor yani senin cihaz çöp ben yinede bir inceleyim" cihazı alıp inceledim baktım olmayacak çalışma prensibine takıldım.. Biliyoruz fakat yahu bu adamlar bu cihazda ne kullanmış diye inceliyorsun zaman zaman ve aşağıdaki IC'leri kulandığını görünce aslında çokta bir olayı yokmuş arkadaş diyebiliyorsun.

fastrax GPS modülü

    Yukarıda ki gördüğünüz gps moodülü bu cihazın içerisindeydi tabi kurtarılacak pek bir yanı yoktu piyasdaki araştırdığımız modülleri görünce de tabi ki doların yükselmesi de cabası olunca biraz duraksıyorsunuz. Normalde pahalı olan bu sensörler (hassasiyete göre  50-600$ ) biraz araştırınca 90Tl ye Neo 6m gps sensörünü piyasada oldukça iyi satılan vee biraz da düşük güç tüketimi sağlayan bir modül olduğunu gördüm ve kullanamaya karar verdim.

bizim kullandığımız Neo 6M



MCU

    Yukarıdaki resim ise aynı cihazın mikro işlemcisi çok bi absürt özelliği yok 8 bit işlemci, zaten bu cihazın sensör tepkisi ve sesli uyarısı daha ön planda, termiğe kesildiğiniz dikkatinizden dolayı  Lcd ekrandaki verilere aşina olamıyorsunuz. Demem o ki MCU tarafında display sürmek için ikinci bir Lcd Driver entegresine ihtiyacımız doğuyor burada haberleşmeyi de o ic ile sağlıyoruz evet grafik lcd de gerekli hesaplamalar için vakit kaybetmeden display verilerini SPI ile Lcd drivere gönderiyoruz aynı mantıkla cihazın içerisinde IF0847 engtegresi kullanılmış.. 

Şu aralar STM32 M3 Cortex işlemci ile kodlama yapıyorum baktım ki normalde ucuz bir işlemci ülkemizdeki iyi rağbet görüyor geliştirme kartları diğerlerine göre ucuz felan Stm32f103RB işlemcisini kullanmaya karar verdim.

Gelelim en can özelliğimiz olan IMU yani ne demek IMU ? 

Accelerometer

Accelerometerlar üzerlerine düşen statik(yerçekimi) veya dinamik (aniden hızlanma veya durma) ivmeyi ölçmektedirler. Sensörden aldığımız değer m/s2 veya yer çekimi (g-Force) türünden ifade edilebilir. Uygulamalarda genelde yerçekimi türünden ifade edilmektedir. Eğer uzayda veya herhangi bir çekim alanının kapsamında değilseniz sensör üzerine 1g lik bir yerçekimi kuvveti etki etmektedir. 

Buda hepinizin bildiği gibi yaklaşık olarak 9.8m/s2 dir ve dünyadaki bulunduğunuz noktaya göre değişiklik göstermektedir. Sensör sürekli olarak yer çekimi etkisi altında kaldığından eğim ölçer (örneğin cep telefonlarında olduğu gibi ) siz telefonu dikey veya yatay konuma getirdiğinizde telefonun ekranı hareketinize göre değişmektedir) veya hareket algılayıcı olarak kullanılabilmektedir hepimiz az çok kullansakta teknolijisini ve ismini ilk defa duyuyor olabilirsiniz. 

Ölçü skalası olarak ± 1g, ± 2g, ± 4g ... gibi değerler ile ifade edilmektedir ve bir, iki ve üç eksende ölçüm yapabilen türevleri vardır. Şimdi bu sensörlerin nasıl çalıştığına bakalım.

Şimdi uzayda olduğunuzu düşünün. Herhangi bir çekim etkisi yok ve ağırlığınız 0'dır. Önünüzde de aşağıdaki şekildeki gibi bir kutu, kutunun ortasında da bir küre olduğunu hayal edin. Herhangi bir çekim etkisi olmadığından küre herhangi bir yüzeye temas etmeden hareketsiz bir şekilde durmaktadır. 

Kürenin hareketini görebilmek için kutunun +Y yönünde kalan yüzeyini de kesip atalım.

Kutuyu elinizde tutup +X yönünde 1g kuvveti ile hızlandırdığımızda küre kutunun –X yüzeyine eylemsizlikten dolayı 1g lik bir kuvvet uygulayacaktır.


Şimdi kutumuzu alıp dünyaya dönelim. Kutuyu yere koyduğumuzda dünyamızın 1g lik yer çekimi kuvvetinden dolayı küre –Z yüzeyine 1g kuvvet uygular.

İvmeölçerlerde benzer bir şekilde çalışmaktadır. 

Yüzeyleri basınca ( piezoelektrik vb) manyetik alana tepki verecek şekilde yapılmaktadır ve ivmeölçerde bu tepkiyi ölçerek bize bir değer vermektedir. Sensörün yer yüzü ile yaptığı açı değiştiğinde sensörün eksenlerine uygulanan kuvvette değişecektir ve bizde yeni değerleri okuyarak yeryüzü ile yaptığımız açıyı trigonometri yardımıyla hesaplarız. Örneğin kutumuzu 45 derece sağa doğru çevirdiğimizi düşünelim. Bu durumda kürenin –X ve –Z yüzeylerine √(0.5)'lik bir kuvvet uygulanır oda 0,707g ye eşittir.

Şimdi kutu modelinden koordinat sistemi modeline geçelim ve aşağıdaki şekli inceleyelim.

 


Burada R vektörü ivmeölçerimiz üzerine düşen kuvvet vektörü olsun. Bu kuvvet yukarda anlattığımız gibi yerçekimi veya sensörün hareketi sonucu yerçekimi kuvveti ile eylemsizlik kuvvetinin bileşkesi olabilir. R vektörünün 3 bileşeni vardır ve R=[Rx,Ry,Rz] olarak ifade edilmektedir. Pisagor teoreminden R vektörünü bu bileşenlerden aşağıdaki gibi hesaplayabiliriz.

R^2 = Rx^2 + Ry^2 + Rz^2

Rx, Ry ve Rz bileşenlerini bildiğimiz taktirde yukarıdaki şekilden görüldüğü gibi trigonometrik fonksiyonlar yardımı ile R vektörünün X ve Y eksenleri ile yaptığı açıları hesaplayıp sensörümüzün yeryüzüne göre konumunu bulabiliriz. R vektörünün bileşenlerinide bize ivme ölçer g kuvveti türünden vermektedir. Şimdi bir örnek yapıp konuyu anlayalım.

Analog sensör kullandığımızı, besleme gerilimimizin 3v3 olduğunu ve 10 bitlik bir ADC kullandığımızı varsayalım. Accelerometerdan ADC yardımı ile aşağıdaki binary değerleri okuduğumuzu varsayalım. Bu değerler ile işlem yapabilmek için g türünden ifade edebilmemiz gerekmektedir. Bunun içinde ADC den okuduğumuz değerleri voltaj türünden ifade etmeli ve kullandığımız sensörün datasheetinden faydalanarak bu voltaj değerlerini g kuvveti türünden ifade etmemiz gerekmektedir. Böylece elde ettiğimiz değerleri trigonometrik fonksiyonlar ile açıya çevirebiliriz.

AdcRx = 586
AdcRy = 630
AdcRz = 561

Bu değerler ham binary değelerdir ve volt türünden ifade edebilmek için LSB başına düşen gerilim miktarı ile çarpmamız gerekmektedir. Besleme 3V3 olduğundan ve 10bit ADC kullandığımızdan yukarıdaki değerleri 3.3V/ 2^10 ile çarparsak volt değerlerini elde ederiz.

VoltsRx = 586 * 3.3V / 1023 =~ 1.89V
VoltsRy = 630 * 3.3V / 1023 =~ 2.03V
VoltsRz = 561 * 3.3V / 1023 =~ 1.81V

Bu değerleride g türünde ifade etmemiz gerekmektedir. Her ivmeölçerin 0g de vermiş olduğu bir gerilim değeri vardır ve Zero-G değeri olarak isimlendirilmektedir. Bu değer genelde Vdd/2 dir (bizim örneğimizde 3.3/2=1.65V. 

BMI160 Sensörü için zero-g offset değerleri kendi içerisinde çözümlendiği için digital değerleri alacağız.

Kullandığınız sensörün datasheetinden bakabilirsiniz. Yukarıdaki voltaj değerlerinden bu değeri çıkartıp sensörün hassasiyeti ile çarparsak hangi eksene ne kadar kuvvet uygulandığını bulabiliriz. Sensör hassasiyetide 0.4785V/g olsun. O halde tam denklemimiz aşağıdaki gibi olur ve yukarıdaki değerleri denklemde yerine koyarsak eksenlere uygulanan kuvvetleri bulabiliriz.

Rx = (AdcRx * Vref / 1023 - VzeroG) / Sensitivity = (586 * 3.3V / 1023 – 1.65V) / 0.4785V/g =~ 0.5g
Ry = (AdcRy * Vref / 1023 - VzeroG) / Sensitivity = (630 * 3.3V / 1023 – 1.65V) / 0.4785V/g =~ 0.79g
Rz = (AdcRz * Vref / 1023 - VzeroG) / Sensitivity = (561 * 3.3V / 1023 – 1.65V) / 0.4785V/g =~ 0.33g



Şimdi yukarıdaki şekilde gösterilen R vektörünün X ve Y eksenleri ile yaptığı açıları hesaplayalım. Şekilde görülen Axr açısının cosinüsü bize Rx/R değerini vermektedir. Rx ve R değerleri bilindiğine göre arccosinüs ile Axr açısını elde edebiliriz. Benzer şekilde Ayr açısını hesaplayabiliriz. R vektörünüde yukarıdaki birinci eşitlikten hesaplayıp aşağıdaki arccos fonksiyonlarına değerleri koyduğumuzda istediğimiz açıları almış oluruz.


cos(Axr) = Rx / R , Axr = arccos(Rx/R)
cos(Ayr) = Ry / R , Ayr = arccos(Ry/R)
cos(Azr) = Rz / R , Azr = arccos(Rz/R)
 

Gyroscopes

Gyroscopelar basitçe bir tekerleğin ekseni etrafında hızlıca döndürülmesi sonucu ortaya çıkarlar. Tekerleğin etrafındaki çembere dik açıyla kenetlenmiş başka bir çember ve bu çemberlere dik açıyla tutturulmuş başka bir çember jiroskobu modeller. Jiroskobun öne çıkan iki özelliği vardır. Yatay eksende dönmekte olan bir jiroskopa yatay eksen doğrultusunda bir kuvvet uyguladığımızda yatay eksen etrafında dönmek yerine eksen etrafında dönmeye başlar. 

Diğer bir özelliği ise jiroskopun dönmeye başladığı eksenin jiroskobun durduğu yüzey ne açıyla oynatılırsa oynatılsın jiroskobun dönüş ekseni sabit kalır. Bu özelliğinden dolayı uyduların sürekli olarak dünyaya dönük kalması, uçaklarda ve çeşitli araçlarda yapay ufuk oluşturulması ve otopilot gibi uygulamalarda kullanılmaktadır.

Aşağıdaki videodan anlattığım bu özellikleri görsel olarak izleyebilirsiniz.



Biz kendi variometremizi yaparken,  bir şeyin bir eksen etrafında ne kadar hızla döndüğünü başka bir deyişle açısal hızını öğrenmek için kullanıyoruz ama mekanik olan görevi entegre sisteme dökümledikleri için bu verileri mekanik olmayan entegremiz yani BMI180 den alacağız.  

(Burası önemli) İvmeölçerlerde olduğu gibi bir, iki veya üç eksende ölçüm yapabilen modelleri vardır (BMI180 IMU 6 Axex) ve saniyedeki dönüş hızı ölçümüne göre değerlendirilmektedirler. Bu hızların üzerindeki dönüşler sonucu sensör çıkışları anlamsız olabilmektedir. Uygulamanızda kullanacağınız sensörü bu özellikler ve hassasiyetine bakarak alabilirsiniz. 

Şimdi IMU başlığında ivme ölçer ve gyroyu beraber kullanacağımızdan tekrar ivme ölçer konusunda kullandığımız koordinat sistemlerine dönelim ve sensörlerin bu modele göre nasıl kullanılabileceğine bakalım.


İki eksen (X,Y) gyro kullandığımızı düşünerek devam edelim. Buradaki R vektörünün XZ uzayındaki izdüşümü Rxz, YZ uzayındaki izdüşümü ise Ryz vektörü ile ifade edilmektedir.Bu vektörleri pisagor teoreminden


Rxz^2 = Rx^2 + Rz^2
Ryz^2 = Ry^2 + Rz^2 olarak hesaplayabiliriz.

Vektörlerin Z ekseni ile yapmış olduğu açılar ise Axz ve Ayz dir. Sistemi Y ekseni etrafında döndürdüğümüzde Axy açısı, X ekseni etrafında döndürdüğümüzde ise Ayz açısı değişecektir. Gyroscope un dönüş hızını ölçtüğünü söylemiştik. Dönüş hızını zaman ile çarparsak dönüş açısını elde etmiş oluruz. t0 anındaki açımızın Axz0 olduğunu ve t1 anındaki açımızın ise Axz1 olduğunu düşünelim. O halde dönüş açımız

(Axz1 – Axz0) = RateAxz * (t1 – t0) ile ifade edilir.

Sensörden alacağımız değerleri dönüş hızına çevirmek içinse aşağıdaki formülleri kullanabiliriz.

RateAxz = (AdcGyroXZ * Vref / 1023 – VzeroRate) / Sensitivity
RateAyz = (AdcGyroYZ * Vref / 1023 – VzeroRate) / Sensitivity

Yine analog sensör kullandığımızı, 3v3 ile çalıştığımızı ve 10bit adc ile örnekleme yaptığımızı düşünelim. Sensörlerin hareketsiz durumda sabit olarak vermiş olduğu bir gerilim vardır ve VzeroRate olarak isimlendirilir. Bu gerilimi binary değerden elde ettiğimiz gerilimden çıkartmamız gerekmektedir.Örneğimiz için 1.23V olduğunu düşünelim. Sensör hassasiyetimiz ise volt başına 0.002 deg/s olsun. Bu değerleri kullanacağınız sensörün datasheetinden elde edebilirsiniz. gyroX ten 571 gyroY den 323 binary değerini okuduğumuzu düşünelim. Tüm bu değerleri yerine koyduğumuzda dönüş hızlarını aşağıdaki gibi buluruz.

RateAxz = (571 * 3.3V / 1023 – 1.23V) / ( 0.002V/deg/s) =~ 306 deg/s
RateAyz = (323 * 3.3V / 1023 – 1.23V) / ( 0.002V/deg/s) =~ -94 deg/s

Elde ettiğimiz değerler görüldüğü gibi açısal hızlardır. Bu değerleride iki örnekleme arasında geçen süre ile çarparsak dönüş açımızı elde ederiz. Örneğin 1ms de örnekleme yaptığımızı farz edersek X için dönüş açısı 0.306 derece, Y için dönüş açısı -0.094 derece olacaktır.

Yukarıda ki teorik bilgiler bir örnekleme olarak düşündüğümüzde bizim verileri alacağımız sensör I2C haberleşmesi sayesinde 

IMU (Inertial Measurement Unit)

Gyroscope ve accelerometer tek başlarına bize yeterince ve güvenli bilgi vermezler. Bu yüzden bu iki sensörü birleştirerek yönelim, hız, pozisyon gibi bilgileri tek bir uniteden alabiliriz. Bu uniteye IMU (Inertial Measurement Unit) denilmektedir. Serbestlik derecesi DOF (Degrees of Freedom) ile ifade edilmektedirler. Örneğin 2 eksen gyro ve 3 eksen ivmeölçeriniz varsa 5DOF IMU elde etmiş olursunuz.

Gyro ve accelerometer bias drift adı verilen bir kayma yaparlar ve bundan dolayı hassas açı ölçümünde tek başlarına kullanılamazlar. Ayrıca accelerometerlar kuvvete karşı çok duyarlı olduğundan en ufak titreşimlerde çok yüksek gürültüler oluşturmaktadırlar.Gyroların bu kuvvetlerden etkilenmediğini söylemiştik. Aşağıdaki şekilde görüldüğü gibi gyrolar ivmeölçer çıkışlarını filitreleyerek daha doğru bir ölçüm yapmamızı sağlarlar.

acc/imu

Filtreleme için çeşitli algoritmalar bulunmaktadır. En yaygın olarak kullanılanlarından birtanesi kalman filitresidir. Sistemin bir önceki çıkışları ile yeni ölçümlerinden yeni çıkışları tahmin edecek şekilde çalışmaktadır.Kalman filitresinin etkisini videodan izleyebilrisiniz.


Şimdi kalman filtresine benzeyen bir örnek ile devam edelim. Bu örneğin kalman filtresinden eksiği örneğin sonunda göreceğiniz ağırlıklı ortalamanın sabit olması, kalman filtresinde ise çıkışlara göre tekrar hesaplanıp dinamik olarak kullanılmasıdır.

Başlamak için accelerometer ve gyro koordinat sistemlerini birleştirmemiz gerekmektedir. Bunun için accelerometer koordinat sistemini referans olarak seçmeli ve sensörlerin XZ ile YZ düzlemlerini çakıştırmamız gerekmektedir. Bu işlemleri yaptıktan sonra ivmeölçer verilerini filtremiz için direk giriş olarak kullanacağız. Be verilerin aşağıdaki formül ile hesaplandığını hatırlayalım.

RxAcc = (AdcRx * Vref / 1023 – VzeroG) / Sensitivity
RyAcc = (AdcRy * Vref / 1023 – VzeroG) / Sensitivity
RzAcc = (AdcRz * Vref / 1023 – VzeroG) / Sensitivity

İvmelenme (hızlanma, yavaşlama) gibi durumlarda sensör üzerine etkiyen kuvvet 1g den büyük veya küçük olabilmektedir. İşlem yapabilmek için önce R vektörünü normalize etmemiz gerekmektedir. Bunun için aşağıdaki işlemleri kullanabiliriz. Bunlar R vektörünün herzaman 1g ye eşit olmasını sağlayacaktır.

|Racc| = SQRT(RxAcc^2 +RyAcc^2 + RzAcc^2)
Racc(normalized) = [RxAcc/|Racc| , RyAcc/|Racc| , RzAcc/|Racc|]

Şimdi filtre çıkışından tahmin edilen Rest = [RxEst,RyEst,RzEst] vektörümüz olsun. Yapacağımız iş accelerometer çıkışlarını okuyup gyro çıkışları ile gerçekten bir dönüş hareketi yapıyormuyuz diye karşılaştırmaktır. Bunun için t0 anında Rest(0) = Racc(0) vektörlerini birbirine eşitlememiz gerekmektedir.Daha sonra T aralıkları ile düzenli örnekler alıp yeni örnek ile önceki çıkışları işleme sokmamız gerekmektedir.Hesaplamalara gyro ile başlayalım ve vektörünü Rgyro = [RxGyro,RyGyro,RzGyro] olarak ifade edelim.



Şekilde görülen Axz açısını tan(Axz) = Rx/Rz => Axz = atan2(Rx,Rz) ile hesaplarız. Burada atan2 fonksiyonu bize açı değerini –PI ile PI aralığında verecektir. RxEst(n-1) , ve RzEst(n-1) değerlerini bildiğimiz için bir önceki Axz açısı olan Axz(n-1) şöyle hesaplayabiliriz.

Axz(n-1) = atan2( RxEst(n-1) , RzEst(n-1) )

Gyro Axz açısının değişim hızını ölçtüğünden yeni Axz açısını Axz(n) = Axz(n-1) + RateAxz(n) * T şeklinde hesaplayabiliriz. İfade kolaylığı açısından |Rgyro| = 1 x =RxGyro , y=RyGyro, z=RzGyro yazalım.

x = x / 1 = x / SQRT(x^2+y^2+z^2) eşitliğinde payı ve paydayı SQRT(x^2 + z^2)e bölelim. Yeni sonucumuz

x = ( x / SQRT(x^2 + z^2) ) / SQRT( (x^2 + y^2 + z^2) / (x^2 + z^2) ) şeklinde olacaktır. x / SQRT(x^2 + z^2) = sin(Axz) olduğundan

x = sin(Axz) / SQRT (1 + y^2 / (x^2 + z^2) ) yazabiliriz. Şimdi kökün içindeki pay ve paydayı z^2 ile çarpalım.

x = sin(Axz) / SQRT (1 + y^2 * z ^2 / (z^2 * (x^2 + z^2)) )  elde ederiz. z / SQRT(x^2 + z^2) = cos(Axz) ve y / z = tan(Ayz) olduğundan

RxGyro = sin(Axz(n)) / SQRT (1 + cos(Axz(n))^2 * tan(Ayz(n))^2 )
RyGyro = sin(Ayz(n)) / SQRT (1 + cos(Ayz(n))^2 * tan(Axz(n))^2 ) şeklinde elde ederiz. gyroZ ise
RzGyro = Sign(RzGyro)*SQRT(1 – RxGyro^2 – RyGyro^2) şeklindedir. Burada RzGyro>=0 olduğunda Sign(RzGyro) = 1 , ve RzGyro<0 olduğunda Sign(RzGyro) = -1 olur. Ayrıca Rz Axz ve Ayz açılarını hesaplamada kullanıldığından 0 a yaklaştığında istenmeyen sonuçlar elde edilebilir. Bu durumda bir önceki çıkışları yeni gyro ölçümü olarak alabiliriz. Şimdi elimizde Racc ve Rest(n-1) vektöründen elde ettiğimiz Rgyro vektörleri olduğuna göre Rest(n) vektörünü hesaplayalım. Bunun için ağırlıklı ortalama alacağız.

Rest(n) = (Racc * w1 + Rgyro * w2 ) / (w1 + w2)

Formülde pay ve paydayı w1 ile bölüp w2/w1 = wGyro yazarsak

Rest(n) = (Racc + Rgyro * wGyro ) / (1 + wGyro) denklemini elde ederiz. Burada wGyro accelerometera oranla gyroya ne kadar güvenebileceğimizi belirtmektedir. Starlino 5-20 arası değerlerin deneysel olarak iyi sonuç verdiğini yazmış. Rest vektörünüde normalize ederek açı hesaplamasında kullanabiliriz.

R = SQRT(RxEst(n) ^2 + RyEst(n)^2 + RzEst(n)^2 )
RxEst(n) = RxEst(n)/R
RyEst(n) = RyEst(n)/R
RzEst(n) = RzEst(n)/R
 

Yukarıdaki algoritmada wGyro değeri sabit bir değerdir fakat Kalman filtresinde bu değer accelerometer gürültüsü analiz edilerek yeniden hesaplanmaktadır. Kalman filitresi sistemin sürekli değişen girişlerini izleyerek bir sonraki çıkışın en iyi değerini tahmin etmektedir.Görüntü işlemeden, yönelim, hareket takibi gibi bir çok alanda kullanılmaktadır.



GPS & IMU

İşte final başlığımızın altındayı burada görmenizi isteyeceğim çok şey var vakit kaybetmeden anlamaya ve açıklamaya başlayalım kodlamada en önemli Mühendislik hesabı aslında bu ikisi diğerleri  Sıcaklık sensöründen veri almaya benzeyebilir devam ediyoruz..

BAROMETER



Altium Tasarımına Geçelim



Çalışma Videousu



5 Temmuz 2021 Pazartesi

Yapay Zeka: Gelin birlikte anlayalım

Lisans tezimden yola çıkarak bu yazıyı yazmak istedim yapay zekanın günümüz teknolojisinde ne kadar önemli bir detaya sahip olduğunu yakından inceleyecek hatta bazı durunmlarda ciddiyete kapılır endişe duyacağız.(şaka biraz gerilim iyidir) bende sizler gibi yapay zekayı anlayarak aslında ne olduğunu kavramak istediğim ve projemin ilerleyen safhalarında kullandığım metaryellere kadar size açıklıyorum buyrun okumaya devam.

Yapay Zeka çalışmalarının genel amacı, insan beyninin çalışma mantığının modellenerek, söz konusu modeller vasıtasıyla bilimin her safhasında çığır açacak gelişmelere imza atmaktır. Slage‟ye göre yapay zeka; sezgisel programlama temelinde olan bir yaklaşım olup, “Yapay zeka insanların yaptıklarını bilgisayarlara yaptırabilme çalışmasıdır.” Geneserth ve Nilsson‟a göre yapay zeka, “Akıllı davranış üzerine bir çalışmadır. 

Ana hedefi, doğadaki varlıkların akıllı davranışlarını yapay olarak üretmeyi amaçlayan bir kuram oluşturmasıdır.” Tesler‟e göre ise “şu ana kadar yapılmayanlardır.” Axe göre yapay zeka; “akıllı programların hedefleyen bir bilimdir. Bu programlar aşağıdakileri yapabilmektedir; 1. İnsanın düşüncesini taklit ederek karmaşık problemleri çözebilmek. 2. Yorumlarını açıklayabilmek, yani bir durum karşısında kişiye yanıt verebilmek 3. Öğrenerek uzmanlığını geliştirmek ve eski bilgileri tabanını genişletmektir. 




Yapay Zeka da Bilginin Kullanılışı 

Bilgisayarların, insan zekasının yapabildiği gibi henüz tecrübeleri yada çalışıp öğrenme yetenekleri olmamasına rağmen uzmanlar kullanabilirler. Bu tür bilgiler, olaylar, anlayışlar problem çözme yada karar vermede uygulanabilir olması için düzenlenmiş ve analiz edilmiş bilgidir. Bir yapay zeka sisteminde kullanılacak olan bir problemle ilgili bilgilerin kümesine bilgi tabanı denir.


Akıllı ev sistemleri, yapay zeka teknikleri ile yapılacak olan işlem adımlarını gerçekleştirmek için ev içinde standartların oluşturulması gerekmektedir. Kullanıcının ev otomasyon sistemini kullanırken yaptığı işlemleri takip ederek kayıt edilmesi amaçlanmıştır. Daha sonra bu verileri kullanarak kullanıcı yaptığı işlemleri yapay zeka davranışlarını belirleyerek sonraki adımı tahmin etmektedir. Ancak bu süreç zorlu geçmektedir. 

Çünkü yapay zeka algoritmalarının tam olarak çalışması için sürekli olarak denemeler yapması gerekmektedir. Kullanıcının ev otomasyon sistemini kullanırken yaptığı işlemleri takip ederek kayıt edilmesi amaçlanmıştır. Daha sonra bu verileri kullanarak kullanıcı yaptığı işlemleri yapay zeka davranışlarını belirleyerek sonraki adımı tahmin etmektedir. Ancak bu süreç zorlu geçmektedir. Çünkü yapay zeka algoritmalarının tam olarak çalışması için sürekli olarak denemeler yapması gerekmektedir. 

Bu deneme süreçleri sonuca bağlaması neden-sonuç ilişkisi kurarak ileri ki adımları tahmin etme yetisinin arttırması gerekmektedir. Bunun için gereken süreçte kullanıcıyı sürekli takip ederek verileri kaydederek, veri setleri oluşturması gerekmektedir. Bu süreçte kullanıcının rutinin dışında olması ve belirli davranışları bir daha tekrarlamaması sonucunda kayıtlarda gürültü olma ihtimali yüksek olduğunu göz önünde bulundurmamız gerekir. Ayrıca bu kayıt işlemleri için hedef kitleye uyan örnek bir birey seçilmeli gürültüyü en aza indirerek derin öğrenmenin daha kolay hale gelmesi için çalışılmalıdır.

Yapay Sinir Ağları (YSA) Nedir ?


Canlıların davranışlarını incelenerek, matematiksel modellenmesidir. Yapay modellerin üretilmesi ise sibernetik kavramını doğurmuştur. Eğitilebilir, adaptif ve kendi kendine organize olup öğrenebilen ve değerlendirme yapabilen yapay sinir ağları ile insan beyninin öğrenme yapısı modellenmeye çalışılmaktadır.İnsanlarda olduğu gibi yapay sinir ağları vasıtasıyla makinelerin öğrenmesi ve karar verebilme yeteneğini geliştirmek amaçlanmıştır. 

Yapay Sinir Ağları İnsan ve Makine öğrenimi


İnsan ve Makine öğreinimi ilişkilendirmek  ve daha iyi anlamak için öncelikle insan biyolojisinde bir sinir ağını ardından Makineye modellenmesi ile karşılaştıralım. Öncelikle İnsan biyolojisini anlamak için bir sinir hücresinin biyolojik gösterimini aşağıda gösterilmiştir. 


Sinir Hücresi Biyolojisi

Matematik Modellenmesi için  model olan Sinir Hücresi Biyolojisi  Makine Öğrenimin de kullanılan Matematiksel modellemeyi 

YSA'nın Matematiksel Modellemesi


                    YSA'nın Matematiksel Modellemesi

Yapay Sinir Ağları matematiksel modellenmesinde en küçük yapı taşı olarak bilinen perceptron adı verilmiştir. 1957 yılında Frank Rosenblatt tarafından tanımlanmış bu model günümüzde de Yapay Sinir Ağları Makine öğreniminde çalışmalara destek olmuştur.


Yapay Sinir Ağları Perceptron ile Makine Öğrenimi Nasıl Olmaktadır?

Perceptron modellenmesinde kullanılan denklem


Matematiksel modellenmesi yukarıdaki resimde  gösterilen  perceptron ile modellenmesi (1)’de ki denklem ile ifade edilmiştir.


Y: denklemde x’in değerine bağlı olduğundan bağımlı değişkendir. Girdiye ait skoru verir.
X: Bağımsız değişken, girdi.
W: Ağırlık Parametresi.
B: Bias Değeri
Yapay Sinir Ağları ya da Derin Öğrenme modelinde yapılan temel işlem; modelin en iyi durumu vereceği W ve B parametrelerinin hesabını yapmaktır. Bu işlemin daha iyi anlaşılması için örneklenecektir ;

Yapay Sinir Ağı 1.durum


Yukarıdaki  yer alan tek katmalı Yapay Sinir Ağı modeli ele alalım.  Bu durumda modelde şu işlemler gerçekleştirelebilir; 4+2=6  nöron bulunmaktadır.  Burada giriş katmanını hariç tutmak zorundayız. Daha sonra [3*4]+[4*2]=20 ağırlık parametresini vermektedir. Bias değeri için ise 4+2=6 olmak üzere toplamda 26 adet öğrenilmesi gereken parametre mevcuttur.


Yapay Sinir Ağı 2.durum



2. Durumda ise yukarıdaki resimde belirtildiği gibi iki gizli katmanlı Yapay Sinir Ağı modeli görülmektedir, bu arada ise 4+4+1=9 nöron sayısına sahiptir. Ağırlık parametresini hesaplamak için ise; [3*4]+[4*4]+[4*1]=12+16+4=32 bulunmaktadır. Bias değeri için ise  4+4+1=9 toplamda 41 adet öğrenilmesi gereken parametre vardır.

Bu durumda Tek katmanlı ve çok katmanlı Yapay Sinir Ağı modelleri incelendiğinde önemli bir konunun ayrımına varılmaktadır. Yapay Sinir Ağları nöron incelemesi ile Derin Öğrenmenin en küçük yapı taşı olarak geçmektedir. Bu arada Katman kavramı ilk 1960 yılında Widrow ve Hoff çok katmanlı yapıya geçen ilk çalışmayı yapmışlardır. Böylece “Katman” kavramı Yapay Sinir Ağları konusunun alt başlığında incelenmektedir.




Her katmanın ve her katmanda ki nöronların modele etkisi incelersek; Bir katman içindeki nöronların birbiriyle ilişkisi yoktur ve sistemde bellekte tuttuğu  bilgiyi sonraki katmana ya da çıkışına akarma işini gerçekletirirler. Bu durum her nöron için geçerlidir. Arka arkaya bağlanan nöronlar birbirlerini çeşitli aktivasyon değerleriyle etkilemektedir ve modelin, sistemin öğrenme seviyesini belirleyici bir aktarım yapmaktadır.Bu aktivasyon fonksiyonlarının nasıl seçileceği ileride gösterilecektir.
Yapay Sinir Ağları bir diğer husus modelin bir katmanında bulunan nöron sayısı sistemin performasnı ve kararlılığını dolaylı olarak etkilemektedir.Katman sayısı arttıkça öğrenme performansın iyi bir seviyede olduğunu belirlemesi etken değildir. Çünkü model perfomansı, sadece katman sayısı ve girdilerle ilgisi olmasıdır. Fakat bu parametrelerde yeterli değildir aksine bir çok farklı etkiyen parametrenin etkisi çıkış performasnı etkilemektedir. Ağırlık vektörünün değerlerini oluşturmak buna büyük bir etkendir.

Yapay Sinir Ağ Modeli Tasarlarken Ağırlık Vektörü Oluşturma


Performanslı ve kararlı bir ağ modeli geliştirmek için ağırlık vektörü parametresi büyük değişimlere sebep verir, o yüzden ağırlık vektörü belirlenirken bazı hususlara dikkat edilmesi gerekir. Bu parametre başlangıçta rastgele atanabilir veya sistemin lti sistemler gibi geçmişte bulunan eğitilmiş bir modelin ağırlıkları giriş başlangıç ağırlıkları olarak da tanımlanabilmektedir. Ancak bu değerler atanırken zıt kutup değerli rastgele dağılımlı olarak belirlenmelidir. Sebebi ise “0” değeri verildiği durumlarda hesap katmanlarda devamlı aynı çıkacağından öğrenimi oluşturmaktadır. Bu ise istenmeyen bir durum ortaya koyar. Bunun için optimizasyon fonksiyonları tasarlanarak çözümleme yöntemi mümkündür.


Başarılı performanslı bir şekilde tasarlanmış bir ağ modelinin başarımını belirleyen “Kayıp/Yitim Fonksiyonu” değeri çeşitli optimizasyon teknikleriyle “0” a yaklaşması istenen bir fonksiyondur. Bu durumda eğitim ve test edilmesi ile karşılaştırılmasıyla hesaplama yapılmaktadır.
Bununla birlikte iki kesime uğrayan sebeple karşılaşılmaktadır;
Modelin tüm bilgilerini kullandığımızda elimizde büyük boyutlu bir parametre bilgisi oluşmaktadır.
Test işlemleri oluştururken eğitim setinde tüm verilerle karşılaştırılması yapıldığında bu işlemlerin yükü artar ve tespit süresi uzamaktadır.

Bu iki durumun verimli bir ağ modelinde olmaması gereken hususlardır. Basit bir çözüm oluşturulmak istenirse, test verileri eğitim verilerinden oluşan bir temsil grubuyla eşleştirilerek tespit edilmesi mümkündür. Böylece işlem yükünün azalması sağlanırken, sistemin hız bakımından performans artmasını sağlamaktadır. Burada dikkatli seçilmesi gereken parametre temsil verisinin nasıl seçilmesi gerektiğidir.
Eğitim verisinin içeriğindeki tüm bilgilerin temsil edildiği bir veri elde etmek gerekmektedir. Bunun için öğrenme işleminden sonra ilgili verinin ağırlık matrisi yani ortalaması temsil verisi olarak alınmaktadır. Burada temsil verileri eğitim verileri için örnek oluşumlar verirsek aşağıdaki resimde  verilmektedir. Burada araba, kuş ve kedi temsillerinin ağırlık ortalamaları alınarak eğitim verilerinile eşleştirilirse sistemimizin kararlılığı ve performansımızın iyi bir veri elde edilmesini sağlamaktadır.
 
Temsil Verilerinin Görsel ile Benzetimi


Vektör Oluşturma Kayıp/Yitim Fonksiyonu (Loss funtion)


Kayıp Fonksiyonu olarak ele alacağımız bu değeri Regularizasyon (R) değerin sayesinde Kayıp değeri hiçbir zaman sıfır olmayacaktır. Bu durum tabi ki de ağırlık vektörünün sıfır olduğu durumlar haricinde oluşmaktadır.
Regularizasyon sayısı kullanılması derin öğrenme başarısını  artı yönde katkı sağlamaktadır. Kayıp hesabı yapılırken farklı optimizasyon teknikleri kullanılabilir. Bu tekniklerden biri aşağıdaki şekilde gösterildiği hesaplanabilir.

Vektör oluşturma kayıp fonksiyonu regularizasyon sayısı eklenmesi



Ayrıca Kayıp Fonksiyonu minimum bulmak için regalizasyon sayısı ile rastgele arama, rastgele yerel arama, gradyan iniş takip etme  yöntemleri ile geliştirilebilir. Fakat en etkili yöntemlerden biri olan Geriye Yayılım (Backpropagation) yöntemini incelenecektir.

Başarıyı İçin Geri Yayılım Yöntemi (Backpropagation)


Sistemin kurucusu 1986 yılında Rumelhard ve arkadaşları tarafından kullandığında popülerite kazanmıştır. Gizli katman ve çıkış katmanlarda ki tüm  ağırlıkları hesaba katılmaktadır. Hata sayısı gizli katmanlarda bulunan nöronlara geri dönerek modelin başarımı için başvurulan yöntemdir. Giriş değerleri ağırlık katsayılarıyla çarpılarak gizli katman çıkışından modelin çıkışına aktarılır. Bu zaten ileri  yayılımdır. Geri yayılım sayesinde modelin ağırlık katsayıları yenilenir ve sistem optimize edilmiş olur. Bu arada Transfer fonksiyonlarını devreye girmesi ile aktarım gerçekleştirilmektedir.

Transfer Öğrenimi ve Fonksiyonları 


Transfer öğrenimi, bir görev için oluşturulması ile eğitilen bir modelin, ikinci bir görev başlangıç noktası için tekrar kullanılabileceğini anlamasını sağlayan bir yaklaşım türüdür. Transfer öğrenimi süre gelmiş makine öğreniminden farklıdır, çünkü ikincil bir göreve başlamak için önceden eğitimini alınmış bir modele sıçrama tahtası olarak kullanmayı seçmesi onun çalışma mantığında yatar.Transfer foknsiyonları Şekil ’de verildiği gibi algoritmada yerini almaktadır.
 

Yapay Zeka Akışı



Bu yaklaşımı için insanlar rol model olmuş, bir insanın bir görev için önceden öğrenilen bilgileirni kullanması ile yeni görevi ona göre taklit etmesi benzeri bir örnek olarak nitelendirilebilir. Örneğin Hamza 1.sınıfta öğrendiği kalkülüs yöntemlerini taklit ederek 2.sınıfta aldığı elektromanyetik dalgalar dersinde uygulayabilmesidir.

Transfer Öğrenimi ve Derin Öğrenme ile Birlikte Kullanmanın Yararları


Bir modeli kararlı ve performansını arttırma tüm sistemlerin iyileştirilmesinde temel amaç taşımaktadır. Transfer Öğrenimi ana avantajlaları şunlardır;
Daha az eğitim verisi: Bir modeli sıfırdan eğitmeye başlamak çok zahmetli bir iştir ve çok fazla veri yükü gerektirir.
Modeller daha iyi genelleme yapması bir modelde transfer öğrenimi kullanmak, modeli eğitim görmediği verilerle iyi bir performans göstermeye hazırlar. Bu genelleme olarak bilinir. Transfer öğrenimi baz alınarak yapılan modellemelerde bir görevden diğerine hızlı bir sıçrama ile genellemelere sahip olabilir. Çünkü yeni sıçramalar uygulanabilecek özellikleri tanımlayı daha kolay ve pratik hale getirerek öğrenmek için eğitilmişlik durmunu daha iyi kavrar. Böylelikle iş yükü azalarak daha hızlı bir sistem geliştirilebilir.
Derin öğrenmeyi daha erişebilir hale getirmesi en büyük avantajlardan biridir. Çünkü transfer öğrenimi ile çalışmak derin öğrenmeyi daha kazançlı hale getirir. Bu sayede derin öğrenme uzmanı oluşturulan hazır olan modelleri de sisteminize uygulamak sizin için açık bir kaynak görevi görmesi ile büyük avantaj sağlamaktadır.

Transfer Öğrenme Türleri Nelerdir?

Alan Adı Uyarlaması (Domain adaptation)


Bu yaklaşımda, sistemin eğitildiği bir veri kümesi hedef veri kümesinden farklıdır  ama tamamen ilgili kısmı vardır. Buna iyi bir örnekleme ise spam e-posta filtreleme modelini gösterebiliriz.  A kullanıcısında kullanılan modelinin spam e-postaları tanımlamak için eğitildiğini varsayalım. Model daha sonra B kullanıcısı için kullanıldığında, görevi aynı olsa bile(e-posta filtreleme), B kullanıcısı farklı  türde e-posta alabileceği için A kullanıcısı eğitlir taklit ederek B kullanıcısında olan emailleride ayırabilir.

Çok Görevli Öğrenme (Multitask learning)

Bu yöntem, benzerlik ve farklılılardan yararlanabilmek için aynı anda iki veya daha fazla görevin çözülmesini içermektedir. İlgili bir görev için eğitilmiş bir modelin yeni görevde ki yeteneğini geliştirecek beceriler kazanabileceği fikrine dayanmaktadır.

Sıfır vuruşlu öğrenme (Zero-shot learning)

Bu teknik ise eğitim  sırasında maruz kalmadığı bir görevi çözmeye çalışan bir model içermektedir. Örneğin, resimlerde ki hayvanları tanımlamak için bir model geliştirdiğimizi varsayalım. Hayvanları tanımlamak için, makineye 2 parametre tanımlanması öğretildiği düşünelim, sarı renk ve lekeler olsun. Model daha sonra civcilerin sarı olduğu, ancak lekeleri olmadığı ve lekeleri olduğunu ancak sarı olmadığını bildiği dallanmaları öğrenmeyi öğrendiği birden fazla civciv resmi üzerinde eğitililebilir.

Tek Adımda Öğrenme(One-shot learning)

Bu yöntem, bir modelin bir nesneye bir kez ya da sadece birkaç kez maruz bırakıldıktan sonra nasıl sınıflandırılacağını öğrenmesini gerektirir. Bunu yapmak için ised model bilinen kategoriler hakkında sahip olduğu bilgileri kullanabilmektedir. Örneğin, hayvan sınıflandırma modelimiz bir kedinin nasıl tanımlanacağını bilir. Model daha sonra kediye benzeyen bir köpeği gördüğünde ise model ek resimlere maruz kalmadan kediyi köpekten ayırabilecektir çünkü kediler hakkında zaten sahip olduğu bilgileri aktarmıştır.

Transfer öğrenimi derin öğrenmede yaygın olarak kullanılmaktadır. Derin transfer öğreniminin ana uygulamalarından bazıları transfer öğrenimi doğal  dil işleme (NLP), bilgisayar görme ve konuşma tanımadır.
Transfer öğrenimi NLP, belge tanımlamasını ve metinsel verilerle ilgili diğer görevleri kolaylaştırmak için kullanılmaktadır.Aktivasyon fonksiyonları tanımı bu durumda gösterilmesi gerekmektedir.


Makine Öğreniminde Sinir Ağları Aktivasyon Fonksiyonları


Sinir ağlarında Aktivasyon fonksiyonları Derin öğrenmenin çok önemli bir oluşumudur. Aktivasyon fonksiyonları, derin öğrenme modelinin çıktısını en şekilde doğruluğunu kararlılığını, bir modelin hesaplama verimliliğini belirler. Bu yöntem ile iyi ölçekli bir sinir ağı oluşturabilmektedir. Bu sistemlerin fonksiyonları yakınsama yeteneği ile geliştirilebilir bir modelin bir duruma yakınsaması karar verebilme yeteneği ile bütünleşir. Sistemlerin ve modellerin bu  durum etkinleştirme fonksiyonları ile daha kararlı yapılar elde etmek münkündür. Şekil ’de  genel gösterimi verilmiştir.

Aktivasyon Fonksiyonu Geçerlemesi


Aktivasyon Fonksiyonuna Neden İhtiyaç Duyarız?


Yapay sinir ağlarına doğrusal olmayan gerçek hayat simülasyonuna tanıtmak için aktivasyon fonksiyonlarına ihtiyaç duyulmaktadır. Temel olarak basit bir yapay sinir ağında x girdiler, w ağırlıklar olarak tanımlanır ve ağın çıkışına aktarılan değere yani aktivasyon işlemi uygulanmaktadır. Daha sonra ise bu nihai çıkış ya da bir başka katmanın girişi olacak şekilde ayarlanmaktadır.
Çıkışa aktarılacak bu sinyali aktitive etmeden yapamayız sebebi ise aktivasyon fonksiyonu kullanılmayan bir sinir ağı sınırlı öğrenme gücüne sahip bir doğrusal bağlanım gibi davranacaktır. Ama biz sinir ağımızın doğrusal olmayan durumları da öğrenmesini istiyoruz. Çünkü sinir ağında öğrenmesi için görüntü, video yazı ve ses gibi karmaşık gerçek dünya bilgileri verilmektedir. 

Diğer taraftan basit bir doğrusal sinyalli fonksiyon olur bu da tek dereceli polinomlardan olacağı için gerçek dışı veriler elimizde olur, sistem için bu istenmemiştir.
Birden fazla dereceye sahip olan fonksiyonlara doğrusal olmayan fonksiyonlar denir. Yapay sinir ağları, evrensel fonksiyon yakınsayıcıları olarak tasarlanmış ve bu hedefte çalışması istenmektedir. Bu herhangi bir fonksiyonu hesaplanması, öğrenme özelliğine sahip olmaları gerektiği anlamına gelmektedir. Doğrusal olmayan aktivasyon fonksiyonları sayesinde ağların daha güçlü öğrenmesi sağlanabilir.

Aktivasyon Fonksiyonları


Aktivasyon fonksiyonları, bir sinir ağının çıktısı olarak belirlenen matematiksel denklemlerdir. İşlevi ise ağda ki her bir nörona bağlanır ve nöronları ayrı ayrı model ve sistemin tahmini ile birlikte tetiklemesini gerekli olup olmadığını belirler. Aktivasyon fonksiyonları ayrıca her nöronun çıkışını 1-0 veya -1-1 arasında normalleştirmeye yakınsamasını sağlar.
Aktivasyon fonksiyonları bir sistem de oluşan katmanların da bulunan nöronları  çıktısını sıçraması için veya  ileriye taşımak için etkinleştirmeyi işlevleri kullanılması esas alınmaktadır. Aktivasyon fonksiyonları skaler bir fonksiyon olma özelliği taşırlar. Bir başka deyişle aktivasyon fonksiyonları sinir ağında gizli nöronların ağın modelleme yeteneği olarak adlandırabilir. Aktivasyon fonksiyonlarını inceleyelim.

Basamak Fonksiyonu (Step Function)


İki değer alan bir fonksiyondur ve kuralı gereği ikili sınıflayıcı olarak kullanılır. Bu yüzden genellikle çıkış katmanlarında kullanılmaktadır. Gizli katmanlarda türevi öğrenme değeri temsil etmediği için kullanılması tavsiye edilmediği için gizli katmanlarda kullanılamaz.Bu fonksiyon Şekil’de gösterilmiştir.

Basamak Fonksiyonu

Doğrusal Fonksiyon (Linear Function)



Bir dizi aktivasyon değeri üretir ve bunlar basamak fonksiyonunda olduğu gibi ikili değerler değildir. Birkaç nöron birbirine bağlamayı sağlayabilmektedir. Fakat bu fonksiyonun dezavantajı türevinin sabit olması. Çünkü backpropagation sistemini kullanırken yani geri yayılım algoritmasın ile öğrenme işlemini nöronlar için gerçekleştiriliyordu. Bu algoritma türev alan bir sistemden oluşuyor. Bu sistemlerde geri yayılım algoritması kullanılırsa doğrusal fonksiyon sonuç vermemektedir. Fonksiyon Şekil’de gösterilmiştir.
 
Doğrusal Fonksiyon

Ayrıca tüm katmanlarda doğrusal fonksiyon kullanılırsa giriş katmanı ile çıkış katmanı arasında hep aynı doğrusal sonuca ulaşılır. Doğrusal fonksiyonların doğrusal bir şekilde birleşimi yine bir başka doğrusal fonksiyondur.Aktivasyon fonksiyonları hangi sistemlerde iyi bir şekilde kullanılması uzmanlık istemektedir.

Sigmoid Fonksiyonu


Doğada buluna bir çok olay doğrusal bir sistem değildir. Ve sigmoid bir fonksiyonun kombinasyonları da doğrusal olmaması bize iyi bir aktivasyon fonksiyonu olduğunu göstermektedir. Bu durumda sistemimizin katmanlarını sıraladığımızda ve ağırlıklarını hesapladığımızda aktivasyon fonksiyonları ile filtreden geçirebiliriz. Bu fonksiyon aşağıd da görülmektedir. 

Sigmoid fonksiyonların dezavantajları x-y değerleri çok yavaş tepki vermesi sistemimizde problemler doğrabilir, bu bölgelerde türev değerleri çok küçük olur ve 0’a yakınsar. Buna gradyanların kaybolması(vanishing gradient) denir. Bu durum öğrenme olayını performans düşüklüğüne sebep olmaktadır. Bu durum “0”  olursa o zaman öğrenmede mümkün olmaz. Yavaş bir öğrenme olayı gerçekleşeceğinden dolayı hatayı minimize eden optimizasyon algoritması lokal minimum değerlere takılabilme durumu oluşabilmektedir.
 

Sigmoid Fonksiyonu


Hiperbolik Tanjant Fonksiyonu


Sigmoid fonksiyonuna çok benzer bir yapıya sahiptir. Ancak fonksiyonun aralığı bu kez (-1,+1) olarak tanımlanmıştır. Sigmoid fonksiyonuna göre avantajı ise türevinin daha dik olmas yani daha çok değer alabilmesidir. Bu daha hızlı öğrenme ve sınıflama işlemileri daha geniş aralığa sahip olmasından dolayı daha verimli olabilmektedir. Bu fonksiyonun bazı problemlerde dezavantajı ise gradyanların ölmesi problemi oluşturabilmektedir.
 

Hiperbolik Tanjant Fonksiyonu


Relu Fonksiyonu


Bu fonksiyon ise doğada doğrusal olmayan bir fonksiyon olsa da sektörde iyi bir tahmin edici olarak bilinmektedir. Sebebi ise bu fonksiyon kombinasyonları ile herhangi başka bir fonksiyona da yakınsamak mümkündür. Bu durum ise Yapay Sinir Ağı katmanlarını sıralayabileceğimiz iyi bir seçenek gibi duruyor. 

Relu fonksiyonu [0,+∞] aralığında değer almaktadır. Fonksiyon durumu göz önüne alarak çok fazla nöronlu bir sinir ağı sistemi kurduğumuz varsayalım. Sigmoid ve Hiperbolik tanjant tüm nöronların aynı durumda aktif olmasını sağlarken, ağdaki bazı nöronların aktif olup, aktivasyon seyrek yani verimli bir hesaplama yükü olsun isteriz. Relu fonksiyonu ile bunu sağlayabilmektedir.
 
ReLU Fonksiyonu



Yapay zeka kullanan platformlar , bir çok alt yapıyı görüntü işlemeyi veya metinsel geribildirim argümanlarını , fonksyionlarını iç içe daha anlatacağım çok şey var yani, 

yazının devamı gelecek..