ラズPicoでLチカ!microPythonプログラミングの第一歩

ラズベリーパイPico(Raspberry Pi Pico)で、はじめて書くであろうプログラムがLチカです。「Lチカ」と聞いて、すぐに理解できる人は初心者ではありません。わたしは、はじめて「Lチカ」と聞いてなんのことやらさっぱりわかりませんでした。

「Lチカ」とは、「LEDをチカチカさせるプログラム」のことです。最初に取り組むべきプログラムとして、コードもみじかく、かんたんなので入門としてよくもちいられます。WEBの記事でもよく見かけます。また、手元のラズPico解説書でも、最初のプログラムとしてLチカをとりあげています。

ここでは、実際に光都ICTクラブで取り組んだLチカのmicroPythonプログラムを紹介します。また、実際にプログラミングしてみて間違えやすいポイントを解説します。

LチカのmicroPythonプログラムはこれだ!

プログラミングの一番の上達方法は、いわゆる「写経」です。テキストやお手本に書かれているコードを、自分の手でパソコンに1字ずつ入力していく方法です。

ちょっとパソコンが使える人からすれば、「コピー&ペースト(コピペ)すればいいじゃん」と言われそうですが、おすすめしません。これは、わたしの実感にもとづきます。

わたしが学生時代、まだ16歳か17歳だったころ、プログラムの授業でコピペする方法を知らなかったわたしは、ごていねいにすべて手打ちで入力していました。同級生のうち何人かは、コピペで課題をあっという間に終わらし、ネットサーフィンをして遊んでいました。わたしは、課題を終わらして遊びたかったので彼らがうらやましくてなりませんでした。

ところが定期試験が終わって状況が一変します。わたしは、プログラムの単位に関してクラスでもトップクラスの成績でした。しかし、コピペしていた同級生は軒並み欠点という悲惨な状況でした。

クソ真面目に取り組んで、結果試験の成績の良かったわたしは気を良くして、その後もプログラムにかかわる道を進みます。ときにはそれが身を助けることもありました。一方、コピペしていた同級生は、途端にプログラムが嫌いになってしまったようでした。みずからプログラムにかかわる道を閉ざしてしまったのです。

わたしも、今となってはコピペをします。ひと目で理解できるコードを手打ちしても、時間の無駄だからです。ただ、やはりある程度理解するまでは、時間がかかっても手打ちします。一行ずつコードを読みます。これが、結果として早いのです。

ですので、これからラズPicoプログラムに取り組むあなたには、ぜひ手打ちしていただきたいと思います。遠回りなようで、実は「近道」です。

さて、下に示すのは「ラズPicoのオンボードLEDを5秒光らせて消すプログラム」です。ぜひ、「写経」してみてください。

from machine import Pin
import time

led = Pin("LED", Pin.OUT)

led.value(1)
time.sleep(5)
led.value(0)

ちなみに、4行目を以下のように書き換えても同様の動きをします。

led = Pin(25, Pin.OUT)

または、次のように書きます。

led = Pin('LED', Pin.OUT)

ラズPicoのオンボードLEDは、GPIO25に接続されているので、sample1の書き方でもOKです。ラズPicoW(Raspberry Pi Pico W)が公開される前は、sample1の書き方しかなかったように記憶しますが、裏取りはしていません。

もう一つ、sample2は、「"(ダブルクォーテーション)」を「’(シングルクォーテーション・アポストロフィ)」に置き換えたものです。Pythonの場合、対(つい)になっていればどちらを使ってもかまいません

さて、動きましたか? 成功したらば、下の動画のようにオンボードLEDが点灯するはずです。

動かない?ここを見直そう~間違いやすいポイント~

あなたが打ち込んだコードが間違っていると、LEDは光りません。よくある間違いを紹介します。

・スペルミスはありませんか?

スペルミスがあると、LEDは光りません。人間なら前後の文意から類推して少々のスペルミスがあっても意味がとれますが、コンピューターは四角四面にかたくなに拒否します。1字のスペルミスであっても、それ以降のプログラム実行を拒否します

これを「融通が利かない」ととらえてしまうと、プログラミング学習が苦痛になります。わたしには、とてもかわいくみえます。「よしよし、素直で初(う)いやつよの~」と言いながら、スペルミスを探します。

実際にあったスペルミスは、以下のようなものです。

led.valeu(1)
time.sleap(5)

ながいことプログラムを書いている人でも、やってしまうのがスペルミスです。はじめてプログラムを学ぶ人なら、スペルミスはあって当たり前です。やってしまったら、修正すればよいのです。

・大文字小文字を正確に入力できていますか?

世の中には、アルファベットの大文字小文字に頓着(とんちゃく)しない人がいます。プログラム言語にも、大文字でも小文字でもどっちでも良い言語が存在します。しかし、ラズPicoを動かすmicroPythonは大文字小文字を厳密に区別します

かんたんに言うと「ラズPico」と「ラズpico」は、microPythonにとって別の存在なのです。

これは、そういうものだと割り切ってしまうしかありません。お手本が大文字なら大文字に、お手本が小文字なら小文字で写経してください。

ちなみに、わたしがついやってしまう間違いはこちらです。

led = pin("LED", pin.Out)

単純なLチカだと、大文字小文字の間違いをしてしまうのは、ここくらいしかありません。しかし、コードが長くなるとたくさん同様の箇所が出てきます。気を抜かずに、写経の際は大文字小文字にご注意ください。

ただ光るだけは終わらない~ここまでできるラズPicoでLチカ~

ただ5秒間光っておしまい、ではおもしろくありません。単なるLチカと思うなかれ、今後のラズPicoプログラミングで必要となる基礎知識を先取りしてしまいましょう。

LEDを3回点滅させる

これはテクニックではありません。ここまでの知識でLEDの点滅を3回繰り返すプログラムを考えてみましょう。下の動画のように、LEDが3回点滅します。

このプログラムは、以下のように書けばよいのです。

from machine import Pin
import time

led = Pin("LED", Pin.OUT)
blink_time = 5

led.value(1)
time.sleep(blink_time)
led.value(0)
time.sleep(blink_time)

led.value(1)
time.sleep(blink_time)
led.value(0)
time.sleep(blink_time)

led.value(1)
time.sleep(blink_time)
led.value(0)

3回同じことを繰り返すので、コードも同じことを3回書けばOKです。ただし、少し改良をしています。さきほどは待ち時間を5秒にするために、直接「5」を入力していたのですが、「blink_time」という変数に置き換えました。くわしくは次の項で説明します。

もう一つ、注意点があります。1回だけLEDを点灯させるときには必要のなかった、10行目と15行目の待ち時間が必要です。

#待ち時間
time.sleep(blink_time)

これがないと、LEDが消えたままの時間がごくわずかで、人間には感知できません。つまり、ずっと点灯したままのように見えてしまいます。

LEDの点滅を早くしたり、遅くしたり

次は、LEDの点灯時間を短くしたり、長くしたりしてみましょう。下の動画は、点灯時間を1秒としています。

動画のように、点灯時間を短くするには、点灯したまま待機する時間を短くします。下のプログラムだと「blink_time」を「5」に設定しているのを「1」に設定すると、1秒間点灯します。

from machine import Pin
import time

led = Pin("LED", Pin.OUT)
blink_time = 5 #5を大きくしたり、小さくしたり

led.value(1)
time.sleep(blink_time)
led.value(0)

先に3回繰り返すプログラムで見せたとおり、「blink_time」は変数としています。1回だけしかもちいられない場合はありがたみをあまり感じられないかもしれません。複数箇所に「5」と設定してあると、点灯時間を変えようとしたら、複数箇所すべてを変更しないといけません。

また、「5」という数字だけを見ても、「5秒」なのか「5回」なのか「5個」なのか、はっきりしません。しかし、「blink_time」とあれば、「時間」であることが予測できます。つまり、あとからプログラムを読み直したときに、解析しやすい、わかりやすいプログラムになります

LEDを20回点滅させる

さきほどは3回繰り返した点滅を、今度は下の動画のように20回繰り返してみましょう。動画は0.5秒間隔で点滅させています。

3回くらいなら、1回点滅させるコードをコピペしてもそれほど苦にはなりません。間違えることも、まずないでしょう。

しかし、20回ともなると、なかなか大変です。コピペの回数を数え間違えることもあるでしょう。20回くらいなら力技でなんとかなっても、100回や10,000回のコピペをするのは嫌気がさすのではないでしょうか? また、「10,000回を5,924回に変更してよ」と指示されたらどうしますか? わたしなら放棄します。

繰り返しに力を発揮するのがfor文です。20回の繰り返しは、下のように書きます。

from machine import Pin
import time

led = Pin('LED', Pin.OUT)
blink_time = 0.5

for _ in range(20):
    led.value(1)
    time.sleep(blink_time)
    led.value(0)
    time.sleep(blink_time)

for文は、例えると「かけ算」の考え方です。「2×13」を「2+2+2+2+2+2+2+2+2+2+2+2+2」と書くのは、大変だし間違いやすくなります。

for文の使い方で注意すべきは、繰り返す内容を書いた部分を「tab1回」または「半角スペース4回」でインデント(字下げ)することです。

#for文の書式
for _ in range([繰り返す回数]):
    [繰り返す内容]

このインデントを強制する文法が、microPython(Python)を読みやすいプログラム言語としています。C言語などは、インデントや改行が文法にないため、わざと読みにくく書くこともできます。書く人によってクセもでます。Pythonは、クセがでにくく、誰が書いても一定程度読みやすいプログラムになります。

もう一つ、for文で注意点があります。forの行の最後の「:(コロン)」を忘れがちなので注意してください。小さいので見逃しがちです。私もよく打ち忘れます。もちろん、エラーで止まります。

エンドレスに点滅するLED

永久に繰り返すことになんの意味があるのか? と思われるかもしれません。「永久に」というのを、「ラズpicoのプログラムが動いている限り」と読み替えると少しはイメージが湧くかもしれません。

実はこれは、マイコンプログラミングでよくやる定石なので、覚えてしまいましょう。有限の繰り返しをfor文で書いたところを、whileを使って以下のように書きます。

from machine import Pin
import time

led = Pin('LED', Pin.OUT)
blink_time = 5

while True:
    led.value(1)
    time.sleep(blink_time)
    led.value(0)
    time.sleep(blink_time)

オンボードのLEDを単体でエンドレス点滅させておくことに、あまり意味はありません。しかし、ほかのプログラムを実行しながら並行してLEDをエンドレス点滅させておいたらどうでしょう? なにかのエラーでプログラムが停止したら、LEDの点滅も停止します。LEDが点滅しなくなったことにより、人間はプログラムが止まってしまったことを知れるのです。

また、ラズpicoなどマイコンは、「外部のセンサーからの情報が入るまで待機」することが多々あります。例えば、人感センサーライトを思い浮かべてください。人感センサーは、人が来るまで待機していて、人が来たらライトを点灯させます。人感センサーの待機をどのようにプログラムすればよいのでしょうか?

そう、while文を使うのです。

コードを短く

最後は、エンドレス点滅のプログラムをさらに短くしてみましょう。

プログラムは、同じことを繰り返し書くことなく、短いほうが優れています。これは、美的感覚として刷り込んでおくと、上達が早くなります。

わたしが最近まで多用していたのが「blink_led6.py」です。「toggle()」を知らなかったので。

from machine import Pin
import time

led = Pin('LED', Pin.OUT)

while True:
    led.value(not led.value())
    time.sleep(1)

公式の教科書である「Raspberry Pi Pico Python SDK」には、下の「blink_led7.py」が載っています。バックグラウンドでLED点滅させ続けられるプログラムです。

from machine import Pin, Timer

led = Pin('LED', Pin.OUT)
tim = Timer()

def tick(timer):
    global led
    led.toggle()

tim.init(freq=1, mode=Timer.PERIODIC, callback=tick)

どちらも、単体で使っても、ありがたみを感じにくいプログラムです。さらに大きなプログラムを書くときに、組み合わせて使うとありがたみがよく分かるでしょう。

まとめ

Lチカは、「マイコンの”Hello, World!!”だ」と誰かが書いたのを読んだことがあります。プログラム言語を覚えて、はじめに取り組むのがディスプレイに「Hello, World!!」と表示させるプログラムを書くことです。もちろんわたしも学生時代に、「Hello, World!!」しました。

ラズPicoのようなマイコンは、画面に文字を表示させることができないものもあるので、「Lチカ」をはじめに取り組む「作法」としているのでしょう。

それだけ手っ取り早く、かんたんながら、プログラムのバリエーションが豊富です。ここで取り上げたバリエーションだけでなく、「ホタルのように、じわっと明るくなったり暗くなったりするLチカ」「ウルトラマンのように、時間が経過すると点滅が早くなるLチカ」「モールスを発信するLチカ」など、色々できそうです。

入門としては、複雑になりすぎるので、また別に機会を設けて解説します。では、今回はこの辺で!