Съдържание:

Проект Guitar Hero Arduino: 12 стъпки (със снимки)
Проект Guitar Hero Arduino: 12 стъпки (със снимки)

Видео: Проект Guitar Hero Arduino: 12 стъпки (със снимки)

Видео: Проект Guitar Hero Arduino: 12 стъпки (със снимки)
Видео: Свидание в 16 vs 26 лет 😨😳 2024, Ноември
Anonim
Проект Guitar Hero Arduino
Проект Guitar Hero Arduino
Проект Guitar Hero Arduino
Проект Guitar Hero Arduino
Проект Guitar Hero Arduino
Проект Guitar Hero Arduino

Wij zijn Maarten Vrebos, Justin Cavanas и Wannes Stroobandt и ние студентски мултимедийни и комуникационни технологии. За един групов проект или за аудиовизуални и ИТ принципи можете да използвате Guitar Hero-gitaar gehackt en gebruikt als behuizing for onze MIDI-controller. Het беше onze bedoeling om de bestaande knoppen op de gitaar intern te vervangen. Onze контролер 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 sche op 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
  • 7 резистора от 1 кома
  • 1 светодиод 1
  • блауве LED
  • 1 Arduino Uno R3
  • 1 жълт светодиод
  • 2 родови светодиода
  • 1 schuifschakelaar
  • 1 макет
  • 1 потенциометър
  • 1 протоборд
  • 1 Guitar Hero gitaar
  • Волдоенде лежанка
  • Материал om te solderen/dremelen/
  • Schroevendraaier

Стъпка 1: Компонентиране на Verzamelen

Компонент Verzamelen
Компонент Verzamelen

Прототип на протокола (опция) Hebben we volgende componentsnten gebruikt:

6 бутона

7 1kohm резистори

1 жълт светодиод

1 син светодиод

1 Arduino Uno R3

1 зелен светодиод

2 червен светодиод

1 Schuifschakelaar

1 Платформа

1 Потенциометър

Стъпка 2: Прототип Bouwen

Прототип Bouwen
Прототип Bouwen
Прототип Bouwen
Прототип Bouwen
Прототип Bouwen
Прототип Bouwen

Om ons prototype te bouwen hebben we al onze компоненти gebruikt op een motherboard, deze motherboard dient dan als testobject zodat we niet meteen in de behuizing te werk moeten gaan. С прототипа на hebben ние dan ook gedigitaliseerd чрез tinkercad.com, op deze manier hadden we een duidelijk overzicht van ons prototype 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.

Стъпка 3: Прототип на кода

Прототип на кода
Прототип на кода

Глобална променлива

In het eerste deel van de code initialiseer е globale variabelen voor de pins van arduino uno waar alle бутони mee verbonden zijn.

// zet pin номера waar mainButton (snaar) en andere бутони 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; // бутон за бутон номер 5

Още по -тежки или по -мащабни туитове, предназначени за предназначението на бутоните и бутоните.

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; // номера на LED щифта 13

const int ledPin2 = 12; // броят на LED щифт 12 const int ledPin3 = 11; // броят на LED щифт 11 const int ledPin4 = 10; // броят на LED пина 10 const int ledPin5 = 9; // броят на LED щифт 9 const int potPin = A5; // броят на LED щифт A5

Насладете се на глобалните променливи стойности на състоянията за сензорите (натискане на бутони, включени в нитен потенциометър, сензор за сензори).

// инициализатор 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;

Настройвам

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

Bij elke functie е коментар geschreven wat becreet gedaan wordt. Допълнителен уитлег над wat een specifieke functie concreet doet is te vinden in de arduino reference

