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, Studeni
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 mi studente multimedia & communicatietechnologie. Kako biste pronašli veliki projekt za audiovizualna i informatička načela, potrebno je koristiti Guitar Hero-gitaar gehackt i koristiti ga za MIDI-kontroler. Het je 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 materiaal 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 foto 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 project

  • 6 kleine tipki
  • 7 1kohm otpornika
  • 1 LED dioda 1
  • blauwe LED
  • 1 Arduino Uno R3
  • 1 sijalica LED
  • 2 LED diode
  • 1 schuifschakelaar
  • 1 matična ploča
  • 1 potenciometar
  • 1 protobord
  • 1 Guitar Hero gitaar
  • Voldoende bedrading
  • Materijal om te solderen/dremelen/
  • Schroevendraaier

Korak 1: Sastavite Verzamelen

Sastavni dio Verzamelen
Sastavni dio Verzamelen

Voor ons prototype (op breadboard) hebben we volgende componentsnten gebruikt:

6 tipki

7 1kohm otpornika

1 Žuta LED

1 plava LED dioda

1 Arduino Uno R3

1 zelena LED dioda

2 crvena LED

1 Schuifschakelaar

1 Oglasna ploča

1 Potenciometar

Korak 2: Prototip Bouwen

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

Om ons prototype te bouwen hebben we al onze componentsnten gebruikt op een breadboard, deze breadboard dient dan als testobject zodat we niet meteen in de behuizing te werk moeten gaan. Od prototipa smo vidjeli ook gedigitaliseerd putem tinkercad.com, op deze manier hadden we een duidelijk overzicht van ons prototip dat elk groepslid ook kon bewerken.

Er worden 5 kleine pushbuttons gebruikt die fungeren als 5 snaren en een grote pushbutton die in combinatie met één of meerdere 'snaren' moet worden ingedrukt om een auditief effect te krijgen. De verschillende LED-lampjes dienen gewoon als visuele controle om er zeker van te zijn dat de interactie succesvol werkt.

Korak 3: Prototip koda

Prototip koda
Prototip koda

Globale variabelen

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

// zet pin brojevi waar mainButton (snaar) en andere gumbi aan verbonden zijn: const int mainButton = A1; // gitaar snaar const int lightSensor = A0; const int buttonPin1 = 2; // nummer van pushbutton1 const int buttonPin2 = 3; // nummer van pushbutton2const int buttonPin3 = 4; // nummer van pushbutton3const int buttonPin4 = 5; // nummer van pushbutton4const int buttonPin5 = 6; // nummer van button5

Više riječi i twee nizovi su prilagođeni za namjenu van gumba i guma.

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

En dan nog variabelen voor de pins van de LED lichtjes.

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 pin A5

De laatste globale variabelen dienen als 'states' for senzori (zijn de pushbuttons ingedrukt of niet? Potenciometer, lichtsensor).

// Initialiseer 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;

Postaviti

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

Bij elke functie is commentaar geschreven wat er concreet gedaan wordt. Dodatni utilleg nad wat een specifieke functie concreet doet is te vinden in de arduino referenca

void setup () {// brzina prijenosa podataka u sekundi (baud) za seriele prijenos podataka Serial.begin (9600); // Initialiseer de ledPin varira ili je izlaz pinMode (ledPin1, OUTPUT); pinMode (ledPin2, OUTPUT); pinMode (ledPin3, OUTPUT); pinMode (ledPin4, OUTPUT); pinMode (ledPin5, OUTPUT); // inicijalizator svih tipki als input: pinMode (mainButton, INPUT); pinMode (buttonPin1, INPUT); pinMode (buttonPin2, INPUT); pinMode (buttonPin3, INPUT); pinMode (buttonPin4, INPUT); pinMode (buttonPin5, INPUT); pinMode (potPin, INPUT); pinMode (svjetlosni senzor, ULAZ); }

Funkcija ništa

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

// svi statusen tipke u een nizu

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

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

potValue = analogRead (potPin); lightValue = analogno čitanje (svjetlosni senzor);

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

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

// petlja preko de array aantalKnoppen

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

Korak 4: Prototip Uittesten

Nadat het prototype gebouwd is volgens ons model en de code geschreven is in Processing, is het tijd om het prototype uit te 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.

In de tweede video is te zien hoe onze tremolo werkt aan de hand van een potenciometer in de gitaar en hoe de waardes worden uitgelezen in Processing.

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

Behuizing
Behuizing
Behuizing
Behuizing
Behuizing
Behuizing
Behuizing
Behuizing

Ako je kod ispravan, radi se o prototipu koji smo započeli s "ontmantelen" van onze Guitar Hero-gitarom. We hebben de gitaar opengemaakt met een schroevendraaier en bekeken welke originele componentsnten we eventueel nog zouden kunnen hergebruiken voor onze controller. Uiteindelijk hebben we onze eigen pushbuttons in de bestaande buttons 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 buttons gebruikt (zie vierde foto). De LEDjes zullen verdwijnen (deze waren enkel ter indicatie zodat we zagen dat alle knoppen pravilno werkten.

Korak 6: Radni gumbi Originele + Dremelen

Radni gumbi Originele + Dremelen
Radni gumbi Originele + Dremelen

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

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 foto.

Korak 7: Spavaća soba Bedrading + Gumbi 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 componentsnten met elkaar te verbinden. Nadat dit gebeurd is kunnen we de Buttons widelijmen zoals 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 ontstaat voor de bedrading in de gitaar. Omdat er overal in de binnenkant preprekels 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 dat 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 su od verbinden hebben we gebruik gemaakt van een protobord. Dit is 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. Dit bord is het centrale punt van waaruit al onze verbindingen vertrekken en samenkomen (zie foto 2).

Korak 10: Verstevigen

Verstevigen
Verstevigen

Završni dodir je het 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 button verstevigen met stukjes karton.

Korak 11: Kôd za komunikaciju sa sastankom

Code Voor 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
Code Voor Het Communiceren Met Reaper
Code Voor Het Communiceren Met Reaper
Code Voor Het Communiceren Met Reaper

Deze kod je optedeeld u twee delen, ali on je u de arduino IDE -u (interaktivno razvojno okruženje). Die code wordt geüpload naar arduino zelf en dient om alle waarden van de sensors van de midi controller uit te lezen en door te sturen naar processing.

Obrada je od tweede gedeelte. Deze code dient om alles wat arduino doorstuurt te ontvangen en door te sturen naar Reaper.

Arduino

/* Ovaj kôd je osnovna skica za komunikaciju s Obrada putem serijskog.

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

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

Ima rukovanje kako bismo bili sigurni da imamo kontakt

te se odlučuje o formatu u kojem komuniciramo

Važno je poruku konstruirati 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

listopada 2017

*

/ brzina prijenosa

const long baudRate = 115200;

// vrijeme čekanja u ms između anketa za pinove

const int loopPauseTime = 200; // mili sekundi

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

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 nam je funkcija potrebna za uspostavljanje kontakta sa skicom Obrada

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

void setup () {

// postavljamo pinMode 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);

// inicijaliziranje serijskih komunikacija

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

void loop () {{100} {101}

// 1. KORAK 1: Č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: // plutamo v0 = karta (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 (karta (potValue, 0, 1023, 0, 100)); // upis kraja poruke Serial.print (endString);

// Čekaj malo..

kašnjenje (loopPauseTime); }

Obrada

Odricanje od odgovornosti: Ni kôd nije objavljen kod obrade skice u državi Geschreven, za kôd volledige koda u ovom slučaju: 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;

// Potražite IP adresu u žetelici (zie snimke zaslona u bijlageu)

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

// final String remoteIP = "192.168.1.43"; // npr. "127.0.0.1";

final String remoteIP = "10.3.209.60";

// Uzmite u obzir sendPort i ispunite ovo u Reaper -u.

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

konačni int ListenPort = 12000, sendPort = 12000;

// ListenPort ovdje služi za aktivno ispravljanje pogrešaka.

// portNames su tu i za ispravljanje pogrešaka.

// završni niz PortName = "/dev/ttyACM0";

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

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

uvoz obrada.serial.*;

uvoz java.util.*;

uvoz oscP5.*;

uvoz netP5.*;

OscP5 oscP5;

NetAddress myRemoteLocation;

Serijski commsPort; // Serijski port

logička porukaArrived = false;

Dolazni niz = "", DolaznaOSCMessage = "";

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

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

// ove globalne varijable su ovdje uklonjene, ali // ne smiju se ovdje inicijalizirati! 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 pogreške, uhvatimo je na ekranu i izađimo. catch (Izuzetak ex) {println ("Poruka iznimke:" + 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 gumb i promijeni vrijednost. * Stoga filtriramo dolazne 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 (String key: newParams.keySet ()) {// ako je ključ već prisutan ako (oldParams.containsKey (key)) {// ključ prisutan i vrijednost nije ista, tada ažurirajte if (! oldParams.get (key).equals (newParams.get (key))) {toSendParams.put (key, newParams.get (key)); }} else {// ključ nije prisutan u starim parama, pa to recite! toSendParams.put (key, newParams.get (key)); } oldParams.put (ključ, newParams.get (ključ)); }}

void makeOSC () {

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

void translateMessage () {

processIncoming (); filterParams (); makeOSC (); } // Kad želimo ispisati u prozor void ShowIncoming () {// da vidimo dolaznu poruku, kako je postavljeno u tekstu HashMap -a ("Dolazno s Arduina", 20, 20); int y = 20; for (Ključni niz: newParams.keySet ()) {y = y+20; tekst (ključ, 20, y); text (newParams.get (key), 300, y); }}

void showOsc () {

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

void setup () {

veličina (1000, 800); // Ispunjavanje veličine stupnja (255); pozadina (0); oldParams = novi HashMap (); newParams = novi HashMap (); // printArray (Serial.list ()); commsPort = novi serijski (ovaj, naziv porta, 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 koristi se kao parametar u * oscP5.send () pri slanju osc paketa na drugo računalo, uređaj, * aplikaciju. korištenje vidi dolje. 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žiti više println ("pokretanje …"); pauza; case startChar: incoming = ""; pauza; slučaj endChar: messageArrived = true; // println ("kraj poruke"); pauza; zadano: dolazni += inChar; pauza; }}

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

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

DolaznaOSCMessage += "\ n" +

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

Korak 12: Kontroler Uittesten

Nu alles is aangesloten, alle code is geschreven en alles is gedubbelcheckt is het eindelijk tijd om de controller z'n werk te laten doen. Zoek een paar leuke effecten op Reaper en geniet van de voltooide Guitar Hero MIDI Controller!

Preporučeni: