※この記事はFUN Advent Calendar 2018?18日目の記事です。
今回は工房のレーザーカッターを使ってクリスマスツリーをつくった話をしようかと思います.
誰
元高専生で,今は情シス4年.
編入関係の話はこちらを参照.
工房
私は高専から未来大へ編入したわけですが,高専と比較して未来大の良いところのひとつに「工房が自由に使える」があると思います.工房の設備に関してはFUN BOXのページに詳しく書いてあります.未来大の学生であればWebDavの/StudentAndStaff/Fab に資料が置いてあるので,それらも見ることができますね.
個人的に好きなものはレーザーカッターと基板加工機で,これらは電子工作する人には助かる設備です.今回はレーザーカッターを使ってクリスマスツリーのような何かを作ったので,その作業記録を書きます.
構想
ちょうど未来大のアドベントカレンダーに書くネタを考えていたのと,電子工作をしたい欲求(≒卒研の現実逃避)が高まっていたので,なにか適当に作ることにしました.作るものはなんでも良かったのですが,季節ネタとしてクリスマスツリーを採用.
クリスマスツリーとは言っても,人によって思い浮かべるデザインは様々かと思います.
材料は端材入れにある端材を適当に使おうと考えていたので,アクリルかMDFの2つの選択肢がありました.最初はアクリルを2枚使って立体的にしようかと考えており,LEDで飾り付けたり彫刻を入れて下からLEDで強めの光を当てれば綺麗だろうということを考えていました.
しかし,一晩寝た結果,MDFにLEDを埋め込む形にしました.その理由はアクリルは端材が少ない割に高いこと,MDFであれば中に配線を仕込めるためです.MDFを3枚重ね,中間の1枚をスペーサーとして使用することにより,その隙間に配線を仕込めます.なお,これをアクリルで行うと中の配線が丸見えになるのでダメです.あと面積が3倍必要になるので高いアクリルには向かない.
LEDは3[mm]で5色100pcsが650円で売っていたので,それを使います.さて,LEDを使うには電源と制御回路が必要です.それらは幹にあたる部分に箱を用意することにしました.上部にLED,下部に電源と制御回路を置き,それらを組み合わせる形にします.上部を高さ12[cm] 幅10[cm]とし,厚さは3層でそれぞれ2.5[mm],5.5[mm],2.5[mm]としました.また,下部に関しては高さ6[cm] 幅4.5[cm] 奥行き2[cm]として作成することとしました.大きさの理由は端材で作れそうだったからです.
データ作成
おおよその形が決まったので,レーザーカッターで材料を切り出すためのデータをIllustratorで作成します.上部はシルエットACというサイトからクリスマスツリーと検索して下の画像を見つけ,幹を消して下部との接合部を追加しLED用の穴を開けて作成しました.また,中間層は輪郭のパスを縮小してコピーすることでつくりました.
下部はMakerCaseで寸法を入力してSVG形式で出力し,それをIllustratorで読み込み上部との接合部と配線口を追加しました.
単純な形状ですが,Illustratorに慣れてないと操作が大変ですね.
MDFの加工
レーザーカッターの出番です.上部のスペーサーが2枚あるのは,配線に必要な高さが不明だったため,念の為2枚カットしたためです.大丈夫そうだったので下部の箱はスペーサー1枚で寸法を計算をして出力しました.
着色
工房に置いてある木部着色剤のブラックオリーブを使って上部を着色します.
上部の3枚を組み合わせるとこんな感じです(薄いからわかりにくい).
電源と制御回路
最初は電池2本とArduino Nanoで制御しようかと思ってましたが,よく考えたらNanoは動作電圧が5[V]なので,アルカリ乾電池2本(直列で3.0[V])で使うためには昇圧する必要がありました.Nanoは箱に斜めにしてギリギリ入る感じだったので昇圧回路は入らないと考え,Nanoの採用は諦めました.
ちなみにこれ以降の画像の電池は,アルカリ乾電池を切らしていたため充電池(2本直列で2.6[V]くらい)です.今日ダイソーで買ってきたアルカリ乾電池を入れたところそこまで影響なかったので,たぶんどちらでも大丈夫ですね.
さて,Nanoの代わりにはPIC12F629を使用することにしました.動作電圧が2[V]~5.5[V]と広く,8ピンなのでコンパクト,ディジタル出力可能なピンは5本あるのでLEDの5色を制御する程度なら十分使えそうです.
今回使用するLEDは片面9個ずつで計18個,そのLEDは5色に分かれており,色に対応したPICのピンで制御をします.つまりPICの出力ピンには最大4個のLEDが接続されます.データシートのp85に記載されているELECTRICAL SPECIFICATIONSによると,ピン1本に流すことができる電流は25[mA]で,GPIO全体では125[mA]となっています.そこまで電流を流さなければ大丈夫そうですね.
今回は抵抗1つにLEDを複数並列に接続します.このページの図15あたりでは電流が偏るためやってはいけない回路となっており,1つのLEDに電流が集中した場合は明度のバラつきやLEDの破損等の危険性もありますが,この回路であれば省スペースにできます.とは言え破損は嫌なので,PICの出力ピンから流れる電流がLED単体の定格を超えないようにします.3.0[V]のもとで500[Ω]の抵抗をつけておけば電流は6[mA]となり,これなら1つのLEDに電流が集中しても大丈夫そうです.というわけでPIC12F629の出力ピンから500[Ω]の抵抗を介し複数のLEDを接続して様子を見てみました.
通常より暗いですが,同じ色であればそこまで個体差もなく点灯していました.明るさもギラギラさせるよりは暗いほうが好みなのでこのままにしておきましょう.
ちなみに消費電力は全LEDで6*5=30[mA],PICはデータシートのp89よりVdd=3[V]で内蔵オシレータを使用し4[MHz]で動作させた場合は最大700[μA]なので,合計で30.7[mA]になります.このサイトによるとダイソーのアルカリ乾電池は1,300[mAh]らしいので,単純に計算すると42時間ほど稼働できるようです.0.5[円/時間]ですね.ただし,この値は全LEDが点灯している状態として計算していますが,実際には瞬いているのでもうちょっと時間は伸びるかもしれないです.
PICのソフトウェア
LEDの明るさを調整するためのプログラムを適当に書きます.発振子は内蔵の4[MHz]のものを使います.また,10[ms]を1周期としたPWMみたいなことをしてます.これでちょっとsin波っぽい感じがでるようにかいてあります.プログラムメモリが許す限り凝った点灯パターンをつくることができるんですけど,適当につくったらそれっぽくなったのでこれでいきます.
/* | |
* File: main.c | |
* Author: pome | |
* | |
* Created on 2018/12/14, 2:28 | |
*/ | |
#include <stdio.h> | |
#include <stdlib.h> | |
// CONFIG | |
#pragma config FOSC = INTRCIO // Oscillator Selection bits (INTOSC oscillator: I/O function on GP4/OSC2/CLKOUT pin, I/O function on GP5/OSC1/CLKIN) | |
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled) | |
#pragma config PWRTE = OFF // Power-Up Timer Enable bit (PWRT disabled) | |
#pragma config MCLRE = OFF // GP3/MCLR pin function select (GP3/MCLR pin function is digital I/O, MCLR internally tied to VDD) | |
#pragma config BOREN = OFF // Brown-out Detect Enable bit (BOD disabled) | |
#pragma config CP = OFF // Code Protection bit (Program Memory code protection is disabled) | |
#pragma config CPD = OFF // Data Code Protection bit (Data memory code protection is disabled) | |
// #pragma config statements should precede project file includes. | |
// Use project enums instead of #define for ON and OFF. | |
#include <xc.h> | |
#define _XTAL_FREQ 4000000 | |
/* | |
* | |
*/ | |
const static char sin[20]={6,8,9,9,10, | |
9,9,8,6,5, | |
3,2,1,1,0, | |
1,1,2,4,5}; | |
int main(int argc, char** argv) { | |
int i,j,k; | |
char interval[5]; | |
CMCON = 0x07 ; | |
TRISIO = 0b00000000 ; | |
GPIO = 0b00000000 ; | |
while(1){ | |
for(i=0;i<9;i++){ | |
for(j=1;j<=5;j++){ | |
interval[j-1]=sin[(i+j*4)%20]; | |
} | |
for(j=0;j<10;j++){ | |
for(k=0;k<10;k++){ | |
GPIO0=k<interval[0]; | |
GPIO1=k<interval[1]; | |
GPIO2=k<interval[2]; | |
GPIO4=k<interval[3]; | |
GPIO5=k<interval[4]; | |
__delay_ms(1); | |
} | |
} | |
} | |
} | |
return (EXIT_SUCCESS); | |
} | |
基板の作成
基板に載せるのはPICと抵抗と電源用スイッチのみで,そこに配線を付ける形にします.チップ抵抗は500[Ω]のものが見当たらなかったため,1[kΩ]のものを2段重ねにして並列接続にすることで500[Ω]にします.また,PICの出力ピンにはGP0,GP1,GP2,GP4,GP5を使用します.これはGP3が入力専用であるためです.GP3に対応するICソケットの端子は邪魔なためはずしておきます.
というわけで,下の図のように配置します.
さて,配置が決まったのでユニバーサル基板を切ります.図より縦は5穴とし,横はPIC4穴 電源とスイッチで2穴 抵抗と上部向けの配線で3穴とします.よって,縦5横9が必要になります.ユニバーサル基板をアクリルカッターで切れ目を入れ,ペンチでへし折り,棒ヤスリで磨くと以下のようになります.
そこに一番難易度が高いチップ抵抗2段重ねをつけます.
ICソケットの4番ピンを外し,基板につけます.
あとはスイッチ取り付けて一旦終了です.
LEDのはめ込み
MDFに開けた穴にLEDを突っ込みます.色の配置はなんかそれっぽくなる感じで.赤と緑が隣り合っていたらそれっぽくなりそうなのでそんな感じです.ミスを減らすため,内側から見たときカソードが右になるように統一しておきます(ただし一番上の黄色は干渉する可能性があるため反転).
配線
ひたすら配線をしていきます.本当はワイヤラッピングがしたかったんですけど,手元にツールがなかったので端子に導線を巻き付け,はんだ付けをしました.なんかイカっぽいですね.
配線を基板にはんだ付けします.
箱詰め
充電池と基板を箱部分に詰めます.あと,上部と下部の接続部分ははめ込み式なので隙間は開かないんですが,一番上の部分が隙間できてたので接着剤でつけました.
動作確認
— pome (@pome_11) December 16, 2018
最後に
今回は工房ネタということで書いてみました.この記事で工房の設備を使いつつ電子工作する人が増えたら嬉しいですね.ついでに言うとPICユーザが増えるともっと嬉しいです.最近安価なプログラマも出たので初心者でも初期投資を少なく始められます.この機会におひとついかがでしょうか?