19 Eylül 2021 Pazar

Bir başka anten analizörü

 Son güncelleme 16 Şubat 2022

Daha önce bir Nano VNA 2 anten analizörü satın almıştım. Şeytan dürttü mü dersiniz açgözlülük mü dersiniz bilemem ama bir anten analizörü yapmaya karar verdim.

Aslında Nano VNA 2'yi satın almadan önce de Arduino ile kurulmuş ve 30 MHz'e kadar çalışan bir anten analizörü daha yapmıştım. Ama aklımı KD8CEC'in sayfası çeldi. Amerikalı bu amatör, EU1KY tarafından gerçekleştirilen anten analizörüne yeni özellikler kazandırmıştı.

Hani yabancıların "poor man's" diye başlayan ve bir âletin kolayca ve ucuza yapmanın yolunun gösterildiği gibi bir anten analizörü olsun isterdim aşağıda anlatacağım cihaz; ama maalesef pek de ucuz değil. Ancak bir yandan amatörlük ruhu, diğer yandan bu analizörün yapabildiklerini düşününce insanın gönlü kayıyor. Bu gönül çelici devrenin yapım aşamalarını -ve bitince de elbette neticelerini- burada anlatacağım. Bütün devre bitince de QSL.net'teki sayfama aktaracağım.

EU1KY'nin CEC versiyonu bir STM32F746 geliştirme kartı üzerine kurulmuş. Bu geliştirme kartına Si5351 ile çalışan bir VFO, iki mikser (SA612), bir dual opamp ve birtakım pasif elamanlarla kurulmuş bir "yavru kart" eklemleniyor. Bunun için önce malzeme araştırma ve teminine baktım.

İşte ST'nin geliştirme kartı bu. EU1KY Yuri'nin çalışmasına önce DH1AKF Wolfrang Kiefer el atıyor ve projeye bir çok ekstra özellik katıyor; daha sonra ise KD8CEC Ian Lee işe dahil oluyor ve ekstra özellikler artıyor.



Yukarıdaki resim, analizörün neler yapabildiğini gösteriyor. Amatörlük biraz da bu değil mi?

20 Eylül 2021

Yurt dışında STM32F746 50 küsur dolar. Bizde tutturan tutturabildiğine satıyor. Ben Elektrovadi'den  aldım.

SA612'yi bulmak da zor. Amazon'dan SO kılıfta tanesini 1 dolara buldum. Şimdi sıra geldi dual opampa. İlk sürümde LM358 kullanılmış ama daha sonra rail to rail bir opamp olan TS922 kullanılmış. Elimde ne var bir bakacağım.

Elimde MC33502 var ama gürültüsü TS922'ye göre 3 kat daha fazla.

İstanbul'da Özdisan'daTS922 varmış, tânesi 1 dolardan biraz fazla. 2 adet sipariş ettim.

21 Eylül 2021

STM32F746G geliştirme kartı elime geçti. İlginç bir kart bu. Üzerinde 4.3 inch'lik bir LCD var. Dokunmatiği kapasitif.

Giriş çıkışları da şöyle:

- Ethernet giriş

- Ses çıkış

- Mikrofon giriş

- Kompozit video çıkış

Şimdi iş buna bir "yavru kart" hazırlamaya geldi. Yavru kart, bu karta anten analizör, sinyal üreteci, kuartz kristal kontrolü, L/C metre, SWR metre, keyer, spektrumu da görerek giriş frekansını bulma, WSPR gibi özellikler kazandıracak; yazılımla elbette.
26 Eylül 2021
Yavru kartın PCB'sini toner transferi metoduyla kendim hazırladım ve ilk ve en zor elemanı (Si5351) lehimledim. Aslında çift yüzlü ve alt tarafı tamamen ground plane olan delikiçi kaplamalı bir PCB gerekliydi. Ben, iki yüzlü epoksiden hazırladım PCB'yi. Alta şasi geçişlerini 1 mm'lik telle yapacağım. SO kılıfta SA612 karıştırıcılar hâriç bütün elemanlar hazır. SA612'ler gelirken ben yavaş yavaş diğer elemanları monte edeceğim.




30 Eylül
SA612'leri beklerken, STM kartlarına program yüklenmesi ile ilgili birkaç hususu belirtmek istiyorum.
STM geliştirme kartlarına bilgisayarınızın USB portundan kolayca program yükleyebilmek için ST'nin geliştirdiği STM32 ST-LINK utility yazılımını indirip bilgisayarınıza kurmalısınız. Bu kurulum esnasında ST'nin sürücülerini yüklemek isteyip istemediğiniz sorulacaktır, kurulmasını kabul edin.
ST Link utility ekranı yukarıdaki gibidir. Bilgisayarınızın USB portunu STM kartınızın programlama portuna bağlayın. (STM32F746'da bu port mini USB portudur.) Sonra "Target" nenüsünden Connect'i seçerek geliştirme kartınıza bağlanın.
  


ST Link yazılımının alt penceresinde karta bağlandığınız ve kartın cinsi gösterilir. (Yukarıdaki resimde bir STM32F429 kartı bağlandığı görülüyor.)

Sıra geldi program yüklemeye. File menüsünden Open'ı seçerek daha önceden derlenmiş bin uzantılı dosyayı seçin.
Sonra Target menüsünden Program'ı seçin. Karşınıza gelen ekranda "Program" düğmesine basın. Eğer herşey yolunda giderse kartınız programlanacaktır. Target menüsünden Disconnect'i seçin. Hepsi bu kadar.

8 Ekim 2021
Nihâyet SO kılıftaki SA612 tümdevreleri geldi.

Hadi montaja devam.

10 Ekim 2021



GND potansiyelinde olmayan deliklerin etrafına büyükçe bir havya ucu ile havşa açtım. Alt ve üst GND potansiyelindeki deliklerden kalınca bir bakır tel geçirerek iki taraftan lehimledim. SMD elamanları lehimledim. Şimdi iş, RF bağlantısı için gerekli konnektörü bir koakasiyel kablo ile devreye bağlamaya ve ST geliştirme kartına oturacak ayakları lehimlemeye geldi.
17 Ekim
Analizörün yavru kartının giriş devresi ilginçtir. Koaksiyet kablo, bir ferrit çekirdek -ya da toroid- üzerine sarılarak bir RF şok devresi oluşturulmakta; ferrit çekirdekten çıkan ve anten konnektörüne
  


giden  koaksiyel kablonun ekran kısmı GND'a lehimlenmektedir. (BN43 çekirdek ile yaptığım RF şok devresini değiştirdim. T50-43 bir toroid üzerine koaksiyel kablo ile 3 tur sardım.)
31 Ekim 2021
Aleti montajı ve kutulanmasını bitirdim.
Şimdi sıra geldi ayarlama ve kalibrasyona.
Kalibrasyon için "kalibrasyon seti"ne ihtiyaç var. Bu set, kısa devre, açık devre ve 50 ohm'la kapatılmış 3 adet konnektörden oluşuyor. Benim yaptığım analizörün giriş konnektörü SMA olduğu için SMA konnektörlü bir kalibrasyon seti gerek bana. Aliexpress'ten 100 TL'ya temin etmek mümkün. Ancak ben kendim yapmayı seçtim. 
50 ohm'luk aparat

 Bunun için uçunda SMA konnektörü olan bir kablodan (3) adet konnektör kestim. Kablonun dışındaki kılıfı açarak blendajını ortaya çıkardım.

Blendaj tellerini konnektörün sap kısmına lehimledim.

Sonra, kablonun orta ucu ile blendaj arasına 2 adet 100 ohm %1'lik SMD direnç lehimledim.
Daha sonra bir plastik kalem kılıfının içini sıcak silikonla doldurarak yaptığım devreyi yarısına kadar sıcak silikona oturttum. Böylece, oldukça hassas bir 50 ohm'luk kalibrasyon aparatım oldu.
DİKKAT: Eğer 50 ohm'luk kalibrasyon gerecini kendiniz yapacaksanız kullanacağınız dirence dikkat edin. İdeal olarak burada karbon kompoze bir direnç kullanmaktır. 
Karbon kompoze direnç


Piyasada bulunan karbon film ve metal film dirençler üretim şekli, film tabakasının bir bobin gibi sarılmasını gerekirdiği için bu dirençler RF çalışmalarında uygun değildir.

(https://www.electroniclinic.com/carbon-resistor-vs-metal-film-resistor-carbon-composition-and-carbon-film/ )
SMD dirençler de kullanabilirsiniz. Ancak silindirik gövdeli olanlardan değil!
0 ohm'luk (kısa devre) aparat
Yukarıdaki gibi kesilmiş bir SMA konnektörünün canlı ucu ile blendajını en kısa şekilde biribirin lehimledim.
Açık devre aparat
Son olarak bir başka SMD konnektörün canlı ucunu boşta bırakarak açık devre aparatımı da yaptım.
Kalibrasyon kiti
Anten analizörünün kutulanmış hâli

Devrenin bağlantıları

Analizörün ana ekranı


Analizörün sayısal haberleşme modları ekranı








Cihazın ölçüm ekranından örnekler






31 Ağustos 2021 Salı

Ekranlı Raspberry Pi

 SBC (Single Board Computer) teknoloji dinyamıza yeni girmese de son zamanlarda adını çokça duyar olduğumuz bir terim. Tek bir kart üzerinde işlemcisi, hâfızası, giriş çıkış birimleri bulunan SBC'ün en bilinen örneklerinden birisi Raspberry Pi. Kısaca RPI olarak anılıyor. (Bu konuda kısa bir bilgi için Rasberry Pi nedir, nasıl işletim sistemi kurulur başlıklı yazıma bakabilirsiniz.)

Ülkemizde olmasa da yurt dışında görece ucuza alınabilen bu tek kartlı bilgisayar ile bir çok proje gerçekleştirmek mümkündür. RPI'ın HDMI ve kompozit video çıkışları mevcut. Bir ara kablo ile TV'ye ya da HDMI girişi olan bir monitöre bağlayabilirsiniz. Bunun yanında özellikle RPI için üretilmiş değişik ekran seçenekleri de var. Bunlardan birisi 7 inçlik renkli LCD ekran. Ekranın arka kısmına RPI'ı da kolaylıkla monte edebiliyorsunuz. 


Raspberry Pi için 7 inçlik dokunmatik ekran

Bu amaçla üretilmiş kutular da var. 28 ağustos 2021 tarihi itibarıyla bu kutunun Market Samm'deki fiyatı 193 TL idi.

7 inçlik ekranı ve RPI'ı daha ucuz bir kutuya monte etmeyi düşündüm ve Altınkayanın OP-358 kodlu kutusunu kullanmaya karar verdim. Aynı târihte bu kutunun fiyatı 66 TL idi.

OP-358 kutusu (Resim, Altınkaya sitesinden alınmıştır.)

Kutunun 2 türü var. K sonekli kutuda ekran için yer açılmamış, A sonekli kutuda ise ekran yeri açılmış vaziyette. Ben A sonekli kutuyu sipariş ettim.

Kutunun iç tarafındaki destek çıkıntıları bu ekranın kutuya tam oturmasına mâni oluyor. Bu yüzden Yukarıdaki ekranın bu kutuya sığması için birazcık kesme ve yontma işi gerekiyor. 

 (Çizim, Altınkaya sitesinden alınmıştır.)

Yukarıdaki resimde kesilecek ve yontulacak yerler gösterilmiştir.


Belli yerleri kesilip yontulmuş kutu



RPI'ın USB ve Ethernet girişleri için yuva


Normalde RPI LCD sürücü devresinin üzerine monte ediliyor. Ancak böyle montaj yapıldığında USB portları kutu içinde kalacağından erişilemez olacak. Onun için ben RPI'ı USB portları kenardan çıkacak şekilde monte ettim.

Aslında ben bu kutuya başka şeyler de ilâve ettim. Yukarıdaki fotografta da görüldüğü üzere, LCD'nin 5 v. beslemesini almak ve bir ayarlı fan kurmak için küçük bir ek devre de yaptım. Ayrıca, besleme hattına bir açma kapama anahtarı ilâve ettim ve besleme girişini yuvarlak güç girişine çevirdim. Ve son olarak da devreye D sınıfı bir ses frekansı güç kuvvetlendirici (amplifikatör) ilâve ettim.


(Devam edecek)

19 Ağustos 2021 Perşembe

Tâhir abi

 


(Resim https://www.tamsat.org.tr/tr/ adresinden alınmıştır)

Birkaç kişi hâricinde tanıdığım pek çok kişi "Tâhir abi" derdi. Gerçekten de "abi" idi. Gerçekten de ismiyle müsemmâ idi; temiz bir insandı...

42 yılı aşan Devlet memuriyeti hayatımda pek çok bürokrat tanıdım ama Tâhir abi onlardan değildi. Bir bakanlığın müsteşar yardımcısı iken dahi saf bir amatör telsizci olarak kalabilmiş birisi idi. Ziyâretine gittiğimizde bizi arka odasına alır, henüz Türkiye'de internetin çok yaygın olmadığı o zamanlarda bilgisayarını açar, kullanmamız için bize bırakır, makamına geçer ve arada bir yanımıza gelip "ne var ne yok, birşeyler buldunuz mu?" diye merakla sorardı.

O kadar mütevazı idi ki, hafta sonları  Derya'nın babası (TA2ED) rahmetli Necâti amcanın sanayideki kaportacı dükkânına gelir, orada Necâti amcanın küçük bir tüp üzerinde güveç yapmasını bizden daha sabırsızca beklerdi.  Yaz kış, sıcak soğuk demeden o güveç kabına ekmeklerimizle âdeta saldırırdık.

Zaman zaman âniden sesi yükselir, onu tanımayan birisi sanki karşısındakine kızıyor zannederdi. Oysa o, söylediği şeye inanmayanlara inancının derecesini göstermek için yükseltirdi sesini. Kızar mıydı? Hiç görmedim, duymadım diyebilirim. Hep birşeylere yönlendirir, hep teşvik ederdi insanları. "Yapamayız" lügatinde olmayan kelîme idi.

Uzunca bir süre görüşememiştik. Görüştüğümüzde yaşı ilerlemiş ama heyecanları gençleşmiş idi.

Ve bir gün göçüp gitti aramızdan.  Bedeni toprak oldu evet, ama Tâhir abinin ruhu hep bizimle.

Mekânı Cennet olsun.

22 Temmuz 2021 Perşembe

Raspberry Pi ile İnternet Radyosu

 Radyo yayınlarının internet üzerinden yayınlanması uygulaması öyle ilerledi ki artık neredeyse mahallî yayın yapan radyoların bile internet üzerinde yayınları bulunuyor. Özellikle VHF bandında yayın yapan -ve FM radyolar olarak bilinen- radyoların yayın anteninden itibaren -coğrafî yapıya göre- en fazla 50 ilâ 80 km. arasında dinlenebildiği de göz önünde tutulunca, "mesafe tanımayan" internet radyolarının önemi daha da artıyor. Bu amaçla üretilmiş ticarî radyo alıcıları olduğu gibi, internet üzerinde pek çok uygulama reçetesi de bulmak mümkün. Radyoya olan merakım sebebiyle, bu konuya el atmış ve ESP32'li bir radyonun (KaRadio) yapılış safhalarını adım adım anlatmış idim. ( https://qsl.net/ta2ei/devreler/alici/int_radyo/int_radyo.htm )

Bir süre önce internette Raspberry Pi ile yapılan bir internet radyosu uygulaması ararken Bob Rathbone adlı IT danışmanı ve yazılımcının sayfasını buldum. ( https://bobrathbone.com/ )

Bu sayfada Raspberry Pi (RPI) ile yapılmış çeşitli projeler var. Bunların arasında benim ilgimi çeken RPI üzerinde çalışan internet radyosu oldu. 2 ve 4 satırlı, 8, 16 ve 20 sütünlu alfanümerik LCD, bunların I2C'li olanları, Adafruit'in beş tuşlu LCD'si, RPI 7 inch LCD, Adafruit 3.5 inch LCD, 0.96 inch OLED gibi bir çok ekran türünü destekleyen, sesin kulaklık çıkışından, HDMI'dan, RPI için DAC kartlarından alınabildiği oldukça ilginç bir devre idi.  Tam 308 sayfalık bir de yapım kitapçığı  (v7.2) vardı. Her şey en acemi kullanıcıların bile anlayabileceği bir şekilde ayrıntılı olarak anlatılmış bu kitapta.

Radyo, RPI 3, 4, 400 ve Zero-W'da çalışabiliyor.

Ben, önce bir RPI 3 üzerinde denemeye karar verdim. Her ne kadar Yazarın önerileri arasında olmasa da, elimde Waveshare 3.5 inch rezistif dokunmatik LCD ekran vardı. Onu kullanmaya karar verdim. Sesi de RPI'ın 4 boğumlu3.5 mm'lik jack çıkışından almaya karar verdim.


Dikkat! Yukarıdaki resimden de anlaşılacağı üzere, GND (şase, toprak) bağlantısı son boğumda değil sondan bir önceki boğumdadır.
Yapım kitapçığında anlatıldığı üzere, önce Raspberry Pi Masaüstünü kurdum. ( Raspberry Pi Masaüstünü kurmak ile alâkalı bilgiler https://qsl.net/ta2ei/muhtelif/RPi/raspberry.htm adresinde vardır.) 
HDMI üzerinden monitöre bağlı iken statik IP adresi belirleme ve SSH'yı etkinleştirme işlemlerini yaptım.
Masaüstünü ve birkaç yazılımı da kurduktan sonra karşıma radyonun yapılandırma ekranı geldi ve donanımıma göre gerekli yapılandırmaları yaptım.
Yukarıda da belirttiğim üzere, yapılandırmada Waveshare ile ilgili bir seçenek yok. Bunun yerine "küçük 2.8 inch LCD ekran" seçeneğini seçtim.
 Ayarlardan sonra sistemi yeniden başlattım ve BBC radyoyu dinlemeye başladım.
Artık Waveshare ekranı kullanmaya sıra gelmişti. Elimdeki ekran 3.5 inch A tipi olduğu için https://www.waveshare.com/wiki/3.5inch_RPi_LCD_(A) adresindeki yönergelere uygun olarak LCD sürücüsünü de kurdum ve radyo Waveshare ekranda da çalıştı. Buraya kadar herşey iyi gitti.

Radyoyu kablosuz olarak dinlemek de mümkün.
Evet, RPI'da bluetooth (BT) olduğuna göre bu radyoyu bir BT hoparlör seti ya da BT kulaklık ile de dinlemek mümkün. Nitekim Yazar, radyo yapılandırmasının ses bölümünde BT seçeneği de vermiş. RPI masaüstünden JBL Go2 BT hoparlörümü tanıtmaya karar verdim. Ama masaüstünde BT simgesi yoktu. Komut satırına
sudo systemctl status bluetooth
yazdığımda, BT'un "ölü" olduğu mesajını aldım.
Devrenin yazarı ile mesajlaşarak fikrini sormak da dâhil bir sürü şey denedim ama BT'u "canlandıramadım."
En baştan başlayarak sistemi yeni baştan kurmaya karar verdim. SD karta temiz bir imaj atıp adım adım izlemeye başladım. Masaüstü monitörümde herşey normaldi. Waveshare LCD'yi kullanmak için ilgili sürücüyü yüklediğimde BT simgesi tekrar kayboldu. Denediğim herşeyi bir daha denedim, olmadı.
Üçüncü defa sistemi baştan kurmaya karar verdim. Yine olmadı. Bu sırada, Waveshare'in wiki sayfasındaki bir not dikkatimi çekti: "Executing apt-get upgrade will cause the LCD to fail to work properly.yazıyordu. Hmmmmm... demek upgrade işlemi ile uyumsuz bâzı unsurlar işin içini giriyordu.
Bunun üzerine daha eski sürümleri denemeye kadar verdim. 
 RPI'a 2020-05-27-raspios-buster-armhf_minimum sürümünü kurdum. Kurulum ekranında "sistemi güncellemek istiyor musunuz" sorusunu "atla" diyerek geçtim.
Kurulum bitince, henüz Waveshare sürücüsünü kurmadan, masaüstü monitörünü kullanarak BT hoparlörümü sisteme tanıttım.
Bir sonraki adımda Waveshare sürücüsünü yükledim ve
 sudo apt-get update
komutu ile sistemi güncelledim.
Daha sonra Yazarın kitabında belirttiği gibi ffmpeg, anacron, scratch, mpd mpc python3-mpd python3-rpi.gpio'u yükleyip son olarak  radiod_7.2_armhf.deb paketini kurdum.
 Radyo, JBL Go2 BT hoparlörü ile problemsizce çalıştı.

GÜNCELLEME: (26.07.2021)
Yazar Bob Rathbone, Waveshare LCD sürücülerinden kaynaklanan BT problemini çözmüş. Problemin kaynağının, Waveshare sürücüsünün kurulurken, config.txt dosyasını değiştirmesi olduğunu ve çözümünün config.txt dosyasına aşağıdaki iki satırı ilave etmek olduğunu belirtiyor:

dtoverlay=pi3-miniuart-bt
core_freq=250


Yine Waveshare sürücüsünün, config.txt dosyasını DOS biçimine çevirdiğini, bu dosyayı yeniden unix sistemine çevirmek için dos2unix yazılımının kullanılmasının gerektiğini belirtiyor. (s. 105 - 106)
GÜNCELLEME (26.06.2024)
RPi üzerinde çalışan internet radyosu yazılımının 7.7 sürümü https://bobrathbone.com/raspberrypi/pi_internet_radio.html adresinden temin edilebilir.

1 Haziran 2021 Salı

Pil doldurma

 Başlığa pil doldurma yazdım, zira bizde bütün kimyevî elektrik üreteçleri "pil" olarak biliniyor. Akümülatör de denilen doldurulabilir piller de aynı isimle anılıyor. Lityum pil, lityum iyon (li ion)  pil, lityum polimer (li po) pil, nikel kadmiyum (NiCad) pil, nikel metalhidrit (NiMH) pil. Bunun tek istisnası sanki kurşunlu aküler. Onlara pil demiyoruz, belki de büyük boyutlu olmalarından dolayı. Öyle ya da böyle artık doldurulabilir piller hayatımızın bir parçası oldu. Tabii pil doldurulabilir olunca doldurma devreleri de.

Ancak, pil doldurma devreleri konusunda pek de özenli sayılmayız. Eğer doldurulabilir pil telefon, matkap vs. gibi münhasıran bir cihaza aitse, doldurma devresi ya o cihazın üzerinde veya o cihaza özel olarak yanında verilir. Peki ya doldurma devresi yoksa?

İşte curcuna burada başlıyor. İpuçları başlıklı yazımda şunu yazmıştım: "Piyasada "Li ion şarj devresi" ibaresi de kullanılarak satılan pil koruma ve dengeleme devreleri ŞARJ için ÜRETİLMEMİŞTİR. Bu devrenin görevi, seri bağlanan li ion pillerin aşırı akım ve gerilime ve aşırı boşalmaya karşı korunması ve piller arasında dengeleme sağlamaktır."


Bunu yazmamım sebebi çoğu defa bu devrelerin "şarj devresi" olarak satılmasıdır. Buyrun!

Buna inanarak bu devreyi alıp 3 adet lityum iyon pili doldurmaya çalışan birisinin başına eğer şanslı ise pillerin tam dolmaması veya ömrünün kısalması gelir. Ancak, lityum piller "patlayıcıdır". Sizi yaralayabileceği gibi yangın çıkmasına da sebep olabilir.

Diğer piller daha mı az tehlikelidir? Uygun doldurma devresi ve şartları olmadan doldurulan bir nikel kadmiyum pilin patlaması hâlinde ortaya saçılabilecek kadmiyum zehirli bir maddedir. Keza kurşun da.

Hadi böyle en kötü ihtimalleri bir yana bırakalım. İşin bir de malî ciheti var. Birsürü para verip aldığınız pillerin çabucak ömrünün dolması veya işini yap(a)mamasının doğurduğu zararları da hesaba katmak gerekiyor. O halde yapılacak şey, her pili UYGUN ve DOĞRU bir doldurucu ile doldurmaktır.

Günümüzde lityum türevi doldurulabilir piller, küçük hacimde yüksek bir güç sunmaları sebebiyle pek revaçtalar. Bu yüzden amatörlerce yapılan devrelerde de sıklıkla kullanılmaktadır. Eğer tek bir li ion veya li po hücresi kullanıyorsanız piyasada pek çok ve ucuz doldurma devresi bulmanız mümkün. Bunların koruma devreli olanları da kolaylıkla bulunabiliyor. Eğer iki hücreli bir i ion veya li po hücre kullanıyorsanız, TP5100 tümdevreli bir doldurucu işinizi görecektir. TP5100 tümdevreli doldurucular hem tek ve hem de iki hücreli li ion ve li po piller için kullanılabilecek şekilde üretiliyor.

Bu arada bir ek bilgi vereyim: Pil hücreleri S harfiyle belirtilerek 1 hücre için 1S, 2 hücre için 2S... kısaltması kullanılıyor.

Peki 3 veya 4 (ya da daha fazla) li ion veya li po hücre kullanıyorsanız -yâni 3S ve daha fazla- ne olacak?

Bu konuyu araştırırken https://www.microfarad.de/li-charger/ adresinde arduino etrafına kurulmuş oldukça marifetli bir lityum pil doldurma devresi buldum. Devre, 1s ilâ 4s arasını doldurabiliyordu. 1S ve 2S için uygun doldurucularım olduğundan ve geriye benim kullandığım sâdece 3S kaldığından, devreyi 3S için gerçekleştirmeye karar verdim. Bir yandan da "ya 4S ve daha fazla hücreli bir uygulama gerekirse?" diye düşünmeden edemiyordum. Sonunda hazır bir devre almaya karar verdim. 


Yukarıda resmi görülen "çakma" denilen doldurucu aslında "klon". Üzerinde

LiIon, LiPo, LiFE  1-6 cells,

NiCd - NiMH 1- 15 cells

PB 2-20V

Yazıyor. 

Buna göre neredeyse doldur(a)madığı pil yok gibi. Ancak, LiFe konusunda şüpheliyim.

Bunun yanında devre, li ion piller için balans şarj özelliği de sunuyor.

Ayrıca boşaltma yoluyla kapasite ölçtüğü de belirtilmiş.

Ben sadece Li ion doldurma özelliğini kullandım şimdiye kadar ve oldukça başarılı bulduğumu söylemeliyim.

23 Mayıs 2021 Pazar

QCX-Mini için ek devre

 QCX-Mini serencamımı yazmıştım. Avuç içine kolaylıkla sığan ve oldukça hafif olan bu devrenin öncelikli amacı taşınabilir bir QRP CW alıcı-vericisidir. Taşınabilir olmanın gerçekleşebilmesi için besleme devresinin de taşınabilir olması gereklidir. Şu hâlde QCX-Mini bir akü tarafından beslenmelidir diye düşündüm. Bunun için 3 adet li-ion pil kullanmaya karar verdim. 3 adet li-ion pil tam doluyken 4.2 x 3) 12.6 v., en at sınırda ise (3 x 3) 9v gerilim sağlar.

Bunun için 3 adet kaliteli li-ion pil bularak işe başladım. Çin'den gelen ve uçuk kapasite değeri olan pillerden uzak durarak, LG markalı 3 pil satın aldım. Bunları 500F.'lık bir süper kondansatörle kendim puntalayarak, üzerine de bir 3S pil koruma devresi monte ettim. Böylece 12v.luk pil bloğum hazır oldu.


Bu pilleri sıradan bir kutuya koymak işime gelmedi. Altınkaya firmasının PR-224 kodlu kutusunu kullanmaya karar verdim.
QCX-Mini, normalde kulaklıkla kullanılmak üzere tasarlandığından, ses çıkışını güçlendirerek bir hoparlörden dinlemek üzere devreye bir de ses frekansı güç kuvvetlendiricisi eklemeye karar verdim.
Ayrıca, li-ion pillerimim gerilimini de öğrenebilmeliydim.
Yine bir amatör telsizci, bu cihazı alarak bir yerlere gidip oradan QSO yapmak isterse, konum bilgisinin ve UTC olarak saat bilgisinin de gerekli olduğu açık idi. Şu hâlde bir de GPS gerekiyordu.
Böylece araştırmaya başladım. 
ON4IY çağrı işaretli Belçikalı amatör telsizcinin "Roverbox" projesinin çeşitli ekleme ve iyileştirmelerden sonra ON4CDU tarafından hazırlanan Arduino projesini incelemeye başladım.
Madem devrede bir Arduino kullanılacak o zaman ek özellikler de olsun diye düşünerek, bir CW çözücü özelliği de eklemek istedim. Yine araştırmalarım sonucunda K4ICY çağrı işaretli Amerikalı bir amatör telsizcinin CW çözücü projesine ulaştım. 
GPS bilgilerini, CW kod çözmeyi ve pil gerilimini ölçmeyi tek bir Arduino yazılımından toplamak üzere ON4CDU'nun ve K4ICY'nin yazılımlarını birleştirdim, gereksiz bâzı özellikleri çıkardım ve yazılıma bir de gerilim ölçme rutini ekleyerek Arduino'ya yükledim.
Küçük bir plastik kutuya Çin malı bir GPS yerleştirip, bu GPS'i 9'lu bir konnektör vasıtasıyla kutunun üstüne takılıp çıkarılır hâle getirdim.

                                  
Kutulanmış GPS









29 Mayıs 2021

Bugün 29 Mayıs. İstanbul'un fethinin 568. yıldönümü kutlu olsun.

CW çözme işi zor bir iş. Alıcının işaretlerinin mikroişlemcinin anlayacağı hâle getirilmesi başlı başına bir problem. Esasen QCX-mini, CW çözme işini kendisi mükemmel olarak yapıyor. O yüzden CW çözme işinden vazgeçtim. Tek ekranda tarih, UTC saat, enlem ve boylam, râkım ve pil gerilimini aynı anda göstermenin daha uygun olacağını düşündüm ve yazılımı ona göre değiştirdim.

İşte yeni ekran:





14 Ağustos 2021
Her ne kadar pil dengeleme devreleri Li-ion pillerin aşırı boşalmasına karşı koruma sağlıyor denilse de, ben yine de bir tedbir olarak devreye bir doldurma ikazı ekledim. Pillerin gerilimi belli bir değerin altına düşünce ekranda DOLDUR yazısı çıkıyor. Ben bu değeri 10v olarak belirledim. Ancak bu değeri kendi isteğinize göre değiştirebilirsiniz. (9v'tan daha düşük olmamak kaydıyla!)
Devrenin şeması ile yeni kodlar aşağıdadır.

15 Ağustos 2021
Arduino kodları ile ilgili bâzı açıklamalar:
1) Devrede, R1 ve R2'den oluşan bir gerilim bölücü kullanılmıştır. Tam dolu iken her bir li-ion pilin gerilimi 4,2v'a kadar yükselir. Tam dolu hâlde seri bağlı 3 pilin gerilimi 4,2 x 3 = 12,6v, en düşük olarak da 3 x 3 = 9V olacağından, bu gerilim bölücü ZORUNLUDUR. R1 için 10k'lık, R2 için 3,9k'lık bir direnç kullandım. Kullandığınız dirençlerin değerini ölçerek Ohm birimi ile 
/ / Voltmetre değişkenleri kısmına yazın.
Benim devremde bu dirençlerin değeri şöyle idi:
float           r1=9960.0; // R1'in tam değerini ölçerek yazın. (ohm)
float           r2=3895.0; // R2'nin tam değerini ölçerek yazın. (ohm)
2) Devrede kullanılan LCD ekran, 4 satır 20 karakterlik olup, bir I2C sürücüsü ile kullanılmıştır. Bu sürücünün adresi genellikle 0x27'dir. Eğer sizin kullandığınız sürücünün adresi farklı ise
LiquidCrystal_I2C lcd(0x27,20,4); 
satırına doğru değeri yazın. (0x27 yerine)
3) Kullandığınız GPS modülünün haberleşme hızını
const int       GPSbitrate = 9600
satırına yazın. Benim kullandığım modülünü hızı 9600 baud idi.
4) Li - ion pilleri için doldurma ikaz değerini, void volc() yordamında
 if(input_voltage<10)
satırına yazınız. Benim belirlediğim değer 10 v idi.
5) Aşağıdaki kodlar, Arduino Leonardo'ya göre hazırlanmıştır. Eğer Arduino Uno vena Nano kullanacaksanız Serial1 ibârelerini Serial olarak değiştirin. Bu ibârelerin değiştirileceği yerler kodlarda belirtilmiştir.
6) Ne yaptığınızı tam bilmeden kodlarda değişiklik yapmayın!!



ARDUINO KODLARI

/*//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

/*  Devrenin GPS kodları ON4CDU çağrı işaretli amatöre aittir.
 *   Arduino Micro 
 *    2    LCD SDA
 *    3    LCD SCL
 *    RX    GPS TX
 *    A0    ADC V input
 *    Bu yazılım, Tarihi, UTC olarak saati, yüksekliği, Uydu sayısını, enlem ve boylamı, grid locator'u, pil gerilimini
 *    ve gerilimin 10 v.'un altına düşmesi hâlinde şarj ihtiyacını gösterir.
 */

/// Included Libraries ///////////////////////

#include <Wire.h>               
#include <LiquidCrystal_I2C.h> 
LiquidCrystal_I2C lcd(0x27,20,4); // kendi devrenizin i2c adresini yazın.

//GPS için define'lar
#define DEG_TO_RAD 0.01745329
#define PI 3.141592654
#define TWOPI 6.28318531
// NMEA fields
#define RMC_TIME 1
#define RMC_STATUS 2
#define RMC_LAT 3
#define RMC_NS 4
#define RMC_LONG 5
#define RMC_EW 6
#define RMC_DATE 9
#define GGA_FIX 6
#define GGA_SATS 7
#define GGA_HDOP 8
#define GGA_ALTITUDE 9
#define HEADER_RMC "$GPRMC"
#define HEADER_GGA "$GPGGA"


/// SYSTEM VARIABLES ////////////////////

//*** GPS için değişkenler
const int       GPSbitrate = 9600;        //GPS cihazının haberleşme hızı
const int       sentenceSize = 82;
const int       max_nr_words = 20;
char            sentence[sentenceSize], sz[20],regel[20],diger[10];
char*           words [max_nr_words];
char            sts, latdir, longdir;
int             alternate;
int             hours, minutes, seconds, year, yeard, month, day;
int             gps_fixval, gps_sats, alti, hdopi;
int             latdeg, latmin, latsec;
int             londeg, lonmin, lonsec;
float           time, date, latf, lonf, hdopf;
boolean         status, gps_fix, hdop;
char            char_string [] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char            num_string[]= "0123456789";

//some variables for sun position calculation
float           Lon, Lat;
float           T,JD_frac,L0,M,e,C,L_true,f,R,GrHrAngle,Obl,RA,Decl,HrAngle;
long            JD_whole,JDx;

// Voltmetre değişkenleri
float           temp=0.0;
float           r1=9960.0; // R1'in tam değerini ölçerek yazın.
float           r2=3895.0; // R2'nin tam değerini ölçerek yazın.
float           input_voltage = 0.0;
// buraya kadar

/// System Setup /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void setup() {
Serial1.begin(GPSbitrate);      // Uno veya nano kullanacaksanız serial1'i serial yapın.
lcd.init();                     // Initialize the LCD display
lcd.backlight(); 
lcd.clear();
lcd.begin(20,4); 

// Splash Screen: Credit / Version / Site
lcd.setCursor(0,0);   lcd.print(" QCX MiNi YARDIMCI  ");
lcd.setCursor(0,1);   lcd.print(" GPS  - ON4CDU      ");
lcd.setCursor(0,2);   lcd.print(" Mod. - TA2EI       ");
lcd.setCursor(0,3);   lcd.print(" RECEP AYDIN GULEC  ");
delay(4000);
//lcd.blink();
lcd.clear();
while (!Serial1.available())
{
  yok();
}
}
/////////////////////////////////// Operation //////////////////////////////////////////////////////////////////////////////////////

void loop() 
{
  gps();
 
//volc();
}  // End Main Loop /////

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void gps()
{
   
  static int i = 0;
  if (Serial1.available())       // Uno veya nano kullanacaksanız serial1'i serial yapın.
  {
    char ch = Serial1.read();   // Uno veya nano kullanacaksanız serial1'i serial yapın.
    if (ch != '\n' && i < sentenceSize)
    {
      sentence[i] = ch;
      i++;
    }
    else
    {
      sentence[i] = '\0';
      i = 0;
      displayGPS();
    }  
  }
 
  }
/////////////////////////////////////////////////////////////////////////////////////////
void displayGPS()
{
  
  getField ();
  if (strcmp(words [0], HEADER_RMC) == 0)
  {
    processRMCstring();
    printfirstrow ();
    locator();
  }
  else if (strcmp(words[0], HEADER_GGA) == 0)
  {
    processGGAstring ();
  }
  printGGAinfo ();
}
///////////////////////////////////////////////////////////////////////////////////////////
void getField () // split string was probably a better name
{
  char* p_input = &sentence[0];
  //words [0] = strsep (&p_input, ",");
  for (int i=0; i<max_nr_words; ++i)
  {
    words [i] = strsep (&p_input, ",");
  }
}
//////////////////////////////////////////////////////////////////////////////////////////////
void processRMCstring ()
{
    time = atof(words [RMC_TIME]);
    hours = (int)(time * 0.0001);
    minutes = int((time * 0.01) - (hours * 100));
    seconds = int(time - (hours * 10000) - (minutes * 100));
    sts = words[RMC_STATUS][0]; // status
    status = (sts == 'A');
    latf = atof(words [RMC_LAT]); // latitude
    latdeg = latf/100;
    latmin = (latf - (int(latf/100))*100);
    latsec = (((latf -int(latf))*100)*0.6);
    latf = int (latf * 0.01) + (((latf * 0.01) - int(latf * 0.01)) / 0.6);
    latdir = words[RMC_NS][0]; // N/S
    lonf= atof(words [RMC_LONG]);// longitude 
    londeg = lonf/100;
    lonmin = (lonf - (int(lonf/100))*100);
    lonsec = (((lonf -int(lonf))*100)*0.6);
    lonf = int (lonf * 0.01) + ((lonf * 0.01 - int(lonf * 0.01)) / 0.6);
    longdir = words[RMC_EW][0]; // E/W      
    date = atof(words [RMC_DATE]); // date
    day = int(date * 0.0001);
    month = int ((date * 0.01) - (day * 100));
    year = int (date - (day * 10000) - (month * 100));
    year = year + 2000;    
}
///////////////////////////////////////////////////////////////////////////////////////
void processGGAstring ()
{
    gps_fixval = words[GGA_FIX][0] - 48;
    gps_fix = (gps_fixval > 0);
    gps_sats = atoi(words[GGA_SATS]);    
    //hdopf = atof (words[GGA_HDOP]);
    alti = atoi(words[GGA_ALTITUDE]); 
}
////////////////////////////////////////////////////////////////////////////////////////
void printfirstrow ()
{
    sprintf(sz, "%02d.%02d.%04d %02d:%02d UTC",
            day, month , year, hours , minutes );
    lcd.setCursor(0, 0);
    lcd.print(sz); // Saat ve tarih LCD'de gösterilecek  
}
//////////////////////////////////////////////////////////////////////////////////////
void printGGAinfo ()
{
  if (seconds == 30)
    sunpos();
  if (status && gps_fix)
  {
        sprintf (sz, " ");
        sprintf(regel, "Lt:%2d %2d %2d %1c", latdeg, latmin , latsec ,latdir);
        lcd.setCursor(0, 2); lcd.print(regel); // Enlem LCD'de gösterilecek
        sprintf(regel, "Ln:%2d %2d %2d %1c", londeg, lonmin , lonsec ,longdir);
        lcd.setCursor(0, 3); lcd.print(regel); // Boylam LCD'de gösterilecek
        lcd.setCursor (7,1);
        sprintf(diger, "R:%4d m", alti);         
        lcd.print(diger);
        volc();
        lcd.setCursor(16,1);
        lcd.print("U:");
        lcd.print(gps_sats);  
  } 
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void locator()                                       // locator hesabı ve LCD'de gösterilmesi
{
  float loclong = lonf * 1000000;
  float loclat = latf * 1000000;
  float scrap;
  if (longdir == 'E') 
  {
    loclong = (loclong) + 180000000;
  }
  if (longdir == 'W') 
  {
    loclong = 180000000 - (loclong);
  }
  if (latdir == 'N') 
  {
    loclat = loclat + 90000000;
  }
  if (latdir == 'S') 
  {
    loclat = 90000000 - loclat;
  }
  lcd.setCursor(0, 1); // printing QTH locator
  lcd.print(char_string[int(loclong / 20000000)]);        // First Character - longitude based (every 20° = 1 gridsq)  
  lcd.print(char_string[int(loclat / 10000000)]);         // Second Character - latitude based (every 10° = 1 gridsq) 
  scrap = loclong - (20000000 * int(loclong / 20000000)); // Third Character - longitude based (every 2° = 1 gridsq)
  lcd.print(num_string[int(scrap * 10 / 20 / 1000000)]);
  scrap = loclat - (10000000 * int(loclat / 10000000));   // Fourth Character - latitude based (every 1° = 1 gridsq)
  lcd.print(num_string[int(scrap / 1000000)]); 
  scrap = (loclong / 2000000) - (int(loclong / 2000000)); // Fifth Character - longitude based (every 5' = 1 gridsq)
  lcd.print(char_string[int(scrap * 24)]);
  scrap = (loclat / 1000000) - (int(loclat / 1000000));   // Sixth Character - longitude based (every 2.5' = 1 gridsq)
  lcd.print(char_string[int(scrap * 24)]); 
 }
  
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void sunpos()
{
int A, B;  
    Lat = latf*DEG_TO_RAD;
    if (latdir == 'S')
    {
      Lat = -Lat;
    } 
    Lon = lonf*DEG_TO_RAD;
    if (longdir == 'W')
    {
      Lon = -Lon;
    }
    if(month <= 2) 
    { 
      year--;
      month+=12;
    }  
    A = year/100; 
    B = 2 - A + A/4;
    JD_whole = (long)(365.25*(year + 4716)) + (int)(30.6001 * (month+1)) + day + B - 1524;
    JD_frac=(hours + minutes/60. + seconds/3600.)/24. - .5;
    T = JD_whole - 2451545; 
    T = (T + JD_frac)/36525.;
    L0 = DEG_TO_RAD * fmod(280.46645 + 36000.76983 * T,360);
    M = DEG_TO_RAD * fmod(357.5291 + 35999.0503 * T,360);
    e = 0.016708617 - 0.000042037 * T;
    C=DEG_TO_RAD*((1.9146 - 0.004847 * T) * sin(M) + (0.019993 - 0.000101 * T) * sin(2 * M) + 0.00029 * sin(3 * M));
    f = M + C;
    Obl = DEG_TO_RAD * (23 + 26/60. + 21.448/3600. - 46.815/3600 * T);     
    JDx = JD_whole - 2451545;  
    GrHrAngle = 280.46061837 + (360 * JDx)%360 + .98564736629 * JDx + 360.98564736629 * JD_frac;
    GrHrAngle = fmod(GrHrAngle,360.);    
    L_true = fmod(C + L0,TWOPI);
    R=1.000001018 * (1 - e * e)/(1 + e * cos(f));
    RA = atan2(sin(L_true) * cos(Obl),cos(L_true));
    Decl = asin(sin(Obl) * sin(L_true));
    HrAngle = DEG_TO_RAD * GrHrAngle + Lon - RA;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////

void volc()
{
   int analog_value = analogRead(A0);
    temp = (analog_value * 5.0) / 1024.0; 
    input_voltage = temp / (r2/(r1+r2)); 
    lcd.setCursor(14, 3);
    if(input_voltage<10)
    {
    lcd.print("DOLDUR");
    }
 if(input_voltage>10)
    {
    lcd.print(input_voltage);
    lcd.print("v");
    }
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////
void bekle()
{
   lcd.setCursor(0,1);
    lcd.print("     GPS SiNYALi    ");
    lcd.setCursor(0,2);
    lcd.print("     BEKLENiYOR     ");
    delay(1000);
    //lcd.clear();
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////
void yok()

{
    lcd.setCursor(0,1);
    lcd.print("     GPS CiHAZI     ");
    lcd.setCursor(0,2);
    lcd.print("   TAKILI DEGiL!    ");
    delay(1000);
    lcd.clear();
  } 




İletişim bilgisi

 Zaman zaman -benim çok az kullandığım vasıtalarla- ileti göndererek benimle iletişime geçmek isteyenler olduğunu görüyorum. Bana şu e-posta...