CircuitPython 10行プログラミング Step5 (2) Raspberry Pi Picoのdigitalio
ディジタル入出力digitalioモジュールを調べます。
●出力
前回、動作確認に使ったLチカのプログラムです。
import digitalio
from board import *
import time
port = GP25
led = digitalio.DigitalInOut(port)
led.direction = digitalio.Direction.OUTPUT
while True:
led.value = True
time.sleep(0.5)
led.value = False
time.sleep(3.14)
GPIOポートの指定はboardモジュールです。オーソドックスに、
import board |
とimportを記述したときは、
port = board.GP25 |
のように本文では記述します。少し煩わしいですね。
検索すると、importで*を使うのはよろしくないというのを見かけましたが、ここでは、簡潔にして間違いを起こすことはないと思われます。
●いずれのポートも使えるのか
GPIO端子のGP0からGP28まで、次のプログラムを動かして、オシロスコープで出力が出ているかを確認します。
import digitalio
from board import *
import time
port = GP0
led = digitalio.DigitalInOut(port)
led.direction = digitalio.Direction.OUTPUT
while True:
led.value = True
time.sleep(0.001)
led.value = False
time.sleep(0.001)
プログラムでは1msごとにON/OFFを繰り返します。波形を見ます(黄色)。
周期は約512Hzで、ほぼ1msのON/OFFになっているようです。
端子がピンに出ていない下記以外は、全部正しく出力が出ていました。
GPIO29 入力 ADCモード(ADC3)ではVSYS/3を測定 GPIO25 出力 LED GPIO24 入力 VBUSセンス GPIO23 出力 SMPS Power Saveピン |
●入力
GPIOの初期値はLowです。
上記の設定と同様に、GP28を入力、プルアップありにします。「プルアップあり」は、内部で50kΩ(値は確認できていない。I2Cの解説では、弱い値なので、たくさんのデバイスをつなぐときは、外部に適切な値のプルアップ抵抗をつけるようにとある)ぐらいの抵抗を電源につないでプルアップされます。したがって、GP28端子にに何もつなげないと'1'=Trueです。
import digitalio
from board import *
import time
port = GP28
SW = digitalio.DigitalInOut(port)
SW.direction = digitalio.Direction.INPUT
SW.pull = digitalio.Pull.UP
while True:
print(SW.value)
time.sleep(0.1)
想定通り、何もしないとTrue、GP28端子をGNDへつなげるとFalseになりました。
別の入力設定方法を試します。同様の結果になりました。
import digitalio
from board import *
import time
port = GP28
SW = digitalio.DigitalInOut(port)
SW.switch_to_input(pull=digitalio.Pull.UP)
while True:
print(SW.value)
time.sleep(0.1)
では、下記の行をコメントアウトし、プルアップを省略するとどうなるでしょうか。
結果は、不安定で、TrueになったりFalseになったりを繰り返します。GP28をGNDへつなげるとFalseです。マイコンのGPIOを入力にすると、ハイ・インピーダンスになり、ノイズなどの影響で、勝手に'1'、'0'になります。
SW.switch_to_input(pull=digitalio.Pull.UP) |