Video
youtube
5mx5m Hızlı Sarmal PVC Kapı Kontrol Sistemi, 1kW DC Motor Sürücü
0 notes
Video
youtube
PROGE LTD AC DOOR CONTROL TEST 1
0 notes
Video
tumblr
STM32F429I Discovery Board üzerinde çalışan son projemiz

#embedded#emwin#stemwin#rtos#freertos#stm32f#stm32f4#stm32f429I-DISCO#arm#arm-cortex-m4#fpu#gui#milkmeter#embeddedgui#blog
0 notes
Photo

STM32F429I Discovery Board üzerinde çalışan son projemiz
#embedded#emwin#stemwin#rtos#freertos#stm32f4#stm32f#stm32f49I-DISCO#arm#arm-cortex-m4#fpu#gui#milkmeter#embeddedgui#blog
0 notes
Video
tumblr
Son projemizn MCU boardu
#electronics#microchip#microcontroller#display#sevensegment#slidingtext#rs485#optocoupler#dsPIC#blog
0 notes
Text
Equalis Instrument Control Modülü ile Online Veri Toplama
Bu yazıda bir karttan verilerin ve ölçümlerin nasıl elde edileceği ve bunun nasıl gösterileceği anlatılacaktır. Bu demo için ön-gereksinimler aşağıda verilmiştir.
Ön-Gereksinimler
NI-VISA Yazılımı[1]
Scilab[2]
Equalis Instrument Control Modülü[3]
Rigol DS4024 Digital Osiloskop[4]
Microchip MPLAB X[5]
Microchip MCLV Board ve BLDC Motor[6]
Microchip ICD 3 In-Circuit Debugger/Programmer[7]
Bu noktada, Equalis Embedded Coder Bölüm 2 - Fırçasız DC Motorun (BLDC) Sensörlü Kontrolü[8] yazısının da incelenmesi iyi olur. Çünkü burada ilgili yazıda anlatılan sistem sinyal kaynağı olarak kullanılacaktır.
Bu demoda kullanılacak olan Equalis Instrument Control Modülü[3] VISA[9] fonksiyonları
VISA_open(visa_id , resource_descriptor) Bu fonksiyon bir VISA oturumu açar
VISA_write(visa_id, text_message) Bu fonksiyon visa_id ile belirtilen cihaza bir text_message gönderir
data = VISA_read(visa_id, buffer_size) Bu fonksiyon VISA_write() ile daha önce komut gönderilmiş cihazdan veri okur
Bu demoda kullanılacak olan Rigol DS4024 Digital Osiloskop[4] SCPI[10] komutları
*IDN? Cihaz id'sini döndürür
:MEASure:VAVG? CHAN Seçilen kanaldaki sinyalin ortalama değerini döndürür
:MEASure:PERiod? CHAN Seçilen kanaldaki sinyalin periyod değerini döndürür
:WAV:MODE Mode waveform okuma mudunu seçer
:WAVeform:FORMat Format waveform dönüş formatını seçer
:WAV:SOURce CHAN waveform okunacak kanalı seçer
:WAVeform:DATA? Daha önce :WAV:SOURce ile seçilmiş kanaldan waveform okur
Demonun Gerçekleştirilmesi
Şimdi Microchip MCLV boarduna daha önceden Equalis Embedded Coder Bölüm 2 - Fırçasız DC Motorun (BLDC) Sensörlü Kontrolü[8] yazısında anlatıldığı gibi programın yüklendiğini varsayıyoruz.
Tüm sistem Şek.-1'de gösterilmiştir.

Şekil-1 Demo için kullanılan sistem
Rigol DS4024 Digital Osiloskop[4] USB üzerinden bağlanmıştır ve NI MAX Measurement and Automation Explorer[1] ile bağlantının çalışıp çalışmadığı kontrol edilebilir. Cihaz tanımlayıcı Şek.2'de gösterilmiştir.
Şekil-2 NI MAX Measurement and Automation Explorer
Şimdi artık cihaza connection GUI aracılığıyla bağlanabiliriz. Bu GUI Equalis Instrument Control Modülü[3] demolar kısmında bulunabilir.
Demo başlatıldıktan sonra Şek.3'teki gibi Connection GUI ve Ana GUI olarak iki GUI açılacaktır. Connection GUI'deki menüden connect seçeneğini seçiyoruz ve NI MAX[1] ekranından alınan cihaz tanımlayıcısını giriyoruz, OK butonuna bastıktan sonra 1-30 arasında VISA otumumu id'sini giriyoruz. Sonra cihaz veri almaya hazır olacaktır.
Şekil-3 Bağlanmadan önce Connection GUI ve Ana GUI
Şimdi Ana GUI'ye gidebiliriz, check-box'lar ile görüntülenecek kanalları seçiyoruz, ve daha önce Connection GUI'de girdiğimiz VISA oturum id'sini giriyoruz. Start butonuna bastığımızda Şek.4'teki gibi osiloskop ekranında gördüğümüz sinyalleri Ana GUI'de de görebiliriz.
Şekil-4 Bağlandıktan ve veri almaya başladıktan sonra Connection GUI and Ana GUI
Stop butonuna basıldığında, veri toplama sonlandırılacak ve ölçülen değerler bir dosyaya ve Scilab[2] Workspace alanına saklanacaktır. Bu veri ileride analiz etmek için veya çizdirmek için kullanılabilir.
Equalis Instrument Control Modülü[3] demolar kısmında benzer bir demo vardır. Ayrıca Equalis Xcos Coder and Embedded Coder Modülü[11] demolar kısmında gömülü kod üretimi ile ilgili demolar bulabilirisiniz.
Kaynaklar
NI-VISA Yazılımı
Scilab
Equalis Instrument Control Modülü
Rigol DS4024 Digital Osiloskop
Microchip MPLAB X
Microchip MCLV Board ve BLDC Motor
Microchip ICD 3 In-Circuit Debugger/Programmer
Equalis Embedded Coder Bölüm 2 - Fırçasız DC Motorun (BLDC) Sensörlü Kontrolü
VISA – Virtual Instrument Software Architecture
SCPI – Standard Commands for Programmable Instruments
Equalis Xcos Coder and Embedded Coder Modülü
================================== Proge Consulting Ltd 2013, Tüm Hakları Saklıdır.
#veri toplama#data acquisition#scilab#scilab ipuçları#oscilloscope#microchip#mplab x#code generation#instrument control#scpi#ni visa#bldc#mclv#blog
0 notes
Text
İkinci-Derece Delta-Sigma ADC'nin Equalis SDM Fonksiyonları ile Tasarım ve Analizi
Delta-Sigma Modülatör[1] ve ADC Nedir?
Delta-sigma (ΔΣ; or sigma-delta, ΣΔ) modülasyon analog sinyallerin sayısal sinyallere veya daha yüksek-çözünürlüklü sinyallerin daha-düşük çözünürlüklü sinyallere dönüştürülmesini sağlayan bir yöntemdir.
Dönüşüm ölçülen iki sinyal arasındaki fark olan hata geri-beslemesi kullanılarak yapılır, ve dönüşümü iyileştirmek için kullanılır. Düşük-çözünürlüklü sinyal tipik olarak yüksek-çözünürlüklü sinyalden daha hızlı değişir, ve tamamen veya çok az bir farkla aslına uyacak şekilde yüksek-çözünürlüklü sinyali tekrar elde etmek için filtre edilebilir. Bu teknik dönüştürücüler, frekans sentezleyicilileri, anahtarlamalı-mod güç kaynakları ve motor kontrolörleri gibi modern elektronik cihazlarda kullanımı artmaya başlamıştır.
Hem analog/digital dönüştürücüler (ADC), hem de digital/analog dönüştürücüler delta-sigma modulasyon kullanılabilmektedir. Bir delta-sigma ADC önce delta-sigma modülasyon kullanarak analog sinyali çözümler, daha sonra yüksek-çözünürlüklü digital çıkış oluşturmak üzere digital filtre uygular. Diğer taraftan, bir sigma-delta DAC yüksek-çözünürlüklü digital sinyali düşük-çözünürlüklü analog sinyale dönüştür, ve bir analog filtre ile düzeltir. Her iki durumda da, geçici olarak düşük-çözünürlüklü sinyalin kullanımı devreyi basitleştirir ve verimi iyileştirir.
Tasarıma Genel Bakış[2]
Şekil-1 Sigma-Delta ADC genel görünümü
İlk seviye desimasyon (kırım) filtresi bir sinc3filtresidir ve bir kademeli tarak filtre kullanılarak verimli bir şekilde oluşturulabilir. Bir Linciderece Δ-Σ ADC için sinc filtresinin optimal derecesi L+1 dir. Böylece bu ADC için 3. derece bir sinc filtresine ihtiyaç vardır. Sinc fitrenin çıkışı 256 katsayısı ile kırılır. Bu çıkış iki desimasyon filtresi ile filtre edilir. İki desimasyon filtresi (her biri 2 katsayısı ile kırar) tarafından takip edilen bir sinc filtresi kullanımının son digital çıkışı elde etmek için en iyi yöntem olduğu kanıtlanmıştır. Δ-Σ ADC uygulamalarının çoğu lineer faz karakteristiğine sahip desimasyon filtreleri gerektirir. Böylece burada simetrik FIR filtreleri kullanılmıştır.
Şekil-2’de İkinci-Derece Sigma-Delta Modülator bloğu içeriği gösterilmiştir. Ayrıca bu blok kapasitör, termal ve clock jitter kaynaklı gürültüleri de içerir. Clock jitter [3]'e göre oluşturulmuştur.
Şekil-2 İkinci-Derece Sigma-Delta Modülatör
İkinci-Derece Sigma-Delta ADC’nin Tasarım ve Analizi için Kullanılan Eqaulis SDM Fonksiyonları
Equalis SDM fonksiyonları Equalis Communications Systems[4] Modülü ve Signal Processing[5] Modüllerinin bir uzantısıdır.
Simülasyon Fonksiyonları
SineWaveGenerator Sinüsoydal sinyal üretir
SDMErrorCheck Başlangıç parametrelerini test eder
SecondOrderModulator Sigma-Delta Modülatör Modeli, clock jitter dahil
SincCubedFilter Sinc3 Digital desimasyon filtresi
DecimationFilter Halfband filtre ve 2 katsayılı desimasyon filtresi
Filtre Tasarım Fonksiyonları
HalfbandFilter Scilab remez algoritması[6] kullanarak DecimationFilter parametrelerini tahmin eder
Analiz Fonksiyonları
computeDR Dinamik aralığı hesaplar
computeENOB Etkin bit sayısını hesaplar
computeSFDR Yapay serbest dinamik aralığı hesaplar
computeSNR Sinyal-Gürültü oranını hesaplar
TheoreticalSNR Teorik olarak tahmin edilen Sinyal-Gürültü oranını hesaplar
computeTHD Toplam harmonik bozulmayı hesaplar
HodieWindow FFTmagnitude için Hodie Penceresi oluşturur
FFTmagnitude Hodie Penceresi kullanarak FFT alır
TimeDomainPlot Zaman-domeni çizimlerini yapar
FreqDomainPlot Frekans-domeni çizimlerini yapar
Eqaulis SDM Fonksiyonları Tasarım ve Analiz
Bu örnekte aşağıdaki başlangıç parametreleri kullanılmıştır
ReadFromFile = %f;// Modulator vektorunu disaridan almak icin bu parametreyi %t yapin Resolution = 2;// Frekans cozunurlugu - Hertz Fs = 256e3;// Modulator ornekleme frekansi Fo = 22;// Giris sinus dalgasi frekansi BW = 125;// Istenilen ADC band genisligi - Hertz NumTaps_1 = 59;// Ilk desimasyon filtresinde kullanilan tap sayisi NumTaps_2 = 59;// Ikinci desimasyon filtresinde kullanilan tap sayisi Vref = 1.25;// Referans voltaj Vsupply = 3.3;// Kaynak voltaji A = Vref / 8.0;// Giris sinus dalgasi genligi Cint = 3e-12;// Modülatördeki integrator kapasitesi degeridir NOISE = %t;// Bu %t ise modulatore gurultu eklenecektir D = (Fs/(2 * BW))/4;// sinc filtresinde kullanilan ara desimasyon filtresi katsayisi D = round(D); N = Fs / Resolution ;// Giris zaman sekansi uzunlugu (2'den herhangi bir usse kadar) N = 2^(round(log2(N)));
Şimdi parametreleri aşağıdaki şekilde test edebiliriz
bOK = SDMErrorCheck(Fs, N, Fo);
Eğer herşey doğru ise giriş sinyalini aşağıdaki şekilde üretebiliriz
SineWave = SineWaveGenerator(2*N, A, Fs, Fo);
Elde edilen sinyal Şelil-3’te gösterilmiştir
Şekil-3 Giriş sinyali
Simülayon işlemi aşağıdaki şekilde yapılır
ModulatorOutput = SecondOrderModulator(SineWave, Vref, Vsupply, Cint, NOISE); SincOutput = SincCubedFilter(ModulatorOutput, D); Decimator_1_Output = DecimationFilter(NumTaps_1, SincOutput); Decimator_2_Output = DecimationFilter(NumTaps_2, Decimator_1_Output);
Şimdi tüm sistemin çıkışlarına sahibiz, geçici kısımları elimine etmek için aşağıdaki şekilde ortada kalan bir veri seti alıyoruz
L = size(SineWave, '*'); SineWave = SineWave(L/4+1 : 3*L/4); L = size(ModulatorOutput, '*'); ModulatorOutput = ModulatorOutput(L/4+1 : 3*L/4) ; L = size(SincOutput, '*'); SincOutput = SincOutput(L/4+1 : 3*L/4) ; L = size(Decimator_1_Output, '*') ; L = 2^(round(log2(L)-0.5)); Decimator_1_Output = Decimator_1_Output(L/4+1 : 3*L/4); L = size(Decimator_2_Output, '*'); L = 2^(round(log2(L)-0.5)); Decimator_2_Output = Decimator_2_Output(L/4+1 : 3*L/4);
Sinyalleri zaman domeninde aşağıdaki şekilde çizdirirebiliriz
TimeDomainPlot(SineWave, Fs, 'b', 1, 4, '', '', '', 'Input'); TimeDomainPlot(SincOutput, Fs/D, 'g', 2, 4, '', '', '', 'Sinc Cubed Filter Output'); TimeDomainPlot(Decimator_1_Output, Fs/(2*D), 'r', 3, 4, '', '', '', 'Decimator 1 Output'); TimeDomainPlot(Decimator_2_Output, Fs/(4*D), 'k', 4, 4, '', '', '', 'Decimator 2 Output');
Şekil-4’te zaman-domeni çizimleri gösterilmiştir
Şekil-4 Zaman-domeninde sinyaller
Frekans-domeninde sinyalleri elde etmek için aşağıdaki şekilde FFT alıyoruz
FreqDomainPlot(ModulatorOutFFT, Vref, Fs, 'b', 1, 4, '', '', '', 'Input'); FreqDomainPlot(SincOutFFT, Vref, Fs/D, 'g', 2, 4, '', '', '', 'Sinc Cubed Filter Output'); FreqDomainPlot(Decimator_1_FFT, Vref, Fs/(2*D), 'r', 3, 4, '', '', '', 'Decimator 1 Output'); FreqDomainPlot(Decimator_2_FFT, Vref, Fs/(4*D), 'k', 4, 4, '', '', '', 'Decimator 2 Output');
Şekil-5’te frekans-domeni çizimleri gösterilmiştir
Şekil-5 Frekans-domeninde sinyaller
Şimdi de sistem performansı ile ilgili bazı parametreleri aşağıdaki şekilde hesaplayabiliriz
ModulatorSNR = ComputeSNR(ModulatorOutFFT, Fs, Fo, BW); ModSimENOB = ComputeENOB(Vref, A, ModulatorSNR); SNRtheory = TheoreticalSNR(Fs, BW); ModTheoryENOB = ComputeENOB(1, 1, SNRtheory); SincSNR = ComputeSNR(SincOutFFT, Fs/D, Fo, 4*BW); SincSimENOB = ComputeENOB(Vref, A, SincSNR); [SincSFDR, SincSFDRmax, SincSFDRmin] = ComputeSFDR(SincOutput); SincTHD = ComputeTHD(SincOutput); Decimator_1_SNR = ComputeSNR(Decimator_1_FFT, Fs/(2*D), Fo, 2*BW); Dec_1_SimENOB = ComputeENOB(Vref, A, Decimator_1_SNR); [Dec_1_SFDR, Dec_1_SFDRmax, Dec_1_SFDRmin] = ComputeSFDR(Decimator_1_Output); Dec_1_THD = ComputeTHD(Decimator_1_Output); Decimator_2_SNR = ComputeSNR(Decimator_2_FFT, Fs/(4*D), Fo, BW); Dec_2_SimENOB = ComputeENOB(Vref, A, Decimator_2_SNR); [Dec_2_SFDR, Dec_2_SFDRmax, Dec_2_SFDRmin] = ComputeSFDR(Decimator_2_Output); Dec_2_THD = ComputeTHD(Decimator_2_Output);
Eğer sonuçlar gereksinimleri karşılıyorsa işlem tamamdır. Aksi halde, parametreler ayarlanarak işlem tekrar edilir.
References
Delta-sigma modulation on Wikipedia
Design of a Second-Order Delta-Sigma Modulator for Use in Biomedical Signal Acquisition by Taraka Neelakant Yerra, Msc Thesis
Modeling Jitter in Continuous-Time Sigma-Delta Modulators by Ahmed Ashry and Hassan Aboushady
Equalis Communications Systems Module
Equalis Signal Processing Module
Scilab help page for function remezb
Design and Simulation of a Second-Order Delta-Sigma ADC with Equalis SDM Capabilities
================================== Proge Consulting Ltd 2013, Tüm Hakları Saklıdır.
0 notes
Text
Equalis Embedded Coder Bölüm 2 - Fırçasız DC Motorun (BLDC) Sensörlü Kontrolü
Equalis Embedded Coder Bölüm 2 - Fırçasız DC Motorun (BLDC) Sensörlü Kontrolü[1]
Bu yazı Equalis Embedded Coder[2] serisinin ikinci bölümüdür. Yazının ilk kısmına[3] kaynaklar kısmında verilen linkten ulaşabilirsiniz. Bu bölüm işlemci hedefli kod üretimi hakkındadır. Modül bir Xcos diagramından Microchip PIC mikrodenetleyicileri ve dsPIC sayısal sinyal kontrolörleri için C kodu üretebilir. Burada kullanılan yaklaşım basit adımlardan oluşmaktadır ve geleneksel yaklaşımlara göre daha güvenilirdir ve geliştirme zamanından tasarruf sağlar. Aşağıda fırçasız DC motorun (BLDC) sensörlü açık-çevrim kontrolünün Xcos üzerinde tasarlanması, C kodunun üretilmesi ve Microchip dsPICDEM MCLV geliştirme kartı üzerinde çalıştırılması anlatılacaktır.
Bu örnekte yüksek performansa, darbe-genişlik modülatörü (PWM), hızlı ve esnek analog/sayısal dönüştürü (ADC) gibi gerekli çevre birimlere sahip olması nedeniyle Microchip dsPIC sayısal İşaret Kontrolörü (DSC) kullanılmıştır. Şekil-1 hedef donanım sisteminin basitleştirilmiş yapısını göstermektedir.
Şekil-1 Hedef donanım sisteminin blok diyagramı
Burada dsPIC DSC kontrol algoritmasını yürütür. Bu algoritma istenen hız değerini analog/sayısal modüle bağlı harici potansiyometre yardımıyla almakta, ve istenen hıza ve Hall effect sensörlerden elde edilen rotor konumuna göre darbe-genişlik modüleli (PWM) sinyal üreterek motor sürücü devresine uygulamakta ve böylelikle motorun hızını kontrol etmektedir.
Motor kontrol programı iki aşamadan oluşmaktadır. İlk olarak başlatma aşaması yürütülür. Bu aşamada 500ms boyunca PWM çıkışları bootstrap kapasitörleri dolacak şekilde ayarlanarak beklenir. Daha sonra açık-çevrim BLDC kontrol algoritması yürütülür. Burada A/D kesme rutini düzenli olarak potansiyometreden istenen hızı okumak ve bu değeri PWM registerlerine yüklemek amacıyla kullanılmaktadır. DSC'nin Change Notification (CN) uçlarına Hall effect sensörler bağlıdır. Motor dönerken rotor mıknatıslarının konumu değişir ve rotor faklı sektör bir sektöre girer. Her sektör değişme anlarında CN kesme rutini Hall effect sensörlerini okuyarak bulunulan sektörü belirler ve buna göre Override Control Register (OVDCON) sabit tablodan alınan değerlere göre güncellenir. Bu işlem doğru sargıların enerjilendirilmesini ve motorun dönmeye devam etmesini sağlar. Eğer motor çalışırken PWM hata kesmesi (FLTA) oluşursa ilgili kesme rutini motoru durdurur ve diğer kesmeleri önler Şekil-2 algoritmayı, Şekil-3-5 bu algoritma için oluşturulmuş diyagramı gösterir.
Şekil-2 Açık-çevrim BLDC kontrol algoritması
Şekil-3 A/D kesme rutini Xcos diyagramı
Şekil-4 Change notification kesme rutini Xcos diyagramı
Şekil-5 PWM hata kesme rutini Xcos diyagramı
Şekil-6 bootstrap kapasitörlerinin şarj edilmesi ve sonraki aşamaya geçiş ve Şekil-7 A/D modülü konfigürayon registerleri başlangıç ayarları için oluşturulmuştur.
Şekil-6 İlk aşama ve ikinci aşamaya geçiş için Xcos diyagramı
Şekil-7 A/D başlangıç değerleri için Xcos diyagramı
Buraya kadar algoritmanın tüm kısımları için gerekli diyagramlar oluşturulmuştur. Şimdi bunları bir araya getirelim. Diyagramlar süper bloklar kullanılarak basitleştirilmekte ve herbirine farklı etiketler atanmaktadır. Ayrıca süper blokların giriş ve çıkış portları donanım registerleri veya global değişkenlerle eşlenmektedir. Eğer bir port hiç bir yere bağlanmayacaksa pl_Ground_g veya pl_Terminator blokları ile sonlandırılmalı ve bağlı link etiketlenmelidir. Şekil-8'de verilen diyagram algoritmanın tüm kısımlarını içermektedir.
Şekil-8 Kontrol algoritması Xcos diyagramı
Şimdi diyagramı simüle ederek algoritmanın beklendiği şekilde çalışıp çalışmadığını kontrol edebiliriz. Şekil-9'da diyagramın en üst seviyesi görülmektedir. Şekildeki daha büyük olan süper blok SENSORED_BLDC_CONT C kodu üretilecek olan algoritmayı, ve daha küçük olan süper blok MCU simülasyon amaçlı donanımı içerir.
Şekil-9 Kontrol algoritma ve kontrol edilecek donanım için Xcos diyagramı
Şekil-10 Açık-çevrim BLDC kontrol algoritmsı simülasyon sonucu. Alttaki grafik üstteki grafiğin büyütlmüş halidir
Bu demoda kullanılan Microchip ürünleri aşağıda listelenmiştir.
(a) dsPICDEM MCLV Geliştirme Kartı (DM330021) ve dsPIC33FJ256MC710A Plug-in Modül (PIM). Kart ayrıca sürücü devreyi ve potansiyometreyi içerir
(b) Hall effect sensörlü 24-Volt 3-faz fırçasız DC Motor (BLDC) (AC300020)
(c) MPLB ICD 3 In-Circuit Debugger/Programmer
(d) 24-Volt harici güç kaynağı (AC002013)
ve Şekil-11'de bu set görülmektedir.
Şekil-11 Demo düzeneği
Şekil-12 Gömülü (Embedded) kod üretiminin en üst seviyesini göstermektedir. Burada süper blok DSC/mikrodenetleyici programı içerir ve sağ taraftaki bloklar konfigürasyon bloklarıdır.
Şekil-12 En üst seviye Xcos diyagramı
Hedef paltform konfigürasonunu belirlemek için diyagrama Microcip PicMicro paletinden pl_PIC_Core bloğu eklenir ve parametreleri ayarlanır. Hedef konfigürasyonunu basitleştirmek için beş butondan oluşan bir GUI bulunur. GUI konfigürasyonun bütünlüğünü de tes eder. Eğer girilen işlemci ismi modül veri tabanında bulunmuyorsa, bir uyarı görüntülenir veişlemci tanımları MPLAB IDE X veri tabanından otomatik olarak alınır. Eğer Desired system frequency (buton 3) ile verilen değer elde edilemiyorsa yine bir uyarı görüntülenir ve elde edilebilen en yakın değer otomatik olarak seçilir. Ayrıca motor darbe genişlik modülasyonu (MCPWM) konfigürasyonu için pl_PIC_MCPWM bloğu ve genela amaçlı giriş/çıkış konfigürasyonu için pl_PIC_GPIO bloğu diyagrama eklenir. Bu bloklar için GUI'ler Şekil-13'de verilmiştir.
Şekil-13 pl_PIC_Core, pl_PIC_MCPWM, pl_PIC_GPIO bloklarına ait GUI'ler (Grafik Ara Yüz)
Şimdi hedef için nasıl C kodu üretilecektir. Önce ana süper blok tıklanarak seçilir ve Xcos menü çubuğundan Tool->Equalis Embedded Coder seçilir. Açılan pencereden hedef klasör seçilir. Böylece kod üretme işlemi başlar. İşlem bittiğinde seçilen hedef klasör içinde değişik dosyalar oluşturulmuş olur. Bunlardan biri hex dosyasıdır. Bu dosya işelm sırasında MPLAB XC16 Compiler kullanılarak otomatik olarak üretilir. Üretilen bu dosya dsPIC DSC'ye yüklenebilir. Hedef klasörde ayrıca kaynak kodlar da bulunur. Şekil-14'de hedef klasör ve üretilen C kodu görülmektedir.
Şekil-14 Üretilen C kodu ve klasörler
Bu basit, zamandan tasarruf sağlayan ve güvenilir C kodu üretme yöntemi mühendislere hızlı geliştirme imkanı sağlar.
Kaynaklar
Equalis Embedded Coder Module Part 2 – Sensored Brushless DC Motor Control
Equalis Embedded Coder Module
Equalis Embedded Coder Bölüm 1 - Kalman Filtresi
Equalis Embedded Coder Module Part 1 – Kalman Filter @ Equalis Scilab Tips
================================== Proge Consulting Ltd 2013, Tüm Hakları Saklıdır.
0 notes
Text
Equalis Embedded Coder Bölüm 1 - Kalman Filtresi
Equalis Embedded Coder Bölüm 1 - Kalman Filtresi[1]
Equalis Embedded Coder modülü[2] Xcos'da oluşturduğunuz bir diagramdan otomatik olarak taşınabilir C kodları ve Microchip mikrokontrolörleri için C kodları üretmenizi sağlar. Bu kapsamlı çözüm sayesinde hem gerçek-zamanlı sistemler hem de gerçek-zamanlı olmayan sistemlerin geliştirlmesinde hızlı geliştirme ve çevrim-içi donanım testlerinde çok büyük verimlilik sağlanır.
Bu yazı Embedded Coder serisinin ilk bölümüdür, ve bir Kalman Filtresi örneği ile bu araç hakkında bilgi verilecektir.
Şekil-1 Kalman Filtresinin Xcos diayagramını göstermektedir. Burada Kalman Filtresi Xcos'ta bir alt-sistem olan süper bloğun içindedir. Bunun nedeni C kodunun yalnızca süper bloklar için üretilmesidir. Şekil-2 ve Şekil-3 Kalman Filtresi süper bloğunun içini göstermektedir. Kalman Filtresi sistemi ile ilgili eşitlikler aşağıda verilmiştir.
Şekil-1 Kalman Filtresi Xcos Diyagramı
Şekil 2 Şekil-1'deki Süper Bloğun İçi
Şekil 3 Şekil-2'deki Süper Bloğun İçi
Şimdi diyagram C kodu üretmek için hazırdır ve bunun nasıl yapıldığını görebiliriz. Önce süper blok üzerine tıklıyoruz ve Tool menüsü altında bulunan "Equalis Coder" seçeneğini seçiyoruz. Daha sonra hedef klasörü seçmek için bir pencere açılacaktır. Klasör seçildikten sonra kod üretme işlemi başlayacaktır. Şimdi Kalman Filtresinin C kodunu seçmiş olduğunuz klasör altında bulabilirsiniz.
Şekil-5 C kodu üretme aşamaları
Yazının sonraki kısmı Microchip mikrokontrolörü üzerinde BLDC Motor Kontrolü[3] hakında olacaktır.
Kaynaklar
Equalis Embedded Coder Module Part 1 – Kalman Filter @ Equalis Scilab Tips
Equalis Embedded Coder Module
Equalis Embedded Coder Module Part 2 – Sensored Brushless DC Motor Control
================================== Proge Consulting Ltd 2013, Tüm Hakları Saklıdır.
0 notes
Text
Scilab'de LaTeX Kod Oluşturmak Çok Kolay!
Scilab'de LaTeX Kod Oluşturmak Çok Kolay![1]
Scilab'de yaptığınız bir hesaplamanın sonucunu makaleniz LaTeX kod olarak yazdırmak isterseniz bunu prettyprint fonksiyonu ile çok kolay yapabilirsiniz.
Reel/kompleks matrisler, polinomlor, Boolean, tamsayı, string, tlist, kesirli sayılar ve cell gibi bir çok tipteki Scilab giriş/çıkışlarının LaTeX kodunu oluşturarak bunu makalelerinizde kullanmanız mümkündür. Aşağıda bir örnek verilmiştir.
-->A = rand(5, 5); -->str = prettyprint(A)
$$ \begin{pmatrix}0.2113249&0.6283918&0.5608486&0.2320748&0.3076091\cr 0.756043 9&0.8497452&0.6623569&0.2312237&0.9329616\cr 0.0002211&0.6857310&0.726350 7&0.2164633&0.2146008\cr 0.3303271&0.8782165&0.1985144&0.8833888&0.312642 \cr 0.6653811&0.0683740&0.5442573&0.6525135&0.3616361\cr \end{pmatrix} $$
Elde edilen kodu PDF[2] ve text[3] olarak kaynaklarda bulabilirsiniz. Bu matrisi Scilab grafiği olarak yazdırmak isterseniz aşağıdaki gibi yapabilirsiniz.
-->xstring(0.2, 0.2, str)

LaTeX hakkında daha detaylı bilgi için LaTeX web sitesini[4] ziyaret edebilirsiniz, veya Scilab yardım sayfasına[5] bakabilirsiniz.
Kaynaklar
Creating LaTeX code in Scilab is easy! @ Equalis Scilab Tips
Örnek verilen matris için PDF çıktısı
Örnek verilen matris için LaTeX kodu
LaTeX Web sitesi
Scilab Grafiklerinde Matematiksel yorumlayıcılar yardım sayfası
================================== Proge Consulting Ltd 2013, Tüm Hakları Saklıdır.
0 notes
Text
Scilab'de Basit bir Sinyal İşleme Örneği Filtre Tasarımı
Scilab'de Basit bir Sinyal İşleme Örneği[1] Filtre Tasarımı
Matematiksel denklemlerle birlikte bunların görselleştirilmesini sağlayan grafikler her zaman elinizdeki eşitiliği daha iyi anlamanızı sağlar.
Aşağıda frekans ve zaman domenlerindeki grafiklerle birlikte basit bir filtre tasarımı örneği verilmiştir.
// Ornekleme frekansi 1000 Hz olan bir sinyal olustur Fs = 1000; t = 0:1/Fs:1; n = length(t); f = linspace(0,Fs,length(t)); // Frekans vektoru x1 = sin(2*%pi*10*t); // 10 Hz Sinus Dalgasi x2 = sin(2*%pi*100*t); // 100 Hz Sinus Dalgasi x = x1 + x2; // 10 Hz ve 100 Hz Sinus dalgalarinin kombinasyonu plot(t,x); // Sinus dalgasinin zaman domeni gosterimi

X = fft(x)./(length(x)/2); // Sinyalin frekans cevabi plot(f(1:n/2),abs(X(1:n/2))); // Frekans domeni gosterimi

Frekans domeni grafiği sinyalin 10Hz ve 100Hz bileşenlerine sahip olduğunu göstermektedir. Şimdi 100Hz bileşeni elimine edecek bir filtre tasarlayalım.
// 50 Hz kesme (cut-off) frekansli alcak-geciren (low-pass) butterworth filtresi hz = iir(8,'lp','butt',50/Fs,[]); [hzm,fr]=frmag(hz,256); fr2 = fr.*Fs; plot(fr2,hzm)

Daha kolay anlaşılması için filtre ve sinyalin grafiğini üst üste çizelim.
plot(f(1:n/2),abs(X(1:n/2)),fr2,hzm);

Yeşil renk filtreden geçen frekansların bandını (passband) gösterir. Burada 10Hz bileşen filtreden geçerken 100Hz bileşen elimine edilmektedir.
Şimdi bunu ispatlayalım.
// Sinyali filtreye uygula y = flts(x,hz); Y = fft(y)./(length(x)/2); // Frekans domeninde filtrenin cevabiyla filtre edilmis sinyali karsilastir plot(f(1:n/2),abs(Y(1:n/2)),fr2,hzm);

