はじめに
メリークリスマス!!
まであと一週間ですね。
今日はフリスクケースがたまってきたので、その活用のためにイルミネーションLEDの調光器を作ってみたいと思います。
でもこの前も調光器は作ったんじゃないの?
ネタが重複してるけど、今回はATtiny13を使用したマイコン制御で作るので許してください、、、
という事で、今回はATtiny制御の調光器の作成になります。
機能としては可変抵抗をぐるぐるさせて調光と点滅間隔を調整できるようにします。単純にアナログ読み取りをしてPWMに反映だけですね。
では早速、本編へGO!
準備編
材料
- DaisoのイルミネーションLED 1個
- ATtiny13 1個
- 可変抵抗100kΩくらい 2個
- 100kΩ抵抗 1個
- NPNトランジスタ 1個
- 電解コンデンサ100uくらい 1個
- スイッチ
- コイン電池ケース(CR2025)
*電解コンデンサは蛍日のようなじんわり光るのを再現するのに使用します。容量を変えることで光り方が変わるので個人の好みの容量でOKです。
回路図
トランジスタのベース抵抗は100kΩとしています。今回のコンセプトの一つは省電力で長いこと駆動させたいのでコレクタ電流は最大で3mAくらい流すことを考えます。PWMでの調光も機能として盛り込んでいるので流す電流をさらに下げることも可能です。
参考に今回使用したS9013の特性を載せておきます。
コード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
/* * PB0:PWM * ADC2:点滅間隔(8bit) * ADC3:調光(8bit) */ #include<avr/io.h> #include<util/delay.h> uint8_t a1; uint8_t a2; //点滅用遅延 void dly(uint8_t a){ uint8_t l,m=0; for(l=0;l<=a;l++){ _delay_ms(10); m++; if(m<=0)return;//over flow対策 } } //analogWrite関数 uint8_t hsPWM(bool pin, uint8_t pwm){ //*内臓クロック1.2MHz if(pin==0){ DDRB |= 0b00000001;//PB0出力設定 TCCR0A |= 0b10000011;//PB0非反転出力,高速PWM TCCR0B |= 0b00000011;//8bit高速PWM,8分周 OCR0A = pwm;//8bitタイマ/カウンタ比較レジスタA return OCR0A; }else{ DDRB |= 0b00000010;//PB1出力設定 TCCR0A |= 0b10000011;//PB0非反転出力,高速PWM TCCR0B |= 0b00000101;//8bit高速PWM,8分周 OCR0B = pwm;//8bitタイマ/カウンタ比較レジスタA return OCR0B; } } //analogRead関数 uint8_t ADread(uint8_t ch) { ADCSRA |= 0b10000110;//AD許可,単独変換,AD変換CK/64 ADMUX = 0b00100000;//Vcc基準,左揃え ADMUX |= ch; ADCSRA |= 0b01000000;//AD変換開始 loop_until_bit_is_set(ADCSRA,ADIF);//変換完了フラグが1になるまで待機 return ADCH;//上位8bit取得(0-255) } void setup() { DDRB |= 0b00000001;//PB0出力設定 } void loop() { a1 = ADread(2);//点滅間隔 a2 = ADread(3);//調光 hsPWM(0, a2);//PWM出力 dly(a1);//待機 PORTB = 0b00000000;//PB1_OFF TCCR0A = 0b00000011;//PB0非反転出力,高速PWM dly(a1);//待機 } |
ずらずらと書いていますが、Arduinoでいう【analogRead】【analogWrite】【delay】だけです。めっちゃ単純です。
でも、これ致命的欠陥を抱えておりまして、、、
それに関しては終わりで述べたいと思います(あるていどわかる人なら、どこに欠陥があるかわかるかも)。
実装編
①基板の加工
②フリスクケースの加工(LEDケーブル通し用の穴あけ+磁石取り付け)
③回路図通りに半田付け
④ケースに収めて完成
あ、ATtiny13にはプログラムの書き込みを別途お願いしますね。
動画にもまとめてありますのでどうぞです。
おわりに
はい、今回はATtiny13制御のフリスクケース調光器を作成しました。AVRマイコンで組み込みCをした人なら鼻ほじりながらでもできるレベルでしたね(笑)
で、致命的な欠陥なのですが、、、、それは
調光機能と点滅を並行して処理できないところです。
コードをみてわかると思いますが、今回の点滅の方法はdelayを使用しています。つまりNOP(no operation)を回しているだけでマイコン自体は完全に停止しています。この点滅のポーリングが完了しない限り調光のPWM値は反映されません。
さて、、、どうしたものか。
タイマーカウンタの割り込み機能を使用して点滅制御を割り込みルーチンの方に組み込めば行けそうな気がします!
ので、次回はこの件について取り上げればと思います。
ではでは~
コメント