STM32F4-Discovery kartı, micropython ve Ledler

Artık minik uygulamalar yapabiliriz. Port giriş ve çıkışları, buton okuma, led animasyonları, vb.

Gömülü sistemlerde; micropython çok fazla konfor sağlıyor. Böylece ilgili mcu alt yapısını öğrenmektense, asıl yapacağımız işe odaklanabiliyoruz. Tabii bu arada micropython modüllerine ve metotlarına hakimiyet kazanıyoruz.

Bugün bir kaç led animasyonu ve buton okuma uygulaması yapalım. pyb modülü asıl olarak F405 üzerine kurulmuş. Ama F407 ve diğer mcular için de yorumlayıcıları bulunmakta.

pyb ve machine modülü ile donanımlara erişebilme imkanına sahibiz. Şimdilik pyb modülü ile çalışmalarımızı yapmaya çalışalım. Zaten bir çok metot çok benzer veya aynı.

Bir portun giriş veya çıkış yapılması ve alt özelliklerinin kullanılması için pyb modülünün Pin metodunu kullanıyoruz. Konsolda help() yazarak basit bir kaç metodun nasıl kullanıldığını görebiliriz. Ya da help(pyb.Pin) yazarak diğer metotları da görmek mümkün.
Yine konsolda:

yazalım. PD12 pinini çıkış yaptık. Bundan sonra 1 veya 0 vererek bu ledi yakıp-söndürebiliriz. Söndürebilmek için de greenLed.off() yazabiliriz. Aynı şekilde diğer pinlere bağlı ledleri de bu şekilde yakmamız mümkün.

Bir metot daha var, pin durumunun değişmesi için: toggle . Ancak bunu Pin metodu ile değil, pyb.LED(x) metodu ile kullanıyoruz. “x” ‘in değerleri alttaki tablodaki gibidir:

1 Kırmızı
2 Yeşil
3 Turuncu
4 Mavi
pyb.LED(x) değerleri ve karşılıkları

Ledleri yakıp söndürebilmek ya da pinlerin lojik durumunu değiştirmek için ilk önce giriş veya çıkış durumunu belirtmemiz gerekli. Alttaki örneği yapabiliriz:

Daha önce yazdığımız bir kod ile ilgili pinin, moduna farklı bir tanımlama yapılmış olabilir. Giriş veya çıkış olarak çalışmayabilir. Böyle bir durumda ilgili pinin durumunu yeniden giriş/çıkış olarak tanımlamamız gerekmektedir. Üstteki kodda eklediğimiz bir metot; pyb.delay(x) . “X” yerine miliSaniye cinsinden bir değer yazıyoruz. Kodumuz o noktada belirttiğimiz değer kadar bekliyor. Kötü kısmı, başka hiç bir yerin kontrolüne bakmıyor. Bu konuyu ilerideki zamanlarda nasıl aşabileceğimizi öğreneceğiz.
(Daha önce dediğim gibi; pyb modülü F405 için yapılmış, pyb.LED(x).intensty(y) metodu F407 de çalışmıyor. Bu metodu da, ilerideki konularımızda kendimiz yazacağız.)

Şimdi ledleri sırayla yakan bir kod yazalım:

Artık python konforunu kullanarak ekranda görülen hata yazılarının yerine kendi mesajlarımızı verelim. Program herhangi bir yerde kesilince port/pin durumları o anki değerlerde kalabilir. Bazen bunun olmasını istemeyiz. Klavye kesintisi veya başka şekilde program sonlanırsa port/pin durumlarını burada değiştirebiliriz. Gecikme için bir değişken kullandım. Bu değeri değiştirerek ledlerin hızı ile oynayabiliriz.
Alttaki kodda micropython belgelerinden :


Son olarak da buton okuma yapalım ve bu günkü çalışmamızı sonlandıralım. Yine pyb modülünün pyb.Switch() metodu; bu kart üzerindeki USER butonunun değerini okur. Bu buton PA0 pinine bağlı.

sw = pyb.Switch() ile buton sınıfına bağlanıyoruz. help(sw) ile baktığımızda iki metod görülmekte: value ve callback . Şu anki konumuz value . Değer okuyup değerlendireceğiz.

Elimizi USER butonunda tuttuğumuz müddetçe yeşil led yanık kalacak, butonu bırakınca led sönecektir.


Bir de butona basınca yanık kalsın ve bir daha basınca sönsün uygulamasını yapalım.
Buton uygulamalarındaki en sevimsiz konu buton arkı olayıdır. Butona yavaşlatılmış bir şekilde bastığımızı hayal edelim. Metal noktaların değme anını düşünelim; bir anda 1(True) veya 0(False) olmaz. Minik de olsa bir ark meydana gelir. Bu anda butonun durumu belirsizdir. Buton tipine göre değişmekle birlikte bu örnekte 50mS bekliyoruz. Belirlediğimiz zaman içinde butona tam basmış oluyoruz.

Üstteki kodu bir Arduino uygulamasından yorumladım. Link kodun üst bölümünde. Butonun 50mS sonraki değerini karşılaştırarak ledin yanmasını veya sönmesini sağlıyor. Bu örnekte; pyb.millis() metodunu ve C deki ternary operatörüne karşılık gelen yapıyı da görmüş olduk. Bu yapı a if condition else b şeklindedir.

Bu yazım da da elimden geldiğince bir şeyler aktarmaya çalıştım. Öğrenmeye devam edeceğiz. Aklınıza takılanlar olursa Hakkımda alanından ulaşabilirsiniz. Bilgim dahilinde cevaplamaya çalışırım.

İyi eğlenceler…

7 segment 12F675 12F683 16F877A ADC Arduino AVR AvrDude blue pill BUTON button Direnç esp esp8266 GLCD itoa led micropython MPLABX pendulum PIC PIC18F452 port PWM PySimpleGUI python pyttsx3 seri port seven segment STM32 STM32F-Discovery STM32F4-DISCO STM32F4-Discovery STM32F407 Thonny Timer0 usb XC8