Съдържание:

Ретро контролер: 7 стъпки
Ретро контролер: 7 стъпки

Видео: Ретро контролер: 7 стъпки

Видео: Ретро контролер: 7 стъпки
Видео: Ошибки, которые нужно избегать при настройке эмулятора x360ce в 2023 году 2024, Ноември
Anonim
Ретро контролер
Ретро контролер

Wij zijn eerste jaar studenten uit de opleiding Multimedia & Communicatietechnologie (Multec) aan de Erasmushogeschool Brussel.

Samen hebben we een muziek controller gemaakt dat muziek kan starten/stoppen, de pitch kan verhogen, kan terugspoelen en nog meer.

Ons idee kwam van van een касета, ons doel беше om een controller te maken dat lijkt op een касета.

Стъпка 1: Wat Heb Je Nodig?

Wat Heb Je Nodig?
Wat Heb Je Nodig?

Компонентен

- 2 бутона;

- 2 потенциометра;

- 2 веренстандана (1K лос);

- Arduino uno/nano

- Draadjes (zie elektronisch схема)

- Soldeerplaat

- плоча от MDF

Инструменти

- Лазерно рязане

- Книптанг

- Стриптанг

- Soldeerbout (мет калай)

Програми

- Илюстратор/дизайн (Tekenprogramma)

- Жътварка

- Обработка

- Arduino

Стъпка 2: Обработка на код

Обработка на код
Обработка на код

/**

* Основна скица за получаване на серийни съобщения от Arduino * и ги превежда в OSC съобщения за Reaper * * Ще трябва да адаптирате ПАРАМЕТРИТЕ НА ПОТРЕБИТЕЛЯ * и ще трябва да инсталирате библиотека: oscP5 * * направена за werkcollege AV&IT * от annoo bob eddi * oct 2017 * *////////////////////// ПОТРЕБИТЕЛСКИ ПАРАМЕТРИ ////////////////////// ////////

/ уверете се, че използвате същата скорост на предаване във вашата скица на Arduino окончателен int baudRate = 115200;

// Отидете и потърсете IP-адреса в Reaper, когато използвате OSC // Това е адресът, който Processing изпраща и Reaper слуша. // Поставете този низ в remoteIP, тук.

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

final String remoteIP = "vul hier ip in gevonden in reaper";

// Вземете под внимание sendPort и го попълнете в Reaper. // Това е портът, който Processing изпраща и Reaper слуша.

краен int listenPort = 11000, sendPort = 12000;

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

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

final String portName = "vul hier de portname in gevonden in Arduino";

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

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

обработка на внос.serial.*; импортиране на java.util.*;

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

OscP5 oscP5; NetAddress myRemoteLocation;

Serial commsPort; // Логично съобщение на серийния портArrived = false;

Низ incoming = "", IncomingOSCMessage = "";

заключителен 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, когато * се променя входното съобщение (Serial) * Тоест: ако завъртим/натиснем бутона и той промени стойността. * Затова филтрираме входящите стойности, които действително се променят * забележка: няма да избегнем прескачане на стойности *, идващи например от акселерометри или сензори за разстояние * ще трябва сами да ги изгладите в 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 (String key: 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 () {text (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) {background (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 аргумент

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

Стъпка 3: Код Arduino

Код Arduino
Код Arduino

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

Това е план, в който можете да поставите свой собствен код, определен за вашите собствени бутони, потенциометри или сензори.

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

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

направено за werkcollege AV&IT окт 2017

изглаждащ код, създаден на 22 април 2007 г. от Дейвид А. Мелис, променен на 9 април 2012 г. от Том Иго

*/

/ скорост на предаване const long baudRate = 115200;

// време за изчакване в мс между анкети за изводите const int loopPauseTime = 200; // милисекунди

// начална и крайна стойност за съобщението, изпратено на Serial const String startString = "*", endString = "#";

const char contactCharacter = '|';

// pin id const int buttonPin1 = 2; const int buttonPin2 = 5; const int numReadings = 5; // оценяване на изглаждане на ван

int pitchReading = A1; int speedReading = A2; int infraReading = A3;

// други глобални променливи int buttonState1 = 0; int buttonState2 = 0; // променлива за четене на сензора за състояние на бутон на състоянието на бутонValue1 = 0; поплавъчен сензорValue2 = 0; поплавъчен сензорValue3 = 0;

// изглаждане на int показанията [numReadings]; // показанията от аналоговия вход int readIndex3 = 0; // индексът на текущото отчитане int total3 = 0; // текущата обща плаваща средна стойност3 = 0; // средното

// Нуждаем се от тази функция, за да установим контакт със скицата за обработка // Дръжте я тук void installContact () {while (Serial.available () <= 0) {Serial.print (contactCharacter); // изпращаме знак и чакаме отговор … забавяне (loopPauseTime); } Serial.read (); }

void setup () {// задайте pinModes за всички пинове pinMode (buttonPin1, INPUT); pinMode (buttonPin2, INPUT); pinMode (pitchReading, INPUT); pinMode (speedReading, INPUT); pinMode (infraReading, INPUT);

// инициализираме Serial comms Serial.begin (baudRate); while (! Сериен); // изглаждане за (int thisReading = 0; thisReading <numReadings; thisReading ++) {показания [thisReading] = 0; }

// изчакайте ръкостискане installContact (); }

void loop () {// анкетираме всички пинове и картографираме показанията в съответния диапазон buttonState1 = digitalRead (buttonPin1); buttonState2 = digitalRead (buttonPin2); sensorValue1 = analogRead (pitchReading); sensorValue2 = analogRead (speedReading); sensorValue3 = analogRead (infraReading);

// картографиране на входящите стойности към необходимите стойности sensorValue1 = map (sensorValue1, 0, 1023, 0, 100.0)/-100.0; sensorValue2 = map (sensorValue2, 0, 1023, 0.0, 100) /100.0; sensorValue3 = map (sensorValue3, 0, 700, 50, 100);

// изглаждащ сензор: total3 = total3 - показания [readIndex3]; // четене от сензора: показания [readIndex3] = sensorValue3; // добавяме показанията към общата сума: total3 = total3 + показания [readIndex3]; // напред към следващата позиция в масива: readIndex3 = readIndex3 + 1;

// ако сме в края на масива… if (readIndex3> = numReadings) {//… завъртане до началото: readIndex3 = 0; } // изчисляваме средната стойност: average3 = (total3 / numReadings); // изглаждащ сензор

Serial.print (startString); // стартиране на последователност от съобщения // wirte всички имена, стойности на двойки, разделени със запетаи Serial.print ("potentio1"); Serial.print (","); Serial.print (sensorValue1); Serial.print (",");

Serial.print ("potentio2"); Serial.print (","); Serial.print (sensorValue2); Serial.print (",");

Serial.print ("инфрасензор"); Serial.print (","); Serial.print (средно 3/100); Serial.print (",");

Serial.print ("knop 1 in2 wit"); Serial.print (","); Serial.print (buttonState1); Serial.print (","); Serial.print ("knop2 in5 geel"); Serial.print (","); Serial.print (buttonState2);

// записваме края на съобщението Serial.print (endString);

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

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

Стъпка 4: Жътварка

Жътварка
Жътварка

Стъпка 1: Опции за предпочитане> Предпочитания

Стъпка 2: Ga в предпочитанията на Control/OSC/web en druk op Add

Стъпка 3: Kies bij Контролен режим на повърхността за OSC (отворен контрол на звука)

Стъпка 4: Vul е име на устройството в, vink Получаване на порт aan en vul във ватер при обработката на бий Sendport staat

Стъпка 5: IP адресът на хоста на Kopieer е hier ziet en vul deze in in Processing

Стъпка 6: Druk op ok en de controller не е подробно запознат с Reaper

Стъпка 5: Behuizing

Behuizing
Behuizing

Размери: 170 мм

Дължина: 90 мм

Височина 30 мм

Knoppen: 16 мм (диаметър

Потенциометри: 3 мм (диаметър)

Сензор за стойка: Breedte 2,9 мм

Дължина 0,8 мм

Материал: MDF (3 мм)

Стъпка 6: Elektronica

Стъпка 1:

Verbind de ground и 5 -волтов ван Arduino се срещна с макет

Стъпка 2:

Гъвкав щифт A0 с потенциал 1

Гъвкав щифт A1 с потенциал 2

Verbind щифт A3 с инфрачервен сензор.

Гъвкав щифт A2 с дебел лепкав бутон.

Verbind щифт A5 с лепкав бутон.

Стъпка 7: Medewerkers

Medewerkers
Medewerkers

- Mayes El Baba

- Арно Горисен

- Михиел Де Ванделаер

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