Sadržaj:

Arduino projekt Guitar Hero: 12 koraka (sa slikama)
Arduino projekt Guitar Hero: 12 koraka (sa slikama)

Video: Arduino projekt Guitar Hero: 12 koraka (sa slikama)

Video: Arduino projekt Guitar Hero: 12 koraka (sa slikama)
Video: Робот-бот на Arduino своими руками. Для игры Guitar Hero. (PCBWay) 2024, Juli
Anonim
Arduino projekt Guitar Hero
Arduino projekt Guitar Hero
Arduino projekt Guitar Hero
Arduino projekt Guitar Hero
Arduino projekt Guitar Hero
Arduino projekt Guitar Hero

Wij zijn Maarten Vrebos, Justin Cavanas i Wannes Stroobandt i studente multimedijalna i komunikacijska tehnologija. Za jedan veliki projekt za audiovizuelne i IT principe koristite Guitar Hero-gitaar gehackt i gebruikt za bilo koji MIDI kontroler. Het was onze bedoeling om de bestaande knoppen op de gitaar intern te vervangen. Onze kontroler zal widegehouden en bespeeld worden als een normale gitaar. Aangezien we iets hebben gehackt hebben we er niet veel extra materialal in moeten verwerken.

U nastavku možete pronaći sve bolje sheme na papiru koji su prikazani kao eindprodukt jer ste moeten uitzien met daarnaast i fotografiju 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 za ovaj projekat

  • 6 kleine tastera
  • 7 1kohm otpornika
  • 1 LED dioda 1
  • blauwe LED
  • 1 Arduino Uno R3
  • 1 sijalica LED
  • 2 LED diode
  • 1 schuifschakelaar
  • 1 osnova
  • 1 potenciometar
  • 1 protobord
  • 1 Guitar Hero gitaar
  • Voldoende bedrading
  • Materijal om te solderen/dremelen/
  • Schroevendraaier

Korak 1: Komponenta Verzamelen

Componenten Verzamelen
Componenten Verzamelen

Za vaš prototip (op. Ploču) upotrijebite komponente sa sljedećim sastavom:

6 tastera

7 1kohm otpornika

1 Žuta LED

1 plava LED dioda

1 Arduino Uno R3

1 zelena LED dioda

2 Crvena LED

1 Schuifschakelaar

1 Breadboard

1 Potenciometar

Korak 2: Prototip Bouwen

Prototip Bouwen
Prototip Bouwen
Prototip Bouwen
Prototip Bouwen
Prototip Bouwen
Prototip Bouwen

Svi oni prototipi koji su sadržani u sastavljanju komponenti koji stvaraju opštu ploču, postojeću matičnu ploču, kao i testobjekt, ne smiju nas podržati u radu. Na prototipu smo izradili gedigitaliseerd putem tinkercad.com, ali nismo htjeli pronaći više protokola na prototipu da bismo bili sigurni da je potrebno.

Ako pritisnete 5 kleine tastera, dodirnite fungeren ili 5 klika i pritisnite taster die u kombinaciji sa meerdere "snaren" mojom jedinicom za dodavanje efekta. Svetleće LED-lampe su opremljene gewoon-om i kontrolišu kontrolu nad zeker-om kako bi uspjele interakciju.

Korak 3: Prototip koda

Kodni prototip
Kodni prototip

Globale variabelen

In het eerste deel van de code initialiseer is globale variabelen for or pins van arduino uno waar allbuttons mee verbonden zijn.

// zet pin brojevi waar mainButton (snaar) i ostali gumbi i verbonden zijn: const int mainButton = A1; // gitaar snaar const int lightSensor = A0; const int buttonPin1 = 2; // broj van pushbutton1 const int buttonPin2 = 3; // broj van pushbutton2const int buttonPin3 = 4; // broj van pushbutton3const int buttonPin4 = 5; // broj tastera 4const int buttonPin5 = 6; // broj tipke van van5

To znači da su twee nizovi prilagođeni za namjenu pritiskanja tipki i brojčanika.

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

I nove varijante za pinove sa LED dioda.

const int ledPin1 = 13; // broj LED pina 13

const int ledPin2 = 12; // broj LED pina 12 const int ledPin3 = 11; // broj LED pina 11 const int ledPin4 = 10; // broj LED pina 10 const int ledPin5 = 9; // broj LED pina 9 const int potPin = A5; // broj LED pina A5

Globalne varijable promjenjivih stanja država za senzore (pritisnuti tipke koje se nalaze na potenciometru, lichtsensor).

// Initialiseer buttonStates voor de knoppen (ingetrukt of niet) int mainButtonState = 0; int buttonState1 = 0; int buttonState2 = 0; int buttonState3 = 0; int buttonState4 = 0; int buttonState5 = 0; int lightSensorState = 0; int potValue = 0; int lightValue = 0;

Postaviti

Nu voltt de void setup functie. Deze je van het type void (geeft geen waarde terug) en de instructions hierin worden maar 1 keer uitgevoerd.

Bij elke functie je komentarisan, ako je konkretan. Dodatni dodatak iznad specificirane funkcionalne betonske boje je vinden u de arduino referenci

void setup () {// brzina prijenosa podataka u sekundi (baud) za prijenos podataka po serijalu Serial.begin (9600); // Initialiseer de ledPin varira kao izlaz pinMode (ledPin1, OUTPUT); pinMode (ledPin2, OUTPUT); pinMode (ledPin3, OUTPUT); pinMode (ledPin4, OUTPUT); pinMode (ledPin5, OUTPUT); // inicijalizator svih tastera als input: pinMode (mainButton, INPUT); pinMode (buttonPin1, INPUT); pinMode (buttonPin2, INPUT); pinMode (buttonPin3, INPUT); pinMode (buttonPin4, INPUT); pinMode (buttonPin5, INPUT); pinMode (potPin, INPUT); pinMode (lightSensor, INPUT); }

Void functie

Na setup () funkciji uključite petlju () functie, uputstva su vam na raspolaganju staan gaan herhaald uitgevoerd worden.

void loop () {// prikazuje stanje tipki uit (ingedrukt of niet) mainButtonState = digitalRead (mainButton); buttonState1 = digitalRead (buttonPin1); buttonState2 = digitalRead (buttonPin2); buttonState3 = digitalRead (buttonPin3); buttonState4 = digitalRead (buttonPin4); buttonState5 = digitalRead (buttonPin5);

// svi statusen tipke u een nizu

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

// najmanji napon sa potenciometrom i senzorom senzora

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

// deklarira een array mainStates en geef die de standaard waarden 0 in.

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

// petlja preko niza aantalKnoppen

for (int i = 0; i <aantalKnoppen; i ++) {pinMode (knopPinnen , INPUT); // inicijalizator za sve knopPinnen kao ulaz digitalRead (knopPinnen ); // preusmjeravamo sve stavke koje se ne primjenjuju // indien de mainswitch (snaar) ingedrukt is, ispisuje sve knopnamen, sve buttontates if (mainButtonState == HIGH) {Serial.print (namenKnoppen ); Serial.print (","); Serial.println (buttonStates ); }}

Korak 4: Prototip Uittesten

Nadat het prototype gebouwd is volgens ons model and de code geschreven in Processing, is het tijd om het prototype in the testen. Op de video is te zien dat alle knoppen een reactie geven op de bijhorende ledjes en dat ook combinaties van knoppen mogelijk zijn.

U tweede videu je prikazano kako se pokreće tremolo, a ručno se nalazi potenciometar, a gitara je uklonjena i obrađena u procesu obrade.

Korak 5: Behuizing "ontmantelen" En Kijken Welke komponenta Gebruikt Gaan Worden

Behuizing
Behuizing
Behuizing
Behuizing
Behuizing
Behuizing
Behuizing
Behuizing

Ako je kôd ispravan, prototip je počeo sa sastavljanjem "omantile" van Guitar Hero-gitare. Mi smo napravili gitaar otvoreni mehanizam i provjerili smo da li su originalne komponente sastavni dio našeg eventueel nog zouden kunnen hergebruiken za onze kontroler. Molimo vas da uključite sopstvene tastere u dekretne tastere (zie volgende stap). Hebben de tremolo ook gebruikt for ons eindproduct en voor onze hoofdbutton (početno dugme za sve kombinacije nakon toga) hebben we ook de originele twee button gebruikt (zie vierde foto). De LEDjes zullen verdwijnen (deze waren enkel ter indicatie zodat we zagen dat all knoppen correct werkten.

Korak 6: Dugmad za rad Originele + Dremelen

Radni gumbi Originele + Dremelen
Radni gumbi Originele + Dremelen

Op de bijhorende video is de wijze te zien waarop from twee originele knoppen werken als een soort van schakelaar die wij gebruiken om een effect te genereren bij combinatie van knoppen.

Vlastita dugmad koja su izvorno postavljena i originalno su napisana u originalnoj verziji su originalni i mogu se koristiti samo za fotografije.

Korak 7: Spavaća soba Bedrading + 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 motherboard werken moeten de draden gesoldeerd worden om zo de verchillende components sa elkaar te verbinden. Nadat dit gebeurd is kunnen we de dugmad ogromne zoal te zien is op de foto's. Eens dit gebeurd is kunnen we doorgaan naar de volgende stap.

Korak 8: Pločice izrađene u De Behuizingu

Pločice izrađene u De Behuizingu
Pločice izrađene u De Behuizingu
Pločice izrađene u De Behuizingu
Pločice izrađene u De Behuizingu
Pločice izrađene u De Behuizingu
Pločice izrađene u De Behuizingu

Omdat dit Guitar Hero-model redelijk krap was om mee te werken hebben we extra plaats moeten maken d.m.v. dremelen. Zo hebben we uit de achterkant van de gitaar een hele strook verwijderd zodat er meer plaats onntstaat voor de bedrading in de gitaar. Omdat er overal in de binnenkant prepreke waren, waaronder veel buisjes om de vijzen in te bevestigen, hebben we die ook verwijderd om optimaal van de gegeven ruimte gebruik te kunnen maken. Op de vierde en vijfde foto is te zien da we in de achterkant van de gitaar een doorgang hebben gecreëerd voor de draden die naar de button gaan omdat de gitaar anders niet meer te sluiten was. En op de laatste foto is te zien dat we de draden die rechtstreeks verbonden worden met de Arduino door een gat in de onderkant van de gitaar de behuizing verlaten.

Korak 9: Bedrading Aansluiten Op Protobord

Bedrading Aansluiten Op Protobord
Bedrading Aansluiten Op Protobord
Bedrading Aansluiten Op Protobord
Bedrading Aansluiten Op Protobord
Bedrading Aansluiten Op Protobord
Bedrading Aansluiten Op Protobord
Bedrading Aansluiten Op Protobord
Bedrading Aansluiten Op Protobord

Sve komponente sastavljene od verbinden hebben we gebruik gemaakt van een protobord. To je een bordje dat eigenlijk op net dezelfde manier werkt als een breadbord, maar dan betrouwbaarder en efficiënter. We hebben de bedrading aan het bordje gesoldeerd zoals te zien is op de derde foto. Ovo mjesto je središnje mjesto gdje se nalazi putokaz sa sjedištem (slika 2).

Korak 10: Verstevigen

Verstevigen
Verstevigen

Završni dodir je i njegova potpuna stabilnost. Op deze foto is te zien hoe we het deel dat we er hebben uitgehaald d.m.v. dremelen achteraan de button verstevigen met stukjes karton.

Korak 11: Kôd za komunikaciju sa metrom

Šifra Za Het Communiceren Met Reaper
Šifra Za Het Communiceren Met Reaper
Šifra Za Het Communiceren Met Reaper
Šifra Za Het Communiceren Met Reaper
Šifra Za Het Communiceren Met Reaper
Šifra Za Het Communiceren Met Reaper
Šifra Za Het Communiceren Met Reaper
Šifra Za Het Communiceren Met Reaper

Deze kôd je optedeeld u dva delena, ali je deer u arduino IDE (interaktivno razvojno okruženje). Ovaj kôd će se učitati na arduino zelf jedinstven način za sve vanjske senzore van midi kontrolera koji se nalaze na vratima na prirodnoj obradi.

Obrada je izrađena od tweede gedeelte. Ovaj kôd je dostupan svim arduinskim vratima na otvorenom i na vratima žetve.

Arduino

/* Ovaj kod je osnovna skica za komunikaciju sa Obrada putem serijskog broja.

To je nacrt u koji možete staviti vlastiti kôd

specificirano za vaše vlastite tipke, potenciometre ili senzore.

Ima rukovanje kako bi bili sigurni da imamo kontakt

i odlučuje se o formatu u kojem komuniciramo

Važno je konstruirati poruku na ovaj način, tako da Processing zna kako ga dekonstruirati i poslati ispravne OSC-poruke našem DAW-u

napravljeno za werkcollege AV&IT

oktobra 2017

*

/ brzina prijenosa

const long baudRate = 115200;

// vreme za čekanje u ms između anketa za pinove

const int loopPauseTime = 200; // mili sekundi

// početne i završne vrijednosti za poruku poslanu na Serial

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

const char contactCharacter = '|';

// pin ID -ovi

// druge globalne varijable

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;

// analogni senzori

const int potPin = A5; // pin voor tremolo

// Ova funkcija nam je potrebna za uspostavljanje kontakta sa skicom Obrada

// Zadržite ga ovdje void installContact () {while (Serial.available () <= 0) {Serial.print (contactCharacter); // šalje znak i čeka odgovor … kašnjenje (loopPauseTime); } Serial.read (); }

void setup () {

// postavljamo pinModes za sve pinove za (int i = 0; i <aantalKnoppen; i ++) {pinMode (knopPinnen , INPUT); } pinMode (mainButton, INPUT); // uklonite komentar ako koristite senzore koji rade na 3V umjesto na 5V // morat ćete spojiti i 'ext' pin na 3.3V // analogReference (EXTERNAL);

// inicijalizacija serijske komunikacije

Serial.begin (baudRate); while (! Serijski); // čekamo rukovanje installContact (); }

void loop () {{100} {101}

// 1. KORAK: PROČITAJ TIPKE // anketirajte sve pinove i preslikajte očitanje u odgovarajući raspon 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); // primjeri: // float v0 = map (bpm, 0, 1023, 60, 250); // ako želite koristiti normalizirani float (npr. za volumen) // float v1 = map (analogRead (pin2), fromMin, fromMax, 0, 100) / 100.0;

// 2. KORAK: NAPIŠITE PORUKU

Serial.print (startString); // pokrećemo niz poruka za (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; Serial.print (namenKnoppen ); Serial.print (","); Serial.print (buttonStates ); if (i <aantalKnoppen - 1) {Serial.print (","); }}} Serial.print (","); Serial.print ("tremolo"); Serial.print (","); Serial.print (mapa (potValue, 0, 1023, 0, 100)); // upisuje kraj poruke Serial.print (endString);

// sačekaj malo..

delay (loopPauseTime); }

Obrada

Izjava o odricanju odgovornosti: Ni kod nije obrađen skice staat hier u Geschreven, za volledige koda na ovom mjestu: ProcessingSoundControl_handout_v6_1.pde in bijlage

De volgende instructies moeten aangepast worden (indien nodig):

// Baudrate moet hetzelfde zijn zoals in de arduino skica

konačni int baudRate = 115200;

// Traži IP adresu u žetelici (zie snimke ekrana u bijlageu)

// Obrada stuurta naar dit andres en reaper luistert hier naar //

// završni niz stringIP = "192.168.1.43"; // npr. "127.0.0.1";

final String remoteIP = "10.3.209.60";

// Zabilježite sendPort i popunite ovo u Reaper -u.

// Ovo je port koji Processing šalje i Reaper sluša.

final int listenPort = 12000, sendPort = 12000;

// ListenPort ovdje služi za aktivno otklanjanje grešaka.

// portNames su tu i za otklanjanje grešaka.

// konačni niz stringName = "/dev/ttyACM0";

finalni niz portName = "COM5"; // "/dev/ttyUSB0";

/////////////////////// KRAJ KORISNIČKIH PARAMETRA /////////////////////////// ////

import processing.serial.*;

import java.util.*;

uvoz oscP5.*;

uvoz netP5.*;

OscP5 oscP5;

NetAddress myRemoteLocation;

Serial commsPort; // Serijski port

logička porukaArrived = false;

Dolazni niz = "", IncomingOSCMessage = "";

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

// Da bismo bili sigurni da šaljemo samo parametre (vrijednosti) koji se mijenjaju

// ove globalne varijable su ovdje uklonjene, ali // ne bi trebale biti inicijalizirane ovdje! HashMap oldParams, newParams, toSendParams;

// Moramo podijeliti poruku na svaki zarez

void processIncoming () {String resVec = incoming.split (","); // dobivamo parove ime+vrijednost // pa za svako ime (+2)… pokušajte {for (int i = 0; i <resVec.length; i+= 2) {float value = Float.parseFloat (resVec [i+ 1]); // stavljamo ih u novu Hashtable newParams.put (resVec , vrijednost); }} // ako dođe do greške, hajde da je uočimo i izađemo. catch (Izuzetak ex) {println ("Poruka izuzetka:" + ex); printArray (resVec); Izlaz(); }}

// Za filtriranje naših poruka

/ * Uvjeravamo se da postoji samo poruka o izlazu s OSC-a kada se * promijeni ulazna poruka (serijska) * To jest: ako okrenemo/pritisnemo dugme i promijeni vrijednost. * Zato filtriramo ulazne vrijednosti koje se zapravo mijenjaju * napomena: nećemo izbjeći preskakanje vrijednosti * koje dolaze iz npr. Mjerača ubrzanja ili senzora udaljenosti * morat ćete ih sami izgladiti u Arduinu */ void filterParams () {toSendParams = new HashMap (); for (Ključ niza: newParams.keySet ()) {// ako je ključ već prisutan ako (oldParams.containsKey (ključ)) {// ključ prisutan i vrijednost nije ista, tada ažurirajte if (! oldParams.get (ključ).equals (newParams.get (key))) {toSendParams.put (key, newParams.get (key)); }} else {// ključ nije prisutan u starim parama, pa to recite! toSendParams.put (ključ, newParams.get (ključ)); } oldParams.put (ključ, newParams.get (ključ)); }}

void makeOSC () {

for (String ključ: toSendParams.keySet ()) {OscMessage myMessage = novi OscMessage ("/"+ ključ); myMessage.add (toSendParams.get (ključ)); / * pošaljite poruku */ oscP5.send (myMessage, myRemoteLocation); }}

void translateMessage () {

processIncoming (); filterParams (); makeOSC (); } // Kada želimo da odštampamo u prozoru void ShowIncoming () {// da vidimo dolaznu poruku, kako je postavljeno u tekstu HashMap -a ("Dolazni iz Arduina", 20, 20); int y = 20; for (Ključ niza: newParams.keySet ()) {y = y+20; tekst (ključ, 20, y); text (newParams.get (key), 300, y); }}

void showOsc () {

tekst (IncomingOSCMessage, 300, 200); IncomingOSCMessage = ""; }

void setup () {

veličina (1000, 800); // Ispunjavanje veličine stupnja (255); pozadina (0); oldParams = novi HashMap (); newParams = novi HashMap (); // printArray (Serial.list ()); commsPort = new Serial (this, portName, baudRate);

/ * pokrenite oscP5, osluškujte dolazne poruke */

oscP5 = novi OscP5 (ovo, slušajPort);

/* myRemoteLocation je NetAddress. NetAddress uzima 2 parametra, * IP adresu i broj porta.myRemoteLocation se koristi kao parametar u * oscP5.send () pri slanju osc paketa na drugo računalo, uređaj, * aplikaciju. upotrebu pogledajte dole. za potrebe testiranja, port za slušanje * i port za adresu udaljene lokacije su isti, stoga ćete * slati poruke natrag na ovu skicu. */ myRemoteLocation = nova NetAddress (remoteIP, sendPort); }

void draw () {

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

void serialEvent (Serial commsPort) {

// čitanje bajta sa serijskog porta: char inChar = commsPort.readChar (); switch (inChar) {case contactCharacter: commsPort.write (contactCharacter); // traži više println ("počinje…"); break; slučaj startChar: incoming = ""; break; case endChar: messageArrived = true; // println ("kraj poruke"); break; default: dolazni += inChar; break; }}

/* dolazne osc poruke prosljeđuju se oscEvent metodi. */

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

DolaznaOSCMessage += "\ n" +

String.format ("### je primio osc poruku:" + "addrpattern:" + theOscMessage.addrPattern () + ": %f", vrijednost); println (IncomingOSCMessage); }

Korak 12: Kontroler Uittesten

Nu alles is aangesloten, all code is geschreven en alles is gedubbelcheckt is het eindelijk tijd om de controller z'n werk te laten doen. Potražite najbolji učinak na Reaper -u i donesite voltooide Guitar Hero MIDI Controller!

Preporučuje se: