Innholdsfortegnelse:

Guitar Hero Arduino Project: 12 trinn (med bilder)
Guitar Hero Arduino Project: 12 trinn (med bilder)

Video: Guitar Hero Arduino Project: 12 trinn (med bilder)

Video: Guitar Hero Arduino Project: 12 trinn (med bilder)
Video: Гитара для Clone Hero на Arduino своими руками 2024, Juli
Anonim
Guitar Hero Arduino Project
Guitar Hero Arduino Project
Guitar Hero Arduino Project
Guitar Hero Arduino Project
Guitar Hero Arduino Project
Guitar Hero Arduino Project

Vi er Maarten Vrebos, Justin Cavanas og Wannes Stroobandt og vi studerer multimedia og kommunikasjonsteknologi. For et gruppeprosjekt for det audiovisuelle og IT-prinsippene har vi en Guitar Hero-gitaar som kan brukes og brukes som behandling for vår MIDI-kontroller. Det var vår mening om de eksisterende knappene på gitaren intern å erstatte. Vår kontroller vil bli oppbevart og vist som en vanlig gitar. Vi må ikke ha noe ekstra materiale som vi må arbeide med.

I bildet kan du bruke våre generelle oppskrifter på papir for å se hvordan produktet skulle slutte å bli sett med et foto av gitaren som også vil bli brukt.

Vi har et prosjekt basert på følgende bronner:

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 project

  • 6 små trykknapper
  • 7 1kohm motstander
  • 1 gele LED 1
  • blå LED
  • 1 Arduino Uno R3
  • 1 grønn LED
  • 2 rode LED -er
  • 1 schuifschakelaar
  • 1 brødbrett
  • 1 potensiometer
  • 1 protobord
  • 1 Guitar Hero gitaar
  • Voldoende sengeplass
  • Materiale om solderen/dremelen/
  • Schroevendraaier

Trinn 1: Componenten Verzamelen

Componenten Verzamelen
Componenten Verzamelen

For vår prototype (på brødbrett) har vi følgende komponenter brukt:

6 Trykknapper

7 1kohm motstander

1 gul LED

1 blå LED

1 Arduino Uno R3

1 grønn LED

2 rød LED

1 Schuifschakelaar

1 brødbrett

1 potensiometer

Trinn 2: Prototype Bouwen

Prototype Bouwen
Prototype Bouwen
Prototype Bouwen
Prototype Bouwen
Prototype Bouwen
Prototype Bouwen

Om vår prototype å bygge har vi alle våre komponenter som brukes på et brødbrett, dette brødbrettet skal kunne testes og testes så vi ikke kan mete i hvordan vi skal arbeide. Denne prototypen har vi også kunnet digitalisere via tinkercad.com, på denne måten hadde vi en tydelig oversikt over prototypen for at alle grupper også kan arbeide.

Det er 5 små trykknapper som brukes som funksjoner som 5 versjoner og en stor trykknapp som kan kombineres med én eller flere 'snarer' må brukes for å få en auditiv effekt. De forskjellige LED-lampene kan bare brukes som visuell kontroll for å sikre at interaksjonen lykkes.

Trinn 3: Kodeprototype

Kode Prototype
Kode Prototype

Globale variabelen

I den første delen av koden initialiseres globale variabler for pinnene fra arduino for alle trykknapper som jeg verbonden er.

// zet pin numbers waar mainButton (snaar) og andre knapper til verbonden er: const int mainButton = A1; // gitaar snaar const int lightSensor = A0; const int buttonPin1 = 2; // nummer av trykknapp1 const int buttonPin2 = 3; // nummer av pushbutton2const int buttonPin3 = 4; // nummer av pushbutton3const int buttonPin4 = 5; // nummer van pushbutton4const int buttonPin5 = 6; // nummer av trykknapp 5

Her blir det to matriser som kan brukes for å navngi trykknapper og har pinnummer.

const int aantalKnoppen = 5; const String namenKnoppen [aantalKnoppen] = {"knop 1", "knop 2", "knop 3", "knop 4", "knop 5"}; const int knopPinnen [antallKnoppen] = {2, 3, 4, 5, 6};

En annen variabel for pinner av LED -lys.

const int ledPin1 = 13; // nummeret på LED -pinnen 13

const int ledPin2 = 12; // antall LED -pinner 12 const int ledPin3 = 11; // antall LED -pinne 11 const int ledPin4 = 10; // antall LED -pinner 10 const int ledPin5 = 9; // antall LED -pinner 9 const int potPin = A5; // antall LED -pinner A5

De siste globale variabelen dienen som 'tilstander' for sensorer.

// initialize buttonStates voor de knoppen (ingedrukt 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;

Oppsett

Nå følger det ugyldige oppsettfunksjonen. Denne er av den ugyldige typen (gir ingen verdi tilbake) og instruksjonene blir ikke gjentatt én gang.

Ved hver funksjon er kommentaren skrevet hva som er konkret gjort. Ekstra utseende over hva en spesiell funksjon konkrete gjør er å finne i den arduino referansen

void setup () {// datahastighet per sekund (baud) for seriell dataoverføring Serial.begin (9600); // Initialiser de ledPin variabelen as output pinMode (ledPin1, OUTPUT); pinMode (ledPin2, OUTPUT); pinMode (ledPin3, OUTPUT); pinMode (ledPin4, OUTPUT); pinMode (ledPin5, OUTPUT); // initialiser alle trykknapper som 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); }

Ugyldig funksjon

Etter oppsett () funksjon følger loop () funksjon, instruksjonene som vil stå her vil bli utført.

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

// alle trykknappstatuser i en matrise

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

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

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

// erklærer en rekke mainStates og gir standardverdien 0 tommer.

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

// loop over the array numberKnoppen

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

Trinn 4: Prototype Uittesten

Etter at prototypen ble bygget etter modellen og koden som er skrevet i behandling, er det tid for prototypen å teste. På videoen kan du se at alle knoppene reagerer på de tilhørende ledningene og at de også kan kombineres.

I den andre videoen kan vi se hvordan tremoloen vår fungerer for å håndtere et potensiometer i gitaren og hvordan de blir utgitt i behandling.

Trinn 5: Behuizing "ontmantelen" En Kijken Welke Componenten Gebruikt Gaan Worden

Behuizing
Behuizing
Behuizing
Behuizing
Behuizing
Behuizing
Behuizing
Behuizing

Når vi koder riktig for prototypen, begynner vi med den "konstruksjonen" av vår Guitar Hero-gitaar. Vi har åpnet oppgaven med en skrutekniker og kjenner hvilke originale komponenter vi eventuelt ikke kan bruke for vår kontroller. Vi har vanligvis våre egne trykknapper i de eksisterende knappene som er registrert (se følgende stap). Vi har også brukt tremoloen for vårt sluttprodukt og for hovedknappen (den opprinnelige knappen for en kombinasjon av å spille) og vi har også brukt de to andre knappene (se fire bilder). LEDene vil bli verdwijnen (disse var enkle indikasjoner, slik at vi kan bruke alle de riktige virkningene.

Trinn 6: Arbeide Originele -knapper + Dremelen

Werking Originele Buttons + Dremelen
Werking Originele Buttons + Dremelen

På den tilhørende videoen kan du se hvordan de to opprinnelige knappene fungerer som en slags skabelon som vi kan bruke til å generere en kombinasjon av knapper.

Om våre egne knapper kan vi opprette de originale knappene.

Trinn 7: Bedrading Solderen + Knapper Vastlijmen

Bedrading Solderen + Knapper Vastlijmen
Bedrading Solderen + Knapper Vastlijmen
Bedrading Solderen + Knapper Vastlijmen
Bedrading Solderen + Knapper Vastlijmen
Bedrading Solderen + Knapper Vastlijmen
Bedrading Solderen + Knapper Vastlijmen

Fordi vi ikke trenger mer med et brødbrett, må vi laste det sammen for å dele de forskjellige komponentene med hverandre. Etter at dette kan skje, kan vi vise knapper som å se på bilder. Eens dit gebeurd can we wegaangaan to the following stap.

Trinn 8: Plater laget i De Behuizing

Plater laget i De Behuizing
Plater laget i De Behuizing
Plater laget i De Behuizing
Plater laget i De Behuizing
Plater laget i De Behuizing
Plater laget i De Behuizing

Fordi dette Guitar Hero-modellen redelik krap var om jeg skulle arbeide, har vi et ekstra sted for å lage d.m.v. dremelen. Så vi har fjernet hele baksiden av gitaren, slik at vi kan få mer plass til staten for bedrading i gitaar. Fordi det er overordnet i de innvendige objektene, kan vi også fjerne flere av de beste plassene vi kan bruke. På de vierde og femde fotoene kan du se at vi i de bakkant av gitaren en dørgang har kontrollert for at de kan trykke på knappene fordi gitaren ellers ikke er mer å slukke. En av de siste bildene er å se at vi kan bruke den direkte kontakt med Arduino til en gat i en kant av gitaren for å behandle forlater.

Trinn 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

Om alle komponentene med hverandre har vi brukt en protobord. Dette er et bord som har en egen på samme måte som et brødbord, men det er en betjening og effektivitet. Vi har bedrading til det bordet gesoldeerd som du kan se er på tredje foto. Dette er et sentralt punkt for informasjon om våre forbindelser og sammenkomster (se foto 2).

Trinn 10: Verstevigen

Verstevigen
Verstevigen

Som prikken over i -en er det svært godt å forstå deler for ekstra stabilitet. På dette bildet kan vi se hvordan vi har delt at vi har opphørt d.m.v. dremelen achteraan de buttons verstevigen with piecesjes karton.

Trinn 11: Code Voor Het Communiceren Met Reaper

Code Voor Het Communiceren Met Reaper
Code Voor Het Communiceren Met Reaper
Code For Het Communiceren Met Reaper
Code For Het Communiceren Met Reaper
Code Voor Het Communiceren Met Reaper
Code Voor Het Communiceren Met Reaper
Code Voor Het Communiceren Met Reaper
Code Voor Het Communiceren Met Reaper

Denne koden er oppgitt i to deler, den første delen er i arduino IDE (interaktiv utviklingsmiljø) skrevet. Koden blir lastet opp til selvstendig bruk og må betjene alle sensorene til midi -kontrolleren for å kunne laste ned og behandle.

Behandlingen er den andre delen. Denne koden trenger alt du trenger for å motta en dør for å lese til Reaper.

Arduino

/* Denne koden er en grunnleggende skisse for å kommunisere med Processing through Serial.

Det er en blåkopi der du kan sette din egen kode

spesifisert for dine egne knapper, potensiometre eller sensorer.

Den har et håndtrykk for å sikre at vi har kontakt

og formatet vi kommuniserer i er bestemt

Det er viktig å konstruere budskapet på samme måte, slik at Processing vet hvordan de skal dekonstruere det og sende riktige OSC-meldinger til vår DAW

laget for werkcollege AV&IT

oktober 2017

*

/ baud rate

const long baudRate = 115200;

// tid til å vente i ms mellom meningsmålinger til pinnene

const int loopPauseTime = 200; // milli sekunder

// start- og sluttverdier for meldingen sendt på Serial

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

const char contactCharacter = '|';

// pin -ID -er

// andre globale variabler

const int antallKnoppen = 5; const String namenKnoppen [aantalKnoppen] = {"knop 1", "knop 2", "knop 3", "knop 4", "knop 5"}; const int knopPinnen [antallKnoppen] = {2, 3, 4, 5, 6}; const int mainButton = A1;

int mainButtonState = 0;

int potValue = 0;

// analoge sensorer

const int potPin = A5; // pin for tremolo

// Vi trenger denne funksjonen for å etablere kontakt med behandlingsskissen

// Hold det her ugyldig etablereContact () {while (Serial.available () <= 0) {Serial.print (contactCharacter); // send en røye og vent på svar … forsinkelse (loopPauseTime); } Serial.read (); }

ugyldig oppsett () {

// angi pinModes for alle pinnene for (int i = 0; i <antallKnoppen; i ++) {pinMode (knopPinnen , INPUT); } pinMode (mainButton, INPUT); // uncomment hvis du bruker sensorer som fungerer på 3V i stedet for 5V // må du også koble 'ext' pin til 3.3V // analogReference (EXTERNAL);

// initialiser Serial comms

Serial.begin (baudRate); mens (! Seriell); // vent på håndtrykk etablerContact (); }

void loop () {

// TRINN 1: LES KNAPPER // poll alle pinnene og kartlegg avlesningen til det aktuelle området int buttonStates [antallKnoppen]; /* 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); // eksempler: // float v0 = map (bpm, 0, 1023, 60, 250); // hvis du vil bruke en normalisert float (f.eks. for volum) // float v1 = map (analogRead (pin2), fromMin, fromMax, 0, 100) / 100.0;

// TRINN 2: SKRIV MELDING

Serial.print (startString); // start en meldingsrekkefølge for (int i = 0; i <antallKnoppen; i ++) {if (mainButtonState == HIGH) {Serial.print (namenKnoppen ); Serial.print (","); Serial.print (buttonStates ); if (i <antallKnoppen - 1) {Serial.print (","); }} else {buttonStates = 0; Serial.print (namenKnoppen ); Serial.print (","); Serial.print (buttonStates ); if (i <antallKnoppen - 1) {Serial.print (","); }}} Serial.print (","); Serial.print ("tremolo"); Serial.print (","); Serial.print (kart (potValue, 0, 1023, 0, 100)); // skriv slutten av meldingen Serial.print (endString);

// vent en stund..

forsinkelse (loopPauseTime); }

Behandling

Ansvarsfraskrivelse: Ikke alle koder for bearbeiding kan skisseres her for å se koden for fullstendig kode: ProcessingSoundControl_handout_v6_1.pde i bijlage

De følgende instruksjonene må tilpasses:

// Baudrate må det samme som i arduino -skissen

siste int baudRate = 115200;

// Søk etter IP -adressen i reaper (se skjermbilder i bijlage)

// Behandler sendt til dit andres en reaper lytt hier to //

// final String remoteIP = "192.168.1.43"; // f.eks. "127.0.0.1";

final String remoteIP = "10.3.209.60";

// Legg merke til sendPort og fyll ut dette i Reaper.

// Dette er porten Processing sender til og Reaper lytter til.

siste int listenPort = 12000, sendPort = 12000;

// ListenPort her er for å feilsøke aktivt.

// portnavnene er også her for å feilsøke.

// final String portName = "/dev/ttyACM0";

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

//////////////////////// END OF USER PARAMETERS //////////////////////// ////

import behandling. serie.*;

import java.util.*;

import oscP5.*;

import netP5.*;

OscP5 oscP5;

NetAddress myRemoteLocation;

Seriell commsPort; // Seriell port

boolsk meldingArrived = false;

Innkommende streng = "", IncomingOSCMessage = "";

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

// For å være sikker på at vi bare sender parametrene (verdiene) som endres

// disse globale variablene delcares her, men bør // ikke initialiseres her! HashMap oldParams, newParams, toSendParams;

// Vi må dele meldingen ved hvert komma

void processIncoming () {String resVec = incoming.split (","); // vi får navn+verdi par // så for hvert navn (+2) … prøv {for (int i = 0; i <resVec.length; i+= 2) {float value = Float.parseFloat (resVec [i+ 1]); // legg dem i den nye Hashtable newParams.put (resVec , verdi); }} // // hvis det oppstår en feil, la oss få den vist og gå ut. catch (Unntak eks) {println ("Unntaksmelding:" + eks); printArray (resVec); exit(); }}

// For å filtrere meldingene våre

/ * Vi sørger for at det bare er en OSC-utmelding når * inndatameldingen (seriell) endres * Det vil si: hvis vi snur/trykker på knappen og den endrer verdi. * Så vi filtrerer ut de innkommende verdiene som faktisk endres * merk: vi vil ikke unngå hoppverdier * som kommer fra f.eks. Akselerometre eller avstandssensorer * du må glatte dem selv i Arduino */ void filterParams () {toSendParams = new HashMap (); for (String key: newParams.keySet ()) {// hvis nøkkelen allerede er til stede hvis (oldParams.containsKey (key)) {// key present and value not the same, then update if (! oldParams.get (key).equals (newParams.get (key))) {toSendParams.put (key, newParams.get (key)); }} else {// nøkkelen er ikke tilstede i gamle params, så si det! toSendParams.put (key, newParams.get (key)); } oldParams.put (nøkkel, newParams.get (nøkkel)); }}

ugyldig makeOSC () {

for (String key: toSendParams.keySet ()) {OscMessage myMessage = ny OscMessage ("/"+ nøkkel); myMessage.add (toSendParams.get (nøkkel)); / * send meldingen */ oscP5.send (myMessage, myRemoteLocation); }}

void translateMessage () {

processIncoming (); filterParams (); makeOSC (); } // Når vi vil skrive ut til vinduet, ugyldig ShowIncoming () {// for å se innkommende melding, som angitt i HashMap -teksten ("Incoming from Arduino", 20, 20); int y = 20; for (strengnøkkel: newParams.keySet ()) {y = y+20; tekst (nøkkel, 20, y); tekst (newParams.get (nøkkel), 300, y); }}

void showOsc () {

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

ugyldig oppsett () {

størrelse (1000, 800); // Fylling av scenestørrelse (255); bakgrunn (0); oldParams = nytt HashMap (); newParams = nytt HashMap (); // printArray (Serial.list ()); commsPort = new Serial (dette, portnavn, baudRate);

/ * start oscP5, lytt etter innkommende meldinger */

oscP5 = ny OscP5 (dette, listenPort);

/* myRemoteLocation er en NetAddress. en NetAddress tar to parametere, * en ip -adresse og et portnummer.myRemoteLocation brukes som parameter i * oscP5.send () når du sender osc -pakker til en annen datamaskin, enhet, * applikasjon. bruk se nedenfor. For testformål er lytteporten * og porten til den eksterne posisjonsadressen den samme, derfor vil du * sende meldinger tilbake til denne skissen. */ myRemoteLocation = ny NetAddress (remoteIP, sendPort); }

ugyldig trekning () {

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

void serialEvent (Serial commsPort) {

// les en byte fra den serielle porten: char inChar = commsPort.readChar (); switch (inChar) {case contactCharacter: commsPort.write (contactCharacter); // be om mer println ("starter …"); gå i stykker; case startChar: incoming = ""; gå i stykker; case endChar: messageArrived = true; // println ("end of msg"); gå i stykker; standard: innkommende += inChar; gå i stykker; }}

/* innkommende osc -melding videresendes til oscEvent -metoden. */

void oscEvent (OscMessage theOscMessage) {float value = theOscMessage.get (0).floatValue (); // få det første osc -argumentet

IncomingOSCMessage += "\ n" +

String.format ("### mottok en osc -melding:" + "addrpattern:" + theOscMessage.addrPattern () + ": %f", verdi); println (IncomingOSCMessage); }

Trinn 12: Kontroller Uittesten

Alle ting er angesloten, alle koder er skrevet og alt er gjort for å være en endelig tid for kontrolleren. Finn en par morsomme effekter på Reaper og nyt av voltooide Guitar Hero MIDI -kontrolleren!

Anbefalt: