Bu eğlenceli projede, Arduino'yla Buzz Wire (Vızıltı teli) oyunu yapmayı öğreneceğiz. İhtiyaç duyulan parçaların çoğu başlangıç kitinde (
başlangıç kitinde ne var?) ve evimizde bulunan parçalar. Bu proje bir Arduino kullanıyor, ancak sahip olduğunuz hemen hemen her mikrodenetleyiciyi kullanabilirsiniz.
Neye ihtiyacın var?
İşte bu projeyi tamamlamak için ihtiyacınız olacak parçalar:
1 x Arduino UNO veya benzeri.
1 x Metal askı.
2 x 220 ohm dirençler.
1 x Breadboard.
1 x Piezo zili.
2 x Krokodil Kablo.
Çeşitli ısıyla daralan tüp.
Erkek-erkek bağlanma telleri.
Yapıyı geliştirmek için isteğe bağlı bazı parçalar:
1 x Ek piezo zili.
1 x Dübel çubuk.
1 x 7 segment 4 lü ekran.
1 x 220 ohm direnç.
1 x Push button.
Erkek-dişi bağlantı telleri.
Ahşap tahta.
Muhtelif ağaç vidaları.
Neredeyse herhangi bir Arduino, yeterli pimlere sahip olması koşuluyla çalışacaktır. Neye ihtiyacınız olduğundan emin değilseniz, whatsapp destek hattımızdan bilgi alabilirsiniz.
30762|38866|39634|31686|35539|30836|31847|35723|30775
Zemin
Bu karmaşık görünse de, aslında oldukça basit bir proje. Temel yapıya başlayacağız ve daha sonra karmaşıklığı artırmak için ek bileşenler ekleyeceğiz. Elinizdeki bileşenlere bağlı olarak istediğiniz gibi eklemeler yapabilirsiniz.
Ana mekanizma, bir sekilli tel ve bir tutamağın üzerindeki bir halkadan oluşur. Oyuncu, parkurun etrafındaki döngüyü iki dokunuş olmadan yönlendirmelidir. İki dokunuşla, devre tamamlanır ve sesli uyarı verilir. Elbette bu devreyi mikrodenetleyici kullanmadan oluşturmak mümkündür, ancak bunun neresinde eğlence var.
Sağdaki, oyuncunun döngü turunda takip etmesi gereken şeklidir. Tüm oyunun temelidir, bu yüzden onu iyi yapın! Küçük bir düşüşe karar verdim, ardından büyük bir tırmanış hazırladım. Metal bir askıyı ihtiyacınız olan şekle sokun. Pirinç tel veya bakır boru aynı derecede işe yarar, ancak elbise askısı en ucuzu olabilir.
İşleri mükemmelleştirmek için eldiven takmanız ve pense veya çekiç kullanmanız gerekebilir. Cıvata kesicilerle fazlalıkları kesin. Tabana doğru itmek için iki ucu dik konumda bırakın. Son olarak, iki adet daralan makaronu kesin ve uçların üzerine yerleştirin
Bu, döngüyü rotadan izole eden bir başlangıç / bitiş veya güvenlik bölgesi sağlar. Alternatif olarak, herhangi bir ısıyla daralan makaron bulunmadığında bant veya hatta bir pipetle bile yapılabilir.
Şimdi yolun bir ucuna bir kablo takın. Burada iki seçeneğiniz var; lehimleyebilir veya bir krokodil kablo kullanabilirsiniz. Bir krokodil kablo daha kolay seçenektir, ancak lehimleme daha güvenilir ve uzun vadeli bir çözüm olabilir. Elbise askısının yüzeyini önce zımpara kağıdı ile pürüzlendirdiğinizden emin olun.
Bir sonraki adımda tabanda deldiğiniz deliğin boyutuna bağlı olarak, ilk önce kabloyu montaj deliğinden beslemeniz gerekebilir. Birlikte sarılmış iki tel kullanılması dayanıklılığı artıracaktır:
Zemini oluşturma zamanı. Bu, parkuru dik konumda tutmaya ve elektroniği tutturmak için bir yer sağlamaya yarar. Bir miktar tahta parçası kullandım, evin içinde ne varsa, bir karton kutu bile olabilir.
Bir "n” şekli oluşturmak için üç parça kesin. Bu üç parçayı birbirine vidalayın (veya yapıştırın). Ayrılmalarını önlemek için önce yan parçalara bir delik açmayı unutmayın. Vidaları havşalamak isteyebilirsiniz ve bir havşa matkap ucu tavsiye ederim. Bir havşa açma aleti veya matkap deliği yoksa, daha büyük çaplı bir matkap ucu iş görür.
Parkurun uçlarına oturması için yeterince uzak iki delik açın. Alt tarafı tutkallama için hazır havşa.
Tutacak
Şimdi tutacağı yapma zamanı. Küçük metal saplı bir halka oluşturmak için bir askının küçük bir parçasını bir ucundan döndürün. Kesme kenarını eğdiğinizden emin olun ve gerekiyorsa bant / köpük ile örtün.
Bu, devrenin diğer yarısını oluşturacaktır - bu halka parkura dokunduğunda devreyi tamamlayacaktır (bir anahtar gibi). Lehim (veya bir krokodil kablo kullanın), bunun altına daha önce elbette yaptığınız gibi bir tel.
Gerçek tutamaç için küçük bir dübel kesin. Bu metal halka bu tutamağa girer.
Bu tutamaçtan bir delik açın. Bunun metal halka ve kablo boyunca geçebilecek kadar geniş olması gerekir:
Bu zor olsa da, bir matkap üzerinde yapmak mümkündür. Bir torna işi mükemmel yapar:
İçindeki ucu çıkarımış bir tükenmez kalem de kullanabilirsiniz.
Son olarak, kabloyu ve halkayı tutamağa sabitlemek için sıcak tutkal kullanın. Sıcak tutkal güçlü bir sabitleyicidir, bu nedenle işimizi görecektir.
Son Kısım
Metal teli tabandaki deliklere yerleştirin. Kabloyu eklemeyi unutmayın. Alt tarafındaki havşa deliklerini yandaki gibi doldurarak tabana sabitlemek için tekrar sıcak tutkal kullanın.
Devre
İşte tam devre. Sizinkini bu kadar karmaşık hale getirmek zorunda değilsiniz.
İlk önce, iki piezo elemanını 10 ve 11 numaralı dijital pimlere bağlayın. Kutupların önemi yoktur.
İki piezo kullanmak zorunda değilsiniz - bunu yapmamın tek nedeni, teller temas ettiğinde çok daha yüksek bir vızıltı sesini duymak. Bir tarafı dijital pime, diğerini toprağa bağlayın.
Şimdi metal rotasını ve tutamaçı takın.
Yine, bu ikisinin hangi yönde kablolandığı önemli değildir. Devrenin bu kısmı tam olarak bir düğme veya anahtar gibidir - halka parkura dokunduğunda oynatıcı devreyi tamamlar. Her iki direnci de eklediğinizden emin olun.
Bir direnç devreyi toprağa bağlar. Diğer direnç Arduino'yu korur. İki parça dokunulduğunda, + 5V dijital pime girer. Bu direnç yoksa, kısa devre olur.
Sinyal kablosunu (diyagramdaki mor) dijital pim 9'a bağlayın.
Ardından, dijital pim 2'ye bir düğme bağlayın.
Son olarak, 7 segmentli LED ekranı bağlayın.
Bu özel model Seeed'den. Bu, dört ekranı yönetmek için bir TM1637 kullanır - bu, yalnızca iki dijital pinin gerekli olduğu anlamına gelir. Arduino toprağına GND'yi ve Arduino + 5V'a VCC'yi bağlayın. D10'u Arduino dijital pim 13'e ve CLK'yı dijital pim 12'ye bağlayın.
Anlatım sıramıza göre şemaları aşağıda görebilirsiniz.
Kod
Bu projenin çalışması için iki ek dosyaya ihtiyacınız olacak. İlk adımı pitches.h. Bu dosya sadece notaları piezo değerleriyle eşleştirir. Örneğin "31” yerine "NOTE_C3” diyebildiğiniz için bir melodi yazmayı çok kolaylaştırır. Herkese açık olan u kodlar
Arduino web sitesinde mevcut. Pitches.h adında yeni bir dosya oluşturmak için talimatları izleyin (alternatif olarak kodu mevcut komut dosyanızın içine yapıştırın).
Daha sonra, piezo üzerinde nota / melodi çalacak bir metoda ihtiyacınız var. Anthony DiGirolamo'nun Github'daki
paylaşımı, ihtiyacınız olan kodu içeriyor. "Void buzz” ve "}}” arasındaki her şeyi kopyalayın ve ana dosyanıza yapıştırın. Referans için, işte burada:
void buzz(int targetPin, long frequency, long length) {
/* Buzzer example function by Rob Faludi
https://gist.github.com/AnthonyDiGirolamo/1405180
long delayValue = 1000000/frequency/2; // calculate the delay value between transitions
//// 1 second's worth of microseconds, divided by the frequency, then split in half since
//// there are two phases to each cycle
long numCycles = frequency * length/ 1000; // calculate the number of cycles for proper timing
//// multiply frequency, which is really cycles per second, by the number of seconds to
//// get the total number of cycles to produce
for (long i=0; i < numCycles; i++){ // for the calculated length of time...
digitalWrite(targetPin,HIGH); // write the buzzer pin high to push out the diaphragm
delayMicroseconds(delayValue); // wait for the calculated delay value
digitalWrite(targetPin,LOW); // write the buzzer pin low to pull back the diaphragm
delayMicroseconds(delayValue); // wait again for the calculated delay value
İhtiyacınız olan son kütüphane kitaplık, 7 segment ekranı kontrol etmektir - bir tane kullanmıyorsanız bu adımı atlayabilirsiniz. Bu kütüphane TM1637 olarak adlandırılır ve sürücü kartını oluşturan aynı şirket Seeed tarafından yaratılmıştır.
Arduino IDE'de "Manage Libraries” e gidin (Sketch > Include Library > Manage Libraries). Bu kütüphane yöneticisini getirecektir. Güncellemesi için biraz bekleyin ve ardından sağ üst sağdaki arama bölümünde "TM1637” arayın . İki kütüphane bulunacaktır - "TM1637Display” değil "TM1637” bize lazım olan. Seçin ve ardından "yükle” ye tıklayın.
Bu kütüphane ile son görev tamamlanmadı! Kütüphane, yalnızca 0-9 sayılarını ve A – F harflerini görüntüleyebilir. Bu, görüntülemek istediğiniz her şeyi kapsıyorsa, bu adımı atlayabilirsiniz. Değilse, kodu değiştirmeniz gerekecektir. Rahatlayın! Bu göründüğü kadar zor değil ve Arduino IDE'yi kullanarak kod yazabilirseniz, bunu yapabilirsiniz.
İlk önce kütüphane klasörünüzü açın. Bu Arduino klasörünüzde olacak. TM1637 adlı klasörü açın. TM1637.cpp adlı dosyayı düzenlemeniz gerekecek - .h uzantılı diğer dosyayı güvenle yok sayabilirsiniz. Bu dosyayı tercih ettiğiniz metin düzenleyicide, Not Defteri'nde veya Arduino IDE'de açın.
Üçüncü kod satırında aşağıdaki bölümü
static int8_t TubeTab[] = {0x3f,0x06,0x5b,0x4f,
0x39,0x5e,0x79,0x71};//0~9,A,b,C,d,E,F
Aşağıdaki ile değiştirin.
static int8_t TubeTab[] = {
Şimdi bu dosyayı kaydedip kapatabilirsiniz. Her öğeden sonraki yorum bunun hangi karakter olduğunu açıklar. Yorumun sonraki kısmı, öğenin dizinidir.
Gerçek kodun zamanı geldi. İlk önce, daha önce belirtilen iki kütüphaneyi ekleyin:
Şimdi görüntüleme nesnesini oluşturun:
TM1637 *_display = new TM1637(12, 13);
Anlamadıysanız endişelenmeyin - bu satır Arduino'ya 12 ve 13 numaralı iğnelerin 7 segmentli bir ekrana eklendiğini ve uygun şekilde yapılandırıldığını söyler.
Şarkı "melody" ve "tempo"da saklanır. Bunlar müzikle ilgili tüm notaları içerir. Müziği değiştirmek istiyorsanız, bu dizileri değiştirin. "songState" değişkeni en son çalınan notun konumunu saklar. Bu, melodilerin tutarsız bir şekilde değişmesi yerine, baştan sona kadar çalınmasını sağlar.
Dizilerin içeriğini kaldırdığımı unutmayın, kodun tamamı için aşağıya bakın.
Bu kod engelleyici değildir - bu Arduino'nun aynı anda birden fazla işi yapabileceği anlamına gelir. Zamanlayıcılar şu şekilde kurulur.
unsigned long previousMillis1 = 0;
const long interval1 = 1500;
"previousMillis1" değişkeni, geçerli saati depolamak için sonraki bir aşamada güncellenecektir. "interval1" değişkeni, kod yürütme arasında ne kadar süre bekleneceğini barındırır- bu durumda, 1,5 saniye. Const olarak tanımlanır, bu sabit olduğu ve asla değişmeyeceği anlamına gelir - bu Arduino'nun kodu daha da optimize etmesini sağlar.
Setup () işlevi içinde devam eden birkaç şey var. İlk önce giriş ve çıkışlar ayarlanmıştır. Bu yapılmalı, böylece Arduino her bir pinine neyin bağlı olduğunu bilir.
pinMode(9, INPUT); // setup circuit
pinMode(10, OUTPUT); // setup buzzer 1
pinMode(11, OUTPUT); // setup buzzer 2
pinMode(2, INPUT); // setup button
Şimdi ekranın yapılandırılması gerekiyor.
_display->set(5); // set brightness
_display->point(false); // remove colon
_display->init(); // start display
Set, point ve init yöntemlerinin tümü _display nesnesinde bulunur. Nokta yerine, bunlara erişmek için bir işaretçi ("->”) kullanılır. Yine, sözdizimi hakkında endişelenmeyin.
Ana döngü iki oyun moduna sahiptir: zamanlı ve serbest oyun. Serbest oyun, oyuncunun sınırsız süre oynamasına izin verir. Challenge modu, "showCountdown" yöntemini kullanarak 20 saniye boyunca bir zamanlayıcı ayarlar. Zamanlayıcıyı başlatmak ve durdurmak için düğmeyi kullanır. şu anda, oyun modlarını değiştirmenin tek yolu "mod" denilen değişkeni manuel olarak düzenlemektir. Bunu yapmak için başka bir düğme ekleyip ekleyemeyeceğinize bakın ve kodu uygun şekilde değiştirin.
"Buzz" yöntemi kendisine verilen notaları çalar. Bu "sing" ile birlikte kullanılır. "sing" yöntemi notaları geçer ve çalar. Bu yöntem düzenli olarak adlandırılır, ancak yalnızca bir sonraki notayı son oyundan bu yana yeterli zaman geçtiğinde çalacaktır. Şarkı sona erdiğinde, şarkıyı 1. notaya sıfırlar (songState = 14). Başında şarkıyı başlatmak için bunu sıfıra ayarlayabilirsiniz, ancak bunu yapmanın nedeni girişi atlamaktır. Giriş, Arduino açıldıktan sonra bir kez çalınır ve tekrar çalmaz.
"ShowFree" ve "showPlay" yöntemleri "FrEE” ve "PLAY” kelimelerini ekrana yazar. Diğer tüm karakterler büyük harfken, "r" nin küçük olduğuna dikkat edin. Bu, yedi segmentli ekranın sınırlamalarından biridir. Alfabenin her harfini gösteremezler.
"ToggleFreePlay" yöntemi, ekranı "FREE” ve "PLAY” arasında yanıp söner. Yine, bunu engelleyici olmayan bir şekilde yapar.
Başka bir yararlı yöntem "showNumber"'dır. Bu, ekranın ortasındaki iki karaktere bir sayı yazar.
Ekran, büyük sayıları nasıl göstereceğini bilecek kadar akıllı değildir, ne yapılacağı açıkça belirtilmelidir. Bu yöntem, her karakterde uygun sayıyı göstermek için bazı basit mantık kullanır.
Kullanılan son yönteme "showCountdown" denir. Bu bir sayacı başlatır ve her saniyede bir azaltır. Bu sıfıra ulaşırsa, zamanın tükendiğini belirtmek için üç kez vızıldar.
İşte bütün bu kod bir araya getirilince aşağıdaki gibi olacak.
#include // include display library
#include
// include pitches
TM1637 *_display = new TM1637(12, 13); // create display object, 12 = CLK (clock), 13 = D10 (data)
NOTE_F4, NOTE_E4, NOTE_D4, NOTE_CS4,
NOTE_C4, NOTE_B3, NOTE_AS3, NOTE_A3,
NOTE_G3, NOTE_A3, NOTE_AS3, NOTE_A3,
NOTE_C4, NOTE_A3, NOTE_A3, NOTE_A3,
NOTE_GS3, NOTE_A3, NOTE_F4, NOTE_C4,
NOTE_C4, NOTE_A3, NOTE_AS3, NOTE_AS3,
NOTE_AS3, NOTE_C4, NOTE_D4, 0,
NOTE_AS3, NOTE_G3, NOTE_G3, NOTE_G3,
NOTE_FS3, NOTE_G3, NOTE_E4, NOTE_D4,
NOTE_D4, NOTE_AS3, NOTE_A3, NOTE_A3,
NOTE_A3, NOTE_AS3, NOTE_C4, 0,
NOTE_C4, NOTE_A3, NOTE_A3, NOTE_A3,
NOTE_GS3, NOTE_A3, NOTE_A4, NOTE_F4,
NOTE_F4, NOTE_C4, NOTE_B3, NOTE_G4,
NOTE_G4, NOTE_G4, NOTE_G4, 0,
NOTE_G4, NOTE_E4, NOTE_G4, NOTE_G4,
NOTE_FS4, NOTE_G4, NOTE_D4, NOTE_G4,
NOTE_G4, NOTE_FS4, NOTE_G4, NOTE_C4,
NOTE_B3, NOTE_C4, NOTE_B3, NOTE_C4, 0
unsigned long previousMillis1 = 0; // time words last changed
const long interval1 = 1500; // interval between changing
unsigned long previousMillis2 = 0; // time last changed
const long interval2 = 100; // interval between notes
int displayStatus = 0; // keep track of what's displayed
int mode = 0; // keep track of game mode -- change to 0 or 1 for different modes
unsigned long previousMillis3 = 0; // time last changed
const long interval3 = 1000; // interval between countdown
int count = 20; // challenge mode timer
// put your setup code here, to run once:
pinMode(9, INPUT); // setup circuit
pinMode(10, OUTPUT); // setup buzzer 1
pinMode(11, OUTPUT); // setup buzzer 2
pinMode(2, INPUT); // setup button
_display->set(5); // set brightness
_display->point(false); // remove colon
_display->init(); // start display
// put your main code here, to run repeatedly:
if(digitalRead(2) == HIGH) {
if(digitalRead(2) == HIGH) {
countdown = true; // stop the countdown
countdown = false; // stop the countdown
showCountdown(); // advance countdown
if(digitalRead(10) == HIGH) {
if(digitalRead(10) == HIGH) {
while(digitalRead(10) == HIGH) {
buzz(11, NOTE_B0, 1000/24);
// countdown the time remaining
unsigned long currentMillis = millis(); // current time
if (currentMillis - previousMillis3 >= interval3) {
previousMillis3 = currentMillis;
buzz(11, NOTE_B0, 1000/24);
buzz(11, NOTE_B0, 1000/24);
buzz(11, NOTE_B0, 1000/24);
void showNumber(int number) {
// show numbers (maximum 99) on display
_display->display(0, 25); // write - to segment 1
_display->display(3, 25); // write - to segment 4
// write number to middle of display
int newVal = number - 10;
_display->display(2, newVal);
_display->display(2,number);
// scroll between words without blocking
unsigned long currentMillis = millis(); // current time
if (currentMillis - previousMillis1 >= interval1) {
previousMillis1 = currentMillis;
// write "PLAY" to the display
_display->display(0, 21); // write P to segment 1
_display->display(1, 18); // write L to segment 2
_display->display(2, 10); // write A to segment 3
_display->display(3, 4); // write Y to segment 4
// write "Free" to the display
_display->display(0, 15); // write F to segment 1
_display->display(1, 23); // write r to segment 2
_display->display(2, 14); // write E to segment 3
_display->display(3, 14); // write E to segment 4
void buzz(int targetPin, long frequency, long length) {
/* Buzzer example function by Rob Faludi
https://gist.github.com/AnthonyDiGirolamo/1405180
long delayValue = 1000000/frequency/2; // calculate the delay value between transitions
//// 1 second's worth of microseconds, divided by the frequency, then split in half since
//// there are two phases to each cycle
long numCycles = frequency * length/ 1000; // calculate the number of cycles for proper timing
//// multiply frequency, which is really cycles per second, by the number of seconds to
//// get the total number of cycles to produce
for (long i=0; i < numCycles; i++){ // for the calculated length of time...
digitalWrite(targetPin,HIGH); // write the buzzer pin high to push out the diaphragm
delayMicroseconds(delayValue); // wait for the calculated delay value
digitalWrite(targetPin,LOW); // write the buzzer pin low to pull back the diaphragm
delayMicroseconds(delayValue); // wait again for the calculated delay value
// play the song in a non blocking way
unsigned long currentMillis = millis();
if (currentMillis - previousMillis2 >= interval2) {
previousMillis2 = currentMillis;
int noteDuration = 1000 / tempo[songState];
buzz(10, melody[songState], noteDuration);
int pauseBetweenNotes = noteDuration;
delay(pauseBetweenNotes);
// stop the tone playing:
buzz(10, 0, noteDuration);
// start song again if finished
songState = 14; // skip intro
Bu dosyayı "buzzwire” (Dosya> Farklı Kaydet) olarak kaydedin ve sonra panonuza yükleyin (Dosya> Yükle). Her şey yolunda, şimdi kendi vızıltı teli oyununa sahip olmalısınız - harika!
Bu projeyi yaptığınız zaman bizimle paylaşırsanız sosyal medya sayfalarımızda paylaşmaktan memnuniyet duyarız.
Kaynak : https://www.makeuseof.com/tag/make-buzz-wire-game-arduino/