※なにか気になる点がありましたらコメント欄にご記入ください。また、工作や回路を製作する場合には、細かい作業などに対して、細心の注意を払われるようお願いいたします。
目次
1.はじめに
Twitterなどでお世話になっているもりしーさん(@kotaMorishita)が、毎年 Xmasツリーを製作されていて、今年もそれを購入し(今年はクラファンを利用されていました)、ある程度自作しました。
この記事は、それの製作記になります。
去年、Xmas ツリーを製作したときの記事です
tanuki-bayashin.hatenablog.com
ラズベリーパイPicoのサイトです(Xmasツリーに使用されています)
www.raspberrypi.com
2.予備知識
以下にこの記事に出てくる事柄について必要な予備知識のキーワードを載せておきます。ある程度の範囲で解説しました。分かりにくい点などについては検索等でより深く調べて頂くか、コメント欄にご記入ください。
- ラズベリーパイPico
ラズベリーパイ財団が約2年前に発表したマイコンです。位置づけとしてはラズベリーパイが小型のコンピュータ(SBCとも呼ばれます)であるのに対し、こちらは小型のコントローラと言ったところです。CPUや周辺装置も備えてありますが、モニターやキーボードなどとつなぐポートもなく、センサーから取り込んだ値をもとに処理を行い、LEDやモータをコントロールするといったことに特化しています。
親機にPCやラズパイを設け、その子機としてあるいはPico単体で使うといった位置づけです。プログラムを組むのにPCが必要です。
- Circuit Python
PicoにはPython ほどの大きなプログラムはインストールできないためなのか、MicroPyhtonなどの規模の小さいプログラム言語を使うようになっています。CircuitPyhton はAdafruite が開発したプログラム言語で、これらの仲間です。
Picoへのインストール手順や、文法あるいや記述の仕方などの詳細はネットで検索して頂ければと思います。
※CircuitPyhton のインストール先や手順などは、3章内のもりしーさんによる製作手順のサイトにて解説されています。
- はんだ付け
このXmasツリーではLEDなどの部品は表面実装となっています。はんだ付けしないといけないのですが、少し専門的な技術を要します。3章で紹介するリンク先でも解説の動画がありますが、私がお世話になった団体の動画も紹介しておきます。
それから、以下の4つはそろえておくと作りやすいかと思います。
- はんだごては温度調節機能のついたもの
- こて先は2.4Dというタイプのもの(動画内でD型と呼んでいます)
- 糸はんだは太さが0.3mmのもの(0.6mmのものよりはんだの量が調整しやすい)
- こて先のクリーナーはエッジ(角?)のあるもの。
また、次のことに注意して欲しいです。
- クリーナーはエッジの部分ではんだをこそぎ落とすことで、こて先にはんだが残りにくくなります。
- はんだ付けが終ったらこて先にはんだが付いた状態にする。(こて先が酸化するのを防止します。0.6~0.8mmの糸はんだが使いやすいです)
※はんだごてはとても熱くなります(300℃以上)。取り扱いには十分お気を付けください。
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の指令値の最大値がこの値だからです。