Lチカ応用編~ラズパイでろうそくを作ろう~

2024年8月2日(金)は、中原先生が遅れる予定だったため、水曜日の教室で中原先生と講師をしている、今田が代わりにメイン講師を担当しました。結局、中原先生最初から最後までいましたが。(笑)

  • 18時00分~18時20分 タイピング練習
  • 18時20分~18時40分 キーボード練習
  • 18時35分~19時50分 ろうそくプログラム
  • 19時50分~20時00分 あとかたづけ

タイピング練習とキーボード練習

タイピングの練習は、「寿司打」、キーボードの練習は「テトリス」です。

テトリス、十字キーを使う癖がつけるのが目的なんですが、頭のトレーニングになっていいですね。水曜日のほうにも取り入れていこうかなと思います。

Lチカを思い出しながら、LEDでろうそくの再現

今回は4段階構成でまずはLチカの復習からはじめて、点滅を早くする方法、明るさをランダムに変える方法、ろうそくらしくする方法といった感じで、少しずつ書いては実行をやってもらいました。

回路はシンプルに抵抗とLED1つずつです。

ロウソク"らしく"光るプログラム

先にプログラムをお見せするとこんな感じです。16行程度でできるので、打ち込むこと自体はさんざんやってきているメンバーにとっては、簡単だったかなと思います。

from machine import Pin,PWM
import utime,random

pwm=PWM(Pin(16))
pwm.freq(100)
x=0.5
while True:        
    if 0.05<=x<0.5:    #ろうそくらしく明るさを変えていく数式
        x=x+2*x*x
    elif 0.5<=x<0.95:
        x=x-2*(1-x)*(1-x)
    else:
        x=random.random()
    pwm.duty_u16(int(65535*x)) #点滅させる数式
    utime.sleep(0.1)
    print(x)

虫食いにしてあえて教えない、ヒント程度にとどめました。メンバーにとっても実際に光ると達成感があったかなと思います。

理論の話~ろうそくらしく?~

実は今回、ろうそくを完全再現していません。本来、ろうそくは 1/f ゆらぎと呼ばれる、人間が落ち着く光り方をします。詳しい説明は省きますが、雨の音や木漏れ日、心拍の間隔など、人間がリラックスするゆらぎです。

これを正確に再現しようとすると長いプログラミングコードになってしまいます。なので、今回採用したのは、「間欠性カオスアルゴリズム」という方法になります。上のプログラムでいう、ろうそくらしく明るさを変えていく数式です。

#明るさを"x"として、一番暗い時を0%、一番明るいときを100%とすると


 #明るさxが5~50%のとき(少し暗いとき)は
 x=x+2*x*x                 #次の明るさは x = x + 2x²

 #明るさxが50~95%のとき(少し明るいとき)は
 x=x-2*(1-x)*(1-x)          #次の明るさは x = x - 2(1-x)²

 #明るさxが0~5%、95~100%の時(明るすぎる時と暗すぎる時)は
 x=random.random()          #ランダム

これを使うことで、そこそこ、ろうそくらしくなります。実際に工学系の研究発表の中の1/fゆらぎの検証実験でも使われているようなので、うまく光ると思います。

↓間欠性アルゴリズムを使用した研究例

https://www.ieice.org/tokyo/gakusei/activity/kenkyuu-happyoukai/happyou-ronbun/14/pdf/36.pdf

最後に

教材の用意、結構大変でした。中原先生は毎週やっているわけですから、改めてすごいんだなと痛感します。メンバーのみんなにはちょっと舐められてる気がしますけどね(笑)

来週からは、担当が中原先生に戻ってモーター制御の予定です。お楽しみに!