輝く雪玉、または「即興材料」で新年を飾る

雪の中のLEDに関する記事触発されて、私は似たようなことを家でやろうと試みました。 その記事のコメントに、アイデアと一握りの写真を投稿しました。 モスクワ地方の雪は現在供給不足になっていますが、これは熱意を弱めるものではなく、むしろ、雪がまだある間に可能な限り早くアイデアを実現しています。



最初の試みは、静的に光るLEDを備えた電球でしたが、少し後に、ダイナミクスの小さなセグメントを持つボードが完成しました。







どのように機能し、同様のことを行う方法-カットの下を見てください。

PS素材の「便利さ」は、おそらくハム愛好家に適用されます。



それがすべて始まった方法



最初に必要なもの:



画像

ボードは基本的な方法で描画されます(プリンターを傷つけず、CD-ROMに描画するためのマーカーを取り出してすぐに傷を付けました。その後、すぐに溶液に投げてエッチングしました。写真を撮る時間はありませんでした)。

ボード図面は次のとおりです。





エッチング後、バッテリー用のホルダーの形にボードを切り取る必要があります(これを行う最も簡単な方法は、穴を事前に開けてホルダーを背面に挿入し、マーカーでマーカーを丸で囲むことです。 注意!極性が重要です!ホルダーの「耳」の位置に注意してください !)ホルダー。



その結果は次のとおりです。

画像



1つの抵抗器は意図的にボードにはんだ付けされていませんでしたが、紫色の輝きを得るために、赤と青のチャネルをオンにし、緑のチャネルをオフにする必要がありました。



これが、シンプルなランプの仕組みです。 ボードをワニスで覆い(実際、必ずしもそうではありませんが、トラックが暗くなる可能性は低くなります)、バッテリーを挿入し、フラスコに詰めて雪玉を作ります!



そしてOstapは苦しみました



マイクロコントローラー技術の方向に不均等に呼吸するプログラマーとして、私は小さなチップをケースに適合させることに決めました。これにより、このことに少し喜びがもたらされ、LEDをさまざまな色で美しくきらめかせます。



これを行うために、私は狭い円で広く知られているAtmel ATtiny45コントローラー(ATtiny13が欲しかったが、突然それらは箱に入っていなかった、違いはメモリサイズのみです。このランプのプログラムはATtiny13に適合します)結果のパターンをホイルテキソライトに転写しました。

画像

以前のバージョンと比較して、より安定した電源供給のためのコンデンサーとマイクロコントローラー自体がボードに現れました。 コンポーネントの面では、ボード上のスペースが限られているため、ここで少し血をしなければなりません。 プログラミングコネクタも提供していませんでした。ピンに配線してはんだ付けされていました(特にこのため、プログラミングのためにLEDチャンネルがピン上にあり、RESETを別のプラットフォームとして持ち出しました)。 このボードの抵抗とコンデンサのサイズは0805です。



ボードがエッチングされている間に、私はプログラムを取り上げました。 ATtiny45では、PWM信号のハードウェア出力は、PB0、PB1などのレッグでサポートされています。 PB2はこのリストにありませんでした。 しかし、ボードはすでに描画およびエッチングされているため、2番目のタイマー(Timer1)を適用してソフトウェアPWMを作成することにしました。



ランプのチューニングをより柔軟にするために、このようなメカニズムを適用しました。 チップにはROM(EEPROM)があります。 最初のセルには、動作モードを設定する数値を格納します。 含めるたびに、この値を1増やしてROMに保存します。 そのため、コネクタのバッテリーを引っ張って、モードを切り替えることができます。 正しいモードを見逃さないために、各モードを複製しました(実際、次のモードは、バッテリーが2回動いた後にオンになります)。



すべてのCコード(AVR-GCCコンパイラー用)
#include <avr/io.h> #include <avr/eeprom.h> #include <util/delay.h> #include <avr/interrupt.h> #define r_pwm(pwm) OCR0A = pwm #define b_pwm(pwm) OCR0B = pwm #define g_pwm(pwm) OCR1A = pwm #define NUM_MODES 16 int main(void) { /* Init LED GPIO pins */ DDRB = 7; /* pins 0, 1, 2 */ /* Init PWM timers */ /* Timer0 is for R and G channels */ TCCR0A = (1<<COM0A1)|(1<<COM0B1)|(WGM01)|(WGM00); TCCR0B = (1<<CS00); /* divide by 1 */ /* Timer 1 is for B channel; enable interrupts */ TIMSK = (1<<OCIE1A)|(1<<TOIE1); TCCR1 = (1<<CS10); /* divide by 1 */ sei(); /* Get mode value from the EEPROM and update it */ uint8_t mode = eeprom_read_byte((uint8_t *) 1); mode++; if (mode >= NUM_MODES) mode = 0; eeprom_write_byte((uint8_t *) 1, mode); uint8_t i; while(1) { switch(mode >> 1) { case 0: r_pwm(255); break; case 1: g_pwm(255); break; case 2: b_pwm(255); break; case 3: r_pwm(255); g_pwm(255); break; case 4: g_pwm(255); b_pwm(255); break; case 5: r_pwm(255); b_pwm(255); break; case 6: r_pwm(255); g_pwm(255); b_pwm(255); break; case 7: for (i=0; i < 255; i++) { r_pwm(255-i); g_pwm(i); _delay_ms(20); } for (i=0; i < 255; i++) { g_pwm(255-i); b_pwm(i); _delay_ms(20); } for (i=0; i < 255; i++) { b_pwm(255-i); r_pwm(i); _delay_ms(20); } } } return 0; } ISR(TIM1_OVF_vect) { if (OCR1A != 0) PORTB |= (1<<2); } ISR(TIM1_COMPA_vect) { PORTB &= ~(1<<2); }
      
      







回路基板の回路と配線(Eagle CADから)








ヒューズビットはここで数えることができます 、私は快適なPWMと低消費電力のために1 MHzで十分であると考えました。 一般的に、融合ビットはtiny45の標準であることが判明したため、変更することはできません。



すぐに新しいクラフトを実際に試してみるのはすぐにできませんでした。そのため、スプレー缶からニスを急いで振りかけ、ランプの下に5分間置き、カメラを持って通りに飛び出しました(すでに夜遅く、テストにちょうどよい条件でした)。



そして、ここに結果があります(ビデオは注意を引くために上に挿入したものと変わりません):



雪だるまはまったく成形したくありませんでしたが、手の中に少しの雪を温めて、すべてがうまくいきました!





重要ではない



同志に感謝します。 キダル



このプロジェクトのすべての資料をDropboxに投稿しました。 時間が来たら、別のmakefileを準備し、アンパック後、make antares && make buildを行います。その後、都合の良い方法でimages / antares.hexファイルをチップにアップロードできます。



ご清聴ありがとうございました!



UPD:ソースファイルを使用してアーカイブを更新しました。 プリント回路基板を備えた自己印刷用のPDFファイルが完成しました。プログラムのアーカイブには、既製のファームウェアを含む16進ファイルがあります。



All Articles