Raspberry Pi Pico'da PIO ile Özel Protokol Yazma

Raspberry Pi Pico'daki PIO (Programmable I/O) modülleri, CPU'dan bağımsız olarak donanım sinyalleri yönetmek için tasarlanmıştır. Kendi protokolünü yazabilirsin; örneğin WS2812 adreslenebilir LED'ler, özel sensör iletişimi ya da zamanlama açısından kritik veri aktarımı için ideal.

PIO, mikrodenetleyicinin asıl işlemcisini meşgul etmeden, özel bir durum makinesi gibi çalışır. Bunu MicroPython'dan kontrol edersin. Örnek olarak WS2812 LED şeridi (NeoPixel) sürücüsü yazalım.

İlk olarak PIO programını (assembly benzeri dil) yazan bir.pio dosyası oluştur:

; ws2812.pio - WS2812 LED kontrolü.program ws2812.side_set 1

bitloop:; Her bit için döngü
out x, 1 side 0 [T1-1]; Çıktıyı x'e al, pin 0
jmp!x skip side 1 [T2-1]; Eğer x=0 ise atla
jmp bitloop side 1 [T3-1]; x=1 ise uzun pulse
skip:
jmp bitloop side 0 [T4-1]; x=0 ise kısa pulse

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası

Şimdi Python kodunda bu PIO programını yükle ve LED'leri kontrol et:

1import array, time
2from machine import Pin
3import rp2
4
5@rp2.asm_pio(sideset_init=rp2.PIO.OUT_LOW, out_shiftdir=rp2.PIO.SHIFT_LEFT, autopull=True, pull_thresh=24)
6def ws2812():
7T1 = 2 # 0 biti için düşük zaman
8T2 = 5 # 0 biti için yüksek zaman
9T3 = 4 # 1 biti için düşük zaman
10T4 = 4 # 1 biti için yüksek zaman
11wrap_target()
12label("bitloop")
13out(x, 1).side(0)[T1-1]
14jmp("skip", x).side(1)[T2-1]
15jmp("bitloop").side(1)[T3-1]
16label("skip")
17jmp("bitloop").side(0)[T4-1]
18wrap()
19
20# PIO'yu başlat
21sm = rp2.StateMachine(0, ws2812, freq=8_000_000, sideset_base=Pin(0))
22sm.active(1)
23
24# Renk veri gönder (RGB)
25LED_COUNT = 10
26BUFFER = array.array("I", [0] * LED_COUNT)
27
28def set_pixel(index, r, g, b):
29BUFFER[index] = (g << 16) + (r << 8) + b
30
31def show():
32for pixel in BUFFER:
33sm.put(pixel, 8)
34time.sleep_ms(1)
35
36# Test: ilk LED kırmızı
37set_pixel(0, 255, 0, 0)
38show()

Beklenen çıktı: Pin 0'a bağlı ilk LED kırmızı yanacaktır.

Sık hata: PIO frekansını donanımla eşleştirmezsen, LED renkleri garip görünür. WS2812 için 8 MHz ideal. Ayrıca pin numarası sideset_base ile eşleşmeli; aksi takdirde sinyal yanlış pine gider. PIO programını pico-sdk'den derlemek gerekebilir; MicroPython sürümün güncel olduğundan emin ol.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz