Turinys:

„Guitar Hero Arduino“projektas: 12 žingsnių (su nuotraukomis)
„Guitar Hero Arduino“projektas: 12 žingsnių (su nuotraukomis)

Video: „Guitar Hero Arduino“projektas: 12 žingsnių (su nuotraukomis)

Video: „Guitar Hero Arduino“projektas: 12 žingsnių (su nuotraukomis)
Video: 8 Cool Arduino Science Projects 2024, Lapkritis
Anonim
Gitaros herojaus Arduino projektas
Gitaros herojaus Arduino projektas
Gitaros herojaus Arduino projektas
Gitaros herojaus Arduino projektas
Gitaros herojaus Arduino projektas
Gitaros herojaus Arduino projektas

Wij zijn Maarten Vrebos, Justin Cavanas ir Wannes Stroobandt bei studijuojame daugialypės terpės ir komunikacijos technologijas. Voor een groepsproject voor het vak Audiovisual & IT Principles hebben wij een Guitar Hero-gitaar gehackt en gebruikt als behuizing voor onze MIDI-controller. Het was onze bedoeling om de bestaande knoppen op de gitaar intern te vervangen. „Onze“valdiklis yra platus ir nemokamas. Aangezien we iets hebben gehackt hebben we er niet veel extra material in moeten verwerken.

In de afbeelding kan u onze allereerste schets op papier zien van hoe het eindproduct er zou moeten uitzien met daarnaast een photo van de gitaar die als behuizing zal worden gebruikt.

Wij hebben ons voor dit project gebaseerd op volgende bronnen:

slapyak.wordpress.com/guitar-hero-midi-con…

www.instructables.com/id/Converting-a-rescu…

gizmodo.com/391834/turn-your-guitar-hero-g…

Benodigdheden voor dit projektas

  • 6 klaine mygtukai
  • 7 1 khm rezistoriai
  • 1 geležies šviesos diodas 1
  • mėlynas šviesos diodas
  • 1 „Arduino Uno R3“
  • 1 šviesos diodas
  • 2 važiavo šviesos diodais
  • 1 schuifschakelaar
  • 1 duonos lenta
  • 1 potenciometras
  • 1 protobordas
  • 1 „Guitar Hero“gitara
  • Voldoende patalynė
  • Materiaal om te solderen/dremelen/
  • Schroevendraaier

1 žingsnis: „Componenten Verzamelen“

Verzamelen komponentas
Verzamelen komponentas

„Voor ons“prototipas (op breadboard), kurį mes įtraukėme į sudėtines dalis:

6 Mygtukai

7 1 khm rezistoriai

1 Geltonas šviesos diodas

1 mėlynas šviesos diodas

1 „Arduino Uno R3“

1 žalias šviesos diodas

2 Raudonas šviesos diodas

1 Schuifschakelaar

1 Duonos lenta

1 potenciometras

2 žingsnis: „Bouwen“prototipas

„Bouwen“prototipas
„Bouwen“prototipas
„Bouwen“prototipas
„Bouwen“prototipas
„Bouwen“prototipas
„Bouwen“prototipas

Om ons prototype te bouwen hebben we al onze komponenten gebruikt op een breadboard, deze breadboard dient dan als testobject zodat we niet meteen in de behuizing te werk moeten gaan. Išsiųskite prototipą, kurį mes žinosime, atliksime tinklinį tinkerkad.com tinklapį.

Čia yra 5 klavišų spaudimo mygtukai, kuriuos galima naudoti funkciniu būdu, taip pat 5 snaren en een grote pushbutton die in combinatie met één of meerdere 'snaren' moet worden ingedrukt om een auditief effect te krijgen. Įvairios LED lempos, skirtos kasdieniam naudojimui, taip pat visapusiškas valdymas, skirtas įvairiems interaktyviems veiksmams.

3 žingsnis: kodo prototipas

Kodo prototipas
Kodo prototipas

Globale variabelen

In the eerste deel van de code initialiseer je globale variabelen voor de pins van arduino uno waar alle pushbuttons mee verbonden zijn.

// zet PIN numeriai waar mainButton (snaar) en andere mygtukai aan verbonden zijn: const int mainButton = A1; // gitaar snaar const int lightSensor = A0; const int mygtukasPin1 = 2; // nummer van pushbutton1 const int mygtukasPin2 = 3; // nummer van pushbutton2const int mygtukasPin3 = 4; // nummer van pushbutton3const int buttonPin4 = 5; // nummer van pushbutton4const int mygtukasPin5 = 6; // nummer van pushbutton5

Hierna worden er twee arrays aangemaakt voor de namen van de pushbuttons en hun pinnummer.

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};

Yra įvairių šviesos diodų lempų kaiščių.

const int ledPin1 = 13; // šviesos diodo kaiščio numeris 13

const int ledPin2 = 12; // LED kaiščio skaičius 12 const int ledPin3 = 11; // LED kaiščio skaičius 11 const int ledPin4 = 10; // LED kaiščio skaičius 10 const int ledPin5 = 9; // LED kaiščio skaičius 9 const int potPin = A5; // šviesos diodo kaiščio A5 skaičius

De laatste globale variabelen dienen als 'state' voor de sensor (zijn de pushbuttons ingedrukt of niet? Potentiometer, lichtsensor).

// inicializavimo mygtukasStates voor de knoppen (ingedrukt of niet) int mainButtonState = 0; int mygtukasStatus1 = 0; int mygtukasStatus2 = 0; int mygtukasBūsena3 = 0; int mygtukasStatus4 = 0; int mygtukasBūsena5 = 0; int lightSensorState = 0; int potValue = 0; int lightValue = 0;

Sąranka

Nu volgt de void setup functie. Deze is van het type void (geeft geen waarde terug) ir instrukcijos hierin worden maar 1 keer uitgevoerd.

„Bij elke functie“yra komentaras, kuriame pateikiamas konkretus gedos žodis. Papildoma informacija apie tam tikrą funkciją „concreet doet“yra „te vinden in de arduino“nuoroda

