Tanuki_Bayashin’s diary

電子工作を趣味としています。最近はラズベリーパイPicoというマイコンを使って楽しんでいます

もりしーさんのXmasツリーを作ってみた

※なにか気になる点がありましたらコメント欄にご記入ください。また、工作や回路を製作する場合には、細かい作業などに対して、細心の注意を払われるようお願いいたします。

目次

1.はじめに

Twitterなどでお世話になっているもりしーさん(@kotaMorishita)が、毎年 Xmasツリーを製作されていて、今年もそれを購入し(今年はクラファンを利用されていました)、ある程度自作しました。
この記事は、それの製作記になります。

去年、Xmas ツリーを製作したときの記事です
 tanuki-bayashin.hatenablog.com

ラズベリーパイPicoのサイトです(Xmasツリーに使用されています)
 www.raspberrypi.com

2.予備知識

 以下にこの記事に出てくる事柄について必要な予備知識のキーワードを載せておきます。ある程度の範囲で解説しました。分かりにくい点などについては検索等でより深く調べて頂くか、コメント欄にご記入ください。

 ラズベリーパイ財団が約2年前に発表したマイコンです。位置づけとしてはラズベリーパイが小型のコンピュータ(SBCとも呼ばれます)であるのに対し、こちらは小型のコントローラと言ったところです。CPUや周辺装置も備えてありますが、モニターやキーボードなどとつなぐポートもなく、センサーから取り込んだ値をもとに処理を行い、LEDやモータをコントロールするといったことに特化しています。
 親機にPCやラズパイを設け、その子機としてあるいはPico単体で使うといった位置づけです。プログラムを組むのにPCが必要です。

 PicoにはPython ほどの大きなプログラムはインストールできないためなのか、MicroPyhtonなどの規模の小さいプログラム言語を使うようになっています。CircuitPyhton はAdafruite が開発したプログラム言語で、これらの仲間です。
 Picoへのインストール手順や、文法あるいや記述の仕方などの詳細はネットで検索して頂ければと思います。
※CircuitPyhton のインストール先や手順などは、3章内のもりしーさんによる製作手順のサイトにて解説されています。

  • はんだ付け

 このXmasツリーではLEDなどの部品は表面実装となっています。はんだ付けしないといけないのですが、少し専門的な技術を要します。3章で紹介するリンク先でも解説の動画がありますが、私がお世話になった団体の動画も紹介しておきます。
それから、以下の4つはそろえておくと作りやすいかと思います。

  • はんだごては温度調節機能のついたもの
  • こて先は2.4Dというタイプのもの(動画内でD型と呼んでいます)
  • 糸はんだは太さが0.3mmのもの(0.6mmのものよりはんだの量が調整しやすい)
  • こて先のクリーナーはエッジ(角?)のあるもの。

 また、次のことに注意して欲しいです。

  • クリーナーはエッジの部分ではんだをこそぎ落とすことで、こて先にはんだが残りにくくなります。
  • はんだ付けが終ったらこて先にはんだが付いた状態にする。(こて先が酸化するのを防止します。0.6~0.8mmの糸はんだが使いやすいです)

 ※はんだごてはとても熱くなります(300℃以上)。取り扱いには十分お気を付けください。

 www.youtube.com

3.製作編

 以下はもりしーさんによる製作方法の解説サイトです。かなり詳しい内容かと思うので、私からの説明は省きます。

geekyalpacas.com

図1 開発風景
図2 a)電池ボックスの電線をはんだ付け b)保護のためテープを貼る

4.コード(ほんの一例です)

自作のコードを載せます。(もりしーさんのコードを参考にしました)

※ちなみにラズパイPico 内で”code.py” というファイル名で保存すると、電源につなぐだけでプログラムが自動で開始します。

解説をコメントとして記しています。

リスト1 code.py

# 必要なライブラリをインポートします
import time
import board
import pwmio
import digitalio
import random

# leds というリストの要素に、各LED にPWMの機能を付け加えたものを格納しています
leds = [pwmio.PWMOut(board.GP16, frequency=5000, duty_cycle=0),
        pwmio.PWMOut(board.GP14, frequency=5000, duty_cycle=0),
        pwmio.PWMOut(board.GP19, frequency=5000, duty_cycle=0),
        pwmio.PWMOut(board.GP13, frequency=5000, duty_cycle=0),
        pwmio.PWMOut(board.GP17, frequency=5000, duty_cycle=0),
        pwmio.PWMOut(board.GP20, frequency=5000, duty_cycle=0),
        pwmio.PWMOut(board.GP12, frequency=5000, duty_cycle=0),
        pwmio.PWMOut(board.GP15, frequency=5000, duty_cycle=0),
        pwmio.PWMOut(board.GP21, frequency=5000, duty_cycle=0)
        ]

# 各LED で用いるカウンターです
count = [0 for i in range(9)]

# 2次関数を2つ組み合わせています。
# LEDの表示が明るく感じたので、明るい部分を少なくするための工夫です。
def parabola2(x):
    if x < 0.5:
        y = int(x * x * 4.0 * 65535)
    else:
        y = int((x - 1.0)*(x - 1.0)*4.0 * 65535)
    return y

#無限ループです
while True:
    for i in range(9):

        # ランダムで0~2の値を加えています
        count[i] = count[i] + random.randrange(3)
        
        #各LEDごとに明るさを変えています。上の計算により、
        # LEDの明暗はランダムに変わります。
        leds[i].duty_cycle = parabola2(count[i] / 100.0)

        # カウントの値を0~99にしています。「%」は剰余を意味します。
        # ここでは100で割ったときの余りをcount[i] に代入しています
        count[i] = count[i] % 100

    # 0.05秒待機です
    time.sleep(0.05)

少しわかりにくそうな部分として関数”parabola2(x)” があるかと思うので説明します。
図3 a)に三角型に変換するグラフ、図3b)に”parabola2(x)” によるグラフを示します。初め図3a)のようにLEDの明るさを変えていたのですが、これだとLEDが消えたかと思うとすぐに明るくなる感じだったので(自分はそう感じました)、図3b)のように明るい部分を減らしました。
※最大値が65535 なのはPWMの指令値の最大値がこの値だからです。

図3 a)三角型のグラフ b)関数 parabola2(x) によるグラフ

5.動画

動作しているときの映像です。

Youtube
youtu.be


解説は以上です。お読みくださりありがとうございました。