Mundarija:

Gitara qahramoni Arduino loyihasi: 12 qadam (rasmlar bilan)
Gitara qahramoni Arduino loyihasi: 12 qadam (rasmlar bilan)

Video: Gitara qahramoni Arduino loyihasi: 12 qadam (rasmlar bilan)

Video: Gitara qahramoni Arduino loyihasi: 12 qadam (rasmlar bilan)
Video: Mohamadreza ebadi.ina mikhan.... 2024, Iyul
Anonim
Gitara qahramoni Arduino loyihasi
Gitara qahramoni Arduino loyihasi
Gitara qahramoni Arduino loyihasi
Gitara qahramoni Arduino loyihasi
Gitara qahramoni Arduino loyihasi
Gitara qahramoni Arduino loyihasi

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

Tarkibiy komponentlar
Tarkibiy 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

Bouwen prototipi
Bouwen prototipi
Bouwen prototipi
Bouwen prototipi
Bouwen prototipi
Bouwen 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

Kod prototipi
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

Behuizing
Behuizing
Behuizing
Behuizing
Behuizing
Behuizing
Behuizing
Behuizing

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

Werking Originele tugmalari + Dremelen
Werking Originele tugmalari + 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

Yotadigan lehim + Vastlijmen tugmalari
Yotadigan lehim + Vastlijmen tugmalari
Yotadigan lehim + Tugmalar Vastlijmen
Yotadigan lehim + Tugmalar Vastlijmen
Yotadigan lehim + Vastlijmen tugmalari
Yotadigan lehim + 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

De Behuizingda Makenning so'zlari
De Behuizingda Makenning so'zlari
De Behuizingda Makenning so'zlari
De Behuizingda Makenning so'zlari
De Behuizingda Makenning so'zlari
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

Tushkunlikka qarshi Aansluiten Protobord
Tushkunlikka qarshi Aansluiten Protobord
To'shakni tozalash Aansluiten op Protobord
To'shakni tozalash Aansluiten op Protobord
To'shakni tozalash Aansluiten op Protobord
To'shakni tozalash Aansluiten op Protobord
To'shakni tozalash Aansluiten op Protobord
To'shakni tozalash Aansluiten op Protobord

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

Verstevigen
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

Code Voor Het Communiceren Reaper bilan uchrashdi
Code Voor Het Communiceren Reaper bilan uchrashdi
Code Voor Het Communiceren Reaper bilan uchrashdi
Code Voor Het Communiceren Reaper bilan uchrashdi
Code Voor Het Communiceren Reaper bilan uchrashdi
Code Voor Het Communiceren Reaper bilan uchrashdi
Code Voor Het Communiceren Reaper bilan uchrashdi
Code 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: