プログラミングの合間に

マイコンのプログラミング奮闘記です。

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()

f:id:sawayaka_e1:20200830141456j:plain

非常に幼稚なプログラムです。まず、プログラム自身には大きな影響はないのですが、少し見やすくするために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の点滅を順番に点滅させるだけでなく、色々な点滅パターンを考えたいと思います。また繰り返しの構文も解説します。