Staf untuk Santa Claus



Setiap tahun pada tanggal 31 Desember, saya, dalam kostum Santa Claus, dan istri saya, dalam peran Snow Maiden, berkeliling kota ke teman-teman saya dengan selamat. Karena Tahun Baru akan segera tiba, saya memutuskan untuk memeriksa apakah saya sudah menyiapkan semuanya untuknya dan mengeluarkan staf saya yang sudah usang dari lantai dasar. Yang mengejutkan saya, setelah berbaring di ruang bawah tanah selama setahun, dia bekerja dengan baik bahkan sekarang! Baterai-nya entah bagaimana masih terisi! Stafnya tidak terlalu cerah, tetapi bersinar. Tentu saja, saya harus mengisi ulang, dan saya menyaksikan satu LED berhenti berfungsi, tetapi ini dapat diperbaiki - kami akan memperbaikinya.

Saya membuat staf ini kembali pada tahun 2012, dan sejak itu telah melayani saya dengan setia. Masalahnya cukup sederhana, tetapi sangat efektif, terutama anak-anak bersukacita karenanya. Dia hampir seperti pedang Jedi - hanya tongkat, dan untuk Santa Claus yang sebenarnya - ini adalah hal yang perlu. Saya memutuskan untuk menulis tentang dia di sini di Habrรฉ - tiba-tiba seseorang akan terinspirasi oleh ide dan membuat ini untuk dirinya sendiri pada Tahun Baru, masih ada waktu.

Untuk membuat staf Anda perlu:

  • sepotong pipa air plastik 1,3 meter;
  • perekat diri mengkilap kecil untuk dekorasi;
  • sepotong kabel jaringan UTP-5 atau kabel lain yang cocok;
  • LED biru, setidaknya 24 buah;
  • baterai
  • tombol daya;
  • mikrokontroler kecil atau papan FPGA yang memiliki sesuatu yang dapat Anda program;
  • bola-pohon Natal mainan besar yang dapat dibagi dua sehingga papan dan baterai dapat disembunyikan di dalamnya.

Bagian yang diperlukan terlihat di foto ini:



Perangkat staf sangat sederhana. Tidak ada yang khusus untuk ditulis. Kami mengambil pipa air plastik putih dan mengebor beberapa lubang pada jarak yang sama 200 mm. Saya mendapat 6 lubang.

Kami melarutkan kabel UTP-5 menjadi beberapa pasangan bengkok. Dibutuhkan enam pasang kabel. Kami meluncurkan mereka ke dalam lubang dan output melalui salah satu ujung pipa, ke tempat bola ajaib staf akan berada. Di mana pasangan kabel masuk ke lubang-lubang pipa, kami membersihkannya dan membungkus pipa dengan erat pada jarak tertentu dari satu sama lain. Kami menyolder. Untuk "bus" yang dihasilkan dalam lingkaran solder staf secara paralel 4 LED biru:



Di bagian atas pipa, Anda perlu mengebor lubang yang lebih besar dan menempelkan tombol daya papan kontrol di sana:



Saya memiliki syal rover Mars sebagai papan kontrol. Ini adalah FPGA dari Altera MAX II, dan karena papan itu awalnya dimaksudkan untuk menghubungkan mesin mainan berdaya rendah, output chip di papan digabungkan dalam 10 buah untuk memberikan lebih banyak arus. Hanya ada 6 output gabungan seperti itu di papan - ini adalah "sinyal" dari papan f0, f1, f2, f3, f4, f5. Jadi saya bisa langsung menyalakan LED dari kesimpulan ini tanpa takut membakar output FPGA. Juga di papan itu sendiri ada 8 LED kuning - mereka juga bisa dinyalakan. Jika bola di atas staf tembus, maka ini juga akan menambah efek visual.

Jika Anda menggunakan Arduino, misalnya, dalam sebuah staf, Anda mungkin harus menyolder selendang kecil dengan kunci transistor untuk mengontrol banyak LED, karena lebih baik tidak mengambil lebih dari 10-15mA dari satu pin mikrokontroler, tetapi kami membutuhkan lebih banyak untuk LED.

Papan perlu di-flash dengan program kontrol. Idenya adalah bahwa ketika Anda menekan tombol pada staf, papan menyala dan segera mulai menyalakan lampu pada staf. Lalu siapa yang punya fantasi apa. Pertama-tama saya menyalakan semua LED dari baris pertama hingga keenam, dan kemudian saya mematikan belokan dari keenam ke yang pertama.

Kode HDL Verilog mungkin akan menjelaskan lebih baik apa yang saya maksud:

module effect( input wire clk, input wire mclk, output wire [7:0]leds, output wire f0, output wire f1, output wire f2, output wire f3, output wire f4, output wire f5 ); reg [3:0]cnt; reg [5:0]bits; initial begin bits= 6'h00; cnt = 4'h0; end always @(posedge clk) if(cnt==11) cnt<=0; else cnt <= cnt + 1'b1; always @* begin case(cnt) 4'h0: bits = 6'b000001; 4'h1: bits = 6'b000011; 4'h2: bits = 6'b000111; 4'h3: bits = 6'b001111; 4'h4: bits = 6'b011111; 4'h5: bits = 6'b111111; 4'h6: bits = 6'b011111; 4'h7: bits = 6'b001111; 4'h8: bits = 6'b000111; 4'h9: bits = 6'b000011; 4'ha: bits = 6'b000001; default: bits = 6'b000000; endcase end assign f0 = bits[0] & mclk; assign f1 = bits[1] & mclk; assign f2 = bits[2] & mclk; assign f3 = bits[3] & mclk; assign f4 = bits[4] & mclk; assign f5 = bits[5] & mclk; assign leds = {bits[5],bits[5],bits[4],bits[3],bits[2],bits[1],bits[0],bits[0]}; endmodule 

Ini bukan modul tingkat atas, ini adalah modul effect.v. Dari modul atas, dua frekuensi clock clk ~ 40Hz diumpankan di sini - frekuensi ini menentukan kecepatan efek dan frekuensi kedua mclk ~ 320Hz, delapan kali lebih tinggi. Sinyal mclk juga memodulasi output lagi, sehingga tidak selalu dinyalakan, sehingga LED tidak bersinar begitu terang dan chip tidak memanas.

Saya tidak tahu apakah saya perlu menghafal artikel ini. Tetapi untuk berjaga-jaga, saya akan menulis bahwa kode Verilog di atas dapat sepenuhnya disimulasikan menggunakan testbench ini:

 `timescale 1ms / 1us module tb; reg clock = 1'b0; always #10 clock = ~clock; reg [3:0]counter=0; always @(posedge clock) counter <= counter+1; wire [7:0]wleds; wire wf0,wf1,wf2,wf3,wf4,wf5; effect inst( .clk( counter[2] ), .mclk( clock ), .leds( wleds ), .f0( wf0 ), .f1( wf1 ), .f2( wf2 ), .f3( wf3 ), .f4( wf4 ), .f5( wf5 ) ); initial begin $dumpfile("out.vcd"); $dumpvars(0,tb); #10000; $finish(); end endmodule 

Bagaimana tepatnya simulasi proyek dapat dibaca, misalnya di sini .

Nah, menurut hasil simulasi, Anda bisa mendapatkan diagram timing sinyal ini:



Jika Anda berencana untuk melakukan proyek ini pada Arduin - ini juga mungkin. Saya benar-benar bukan ahli Arduina yang besar, tetapi menurut saya kode tersebut mungkin terlihat seperti ini:

 int start_pin = 2; int end_pin = 8; void setup() { for (int i = start_pin; i< end_pin; i++ ) pinMode(i, OUTPUT); } void loop() { for (int i = start_pin; i< end_pin; i++ ) { digitalWrite(i, HIGH); delay(250); } for (int i = start_pin; i< end_pin; i++ ) { digitalWrite(i, LOW); delay(250); } } 

Hasilnya harus seperti ini:


Terlepas dari kenyataan bahwa proyek secara keseluruhan sangat sederhana, para penonton dan orang yang lewat pada tanggal 31 Desember selalu senang. Terutama ketika Anda keluar dari mobil dengan setelan Santa Claus di jalan bersalju, Anda pergi ke pejalan kaki santai dan menerangi jalan dengan staf dan menyajikan bebek mandarin.

Source: https://habr.com/ru/post/id479404/


All Articles