Son olarak 10Hz sinyal ile filtre edilmiş sinyali karşılaştıralım.
plot(t,x1,t,y);

Orijinal sinyal

Kaynaklar
Simple Signal Processing Example with Scilab @ Equalis Scilab Tips
================================== Proge Consulting Ltd 2013, Tüm Hakları Saklıdır.
0 notes
Text
Scilab'de 3 Adımda Kullanıcı Arayüzü (GUI) Oluşturma
Scilab'de 3 Adımda Kullanıcı Arayüzü (GUI) Oluşturma[1]
Aşağıda kısaca bir kullanıcı arayüzü (GUI - Graphical User Interface) oluşturmak için gerekli adımlar verilmiştir.
figure komutu ile bir grafik penceresi oluşturun Öncelikle bir grafik peceresine ihtiyacımız vardır. Bu figure komutu ile oluşturulur. pencerinin boyutunu, arka plan rengini ve başlığı gibi özellikleri seçmek için değişik seçenekler vardır. Daha detaylı bilgi için figure komutu yardım sayfasına[2] bakılabilir. Figüre daha sonra ulaşabilmek için f = figure( ... ) pencereyi oluşturun.
uicontrol komutu ile bir GUI objesi oluşturun. uicontrol fonksiyonu figür içerisinde butonlar, seçme kutuları, liste kutuları ve daha bir çok türde kontrol objesi oluşturur. Daha detaylı bilgi için uicontrol komutu yardım sayfasına[3] bakılabilir.
callback için gerekli fonksiyonu yazın. uicontrol objesinin callback özelliği bir uicontrol nesnesi aktif olduğunda Scilab'in yapmasını istedğimiz şeyleri belirtmemizi sağlar. Örneğin bir buna tıklayarak GUI kutusuna yazılmış iki sayıyı toplamak istersek, önce bu iki sayıyı toplayan bir fonksiyon yazmalı ve daha sonra bu fonksiyonu callback özelliği yardımıyla çağırmalısınız.
Aşağıda bir örnek verilmiştir. Scilab yıl / ay / gun şeklinde verilen bir tarihin haftanın hangi gününe geldiğini gösteren weekday[4] bir fonksiyonuna sahiptir. Aşağıdaki GUI kullanıcının doğum tarihinin haftanın hangi gününe geldiğini göstermektedir. Scilab kodu[5] kaynaklarda verilmiştir.
Kaynaklar
3 Simple Steps for Creating GUI @ Equalis Scilab Tips
Scilab figure yardım sayfası
Scilab uicontrol yardım sayfası
Scilab weekday yardım sayfası
Verilen örnek için kaynak kodu
================================== Proge Consulting Ltd 2013, Tüm Hakları Saklıdır.
0 notes
Text
Scilab ATOMS Modül Yöneticisi
Scilab ATOMS Modül Yöneticisi[1]
ATOMS modül yöneticisi orijinal Scilab kurulumunda bulunmayan araçların yönetimi ve kurulumlarını sağlayan bir Scilab eklentisidir. Bazen modül veya araç (toolbox) terimlerin biribirlerinin yerine kullanılabilir. Daha geniş bilgi için Scilab ATOMS sitesini[2] ziyaret edebilirsiniz.
Nasıl Kullanılır?
ATOMS modül yöneticisi Scilab komut satırın üzerinden kullanılabileceği gibi, ATOMS GUI grafik arayüzünden de kullanılabilir. Aşağıda Proge tarafından ATOMS modülüne eklenmiş ScicosPowerLab[3] aracının ATOMS GUI üzerindeki görüntüsü verilmiştir.
Aşağıdaki tabloda ATOMS komutlarının bir listesi verilmiştir. Komutlarla ilgili daha detaylı bilgi için Scilab yardim sayfasına[4] bakabilirsiniz.
atomsInstall Modülleri dosyadan veya Scilab ATOMS sitesinden indirerek kurar atomsUpdate Modülleri günceller atomsRemove Önceden kurulu olan modülleri kaldırır atomsGetInstalled Kurulu modülleri listeler atomsIsInstalled Bir modülün kurulu olup olmadığını kontrol eder atomsLoad Modüller kurulduktan sonra yükler atomsGetLoaded Yüklü modülleri listeler atomsIsLoaded Bir modülün yüklü olup olmadığını kontrol eder atomsAutoloadList Başlangıçta otomatik olarak yüklenecek modülleri listeler atomsAutoloadAdd Otomatik olarak yüklenecek olan modülleri belirler atomsAutoloadDel Modülü otomatik yükleme listesinden siler atomsList Ulaşılabilecek modülleri listeler atomsSearch Modül arar atomsShow Modül karakteristiklerini listeler atomsDepTreeShow Modül bağımlılıklarını listeler atomsRepositoryList Modül depolarını listeler atomsRepositoryAdd Modül deposu ekler atomsRepositoryDel Modül deposunu listeden kaldırır
En sık kullanılan komutlar atomsInstall ve atomsRemove komutlarıdır. Aşağıda birkaçörnek verilmiştir.
atomsInstall('xcpl') // xcpl modulunu kur atomsInstall('SIVP') // SIVP modulunu kur atomsRemove('xcpl') // xcpl modulunu kaldır atomsRemove('SIVP') // SIVP modulunu kaldır
Hangi Araçlar Mevcuttur?
ATOMS modül yöneticisi ile erişebileceğiniz araçlar düzenli olarak güncellenmektedir. Şu anda görüntü işlemeden eğitime, donanım arayüzünden havacılığa bir çok kategoride 60 civarında araca erişilebilir.
Nasıl çalışır?
Scilab'de yeni bir modül kurulduğunda fonksiyonlar (skriptler ve derlenmiş kod), yardım sayfaları ve demolar da birlikte kurulurlar. Yeni kurulan fonksiyonlar diğer fonksiyonlar ile aynı şekilde çağrılabilirler.
Yeni kurulan araçlar ile ilgili dosyalar Windows'ta kullanıcı klasörü altında saklanırlar.
Kaynaklar
The ATOMS module manager @ Equalis Scilab Tips
Scilab ATOMS sitesi
ScicosPowerLab ATOMS sayfası
Scilab ATOMS yardım sayfası
================================== Proge Consulting Ltd 2013, Tüm Hakları Saklıdır.
0 notes
Text
Scilab Grafik Elemanları
Scilab Grafik Elemanları[1]
Scilab'de bir çok opsiyona sahip çok güçlü grafik elemanları vardır. Burada bunlardan nasıl faydalanacağınızı gösteren bazı ipuçşarı verilecektir. Detaylı bilgi almak için Scilab'de aşağıdaki şekilde yardım sayfasına[2] ulaşabilirsiniz.
-->help graphics_entites
İlk olarak aşağıda grafik elemanlarının özelliklerini döndüren bazı fonksiyonlar özetlenmiştir.
get grafik elemanının veya arayüz objesinin özeliklerini getirir - get(prop) ve h.prop aynıdır gce() aktif elemanın döndürür - get("current_entity”) ve get("hdl”) ile aynıdır gcf() aktif figürü döndürür - get("current_figure”) ile aynıdır gca() aktif eksenleri döndürür - get("current_axes”) ile aynıdır gdf() varsayılan figürü döndürür - get("default_figure”) ile aynıdır gda() varsayılan eksenleri döndürür - "get("default_axes”) ile aynıdır
Aşağıda bazı örnekler vardır
-->plot2d() -->h1 = gce() h1 = Handle of type "Compound" with properties: ========================================== parent: Axes children: ["Polyline";"Polyline";"Polyline"] visible = "on" user_data = []
Compound çizimin id'sidir, Parent tarafından kapsanmaktadır, ve ["Polyline";"Polyline";"Polyline"] olmak üzere üç eğriyi kapsar.
Ekesenlerin özelliklerini aşağıdaki şekilde görebilirsiniz
-->h2 = h1.parent h2 = Handle of type "Axes" with properties: ====================================== parent: Figure children: "Compound" visible = "on" axes_visible = ["on","on","on"] axes_reverse = ["off","off","off"] grid = [-1,-1] grid_position = "background" x_location = "bottom" y_location = "left" title: "Label” x_label: "Label" y_label: "Label" z_label: "Label" …
Bu gca()<> ile aynıdır
-->gca() ans = Handle of type "Axes" with properties: ====================================== parent: Figure children: "Compound" ...
Burada x_label, Label olarak görülmektedir. Bunun anlamı Label Axis 'in alt elemanıdır. Label içerisinde ne olduğunu aşağıdaki şeklide görebilirsiniz.
-->h3 = h2.x_label h3 = Handle of type "Label" with properties: ======================================= parent: Axes visible = "on" text = "" font_foreground = -1 foreground = -1 background = -2 fill_mode = "off" font_style = 6 font_size = 1 fractional_font = "off" font_angle = 0 auto_position = "on" position = [3.0887178, -2.3404348] auto_rotation = "on"
x eksenine x değerini atamak ve font boyutunu artırmak isterseniz aşağıdaki şekilde yapabilirsiniz
-->h3.text = "x”; h3.font_size = 4;
Ayrıca y eksenine y değerini atayalım ve font boyutunu büyütelim, başlık plot2d() olsun, ve çizmleir plot 1, plot 2 ve plot 3 olarak adlandıralım.
-->h2.y_label.text = "y”; h2.y_label.font_size = 6; -->h2.title.text = "plot2d() Demo”; h2.title.font_size = 4;
Aşağıda sonuçta elde edilen grafiği görebilirsiniz.

Kaynaklar
Graphic Entities @ Equalis Scilab Tips
Scilab Graphics Entities online yardım sayfası
================================== Proge Consulting Ltd 2013, Tüm Hakları Saklıdır.
0 notes
Text
Scilab'de C Programlarının Derlenmesi ve Çağrılması
Scilab'de C Programlarının Derlenmesi ve Çağrılması[1]
Tüm yorumlanan programlama dillerinde olduğu gibi Scilab'de yazılan programlar C programlama dili gibi doğal programlama dillerinde yazılan programlardan daha yavaş çalışırlar. Bu problem optimize edilmiş kütüphaneleri (örneğin BLAS ve LAPACK gibi) çağırarak ve Scilab'i arayüz gibi kullanarak çözülebilir.
Burada kısaca Scilab'de C programlarının nasıl yazılacağı, derleneceği, ve kullanıcı tarafından oluşturulmuş bir C programının nasıl çağrılacağı gösterilecektir.
64-bit Windows 7 makine üzerinde Scilab-5.4.1 kullanılmıştır. Başlamadan önce aşağıdakileri kontro edin.
havecompiler ile sisteminizde kurulu bir derleyici (compiler) olup olmadığını kontrol edin
Eğer yoksa, en iyi çözüm ücretsiz olarak edinebileceğiniz Microsoft Visual Studio 2010 Express C++[2] derleyicisidir.
Eğer Scilab'in 64-bit versiyonunu kullanmak isterseniz Microsoft Windos SDK[3] edinmeniz gerekir. Bu da ücretsiz olarak edinilebilir.
Derleyici kurulduğunda Scilab derleyiciyi otomatik olarak tanıyacaktır.
Burada Scilab yardım sayfasındaki optim[4] maddesi altında bulunan örnek kullanılacaktır.
Kodu doğrudan kopyalayıp Scilab komut penceresine yapıştırabilirsiniz. Örnekte verilen C programı string matris olarak yazılmış ve kayıt edilmiştir.
// External function written in C (C compiler required) // write down the C code (Rosenbrock problem) C=['#include <math.h>' 'double sq(double x)' '{ return x*x;}' 'void rosenc(int *ind, int *n, double *x, double *f, double *g, ' ' int *ti, float*tr, double *td)' '{' ' double p;' ' int i;' ' p=td[0];' ' if (*ind==2||*ind==4) {' ' *f=1.0;' ' for (i=1;i<*n;i++)' ' *f+=p*sq(x[i]-sq(x[i-1]))+sq(1.0-x[i]);' ' }' ' if (*ind==3||*ind==4) {' ' g[0]=-4.0*p*(x[1]-sq(x[0]))*x[0];' ' for (i=1;i<*n-1;i++)' 'g[i]=2.0*p*(x[i]-sq(x[i-1]))-4.0*p*(x[i+1]-sq(x[i]))*x[i]-2.0*(1.0-x[i]);' ' g[*n-1]=2.0*p*(x[*n-1]-sq(x[*n-2]))-2.0*(1.0-x[*n-1]);' ' }' '}'];
Mevcut bir C (veya FORTRAN) programınız varsa önceki adımı atlayabilirsiniz.
cd TMPDIR; mputl(C,TMPDIR+'/rosenc.c')
C programını aşağıdaki şekilde derliyoruz.
l=ilib_for_link('rosenc','rosenc.c',[],'c');
TMP klasörü altında aşağıdaki dosyalar üretilecektir.
rosenc.c Makelib.mak loader.sce librosenc.lib librosenc.exp librosenc.dll librosenc.def cleaner.sce
Derlenen C fonksiyonunu Scilab'e aşağıdaki şekilde yüklüyoruz.
exec loader.sce;
Yeni oluşturulan fonksiyonu aşağıdaki şekilde kullanabiliyoruz.
//solve the problem x0=[40;10;50]; p=100; [f,xo,go]=call('rosenc',x0,p)
Sonuç aşağıdaki gibi olacaktır.
-->[f,xo,go]=call('rosenc',x0,p) go = 100. xo = 40. 10. 50. f = rosenc
NOT: Güncel bir yöntem için Kaynak-5' bakabilirsiniz.
Kaynaklar
Compiling and calling a C program in Scilab @ Equalis Scilab Tips
Microsoft Visual Studio 2010 Express C++
Microsoft Windos SDK
Scilab Help Sayfası optim maddesi
WildCruncher Scilab Tip @ Equalis Scilab Tips
================================== Proge Consulting Ltd 2013, Tüm Hakları Saklıdır.
0 notes
Text
Scilab Hata Raporları ve Equalis Scilab On-line Destek (SOS)
Bir Scilab fonksiyonunun düzgün çalışmadığını düşünüyorsanız, veya Scilab'i kurarken veya çalıştırırken beklemediğiniz hatalar alıyorsanız, bunun bir bug (hata) olup olmadığını öğrenmek isteyebilirsiniz. Scilab bütün hataları Bugzilla sitesi yoluyla işleme alır. Bu siteden sorunun daha evvelden rapor edilip edilmediğini kontrol edebilirsiniz. Eğer rapor edilmemiş ise yeni bir bug raporu oluşturabilirsiniz. Daha sonra Scilab teknik uzmanları problem inceleyecek ve size durum hakkında bilgilendirecektir.
Scilab'in açık kaynak kodlu bir yazılım olduğunu ve kullanıcılarının katkısı ile yazılımın daha da iyileştirilebileceğini unutmayalım.
Equalis ve dolayısıyla Proge Scilab On-line Support (SOS) kullanıcıları için geri-bildirimleri toplayarak ve bunun yanısıra bug düzeltmelerini önceliklendirerek Scilab ürününün geliştirilmesine katkıda bulunmaktadır.
0 notes
Text
Scilab Görüntü ve Video İşleme Aracı
Scilab Görüntü ve Video İşleme Aracı[1] - SIVP toolbox[2]
SIVP Shiqi Yu ve çalışma arkadaşları tarafından geliştirilen Scilab tabanlı görüntü ve video işleme aracıdır. Mevcut versiyonu 0.5.3'tür. Windows kullanıcıları için derlenmiş versiyonu vardır. Aşağıda bazı demolar bulabilirsiniz.
Demolardan birisi yüzleri tanıyan face.sce 'dir. Aşağıda birkaç farlı imaj için yapılmış denemeler vardır.



Boyut, çözünürlük ve yüzlerin yönelimi ile ilgili bazı sınırlamalar olsa da sonuçlar oldukça tatmin edicidir.
Ayrıca camshift demosunda hareket eden araçları tanınmaktadır. Demoyu çalıştırdığınızda aviopen hatası alıyorsanız, divx veya xvid codec'lerine ihtiyacınız var. Burada xvid kullanılmıştır.
Demoyu aşağıdaki şekilde çalıştırabilirsiniz.
XVID[3] sitesinden http://downloads.xvid.org/downloads/xvidcore-1.3.2.zip dosyasını indirin
xvid klasörünün SIVP klasörü içine kopyalayın
camshift demosunu çalıştırın
Aşağıda bazı ekran görüntüleri verilmiştir.
Kaynaklar
SIVP toolbox, Equalis Scilab Tips
SIVP web sitesi
XVID web sitesi
================================== Proge Consulting Ltd 2013, Tüm Hakları Saklıdır.
0 notes