<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>~mühendisliğe dair kendi çapında karalamalar... &#187; Çalışmalarım</title>
	<atom:link href="http://www.fatiherdem.net/category/calismalarim/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.fatiherdem.net</link>
	<description>mühendisliğe dair kendi çapında karalamalar...</description>
	<lastBuildDate>Sat, 28 Jan 2012 07:58:58 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>PT2262 ile PT2272-M4 ve PT2272-L4 Denemeleri</title>
		<link>http://www.fatiherdem.net/pt2262-ile-pt2272-m4-ve-pt2272-l4-denemeleri/</link>
		<comments>http://www.fatiherdem.net/pt2262-ile-pt2272-m4-ve-pt2272-l4-denemeleri/#comments</comments>
		<pubDate>Sun, 21 Aug 2011 20:14:26 +0000</pubDate>
		<dc:creator>ferdem</dc:creator>
				<category><![CDATA[Çalışmalarım]]></category>
		<category><![CDATA[PT2262 PT2272]]></category>

		<guid isPermaLink="false">http://www.fatiherdem.net/?p=2087</guid>
		<description><![CDATA[Son güncellenme: 10 Eylül 2011 PT2262 ile PT2272-XY bir encoder-decoder çiftidir. PT2262 paralel uygulanan data ve adres bitlerini belirli bir kurala göre kodlar, PT2272 ise kodlanmış verinin içerisindeki adres bilgisiyle kendisine uygulanmış adres bilgisini karşılaştırır, tutuyorsa kodlanmış verinin içinden vericinin gönderdiği bitleri çözer ve data çıkışına yansıtır. Basit RF modüller ile 4-6 bit paralel bilgi iletilmesi bu [...]]]></description>
			<content:encoded><![CDATA[<p>Son güncellenme: 10 Eylül 2011</p>
<p>PT2262 ile PT2272-XY bir encoder-decoder çiftidir. PT2262 paralel uygulanan data ve adres bitlerini belirli bir kurala göre kodlar, PT2272 ise kodlanmış verinin içerisindeki adres bilgisiyle kendisine uygulanmış adres bilgisini karşılaştırır, tutuyorsa kodlanmış verinin içinden vericinin gönderdiği bitleri çözer ve data çıkışına yansıtır. Basit RF modüller ile 4-6 bit paralel bilgi iletilmesi bu çiftin kullanıldığı yerlere güzel bir örnektir. Kodlama işlemi katalogda anlatılmış, yapılan işlem lojik1 biti yerine 10001000, lojik 0 biti yerine 11101110 bitlerini göndermek <strong>gibi</strong> bir işlem yoksa PT lerin herhangi bir şifreleme özelliği yoktur.</p>
<p><a href="http://www.fatiherdem.net/wp-content/yuklenenler/2262_2272_blok2.gif"><img class="alignnone size-medium wp-image-2101" title="2262_2272_blok" src="http://www.fatiherdem.net/wp-content/yuklenenler/2262_2272_blok2-300x68.gif" alt="2262_2272_blok" width="300" height="68" /></a><span id="more-2087"></span></p>
<p>Öncelikle kodlama ile şifrelemeyi ayırmak gerekir. Haberleşmede veriyi direkt göndermek yerine kodlama-kod çözme işlemini araya koymanın birkaç nedeni vardır:</p>
<p>1) Sağlamlık: Çeşitli kodlama teknikleriyle, data bitlerine eklenen bitler(parite bitleri) sayesinde kanalda olası bir hatanın alıcı tarafta sezilmesi ve hatta düzeltilmesi mümkün olabiliyor (Popüler kodlama yöntemleri: cyclic codes, convolutional codes).<br />
2) Donanımsal: RF veya IR haberleşmede kodlama, haberleşmeyi daha sağlıklı yapabiliyor. Mesela lojik 1 leri 10, lojik 0 ları ise 01 şeklinde kodlamak hızı düşürse de donanımın daha az hatalı çalışmasını sağlayabiliyor.</p>
<p>Şifreleme(kriptolama) ise PT lerle ilgisi olmayan bambaşka bir konu, genel olarak kriptolamada sadece alıcıda ve verici tarafında bilinen bir anahtar olur. Verici taraf bu anahtara ve belirli bir algoritmaya göre datayı(kırmızı bilgiyi) kriptolar, alıcı taraf da bu anahtara göre datayı çözer.</p>
<p>PT serisi daha çok donanımsal sebeplerden ve adresleme amaçlı kullanılıyor[Bu cümleyi düzelttim]. PT2272 alıcısı adres bilgisi uyuşmadığı sürece datayı çözmediğinden alıcının hata yapma ihtimali düşüyor ancak buradaki güvenliğin şifreleme ile ilgisi yok, nitekim adres ve data bitleri 3. kişiler tarafından rahatça görülebilecek/kayıt edilebilecek şekilde olduğu gibi kodlanmaktadır.</p>
<p>Bu yazıda bahsedeceğim denemelerimde PT2262 ile PT2272-M4 ve PT2272-L4 kullandım.</p>
<p><a href="http://www.fatiherdem.net/wp-content/yuklenenler/2262_2272_pin.gif"><img class="alignnone size-medium wp-image-2088" title="2262_2272_pin" src="http://www.fatiherdem.net/wp-content/yuklenenler/2262_2272_pin-300x142.gif" alt="2262_2272_pin" width="300" height="142" /></a></p>
<p>PT2272 nin 2 tipi var, (M)omentary ve (L)atched. PT2272 adından sonra gelen M ve L harfleri tipi belirtiyor. Hemen sonra gelen sayı ise data bit sayısını belirtiyor. PT2272-M6, momentary tip 6 bit data alabilen demek oluyor.</p>
<p>Alıcı-verici çiftinin çalışabilmesi için iki tarafın osilatör frekanslarının uyumlu olması gerekiyor(PT2272 nin 2.5~8 kat daha hızlı olması gerekiyormuş). Frekansları belirleyen dirençler için tavsiye edilen değerler datasheet ten de görülebileceği gibi tabloda verilmiş:</p>
<p><a href="http://www.fatiherdem.net/wp-content/yuklenenler/pt2262_pt2272_osilator.gif"><img class="alignnone size-medium wp-image-2089" title="pt2262_pt2272_osilator" src="http://www.fatiherdem.net/wp-content/yuklenenler/pt2262_pt2272_osilator-300x84.gif" alt="pt2262_pt2272_osilator" width="300" height="84" /></a></p>
<p>Ben 1.2M ve 200k seçeneğini kullandım.</p>
<p><strong>PT2262 Tarafından Üretilen Dalga Şekilleri</strong></p>
<p>Sistemin çalışmasına geçmeden önce PT2262 tarafından üretilen dalga şekillerine bir göz bakalım. Ayrıntılı katalogda verildiği üzere bir kod sözcüğü aşağıdaki bitlerden oluşmaktadır.</p>
<p><a href="http://www.fatiherdem.net/wp-content/yuklenenler/pt2262_code_frame.gif"><img class="alignnone size-medium wp-image-2175" title="pt2262_code_frame" src="http://www.fatiherdem.net/wp-content/yuklenenler/pt2262_code_frame-300x55.gif" alt="pt2262_code_frame" width="300" height="55" /></a></p>
<p>Görüldüğü üzere adres ve bilgi bitleri direkt gönderilmektedir. Buradaki bitlerin PT2262 tarafından nasıl kodlandığı ise aşağıda gösterilmiştir:</p>
<p><a href="http://www.fatiherdem.net/wp-content/yuklenenler/pt2262_bit_waveform.gif"><img class="alignnone size-medium wp-image-2176" title="pt2262_bit_waveform" src="http://www.fatiherdem.net/wp-content/yuklenenler/pt2262_bit_waveform-300x136.gif" alt="pt2262_bit_waveform" width="300" height="136" /></a></p>
<p>A3 ve A7 bitleri lojik1 diğer adres bitleri lojik0 olduğu durumdaki örnek bir kod sözcüğünün adres bitleri aşağıda görülmektedir:</p>
<p><a href="http://www.fatiherdem.net/wp-content/yuklenenler/pt2262_ornek_kod_sozcugu1.gif"><img class="alignnone size-medium wp-image-2182" title="pt2262_ornek_kod_sozcugu" src="http://www.fatiherdem.net/wp-content/yuklenenler/pt2262_ornek_kod_sozcugu1-300x219.gif" alt="pt2262_ornek_kod_sozcugu" width="300" height="219" /></a></p>
<p>Aşağıda da yazdığım üzere VCC, /TE şartları sağlandığı sürece kod sözcüğü tekrar tekrar gönderilmekte:</p>
<p><a href="http://www.fatiherdem.net/wp-content/yuklenenler/pt2262_tekrar_eder3.gif"><img class="alignnone size-medium wp-image-2183" title="pt2262_tekrar_eder" src="http://www.fatiherdem.net/wp-content/yuklenenler/pt2262_tekrar_eder3-300x219.gif" alt="pt2262_tekrar_eder" width="300" height="219" /></a></p>
<p>Kod sözcüğünün tüm bitleri bir osiloskopta veya daha güzeli PICKIT2 ayarında lojik analizörlerle gözlenebilir.</p>
<p><strong>Sistemin Çalışması</strong></p>
<p>2262 de /TE ucunu toprağa çektiğimizde iletim aktif oluyor, toprakta kaldığı sürece tekrar tekrar gönderiyor, gözlediğime göre her 16ms de tekrar gönderiyor.</p>
<p>Momentary tip alıcının(PT2272-Mx) data çıkışlarında, vericiden gönderdiğiniz veriyi sadece gönderildiği sürece görebilirsiniz. Çıkışları bir süreliğine görmek isterseniz bu süre boyunca /TE yi toprağa çekerek gönderim yapmanız gerekir(alıcıda bir süre &#8220;valid transmission&#8221; ledini yakmış olacaksınız).  Örneğin uzaktan kumandalı araba yapmak isterseniz;) momentary alıcı kullanmanız daha uygun olur. /TE yi topraktan çeker çekmez(iletimi durdurur durdurmaz) alıcı taraf OFF oluyor(çıkışlar floating). PT2272-M4 ün çalışmasının kısa bir videosu şöyle:</p>
<p><span style="outline-width: 0px; outline-style: initial; outline-color: initial; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;"><object width="315" height="255"><param name="movie" value="http://www.youtube.com/v/UNZsRj0k3W8&amp;ap=%2526fmt%3D18" /><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><embed wmode="opaque" src="http://www.youtube.com/v/UNZsRj0k3W8&amp;ap=%2526fmt%3D18" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="315" height="255"></embed></object></span></p>
<p>Vericide(2262) iletim aktifken datayı değiştirdiğinizde gönderilen veri güncellenmiyor. /TE toprağa çekildiğinde PT2262 o anda girişlerde gördüğü datayı kodluyor ve /TE toprakta kaldığı sürece girişlerin değişmesi çıkışı değiştirmiyor. Yani /TE ucu sanki bir örnekleme işlemi gibi toprağa çekildiğinde datayı örnekleyip kodlamaya başlıyor. Güncellenme için /TE nin yenilenmesi(1&gt;0 yapılması) veya beslemenin resetlenmesi gerekiyor yani iletimin kesilip yeniden açılması gerekiyor. PT2262 nin datasheetinde diyotlar yardımıyla sadece butona basıldığında entegreye besleme uygulayan devrenin şeması var yani sadece düğmeye basılıyken entegrenin beslemesi veriliyor. Bu mantık güç tasarrufu açısından faydalı, sadece butona basıldığında enerji gitmesi data güncellenmesi problemini tek butona basılacaksa ortadan kaldırıyor ancak buton basılı tutulduğu esnada diğer bir butona basılması halinde veri güncellenmiyor(yukarıda bahsettiğimiz örnekleme problemi). Dolayısıyla uzaktan kumandalı arabanıza ileri komutu basılı iken bir süre sonra sağa dön komutu verdiğinizde dönmeyecektir! Eliniz çekip iki düğmeye birden basmanız gerekmektedir. Keyifsiz bir sürüş!  Bu durumu yukarıda verdiğim videonun son bölümünde göstermek istedim.</p>
<p>Latched tip alıcıda(PT2272-Lx) ise durum şöyle: PT2262 gönderdiği veriyi bir defalığına PT2272-L4 e ulaştırabilirse(alıcıdaki valid transmission ledini bir anlık yakabilirse) artık PT2272-L4 o data çıkışlarını vericiden bağımsız olarak sürekli tutar, PT2262 nin beslemesini çekseniz de PT2272-L4 ün çıkışları devam eder. Latched versiyonun çalışmasının kısa bir videosu şöyle:</p>
<p><object width="315" height="255"><param name="movie" value="http://www.youtube.com/v/PfnZHMZKk_I&amp;ap=%2526fmt%3D18" /><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><embed wmode="opaque" src="http://www.youtube.com/v/PfnZHMZKk_I&amp;ap=%2526fmt%3D18" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="315" height="255"></embed></object><br />
Tahmin edeceğiniz gibi bir buton basılıyken diğer butonun işlevsiz kalması problemi burada da var(videoda gösterilmedi) ancak bu problem latch tipte momentary tipteki kadar kritik bir problem değil.</p>
<p>PT2262 nin data uçlarının birinden UART veri girip PT2272 den almak akla gelebilir ancak PT çifti bu konuda çok yavaş kalıyor daha doğrusu o iş için tasarlanmamış. Düğmelerle denediğim uygulamada düğme yerine 50Hz lik bir kare dalga uyguladığımda bile 2272 nin data ucunda bu kare dalgayı göremiyorum, RF modülsüz direkt kablo bağlantısı yapılmışken.</p>
<p>PT2262 ve PT2272 nin detaylı datasheetleri önceki bir yazıda da verildiği üzere <a href="http://www.fatiherdem.net/wp-content/yuklenenler/pt2262%202272%20kataloglar.rar">bu bağlantı</a>dan indirilebilir.</p>
<p>Son olarak PT serisinin pek de sevimli olmayan datasheetlerini dirtikleyip şema çıkarmaya üşenen(!) arkadaşlar için denemesini yaptığım devrenin şemasını veriyorum:</p>
<p><a href="http://www.fatiherdem.net/wp-content/yuklenenler/pt2262_pt2272_devre_sema1.gif"><img class="alignnone size-medium wp-image-2152" title="pt2262_pt2272_devre_sema" src="http://www.fatiherdem.net/wp-content/yuklenenler/pt2262_pt2272_devre_sema1-300x178.gif" alt="pt2262_pt2272_devre_sema" width="300" height="178" /></a></p>
<p>Yazıyı burada bitiriyoruz. Bu sefer de ertelememeyi deneyelim;) Çalışma hevesiniz daim olsun.</p>
<p><strong>Ek notlar:</strong> Arkadaşlar katalogdaki örnek devre şemalarında adres bitleri hep &#8220;floating&#8221; bırakılmış. Girişler 3state olduğundan boş bırakmak da mümkün ancak ben denemelerimi adres bitlerini toprağa çekerek yaptığımı söylemiştim. Adres bitlerini değiştirmek istediğimde, mesela bir adres bitini dirençsiz +VCC ye çektiğimde PT2262 nin VCC verilmeksizin(herhangi bir düğmeye basılmadığı durum)(/TE toprakta tabi) veriyi kodlayıp gönderdiğini(entegrenin çalıştığını) gözledim, 10k ile çektiğimde  DOUT çıkışında genliğin 2V a düştüğünü ama yine de entegrenin çalıştığını gördüm. Bu durumlar(VCC pini bağlanmaksızın entegrenin çalışması) muhtemelen, girişleri korumak için konulmuş clamp diyotlar yüzünden olmaktadır. Dolayısıyla eğer adres bitlerini lojik1 yapmak istiyorsanız adres bitlerini çektiğiniz besleme gerilimi, sadece düğmeye basıldığında verilen besleme ile aynı olsun, VCC pini olabilir mesela. Yani düğmeye basıldığında entegre enerjilenmişti, adres bitleri de o zaman lojik1 olsun. Adres bitini sabit bir 5V a çekerseniz düğmeye basmasanız da(VCC gitmese de) adres girişlerinden entegre enerjileniyor ve kodlama/gönderme işlemi sürekli yapılıyor. Örnek şema:</p>
<p><a href="http://www.fatiherdem.net/wp-content/yuklenenler/pt2262_adresler_lojik1.gif"><img class="alignnone size-medium wp-image-2177" title="pt2262_adresler_lojik1" src="http://www.fatiherdem.net/wp-content/yuklenenler/pt2262_adresler_lojik1-251x300.gif" alt="pt2262_adresler_lojik1" width="251" height="300" /></a></p>
<p>Son olarak,  PT çiftinin kodlama ve kod çözme işlemleri, günümüz mikrodenetleyicileriyle yazılım ile de gerçeklenebilir.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fatiherdem.net/pt2262-ile-pt2272-m4-ve-pt2272-l4-denemeleri/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>AT89S52 ile Frekansmetre</title>
		<link>http://www.fatiherdem.net/at89s52-ile-frekansmetre/</link>
		<comments>http://www.fatiherdem.net/at89s52-ile-frekansmetre/#comments</comments>
		<pubDate>Sun, 08 Feb 2009 15:58:33 +0000</pubDate>
		<dc:creator>ferdem</dc:creator>
				<category><![CDATA[Çalışmalarım]]></category>

		<guid isPermaLink="false">http://www.fatiherdem.net/?p=392</guid>
		<description><![CDATA[Bu çalışma bir dersin dönem projesi, ders projesi olduğu için kendi isteğimizle yaptığımız projelere kıyasen biraz tatsız ve gelişmeye açık bir noktada bırakıldı. Belki birilerinin işine yarar diye yayınlamak istedim. Frekans, periyot ve &#8220;duty cycle&#8221; ölçüm uygulamalarında çeşitli mikrodenetleyiciler kullanıyoruz. Kullandığımız mikrodenetleyicilerde bu ölçümlerin yapılmasını kolaylaştıracak yardımcı özel donanımlar bulunuyor. PIC serisinden bildiğimiz &#8220;timer&#8221; lar, [...]]]></description>
			<content:encoded><![CDATA[<p>Bu çalışma bir dersin dönem projesi, ders projesi olduğu için kendi isteğimizle yaptığımız projelere kıyasen biraz tatsız ve gelişmeye açık bir noktada bırakıldı. Belki birilerinin işine yarar diye yayınlamak istedim.</p>
<p>Frekans, periyot ve &#8220;duty cycle&#8221; ölçüm uygulamalarında çeşitli mikrodenetleyiciler kullanıyoruz. Kullandığımız mikrodenetleyicilerde bu ölçümlerin yapılmasını kolaylaştıracak yardımcı özel donanımlar bulunuyor. PIC serisinden bildiğimiz &#8220;timer&#8221; lar, ccp modüller bu donanımlardan&#8230; Frekans, periyot ve &#8220;duty cycle&#8221; ölçmenin genel olarak uygulanan yöntemleri var, microchip yayınladığı bir uygulama notunda bu tarz ölçümlerin PIC mikrolarla kolayca yapılması için yöntemler önermiş, aşağıdaki linkten bu dökümana bakabilirsiniz:<br />
<a href="http://ww1.microchip.com/downloads/en/DeviceDoc/41214a.pdf" target="_blank">CCP and ECCP Tips and Tricks</a></p>
<p>Biz de AT89S52 ile frekans ölçmek için mikromuzun timer1, timer2 sini kullandık. AT89S52 de &#8220;timer&#8221; ların çeşitli çalışma modları var. timer2  nin de &#8220;autoreload&#8221; diye bir modu var. Bu modda timer2 yi taştıktan sonra belirlediğiniz bir değerden başlatabiliyorsunuz.  Biz bu değeri timer2 her 50 ms de bir taşacak şekilde ayarladık. timer2 taşma kesmelerinin sayısı 20 yi bulduğunda 1 saniyelik süreç dolmuş demektir. Bu sayede net bir 1 saniyelik süreç elde ettik. Bu bir saniye içerisinde gelen kenar sayısını Port 3.5 pini vasıtasıyla timer1e saydırdık, böylece frekansı bulmuş olduk.<br />
<span id="more-392"></span></p>
<p>Timer1i 16 bitlik counter modunda kullandığımızdan en fazla 65535 Hz i saydırabildik. timer1 taşma kesmesi kullanarak bant genişliği kolayca 65535*2 Hz e veya daha yüksek değerlere çıkarılabilir. Öte yandan frekans bölücü entegreler yardımıyla &#8220;auto-scale&#8221; özelliği eklenerek daha büyük bant genişlikleri elde edilebilir. Ama biz bunlara zaman bulamadık ve 65535 Hz de en basit haliyle bıraktık.</p>
<p>Bu frekansmetrenin temel özellikleri:<br />
*65535 hz bant genişliği<br />
*Waveform dan bağımsız herhangi TTL işaretin frekansını ölçebilmesi<br />
*LCD görüntü</p>
<p><img src="/resimler/udevre.jpg" alt="" /></p>
<p>Not: Kaynak kodda hex sayının bcd ye(binary codded decimal) çevrilmesi fonksiyonunda 8052.com daki bazı örneklerden faydalandık. Diğer kısımlar bize aittir.</p>
<p>İlgili dosyalar:<br />
<a href="/yuklenenler/freq_met.rar">Proteus Simülasyon Dosyası + freq_met.asm + freq_met.hex</a><br />
<a href="/yuklenenler/AT89S52.pdf">AT89S52 katalog</a><br />
<a href="/yuklenenler/atmel-project_report.pdf" target="_blank">Proje Raporu</a>(ing!)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fatiherdem.net/at89s52-ile-frekansmetre/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kablosuz seri iletişimde hatanın azaltılması</title>
		<link>http://www.fatiherdem.net/kablosuz-seri-iletisimde-hatanin-azaltilmasi/</link>
		<comments>http://www.fatiherdem.net/kablosuz-seri-iletisimde-hatanin-azaltilmasi/#comments</comments>
		<pubDate>Fri, 16 Jan 2009 18:42:09 +0000</pubDate>
		<dc:creator>ferdem</dc:creator>
				<category><![CDATA[Çalışmalarım]]></category>

		<guid isPermaLink="false">http://www.fatiherdem.net/?p=452</guid>
		<description><![CDATA[Kablosuz veri iletiminde eğer elimizdeki donanım yapmıyorsa gelen veriyi ayıklamak yazılıma kalıyor, tabiri caizse biraz takla atmamız gerekebiliyor. Yaygın olarak kullanılan ask rf alıcı-verici modüller de takla gerektiren donanımlardan. Çokça konuştuğumuz gibi bu modüllerle haberleşirken verimizi göndermeden önce uyandırma işareti, öncü veri bilgilerini gönderiyorduk. Uyandırma işaretini uyuyan modülü uyandırmak diğer tabirle &#8220;turn-on time&#8221; ı geçirmek, [...]]]></description>
			<content:encoded><![CDATA[<p>Kablosuz veri iletiminde eğer elimizdeki donanım yapmıyorsa gelen veriyi ayıklamak yazılıma kalıyor, tabiri caizse biraz takla atmamız gerekebiliyor. Yaygın olarak kullanılan ask rf alıcı-verici modüller de takla gerektiren donanımlardan. Çokça konuştuğumuz gibi bu modüllerle haberleşirken verimizi göndermeden önce uyandırma işareti, öncü veri bilgilerini gönderiyorduk. Uyandırma işaretini uyuyan modülü uyandırmak diğer tabirle &#8220;turn-on time&#8221; ı geçirmek, öncü veriyi de gönderici kimliğini belirtmek için gönderiyorduk. Çünkü bu modüller kendi frekansında gelen her ask işareti yorumluyor.<br />
Bazı uygulamalarda oluyor ki gönderdiğimiz verinin doğru anlaşılması çok önemli oluyor, veriyi yanlış anlayacağına hiç anlamasın daha iyi diyebiliyoruz. Bunu nasıl sağlarız diye düşünürken aklımdakileri denedim, sonuçlar fena değil.<span id="more-452"></span></p>
<p>Rf modüllerle veriyi sürekli gönderdiğimizi düşünelim, alıcı tarafta bu verilerin bir kısmı doğru alınırken bir kısmı yanlış alınıyor. <strong>Ama şöyle bir 5-10 elemanlık diziye baktığınızda gönderilen elemanı kestirebiliyorsunuz.</strong> Ben de dedim ki bu gelen 5-10 elemanı bir diziye dizeyim, sonra da dizi içinde en fazla geçen elemanı bulayım. Öncü veriyi yine kullanıyoruz ve arkasından &#8220;derinlik&#8221; adedince aynı veriyi gönderiyoruz, alıcı tarafta öncü veri geldikten sonra gelen &#8220;derinlik&#8221; adedince elemanı bir diziye yerleştiriyoruz, sonra da dizide en çok olan ve sayısı en az &#8220;enaz&#8221; değişkeni kadar olan veriyi bizim gönderdiğimiz veridir diye alıyoruz.  Eğer öncü veri gelir de -ki siz göndermeseniz de gürültüden gelebiliyor- arkasındaki dizide &#8220;enaz&#8221; değişkeni kadar geçen eleman olmazsa fonksiyon 0 döndürüyor.</p>
<p>Kodda da görebileceğiniz gibi algoritmanın &#8220;derinlik&#8221; ve &#8220;enaz&#8221; adında iki temel parametresi var. Bu parametreler şunu diyor: Gelen &#8220;derinlik&#8221; tane elemanı bir diziye diz, sayısı &#8220;enaz&#8221; veya daha fazla olan elemanı seç.</p>
<p><strong>Örn:</strong> &#8216;A&#8217; verisini derinlik=10, enaz=3 ve öncü=&#8217;x&#8217; olduğu durumda nasıl gönderildiğine bakalım:<br />
rfgonder(&#8216;A&#8217;);<br />
TX: ªªxxAAAAAAAAAA<br />
&#8216;ª&#8217; lar uyandırma işareti için-hiç kullanmayacağınız bir işaret seçebilirsiniz-, &#8216;x&#8217; i ben öncü veri olarak seçtim. &#8220;derinlik&#8221; adedince &#8216;A&#8217; arka arkaya gönderiliyor.</p>
<p>Alıcı tarafta ise en son görülen öncü veriden sonra alınan &#8220;derinlik&#8221; adedince veri diziye yerleştiriliyor. Örn alınan data şöyle olsun:<br />
xc£#AA~A¥σAAЦ&#8230;&#8230;<br />
Bu gelen datanın en son görülen öncüden(bu örnekte zaten bir tane var) sonraki ilk 10 elemanı diziye yerleştirildi, şu anda dizide:<br />
c£#AA~A¥σA elemanları var.<br />
En çok geçen elemana bakıldı A, geçme sayısı 4, 3 ten büyük. Demek ki gönderilen verimiz &#8216;A&#8217; dır.</p>
<p>Tabi bu şekilde veriyi daha güvenli iletirken hızımızı da düşürmüş oluyoruz.</p>
<p>Bu fonksiyon genel ve basit bir fonksyion, C ile yazıldı ve seri haberleşen herhangi iki modül arasında kullanılabilir. Ben CCS C de PIC ler arasında rf modül haberleşmesi üzerinden kullandım.</p>
<p>Alıcı ve verici tarafta bulunması gereken ortak parametreler:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#define oncu 'x'</span>
<span style="color: #339933;">#define derinlik 10</span></pre></div></div>

<p>&#8220;derinlik&#8221; değişkenini iletişim hassasiyetinize göre belirleyebilirsiniz ve algoritmanın doğru çalışması için öncü veriyi haberleşmede kullanmayacağımız bir karakter seçmeliyiz.<br />
Verici tarafta olması gerekenler:<br />
prototip bildirimi:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">void</span> rf_gonder<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> data<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>fonksyionun kendisi:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">void</span> rf_gonder<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> data<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
<span style="color: #993333;">int</span> i<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
putc<span style="color: #009900;">&#40;</span><span style="color: #208080;">0b10101010</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #666666; font-style: italic;">//alfanumerik olmayan bir karakter</span>
putc<span style="color: #009900;">&#40;</span><span style="color: #208080;">0b10101010</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
putc<span style="color: #009900;">&#40;</span>oncu<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
putc<span style="color: #009900;">&#40;</span>oncu<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>i<span style="color: #339933;">=</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>i<span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;=</span>derinlik<span style="color: #339933;">;</span>i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
     putc<span style="color: #009900;">&#40;</span>data<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
   <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Kullanımı:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">rf_gonder<span style="color: #009900;">&#40;</span>veri<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Alıcı taraf:<br />
Ben verileri serialdata kesmesiyle aldım, şart değil, uart olmayan mikrolar için sonsuz döngü içerisinde de veri alarak bu fonksiyonu kullanabilirsiniz(o şekilde de denedim).</p>
<p>enaz değişkenini hassasiyetinize göre istediğiniz bir değer yapabilirsiniz, fonksiyon prototipi ve gerekli bazı değişkenler:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#define enaz 3</span>
<span style="color: #993333;">int</span> diziden_sec<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">int</span> gelen<span style="color: #339933;">,</span>i<span style="color: #339933;">,</span>durum<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//durum=0 oncu verinin beklendiği durum</span>
<span style="color: #993333;">int</span> dizi<span style="color: #009900;">&#91;</span>derinlik<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Gelen verileri kesme ile aldığımı söylemiştim:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#INT_RDA</span>
<span style="color: #993333;">void</span> data_geldi<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
gelen<span style="color: #339933;">=</span>getc<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>gelen<span style="color: #339933;">==</span>oncu<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
   durum<span style="color: #339933;">=</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
   i<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>durum<span style="color: #339933;">==</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
   dizi<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span>gelen<span style="color: #339933;">;</span>
   i<span style="color: #339933;">++;</span>
   <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>i<span style="color: #339933;">==</span>derinlik<span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><span style="color: #666666; font-style: italic;">//veriler diziye yerleşti, degerlendirelim:</span>
      durum<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
      <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>diziden_sec<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        putc<span style="color: #009900;">&#40;</span>diziden_sec<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
   <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Ve fonksiyonumuz:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">int</span> diziden_sec<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> <span style="color: #666666; font-style: italic;">//dizide en az &quot;enaz&quot; kadar geçen elemanı döndürür aksi durumlarda 0 döndürür.</span>
<span style="color: #993333;">int</span> max<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span>a<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span>b<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span>temp<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">,</span>indis<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>a<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>a<span style="color: #339933;">&lt;</span>derinlik<span style="color: #339933;">;</span>a<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
   <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>b<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>b<span style="color: #339933;">&lt;</span>derinlik<span style="color: #339933;">;</span>b<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
      <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>dizi<span style="color: #009900;">&#91;</span>b<span style="color: #009900;">&#93;</span><span style="color: #339933;">==</span>dizi<span style="color: #009900;">&#91;</span>a<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
      temp<span style="color: #339933;">++;</span>
      <span style="color: #009900;">&#125;</span>
   <span style="color: #009900;">&#125;</span>
   <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>temp<span style="color: #339933;">&gt;</span>max <span style="color: #339933;">&amp;&amp;</span> temp<span style="color: #339933;">&gt;=</span>enaz<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
      max<span style="color: #339933;">=</span>temp<span style="color: #339933;">;</span>
      indis<span style="color: #339933;">=</span>a<span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
   temp<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span>
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>max<span style="color: #339933;">&lt;=</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><span style="color: #666666; font-style: italic;">//hata oluştu, öncü alındı ama arkasından gelen dizi anlamsız</span>
   <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #b1b100;">else</span><span style="color: #009900;">&#123;</span>
   <span style="color: #b1b100;">return</span> dizi<span style="color: #009900;">&#91;</span>indis<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Ben bu algoritmayı hem basit bir devrede hem de simülasyonda denedim. Derinlik=10, enaz=3 olduğunda alıcı tarafta beklemediğim hiçbir veriyle karşılaşmadım.<br />
Simülasyon dosyası ve alıcı.c-verici.c dosyalarını <a href="/yuklenenler/seri_iletisim_algoritma.rar">burdan </a>indirebilirsiniz.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fatiherdem.net/kablosuz-seri-iletisimde-hatanin-azaltilmasi/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Hobi Servo Sürelim (Bilgisayar Kontrollü)</title>
		<link>http://www.fatiherdem.net/hobi-servo-surelim/</link>
		<comments>http://www.fatiherdem.net/hobi-servo-surelim/#comments</comments>
		<pubDate>Sun, 26 Oct 2008 21:46:50 +0000</pubDate>
		<dc:creator>ferdem</dc:creator>
				<category><![CDATA[Çalışmalarım]]></category>
		<category><![CDATA[Hobi Servo]]></category>
		<category><![CDATA[TowerPro]]></category>

		<guid isPermaLink="false">http://www.fatiherdem.net/?p=99</guid>
		<description><![CDATA[Hobi servolar girişine uyguladığımız darbenin genişliğine göre 0-180 derece arasında dönme açısını değiştirilebildiğimiz motorlardır. Model uçakların kanat açıları, uzaktan kumandalı arabaların direksiyon sistemleri, el-kol hamleleri-adım atma-tutma-bırakma gibi hareketler gerektiren ve çok yüksek tork gerektirmeyen robotlar için ideal motorlardır. Bu motorlar çeşitli boy ve torklarda olabiliyor: Ben burdaki tüm denemelerimi aşağıda gördüğünüz (TowerPro) mini servo üzerinden [...]]]></description>
			<content:encoded><![CDATA[<p>Hobi servolar girişine uyguladığımız darbenin genişliğine göre 0-180 derece arasında dönme açısını değiştirilebildiğimiz motorlardır. Model uçakların kanat açıları, uzaktan kumandalı arabaların direksiyon sistemleri, el-kol hamleleri-adım atma-tutma-bırakma gibi hareketler gerektiren ve çok yüksek tork gerektirmeyen robotlar için ideal motorlardır. Bu motorlar çeşitli boy ve torklarda olabiliyor:<br />
<a href="http://www.fatiherdem.net/yuklenenler/ces_servo.JPG" target="_blank"><img src="http://www.fatiherdem.net/yuklenenler/ces_servo_k.gif" alt="" /></a><br />
<span id="more-99"></span><br />
Ben burdaki tüm denemelerimi aşağıda gördüğünüz (TowerPro) mini servo üzerinden yaptım:<br />
<a href="http://www.fatiherdem.net/yuklenenler/m_servo.JPG" target="_blank"><img src="http://www.fatiherdem.net/yuklenenler/m_servo_k.gif" alt="" /></a></p>
<p>Büyük resimden görüldüğü üzere servolarımızın üç girişi var, ikisi besleme üçüncüsü data(veya pwm) girişi yani darbe genişliği uyguladığımız giriştir. Hobi servomuzu kontrol etmek için bir kare dalga işaretinin darbe genişliğini belirli sınırlar içerisinde değiştiririz, yani ismini koymak gerekirse darbe-genişlik modülasyonu yaparız. Renklerden hangi pin ne işe yarıyor görebiliyoruz. Nitekim bizim servomuzda kahverengi:toprak, kırmızı:+, turuncu:data. Diğer hobi servolarda renkler nasıl bilmiyorum ama kırmızı(+) ve siyah(toprak) kablolar varsa kalan girişin pwm girişi olduğunu söyleyebiliriz.<br />
Her şeyden önce servomuzu genel olarak nasıl sürüyoruz? Bu sorunun çoğu hobi servo için geçerli bir cevabı var:<br />
20ms periyotlu bir kare dalga işaretimizin darbe genişliğini 1ms ile 2ms arasında değiştirerek hobi servomuza 0 ile 180 derece arasında açı veririz. Başka bir deyişle periyodu 20ms olan ve &#8220;duty cycle&#8221; ı %5 ile %10 arasında değişebilen pwm(darbe genişlik modülasyonu) işareti uygularız. Pwm demek istemiyorum çünkü bizim burda anlatmak istediğimiz sürme metodu &#8220;duty cycle&#8221; ayarlanmasından ziyade darbe genişliğinin mikrosaniyeler mertebesinden değiştirilmesi üzerine kurulmuştur. Yazının ilerleyen bölümünde sürme metodumuzun ne kadar basit ve temel bir işlem olduğu anlaşılacaktır. Servonun açısının ayarlanmasında periyodun 20ms olması şart değil, önemli olan uygulanan darbenin genişliği. Servonun belirlediğimiz konumda kalması için bu bilgiyi sürekli güncelliyoruz(her 20 ms de mesela), bu işareti kestiğinizde(besleme duruyor tabi) servo son açısında kalıyor ancak ufak bir tork servonun açısını değiştirebilir. Yani siz eğer yüke bağlı servonuzu belirli bir konumda tutmak istiyorsanız 20ms belki daha da düşük periyotlu bir işaretle servoyu kontrol etmeniz gerekir.<br />
<img src="http://www.fatiherdem.net/yuklenenler/servo_surus.gif" alt="Servo sürüş" /><br />
Ancak bu darbe aralıkları her hobi servo için böyle değil (şimdiden sonra yazı boyunca hobi servo yerine servo diyeceğim). Nitekim bizim kullanacağımız servonun darbe aralığı 540 us ile 2400 us arasında. Peki biz bu darbe sürelerini nerden öğreneceğiz, yok mu bu kullanacağımız servonun teknik bilgileri? Yok ne yazık ki. Burda kullanacağımız servonun web sitesinde motorun temel özelliklerini yazmakla yetinmişler, servo işte siz sürersiniz demek istiyorlar heralde(site:http://towerprocn.sh15.host.35.com/towerprocn/english/servo/SERVO.html).<br />
Her marka servo için durum böyle değil tabii ki, mesela futaba&#8217;nın sitesinde motorun sürülmesi için gereken tüm bilgiler verilmiş(site:http://www.gpdealera.com/cgi-bin/wgainf100p.pgm?I=FUTM0503):<br />
<em><br />
Torque: 196 oz-in @ 6V<br />
(13.8 kg-cm @ 6V)</em></p>
<p>Communication: Pulse Width Modulation (PWM)<br />
Operation range: 180°<br />
Pulse cycle: 14.25ms<br />
Pulse width: 920-2120us<br />
gibi.<br />
Bizim motorumuzun bu bilgileri verilmemiş ama olsun, bu bilgileri kendimiz buluruz hem de daha öğretici bir çalışma yapmış oluruz. Çalışmamızda mikro olarak 16F628 PIC mikro, dil olarak CCS C dili seçilmiştir.</p>
<p>Bu bilgileri bulma işine girmeden önce servomuza bir hareket verelim, bakalım çalışıyor mu! Servomuza 1ms darbe genişliği uygulayarak konumlandığı açıya bakalım. Besleme gerilimi olarak servonuzun teknik bilgilerine bakabilirsiniz. Bizim servomuz için &#8220;Operating voltage 4.2-6V&#8221; denilmiş. Genel olarak 6V uygulanabilir, ben 5V uyguluyorum. Servomuzun data girişine b0 pinini bağlayacak olursak bunun için bizim yazacağımız temel kod:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
      output_high<span style="color: #009900;">&#40;</span>pin_b0<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      delay_us<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1000</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      output_low<span style="color: #009900;">&#40;</span>pin_b0<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      delay_us<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">19000</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>olacaktır.<br />
Evet ben servoları sürerken timer kullanmıyorum, bu yöntemle yaptığım denemelerden gayet memnunum. Dolayısıyla temel kodumuz bu basitlikte. Şimdi eğer:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">long</span> b0<span style="color: #339933;">=</span><span style="color: #0000dd;">600</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
      output_high<span style="color: #009900;">&#40;</span>pin_b0<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      delay_us<span style="color: #009900;">&#40;</span>b0<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      output_low<span style="color: #009900;">&#40;</span>pin_b0<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      delay_us<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">20000</span><span style="color: #339933;">-</span>b0<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>yazarsak servomuzun pozisyonunu b0 değişkeniyle kontrol edebiliriz. Hobi servo sürmek bu kadar basit:)<br />
Şimdi gelin servomuzun hangi darbe aralıklarında çalıştığını öğrenelim. Ben bunu şöyle yaptım: devremde iki adet düğme var, düğmelerden biri b0 değişkenini 50us arttırıyor, diğeri 50us azaltıyor. Düğmelere basarak ilerlerken b0 değişkenini her değişmede bilgisayara gönderiyorum, yani şu anki b0 değerini takip diyorum.<br />
Ne zaman ki servo artık değişime tepki vermiyor(daha fazla dönemiyor) o b0 değeri benim sınır değerim oluyor. Tabi bu teste başlamadan servomuzun ilk konumunun ortada bir yerde olması için b0 ın ilk değerini 1000us civarı seçmeliyiz. Bu işi yapan kod:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">long</span> b0<span style="color: #339933;">=</span><span style="color: #0000dd;">1000</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>input<span style="color: #009900;">&#40;</span>pin_b3<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> <span style="color: #666666; font-style: italic;">//dugmeye basildi</span>
      b0<span style="color: #339933;">+=</span><span style="color: #0000dd;">50</span><span style="color: #339933;">;</span>
      delay_ms<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">200</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      deger<span style="color: #339933;">=</span>b0<span style="color: #339933;">/</span><span style="color: #0000dd;">10</span><span style="color: #339933;">;</span>
      putc<span style="color: #009900;">&#40;</span>deger<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//8 bitlik sayıyı bilgisayara gönder</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>input<span style="color: #009900;">&#40;</span>pin_b4<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> <span style="color: #666666; font-style: italic;">//dugmeye basildi</span>
      b0<span style="color: #339933;">-=</span><span style="color: #0000dd;">50</span><span style="color: #339933;">;</span>
      delay_ms<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">200</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      deger<span style="color: #339933;">=</span>b0<span style="color: #339933;">/</span><span style="color: #0000dd;">10</span><span style="color: #339933;">;</span>
      putc<span style="color: #009900;">&#40;</span>deger<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
      output_high<span style="color: #009900;">&#40;</span>pin_b0<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//surmeye devam</span>
      delay_us<span style="color: #009900;">&#40;</span>b0<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      output_low<span style="color: #009900;">&#40;</span>pin_b0<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      delay_us<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">20000</span><span style="color: #339933;">-</span>b0<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span><span style="color: #666666; font-style: italic;">//while</span></pre></div></div>

<p>Bilgisayara göndermek şart değil b0 ın ilk değerini programınızda 1000us gibi sabit bir sayıya eşitleyin sonra düğmeye kaç defa bastıysanız o kadar 50 us ekleyerek(veya çıkararak) servonuzun sınır darbe genişliklerini tespit edebilirsiniz. Her düğmeye bastığınızda &#8220;toggle&#8221; eden bir led olursa adım kaçırmazsınız.</p>
<p>Sınır değerleri de bulduysak artık servomuzu istediğimiz açıya getirebiliriz. Peki ne kadar bir hassasiyetle? Devre düzeneğinizi bozmadan düğmelerle değiştirdiğiniz b0 değerini 50 us değil de daha az yapın, bakalım tepki veriyor mu? Bizim servomuz için bu hassasiyet &#8220;Dead band width =10 us&#8221; olarak verilmiş. Bu da yaklaşık 1 dereceye tekabül ediyor.</p>
<p><strong>Peki bu yöntemle aynı anda kaç servoyu sürebiliriz?</strong><br />
Benim şu anda elimde 2 servo var, 2 sini rahatlıkla sürebiliyorum. ISIS simülasyonda 5 servoyu sürüyorum. Yazılan kod yine aynı mantıkta, 3 servo sürmek istersek:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">long</span> s1<span style="color: #339933;">=</span><span style="color: #0000dd;">650</span><span style="color: #339933;">,</span>s2<span style="color: #339933;">=</span><span style="color: #0000dd;">650</span><span style="color: #339933;">,</span>s3<span style="color: #339933;">=</span><span style="color: #0000dd;">650</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
      output_high<span style="color: #009900;">&#40;</span>pin_b0<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      delay_us<span style="color: #009900;">&#40;</span>s1<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      output_low<span style="color: #009900;">&#40;</span>pin_b0<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
      output_high<span style="color: #009900;">&#40;</span>pin_b3<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      delay_us<span style="color: #009900;">&#40;</span>s2<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      output_low<span style="color: #009900;">&#40;</span>pin_b3<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
      output_high<span style="color: #009900;">&#40;</span>pin_b4<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      delay_us<span style="color: #009900;">&#40;</span>s3<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      output_low<span style="color: #009900;">&#40;</span>pin_b4<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
      delay_us<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">20000</span><span style="color: #339933;">-</span>s1<span style="color: #339933;">-</span>s2<span style="color: #339933;">-</span>s3<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span><span style="color: #666666; font-style: italic;">//while</span></pre></div></div>

<p><strong>Gelelim bu bilgilerimizi güzel bir uygulamada kullanma kısmına:</strong><br />
Servolarımızı s1, s2, s3 değişkenileriyle kontrol edebileceğimizi gördük, peki bu değişkenleri nasıl değiştireceğiz? İlk uygulamamızdaki gibi düğmelerle mi? Bu değerleri bilgisayarımızdan göndersek nasıl olur?<br />
&#8230;<br />
Bence de güzel olur. Ancak bunun için küçük bir program yazmalıyız ve bir de arayüz hazırlamalıyız. Bence bu iş için en uygun yol visual studio.net ortamında C# kullanmak. Serialport nesnesi, hazır form elemanları ve kontrol kolaylığı tam bize göre. Yani bilgisayar kısmında işimiz kolay. Peki gelen verileri PIC le nasıl alacağız? UART kesmesiyle.<br />
Kodumuz gayet basit:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
      output_high<span style="color: #009900;">&#40;</span>pin_b0<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      delay_us<span style="color: #009900;">&#40;</span>s1<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      output_low<span style="color: #009900;">&#40;</span>pin_b0<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
      output_high<span style="color: #009900;">&#40;</span>pin_b3<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      delay_us<span style="color: #009900;">&#40;</span>s2<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      output_low<span style="color: #009900;">&#40;</span>pin_b3<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
      output_high<span style="color: #009900;">&#40;</span>pin_b4<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      delay_us<span style="color: #009900;">&#40;</span>s3<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      output_low<span style="color: #009900;">&#40;</span>pin_b4<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
      delay_us<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">20000</span><span style="color: #339933;">-</span>s1<span style="color: #339933;">-</span>s2<span style="color: #339933;">-</span>s3<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span><span style="color: #666666; font-style: italic;">//while</span>
<span style="color: #009900;">&#125;</span><span style="color: #666666; font-style: italic;">//main</span>
&nbsp;
<span style="color: #339933;">#INT_RDA</span>
<span style="color: #993333;">void</span> seri_data_geldi<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
bx<span style="color: #339933;">=</span>getc<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// bx de long türünden</span>
&nbsp;
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>bx<span style="color: #339933;">==</span><span style="color: #0000dd;">200</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> <span style="color: #666666; font-style: italic;">//sira ilk motorun</span>
   sira<span style="color: #339933;">=</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>bx<span style="color: #339933;">==</span><span style="color: #0000dd;">220</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><span style="color: #666666; font-style: italic;">//sira ikinci motorun</span>
   sira<span style="color: #339933;">=</span><span style="color: #0000dd;">2</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>bx<span style="color: #339933;">==</span><span style="color: #0000dd;">240</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><span style="color: #666666; font-style: italic;">//sira ucuncu motorun</span>
   sira<span style="color: #339933;">=</span><span style="color: #0000dd;">3</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>bx<span style="color: #339933;">&lt;</span><span style="color: #0000dd;">200</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> <span style="color: #666666; font-style: italic;">//gelen veri motorlara</span>
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>sira<span style="color: #339933;">==</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
   s1<span style="color: #339933;">=</span><span style="color: #0000dd;">10</span><span style="color: #339933;">*</span>bx<span style="color: #339933;">+</span><span style="color: #0000dd;">540</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>sira<span style="color: #339933;">==</span><span style="color: #0000dd;">2</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
   s2<span style="color: #339933;">=</span><span style="color: #0000dd;">10</span><span style="color: #339933;">*</span>bx<span style="color: #339933;">+</span><span style="color: #0000dd;">540</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>sira<span style="color: #339933;">==</span><span style="color: #0000dd;">3</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
   s3<span style="color: #339933;">=</span><span style="color: #0000dd;">10</span><span style="color: #339933;">*</span>bx<span style="color: #339933;">+</span><span style="color: #0000dd;">540</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
output_toggle<span style="color: #009900;">&#40;</span>pin_a1<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//kesme geldi belirteci</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Peki elimizde servo yoksa bu uygulamayı Proteusta simüle edebilir miyiz? Evet. Bunun için öncelikle &#8220;eltima virtual serial port&#8221; programı gibi bilgisayarımızda virtual serial port oluşturabilecek bir programa ihtiyacımız var. Çünkü &#8220;virtual port&#8221; oluşturamazsak visual studio.net ile açtığımız porta proteus bağlanamayacak, proteusla açtığımız porta vs.net bağlanamayacak. Bahsettiğim virtual serial port programı bilgisayarımızda birbirine bağlanmış sanal port çifti oluşturuyor, örn com1 ve com2 olarak. Proteustan com1 e bağlanıp başka programlardan com2 ye bağlanarak iki program arasında iletişimi sağlayabiliyoruz.</p>
<p>Dikkat etmemiz gereken bir diğer nokta proteusta kullandığımız servonun sağ tık menüsüyle açılan özelliklerinin kendi servomuzla uyuşuyor olmasıdır.</p>
<p>Çalışmamızdan bazı resimler:<br />
<a href="http://www.fatiherdem.net/yuklenenler/resim1.JPG" target="_blank"><img src="http://www.fatiherdem.net/yuklenenler/resim1_k.gif" alt="" /></a></p>
<p><a href="http://www.fatiherdem.net/yuklenenler/vsnetproteus.gif" target="_blank"><img src="http://www.fatiherdem.net/yuklenenler/vsnetproteus_k.gif" alt="" /></a><br />
&#8212;<br />
<strong>EK NOTLAR: </strong><br />
14 Mayıs, 2010<br />
Büyük servo sürerken servo harekete geçerken devrenin kaynağına bir anda yüklendiğinden mikro devresi(bizde PICli devre) reset atabiliyor. Buna karşı alacağımız ilk önlem PIC in besleme uçlarına büyükçe bir kapasite bağlamak. Bu da her zaman çözüm olmayabiliyor, servo sürücü ile PIC kaynağı nın izole edilmesi konusu zamanında denemediğim bir çalışma. Duruma göre farklı önlemler almak gerekebilir.<br />
&#8212;<br />
Çalışmayla ilgili tüm dosyalar:<br />
<a href="http://www.fatiherdem.net/yuklenenler/proteus_kaynakkod_ve_hex.rar">Proteus(7.1 SP4) Simülasyon, servo3.c, servo3.hex</a><br />
<a href="http://www.fatiherdem.net/yuklenenler/servo_ferdem.rar">C# Proje Klasörü</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.fatiherdem.net/hobi-servo-surelim/feed/</wfw:commentRss>
		<slash:comments>23</slash:comments>
		</item>
		<item>
		<title>RF Alıcı-Verici Modüllerinizi Test Edin!</title>
		<link>http://www.fatiherdem.net/atx-arx-rf-modullerinizi-test-edin/</link>
		<comments>http://www.fatiherdem.net/atx-arx-rf-modullerinizi-test-edin/#comments</comments>
		<pubDate>Mon, 25 Aug 2008 00:45:40 +0000</pubDate>
		<dc:creator>ferdem</dc:creator>
				<category><![CDATA[Çalışmalarım]]></category>
		<category><![CDATA[Rf modül]]></category>

		<guid isPermaLink="false">http://127.0.0.1/wordpress/?p=18</guid>
		<description><![CDATA[Çok yaygın olarak kullanılan en basit RF alıcı-verici modüller ilk çalıştırılması sırasında sorun çıkarabilmektedir. Ben bu zamana kadar UDEA&#8217;nın atx-arx ve Keymark&#8217;ın modüllerini kullandım. Bu modülleri farklı amaçlar için çalıştırmıştım aradan zaman geçtikten sonra farklı uygulamar için bu modülleri kullanmak istediğimde ilk yazdığım koda dönüp bakmak durumunda kaldım. Çünkü her kod bu modülleri çalıştırmıyor. Yaygın [...]]]></description>
			<content:encoded><![CDATA[<p><span class="beyazdasiyah">Çok yaygın olarak kullanılan en basit RF alıcı-verici modüller ilk çalıştırılması sırasında sorun çıkarabilmektedir. Ben bu zamana kadar UDEA&#8217;nın atx-arx ve Keymark&#8217;ın modüllerini kullandım. Bu modülleri farklı amaçlar için çalıştırmıştım aradan zaman geçtikten sonra farklı uygulamar için bu modülleri kullanmak istediğimde ilk yazdığım koda dönüp bakmak durumunda kaldım. Çünkü her kod bu modülleri çalıştırmıyor. Yaygın bir görüşe göre bu basit modüllerin en büyük sıkıntısı <span style="font-style: italic;">uyku</span>, veri göndermediğimiz zaman alıcı modül gelecek ilk veri için hazırlıksız durumda oluyor, tabiri caizse uyuyor. Verimizi kendisine sağlıklı bir şekilde ulaştırmak için önce alıcıyı uyandırmak (demodülasyon için clock işaretinin düzgün geldiğine emin olmak-eğer senkron demodülasyon yapılıyorsa-) gerekiyor. Bunun için de verimizden önce bir takım işaretler(uyandırma işareti) gönderiyoruz. UDEA nın uygulama notlarında hem bu işlem yapılmış hem de senkronizasyon için bazı düzenlemeler yapılmış. Keymark&#8217;tan ise ses yok, katalog bilgisini bile zor bulabiliyoruz ya da ben bulamadım.<br />
</span><span id="more-18"></span></p>
<p><img src="http://www.fatiherdem.net/resimler/modul_test/moduller.gif" alt="" /><br />
Solda udea, sağda keymark çifti.<br />
Geçtiğimiz günlerde bu iki modül için de minimum test devresi ve minimum test yazılımı oluşturmaya karar verdim ve iki modül için de denedim, denemeler başarılı. Modülleri test etme aşamasına gelmeden önce donanım ile alakalı problemleri aşmış olmamız gerekiyor, devrenizi kurup son haline getirdiğinize kanaat getirdikten sonra tüm gerilimleri voltmetrenizle kontrol ettiniz mi? Keymark modüller için verici besleme geriliminin 3V olduğuna emin misiniz? Her iki(alıcı-verici) devre için de besleme gerilimlerinin iyi regüle edilmiş olduğuna emin misiniz? Nitekim ben deneme yaparken kullandığım şarjlı pilin pic i çalıştırdığını ama çok kararlı olmadığını fark edip pili şarj ettikten sonra kullandım.</p>
<p>Bir de bu modülleri kullanmak isteyen arkadaşların ilk aklına gelen test devresi verici tarafın data girişine DC uygulayıp alıcı tarafın data çıkışında led yakmak oluyor. Bu benim zamanında hiç düşünmediğim bir olaydı. Belki de DC bir işaretin modüle edildiğine hiç rastlamadığımdandır. Bahsettiğim test devresinde(çalıştığını görüp emin olduğum) bu olayı denedim, verici girişine DC(5V) verdim ve alıcı çıkışına bir led bağladım, led yanıyordu ama girişi toprağa çektiğimde de yanıyordu. Yanma dediğim de kararlı bir yanma değil, seğirme şeklinde(her iki durumda da). UDEA teknik döküman sayfasında modüller için UHF bandında ASK(amplitude shift keying) kullanıldığı söylenmiş. Şimdi bu(ASK) ON-OFF keying şeklinde de olabilir yani modüllerimiz lojik 1 için 433 MHz lik bir işaret gönderirken lojik 0 için hiç bir şey göndermiyor veya farklı genlik seviyeleri kullanılmış olup lojik 1 için A genliğinde 433 MHz lik bir işaret gönderirken lojik 0 için B genliğinde 433 MHz lik bir işaret gönderiyor olabilir. Eğer ilki gibiyse verici girişini toprağa çektiğimizde hiçbir şey göndermiyoruz demektir, alıcımız ortamdan ne gürültü alıyorsa ona göre ledi yakacak demektir. Alıcı modülün data pininin led sürme kabiliyeti ise ayrı mesele&#8230; Yani bana sorulursa bu modüllerle DC gönderme işi uygun değil. Eğer uzaktan kontrol etmek istediğiniz elemanlar led, röle gibi bir bitle kontrol edilecek elemanlar ise PIC kullanmaksızın PT2262-PT2272 çiftini kullanarak rf modüller üzerinden güvenli bir şekilde veri gönderebilirsiniz.</p>
<p>Gelelim kendi test devremize, öncelikle biz test verisi olarak kullandığımız mikro(PIC)lar tarafından desteklenen RS232 protokolüne göre &#8216;A&#8217; veya &#8216;B&#8217; verilerini göndereceğiz ve alacağız(DC değil). Dolayısıyla her iki tarafta da PIC olacak, kutumda 16F628(verici) ve 16F628A(alıcı) vardı ben onları kullandım. Kodları diğer pic lere uyarlayabilirsiniz.</p>
<p>Testimiz şöyle:<br />
alici.hex ve verici.hex dosyaları uygun PIC lere yüklendiyse şemadan da takip edebileceğiniz gibi:<br />
Alıcı tarafta A0 ve A1 pinlerine bağlı iki ledimiz var, bu ledler şuna göre yanıyor: Eğer son gelen veri &#8216;A&#8217; ise A1 pinine bağlı led yanacak, eğer son gelen veri &#8216;B&#8217; ise A0 pinine bağlı led yanacak. Verici tarafta ise B4 ve B5 pinlerinden en fazla bir tanesini toprağa çekeceğiz. Eğer B4 pini toprakta B5 pini VDDde ise &#8216;A&#8217; gönderiyoruz, B4 pini VDDde B5 pini toprakta ise &#8216;B&#8217; gönderiyoruz. Bu işlem için &#8220;buton&#8221; kullanmayalım, boşta bıraktığımız kablolarla istediğimiz pini toprağa çekme işlemi yapalım. Yapılacak nihai işlem bir pini toprakta diğer pini VDDde bırakmak ve test için toprak-VDD sırasını değiştirmek. Böylece herhangi bir durumda (&#8216;A&#8217; gönderirken veya &#8216;B&#8217; gönderirken) verimizi kısa bir sürelik değil sürekli gönderiyor olacağız, tabiri caizse alıcımızı veri yağmuruna tutacağız. Bu durumda alıcı modülün uyanmama, geç kalma gibi bir sorunu olmuyor. Alıcı için verimizi alabileceği en kesin durumu sağlıyoruz.<br />
Her testin bir geçme-kalma şartı vardır, bizim testimizin şartı ledlerin yanıyor olması değildir, gönderdiğiniz veriyi değiştirdiğinizde alıcıda yanan ledin değişmesidir. Yani devrenizin doğru değişikliğe doğru cevabı vermesidir. Nitekim alıcıdaki ledlerin yanması çok olası bir durum, şöyle ki: verici kısmı çalıştırmadan önce alıcı kısmı çalıştırın, ne görüyorsunuz? Bir süre sonra &#8216;A&#8217; verisine ait led yandı veya &#8216;B&#8217; verisine ait led yandı&#8230; Bu verileri bizim göndermediğimiz kesin(verici devrenin beslemesi bağlanmadı) peki kim gönderiyor? Nasıl olur da biz veri göndermeden alıcımız sanki doğru verileri almış gibi ledleri yakıyor!<br />
Bu bir şekilde oluyor arkadaşlar, çevreden gelen bazı etkiler modülleri yanlış yorumlatabiliyor. Bu gözlem modüllerin ne gibi yanlış anlaşılmalara yol açabileceği açısından faydalı bir gözlem(verici devreyi çalıştırmadan alıcı devreyi çalıştırıp olup biteni gözleme).<br />
Bu yüzden modülleri test ederken doğru değişikliğe doğru tepkiyi vermelerinin gerektiğini söyledim.<br />
Öncü veri kullanarak bu yanlış anlaşılma durumunun çok büyük ölçüde önüne geçebiliyoruz, dileyen arkadaşlar ekteki dosyalarda pre_alici.c ve pre_verici.c ye bakabilirler. Ancak bizim şu anki konumuz modülleri en basit şekilde çalıştırmak, doğru değişikliğe doğru tepki verdiğini görmek. Devreyi proteusta çizip simüle ettim(kablolu haliyle), kurduğum devre simülasyon ortamındakinden farksız sadece kablo yerine modülleri bağladım:</p>
<p><img title="Devre şeması" src="http://www.fatiherdem.net/resimler/modul_test/devre.gif" alt="" /></p>
<p>Bu arada bu test devresi ve vereceğim test yazılımında iki modül de gayet başarılı bir şekilde çalışıyor ancak keymark biraz nazlandı, bir kaç defa reset attım sonra düzgün çalışmaya başladı. Bir de yazarken aklıma geldi keymark modülleri birbirinden 1m kadar uzaklaştırıp denemekte fayda olabilir. Son olarak modüllerimizi yakın mesafede test ettiğimiz için anten bağlamaksızın çalıştırabiliyoruz. Aynı test devresini daha uzak mesafelerde denemek için 50 ohm empedanslı 17 cm uzunluğunda anten kullanabilirsiniz. 50ohm luk anteniniz yoksa 17cm lik metal bir tel kullanabilirsiniz(50 ohm luk antene göre daha düşük verimle çalışacağını kabullenerek)</p>
<p><span style="font-weight: bold;">verici.c</span></p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">//UDEA ve Keymark RF atx arx alıcı-verici modüller için test programı, 6 Mayıs 2008</span>
<span style="color: #666666; font-style: italic;">//verici.c</span>
<span style="color: #666666; font-style: italic;">//fatiherdem.net</span>
<span style="color: #339933;">#include &amp;lt;16f628.H&amp;gt;</span>
<span style="color: #339933;">#fuses INTRC_IO, NOMCLR, NOPROTECT, NOWDT, NOLVP</span>
<span style="color: #339933;">#use delay(clock=4000000)</span>
<span style="color: #339933;">#use rs232(baud=600, xmit=PIN_B2, rcv=PIN_B1)</span>
&nbsp;
<span style="color: #993333;">void</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
output_high<span style="color: #009900;">&#40;</span>pin_b3<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//calisma gostergesi</span>
<span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>input<span style="color: #009900;">&#40;</span>pin_b4<span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;&amp;</span>amp<span style="color: #339933;">;</span> input<span style="color: #009900;">&#40;</span>pin_b5<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
putc<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'A'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>input<span style="color: #009900;">&#40;</span>pin_b5<span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;&amp;</span>amp<span style="color: #339933;">;</span> input<span style="color: #009900;">&#40;</span>pin_b4<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
putc<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'B'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p><span style="font-weight: bold;">alici.c</span></p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">//UDEA ve Keymark RF atx arx alıcı-verici modüller için test programı, 6 Mayıs 2008</span>
<span style="color: #666666; font-style: italic;">//alici.c</span>
<span style="color: #666666; font-style: italic;">//fatiherdem.net</span>
<span style="color: #339933;">#include &amp;lt;16f628A.H&amp;gt;</span>
<span style="color: #339933;">#fuses INTRC_IO, NOMCLR, NOPROTECT, NOWDT, NOLVP</span>
<span style="color: #339933;">#use delay(clock=4000000)</span>
<span style="color: #339933;">#use rs232(baud=600, xmit=PIN_B2, rcv=PIN_B1)</span>
&nbsp;
<span style="color: #993333;">void</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
<span style="color: #993333;">char</span> a<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
output_low<span style="color: #009900;">&#40;</span>pin_a0<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//cikislari temizle</span>
output_low<span style="color: #009900;">&#40;</span>pin_a1<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
output_high<span style="color: #009900;">&#40;</span>pin_b3<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//calisma gostergesi</span>
&nbsp;
<span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
a<span style="color: #339933;">=</span>getc<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>a<span style="color: #339933;">==</span><span style="color: #ff0000;">'A'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
output_high<span style="color: #009900;">&#40;</span>pin_a1<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
output_low<span style="color: #009900;">&#40;</span>pin_a0<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>a<span style="color: #339933;">==</span><span style="color: #ff0000;">'B'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
output_high<span style="color: #009900;">&#40;</span>pin_a0<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
output_low<span style="color: #009900;">&#40;</span>pin_a1<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Bir resim:<br />
<img src="http://www.fatiherdem.net/resimler/modul_test/udea_cifti.gif" alt="" /></p>
<p>İlgili tüm dosyalar:<br />
<a href="http://www.fatiherdem.net/wp-content/yuklenenler/kod-simulasyon.rar" target="_blank">Simülasyon(proteus) + kod(verici.c, alici.c, pre_verici.c, pre_alici.c, *.hex)</a></p>
<p><a href="http://www.fatiherdem.net/yuklenenler/kataloglar.rar" target="_blank">Modüllerin Katalogları (UDEA ve Keymark için)</a></p>
<p><a href="http://rapidshare.com/files/113291111/resim-video.rar.html" target="_blank">Çalışmayla ilgili resim-video (60 Mb) (Öğretici içerik notu: %15)</a> <em></em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.fatiherdem.net/atx-arx-rf-modullerinizi-test-edin/feed/</wfw:commentRss>
		<slash:comments>42</slash:comments>
		</item>
		<item>
		<title>RF Alıcı-Verici Modüller</title>
		<link>http://www.fatiherdem.net/rf-moduller/</link>
		<comments>http://www.fatiherdem.net/rf-moduller/#comments</comments>
		<pubDate>Wed, 25 Jun 2008 08:21:22 +0000</pubDate>
		<dc:creator>ferdem</dc:creator>
				<category><![CDATA[Çalışmalarım]]></category>
		<category><![CDATA[Rf modül]]></category>

		<guid isPermaLink="false">http://127.0.0.1/wordpress/?p=3</guid>
		<description><![CDATA[&#8220;Basit elektronik uygulamalarımız için en ideal uzaktan haberleşme yöntemi üzerinde sadece besleme, toprak, data ve anten pinleri bulunan hazır RF alıcı-verici modül kullanmaktır. Bu zamana kadar ben bir Türk firması olan UDEA&#8217;nın ürettiği ve bir de markasının tam olarak belli olmadığı üzerinde süslü bir &#8220;K&#8221; harfi bulunan RF modüllerle tanıştım(marka sanırım keymark, modüllerin resmi için [...]]]></description>
			<content:encoded><![CDATA[<p>&#8220;Basit elektronik uygulamalarımız için en ideal uzaktan haberleşme yöntemi üzerinde sadece besleme, toprak, data ve anten pinleri bulunan hazır RF alıcı-verici modül kullanmaktır. Bu zamana kadar ben bir Türk firması olan UDEA&#8217;nın ürettiği ve bir de markasının tam olarak belli olmadığı üzerinde süslü bir &#8220;K&#8221; harfi <span id="more-3"></span> bulunan RF modüllerle tanıştım(marka sanırım keymark, modüllerin resmi için <a href="http://www.fatiherdem.net/resimler/keymark.jpg" target="_blank">buraya</a> tıklayınız -resmi çeken <span>RoMeO123 e teşekkür ederim</span>-). Ben UDEA nın modüllerini henüz hiç kullanmadım, 2. bahsettiğim modüllerden elimde 2 çift var ve bu modülleri en sonunda geçtiğimiz haftalarda çalıştırabildim. Çalıştırmak için uğraştım çünkü çeşitli problemler çıktı, problemlere gelmeden önce şunları söylemek istiyorum: UDEA nın modülleri dururken (ve kullanan arkadaşlarım varken) gidip Karaköy&#8217;den internette kataloğu bile çok zor bulunan bir RF modül almak hiç akıl karı değildi. RF modül alacak arkadaşlara piyasada bulabiliyorlarsa UDEA nınkileri almalarını bulamıyorlarsa UDEA dan bu modülleri talep etmelerini tavsiye ederim, modüller kısa zaman içinde adresinize gönderiliyor(ödemeyi verdikleri adrese havale yoluyla yapabiliyorsunuz). RF modüllerin fiyatları 10 YTL ile 16 YTL arasında, siparişle gelirse azami 20 YTL olur diye düşünüyorum. Ancak şunu gördüm ki: RF modülleri UDEA&#8217;nınkiler olan da olmayan da RF modüller konusunda problem yaşayabiliyor. Ben de epey problem yaşadım sonunda çalıştı ama nasıl:</p>
<p>Öncelikle modülleri deneyebileceğimiz hem de basit bir uygulama sayılabilecek bir devre kuralım. Alıcı tarafta bir LCD ekran olsun ve vericiden gelen veriyi ekranda göstersin. Bu sistemi alıcı verici olacak şekilde hazırlayalım ve RF modüllerden önce sistemi kablolu iletişimle deneyelim. Kablolu iletişimde sorun oluyorsa RF modüllerden veri iletimini gerçekleştirmesini beklemek olmaz! RF modüllerle iletişim denemesine geçmeden önce kablolu iletişimin sorunsuz çalıştığına emin olmamız lazım. Ben veri olarak RS232 protokolü kullanarak &#8220;A&#8221;, &#8220;B&#8221;, &#8220;C&#8221; gibi harfler -daha doğrusu ASCII karşılığındaki sayıları- gönderdim. Kablolu düzgün çalışıyorsa RF modüller denenmeye hazırdır(baudrate uygunsa tabi). Kablolu sisteminiz çalıştıysa iki sistem arasındaki haberleşme kablolarını(toprak,data) çıkarın. Verici ve alıcı modüle besleme gerilimlerini ve topraklarını bağlayın, anten bağlamanıza şimdilik gerek yok (yakın mesafelerde-2m- gerek olmuyor). Data pinlerini de bağlayıp <strong>modülleri birbirinden en az 1 m olacak şekilde uzaklaştırın ve çalıştırın. Veri alışverişi gerçekleştiyse ne ala! Güle güle kullanın! Ama çalışmadıysa&#8230;..!</strong></p>
<p>İlk olarak alıcı verici modüllerin ve sisteminizdeki diğer elemanların besleme gerilimlerine bakın-mikrodenetleyicilerinizin bir pinini çalışma işareti olan bir ledi yakması için ayırmakta fayda var-. Özellikle keymark ın verici modülüne 3V besleme gerilimi vermek isterken potla -gerilim bölücü- ayarladığımız 3V, yüke bindikten sonra 2 lere düşecektir. Bu yüzden sistemi çalıştırdıktan sonra gerilimi yeniden ayarlamamız gerekecektir. Besleme gerilimlerinde sorun yok tüm değerler olması gerektiği gibiyse eğer kullanma imkanınız olan bir osiloskop ve sinyal üreticisi varsa modüllerinizi deneyebilirsiniz. Verici modülünüze kare dalga uygulayıp(data pininden tabiki) alıcı modülün data pininden verdiğiniz işareti gözleyerek modüllerin sağlamlığını test edebilirsiniz. Test ettiniz ve sağlamlar! O zaman yazdığımız kodu yeniden düzenlemek durumundayız. Nasıl? Nasılına gelmeden önce: Lab imkanınız yok ve modülleri test edemediniz, modülleri sağlam varsayarak kod denemeleri yapmaya devam etmeliyiz.</p>
<p><strong>Baudrate ve alıcı verici pinleri yeniden gözden geçirin!</strong></p>
<p><strong></strong>Kablolu iletişim sorunsuz ise alıcı verici pinlerde sorun yok demektir ancak baudrate dediğimiz saniyede aktarılan bit sayısını bildiren değişkenimizin de doğru değerde olması gerekiyor. RF modüllerinizin kataloğunda(datasheet) vericinin gönderebileceği azami veri hızı ve alıcının alabileceği azami veri hızına dikkat edin. Benim kullandığım modüllerde verici için <span>asgari 300 bit/saniye (yani baud 300) azami 1kbit/saniye</span> diyordu. Bu durumda 9600 baudlu bir iletişimi bu modüllerden bekleyemeyiz. Ve tabi ki baudrateleri düzenlerken her iki tarafta da aynı olmasına dikkat etmek gerekiyor. Herhangi bir baud da iletişimi sağladıktan sonra denemeler yaparak en iyi hangi baud da çalıştığını tespit edebilirsiniz.</p>
<p><strong>Yine çalışmadı</strong> <strong>sorun başka ne olabilir?</strong></p>
<p>Osiloskop-sinyal üreticisiyle testiniz gayet başarılı, tüm bağlantılar ve gerilimler doğru, yazılım olarak da kablolu sistemde çalışan kodlar var ancak yine de çalışmıyorsa RF modüllerde halledilmesi gereken daha ince bir problem var demektir. Benim problemim şuydu: <span>alıcı </span><strong>modüldeki clock çok kısa bir süre geç çalışıyordu. </strong>Yani kendisine gelen verinin ilk kısmını geç çalıştığı için kaybediyor geri kalan kısmını alıyordu haliyle alıcı taraf bu kırpılmış işaretten hiç bir şey anlamıyordu. Bu kanıya varmamdaki sebep (http://www.ottawarobotics.org/articles/rf/rf.html) bağlantısındaki yazıda yazarın benzer bir sorun yaşamış ve sorunun sebebini clock gecikmesi olabileceğini söylemesidir. Nitekim biz de osiloskop ekranında bir takım çok kısa zamanlı gecikmeler gözlüyorduk ancak o gecikmelerin clock un geç çalışmasıyla alakalı olup olmadığını bilemiyorum. Şu anki gözlemlerim clock un sadece başlangıçta biraz gecikme ve veri kaybına sebep olabileceği şeklinde. O yazıda yine arkadaşın şöyle mantıklı bir tesbiti var: &#8220;Çoğu RF alıcısı gelen veriyi hemen almak için hazır değildir&#8221;, bu yüzden önden bir uyandırma işareti gönderdip alıcıyı şöyle bir sarsıyoruz. Dalgın bir arkadaşımıza bir şey söylemeden önce kendsine bağırmak gibi -biraz kaba bir benzetme oldu ama- <img src='http://www.fatiherdem.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> <strong></strong></p>
<p><strong>Bu sorunu nasıl çözdük?</strong></p>
<p><strong></strong>Madem clock bir süre geç çalışıyor biz de bir süre <strong>anlamsız işaret göndererek-herhangi bir işaret- clock un düzgün çalışmasını bekler ve hiç bekletmeden verimizi göndeririz.</strong> Nitekim böyle yaptığımızda verileri başarıyla gönderebildik. Okuduğum yazıların birinde bu işaret için <strong>uyandırma işareti </strong> ifadesi kullanılmış, bence isim çok güzel uymuş. CCS C kodu olarak bu işlemi aynen şöyle yapmış oluyoruz:</p>
<p>putc(0b01010101); //uyandır</p>
<p>putc(veri); //veri gönder</p>
<p>Alıcı taraf bu uyandırıcı sinyali zaten algılamayacaktır, tesadüfen algıladığında veya bir şekilde başka bir veri olarak yorumladığında(yanlış bir veri göndermiş olduğumuzda) ne olacak? Cevabı aşağıda geliyor(öncü veri başlığı altında).</p>
<p>&nbsp;</p>
<p><strong>Uyandırma işaretini neden 0b01010101 olarak seçtik ve Manchester Code </strong></p>
<p>Bu sorunun cevabı da <strong>Manchester Code </strong>olarak adlandırılan kodlama sistemin mantığıyla ilgili. Kendim bizzat deneyip görmemekle birlikte şunları söyleyebilirim: RF vericiye veri gönderilmeden önce bu verideki 0 lar 01, 1 ler ise 10 olarak kodlanıp (<strong>Manchester Encoding</strong>) veriliyor(8 bitlik veri 16 bite çıkmış oluyor) böylece arka arkaya gelene 0 lar veya 1 ler ortadan kaldırılmış oluyor.</p>
<p><strong>Örnek: </strong>0b 0 1 0 0 0 1 0 0 verisi 0b 01 10 01 01 01 10 01 01 haline geliyor. Bu veri sonra tekrar alıcı tarafta 8 bitlik ilk haline geri döndürülecek(<strong>Manchester Decoding</strong>).</p>
<p>Arka arkaya gelen 0 lar veya 1 lerin RF modülün veri iletimi için sağlıksız olduğu söyleniyor. Arka arkaya gelen aynı bitler bir sonraki gelen farklı ilk bit için değişimi zorlaştırdığından bu şekilde bir kodlamanın daha uygun olduğu söyleniyor, ben denemedim-görmedim. Bu mantığa göre 01 lerin uyandırma için daha uygun olduğunu düşündük-ama şart değil, başka işaretler de bu işi görüyor-.</p>
<p><strong>Not:</strong> Manchester encoding ile alakalı <a href="http://www.fatiherdem.net/yuklenenler/Manchester_encoding_using_RS232.pdf" target="_blank">şu pdf</a> ye bakabilirsiniz(ing).</p>
<p><strong>Öncü Veri (&#8220;Preamble&#8221;) Nedir?</strong></p>
<p>Benim elimdeki RF modül çiftlerinin birinin alıcısı diğerinin vericisiyle çalışabiliyor. Bu durumda aynı ortamda iki farklı modülü haberleştirmek mümkün olmayacaktır çünkü veriler her iki modülde de anlam bulacağından karışıklık olacaktır. Bunu çok basit bir mantıkla hallediyoruz: Verimizi göndermeden önce kimliğimizi bildiren başka bir veri gönderiyoruz. Örnekten kolayca anlaşılacaktır:</p>
<p><strong>Örnek:</strong></p>
<p><strong></strong> Verici tarafa:<strong></strong></p>
<p><strong></strong>putc(0b01010101); // uyandırma</p>
<p>putc(&#8216;x&#8217;); // ben x ten geliyorum</p>
<p>putc (veri); // verimizi gönderiyoruz</p>
<p>Böylece alıcı tarafa nerden geldiğimizi bildirebiliyoruz. Alıcı tarafta ise:</p>
<p>if (getc()==&#8217;x'){ //eğer veri x vericisinden geliyorsa</p>
<p>gelen_veri=getc(); //veriyi al</p>
<p>}</p>
<p>şeklinde yazarız. Öncü veriyle iki modül çiftinin karışmamasını sağladığımız gibi ortamdaki gürültülerden de %100 olmasa da sıyrılmış oluyoruz. Bu açıdan da öncü verinin önemi vardır. Yani bir ortamda sadece bir modülün çalıştığına emin olsak da, öncü veri kullanarak ortamda bulunabilecek anlamsız işaretlerden azami düzeyde sıyrılabiliriz.</p>
<p>Umarım RF modüllerle çalışan arkadaşlara yardımcı olmuştur, iyi çalışmalar dilerim.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fatiherdem.net/rf-moduller/feed/</wfw:commentRss>
		<slash:comments>28</slash:comments>
		</item>
		<item>
		<title>Adım(step) Motor Sürelim</title>
		<link>http://www.fatiherdem.net/adimstep-motor-surelim/</link>
		<comments>http://www.fatiherdem.net/adimstep-motor-surelim/#comments</comments>
		<pubDate>Thu, 10 Jan 2008 00:45:00 +0000</pubDate>
		<dc:creator>ferdem</dc:creator>
				<category><![CDATA[Çalışmalarım]]></category>
		<category><![CDATA[Yazıcı step motor]]></category>

		<guid isPermaLink="false">http://127.0.0.1/wordpress/?p=17</guid>
		<description><![CDATA[Başlığımız &#8220;step motor sürelim&#8221;! Hangi özellikte nasıl bir step motor diyeceksiniz, motorumuz eski bir yazıcıdan çıkma 7.5 derece adımlı unipolar step motor(6 uçlu). Step motorlar ve servolar&#8230; işlev olarak çok yakınlar ve çoğu uygulamada birbirleri yerine kullanılabiliyorlar. Bu iki motora da açı(veya pozisyon) kontrollü hareket yaptırabiliyoruz. Ancak step motorlar yapı itibariyle servolardan çok daha basit, [...]]]></description>
			<content:encoded><![CDATA[<p><span class="beyazdasiyah">Başlığımız &#8220;step motor sürelim&#8221;! Hangi özellikte nasıl bir step motor diyeceksiniz, motorumuz eski bir yazıcıdan çıkma <a title="resmi için tıklayınız" href="http://www.fatiherdem.net/resimler/step_motor.gif" target="_blank">7.5 derece adımlı unipolar step motor(6 uçlu)</a>.<br />
</span><span id="more-17"></span></p>
<p>Step motorlar ve servolar&#8230; işlev olarak çok yakınlar ve çoğu uygulamada birbirleri yerine kullanılabiliyorlar. Bu iki motora da açı(veya pozisyon) kontrollü hareket yaptırabiliyoruz. Ancak step motorlar yapı itibariyle servolardan çok daha basit, step motorlar kalıcı mıknatıs(permanent magnet) ve sarımlardan oluşurken servoların içinde bir kontrol devresi bulunmaktadır. Bu iki motorun da çok geniş bir kullanım alanı var ancak ben step motorları en çok CNC makinelerinin eksen hareketlerinde görüyorum, servoları ise açılı hareketin çok önemli olduğu robot kolu uygulamalarında çokça görüyorum.</p>
<p>Bizim sürdüğümüz step motor ise hepsinden basit <img src='http://www.fatiherdem.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Torku ancak yazıcıya kağıt alabilecek büyüklükte olan mütevazı bir motor. Step motorlarda rotor(ortada dönen parça) kalıcı mıknatıslardan oluşuyor stator(rotoru çepeçevre saran hareketsiz bölüm) da ise sarımlar var. Rotordaki kalıcı mıknatıs sayısı ve statordaki sarım sayısı tamamen motorun özellikleriyle ilgili. Sarımlar rotor etrafını sarmış sıralı bir şekilde duruyor(resmi aşağıda-bir resim altta-):<br />
Kalıcı mıknatıslardan oluşan rotor:<br />
<img src="http://www.fatiherdem.net/resimler/rotor.gif" alt="Step motorumuzun kalıcı(permenant) mıknatıslardan oluşan rotoru" /><br />
<span style="color: #000000;"><span style="font-size: xx-small;">Resim </span><span style="font-size: xx-small;">www.overclockers.com</span><span style="font-size: xx-small;"> dan alınmıştır.</span></span></p>
<p><span style="font-size: x-small;">Statordaki sarımlar(4 tane):<br />
<img src="http://www.fatiherdem.net/resimler/stator.gif" alt="Rotorun etraındaki sarımlar" /></span><br />
Resim www.allaboutcircuits.com dan alınmıştır.</p>
<p>Motorun sürülmesi işlemi ise bu sarımları belirli bir sırayla mıknatıslandırmaktan ibaret, teker teker veya 2 li 1 li  2li&#8230; gibi bir sırayla mıknatıslandırarak motorumuzu sürebiliriz. Sarımı mıknatıslandırmak? Sarıma akım vererek mümkün tabi. Akım vereceğiz ancak önce motorumuzdan çıkan kabloların hangisi hangi sarıma ait bunu bilmeliyiz. Sarımlarda bazı uçlar ortak olmuş olabilir(aşağıdaki gibi) veya tüm sarımların uçları dışarı verilmiş olabilir. Tüm bunları anlamanın yolu bir ohmetre ile bakmaktan geçiyor. Her bir sarımın yaklaşık 80-100 ohm civarında bir direnci var, ohm metreyi elinize alın ve başlayın 2 şerli ölçüm almaya. Çiftlerin birinde 100 ohm okudunuz! Hah! bir sarımı buldunuz demektir. 200 ohm okuduysanız bir ortaklık var demektir, ortak ucu bulmaya çalışın <img src='http://www.fatiherdem.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Bu şekilde tüm sarımları keşfettikten sonra sürücü devre işlemine başlayabiliriz.</p>
<p>Herhangi bir sarımı mıknatıslandırdığımızda rotordaki en yakın mıknatıs mıknatıslandırdığımız sarımın manyetik doğrultusuna girer. Sonra bir yandaki sarımı mıknatıslandırırız ve rotordaki en yakın mıknatıs yeni mıknatıslanan sarımın manyetik doğrultusuna girer, rotordaki kalıcı mıknatısların ve statordaki sarımların yerleşim biçimi bu iki hareketle motorun bir adım ileri atmasını sağlar. Aşağıdaki resim rotorda sadece tek kalıcı mıknatıs olsaydı ne olacağını gösteriyor, bizim tarif etmeye çalıştığımızın aşağıdaki olaydan tek farkı rotorda tek mıknatıs değil birden çok mıknatıs olmasıdır(Rotorumuzun örnek resmini yukarıda vermiştik). Hangi mıknatısa göre yön belirlenecek sorusunu sorabilirsiniz, rotordaki kalıcı mıknatıslardan mıknatıslanan sarıma en yakın olan mıknatısa göre <img src='http://www.fatiherdem.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Bu motorun tasarımıyla ilgili bir durum şu anda bizi çok da ilgilendirmiyor, sürme işlemi için yapmamız gereken sarımları uygun bir şekilde mıknatıslandırmaktan ibaret. Aşağıdaki hareketli gösterimde a ve b sarımları için ortak uçlar ayrı, bunlar da ortak olabilir yani 4 sarımın da bir tek ortak ucu olabilirdi, bu durumda motorumuz 6 uçlu değil 5 uçlu olurdu.<br />
<img src="http://www.fatiherdem.net/resimler/step-rot.gif" alt="" /><br />
<span style="font-size: xx-small;">Resim :http://www.cefetrs.tche.br/tro/alunos/motordepasso/toppage1.htm adresinden alınmıştır.<br />
</span><br />
Resmi aldığım adrese bakarsanız bu resmin yanında yarım adım sürme ile ilgili resim var, 2 li 1li derken onu anlatmaya çalışmıştım, hareketli gösterimde çok güzel anlatılmış. Hazırlayanların eline sağlık.</p>
<p>Sarımları mıknatıslandırma işlemi için bir devre düşünelim. Şartlarımız:<br />
1) İstediğimiz sarımı istediğimiz zaman mıknatıslandırabilmeliyiz (mikrodenetleyici kontrollü -eğer tek tip sürüş yapacaksak senkron(clock sinyali ile çalışan) bir lojik devre ile de sürebiliriz)<br />
2) Devremiz tarafından yeterli akım sağlanmalı</p>
<p>Akım verdiğimiz sarımları daha hızlı değiştirirsek  motorumuzu hızlandırabiliriz. Ne de olsa akımın hangi sarımdan akacağını dijital olarak kontrol ediyoruz. Ancak bu hızı da bir yere kadar arttırabiliriz, bir sarıma akım vererek mıknatıslandırıp rotoru gelmesi gereken pozisyona gelmeden diğer sarıma geçersek motorumuz bu hıza cevap vermeyecektir. Bu süreyi nasıl ayarlayacağız? Ben hız denemesi yapmadım, aşağıda verdiğim programdan da anlaşılacağı üzere adımlar arasında 500 ms beklemişim(epey uzun bir süre), siz bu süreyi kısaltarak ne kadar kısaltabileceğinizi test edebilir, motorunuzun ne kadar hıza ulaşabileceğini görebilirsiniz.</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;16f628.H&gt;</span>
<span style="color: #339933;">#fuses INTRC_IO, NOMCLR, NOPROTECT, NOWDT, NOLVP</span>
<span style="color: #339933;">#use delay(clock=4000000)</span>
main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
<span style="color: #666666; font-style: italic;">//int a[8]={1,3,2,6,4,12,8,9};</span>
<span style="color: #666666; font-style: italic;">//int a[4]={1,2,4,8};</span>
<span style="color: #666666; font-style: italic;">//int a[2]={1,4};</span>
<span style="color: #993333;">int</span> a<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #009900;">&#123;</span><span style="color: #0000dd;">8</span><span style="color: #339933;">,</span><span style="color: #0000dd;">4</span><span style="color: #339933;">,</span><span style="color: #0000dd;">2</span><span style="color: #339933;">,</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">int</span> i<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
output_b<span style="color: #009900;">&#40;</span>a<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
delay_ms<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">500</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
i<span style="color: #339933;">+=</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>i<span style="color: #339933;">==</span><span style="color: #0000dd;">4</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
i<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Tekrar devremize dönersek: İlk aklımıza gelen herhangi tip bir transistorü anahtar(switch) olarak kullanıp bu anahtarları mikrodenetleyici veya lojik devre ile kontrol etmek . Bu işi önceden yapan arkadaşların devrelerine baktığımız zaman ULN2003 adlı bir entegrenin sıkça kullanıldığını görüyoruz. Bu entegrenin içinde 8 tane darlington var, bahsettiğimiz ilk yöntemden farklı değil, sadece daha yüksek akım için darlington yapısı kullanılmış.<br />
Bizim motorumuzun keşfettiğimiz 4 tane sarımı vardı. 6 uçlu(kablolu) bir motordu, 2 sarımın da ortak olduğu bir nokta vardı, bu uçları +VCC ye bağlamıştık(aşağıdaki resmi inceleyeiniz, bunu yapıp yapmamakta serbestiz, farklı kombinasyonlarla farklı sürüşler uygulanabilir) ve kalan uçlarından hangisini toprağa çekersek o sarım mıknatıslanıyordu. Yani sürme işlemi için ULN2003 ün 8 darlingtonundan 4 tanesi bizim için yeterli. Devre şemamız ise şöyle:<br />
<img src="http://www.fatiherdem.net/resimler/step_motor_surucu_devresi.gif" alt="" /><br />
<a href="http://www.fatiherdem.net/yuklenenler/adim.rar">Çok emin olmayarak(hata olabilir) hazırladığım Proteus Simülasyon ve CCS C kaynak kodunu indirmek için buraya tıklayınız.</a><br />
Videosu:</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="355" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="wmode" value="transparent" /><param name="src" value="http://www.youtube.com/v/g3QEuwY_z3Y&amp;rel=1" /><embed type="application/x-shockwave-flash" width="425" height="355" src="http://www.youtube.com/v/g3QEuwY_z3Y&amp;rel=1" wmode="transparent"></embed></object> <strong></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.fatiherdem.net/adimstep-motor-surelim/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>8 x 48 Kayan Yazı</title>
		<link>http://www.fatiherdem.net/8-x-48-kayan-yazi-icerik-hazirlanmadi/</link>
		<comments>http://www.fatiherdem.net/8-x-48-kayan-yazi-icerik-hazirlanmadi/#comments</comments>
		<pubDate>Thu, 10 Jan 2008 00:41:37 +0000</pubDate>
		<dc:creator>ferdem</dc:creator>
				<category><![CDATA[Çalışmalarım]]></category>

		<guid isPermaLink="false">http://127.0.0.1/wordpress/?p=16</guid>
		<description><![CDATA[Tarama işlemi yeteri kadar hızlı yapıldığında amaçlanan görüntü elde edilir. Burda gösterilen yöntem sütun tarama yöntemidir, bir de satır tarama yöntemi vardır(burda gösterilmedi). Yavaş gösterim: Kayan yazı çalışmalarına aşağıda verdiğim bağlantıdaki yazıyı okuyarak başlamıştım. Bu yazıyı okudaman önce kayan yazılar hakkımda neredeyse hiç fikrim yoktu. http://www.biltek.tubitak.gov.tr/gelisim/elektronik/17.htm Ancak bu yazıdan sonra bütün kayan yazılar böyle çalışır [...]]]></description>
			<content:encoded><![CDATA[<p>Tarama işlemi yeteri kadar hızlı yapıldığında amaçlanan görüntü elde edilir. Burda gösterilen yöntem sütun tarama yöntemidir, bir de satır tarama yöntemi vardır(burda gösterilmedi).<br />
<span id="more-16"></span><br />
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="750" height="500" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="http://www.fatiherdem.net/yuklenenler/hizli.swf" /><embed type="application/x-shockwave-flash" width="750" height="500" src="http://www.fatiherdem.net/yuklenenler/hizli.swf"></embed></object></p>
<p>Yavaş gösterim:</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="750" height="500" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="http://www.fatiherdem.net/yuklenenler/yavas.swf" /><embed type="application/x-shockwave-flash" width="750" height="500" src="http://www.fatiherdem.net/yuklenenler/yavas.swf"></embed></object></p>
<p>Kayan yazı çalışmalarına aşağıda verdiğim bağlantıdaki yazıyı okuyarak başlamıştım. Bu yazıyı okudaman önce kayan yazılar hakkımda neredeyse hiç fikrim yoktu.<br />
<a href="http://www.biltek.tubitak.gov.tr/gelisim/elektronik/17.htm">http://www.biltek.tubitak.gov.tr/gelisim/elektronik/17.htm</a><br />
Ancak bu yazıdan sonra bütün kayan yazılar böyle çalışır gibi davranmayınız. Büyük panolar için daha farklı tarama mantığı(satır tarama) ve  farklı devre elemanları gerekmektedir. İyi çalışmalar. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.fatiherdem.net/8-x-48-kayan-yazi-icerik-hazirlanmadi/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Çizgi İzleyen Robot</title>
		<link>http://www.fatiherdem.net/cizgi-izleyen-robot/</link>
		<comments>http://www.fatiherdem.net/cizgi-izleyen-robot/#comments</comments>
		<pubDate>Sun, 25 Mar 2007 06:52:01 +0000</pubDate>
		<dc:creator>ferdem</dc:creator>
				<category><![CDATA[Çalışmalarım]]></category>

		<guid isPermaLink="false">http://127.0.0.1/wordpress/?p=31</guid>
		<description><![CDATA[Uzun zamandır yazmaya çalıştığım çizgi izleyen robot yazısı hala bitmedi ancak yarım haliyle de buraya koymak istedim, dilimiz döndüğünce devam edip tamamlarız inşallah. Yazının gidişatıyla ilgili bir kaç cümleyi esirgemezseniz memnun olurum. İyi çalışmalar dilerim. Dosya: www.fatiherdem.net/yuklenenler/robot.pdf ve videosu: http://www.youtube.com/watch?v=7nyKzqOet0A]]></description>
			<content:encoded><![CDATA[<p><span class="beyazdasiyah">Uzun zamandır yazmaya çalıştığım çizgi izleyen robot yazısı hala bitmedi ancak yarım haliyle de buraya koymak istedim, dilimiz döndüğünce devam edip tamamlarız inşallah. Yazının gidişatıyla ilgili bir kaç cümleyi esirgemezseniz memnun olurum. İyi çalışmalar dilerim.<br />
Dosya: <a href="http://www.fatiherdem.net/yuklenenler/robot.pdf">www.fatiherdem.net/yuklenenler/robot.pdf<br />
</a>ve videosu:<br />
<a href="http://www.youtube.com/watch?v=7nyKzqOet0A" target="_blank">http://www.youtube.com/watch?v=7nyKzqOet0A</a></span> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.fatiherdem.net/cizgi-izleyen-robot/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

