Оглавление:

Проект 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 en Wannes Stroobandt и мы изучаем мультимедийные и коммуникативные технологии. Для его создания и работы с аудиовизуальными технологиями и принципами информационных технологий, он использует Guitar Hero и обеспечивает работу с MIDI-контроллером. Он был onze bedoeling om de bestaande knoppen op de gitaar intern te vervangen. Контроллер Onze Zal Wastgehouden и Bespeeld WORDEN ALS EEN Normale Gitaar. Aangezien мы 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 word gebruikt.

Wij hebben ons for 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 кнопок клейне
  • 7 резисторов по 1 кОм
  • 1 геле светодиод 1
  • синий светодиод
  • 1 Arduino Uno R3
  • 1 светодиод Groene
  • 2 ездовых светодиода
  • 1 Schuifschakelaar
  • 1 макет
  • 1 потенциометр
  • 1 протоборд
  • 1 Guitar Hero gitaar
  • Постельные принадлежности Voldoende
  • Materiaal om te solderen / dremelen /
  • Schroevendraaier

Шаг 1: Componenten Verzamelen

Componenten Verzamelen
Componenten Verzamelen

Для прототипа (макетной платы) hebben we volgende components gebruikt:

6 кнопок

7 резисторов 1 кОм

1 желтый светодиод

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

1 Arduino Uno R3

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

2 красных светодиода

1 Schuifschakelaar

1 макетная плата

1 потенциометр

Шаг 2: прототип Bouwen

Прототип Боувен
Прототип Боувен
Прототип Боувен
Прототип Боувен
Прототип Боувен
Прототип Боувен

Прототип тестового объекта мы можем использовать в качестве компонента на открытой макетной плате, а также на тестовой плате и тестируемом объекте. Dit prototype hebben we dan ook gedigitaliseerd via tinkercad.com, op deze manier hadden we een duidelijk overzicht van ons prototype, что elk groepslid ook kon bewerken.

Er word 5 kleine pushbuttons gebruikt die fungeren als 5 snaren en een grote pushbutton die in combinatie met eén of meerdere 'snaren' moet word ingedrukt om e audit effect te krijgen. Развернутые светодиодные лампы dienen gewoon als visuele controle om er zeker van te zijn dat de interactie Succesvol werkt.

Шаг 3. Прототип кода

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

Globale variabelen

В этом глобальном инициализаторе кода вы можете найти разные кнопки для всех кнопок на плате.

// получить номера выводов waar mainButton (snaar) и другие кнопки, связанные с zijn: const int mainButton = A1; // gitaar snaar const int lightSensor = A0; const int buttonPin1 = 2; // номер кнопки pushbutton1 const int buttonPin2 = 3; // номер фургона pushbutton2const int buttonPin3 = 4; // номер фургона pushbutton3const int buttonPin4 = 5; // номер фургона pushbutton4const int buttonPin5 = 6; // номер кнопки фургона5

Hierna worden er twee array aangemaakt voor de namen van de pushbuttons en hun pinnummer.