void setup () {// скорост на предаване на данни в секунда (бод) за сериен пренос на данни Serial.begin (9600); // Initialiseer de ledPin variabelen als output pinMode (ledPin1, OUTPUT); pinMode (ledPin2, OUTPUT); pinMode (ledPin3, OUTPUT); pinMode (ledPin4, OUTPUT); pinMode (ledPin5, OUTPUT); // инициализатор на всички бутони и вход: pinMode (mainButton, INPUT); pinMode (buttonPin1, INPUT); pinMode (buttonPin2, INPUT); pinMode (buttonPin3, INPUT); pinMode (buttonPin4, INPUT); pinMode (buttonPin5, INPUT); pinMode (potPin, INPUT); pinMode (lightSensor, INPUT); }

Функция празнота

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

void loop () {// препращаме към състоянието на бутоните uit (ingedrukt of niet) mainButtonState = digitalRead (mainButton); buttonState1 = digitalRead (buttonPin1); buttonState2 = digitalRead (buttonPin2); buttonState3 = digitalRead (buttonPin3); buttonState4 = digitalRead (buttonPin4); buttonState5 = digitalRead (buttonPin5);

// всички статусни бутони в een масив

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

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

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

// декларира een масив mainStates en geef die de standaard waarden 0 in.

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

// цикъл над масив aantalKnoppen

for (int i = 0; i <aantalKnoppen; i ++) {pinMode (knopPinnen , INPUT); // инициализатор на всички knopPinnen също като вход digitalRead (knopPinnen ); // lees de waarde van alle knoppinnen uit // indien de mainswitch (snaar) ingedrukt is, print all knopnamen, all buttontates if (mainButtonState == HIGH) {Serial.print (namenKnoppen ); Serial.print (","); Serial.println (buttonStates ); }}

Стъпка 4: Прототип Uittesten

Nadat het prototype gebouwd is volgens ons model en de code geschreven is in Processing, 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 potentiometer in de gitaar en hoe de waardes worden uitgelezen in Processing.

Стъпка 5: Behuizing "ontmantelen" En Kijken Welke Componenten Gebruikt Gaan Worden

Behuizing
Behuizing
Behuizing
Behuizing
Behuizing
Behuizing
Behuizing
Behuizing

Освен това кодът е правилен за прототипа, който сме започнали да срещнем с "ontmantelen" van onze Guitar Hero-gitaar. We hebben de gitaar opengemaakt met een schroevendraaier en bekeken welke originele componentsnten we eventueel nog zouden kunnen hergebruiken voor onze controller. Uiteindelijk hebben ние onze собствени бутони в de bestaande бутони 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 correct werkten.

Стъпка 6: Работещи бутони Originele + Dremelen

Работни бутони Originele + Dremelen
Работни бутони 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 е op de foto.

Стъпка 7: Обяви за спално бейдинг + бутони

Обяви за спално бельо + бутони за почистване
Обяви за спално бельо + бутони за почистване
Обяви за спално бельо + бутони за почистване
Обяви за спално бельо + бутони за почистване
Обяви за спално бельо + бутони за почистване
Обяви за спално бельо + бутони за почистване

Omdat we niet meer met een motherboard 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.

Стъпка 8: Плакати, направени в De Behuizing

Плакати, направени в De Behuizing
Плакати, направени в De Behuizing
Плакати, направени в De Behuizing
Плакати, направени в De Behuizing
Плакати, направени в De Behuizing
Плакати, направени в De Behuizing

Omdat dit Guitar Hero-model redelijk krap was om mee te werken hebben we extra plaats moeten maken d.m.v. дремелен. 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.

Стъпка 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

Всички компоненти се срещат с elkaar te 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 centralle punt van waaruit al onze verbindingen vertrekken en samenkomen (zie foto 2).

Стъпка 10: Verstevigen

Verstevigen
Verstevigen

Довършителният щрих също е 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.

Стъпка 11: 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
Code Voor Het Communiceren Met Reaper

Кодът на Deze е opgedeeld в twee delen, но eerte deel е в de arduino IDE (интерактивна среда за разработка). 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.

Обработката е от туид gedeelte. Deze code dient om alles wat arduino doorstuurt te ontvangen en door te sturen naar Reaper.

Arduino

/* Този код е основна скица за комуникация с Processing through Serial.

Това е план, в който можете да поставите свой собствен код

посочени за вашите собствени бутони, потенциометри или сензори.

Той има ръкостискане, за да е сигурен, че имаме контакт

и форматът, в който общуваме, е решен

Важно е да изградите съобщението по същия начин, така че Processing да знае как да го деконструира и да изпрати правилни OSC съобщения до нашия DAW

направен за werkcollege AV&IT

октомври 2017 г.

*

/ скорост на предаване

const long baudRate = 115200;

// време за изчакване в мс между анкети към пиновете

const int loopPauseTime = 200; // милисекунди

// начална и крайна стойност за съобщението, изпратено на Serial

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

const char contactCharacter = '|';

// пин идентификатори

// други глобални променливи

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;

// аналогови сензори

const int potPin = A5; // пин за тремоло

// Нуждаем се от тази функция, за да установим контакт със скицата за обработка

// Запазете го тук void installContact () {while (Serial.available () <= 0) {Serial.print (contactCharacter); // изпращаме знак и чакаме отговор … забавяне (loopPauseTime); } Serial.read (); }

void setup () {

// задаваме pinModes за всички пинове за (int i = 0; i <aantalKnoppen; i ++) {pinMode (knopPinnen , INPUT); } pinMode (mainButton, INPUT); // разкоментирайте, ако използвате сензори, които работят на 3V вместо на 5V // ще трябва да свържете и "ext" щифта към 3.3V // analogReference (EXTERNAL);

// инициализираме серийни комуникации

Serial.begin (baudRate); while (! Сериен); // изчакайте ръкостискане installContact (); }

void loop () {

// СТЪПКА 1: БУТОНИ ЗА ПРОЧЕТАНЕ // анкетирайте всички пинове и картографирайте показанията в съответния диапазон 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); // примери: // плаващ v0 = карта (bpm, 0, 1023, 60, 250); // ако искате да използвате нормализиран поплавък (напр. за том) // поплавък v1 = map (analogRead (pin2), fromMin, fromMax, 0, 100) / 100.0;

// СТЪПКА 2: НАПИСАНЕ НА СЪОБЩЕНИЕ

Serial.print (startString); // стартиране на последователност от съобщения за (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 ("тремоло"); Serial.print (","); Serial.print (карта (potValue, 0, 1023, 0, 100)); // записваме края на съобщението Serial.print (endString);

// изчакай за малко..

забавяне (loopPauseTime); }

Обработка

Отказ от отговорност: Не кодирайте код за обработка на скица, статия в Германия

De volgende instructies moeten aangepast worden (indien nodig):

// Baudrate moet hetzelfde zijn zoals in de arduino скица

краен int baudRate = 115200;

// Zoek naar het IP adress in reaper (zie screenshots in bijlage)

// Обработка на stuurt naar dit andres en reaper luistert hier naar //

// краен String remoteIP = "192.168.1.43"; // напр. "127.0.0.1";

final String remoteIP = "10.3.209.60";

// Вземете под внимание sendPort и го попълнете в Reaper.

// Това е портът, който Processing изпраща и Reaper слуша.

окончателен int listenPort = 12000, sendPort = 12000;

// ListenPort тук е за активно отстраняване на грешки.

// portNames също са тук за отстраняване на грешки.

// краен String portName = "/dev/ttyACM0";

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

/////////////////////// КРАЙ НА ПАРАМЕТРИТЕ НА ПОТРЕБИТЕЛИТЕ /////////////////////////// ////

обработка на внос.serial.*;

импортиране на java.util.*;

импортиране на oscP5.*;

внос netP5.*;

OscP5 oscP5;

NetAddress myRemoteLocation;

Serial commsPort; // Серийният порт

логическо съобщениеArrived = false;

Входящ низ = "", ВходящOSCMessage = "";

окончателен char startChar = '*', endChar = '#'; заключителен char contactCharacter = '|';

// За да сме сигурни, че изпращаме само параметрите (стойностите), които се променят

// тези глобални променливи са разделени тук, но // не трябва да се инициализират тук! HashMap oldParams, newParams, toSendParams;

// Трябва да разделим съобщението на всяка запетая

void processIncoming () {String resVec = incoming.split (","); // получаваме двойки име+стойност // така че за всяко име (+2) … опитайте {for (int i = 0; i <resVec.length; i+= 2) {float value = Float.parseFloat (resVec [i+ 1]); // ги поставяме в новата Hashtable newParams.put (resVec , стойност); }} // ако възникне грешка, нека я хванем за показване и изход. catch (Exception ex) {println ("Съобщение за изключение:" + ex); printArray (resVec); изход (); }}

// За да филтрираме нашите съобщения

/ * Ние се уверяваме, че има само съобщение за излизане на OSC, когато * входното съобщение (сериен) се промени * Тоест: ако завъртим/натиснем бутона и той промени стойността. * Затова филтрираме входящите стойности, които действително се променят * забележка: няма да избегнем прескачане на стойности *, идващи например от акселерометри или сензори за разстояние * ще трябва сами да ги изгладите в Arduino */ void filterParams () {toSendParams = new HashMap (); for (String key: newParams.keySet ()) {// ако ключът вече присъства if (oldParams.containsKey (key)) {// ключът присъства и стойността не е същата, след това актуализирайте if (! oldParams.get (key).equals (newParams.get (key))) {toSendParams.put (key, newParams.get (key)); }} else {// ключът не присъства в старите параметри, така че го кажете! toSendParams.put (ключ, newParams.get (ключ)); } oldParams.put (ключ, newParams.get (ключ)); }}

void makeOSC () {

for (Ключ за низ: toSendParams.keySet ()) {OscMessage myMessage = нов OscMessage ("/"+ ключ); myMessage.add (toSendParams.get (ключ)); / * изпратете съобщението */ oscP5.send (myMessage, myRemoteLocation); }}

void translateMessage () {

processIncoming (); filterParams (); makeOSC (); } // Когато искаме да отпечатаме в прозореца void ShowIncoming () {// за да видим входящо съобщение, както е зададено в текста на HashMap ("Входящо от Arduino", 20, 20); int y = 20; for (Ключ за низ: newParams.keySet ()) {y = y+20; текст (ключ, 20, y); текст (newParams.get (key), 300, y); }}

void showOsc () {

текст (IncomingOSCMessage, 300, 200); ВходящOSCMessage = ""; }

void setup () {

размер (1000, 800); // Запълване на размер на етапа (255); фон (0); oldParams = нов HashMap (); newParams = нов HashMap (); // printArray (Serial.list ()); commsPort = нов сериен (това, portName, baudRate);

/ * стартирайте oscP5, слушайте входящи съобщения */

oscP5 = нов OscP5 (this, listenPort);

/* myRemoteLocation е NetAddress. NetAddress приема 2 параметъра, * ip адрес и номер на порт.myRemoteLocation се използва като параметър в * oscP5.send () при изпращане на osc пакети на друг компютър, устройство, * приложение. употреба вижте по -долу. за целите на тестването портът за слушане * и портът на адреса на отдалеченото местоположение са еднакви, следователно ще * изпращате съобщения обратно към тази скица. */ myRemoteLocation = нов NetAddress (remoteIP, sendPort); }

void draw () {

if (messageArrived) {фон (0); translateMessage (); ShowIncoming (); messageArrived = false; } showOsc (); }

void serialEvent (Serial commsPort) {

// прочетете байт от серийния порт: char inChar = commsPort.readChar (); switch (inChar) {case contactCharacter: commsPort.write (contactCharacter); // искаме повече println ("стартиране …"); прекъсване; случай startChar: incoming = ""; прекъсване; случай endChar: messageArrived = true; // println ("край на съобщението"); прекъсване; по подразбиране: входящ += inChar; прекъсване; }}

/* входящото osc съобщение се препраща към метода oscEvent. */

void oscEvent (OscMessage theOscMessage) {float value = theOscMessage.get (0).floatValue (); // получавам първия osc аргумент

ВходящOSCMessage += "\ n" +

String.format ("### получи osc съобщение:" + "addrpattern:" + theOscMessage.addrPattern () + ": %f", стойност); println (IncomingOSCMessage); }

Стъпка 12: Контролер Uittesten

Nu alles е aangesloten, кодът е geschreven en alles е gedubbelcheckt е het eindelijk tijd om de controller z'n werk te laten doen. Zoek een paar leuke Effecten op Reaper и geniet van de voltooide Guitar Hero MIDI контролер!

Препоръчано: