“Teori ve pratik bir noktada mutlaka çatışır, o an geldiğinde teori her zaman kaybeder. Her seferinde.”
– Linus Torvalds
Linus’un felsefesinin işletim sistemi tasarımından çıkıp tüm hayatıma dokunduğunu hissettiğim an işte tam da bu cümlesini okuduğum andı. Hayatımda teori ve pratik her zaman çatıştı ve teorinin gerçekliğini alt etmek için bilgi yoğun bir çalışma yapmam gerekliydi. Böyle anlarda kendime olan inancı çoğu zaman yeterli bulmasam da bu cümle uzun zamandır yapmak istediğim projenin kıvılcımını oluşturdu. Bu kıvılcım, beni Arduino’nun hantal yapısını zorlamanın, raspberry’nin ara katmansız (işletim sistemi olmadan) donanımına dokunma zamanının geldiğine inandırdı ve STM32 ekosistemiyle el sıkışmaya itti. Arduino’nun pamuklara sarıp sarmalayan kütüphanelerinden kopup yalın donanımla uğraşma enerjisini bulduğumda, kendisi küçük/ucuz, vaatleri büyük olan STM32F103C8T6 (Blue Pill) siparişini verdim. Blue Pill’in bacaklarını lehimledikten sonra aklımda tek bir proje vardı. APRS Tracker. Yapılabilir miydi?
Elbette yapılabilirdi ama ben nasıl yapabilirdim? AX25 protokolüne az buçuk da olsa aşinaydım ama paketlemesi, bit-stuffing sancısının uğraştıracağı barizdi. Daha önce hep hazır kodları ve donanımları kullandım. Barış Dinç’in hymTRacker’ı da gayet güzel çalışıyordu. Ama direnç şelalesinden kopup görece daha yalın bir donanım olan Blue Pill ile PWM tabanlı bir tracker yapmak çok makul göründü. Ancak yine Linus’un o meşhur sözü kulaklarımda yankılandı. Teori vs pratik… Teoride her şey mükemmeldi ama ya pratik… Gelin o konuya detaylıca bakalım.
STM32 geliştirme ortamı Arduino’dan çok farklı. Arduino IDE’si ile geliştirme yapıldığına dair bilgiler olsa da Ferrari’ye tüp takıtrmaktan farkı yok. Dolayısıyla STM32’nin native geliştirme ortamı olan CUBEMX ve CUBEIDE kullanmak en mantıklı çözümdü. CUBEMX; pin konfigürasyonunun yapıldığı ortam. Hangi pinin hangi konfigürasyonda (örneğin baudrate, input, output, timer vs.) kullanılacağını olayın en başında burada belirleyip ona göre kodu oluşturuyorsunuz. Bu pin konfigürasyonu da main.c dosyasına otomatik oluşuyor. CUBEIDE 2.0 versiyonunda CUBEMX ve CUBEIDE ayrı programlar iken CUBEIDE 1.19’da MX de dahili şekilde geliyor. Böylece pin konfigürasyonu ve yazılım geliştirmeyi tek bir yazılım ile çözebiliyoruz. Bu yüzden de basit olanı tercih ettim ve geliştirmeyi 1.19 versiyonunu Fedora’ya kurarak ilerlettim. Programı sitesinden indirmeden önce myST üyeliği istiyor onu da basit ve bedava bir şekilde oluşturarak ilgili indirme ve kurulum aşamalarını tamamladım.
Gelelim programlama aşamasına. Gözüme ilk çarpan proje q8vps’nin vp-digi projesi oldu. STM32F103C8T6 için yazılmış en iyi (ki bence mükemmel de) APRS digipeater. FX-25 desteği, optimizasyonu, stabilite ve kararlılığı amatörlere lütfedilmiş bir başyapıt. Ancak tek bir eksiği var. Tracker modu. James Hetfield için iron cross/explorer kasa ne ifade ediyorsa benim amatör telsizcilik faaliyetlerim için de APRS Tracker onu ifade ediyor. Dolayısıyla aklımda tek bir cümle ile işe koyulmaya karar verdim. “Onun AX-25 veri paketlemesine, gps parser eklemek ne kadar zor olabilridi ki?” Hiç de öyle olmadı…
$GPRMC satırları işlemciyi terletirken interrupt çakışmaları, GPS verisi akarken AFSK sinyali üretmeye çalışmak, hem protokolü koşturup hem de veriyi işlemek tam bir orkestra şefi olmayı gerektiriyordu.
Tüm bunları yaparken yarı yolda telsiz değişikliği yapmaya karar verdim. Çok da memnun olmadığım, kararsız çalışan QYT KT-8900D telsizi emekliye ayırıp yerine fansız, kararlı, kompakt bir cihaz olan ANYTONE AT 779 UV’yi göreve getirmeye karar verdim. Ama yine duvara tosladım. Anytone AT 779 UV ile telsizin TX’e geçmesi, klasik yöntem olan ptt pininin gnd’ye çekilmesiyle çalışmıyordu. Ne denediysem olmadı. Sonra, acaba bir seri protokol mü var diye şüphelendim. Telsiz maykını sökerek ilgili pinleri logic analyzer ile pc’ye bağladım. PTT on ve off komutlarını çözerek not ettim ancak daha sonra github’ın derinliklerinden unsword01‘in zaten protokolü çok daha detaylı bir şekilde çözdüğünü fark ettim. Kendisine selam olsun.
Tamam, Anytone AT 779 UV bu şekilde çalışıyordu ama aynı zamanda bu tracker farklı telsizlerde de kullanılacaktı. Bu sebeple 2N7000 ile tetikleme yaparak ve projeye bir switch ekleyerek PTT pininin GND‘ye çekilmesini istedim. Burada duvara bir kez daha tosladım. 2N7000’in eşik voltajı 0.8V-3.0V olduğundan ve STM32 de 3.3V logic ile çalıştığından sağlıklı bir şekilde çalışmadı. Voltaj ile tetiklemeden vazgeçerek, eski dost 2N2222 ile akım üzerinden tetikleme yapmaya karar verdim. 144.800 Mhz’teki yüksek güçlü iletimlerden etkilenmemesi için de 100 nF yerine 10 nF’lik (103) mercimek kondansatör ile filtreleme yaptım. Not: Bu tarz projelerde genelde 2N3904 kullanılıyor ancak ben kazancı daha yüksek olduğundan 2N2222 tercih ediyorum.
Blue Pill’i yeterince övdük, biraz da gömelim. Piyasada orijinalini bulmak neredeyse imkansız; mecburen yan sanayi kartlar kullanıyoruz ki fiyat/performans dengesini aslında bu klon yapısına borçluyuz. Bu kartla çalışmanın ana zorluğu, Arduino’daki tak-çalıştır konforundan farklı olarak, üzerinde yerleşik bir debugger/programlayıcı barındırmaması. Kod yüklemek için ya UART üzerinden o meşhur ‘boot’ jumperlarını lego gibi değiştirip duracaksınız ya da harici bir ST-Link kullanacaksınız. İki yolu da denedim; ST-Link çok daha hızlı ve kararlı olsa da burada bir başka duvara tosladım: Kart üzerindeki işlemci orijinal olmadığı için CubeIDE üzerinden ‘native debug’ yapılamadı. Haliyle programı .hex dosyası olarak paketleyip STM32CubeProgrammer ile manuel olarak yüklemek zorunda kaldım. Ama olsun, günün sonunda o beacon havaya çıktı ya, gerisi teferruat.
Uzay montaj ilk prototip aşağıdaki görseldeki gibi ortaya çıktı. Dökümantasyonu henüz tamamlayamadım ancak projenin detaylarını da değerli okuyucularımla paylaşmak için sabırsızlandığımdan bu yazıyı kaleme alıyorum. Manual, tips and tricks, program dosyalarını GitHub sayfama mümkün olan en kısa sürede yükleyerek bu postu editleyeceğim.


Her teorinin pratikle çatıştığı, pratiğin galip geldiği yarınlarda görüşmek üzere.
TA1TEC, 73.