相生コンピュータークラブ第5期(2025年9月)~Raspberry Pi PicoにSSD1306を接続して表示しよう~

Raspberry Pi Pico(らずべりーぱいぴこ)を使ったマイコンプログラミングは、今回から次のステップへ進みます。小さなディスプレイ(SSD1306)を接続して、様々な情報を表示してみます。

例えば下の写真は、スタッフが作ったテトリス風ゲームです。写真の左から右方向にブロックが落ちています。

このゲームの面白いところは、ブロックの操作を十字キーでではなく、加速度センサーで行うところです。左右下に傾けるとブロックが左右下に動き、上に傾けると回転します。

このように、様々なセンサーと組み合わせて面白い作品が作れます。今期は、まず第一歩です。

まずはタイピング練習とアルゴロジック

タイピング練習とアルゴロジックは、続けます。プログラムをやる限りは、キー入力からは逃げられません。

また、アルゴロジックは、ロジックを考える良い訓練になります。

9月から矢印キー練習用に新しいゲームを導入しました。

矢印キー練習用アプリ(迷路)

迷路ゲームです。矢印キーの練習用にどうぞ。 時間: 0.00 秒 歩数: 0 矢印:移動 S:解答表示 H:ヒント R/M:新しい迷路 Q/Esc:終了 クリア! R/M: 新しい迷路で再挑戦 | Q/E…

単純な迷路ゲームです。熱心に取り組んでいる様子。

画面タッチを見かけることはほぼなくなったものの、矢印キーを使えば良いところをマウスに手が行くのをちょくちょく見かけるので。矢印キーにもっと親しんでもらいたいとの強い思いから開発しました。

わたしが学生の時を振り返ってみると、矢印キーで操作するシューティングゲームで遊んでいました。そんな過去を思い出しながら、楽しみながら上達できるツールを作っています。

まずは回路を作る

まずは電子回路を組み立てます。電子回路が間違っていると、プログラムがいくら正しくても動きません

回路組み立ては、AIではそう簡単に置き換えられないところです。そのうち、回路図から組み立てられるようになってほしいなあと思いつつ、今は実体配線図で。

ところで、小学生のメンバーにわたしが作った資料の回路図間違いを指摘されました。すばらしい! 大人でも先輩でも間違いは絶対にあるので、恐れずに指摘してほしいと思います。

そして、回路の説明もします。小学生に理解してもらえるように、なるべくやさしく話したつもりです。なお、中学校レベルの理科・数学の知識があるとより深く知ることができます。

できたらMicroPythonでプログラミング

みんな真面目にタイピング練習をしているので、写経プログラミングはあっという間に終わってしまいます

写し終えて画面に表示されたら、ツールを使いながら自分なりに色々試していきます。

花火をSSD1306に表示するプログラムを作る

9月2回目のクラブでは、花火が画面に表示されるプログラムを作ります。まずは写経です。前回との差分を入力していきます。

まずはごくシンプルな花火を画面に表示します。画面中央部から、放射状に線が広がるアニメーションが繰り返されます。

from machine import Pin, I2C
import ssd1306
import time
import urandom
import math

# I2C初期化
i2c = I2C(0, scl=Pin(17), sda=Pin(16), freq=400000)

# SSD1306 初期化 (128x64 の例)
oled = ssd1306.SSD1306_I2C(width=128, height=64, i2c=i2c)

# 画面の中心座標
cx = 128 // 2
cy = 64 // 2

while True:
    # 花火の角度をランダムに決める(8~16方向)
    num_lines = urandom.getrandbits(3) + 8
    angles = [i * (2*math.pi/num_lines) for i in range(num_lines)]

    # 外周に向けて伸びるアニメーション
    for length in range(5, 35, 3):  # 5~35まで徐々に伸ばす
        oled.fill(0)
        for ang in angles:
            x = int(cx + length * math.cos(ang))
            y = int(cy + length * math.sin(ang))
            oled.line(cx, cy, x, y, 1)
        oled.show()
        time.sleep(0.05)

    # 花火が消えるまでの余韻
    time.sleep(0.2)
    oled.fill(0)
    oled.show()
    time.sleep(0.3)

さあ、スタートはここで、もっと花火らしくしましょう。実際の花火の動きを思い浮かべながら、どうプログラムしたらよいか考えます。言い換えると、「仕様を言語化」します。

仕様を言語化できたら8割完成したようなものです。あとは生成AIに仕様を伝えると、コードが出てきます。

ちなみに、小中高のプログラミング必修化の求めているところの一つは、この「仕様の言語化」です。これから少子高齢化が進む中で、労働力をコンピューターに置き換えるには、仕様の言語化ができる人材が必要不可欠だという判断でしょう。わたしたちのクラブでは、将来に活きる力を伸ばします。

エラーを解決しよう~電子工作特有のエラーもあるよ~

小学生のメンバーのエラーの多くは、スペルミスです。これは、英単語を知らず記号としてコードを認識しているので、入力ミスに気づきにくいということの結果です。

中学生で英語の学習が進んでくると、これは自然と解消されます。しんどいけど続けるしかありません。

一方で、エラーコードの読み方は、みんな慣れてきたところです。エラーの行を自ら追って間違いに気づくことが出来ます。

ところが、電子回路の間違いも画面上は同じようなエラーコードが出ます。もちろん、コード全体をいくら見直しても間違いは見つかりません。一緒に確認すると、配線を間違っていたという事例がありました。

そのメンバーは、やっと動いた!と全身で喜びを表現してくれました。プログラムだけでなく、回路の正否も結果に関わってくるのが電子工作の面白さであり、難しさです。

学習キットのはんだ付けを進めよう

まだまだ学習キットのはんだ付けが残っているので、同時並行で進めます。電子回路を作ってはんだ付けするのは、モノを作りたいなら必須です。小中学生の今のうちに慣れ親しんでおくと、10代後半で本格的に始めたときのダッシュ力が違います。

それにしても、はんだ付けがうまい!

そして、プログラムも面白いけど、はんだ付けで回路を作るのも面白い!というメンバーもいます。この調子で腕を上げてほしいと思います。

パーツによってはんだがのらない

ラズpicoのはんだ付けが終わって、次は各種デバイスのはんだ付けが待っています。

が、はんだが乗りません。どうもデバイスが温まりにくいので、ハンダごての先の温度が下がってしまい、はんだがはんだが融けないようです。鉛フリーのはんだは融点が高いので、デバイスによってはこんな事が起こります。

ならば、次回はちょっと高機能なハンダゴテを使ってもらおうと思います。

実は、ハンダごてによってはんだ作業の結果が大きく違ってきます。まるで自分の腕が上がったかのような錯覚を、道具を変えることで感じ取ってもらいたいと思います。