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 · TESTAdSense 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, time2from machine import Pin3import rp245@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 zaman8T2 = 5 # 0 biti için yüksek zaman9T3 = 4 # 1 biti için düşük zaman10T4 = 4 # 1 biti için yüksek zaman11wrap_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()1920# PIO'yu başlat21sm = rp2.StateMachine(0, ws2812, freq=8_000_000, sideset_base=Pin(0))22sm.active(1)2324# Renk veri gönder (RGB)25LED_COUNT = 1026BUFFER = array.array("I", [0] * LED_COUNT)2728def set_pixel(index, r, g, b):29BUFFER[index] = (g << 16) + (r << 8) + b3031def show():32for pixel in BUFFER:33sm.put(pixel, 8)34time.sleep_ms(1)3536# 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.
0 yorum