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:
1
2
|
greenLed
=
pyb
.
Pin
(
"PD12"
,
pyb
.
Pin
.
OUT_PP
)
greenLed
.
on
(
)
|
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 |
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:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
import
pyb
#LED(1) -> Kırmızı
#LED(2) -> Yeşil
#LED(3) -> Turuncu
#LED(4) -> Mavi
while
True
:
pyb
.
LED
(
1
)
.
toggle
(
)
pyb
.
LED
(
2
)
.
toggle
(
)
pyb
.
LED
(
3
)
.
toggle
(
)
pyb
.
LED
(
4
)
.
toggle
(
)
pyb
.
delay
(
500
)
|
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:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
import
pyb
greenLed
=
pyb
.
Pin
(
"LED_GREEN"
,
pyb
.
Pin
.
OUT_PP
)
orangeLed
=
pyb
.
Pin
(
"LED_ORANGE"
,
pyb
.
Pin
.
OUT_PP
)
redLed
=
pyb
.
Pin
(
"LED_RED"
,
pyb
.
Pin
.
OUT_PP
)
blueLed
=
pyb
.
Pin
(
"LED_BLUE"
,
pyb
.
Pin
.
OUT_PP
)
print
(
"\nDurdurmak için 'Ctrl + C' ye basınız.\n"
)
zaman
=
200
try
:
while
True
:
greenLed
.
on
(
)
orangeLed
.
off
(
)
redLed
.
off
(
)
blueLed
.
off
(
)
pyb
.
delay
(
zaman
)
greenLed
.
off
(
)
orangeLed
.
on
(
)
redLed
.
off
(
)
blueLed
.
off
(
)
pyb
.
delay
(
zaman
)
greenLed
.
off
(
)
orangeLed
.
off
(
)
redLed
.
on
(
)
blueLed
.
off
(
)
pyb
.
delay
(
zaman
)
greenLed
.
off
(
)
orangeLed
.
off
(
)
redLed
.
off
(
)
blueLed
.
on
(
)
pyb
.
delay
(
zaman
)
except
KeyboardInterrupt
:
greenLed
.
off
(
)
orangeLed
.
off
(
)
redLed
.
off
(
)
blueLed
.
off
(
)
print
(
"\nKlavye kesmesi oluştu,\nprogram sonlandırıldı.\n"
)
|
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
:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
import
pyb
#LED(1) -> Kırmızı
#LED(2) -> Yeşil
#LED(3) -> Turuncu
#LED(4) -> Mavi
print
(
"\nDurdurmak için 'Ctrl + C' ye basınız.\n"
)
leds
=
[
pyb
.
LED
(
i
)
for
i
in
range
(
1
,
5
)
]
for
l
in
leds
:
l
.
off
(
)
n
=
0
zaman
=
100
try
:
while
True
:
n
=
(
n
+
1
)
%
4
leds
[
n
]
.
toggle
(
)
pyb
.
delay
(
zaman
)
except
KeyboardInterrupt
:
print
(
"\nKlavye kesmesi oluştu,\nprogram sonlandırıldı.\n"
)
for
l
in
leds
:
l
.
off
(
)
|
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.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
import
pyb
sw
=
pyb
.
Switch
(
)
led
=
pyb
.
Pin
(
"PD12"
,
pyb
.
Pin
.
OUT_PP
)
print
(
"\nDurdurmak için 'Ctrl + C' ye basınız.\n"
)
try
:
while
True
:
if
sw
.
value
(
)
==
1
:
led
.
on
(
)
else
:
led
.
off
(
)
except
KeyboardInterrupt
:
led
.
off
(
)
print
(
"\nKlavye kesmesi oluştu,\nprogram sonlandırıldı.\n"
)
|
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.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
#
# https://roboticsbackend.com/arduino-turn-led-on-and-off-with-button/
#
import
pyb
sw
=
pyb
.
Switch
(
)
led
=
pyb
.
Pin
(
"PD12"
,
pyb
.
Pin
.
OUT_PP
)
print
(
"\nDurdurmak için 'Ctrl + C' ye basınız.\n"
)
butonSimdikiDurum
=
0
butonSonDurum
=
0
led_durum
=
0
debounceZamani
=
50
#50 miliSaniye
butonSondurumZamani
=
0
try
:
while
True
:
if
pyb
.
millis
(
)
-
butonSondurumZamani
>
debounceZamani
:
butonSimdikiDurum
=
sw
.
value
(
)
if
butonSimdikiDurum
!=
butonSonDurum
:
butonSondurumZamani
=
pyb
.
millis
(
)
butonSonDurum
=
butonSimdikiDurum
if
butonSimdikiDurum
==
0
:
led_durum
=
0
if
led_durum
==
1
else
1
led
.
value
(
led_durum
)
except
KeyboardInterrupt
:
led
.
off
(
)
print
(
"\nKlavye kesmesi oluştu,\nprogram sonlandırıldı.\n"
)
|
Ü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