Мазмуну:

Guitar Hero Arduino Project: 12 кадам (Сүрөттөр менен)
Guitar Hero Arduino Project: 12 кадам (Сүрөттөр менен)

Video: Guitar Hero Arduino Project: 12 кадам (Сүрөттөр менен)

Video: Guitar Hero Arduino Project: 12 кадам (Сүрөттөр менен)
Video: It Became Unliveable! ~ Abandoned Home Of The Spenser's In The USA 2024, Ноябрь
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

Wart zijn Maarten Vrebos, Джастин Каванас жана Wannes Stroobandt, биз мультимедия жана коммуникация технологияларын үйрөнөбүз. Аудиовизуалдык жана IT Принциптеринин үнү жокко эсе, гитара Баатыр-гитаранын жардамы менен MIDI-контролеру иштейт. Бул жерде интернеттин студенттери да бар болчу. Контроллерлер кеңири таралган. Кандай болгон күндө да, биз кошумча материалдарды колдонобуз.

Жарыяланган убакыттын өтүшү менен алтернативдүү схемалар папиер менен жабдылгандыктан, сиз өзүңүздүн үйүңүздөгү сүрөттөрүңүздү жана сүрөттөрүңүздү көрөсүз.

Добуш берүү долбоорунун башка варианттары бар:

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 гео LED 1
  • blauwe LED
  • 1 Arduino Uno R3
  • 1 чоң LED
  • 2 минүүчү LED
  • 1 schuifschakelaar
  • 1 нан
  • 1 потенциометр
  • 1 протоборд
  • 1 гитара каарманы
  • Voldoende төшөк
  • Материалдык тейлөө/дремелен/
  • Schroevendraaier

1 -кадам: Компоненттердин тизмеси

Componenten Verzamelen
Componenten Verzamelen

Voor ons прототипи (op breadboard) hebben биз төмөнкү компоненттерди иштетебиз:

6 баскычтар

7 1 кох резисторлор

1 сары LED

1 көк LED

1 Arduino Uno R3

1 Жашыл LED

2 кызыл LED

1 Schuifschakelaar

1 Breadboard

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

2 -кадам: Bouwen прототипи

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

Прототиптин негизги бөлүгү - бул биз нон -столдун компоненттеринин бири, ал эми экинчисинин тест -объектиси биз өзүбүздүн жеке ишибизди талкуулоодо биз менен жолугушуп турабыз. Dit prototype hebben we tok gidigitaliseerd via tinkercad.com, and we had many man hadden we had one duidelijk overzicht van ons prototype dat elk groepslid ook kon bewerken.

Эртеден -кечке 5 баскыч баскычтары дагы фунгерен менен кошо 5 кнопкасын басуу комбинациясында өлөт, бирок алар "аударен" эффектинин начарлашына алып келген. Жарыктандыруучу LED чырактары дагы башка нерселер менен да көзөмөлдөп турат, алар өз ара аракеттенишүүдө.

3 -кадам: Коддун прототиби

Коддун прототиби
Коддун прототиби

Globale variabelen

Жөн эле коңгуроо башталганда, бул глобалдык өзгөрүүлөрдүн жардамы менен, ар кандай нерселердин баары баскычтарды басат.

// zet пин номерлери mainButton (snaar) en andere button are aan verbonden zijn: const int mainButton = A1; // lightSensor = A0; const int buttonPin1 = 2; // баскычтардын саны 1 const int buttonPin2 = 3; // баскыч баскычы2const int buttonPin3 = 4; // баскыч баскычы3const int buttonPin4 = 5; // баскыч баскычы4const 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};

Жарык диоддорду иштетүү үчүн буларды тандаңыз.

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 саны

Глобалдык өзгөрүүлөр башка мамлекеттердин сенсорлору (потенциометрдин, личценсордун баскычтары).

// initialiseer buttonStates жана knoppen (niet of your data) 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;

Жайгашуу

Жараксыз орнотуу функциясы жок. Deze is van het type void (geeft geen waarde terug) жана көрсөтмөлөрдүн бири дагы жок кылынган.

Бул жерде комментарийлер бар, бирок бул жерде. Кошумча функциялар концерттик программада көрсөтүлгөн, бул да ардуино шилтемесинде.