void setup () {// duomenų perdavimo sparta per sekundę (baudas) voor seriele data transmissie Serial.begin (9600); // LEDPin inicijavimas kaip išvesties pinMode (ledPin1, OUTPUT); pinMode (ledPin2, OUTPUT); pinMode (ledPin3, OUTPUT); pinMode (ledPin4, OUTPUT); pinMode (ledPin5, OUTPUT); // pradinis visų mygtukų įvestis: pinMode (mainButton, INPUT); pinMode (buttonPin1, INPUT); pinMode (buttonPin2, INPUT); pinMode (buttonPin3, INPUT); pinMode (buttonPin4, INPUT); pinMode (buttonPin5, INPUT); pinMode (potPin, INPUT); pinMode („LightSensor“, „INPUT“); }

Tuščia funkcija

Na de setup () functie volgt de loop () functie, de instructies die hierin staan gaan herhaald uitgevoerd worden.

void loop () {// lees de staat van de pushbuttons uit (ingedrukt of niet) mainButtonState = digitalRead (mainButton); buttonState1 = digitalRead (buttonPin1); buttonState2 = digitalRead (buttonPin2); buttonState3 = digitalRead (buttonPin3); buttonState4 = digitalRead (buttonPin4); buttonState5 = digitalRead (buttonPin5);

// ale pushbutton statusen in een array

int buttonStates = {buttonState1, buttonState2, buttonState3, buttonState4, buttonState5};

// leest de waarde uit van de potentiometer en de lichtsensor

potValue = analogRead (potPin); lightValue = analogRead (lightSensor);

// deklaratorius ir masyvas mainStates en geef die de standaard waarden 0 in.

int mainStates = {0, 0, 0, 0, 0};

// kilpa per masyvą aantalKnoppen

for (int i = 0; i <aantalKnoppen; i ++) {pinMode (knopPinnen , INPUT); // inicializuoti visus knopPinnen als input digitalRead (knopPinnen ); // lees de waarde van alle knoppinnen uit // indien de mainswitch (snaar) ingedrukt is, print all knopnamen, alle buttonstates if (mainButtonState == HIGH) {Serial.print (namenKnoppen ); Serial.print (","); Serial.println (buttonStates ); }}

4 žingsnis: „Uittesten“prototipas

Negalima prototipas gebouwd yra daug modelių, o kodas geschreven yra apdorojamas. Vaizdo įrašas yra ne tik žinomas, bet ir žinomas, kaip reaguoti ir kaip jį valdyti.

„Tweede“vaizdo įraše pateikiamas potencialo matuoklis, naudojamas gitaroje ir apdorojimo procese.

5 žingsnis: „Ontmantelen“„Behuizing“en Kijken Welke Componenten Gebruikt Gaan Worden

Behuizing
Behuizing
Behuizing
Behuizing
Behuizing
Behuizing
Behuizing
Behuizing

Kaip ir teisingą kodo veikimo prototipą, mes pradėjome susitikti su „ontmantelen“van onze Guitar Hero-gitaar. Mes žinome, kad gitaras yra atviras, ir jis turi originalų komponentą. Norėdami tai padaryti, mes paspaudžiame mygtukus, esančius mygtukuose gekregen (zie volgende stap). We hebben de tremolo ook gebruikt voor ons eindproduct en voor onze hoofdbutton (initiële button om als een combinatie af te spelen) hebben we ook de originele twee button gebruikt (zie vierde foto). De LEDjes zullen verdwijnen (deze waren enkel ter indicatie zodat we zagen dat alle knoppen correct werkten).

6 žingsnis: „Werking Originele“mygtukai + „Dremelen“

„Werking Originele“mygtukai + „Dremelen“
„Werking Originele“mygtukai + „Dremelen“

Išskirtinis vaizdo įrašas yra tikroviškas, o ne originalus, o ne originalus, o ne originalus.

Om onze eigen buttons te verwerken in de originele knoppen hebben we de binnenkant van de originelen er grotendeels uitgehaald zoals te zien is op de photo.

7 žingsnis: Bedrading Solderen + Buttons Vastlijmen

Bedrading Solderen + Buttons Vastlijmen
Bedrading Solderen + Buttons Vastlijmen
Bedrading Solderen + Buttons Vastlijmen
Bedrading Solderen + Buttons Vastlijmen
Bedrading Solderen + Buttons Vastlijmen
Bedrading Solderen + Buttons Vastlijmen

Omdat we niet meer met een breadboard werken moeten de draden gesoldeerd worden om zo de verschillende komponentai met elkaar te verbinden. Nadat dit gebeurd is kunnen we de buttons vastlijmen zoals te zien is op de photos's. Eens dit gebeurd is kunnen we doorgaan naar de volgende stap.

8 žingsnis: „Plats Maken“De Behuizing

Plaats Maken De Behuizing
Plaats Maken De Behuizing
Plaats Maken De Behuizing
Plaats Maken De Behuizing
Plaats Maken De Behuizing
Plaats Maken De Behuizing

Omdat dit Guitar Hero-model redelijk krap was om mee te werken hebben we extra plaats moeten maken d.m.v. niūrus. Zo hebben we uit de achterkant van de gitaar een hele strook verwijderd zodat er meer plaats ontstaat voor de bedrading in gitaar. Išsamiau apie tai, kas nutiko, bet nesvarbu, ar reikia daugiau informacijos apie tai, ką reikia žinoti, ar ne? Op de vierde en vijfde photo is te zien dat we in de achterkant van de gitaar een doorgang hebben gecreëerd voor de draden die naar de buttons gaan omdat de gitaar anders niet meer te sluiten was. En op de laatste photo is te zien dat we de draden die rechtstreeks verbonden worden met met de Arduino door een gat in de onderkant van de gitaar de behuizing verlaten.

9 žingsnis: „Bedansing Aansluiten Op Protobord“

Nakvynė Aansluiten Op Protobord
Nakvynė Aansluiten Op Protobord
Nakvynė Aansluiten Op Protobord
Nakvynė Aansluiten Op Protobord
Nakvynė Aansluiten Op Protobord
Nakvynė Aansluiten Op Protobord
Nakvynė Aansluiten Op Protobord
Nakvynė Aansluiten Op Protobord

Om all componentsen met elkaar te verbinden hebben we gebruik gemaakt van een protobord. Tai yra borde datos savybės, skirtos tinklui, skirtam manierai, taip pat ir duonai, maar dan betrouwbaarder ir efektyvumui. We hebben de bedrading aan het bordje gesoldeerd zoals te zien is op de derde photo. Dit bord is het centrale punt van waaruit al onze verbindingen vertrekken en samenkomen (zie foto 2).

10 žingsnis: „Verstevigen“

Verstevigenas
Verstevigenas

Be to, baigiamasis prisilietimas yra verstandig om de losse delen te verstevigen voor extra stabiliteit. Op deze foto is te zien hoe we het deel dat we er hebben uitgehaald d.m.v. dremelen achteraan de buttons verstevigen met stukjes karton.

11 žingsnis: „Code Voor Het Communiceren Met Reaper“

„Code Voor Het Communiceren“susitiko su pjautuvu
„Code Voor Het Communiceren“susitiko su pjautuvu
„Code Voor Het Communiceren“susitiko su pjautuvu
„Code Voor Het Communiceren“susitiko su pjautuvu
„Code Voor Het Communiceren“susitiko su pjautuvu
„Code Voor Het Communiceren“susitiko su pjautuvu
„Code Voor Het Communiceren“susitiko su pjautuvu
„Code Voor Het Communiceren“susitiko su pjautuvu

„Deze“kodas yra įvestas „twee delen“, o vėliau - „de arduino IDE“(interaktyvios plėtros aplinka) geschreven. Įdiekite kodo žodį, įkelkite naar arduino zelf ir išmeskite visus stebėtus jutiklius, esančius vidiniame valdiklyje, kad galėtumėte apdoroti.

Apdorojimas atliekamas pagal gedimą. Deze code dient om alles wat arduino doortuurt te ontvangen en door te sturen naar Reaper.

Arduino

/* Šis kodas yra pagrindinis eskizas, skirtas bendrauti su apdorojimu per seriją.

Tai planas, kuriame galite įdėti savo kodą

nurodytas jūsų mygtukams, potenciometrams ar jutikliams.

Jis turi rankos paspaudimą, kad įsitikintume, jog turime kontaktą

ir nuspręsta, kokiu formatu mes bendraujame

Svarbu tą patį pranešimą kurti, kad apdorojimas žinotų, kaip jį dekonstruoti ir siųsti teisingus OSC pranešimus į mūsų DAW

sukurta darbiniam kolektyvui AV&IT

spalio 2017

*

/ sparta

const ilgas baudos greitis = 115200;

// laikas laukti ms tarp apklausų iki kaiščių

const int loopPauseTime = 200; // mili sekundės

// serialiniu būdu išsiųsto pranešimo pradžios ir pabaigos vertės

const String startString = "*", endString = "#";

const char contactCharacter = '|';

// PIN kodai

// kiti globalūs kintamieji

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;

// analoginiai jutikliai

const int potPin = A5; // pin voor tremolo

// Ši funkcija mums reikalinga norint užmegzti ryšį su apdorojimo eskizu

// Palikite jį čia void createContact () {while (Serial.available () <= 0) {Serial.print (contactCharacter); // atsiųsti char ir laukti atsakymo… delay (loopPauseTime); } Serial.read (); }

void setup () {

// nustatyti pinModes visiems kaiščiams (int i = 0; i <aantalKnoppen; i ++) {pinMode (knopPinnen , INPUT); } pinMode (mainButton, INPUT); // nekomentuokite, jei naudojate jutiklius, veikiančius ne 5 V, o 3 V įtampa // taip pat turėsite prijungti „išorinį“kaištį prie 3.3 V // analogReference (EXTERNAL);

// inicijuoti serijinius pranešimus

Serial.begin (baudRate); while (! Serial); // laukti rankos paspaudimo nustatytiContact (); }

void loop () {

// 1 ŽINGSNIS: SKAITYTI MYGTUKUS // apklausti visus kaiščius ir susieti rodmenis su atitinkamu intervalu int buttonStates [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); // pavyzdžiai: // float v0 = map (bpm, 0, 1023, 60, 250); // jei norite naudoti normalizuotą plūdę (pvz., tūriui) // float v1 = map (analogRead (pin2), fromMin, fromMax, 0, 100) / 100.0;

// 2 ŽINGSNIS: RAŠYTI PRANEŠIMĄ

Serial.print (startString); // pradėti pranešimų seką (int i = 0; i <aantalKnoppen; i ++) {if (mainButtonState == HIGH) {Serial.print (namenKnoppen ); Serial.print (","); Serial.print (buttonStates ); if (i <aantalKnoppen - 1) {Serial.print (","); }} else {buttonStates = 0; Serijinis atspaudas (namenKnoppen ); Serial.print (","); Serial.print (buttonStates ); if (i <aantalKnoppen - 1) {Serial.print (","); }}} Serial.print (","); Serial.print („tremolo“); Serial.print (","); Serial.print (žemėlapis (potValue, 0, 1023, 0, 100)); // parašykite pranešimo pabaigą Serial.print (endString);

// palauk truputi..

uždelsimas (loopPauseTime); }

Apdorojimas

Atsakomybės apribojimas: visas eskizo kodo apdorojimo eskizas, esantis geschreven, voor de volledige code zie het bestand: ProcessingSoundControl_handout_v6_1.pde in bijlage

De volgende instrukcijos moeten aangepast worden (indien nodig):

// Baudrate moet hetzelfde zijn zoals in de arduino eskizas

final int baudRate = 115200;

// Zoek naar het IP adresas pjovimo mašinoje (zie screenshots in bijlage)

// Apdorojamas stuurt naar dit andres en reaper luistert hier naar //

// final String remoteIP = "192.168.1.43"; // pvz. „127.0.0.1“;

final String remoteIP = "10.3.209.60";

// Atkreipkite dėmesį į „sendPort“ir užpildykite tai „Reaper“.

// Tai yra prievadas, į kurį siunčia apdorojimas ir kurio klauso „Reaper“.

galutinis int listenPort = 12000, sendPort = 12000;

// „ListenPort“čia yra aktyviai derinti.

// „PortNames“taip pat yra derinti.

// galutinis eilutės portName = "/dev/ttyACM0";

final String portName = "COM5"; // "/dev/ttyUSB0";

////////////////////// VARTOTOJO PARAMETRŲ PABAIGA //////////////////////// ////

importo apdorojimas.serijinis.*;

importuoti java.util.*;

importuoti oscP5.*;

importuoti netP5.*;

OscP5 oscP5;

„NetAddress myRemoteLocation“;

Serial commsPort; // Serijinis prievadas

loginis pranešimasArrived = false;

Įeinanti eilutė = "", IncomingOSCMessage = "";

final char startChar = '*', endChar = '#'; galutinis char contactCharacter = '|';

// Norėdami įsitikinti, kad siunčiame tik tuos parametrus (reikšmes), kurie keičiasi

// šie visuotiniai kintamieji yra surašyti čia, bet // jų negalima inicijuoti čia! HashMap oldParams, newParams, toSendParams;

// Mums reikia padalinti pranešimą prie kiekvieno kablelio

void processIncoming () {String resVec = gaunamas.skilimas (","); // mes gauname vardo+reikšmių poras // taigi kiekvienam vardui (+2)… pabandykite {dėl (int i = 0; i <resVec.length; i+= 2) {float value = Float.parseFloat (resVec [i+ 1]); // įdėti juos į naują hashtable newParams.put (resVec , vertė); }} // jei įvyksta klaida, sugaukime jos rodymą ir išeisime. catch (Exception ex) {println ("Išimties pranešimas:" + ex); printArray (resVec); išeiti (); }}

// Norėdami filtruoti mūsų pranešimus

/ * Mes įsitikiname, kad OSC išėjimo pranešimas yra tik tada, kai * pasikeičia įvesties pranešimas (serijinis) * Tai yra: jei pasuksime/paspausime mygtuką ir jis pakeis vertę. * Taigi mes išfiltruojame gaunamas vertes, kurios iš tikrųjų keičiasi „HashMap“(); for (String key: newParams.keySet ()) {// jei raktas jau yra, jei (oldParams.containsKey (key)) {// raktas yra ir reikšmė nėra ta pati, tada atnaujinkite, jei (! oldParams.get (key).equals (newParams.get (raktas))) {toSendParams.put (raktas, newParams.get (raktas)); }} else {// rakto senuose paramuose nėra, todėl padėkite! toSendParams.put (raktas, newParams.get (raktas)); } oldParams.put (raktas, newParams.get (raktas)); }}

void makeOSC () {

for (String key: toSendParams.keySet ()) {OscMessage myMessage = new OscMessage ("/"+ key); myMessage.add (toSendParams.get (raktas)); / * siųsti pranešimą */ oscP5.send (myMessage, myRemoteLocation); }}

void translateMessage () {

processIncoming (); filterParams (); makeOSC (); } // Kai norime spausdinti į langą void ShowIncoming () {// norėdami pamatyti gaunamą pranešimą, kaip nustatyta „HashMap“tekste („Incoming from Arduino“, 20, 20); int y = 20; for (Stygos raktas: newParams.keySet ()) {y = y+20; tekstas (raktas, 20, y); tekstas (newParams.get (raktas), 300, y); }}

void showOsc () {

tekstas („IncomingOSCMessage“, 300, 200); IncomingOSCMessage = ""; }

void setup () {

dydis (1000, 800); // Scenos dydžio užpildymas (255); fonas (0); oldParams = naujas HashMap (); newParams = naujas „HashMap“(); // printArray (Serial.list ()); commsPort = naujas serijinis (tai, prievado pavadinimas, baudos greitis);

/ * paleiskite oscP5, klausydamiesi gaunamų pranešimų */

oscP5 = naujas OscP5 (tai, klausytisPortas);

/* „myRemoteLocation“yra „NetAddress“. „NetAddress“turi 2 parametrus, * IP adresą ir prievado numerį.„myRemoteLocation“naudojama kaip parametras * oscP5.send () siunčiant osc paketus į kitą kompiuterį, įrenginį, * programą. naudojimą žr. žemiau. bandymo tikslais klausymosi prievadas * ir nuotolinės vietos adreso prievadas yra tas pats, todėl * siųsite pranešimus atgal į šį eskizą. */ myRemoteLocation = naujas NetAddress (remoteIP, sendPort); }

void draw () {

if (messageArrived) {background (0); translateMessage (); ShowIncoming (); messageArrived = false; } showOsc (); }

void serialEvent (Serial commsPort) {

// skaityti baitą iš nuoseklaus prievado: char inChar = commsPort.readChar (); switch (inChar) {case contactCharacter: commsPort.write (contactCharacter); // prašyti daugiau println ("pradedant …"); pertrauka; atvejis startChar: gaunamas = ""; pertrauka; case endChar: messageArrived = tiesa; // println ("žinutės pabaiga"); pertrauka; numatytasis: gaunamas += inChar; pertrauka; }}

/* gaunamas osc pranešimas persiunčiamas į oscEvent metodą. */

void oscEvent (OscMessage theOscMessage) {float value = theOscMessage.get (0).floatValue (); // gauti 1 osc argumentą

„IncomingOSCMessage“+= "\ n" +

String.format ("### gavo osc pranešimą:" + "addrpattern:" + theOscMessage.addrPattern () + ": %f", vertė); println („IncomingOSCMessage“); }

12 žingsnis: valdiklis „Uittesten“

Nu alles yra aangesloten, visas kodas yra geschreven en alles is gedubbelcheckt is het eindelijk tijd om de controller z'n werk te latten doen. Žaidimas „Reaper“ir „Guitar Hero MIDI Controller“genitalijų kūrimas yra genialus!

Rekomenduojamas: