Mundarija:
- 1 -qadam: Komponentlar
- 2 -qadam: Bouven prototipi
- 3 -qadam: Kod prototipi
- 4 -qadam: Uittesten prototipi
- 5 -qadam: "Ontmantelen" bilan shug'ullanish, Gebruikt Gaan Worden komponentlari
- 6 -qadam: "Originele" tugmachalarini bosish + Dremelen
- 7 -qadam: Laderen bedrading + Vastlijmen tugmalari
- 8 -qadam: De Behuizingda Makenning so'zlari
- 9 -qadam: Tushkunlik protokoli
- 10 -qadam: Verstevigen
- 11 -qadam: Kod Voor Het Communiceren Reaper bilan uchrashdi
- 12 -qadam: Uittesten boshqaruvchisi
Video: Gitara qahramoni Arduino loyihasi: 12 qadam (rasmlar bilan)
2024 Muallif: John Day | [email protected]. Oxirgi o'zgartirilgan: 2024-01-30 13:28
Maarten Vrebos, Jastin Kavanas va Vannes Strooband, biz multimediya va kommunikatsiya texnologiyalari bilan shug'ullanamiz. Audiovizual va IT tamoyillari, shuningdek, gitara qahramonlari, shuningdek, MIDI-boshqaruvchisiga ham tegishli. Haqiqatan ham, u stajirovkada o'qiyotgan edi. Tekshirish moslamasi juda keng tarqalgan. Qachonki, biz qo'shimcha ma'lumotlarga ega bo'lamiz.
Qachonki, siz har qanday mahsulotni ishlab chiqarishni rejalashtirgan bo'lsangiz, bu sizning rasmingiz va fotosuratingizni o'chirib tashlashga imkon beradi.
Loyihaning eng yaxshi varianti bu:
slapyak.wordpress.com/guitar-hero-midi-con…
www.instructables.com/id/Converting-a-rescu…
gizmodo.com/391834/turn-your-guitar-hero-g…
Benodigdheden ovoz berish loyihasi
- 6 kleine tugmachalari
- 7 1 kohmli rezistorlar
- 1 geli LED 1
- blauwe LED
- 1 Arduino Uno R3
- 1 dona LED
- 2 ta diodli LED
- 1 ta o'quvchi
- 1 ta non paneli
- 1 potansiyometr
- 1 protobord
- 1 gitara qahramoni gitara
- Voldoende yotqizish
- Sotish materiallari/dremelen/
- Schroevendraaier
1 -qadam: Komponentlar
Voor ons prototipi (op -taxtali) hebben biz komponentlarni yaratdik:
6 ta tugma
7 1 kohmli rezistorlar
1 ta sariq LED
1 ko'k LED
1 Arduino Uno R3
1 yashil LED
2 qizil LED
1 Schuifschakelaar
1 Non paneli
1 Potansiyometr
2 -qadam: Bouven prototipi
Biz prototipni bouwen hebben deb topdik, biz non panelida ham, non -taxtada ham sinovdan o'tamiz, biz o'zimizni xatti -harakatlarimiz bilan tanishamiz. Biz tinkercad.com orqali prototipni tanladik, biz esa bu prototipni juda yaxshi ko'rib chiqdik.
5 ta tugmani bosish tugmachalari, shuningdek, 5 ta tugmani bosish tugmachalari kombinatsiyasida o'lib ketganidan so'ng, "ovozni o'chirish" tugmachasini bosib o'tdi. LED-lampalar ham o'z-o'zidan nazorat qilinadi, chunki ular o'zaro ta'sir o'tkaza olmaydi.
3 -qadam: Kod prototipi
Globale o'zgaruvchan
Qachonki, bu kodni boshlanganda, bu sizning raqamlaringizni o'zgartirishga imkon beradi.
// zet pin raqamlari mainButton (snaar) en andere tugmachalari bir -biridan farq qiladi: const int mainButton = A1; // yorug'lik intensiari LightSensor = A0; const int buttonPin1 = 2; // raqamli tugmachalari1 const int buttonPin2 = 3; // raqamli tugmachalarni bosish2const int buttonPin3 = 4; // raqamli tugmachalari3const int tugmasiPin4 = 5; // raqamli tugmachalari4const int buttonPin5 = 6; // raqamli tugmacha 5
Tweed massivlari bir vaqtning o'zida tugmachalarni bosib o'tdi.
const int aantalKnoppen = 5; const String namenKnoppen [aantalKnoppen] = {"knop 1", "knop 2", "knop 3", "knop 4", "knop 5"}; const int knopPinnen [aantalKnoppen] = {2, 3, 4, 5, 6};
Bu erda LED yoritgichlari mavjud emas.
const int ledPin1 = 13; // LED pin 13 raqami
const int ledPin2 = 12; // LED pinining soni 12 const int ledPin3 = 11; // LED pinining soni 11 const int ledPin4 = 10; // LED pinining soni 10 const int ledPin5 = 9; // LED pinining soni 9 const int potPin = A5; // LED pin A5 soni
Shtatlarning sensorli signallari (potentsiometr, lichtsensor).
// initialiseer buttonStates yoki knoppen (niet ingrukt) int mainButtonState = 0; int tugmasiState1 = 0; int tugmasiState2 = 0; int tugmasiState3 = 0; int tugmasiState4 = 0; int tugmasiState5 = 0; int lightSensorState = 0; int potValue = 0; int lightValue = 0;
Sozlash
Void o'rnatish funktsiyasi yo'q. Bu void tipidagi void (geeft geen waarde terug) ni ko'rsatmalarni o'qib chiqqandan keyin 1 -o'rinni egallaydi.
Bu birinchi navbatda, sharhlar, biz o'z so'zlarimizni izohlaymiz. Functie concreet doet -da qo'shimcha ma'lumot olish mumkin, bu arduino ma'lumotnomasida.
void setup () {// sekundiga ma'lumot uzatish tezligi (ma'lumotlar uzatish) Serial.begin (9600); // pinMode (ledPin1, OUTPUT) ning chiqish parametrlarini o'zgartirish; pinMode (ledPin2, OUTPUT); pinMode (ledPin3, OUTPUT); pinMode (ledPin4, OUTPUT); pinMode (ledPin5, OUTPUT); // initialiseer alle pushbuttons als input: pinMode (mainButton, INPUT); pinMod (tugmaPin1, Kirish); pinMode (tugmaPin2, Kirish); pinMod (tugmaPin3, Kirish); pinMode (tugmaPin4, Kirish); pinMod (tugmaPin5, Kirish); pinMode (potPin, INPUT); pinMode (yorug'lik sensori, kirish); }
Bo'sh funktsiya
O'rnatish () funktsiyalari ham yuklanadi () funktsiyalar, ko'rsatmalar ham yomonlashadi.
void loop () {// lees de staat van de pushbuttons uit (ingliz tilida) mainButtonState = digitalRead (mainButton); buttonState1 = digitalRead (buttonPin1); buttonState2 = digitalRead (buttonPin2); buttonState3 = digitalRead (buttonPin3); buttonState4 = digitalRead (buttonPin4); buttonState5 = digitalRead (buttonPin5);
// barcha qatorlar tugmachalari bir qatorda
int buttonStates = {buttonState1, buttonState2, buttonState3, buttonState4, buttonState5};
// potentsiometr va de lichtsensor
potValue = analogRead (potPin); lightValue = analogRead (lightSensor);
// mainStates en geef die standaard waarden 0 dyuymni e'lon qiladi.
int mainStates = {0, 0, 0, 0, 0};
// aantalKnoppen qatori ustidan pastadir
uchun (int i = 0; i <aantalKnoppen; i ++) {pinMode (knopPinnen , INPUT); // boshlang'ich boshlang'ich knopPinnen als input digitalRead (knopPinnen ); // tugmachani bosib chiqarish // tugmachani bosib chiqarish, tugmachalarni bosish, agar (mainButtonState == HIGH) {Serial.print (namenKnoppen ); Serial.print (","); Serial.println (buttonStates ); }}
4 -qadam: Uittesten prototipi
Gebouwd prototipi geschreven kodli protsessor bo'lib, u prototipni qayta ishlashda ishlaydi. Videoko'rsatuvlar bir vaqtning o'zida bir vaqtning o'zida birlashtirilgan bo'lsa -da, ular birlashtiriladi.
Tvidda videotasvirni qayta ishlashda yomonlashib ketgan potentsiometr ham mavjud.
5 -qadam: "Ontmantelen" bilan shug'ullanish, Gebruikt Gaan Worden komponentlari
Qolaversa, prototip to'g'ri o'rnatilgan bo'lsa, biz gitara qahramonining "ontmantelen" ni topdik. Biz ochiq -oydin dasturlarni ishga tushirganimizda, biz ularni tekshirgich bilan bir vaqtda ochib qo'ydik. Biz bir vaqtning o'zida o'z tugmalarini bosamiz, ular tugmachalarni bosadi. Biz mahsulotni ishlab chiqarishni tugatgandan so'ng, biz mahsulotni ishlab chiqarishni tugatamiz (bu tugmachani birlashtirish uchun tugmani bosing), biz tugmachalarning tugmachalarini bosib chiqaramiz (rasmlar zie vierde). Yorug'lik manbalari (biz bu ma'lumotlarning to'g'riligini aniqlaymiz).
6 -qadam: "Originele" tugmachalarini bosish + Dremelen
Videoni ko'rsating, shunda siz o'zingizni qiziqtirgan narsalarga ega bo'lasiz.
Bu tugmachalarning asl nusxasi bizni asl nusxamizga aylantirib qo'ydi, biz ham sizdan o'zingizni qiziqtirgansiz.
7 -qadam: Laderen bedrading + Vastlijmen tugmalari
Umid qilamizki, biz nonvoyxonalar bilan bir qatorda, har bir narsani ko'rib chiqdik, lekin bu juda yaxshi. Nadat dit gebeurd is but kundunen biz tugmalarni keng ko'lamli zoals te zien is op de foto's. Qachonki, biz har bir narsani bir -biriga bog'lab qo'yamiz.
8 -qadam: De Behuizingda Makenning so'zlari
Gitara qahramonining modelini tanlash juda muhim edi, lekin biz qo'shimcha dasturlarni ishlab chiqarishni boshladik. dremelen. Bu erda biz hech qanday qiyinchiliklarga duch kelmaymiz, lekin biz ham siz bilan bog'lanishni xohlaymiz. Hamma narsa, albatta, biz o'zimizni xohlaganimizdek, biz ham o'lib ketamiz. Videoko'rsatuvlar bu erda ham tugmachalarni o'chirib tashlaganidan so'ng, biz hech qanday ma'lumotga ega bo'lmagandik. Rasmlar bizni qiziqtirmaydi, lekin biz bu erda ham Arduino eshiklarini yopib qo'yganmiz.
9 -qadam: Tushkunlik protokoli
Hamma komponentlar bir -biridan farqli o'laroq, biz protokoldan foydalanamiz. Ma'lumotlar uzluksiz o'chirilgan bo'lsa ham, bu non -bord, shuningdek, eng yaxshi natija beradi. Biz rasmlarni suratga olishdan bosh tortganimizdek, biz ham o'zimizni ko'rdik. Bu erda hamma narsa bir xil bo'lishi kerak (markaziy rasm 2).
10 -qadam: Verstevigen
Oxirgi tugatish - bu qo'shimcha barqarorlikdir. Ochiq foto - bu biz zerikmaysiz, lekin biz bu haqda o'ylaymiz. tugmachalari tugmachalari bilan tanishib chiqdik.
11 -qadam: Kod Voor Het Communiceren Reaper bilan uchrashdi
Deze kodi bir zumda ochiladi, birinchisi - IDE (interaktiv rivojlanish muhiti) da. Ma'lumotni qayta ishlashni o'chirish uchun kalit so'zni o'chirib qo'ying.
Qayta ishlov berish - bu juda yaxshi. Har bir narsani o'rab olgandan so'ng, u eshikni yopib qo'yadi.
Arduino
/* Bu kod ketma -ket ishlov berish bilan bog'lanish uchun asosiy eskizdir.
Bu o'zingizning kodingizni kiritishingiz mumkin bo'lgan reja
o'z tugmachalari, potansiyometrlari yoki sensorlar uchun belgilangan.
Biz bilan aloqada ekanligimizga ishonch hosil qilish uchun qo'l siqishdi
va biz qaysi formatda muloqot qilayotganimiz hal qilinadi
Xabarni shu tarzda tuzish juda muhim, Shunday qilib, Processing uni qanday qilib konstruktiv qilishni va DAWga to'g'ri OSC xabarlarini yuborishni biladi
werkcollege AV&IT uchun yaratilgan
2017 yil oktyabr
*
/ bod tezligi
const long baudRate = 115200;
// so'rovlar o'rtasida, kutish vaqti
const int loopPauseTime = 200; // milli soniya
// Serialda yuborilgan xabarning boshlanish va tugash qiymatlari
const String startString = "*", endString = "#";
const char contactCharacter = '|';
// pin identifikatorlari
// boshqa global o'zgaruvchilar
const int aantalKnoppen = 5; const String namenKnoppen [aantalKnoppen] = {"knop 1", "knop 2", "knop 3", "knop 4", "knop 5"}; const int knopPinnen [aantalKnoppen] = {2, 3, 4, 5, 6}; const int mainButton = A1;
int mainButtonState = 0;
int potValue = 0;
// analog sensorlar
const int potPin = A5; // pin trimolo
// Bizga ishlov berish eskizi bilan aloqa o'rnatish uchun bu funksiya kerak
// Bu erda voidni bo'sh qoldiring. // belgini yuboring va javobni kuting… kechiktirish (loopPauseTime); } Serial.read (); }
bo'sh o'rnatish () {
// barcha pinlar uchun pinModlarni o'rnating (int i = 0; i <aantalKnoppen; i ++) {pinMode (knopPinnen , INPUT); } pinMode (mainButton, INPUT); // 5V o'rniga 3V ishlaydigan datchiklardan foydalansangiz, izoh bermang // siz "ext" pinini 3.3V ga ulashingiz kerak bo'ladi // analogReference (EXTERNAL);
// Serial xabarlarni ishga tushirish
Serial.begin (baudRate); while (! Seriyali); // qo'l siqishni kuting installContact (); }
void loop () {
// 1 -QADAM: O'QISH TUGMALARI // barcha pimlarni so'roq qilib, o'qishni tegishli tugmachaga int tugatishStates [aantalKnoppen]; /* buttonStates [0] = digitalRead (knopPinnen [0]); buttonStates [1] = digitalRead (knopPinnen [1]); buttonStates [2] = digitalRead (knopPinnen [2]); buttonStates [3] = digitalRead (knopPinnen [3]); buttonStates [4] = digitalRead (knopPinnen [4]); */ mainButtonState = digitalRead (mainButton); for (int i = 0; i <aantalKnoppen; i ++) {buttonStates = digitalRead (knopPinnen ); } potValue = analogRead (potPin); // misollar: // float v0 = xarita (bpm, 0, 1023, 60, 250); // agar siz normallashtirilgan floatni ishlatmoqchi bo'lsangiz (masalan, hajm uchun) // float v1 = map (analogRead (pin2), fromMin, fromMax, 0, 100) / 100.0;
// 2 -QADAM: XABAR YOZISH
Serial.print (startString); // xabarlar ketma -ketligini boshlang (int i = 0; i <aantalKnoppen; i ++) {if (mainButtonState == HIGH) {Serial.print (namenKnoppen ); Serial.print (","); Serial.print (buttonStates ); if (i <aantalKnoppen - 1) {Serial.print (","); }} boshqa {buttonStates = 0; Serial.print (namenKnoppen ); Serial.print (","); Serial.print (buttonStates ); if (i <aantalKnoppen - 1) {Serial.print (","); }}} Serial.print (","); Serial.print ("tremolo"); Serial.print (","); Serial.print (xarita (potValue, 0, 1023, 0, 100)); // xabarning oxirini yozing Serial.print (endString);
// biroz kuting..
kechikish (loopPauseTime); }
Qayta ishlanmoqda
Ogohlantirishlardan voz kechish: kodni qayta ishlash eskizlari, shuningdek, eng yaxshi: ProcessingSoundControl_handout_v6_1.pde bijlage
Yo'qotilgan ko'rsatmalar (hind nodig):
// Baudrate moet hetzelfde zijn zoals in de arduino eskizida
final int baudRate = 115200;
// O'roqdagi IP manzili
// Stuurt naar dit andres en reaper luistert hier naar ishlov berish //
// final String remoteIP = "192.168.1.43"; // masalan. "127.0.0.1";
final String remoteIP = "10.3.209.60";
// sendPort -ga e'tibor bering va uni Reaper -da to'ldiring.
// Bu ishlov berish portiga yuboriladi va O'roqchi tinglaydi.
final int listenPort = 12000, sendPort = 12000;
// ListPort bu erda faol ravishda disk raskadrovka qilinadi.
// port nomlari bu erda disk raskadrovka uchun.
// yakuniy String portName = "/dev/ttyACM0";
yakuniy String portName = "COM5"; // "/dev/ttyUSB0";
///////////////////////////////// Foydalanuvchi parametrlarining oxiri ///////////////////////// ////
importni qayta ishlash.serial.*;
java.util import qilish.*;
import oscP5.*;
netP5 import qilish*.
OscP5 oscP5;
NetAddress myRemoteLocation;
Serial commsPort; // Seriya porti
boolean messageArrived = false;
Kiruvchi satr = "", IncomingOSCMessage = "";
yakuniy char startChar = '*', endChar = '#'; final char contactCharacter = '|';
// Biz faqat o'zgaradigan parametrlarni (qiymatlarni) yuborishimizga ishonch hosil qilish uchun
// bu global o'zgaruvchilar bu erda o'chiriladi, lekin // bu erda boshlanmasligi kerak! HashMap oldParams, newParams, toSendParams;
// Biz xabarni har bir vergulga bo'lishimiz kerak
void processIncoming () {String resVec = incoming.split (","); // biz ism+qiymat juftlarini olamiz // shuning uchun har bir nom uchun (+2)… harakat qilib ko'ring {for (int i = 0; i <resVec.length; i+= 2) {float value = Float.parseFloat (resVec [i+) 1]); // ularni yangi Hashtable newParams.put -ga qo'ying (resVec , qiymati); }} // agar xatolik yuz bersa, keling uni ko'rsatamiz va chiqamiz. catch (Exception ex) {println ("Istisno xabari:" + ex); printArray (resVec); Chiqish(); }}
// Xabarlarimizni filtrlash uchun
/ * Biz * kirish xabari (ketma-ket) o'zgarganda * faqat OSC-dan chiqib ketadigan xabar borligiga ishonch hosil qilamiz. * Shunday qilib, biz aslida o'zgaradigan kiruvchi qiymatlarni filtrlaymiz. HashMap (); for (String key: newParams.keySet ()) {// agar kalit allaqachon mavjud bo'lsa (oldParams.containsKey (key)) {// kalit mavjud bo'lsa va qiymati bir xil bo'lmasa, agar (! oldParams.get (key)). equals (newParams.get (key))) {toSendParams.put (key, newParams.get (key))); }} else {// kaliti eski parametrlarda mavjud emas, shuning uchun! toSendParams.put (kalit, newParams.get (kalit)); } oldParams.put (kalit, newParams.get (kalit)); }}
yaroqsiz makeOSC () {
for (String key: toSendParams.keySet ()) {OscMessage myMessage = yangi OscMessage ("/"+ tugma); myMessage.add (toSendParams.get (kalit)); / * xabar yuborish */ oscP5.send (myMessage, myRemoteLocation); }}
void translateMessage () {
processIncoming (); filterParams (); makeOSC (); } // HashMap matnida ko'rsatilganidek, kiruvchi xabarni ko'rish uchun ShowIncoming () {// oynasiga bosmoqchi bo'lsak ("Arduino -dan kelganlar", 20, 20); int y = 20; for (String key: newParams.keySet ()) {y = y+20; matn (kalit, 20, y); matn (newParams.get (key), 300, y); }}
void showOsc () {
matn (IncomingOSCMessage, 300, 200); IncomingOSCMessage = ""; }
bo'sh o'rnatish () {
hajmi (1000, 800); // Bosqichlar hajmini to'ldirish (255); fon (0); oldParams = yangi HashMap (); newParams = yangi HashMap (); // printArray (Serial.list ()); commsPort = yangi Serial (bu, portName, baudRate);
/ * oscP5 -ni ishga tushiring, kiruvchi xabarlarni tinglang */
oscP5 = yangi OscP5 (bu, listenPort);
/* myRemoteLocation - bu NetAddress. NetAddress 2 parametrni oladi, * IP -manzil va port raqami.myRemoteLocation * oscP5.send () da osc paketlarini boshqa kompyuterga, qurilmaga, * ilovaga yuborishda parametr sifatida ishlatiladi. foydalanish quyida qarang. sinov maqsadida tinglash porti * va manzil manzili bir xil, shuning uchun siz * eskizga xabar yuborasiz. */ myRemoteLocation = yangi NetAddress (remoteIP, sendPort); }
bekor chizish () {
if (messageArrived) {fon (0); translateMessage (); ShowIncoming (); messageArrived = false; } ko'rsatishOsc (); }
bekor serialEvent (Serial commsPort) {
// ketma -ket portdan bayt o'qing: char inChar = commsPort.readChar (); switch (inChar) {case contactCharacter: commsPort.write (contactCharacter); // ko'proq println so'rang ("boshlanmoqda …"); tanaffus; case startChar: kiruvchi = ""; tanaffus; case endChar: messageArrived = true; // println ("xabarning oxiri"); tanaffus; standart: kiruvchi += inChar; tanaffus; }}
/* kiruvchi osc xabari oscEvent usuliga yuboriladi. */
void oscEvent (OscMessage theOscMessage) {float qiymati = theOscMessage.get (0).floatValue (); // birinchi osc argumentini oling
IncomingOSCMessage += "\ n" +
String.format ("### osc xabarini oldi:" + "addrpattern:" + theOscMessage.addrPattern () + ": %f", qiymati); println (IncomingOSCMessage); }
12 -qadam: Uittesten boshqaruvchisi
Nu alles - bu hamma narsa, hamma narsa - bu geschreven en alles - bu ketubbelcheckt - bu har bir narsani tekshiruvchi va boshqaruvchi. O'qish va o'rash uchun eng yaxshi variant - bu gitara qahramoni MIDI boshqaruvchisi!
Tavsiya:
Gitara qahramoni Arduino bilan: 4 qadam
Gitara qahramoni Arduino bilan: Arduino foydalanuvchilarga xohlagan narsalarini oz miqdordagi kod yordamida sozlash imkonini beradi. Men sozlanishi tezlik, ovoz balandligi va bir nechta o'yin rejimiga ega bo'lgan gitara qahramoni o'yinini ishlab chiqishga qaror qildim. Loyihada 3 ta AA batareyasi ham ishlashi mumkin
Gitara qahramoni gitara uzilishi: 5 qadam (rasmlar bilan)
Gitara qahramoni gitara uzilib qolgan tuzatish: Shunday qilib, siz ebaydan yangi ishlatilgan gitara qahramon gitarasini sotib oldingiz va u sizga kelganida u USB ulagichiga ulanmagan bo'lardi, shuning uchun siz 30 va evroni behuda sarf qildingiz deb o'ylaysiz; drenajdan pastga. Ammo tuzatish bor va bu tuzatish, ehtimol, ishlaydi
Gitara qahramoni kloni: 7 qadam (rasmlar bilan)
Guitar Hero Clone: Siz hech qachon o'z uyingizda ishlab chiqarilgan gitara bilan kompyuteringizda gitara qahramonini chalishni xohlaganmisiz? 10 dollardan kamroq pul to'lashga va biroz sabr qilishga tayyor bo'ling
Epik! Gitara qahramoni - ikki bo'yinli gitara Muvaffaqiyatsiz: 7 qadam (rasmlar bilan)
Epik! Gitara qahramoni - Ikki bo'yinli gitara … Muvaffaqiyatsiz: 2015 yil pop -madaniyat fenomeni Gitara Qahramonining 10 yilligini nishonlamoqda. Esingizdami, video o'yini musiqiy asbobdan ko'ra ko'proq mashhur bo'lib, unga taqlid qila olmadi? O'n yillik yubileyini nishonlashdan ko'ra yaxshiroq nima
OpenChord.org V0 - Haqiqiy gitara gitara qahramoni/rok guruhi boshqaruvchisini yarating: 10 qadam
OpenChord.org V0 - Haqiqiy gitara gitara qahramoni/rok guruhi boshqaruvchisini yarating: Biz hammamiz gitara qahramoni va rok guruhini yaxshi ko'ramiz. Biz bilamizki, biz hech qachon bu o'yinlarda gitarada chalishni o'rganmaymiz. Ammo, agar biz hech bo'lmaganda haqiqiy gitara ishlatishga imkon beradigan gitara qahramoni boshqaruvchisini qura olsak nima bo'ladi? Biz OpenChord -da bu shunday