ロータリエンコーダのドライバをPIOで作ってみようと思い、まずは、2bitバスを入力できるように設定してみる。
IN命令により2bit分をPin6,Pin7から入力してISRに格納、PUSH命令でISRからRX FIFOにPUSHする。while文でgetメソッドでFIFOから読み取る。
PUSH IN 2bitバス [RX FIFO]<---[ISR]<-------(Pin6, Pin7) <-------/---- [ロータリエンコーダ]
以下がテストプログラム。
# # PIO IN test # from machine import Pin from rp2 import PIO, StateMachine, asm_pio PIO_IN_PIN0 = Pin(6, Pin.IN, Pin.PULL_UP) PIO_IN_PIN1 = Pin(7, Pin.IN, Pin.PULL_UP) @asm_pio(in_shiftdir=PIO.SHIFT_LEFT) def ingo(): in_(pins, 2) push() sm = StateMachine(0, ingo, freq = 2000, in_base=PIO_IN_PIN0) sm.active(1) while True: print(hex(sm.get()),end="")
実行結果は以下。GP6,GP7はPULL UPしているのでIOに何も接続していない時はHとなり、0x3が続く。ジャンパでGNDに接続するとLになり、0x2,0x1,0x0等に変化する。
0x30x30x30x30x30x30x30x30x30x30x30x30x30x30x30x30x30x30x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x20x00x00x0