4. LED の点灯と Python の基本¶
pyboard で行う最も簡単なことは、ボードに取り付けられた LED を点灯することです。ボードを接続し、チュートリアル1で説明したようにログインします。まず、インタープリタから LED を点灯/消灯させてみましょう。次のように入力してみてください:
>>> myled = pyb.LED(1)
>>> myled.on()
>>> myled.off()
これらのコマンドは LED を点灯し、消灯します。
これは実にうまくいっていますが、このプロセスを自動化してみましょう。好みのテキストエディタで pyboard の main.py ファイルを開きます。次の行をファイルに書き込むか、貼り付けます。あなたが Python を初めて使っているなら、インデントが正しいことを確認してください。これが大事なのです!
led = pyb.LED(2)
while True:
led.toggle()
pyb.delay(1000)
保存すると、pyboard の赤いライトが約1秒間点灯するはずです。スクリプトを実行するには、ソフトリセット(CTRL-D)を実行します。その後、pyboard が再起動し、緑のランプが連続的に点滅していることがわかります。成功です。悪のロボット軍団を作り上げる最初ステップが成功しました! 鬱陶しい光の点滅に飽きたときには、ターミナルで CTRL-C を押して実行を停止してください。
では、このコードは何をしていますか? まず、いくつか用語の説明が必要です。Python はオブジェクト指向言語であり、Python のほとんどすべてのものが クラス であり、クラスのインスタンスを作成すると オブジェクト が得られます。クラスには メソッド が関連付けられています。メソッド(メンバ関数とも呼ばれる)は、オブジェクトの操作や制御に使われます。
コードの最初の行は LED オブジェクトを作成し、それに led という名前をつけています。オブジェクトを作成するときは、ボード上の4つの LED に対応する1〜4の間でなければならない単一のパラメータが必要です。pyb.LED クラスには on(), off(), toggle() の3つの重要なメンバー関数があります。他に使っている関数とsては pyb.delay() があります。これはミリ秒単位で指定された時間だけ待機します。LED オブジェクトを作成すると、ステートメント while True: は、一秒ごとに LED の点灯と消灯を行う無限ループを作成します。
練習問題: LED の点灯と消灯の間の時間を変更したり、別の LED を点灯したりしてみてください。
練習問題: pyboard に直接繋いで、pyb.LED オブジェクトを作成して、on() メソッドを使って LED を点灯させてください。
4.1. pybord でディスコ¶
これまでは1つのLEDのみを使用していましたが、pyboard には4つのLEDがあります。各 LED のオブジェクトを作成して、それぞれの LED を制御できるようにしましょう。ここではリストというものを使ってみます。次のコードで LED のリストが作成できます。
leds = [pyb.LED(i) for i in range(1,5)]
1,2,3,4 以外の番号で pyb.LED() を呼び出すと、エラーメッセージが表示されます。次に、各 LED を循環させてオンとオフを切り替える無限ループを設定します。
n = 0
while True:
n = (n + 1) % 4
leds[n].toggle()
pyb.delay(50)
ここで n は現在の LED が何であるかを持ち、ループが実行されるたびに次の n に循環します(% 記号は n の値が 0 と 3 の間なるようにする剰余演算子です)。次に n 番目の LED にアクセスしてそれを切り替えます。これを実行すると、各 LED が点灯してから、すべてのLEDが順番に消灯するのを確認できるでしょう。
もう見つけたかもしれませんが、このスクリプトの問題の1つは、実行停止して、再度実行すると LED が前回実行したままになっているので、慎重に振り付けたはずのディスコが台無しになってしますことです。スクリプトの初期化、および try/finally ブロックを使って、すべての LED を消すようにすることで修正できます。CTRL-C を押すと、MicroPython は VCPInterrupt 例外を生成します。例外は通常何かが間違っていることを意味し、try: コマンドを使って例外を「捕まえる」ことができます。この場合、スクリプトを中断するのはユーザだけなので、エラーをキャッチする必要はなく、終了時に MicroPython に何をすべきかを伝えるだけです。finally ブロックはこれを行い、すべての LED がオフなるようにします。出来上がったコードは次のとおりです。
leds = [pyb.LED(i) for i in range(1,5)]
for l in leds:
l.off()
n = 0
try:
while True:
n = (n + 1) % 4
leds[n].toggle()
pyb.delay(50)
finally:
for l in leds:
l.off()
4.2. 特別な LED¶
黄色と青の LED は特別です。それらは点灯/消灯するだけでなく、intensity() メソッドで輝度を調整することもできます。このメソッドは、どれくらい明るいかを決める 0〜255 の数値をとります。次のスクリプトは、青色のLEDを徐々に明るくし、消灯するといったことを繰り返します。
led = pyb.LED(4)
intensity = 0
while True:
intensity = (intensity + 1) % 255
led.intensity(intensity)
pyb.delay(20)
LED 1 と 2 で intensity() を呼び出すことはできますが、点灯/消灯しかできません。0 消灯であり、1〜255 の他の数字は点灯になります。