жараксыз орнотуу () {// маалыматтын ылдамдыгы секундасына (берилиш) сериясына берилиштерди берүү Serial.begin (9600); // LEDPin баштапкы абалга келтирүү pinMode (ledPin1, OUTPUT); pinMode (ledPin2, OUTPUT); pinMode (ledPin3, OUTPUT); pinMode (ledPin4, OUTPUT); pinMode (ledPin5, OUTPUT); // initialiseer alle pushbuttons als 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); }

Void functie

Настройка () functie volgt de loop () функциясы, көрсөтмөлөрү өчүп баратат.

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

// бардык массивдеги баскычтардын абалы

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

// потенциометр жана личценсор

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

// mainStates en geef де стандаард waarden 0 дюйм жарыялоочу.

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

// array over 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) ингидрукт is, print all all knopnamen, allle buttonstates if (mainButtonState == HIGH) {Serial.print (namenKnoppen ); Serial.print (","); Serial.println (buttonStates ); }}

4 -кадам: Uittesten прототиби

Nadat het прототипи gebouwd - бул коддо geschreven иштеп чыгууда, ал дагы эле прототип болуп саналат. Бул видеолордун бири болуп саналат, бул дагы бир топ жооптордун бири болуп саналат.

Видео тведе видеону кайра иштетүү потенциометрин иштетүү учурунда начарлайт.

5 -кадам: "Онтмантелени" иштетүү Компоненттердин тизмеси Гебрукт Гаан Ворден

Behuizing
Behuizing
Behuizing
Behuizing
Behuizing
Behuizing
Behuizing
Behuizing

Ал эми код туура эмес болсо, биз гитаранын баатыр-гитарасынын "онтмантелени" менен таанышып чыктык. Биз ачык контролдоочу менен таанышып чыктык. Убелгилүү болгондой эле, биз баскычтарды өзүбүздүн баскычтар менен басабыз, ал эми баскычтарды басабыз (zie volgende stap). Биз өзүбүздүн продуктубузду иштеткенден кийин, өнүмдөрдү иштетебиз (баскычты баскычтар менен бириктирип койгула), биз тве баскычтарын басып койобуз (бул жерде сүрөт). Жарыкка чыккандан кийин (туура эмес болгон учурда).

6 -кадам: Werking Originele баскычтары + Дремелен

Werking Originele баскычтары + Dremelen
Werking Originele баскычтары + Dremelen

Бул видеолордун бири да тве оригинал болуп саналат.

Төмөнкү баскычтарды баскычынан чыккыла: биз де бинненкант жана де оригенелден баш тарткан жокпуз, сүрөттөр да жок.

7 -кадам: төшөктү тытуу + баскычтары Vastlijmen

Төшөктү тазалоочу солдерен + баскычтары Vastlijmen
Төшөктү тазалоочу солдерен + баскычтары Vastlijmen
Төшөктү тазалоочу солдерен + баскычтары Vastlijmen
Төшөктү тазалоочу солдерен + баскычтары Vastlijmen
Төшөктү тазалоочу солдерен + баскычтары Vastlijmen
Төшөктү тазалоочу солдерен + баскычтары Vastlijmen

Omdat we niet meer met ean breadboard werken moeten de draden gesoldeerd worden om zo de verschillende komponenten met elkaar te verbinden. Надат диб гебеурд - бул биз баскычтардын басымдуу бөлүгүндө турган нерселер, бул сүрөттөрдүн сүрөттөрү. Eens dit gebeurd is kunnen we doorgaan naar de volgende stap.

8 -кадам: Де Бехуизингде макен мактайт

Plaats Maken De Behuizing
Plaats Maken De Behuizing
Plaats Maken De Behuizing
Plaats Maken De Behuizing
Plaats Maken De Behuizing
Plaats Maken De Behuizing

Omdat dit Guitar Hero-model redelijk krap was me me te werken hebben we кошумча plaats moeten maken d.m.v. dremelen. Бул жерде биз акысыз сюжеттерди колдонобуз, бирок бул жерде патраттар да жок болот. Добуш берүүдөн баш тарткыла, биз буларды колдонобуз, бирок биз өлөбүз, биз оптималдуу түрдө өлөбүз. Сүрөттөрдүн тизмеси бизде да жок болот, бирок биз дагы ачкычтан баш тарткан жокпуз. Сүрөттөрдүн тизмеси бизде жокко эсе, биз рекордстрейктер менен иштейбиз, бирок Arduino эшиктин дарбазасы ачылган жок.

9 -кадам: төшөктү эзүү 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

Комментарийлерди жүктөп да, колдоно да тургула. Бул жерде сиз өзүңүздүн жеке менчигиңизди колдоно аласыз, бул дагы нанборд, жана эң натыйжалуусу. Биз сизди таң калтырган жокпуз. Бул жерде эң башкы нерсе - бул эң башкысы (эң башкы сүрөт 2).

10 -кадам: Верстевиген

Verstevigen
Verstevigen

Акыркы бүтүрүү - бул кошумча стабилдүүлүк. Op deze foto is te zien hoe we het deel dat we er hebben uitgehaald d.m.v. dremelen achteraan де баскычтар карточкалар менен таанышты.

11 -кадам: Code Voor Het Communiceren Reaper менен жолугушту

Code Voor Het Communiceren Reaper менен жолугушту
Code Voor Het Communiceren Reaper менен жолугушту
Code Voor Het Communiceren Reaper менен жолугушту
Code Voor Het Communiceren Reaper менен жолугушту
Code Voor Het Communiceren Reaper менен жолугушту
Code Voor Het Communiceren Reaper менен жолугушту
Code Voor Het Communiceren Reaper менен жолугушту
Code Voor Het Communiceren Reaper менен жолугушту

Deze коду дюймдо ачылган, ал эми дээл де arduino IDEде (интерактивдүү өнүгүү чөйрөсү) иштейт. Die code wordt geüpload наард arduino zelf en dient om all all waarden van de sensors van de midi controller uit te lezen en door te sturen naar processing.

Кайра иштетүү - бул тведе. Dee коду бардык нерселердин бардыгын камтыйт.

Arduino

/* Бул код сериялык аркылуу иштетүү менен байланышуу үчүн негизги эскиз.

Бул өзүңүздүн кодуңузду киргизе турган план

жеке баскычтар, потенциометрлер же сенсорлор үчүн көрсөтүлгөн.

Байланыш бар экенине ынануу үчүн кол алышуу бар

жана биз билдирип жаткан формат чечилет

Билдирүүнү дал ушундай жол менен куруу маанилүү, Ошентип, Processing аны кантип конструкциядан чыгарууну жана биздин DAWке туура OSC-билдирүүлөрдү жөнөтүүнү билет

werkcollege AV&IT үчүн жасалган

октябрь 2017

*

/ baud rate

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; // тремоло

// Бул функция иштетүү эскизи менен байланыш түзүү үчүн керек

// Бул жерде жараксыз калтырыңыз // тамга жөнөтүү жана жоопту күтүү… кечигүү (loopPauseTime); } Serial.read (); }

жараксыз орнотуу () {

// pinModes'ти бардык казыктарга орнотуңуз (int i = 0; i <aantalKnoppen; i ++) {pinMode (knopPinnen , INPUT); } pinMode (mainButton, INPUT); // комментарий бербегиле, эгерде сенсорлорду 5Внын ордуна 3Вде иштесеңиз // "ext" пинди 3.3Vга да туташтырууга туура келет // analogReference (EXTERNAL);

// Serial comms баштоо

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); // мисалдар: // float v0 = карта (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 ); 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); }

Иштетилүүдө

Жоопкерчиликтен баш тартуу: Бардык коддор кайра иштетүү эскиздерин каттоодон өткөрөт, коду дагы эң жакшы: ProcessingSoundControl_handout_v6_1.pde бижледжде

Көрсөтмөлөрдү аткарыңыз (индиялык индия):

// Baudrate moet hetzelfde zijn zoals in de arduino sketch

final int baudRate = 115200;

// Оруп алуучу IP дареги (бижледждеги скриншоттор)

// Документтерди иштетүү жана кайра иштетүү

// акыркы String remoteIP = "192.168.1.43"; // мис. "127.0.0.1";

final String remoteIP = "10.3.209.60";

// sendPortко көңүл буруңуз жана муну Reaperге толтуруңуз.

// Бул порт иштетүү жөнөтөт жана орокчу угат.

final int listenPort = 12000, sendPort = 12000;

// Бул жерде listenPort активдүү түрдө мүчүлүштүктөрдү оңдоо болуп саналат.

// порт аттары мүчүлүштүктөрдү оңдоо үчүн бул жерде.

// акыркы String portName = "/dev/ttyACM0";

акыркы String portName = "COM5"; // "/dev/ttyUSB0";

////////////////////// КОЛДОНУЧТУН ПАРАМЕТРЛЕРИНИН АЯГЫ ///////////////////////// ////

импортту иштетүү.сериал.*;

java.util импорттоо.*;

oscP5 импорттоо.*;

netP5 импорттоо.*;

OscP5 oscP5;

NetAddress myRemoteLocation;

Serial commsPort; // Сериялык порт

логикалык билдирүүArrived = false;

Кирүүчү сап = "", IncomingOSCMessage = "";

final char startChar = '*', endChar = '#'; final 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 ("Exception Message:" + ex); printArray (resVec); чыгуу (); }}

// Биздин билдирүүлөрдү чыпкалоо үчүн

/ * Биз * киргизүү билдирүүсү (Сериялык) өзгөргөндө OSC-билдирүүсү бар экенине ынанабыз * Башкача айтканда: эгер биз баскычты буруп/бассак, ал маанини өзгөртөт. * Ошентип, биз иш жүзүндө өзгөрүп жаткан кирүүчү баалуулуктарды чыпкалайбыз * эскертүү: биз мисалы, акселерометрлерден же аралык сенсорлорунан келген секириктен качпайбыз *, буларды өзүңүз Arduino */ void filterParams () {toSendParams = new ичинде жылмакай кылышыңыз керек болот. HashMap (); үчүн (String key: newParams.keySet ()) {// эгерде ачкыч мурунтан эле бар болсо (oldParams.containsKey (key)) {// ачкычы бирдей эмес болсо, анда (! oldParams.get (key)).equals (newParams.get (key))) {toSendParams.put (key, newParams.get (key)); }} else {// ачкычы эски параметрлерде жок, андыктан! toSendParams.put (key, newParams.get (key)); } oldParams.put (key, newParams.get (key)); }}

жараксыз makeOSC () {

for (String key: toSendParams.keySet ()) {OscMessage myMessage = new OscMessage ("/"+ key); myMessage.add (toSendParams.get (key)); / * билдирүү жөнөтүү */ oscP5.send (myMessage, myRemoteLocation); }}

жараксыз translateMessage () {

processIncoming (); filterParams (); makeOSC (); } // HashMap текстинде белгиленгендей, келген билдирүүнү көрүү үчүн void ShowIncoming () {// терезесине басып чыгаргысы келгенде ("Ардуинодон келгендер", 20, 20); int y = 20; for (String key: newParams.keySet ()) {y = y+20; текст (ачкыч, 20, у); текст (newParams.get (key), 300, y); }}

жараксыз showOsc () {

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

жараксыз орнотуу () {

өлчөмү (1000, 800); // Этаптын көлөмүн толтуруу (255); background (0); oldParams = жаңы HashMap (); newParams = жаңы HashMap (); // printArray (Serial.list ()); commsPort = жаңы серия (бул, portName, baudRate);

/ * баштоо oscP5, келген билдирүүлөрдү угуу */

oscP5 = жаңы OscP5 (бул, listenPort);

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

жараксыз тартуу () {

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

жараксыз serialEvent (Serial commsPort) {

// сериялык порттон байт окуу: char inChar = commsPort.readChar (); switch (inChar) {case contactCharacter: commsPort.write (contactCharacter); // көбүрөөк println сураңыз ("баштап…"); тыныгуу; case startChar: incoming = ""; тыныгуу; case endChar: messageArrived = true; // println ("msg аягы"); тыныгуу; демейки: кирген += inChar; тыныгуу; }}

/* келген Оск кабар oscEvent ыкмасына жөнөтүлөт. */

void oscEvent (OscMessage theOscMessage) {float value = theOscMessage.get (0).floatValue (); // 1 -Оскар аргументин алыңыз

IncomingOSCMessage += "\ n" +

String.format ("### Оскар билдирүүсүн алды:" + "addrpattern:" + theOscMessage.addrPattern () + ": %f", мааниси); println (IncomingOSCMessage); }

12 -кадам: Контроллер Uittesten

Nu alles aangesloten, alle code is alles geschreven en alles is gedubbelcheckt is het eindelijk tijd om de controller z'n werk te laten doen. Жыйынтыгында Reaper гитаранын гитарасы MIDI контроллери менен иштейт!

Сунушталууда: