3つのLEDを点滅させる(2)
MicroPythonのPinクラスを使う
前回に引き続きLEDを点灯させます。今回は3つのLEDを順に点灯させたいと思います。
Pinクラスは前回も当たり前のように使用していましたが、今回は少し深掘りしたいと思います。まずは、以下のプログラムを見てください。
import machine import time pin13 = machine.Pin(13, machine.Pin.OUT) pin27 = machine.Pin(27, machine.Pin.OUT) pin33 = machine.Pin(33, machine.Pin.OUT) while True: pin13.on() time.sleep_ms(500) pin13.off() pin27.on() time.sleep_ms(500) pin27.off() pin33.on() time.sleep_ms(500) pin33.off()
非常に幼稚なプログラムです。まず、プログラム自身には大きな影響はないのですが、少し見やすくするためにimport
を少し変更します。先程のプログラムではモジュールのインポートを
import machine
からfrom machine import Pin
に書き換えます。このようにするとモジュールの中のクラスをインポートすることができます。これで毎回Pin
の前にmachine
を書かなくても良くなります。プログラムも少し見やすくなります。
pin13 = Pin(13, Pin.OUT) pin27 = Pin(27, Pin.OUT) pin33 = Pin(33, Pin.OUT)
こんな感じです。 ですが、根本的には解決していませんね。
Pinクラス
Pinクラスですが、使い方はPin(<GPIOのピン番号>, Pin.OUT)
のようにGPIOのピン番号を指定して初期化を行いオブジェクトで値を操作します。
つまり、こんな感じです。
pin13 = Pin(13, Pin.OUT)
pin13.on() または pin13.off()
でも、これではGPIOのピンの一本一本にオブジェクトを作りアクセスするしか無いのかと思いました。AVRなどのマイコンをC言語でポートアクセスする場合にはレジスタにアクセスすることで複数本のピンを制御できたのになぁ〜
それは昔の話、現代はオブジェクト指向!由緒正しくPython流のプログラミングをしましょう。
では、どうやって複数のピンを効率よく操作するかを考えているとこれしか無いかなーと思っています。オブジェクトの配列ですね。
これなら添字で個別にアクセスしたり、for文で一塊に制御できるのでは無いかと思います。
from machine import Pin import time pin_no = [13, 27, 33] led = {} led[0] = Pin(pin_no[0], Pin.OUT) led[1] = Pin(pin_no[1], Pin.OUT) led[2] = Pin(pin_no[2], Pin.OUT) while True: for i in [0, 1, 2]: led[i].on() time.sleep(1) led[i].off() time.sleep(1)
かなり幼稚で横着なプログラムですが、オブジェクト配列を思いつくまではこんなプログラムを書いていました。
from machine import Pin import time pin_no = [13, 27, 33] while True: for i in pin_no: Pin(i, Pin.OUT).on() time.sleep(1) Pin(i, Pin.OUT).off() time.sleep(1)
お恥ずかしいプログラムを今回はお見せしましたが、次回はLEDの点滅を順番に点滅させるだけでなく、色々な点滅パターンを考えたいと思います。また繰り返しの構文も解説します。