const int aantalKnoppen = 5; const String namenKnoppen [aantalKnoppen] = {"кнопка 1", "кнопка 2", "кнопка 3", "кнопка 4", "кнопка 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; // номер пина 13 светодиода

const int ledPin2 = 12; // номер вывода 12 светодиода const int ledPin3 = 11; // номер вывода 11 светодиода const int ledPin4 = 10; // номер вывода 10 светодиода const int ledPin5 = 9; // номер вывода 9 светодиода const int potPin = A5; // номер вывода светодиода A5

Глобальные переменные состояния датчиков (zijn de pushbuttons ingedrukt of niet? Potentiometer, lichtsensor).

// инициализатор buttonStates для кнопки (исходящий объект) 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;

Настраивать

Не действует функция настройки void. Deze - это van het type void (geeft geen waarde terug) и инструкции hierin word maar 1 keer uitgevoerd.

Bij elke functie - комментарий geschreven wat er конкретный gedaan wordt. Дополнительная информация по конкретным функциям, указанным в документе, является ссылкой на Arduino.

void setup () {// скорость передачи данных в секунду (бод) для последовательной передачи данных Serial.begin (9600); // Инициализатор ledPin, изменяемый как output pinMode (ledPin1, OUTPUT); pinMode (ledPin2, ВЫХОД); pinMode (ledPin3, ВЫХОД); pinMode (ledPin4, ВЫХОД); pinMode (ledPin5, ВЫХОД); // инициализирует все кнопки как input: pinMode (mainButton, INPUT); pinMode (buttonPin1, ВХОД); pinMode (buttonPin2, ВХОД); pinMode (buttonPin3, ВХОД); pinMode (buttonPin4, ВХОД); pinMode (buttonPin5, ВХОД); pinMode (potPin, ВХОД); pinMode (датчик света, ВХОД); }

Функция пустоты

Эта функция setup (), которая выполняет функцию цикла (), содержит инструкции по своему усмотрению.

void loop () {// последние данные о кнопках uit (исходный текст) 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 (световой датчик);

// объявляющий массив mainStates en geef die de standaard waarden 0 in.

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

// цикл по массиву aantalKnoppen

для (int я = 0; я <aantalKnoppen; я ++) {pinMode (knopPinnen [я], ВХОД); // инициализатор всех кнопок input digitalRead (knopPinnen ); // lees de waarde van all knoppinnen uit // indien de mainswitch (snaar) ingedrukt is, print all knopnamen, all buttonstates if (mainButtonState == HIGH) {Serial.print (namenKnoppen ); Serial.print (","); Serial.println (buttonStates ); }}

Шаг 4: прототип Uittesten

Надо сказать, что этот прототип - это модель с расширенным кодом и код, который находится в процессе обработки, и сейчас он протестирован. Этот видеоролик представляет собой все, что связано с кнопками и реакциями, которые происходят на бигхорнде, и в том, что они объединены с кнопками, могущими Zijn.

В видео-ролике можно увидеть, как работает тремоло-тремоло на ручном потенциометре ван-эна в разделе «Обработка».

Шаг 5: Создание «ontmantelen» En Kijken Welke Componenten Gebruikt Gaan Worden

Behuizing
Behuizing
Behuizing
Behuizing
Behuizing
Behuizing
Behuizing
Behuizing

Кроме того, правильный код работает на прототипе, который мы начали встречать с его "ontmantelen" из Guitar Hero-gitaar. Мы познакомились с открытыми компонентами, которые мы получили, и с оригинальными компонентами, и с другими компонентами. Uiteindelijk hebben мы включаем собственные кнопки в de bestaande buttons gekregen (zie volgende stap). We hebben de tremolo ook gebruikt voor ons eindproduct en voor onze hoofdbutton (кнопка инициализации, также как и комбинация предметов) hebben we ook de originele twee buttons gebruikt (zie vierde foto). De LEDjes zullen verdwijnen (deze waren enkel ter indicatie zodat we zagen dat all knoppen right werkten.

Шаг 6: Вертка пуговиц Originele + дремелен

Пуговицы Werking Originele + Дремелен
Пуговицы Werking Originele + Дремелен

Этот бижорендный видео представляет собой оригинальную кнопку, которая работает с кнопками, также как и все, что вам нужно.

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.

Шаг 7: Постельное белье Solderen + пуговицы Vastlijmen

Постельные принадлежности Solderen + Пуговицы Vastlijmen
Постельные принадлежности Solderen + Пуговицы Vastlijmen
Постельные принадлежности Solderen + Buttons Vastlijmen
Постельные принадлежности Solderen + Buttons Vastlijmen
Постельные принадлежности Solderen + Пуговицы Vastlijmen
Постельные принадлежности Solderen + Пуговицы Vastlijmen

Omdat we niet meer met een layout werken moeten de draden gesoldeerd worden om zo de verschillende componentten met elkaar te verbinden. Nadat dit gebeurd is kunnen we de buttons huge zoals te zien is op de foto's. Eens dit gebeurd is kunnen we doorgaan naar de volgende stap.

Шаг 8: Изготовление плаатов в De Behuizing

Plaats Maken in De Behuizing
Plaats Maken in De Behuizing
Plaats Maken in De Behuizing
Plaats Maken in De Behuizing
Plaats Maken in De Behuizing
Plaats Maken in 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 общий в de binnenkant obstakels 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, что мы в deachterkant van de gitaar een doorgang hebben gecreëerd voor de draden die naar de buttons gaan omdat de gitaar anders niet meer te sluiten was. En op de laatste foto is te zien that we de draden die rechtstreeks verbonden worden met de Arduino door een gat in de onderkant van de gitaar de behuizing verlaten.

Шаг 9: Постельное белье Aansluiten Op Protobord

Постельные принадлежности Aansluiten Op Protobord
Постельные принадлежности Aansluiten Op Protobord
Постельные принадлежности Aansluiten Op Protobord
Постельные принадлежности Aansluiten Op Protobord
Постельные принадлежности Aansluiten Op Protobord
Постельные принадлежности Aansluiten Op Protobord
Постельные принадлежности Aansluiten Op Protobord
Постельные принадлежности 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 derde foto. Dit bord is het centrale punt van waaruit al onze verbindingen vertrekken en samenkomen (zie foto 2).

Шаг 10: Верстевиген

Верстевиген
Верстевиген

Еще один последний штрих - это все, что нужно для дополнительной стабилизации. Op deze foto is te zien hoe we het deel dat we er hebben uitgehaald d.m.v. dremelen achteraan de buttons verstevigen met stukjes karton.

Шаг 11: Code Voor Het Communiceren встретил Жнеца

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 добавлен в твит-код, а пока что в IDE-среде Arduino (интерактивная среда разработки). Кодовое слово загрузить на arduino zelf en dient om all waarden van de sensor van de midi controller uit te lezen en door te sturen naar processing.

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

Ардуино

/ * Этот код представляет собой базовый скетч для связи с обработкой через последовательный порт.

Это план, в который вы можете поместить свой собственный код.

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

У него есть рукопожатие, чтобы убедиться, что у нас есть контакт

и формат, в котором мы общаемся, определяется

Таким же образом важно составить сообщение, так что Processing знает, как его деконструировать и отправлять правильные OSC-сообщения в нашу DAW

сделано для werkcollege AV&IT

октябрь 2017

*

/ скорость передачи

const long baudRate = 115200;

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

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

// начальное и конечное значения для сообщения, отправленного по последовательному каналу

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

const char contactCharacter = '|';

// идентификаторы контактов

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

const int aantalKnoppen = 5; const String namenKnoppen [aantalKnoppen] = {"кнопка 1", "кнопка 2", "кнопка 3", "кнопка 4", "кнопка 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); // отправляем символ и ждем ответа… delay (loopPauseTime); } Serial.read (); }

void setup () {

// установить pinModes для всех контактов для (int i = 0; i <aantalKnoppen; i ++) {pinMode (knopPinnen , INPUT); } pinMode (mainButton, ВХОД); // раскомментируйте, если вы используете датчики, которые работают от 3 В вместо 5 В // вам также придется подключить вывод «ext» к 3,3 В // analogReference (EXTERNAL);

// инициализируем последовательную связь

Serial.begin (baudRate); в то время как (! серийный); // ждем рукопожатия 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); для (int я = 0; я <aantalKnoppen; я ++) {buttonStates [я] = digitalRead (knopPinnen [я]); } potValue = analogRead (potPin); // примеры: // float v0 = map (bpm, 0, 1023, 60, 250); // если вы хотите использовать нормализованное число с плавающей запятой (например, для объема) // float 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 ); если (я <aantalKnoppen - 1) {Serial.print (","); }} еще {buttonStates [я] = 0; Serial.print (namenKnoppen ); Serial.print (","); Serial.print (buttonStates ); если (я <aantalKnoppen - 1) {Serial.print (","); }}} Serial.print (","); Serial.print («тремоло»); Serial.print (","); Serial.print (карта (potValue, 0, 1023, 0, 100)); // записываем конец сообщения Serial.print (endString);

// немного подождать..

задержка (loopPauseTime); }

Обработка

Заявление об отказе от ответственности: Нет всего кода обработки скетча, который находится в гешревене, для полного кода лучше всего и: ProcessingSoundControl_handout_v6_1.pde в bijlage

De volgende Instructies moeten aangepast worden (indien nodig):

// Baudrate moet hetzelfde zijn zoals in de arduino sketch

final int baudRate = 115200;

// Zoek naar het IP адрес в reaper (скриншоты в bijlage)

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

// последняя строка remoteIP = "192.168.1.43"; //например. «127.0.0.1»;

последняя строка remoteIP = "10.3.209.60";

// Обратите внимание на sendPort и заполните его в Reaper.

// Это порт, который обрабатывает и слушает Reaper.

финальный int listenPort = 12000, sendPort = 12000;

// Здесь listenPort для активной отладки.

// имена портов также используются для отладки.

// последняя строка portName = "/ dev / ttyACM0";

последняя строка portName = "COM5"; // "/ dev / ttyUSB0";

///////////////////// КОНЕЦ ПАРАМЕТРОВ ПОЛЬЗОВАТЕЛЯ ///////////////////////// ////

import processing.serial. *;

import java.util. *;

импортировать oscP5. *;

импорт netP5. *;

OscP5 oscP5;

NetAddress myRemoteLocation;

Последовательный порт commsPort; // Последовательный порт

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

String incoming = "", IncomingOSCMessage = "";

последний символ startChar = '*', endChar = '#'; последний символ 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 , value); }} // если возникла ошибка, поймем ее отображение и выйдем. catch (Exception ex) {println ("Сообщение об исключении:" + ex); printArray (resVec); выход(); }}

// Для фильтрации наших сообщений

/ * Мы гарантируем, что есть только сообщение OSC-out, когда * входное сообщение (Serial) изменяется * То есть: если мы поворачиваем / нажимаем кнопку, и она меняет значение. * Таким образом, мы отфильтровываем входящие значения, которые на самом деле меняются. HashMap (); for (String key: newParams.keySet ()) {// если ключ уже присутствует if (oldParams.containsKey (key)) {// ключ присутствует и значение не совпадает, затем обновить if (! oldParams.get (key).equals (newParams.get (ключ))) {toSendParams.put (ключ, newParams.get (ключ)); }} else {// ключ отсутствует в старых параметрах, так что вставьте его! toSendParams.put (ключ, newParams.get (ключ)); } oldParams.put (ключ, newParams.get (ключ)); }}

void makeOSC () {

для (Строковый ключ: toSendParams.keySet ()) {OscMessage myMessage = new OscMessage ("/" + ключ); myMessage.add (toSendParams.get (ключ)); / * отправляем сообщение * / oscP5.send (myMessage, myRemoteLocation); }}

void translateMessage () {

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

void showOsc () {

текст (IncomingOSCMessage, 300, 200); IncomingOSCMessage = ""; }

void setup () {

размер (1000, 800); // Размер сцены fill (255); фон (0); oldParams = новая HashMap (); newParams = новая HashMap (); // printArray (Serial.list ()); commsPort = новый последовательный порт (this, portName, baudRate);

/ * запускаем oscP5, ожидая входящих сообщений * /

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

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

void draw () {

если (messageArhibited) {фон (0); translateMessage (); ShowIncoming (); messageArved = false; } showOsc (); }

void serialEvent (Serial commsPort) {

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

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

void oscEvent (OscMessage theOscMessage) {значение с плавающей запятой = theOscMessage.get (0).floatValue (); // получаем первый аргумент osc

IncomingOSCMessage + = "\ n" +

String.format ("### получил сообщение osc:" + "addrpattern:" + theOscMessage.addrPattern () + ":% f", значение); println (Входящее сообщениеOSCMessage); }

Шаг 12: Контроллер Uittesten

Nu alles aangesloten, all code is geschreven en alles is gedubbelcheckt is het eindelijk tijd om de controller z'n werk te laten doen. Zoek een paar leuke эффективно работает с Reaper и geniet van de voltooide MIDI-контроллером Guitar Hero!

Рекомендуемые: