相生コンピュータークラブ第5期(2025年10月)~Raspberry Pi PicoにSSD1306を接続してさまざまな表示しよう~
Raspberry Pi Pico(らずべりーぱいぴこ)を使ったマイコンプログラミングは、小さなディスプレイ(SSD1306)を接続して、様々な情報を表示してみます。9月からの続きで、今までやったことを組み合わせながらできることを増やしていきます。
Contents
まずはタイピング練習とアルゴロジック
タイピング練習とアルゴロジックは、続けます。プログラムをやる限りは、キー入力からは逃げられません。
実は、生成AIを使って良い回答を得ようとしたら、正確で迅速なタイピングができることが必須です。AI時代からだと言って、タッチタイピングから逃げられるわけではないのです。
アルゴロジックは、ロジックを考える良い訓練になります。直感的に使えるのが素晴らしい。小学校低学年でもかんたんに取り組めるので、ぜひ使ってみてください。
アルゴロジック https://algo.jeita.or.jp
9月から矢印キー練習用に新しいゲームを導入しました。
単純な迷路ゲームです。このゲームを、もっとゲームらしく改造したいと思っています。私がやってもいいけれど、メンバーにやってほしいなあ。
今回はまず写経から。~温度と時刻を表示するプログラム~
温度を取得するプログラムは以前作りました。でもそのときは、パソコンの画面に表示しただけでした。せっかくディスプレイ表示を学んでいるので、SSD1306に表示します。
ついでに、現在時刻も表示してみます。
from machine import Pin, I2C, ADC
import ssd1306
import time
# I2C 初期化 (SDA=Pin16, SCL=Pin17)
i2c = I2C(0, scl=Pin(17), sda=Pin(16), freq=400000)
# SSD1306 初期化 (128x64 の例)
oled = ssd1306.SSD1306_I2C(width=128, height=64, i2c=i2c)
# 内蔵温度センサー (ADC4)
sensor_temp = ADC(4)
conversion_factor = 3.3 / 65535 # ADC 16bit値を電圧へ変換する係数
def read_temperature():
reading = sensor_temp.read_u16() * conversion_factor
# データシートに基づく計算式
temperature = 27 - (reading - 0.706)/0.001721
return temperature
while True:
# 温度取得
temp_c = read_temperature()
# 現在時刻取得
t = time.localtime()
current_time = "{:02d}:{:02d}".format(t[3], t[4])
# OLED表示更新
oled.fill(0) # 画面クリア
oled.text("Temp: {:.2f} C".format(temp_c), 0, 0)
oled.text("Time: " + current_time, 0, 16)
oled.show()
time.sleep(1)
あまり新しい要素はでてきていません。ほとんど今までの内容の範囲です。一部現在時刻取得が新しい要素です。
続いてかんたんな反射神経ゲームを写経
今月2つ目は、SSD1306とLEDを組み合わせて反射神経ゲームを作ります。まずは写経。コードはこちら。
from machine import Pin, I2C
import ssd1306
import time
import random
# I2C初期化
i2c = I2C(0, scl=Pin(17), sda=Pin(16), freq=400000)
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
# LEDとボタンの設定
led = Pin(14, Pin.OUT)
button = Pin(15, Pin.IN, Pin.PULL_DOWN)
while True:
oled.fill(0)
oled.text("Reaction Timer", 10, 10)
oled.text("Wait for 'GO!'", 10, 30)
oled.show()
time.sleep(random.uniform(1, 4)) # ランダム待ち時間
oled.fill(0)
oled.text("GO!", 50, 20)
oled.show()
led.value(1) # GO!時にLED点灯
start_time = time.ticks_ms()
while not button.value():
pass
reaction = time.ticks_diff(time.ticks_ms(), start_time)
led.value(0)
oled.fill(0)
oled.text("Time:", 10, 20)
oled.text(str(reaction) + " ms", 10, 40)
oled.show()
time.sleep(2
こちらも今まで取り組んできたことを組み合わせただけです。
複雑な動きをするプログラムでも、基本的な動きをするコードを組み合わせてできています。基本的なコードを書いているうちに、複雑なコードが書けるようになります。
英語のつづりが難しいよね
小学生のプログラミングでしんどいのは、英語のつづりがよくわからないところです。
ある程度英語学習が進んでいると、なんとなくでもスペルを予想できるので間違いが減ります。要は、写経して一発で動くということです。
しかし、英語のスペルがわからず記号として入力している段階では、間違いが多く、一発で動くことはまずありません。プログラムをやっていて、これがしんどいのです。
これを、乗り越えるメンバーは乗り越えます。なかなか乗り越えられないメンバーをどうサポートするか、現在悩んでおります。
できたら自分で改造
さて、写経が終わったら自分たちで改造します。生成AIを使っていろいろ試しているところ。
バイブコーディングで時計らしく、またはもっとゲームらしく改造します。想像力を働かせて、それを言葉にしてコードを作っていきます。
ハンダごてを変えると腕が上がったと錯覚する
Raspberrypi Pico学習キットのはんだ付けが終わっていないので、こちらも同時並行で進めていきます。
9月まで、安いハンダごて(1200円くらい)でやっていたのですが、今回から高いハンダごて(5000円くらい)に変えて挑戦します。4倍以上の価格差は次の通り。
- 温度を一定に保つ機能がついている
- セラミックヒーター
- 小手先の変更がかんたん
この中で一番重要なのは、温度を一定に保つ機能です。熱容量の大きいパーツでも、安定して加熱できます。自分の腕が上がったように錯覚するほど、はんだ付けがきれいに速くできるようになります。
電子工作は、興味を持つメンバーとそうでないメンバーが半々くらいです。なかには電子工作のほうに興味が出てきた! というメンバーもいます。
プログラムより、形があるからわかりやすさがあるかもしれません。プログラムと組み合わせると、めちゃくちゃ楽しいですよ!
道具の使い方も覚えていきましょう
さて、デバイスのはんだ付けが終わったら、不要な足をニッパーで切ります。普段ニッパーを使うことはないののかな、作業しにくそうにしているのでアドバイス。
- ニッパーの向きで切りやすい方を使うこと
- 切りやすい方向に材料を回すこと
その昔、親父にどつかれながら覚えたことや、社会人になって先輩に小突かれながら教わったことを伝えております。
こんなのは、実際に触る機会がないとやり方なんてわからないですからね。動画でもオンラインでもやり方を知ることはできますが、教わることができるのは対面だけです。
さて次回からは
4ヶ月にわたって取り組んできたRaspberryPiPicoを使った電子工作プログラミングは、10月で一旦終了します。はんだ付けがまだのメンバーが残っているのは、次回以降もきちんとフォローしますが、本編はGUIプログラミングに進みます。
GUIとは、視覚的に動くプログラムのことです。多分、現代を生きる人ならこちらのほうが馴染みがあるはずです。これがプログラミングできると、プログラムが一気に身近に感じられます。
11月からは、サイコロプログラムを作ります。請御期待。