Bir Satır Arduıno Kodunu Derleyerek Neler Öğrenebilirsin ?


Kit fiyatları, öğrenci arkadaşların bütçelerini bir süredir zorluyor. Nispeten Arduino Uno gibi geliştirme kartları çok daha rahat erişilebilir hale gelmiştir. Kimi kesim tarafından oyuncak ya da hobi olarak görülen bu kart ile ilerde gömülü yazılım alanında çalışmayı düşünen arkadaşların güzel temeller atabileceğini göstermek amacıyla bu yazıyı yazıyorum.

void setup() 
{
  Serial.begin(9600);
  Serial.println(RAMEND, HEX);
}

void loop() 
{
   
}

Yukarıda bulunan kodu Arduino IDE’si aracılığıyla derlediğinizde Uno modeli için şöyle bir çıktı muhtemelen sizi IDE’nin derleme alanında karşılayacaktır.

Sketch uses 1570 bytes (4%) of program storage space. Maximum is 32256 bytes.
Global variables use 188 bytes (9%) of dynamic memory, leaving 1860 bytes for local variables. Maximum is 2048 bytes.

Burada bazı rakamlar görüyoruz, bu kartı çoğu zaman hobi amaçlı kullanan kişiler için kodun derlenmesi ve beklediği gibi çalışması elbette çoğu zaman yeterli olacaktır.

Bu rakamların analizi için avr-size isimli bir araç kullanacağım, bu araç Arduino IDE’sini yüklediğinizde arduino-x.y.z/hardware/tools/avr/bin dizini altında bulunmakta. Yukarda bulunan kodun derlenmesi sonrasında oluşan .elf uzantılı dosyayı bu araca veriyorum.

avr-size.exe -A <file.elf>

.data alanı ilklendirilmesi yapılmış global/statik veri tiplerinin değerlerinin tutulduğu bir alan.
.text programın yürütülebilir makine kodlarını içeren bellek bölümü diyebiliriz.
.bss .data alanının aksine ilklendirilmesi yani bir değer atanması yapılmamış değişkenlerin tutulduğu bir bellek alanı.

Ne kadar flash alanı tükettiğinizi .data ve .text alanlarını toplayarak elde etmeniz mümkün. Yukarıda bulunan çıktıya bakarsanız 1570 byte (1548 + 22) bir alanın kullanıldığını görebilirsiniz. Tüketilen RAM miktarını ise .data ve .bss alanlarını toplayarak elde edebiliriz. Çıktımıza göre 188 (166 + 22) byte bir RAM alanını tüketmekteyiz. RAM volatile bir bellek alanı ve bir donanım için run-time durumundayken işlevsel. Farkettiyseniz tüketilen program alanı ve ram alanını hesaplarken .data bölümü ikisi içinde ortak. Data bölümünde tutulan verilen aynı zaman programın saklama alanında bir yere sahipler ve kodun startup rutininde ilgili değerler bu şekilde RAM bölgesine kopyalanıyorlar. Gelin .data, .text, .bss’i daha iyi anlayalım.

char foo [1000];
void setup() 
{
  Serial.begin(9600);
  Serial.println("foo");
  Serial.print (foo);
}

void loop() 
{
}

Yukarda bulunan kod parçası Arduino Uno kartı için şu çıktıyı veriyor.

Sketch uses 1498 bytes (4%) of program storage space. Maximum is 32256 bytes.
Global variables use 1192 bytes (58%) of dynamic memory, leaving 856 bytes for local variables. Maximum is 2048 bytes.

Eğer foo isimli dizinin elemanları için değer ataması yaparsak;

char foo [1000] = { 1, 2, 3, 4, 5 };
void setup() 
{
  Serial.begin(9600);
  Serial.println("foo");
  Serial.print (foo);
}

void loop() 
{ 
}

1000-byte kadar daha fazla flash alanı tüketildiğini söylüyor.

Sketch uses 2498 bytes (7%) of program storage space. Maximum is 32256 bytes.
Global variables use 1192 bytes (58%) of dynamic memory, leaving 856 bytes for local variables. Maximum is 2048 bytes.

Değer ataması yaptığımızda artık .data belleğine taşımış olduğumuzu görebilirsiniz. Atama gerçekleşmediği durumda .bss belleğinde tutuluyordu.

Bir çok kavramı öğrenmek için Arduino’nun iyi bir araç olduğunu düşünüyorum ben açıkcası, eğer farklı düşünüyorsanız konuşabiliriz. 🙂

Teknik Kırgınlık


Ne zamandır bu konuda bir yazı yazmak istiyordum. Vakit bulamadığımdan değil, kırgın olduğumdan yazmaya fırsatım olmadı açıkcası. Bir süre öncesine kadar daha ve daha deparlı olduğunu olduğumu bildiğim işlerde, daha sakin davranmamın altında yatan hatta sadece yatmakla kalmayıp uyuyan bu hissi tam tarif edemediğim için adına Teknik Kırgınlık dedim. Henüz burnout diyecek kadar beyaz yakalı da hissetmiyorum kendimi. Kabullenemediğim bir gerçek olan; yazılımın nankör oluşu ve mesleğim için aslında kod yazmanın buz dağının görünen yüzü olması bu hissi sanki biraz daha tetikliyor.

Mesleğimin 4.yılını doldurdum, mesleğimi seviyorum. Bu süreci çocukların gelişimine benzetiyorum ve çocuk gelişiminde en kritik dönemin 0-6 yaş arasında olduğunu söylüyor uzmanlar ve beslenme çantamda otlu peynir kokusuydu babam. (bunu yazmadan geçemeyeceğim bir andı özür dilerim, yazıyı baltaladığım için) En kritik dönemi geride bırakacağım bu süre için sadece 2 yıl kalması beni daha huzursuz ediyor sanki. Tuvalet eğitimi tecrübemi alırken daha iyi değerlendirebilirdim diyorum kendime. Korktuğum şeyin yeni şeyler öğrenmek olmadığını, öğrendiğim şeyleri kullanamadan unutmaktan olduğunu farkettiğimden beri bir süredir yeni şeyler öğrenmiyorum. Bazen reddediyorum. Bazen zorunda kalıyorum ve öğreneceğim şeye/lere olan ilişkimi tek gecelik olarak görüyorum ve tutkulu sevişemiyorum onlarla. Ama hâlâ heyecanlıyım ve bu beni ciddi manada ayakta tutuyor. Zaten heyecanlı olmasam kırgın değil küs olurdum diyorum kendime. Kafamda rutin ve konfor alanını kafes dövüşüne çıkarıyorum zaman zaman. Bir taraf nakovt oluyor son zamanlarda. Daha iyi uyuyorum fakat daha iyi uyanamıyorum. Sonra biraz Ayfer Tunç okuyarak olası bir depreme karşı yönünü değiştirdiğim yatağımı topluyorum.

Bilginin güç olduğunu düşünürsek, kendimi güçsüz hissediyorum. Yani 4.yılımda kendimi görmek istediğim noktadan uzakta görüyorum. Hoş 28 yaşında kendimi görmek istediğim noktadan da uzakta görüyorum. Ama ALLAH var, GAM yok bunlara gram üzülmüyorum. Üzüldüğüm ince nokta şurası; 28 yaşında kendimi görmek istediğimi düşündüğüm o yaşlarda neden böyle düşündüm. Mesala 22’mde. Nispeten 25’imde ?. Böyle konularda kendimle konuşmayı ve farkındalık sahibi olduğumu düşününce de epey mutlu oluyorum. Teknik Kırgınlık ifadesini de ilk kendimle konuşurken bulmuştum Moda iskelesinde. Dün gece kendi reçetemi hazırladım ve koştur koştur nöbetçi eczaneye giderek ilaçlarımı aldım. Teknik kırgınlığımı bir nokta azaltmak için yeni hedefler de koymayı ihmal etmedim. Sana söz Teknik Kırgınlığım, yeneceğiz.

Ya yazıyı geri dönüp okuduğumda, çok karamsar durmuş ama hayatımda da en iyi dönemlerden birinde olduğumu söylemeden geçmeyim bari ortalık biraz yumuşasın.

Nıxıe Tüplerin Kullanımı – Nıxıe Pomodoro Saat Yapımı


Bir süredir nixie tüpler ile bir şeyler yapmak istiyordum ve klasik saat fikri bana çok çekici gelmiyordu. Akşamları lambader ışığında okuma yapmak ya da çalışmaktan keyif aldığım için bu süreci biraz daha disiplinli ve sağlıklı hale getirmek istedim. O yüzden pomodoro tekniğini denemeye çalışmaya başladım. Tabi biraz kendimce yorumlayarak. Bu tekniği uygularken daha motive olabilmek adına Nixie Tüpleri kullanarak kendime bir adet Pomodoro Saati yapmaya karar verdim. Bu yazı serisinde bu süreci anlatmak istiyorum.


1. Adım Nixie Tüplerini Bulabilmek

Bu konuda en güvenilir sitelerin başında bence tindie geliyor. Bilmeyenler için tindie maker-market bir alışveriş sitesi. Site üzerinde arama yaparak nixie tüp satın alımı gerçekleştirebilirsiniz. Kargo ücreti satıcının bulunduğu lokasyon, çalıştığı firmaya göre farklılıklar gösterebiliyor. Ürün ülkeye girdiğinde ekstra bir gümrük vergisi de ödemeniz gerekiyor. Bu siteye alternatif olarak Etsy de kullanılabilir, en son çare olarak Aliexpress’i öneriyorum bu tarz ürünlerde açıkcası. Bu adımda benim izlediğim strateji şu şekilde oldu, öncelikle Reddit platformunda Nixie satıcısının olup olmadığını sordum ve paralelde etsy ve tindie üzerinde fiyat araştırması yaptım. Reddit üzerinden görüştüğüm bir arkadaş, etsy’de bulduğum satıcıdan daha uygun fiyata veremeyeceğini ifade etti. Bir umut picproje forumuna yazarak nixie tüp elinde olan var ise satın almak istediğimi belirttim. Şanslıyım ki TR’de elinde 4 adet nixie tüp olan birisiyle tanıştım ve ondan satın aldım. 4 x IN12B Nixie Tüp için kendisine $32 ödedim. Kişi kendi kullanımı için nixie için bir taban kartı yapmıştı ve taban kartının da olması işimi oldukça kolaylaştırdı. Aşağıda bulunan görselde aldığım nixie tüpünü görebilirsiniz.

2.Adım Uygun Güç Kaynağını Bulmak

Nixie tüpler çalışması için yüksek gerilime ihtiyaç duyuyorlar. Bu yüzden çalışma yaparken dikkatli olmanız gerekiyor. İnternette çeşitli açık kaynak devreler mevcut bunlardan ürettirebilir ya da kendi devrenizi de hazırlayabilirsiniz. Nixie tüpleri aldığım kişide uygun besleme kaynağı olduğu için kendisinden onu da satın aldım. Oldukça verimli bir devre ve zamanında https://nixieclock.org sitesi üzerinden satın alınmış. Kendim 12V çıkış veren bir adaptörü giriş gerilimi olarak aldığım modüle verdim ve modülün üzerinde bulunan pot aracılığı ile 170V çıkış gerilimi aldım. Ve Nixie Tüplerimin ilk testlerini gerçekleştirdim. Modülü 13$’a satın aldım.

3.Nixie Tüplerini Sürmek

Aldığım nixie tüpün modelinin 12B olduğunu daha önce söylemiştim. 12A modeline göre tek fark 12B modelinde nokta işareti de bulunmakta. Nixie tüpümde 0-9 ve nokta digit’i ile birlikte toplamda 11 adet çıkış bulunuyor. Her pin için mikrodenetleyicinin bir pinini kullandığımızda çok fazla sayıda pine ihtiyaç olacağı için alternatifleri araştırmaya başladım. İnternette genelde 4141/SN74141 ya da K155ID1 (rus muadili) entegreler ile kullanımına rastladım. Entegreler BCD mantığında çalıştığı için mikrodenetleyicinin 4 pinini işgal edeceklerdi. Entegreler oldukça eski ve üretimlerinin olmadığını öğrendim. O yüzden çalışır bir entegre bulmak çok mümkün değildi ama şansımı Aliexpress üzerinde denedim ve bir satıcıdan 10 adet entegre satın aldım. Forumlardan okuduğum kadarıyla entegrelerin patates çıkacağını biliyordum ve öyle oldu 🙂 Entegreler geldikten sonra hemen bir devre kurdum ve entegreleri test ettim ne yazık ki hepsi patates çıktı ve 14$’m çöp oldu. Sonrasında 74HC595 entegresini kullanmayı düşündüm. 3 giriş kullanarak paralel bir şekilde 8 adet çıkış almak mümkündü. Bir tüp için 11 adet çıkış olduğu için bir tüpün tüm digitlerini sürmek için 2 adet 74HC595’e ihtiyaç olacaktı. Elimde 1 adet 74HC595 vardı ve bir tane nixie tüp üzerinde çalışma yaptım. Tabi giriş çıkışlar da arttığı için ortalık kablo çöplüğüne dönüyor ister istemez. Bir devre hazırlamadan önce internette sürücü olup olmadığını araştırdım ve tindie üzerinde tam da istediğim gibi bir sürücü vardı. Bu sürücüden 2 adet satın aldım, hem smd malzemeler ile dizilmişti hemde fiyatı kendi yapacağımdan uyguna geliyordu. 2 sürücü için 11$ ödedim. Şevkime yenik düştüğüm için ürün gönderiminde UPS seçtim ve kargo ücreti olarak 18$ ödedim, gümrük vergisi içinde yaklaşık 5$ ödedim. Ürün 4 gün içerisinde Polonyadan geldi. Aldığım ürünle hızlıca bir sayıcı yaptım.

Ürün kullanımı oldukça pratik ve kolay. Satıcı çok güzel bir şekilde ürünü paketlemişti.

4.Yazılım

Ben dört adet tüp satın aldım ancak yapacağım saat için iki tanesi yeterli olmakta. Pomodoro tekniğini bir yorumladım ve çalışma süresi için 25, 50, 60, 70, 80, 90 şeklinde dakika cinsinden periyotlar belirledim. Iki tane tüp ile bunları göstermem ve saydırmam mümkün. MCU olarak Arduino Uno kullandım, belki internet tabanlı yapmak adına ESP32’ye de geçebilirim. Periyotu saydırmak için harici bir saat devresi kullanmak istemedim. Daha önce blogumda anlatımı yaptığım kütüphaneyi kullandım. Yazılımsal kısımları github üzerinde inceleyebilirsiniz.

5.Masam için Ürün

Henüz ürün halinde kutulamayı başaramadım. Öncelikte tüm elektronik aksam için delikli pertinaks yerine kullanmak için bir PCB hazırlıyorum.(PCB’yi doğruladıktan sonra github reposuna ekleyeceğim.) Kafadam kutu için fikirler mevcut ancak nasıl yaparım nasıl ederim bilmiyorum deri işçiliğine daha önce hiç girişmedim. Bakalım süreç nasıl olacak 🙂 Tekrardan yazıyı güncelleyeceğim.

Hayır, Çürümeye Değil, Olgunlaşmaya Bıraktım Kendimi


Yeni yüzler görmeyi reddettiğim dönemin bana getirisi olsa gerek hem sigaramın o dumanı evde kalsın istemiyorum hem de camdan dışarı üflemeye cesaretim yok. Gecenin, tutamadığım o karanlığında uyanıp her an kağıdı terkedecek gibi duran harflerle şöyle yazmışım; Mutluluklarımızı paylaşmakta aceleci olduğumuz kadar üzüntülerimizi paylaşmakta bir o kadar erteleyici davranıyoruz. O gün, o yoğun bakım ünitesinin önünde, dünyanın en iyi orkestrasını yönetebilirdim. Nasıl yapardım bilmiyorum ama fırsat verilseydi yönetebilirdim bundan eminim. Halbuki flüt bile çalmayı becerememiştim ilkokulda. Ama eminim, yönetebilirdim. Ben hep küllüğün boş tarafına bakarım biliyor musun arkadaşım ? Oraya bir tane daha öfkemi, kızgınlığımı, yere düştüğümde kalkarken pislenen ellerimden bırakabilmek için. Boş yer kalmadığı zamanlarda ise buraya yazarım. Çok yazmışım buraya…

Her şey ‘L’ harfini andırır oldu bana bir süredir. Sokak başları, duvar köşeleri, masalar. Hatta uyurken bile L şekline girmeye çalışıyorum. Gideceğim bir yere ‘L’ şekline uygun bir şekilde varmayı arzuluyorum. Daha önce ‘F’ harfi için böyle bir şey olmuştu. Az dolu olan bir otobüse binip oturan insanlara göre yerimi değiştirmek suretiyle ‘F’ harfini oluşturmaya çalıştım. Valla ‘L’ harfine okeyim arkadaşım, her şeye uyuyor.

Kalkıp silkelenmek istemiyorum ki ben arkadaşım, Hayır, çürümeye değil, olgunlaşmaya bıraktım kendimi. Neden mi ? Bunun tek bir cevabı yok ama küllüğümde boş yer açmam gerekti bir şekilde.

Arşivden…

Git Clone’un Kardeşi Git Sparse


Büyük codebase içerisinde çalışırken kimi zaman başka bir bölüm bizim bölüme dahi hit etmeyebiliyor. Tüm repoyu çekmenin ise getirdiği bazı maliyetler mevcut. Diskte çok fazla yer kaplaması gibi. Böyle bir durumda sadece ihtiyacımız olan klasörleri çekerek onlar özelinde çalışma yapmak isteyebiliriz. Bunun yöntemlerinden birisi ise git sparse tekniğini kullanmak. Elbette büyük organizasyonda bu yönetimi sizin yapmanız mümkün olmayabilir ama SPARSE tekniğinin ne olduğunu bilmek fayda sağlayabilir.

Bu partial-clone yapısını şu görsel üzerinden inceleyelim.

Geliştirme tarafında sadece win_project altında bulunan yapıya ihtiyacımız olduğunu düşünelim. Repoyu çekeceğimiz klasör içerisine gelerek;

git init
git config core.sparsecheckout true

Şimdi ise Git’e hangi dosyalara ihtiyacımız olduğunu belirtmemiz gerekiyor.

echo win_project >> .git/info/sparse-checkout
git remote add -f origin <REPO_URL>

Belirttiğimiz dosyaları çekelim

git pull origin master

İlerleyen dönemlerde diğer dosyalara da ihtiyacımız olduğunda şu komut ile diğer dosyaları çekebiliriz.

git sparse-checkout disable