27 Şubat 2019 Çarşamba

Algoritmalar 1 - Ortak Bölenlerin En Büyüğünü Bulma

Algoritmalar programlama ile uğraşanların bilgi sahibi olması gereken bir konu. Karşılaşılan bir problemin en uygun, en kısa zamanda çözülebilmesi için algoritma bilgisi elzemdir. Bu algoritmalar konusundaki ilk yazıda Öklit tarafından bulunan ve 2 sayının ortak bölenlerinin en büyüğünü kısa zamanda kolayca bulmaya yarayan algoritmadan bahsedeceğim.
Öklit der ki 2 sayının ortak katını bulamak için şu yolu izle (obeb - ortak bölenlerin en büyüğü demek):
obeb(x, y) = obeb(y, x mod y)

Yani sayılardan ilkini aynı al, diğerinin ilkine göre modülünü bul ve sayıları yer değiştirip aynı işlemi tekrarla. İkinci sayı sıfır olana kadar devam et. İkinci sayı sıfır olduğunda ilk sayı ortak bölenlerin en büyüğünü verecektir. Şimdi bunun için bir de örnek C kodu verelim:
#include <stdio.h>

int obeb(int x, int y)
{
    if (y == 0)
    {
        return x;
    }
    else
    {
        obeb(y, x % y);
    }
    return 0;
}

int main()
{
    int y = 144;
    int x = 68;

    printf("%d ve %d nın ortak bölenlerinin en büyüğü %d dir\n", x, y, obeb(x, y));

    return 0;
}

15 Ekim 2017 Pazar

RTL-SDR, SDR# ve GNURadio ile çalışmalar

Bir ara örnek bir Spektrum Analizör devresi ararken RTL-SDR diye bahsedilen ve oldukça ucuza ebay/aliexpress gibi sitelerden edinilebilen bir karasal yayın alıcısına rastgeldim. Biraz incelemeden sonra benim işime yarayacağına kanaat getirip aliexpress'den bir tane sipariş verdim. Daha sonradan anladım ki siparişi dikkatli vermeliymişim. Zira bu modüllerde kullanılan birkaç farklı tuner chip'i varmış ve bana gelen de Fitipower şirketinin FC0012'siymiş. Anladığım Elonics'in E4000'i en genşik spektruma sahipken Rafael Micro'nun R820T(2) chip'leri de en iyi performansa sahipmiş. Neyse elimdeki de iş görüyor tabii ama zayıf sinyaller konusunda sıkıntılı, zira kartın tasarımı ve kullanılan elemanlar öyle çok da iyi değil. Sonuçta artık elimde bir RTL-SDR olduğuna göre önce birkaç deneme yapmak için SDR# yazılımını indirip kurdum ve biraz kurcalamadan sonra FM radyo kanallarına başarılı bir şekilide kilitlenip yayın alabildim. Böylece elimdeki kartın da çalışıyor olduğunu ve sürücü problemimin de olmadığını kesinleştirmiş oldum. Artık sıra daha değişik işler yapmaya gelmişti artık. Bunun için de ilk akla gelen gnuradio paketi tabii ki. Bunu Win altında kullanmak mümkün ama ben VirtualBox altında koşan Ubuntu 16.04.3 üzerinde çalıştırmayı seçtim. Gnuradio, gnuradio-companion ve benim RTL-SDR için gerekli osmosdr paketlerini Ubuntu depolarından değil de direk kaynak kod olarak alıp derleyip kurdum. Herşey hazır olduğunda artık gnuradio-companion yazılımını çalıştırdım ve basit bir sinyal üretecini ses çıkışına bağladım ve o da ne ses yok. Önce bunun VirtualBox'dan kaynaklandığını sandım ve Win audio driver kaldırıp tekrar kurma, güncelleme, VirtualBox'ın eski sürümlerini deneme vs vs vs birçok şey denedim. Ama çözüm olarak şöyle birşey yaptım. Malum gnuradyo-companion'daki "Audio Sink" alsa sürücülerini kullanıyor ve içerisinde "Driver Name" diye bir alan var ki bu normalde boş bırakılıyor. Önce alsa'nın tanıdığı cihazları şöyle listeledim:
~$ aplay -L
default
     Playback/recording through the PulseAudio sound server
null
     Discard all samples (playback) or generate zero samples (capture)
pulse
     PulseAudio Sound Server
iec958:CARD=Intel,DEV=0
     HDA Intel, STAC9221 A1 Digital
     IEC958 (S/PDIF) Digital Audio Output
dmix:CARD=Intel,DEV=1
     HDA Intel, STAC9221 A1 Digital
     Direct sample mixing device
dsnoop:CARD=Intel,DEV=1
     HDA Intel, STAC9221 A1 Digital
     Direct sample snooping device
hw:CARD=Intel,DEV=1
     HDA Intel, STAC9221 A1 Digital
     Direct hardware device without any conversions
plughw:CARD=Intel,DEV=1
     HDA Intel, STAC9221 A1 Digital
     Hardware device with all software conversions
~$
Görüleceği gibi aslında alsa ses birimlerini tanıyor. Bundan hareketle yukarda bahsettiğim "Driver Name" kısmına "plughw:CARD=Intel,DEV=1" yazdım ve ne duyayım ses artık geliyor. Bunadan sonraki gelişmeleri daha sonra aktarmak üzere.

25 Ocak 2017 Çarşamba

Radyo

Projede TEA5767 radyo modulü, ses ayarı için DS1802, LED gösterge taraması için TM1637, ses kuvvetlendiricisi olarak PAM8403 modülü, ses ve kanal ayarı için buton'lu encoder ve son olarak mikrokontrolör olarak PIC18F14K50 kullanıldı. Besleme küçük bir trafodan sonra köprü doğrultucu, filtre ve son olarak da regülasyon için kullanılan LM317'den oluşuyor. Devre şeması şu şekilde:

18 Aralık 2015 Cuma

PIC ve EM4102 ile RFID Okuma Devresi

RFID ik çıktığı yıllarda Üniversitedeydim ve bunların birçok alanda kullanılacağı söyleniyordu. Aradan fazla zaman geçmedi ve binaların giriş kapılarının otomatik açılması işlerine kadar girdiler. Şu anda 125KHz ve 13.56MHz olmak üzere iki gruba ayrılmış durumda RFID ürünleri. 125KHz olanı tranceiver kullanmadan basit devrelerle ve yazılımla okumak ve yazmak mümkün ve internette bu konuda birçok örnek uygulama mevcut. Genelde daha yüksek hız ve güvenilirlik istenen uygulamalarda ise 13.56MHz de çalışan RFID'ler tercih ediliyor.  Ben de elimdeki PIC16F690 geliştime kartını denemek amaçlı elimdeki EM4102 (RFID tranceiver diyebiliriz) ile bir deneme yaptım. Sonucunu aşağıdaki video dan görebilirsiniz. EM4102'nin çevre elemanlarının boyulandırılmasına ve PCB yerleşimine dikkat etmek gerekiyor. Zira uygulamaların genel karakteristiği icabı 7/24 çalışacak bir entegre ve kötü tasarım durumda ısınmaya çok elverişli ki buda entegre ömrünü azaltacaktır. Bir mühendis olarak hiç tahammül edemediğim şey kötü tasarım sonucu kısa ömürlü olan ürünlerdir. Genelde Çin menşeli ürünlerde söz konusu olan bu bir kere çalışsın yeter mantığı markalaşma bilincini yerleşmemiş olmasından kaynaklanıyor büyük ölçüde. Marka imajı derdinde olan bir şirketin pek kolay kolay tevessül etmeyeceği yollar bunlar ama dediğim gibi markalaşma bilincinin eksik olduğu bizim gibi ülkelerde çok olağan durumlar.  


Zilog Z8F6423 ve Wiznet W5100 ile uzaktan kontrol

İlk kullandığım mikrokontrolör Z8 olmuştur. Üniversite yıllarımda o zamanın parasıyla oldukça ucuz olan bir geliştirme kitlerini edinmiştim. Ayrıca ücretsiz örnek de gönderiyorlardı. Hepsinden önemlisi zamanına göre oldukça basit HW debugger'ı vardı. Seri port üzerinden ve tek pin üzerinden debug ve kod yükleme yapılabiliyordu. Debugger devresi bir MAX232 türevinden ibaretti. PIC'ciler için hayaldi bu özellikler. Onlar kodu yazar, derler ve yükler daha sonra çalışmasına bakarak ilerlerken ben Z8 ile kodu yazar derler board üzerinde debug eder, breakpoint falan kullanırdım. Dahası ücrestiz C derleyicisi ve kendi IDE'si olan başka üretici de bilmiyorum o zamanlar. Tabii daha sonrasında Zilog ürünleri geliştirmede yavaş kalınca şirket eridi gitti. Özellikle güç tüketimi konusunda birşey yapamadılar. Z8 ailesinin çok ilgin bir özelliği vardı ki o özellik günümüzde bile başka mikrokontrolörde yok. PIC'lerdeki gibi bir W (working) register'a ihtiyacı yoktu çünkü dahili tüm sram alanı W gibi kullanılabiliyordu. Ayrıca DMA'sı var. Neyse lafı uzatmaya gerek yök ölü bir ürün için.

O zamanlar Wiznet diye Kore'li bir şirket çıkmış ve W5100 diye HW TCP/IP desteği sunan bir çip üreticisi çıkmıştı. Bu W5100 aynı zamanda PHY da barındırıyordu içerisinde ve sadece trafolu bir ETH konnektörü bağlamak yetiyordu en küçük mikrokontrolöre bile. 4 taneye kadar HW socket'e izin veriyordu ve dahili buffer alanı da vardı. Elime bu W5100 geliştime kitinden geçmişti ve Z8 ile uzaktan konrol uygulaması yapıp denemek istedim. Sonuç aşağdaki video da gördüğünüz gibi bir devre oldu. Dahili web server üzerinden 4 röle kontrol edilebiliyor. Sisteme giriş şifre korumalı.