Съдържание:
- Стъпка 1: Компонентиране на Verzamelen
- Стъпка 2: Прототип Bouwen
- Стъпка 3: Прототип на кода
- Стъпка 4: Прототип Uittesten
- Стъпка 5: Behuizing "ontmantelen" En Kijken Welke Componenten Gebruikt Gaan Worden
- Стъпка 6: Работещи бутони Originele + Dremelen
- Стъпка 7: Обяви за спално бейдинг + бутони
- Стъпка 8: Плакати, направени в De Behuizing
- Стъпка 9: Bedrading Aansluiten Op Protobord
- Стъпка 10: Verstevigen
- Стъпка 11: Code Voor Het Communiceren Met Reaper
- Стъпка 12: Контролер Uittesten
Видео: Проект Guitar Hero Arduino: 12 стъпки (със снимки)
2024 Автор: John Day | [email protected]. Последно модифициран: 2024-01-30 07:54
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
Прототип на протокола (опция) Hebben we volgende componentsnten gebruikt:
6 бутона
7 1kohm резистори
1 жълт светодиод
1 син светодиод
1 Arduino Uno R3
1 зелен светодиод
2 червен светодиод
1 Schuifschakelaar
1 Платформа
1 Потенциометър
Стъпка 2: Прототип 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
Освен това кодът е правилен за прототипа, който сме започнали да срещнем с "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
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
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
Всички компоненти се срещат с 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
Довършителният щрих също е 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
Кодът на 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 контролер!
Препоръчано:
Използване на Guitar Hero Guitar за управление на увеличението (само за Windows): 9 стъпки
Използване на Guitar Hero Guitar за контрол на Zoom (само за Windows): Тъй като сме в разгара на глобална пандемия, много от нас са заседнали в почистването на къщата и се присъединяват към срещи в Zoom. След известно време това може да стане много скучно и досадно. Докато почиствах къщата си, намерих стара китара Guitar Hero, която беше хвърлена в
Guitar Hero Guitar Disconnecting Fix: 5 стъпки (със снимки)
Guitar Hero Guitar Disconnecting Fix: И така, току -що купихте тази хубава използвана китара герой китара от ebay и когато тя пристигна при вас, тя просто нямаше да се свърже с този USB ключ, така че мислите, че току -що сте пропиляли 30 € надолу в канализацията. Но има поправка и тази корекция най -вероятно ще работи
Какво да правите със случайни колекции от двигатели: Проект 2: Въртящи се светлини (модел НЛО): 12 стъпки (със снимки)
Какво да правя със случайни колекции от двигатели: Проект 2: Въртящи се светлини (модел НЛО): И така, все още имам колекция от случайни двигатели … Какво ще правя? Е, нека помислим. Какво ще кажете за LED светкавица? (Не са ръчни, съжалявам любителите на въртенето.) Изглежда малко като НЛО, звучи като смесица между трева и блендер
Guitar Hero Clone: 7 стъпки (със снимки)
Guitar Hero Clone: Някога искали ли сте да свирите на Guitar Hero на вашия компютър със собствена домашно направена китара? Пригответе се да играете за по -малко от 10 долара и малко търпение
Епично! Guitar Hero - Double Neck Guitar Fail: 7 стъпки (със снимки)
Епично! Guitar Hero - Double Neck Guitar … Fail: 2015 отбелязва 10 -годишнината от феномена на поп културата Guitar Hero. Помните ли, видеоиграта, която стана по -популярна от музикалния инструмент, която едва бегло успя да имитира? Какъв по -добър начин да отпразнуваме десетилетието му от