Оглавление:

Ретро-контроллер: 7 шагов
Ретро-контроллер: 7 шагов

Видео: Ретро-контроллер: 7 шагов

Видео: Ретро-контроллер: 7 шагов
Видео: Лучший Ретро Геймпад Что Я Видел! SEGA Геймпад 8BitDo M30 2024, Ноябрь
Anonim
Ретро Контроллер
Ретро Контроллер

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

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

На кассете Kwam Van Van Een был сделан контроллер, созданный для открытой кассеты.

Шаг 1: Wat Heb Je Nodig?

Wat Heb Je Nodig?
Wat Heb Je Nodig?

Componenten

- 2 кнопки;

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

- 2 верстандена (1 тыс. Лосей);

- Arduino uno / nano

- Draadjes (zie elektronisch schema)

- Soldeerplaat

- подушка из МДФ

Инструменты

- лазерный резак

- Книптанг

- Стриптанг

- Soldeerbout (металлическая жесть)

Programma's

- Иллюстратор / indesign (Текенпрограмма)

- Жнец

- Обработка

- Ардуино

Шаг 2: обработка кода

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

/**

* Базовый скетч для получения последовательных сообщений от Arduino * и преобразования их в сообщения OSC для Reaper * * Вам нужно будет адаптировать ПАРАМЕТРЫ ПОЛЬЗОВАТЕЛЯ * и вам нужно будет установить библиотеку: oscP5 * * для werkcollege AV&IT * от annoo bob eddi * октябрь 2017 * * / ///////////////////// ПАРАМЕТРЫ ПОЛЬЗОВАТЕЛЯ ////////////////////// ////////

/ убедитесь, что вы используете ту же скорость передачи в финальном скетче Arduino int baudRate = 115200;

// Идем и ищем IP-адрес в Reaper при использовании OSC // Это адрес, который Processing отправляет и который слушает Reaper. // Поместите эту строку в remoteIP, здесь.

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

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

// Обратите внимание на sendPort и заполните его в Reaper. // Это порт, который обрабатывает и слушает Reaper.

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

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

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

final String portName = "другое имя порта в gevonden в Arduino";

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

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

import processing.serial. *; import java.util. *;

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

OscP5 oscP5; NetAddress myRemoteLocation;

Последовательный порт commsPort; // Логическое значение последовательного порта messageArhibited = 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); выход(); }}

// Для фильтрации наших сообщений. * Таким образом, мы отфильтровываем входящие значения, которые на самом деле меняются. 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 () {size (1000, 800); // Размер сцены fill (255); фон (0); oldParams = новая HashMap (); newParams = новая HashMap (); // printArray (Serial.list ()); commsPort = новый последовательный порт (this, portName, baudRate);

/ * запускаем oscP5, ожидая входящих сообщений * / oscP5 = new 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 ("### получил сообщение осключения:" + "addrpattern:" + theOscMessage.addrPattern () + ":% f", value); println (Входящее сообщениеOSCMessage); }

Шаг 3: код Arduino

Код Ардуино
Код Ардуино

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

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

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

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

сделано для werkcollege AV&IT октябрь 2017 г.

code smooothing создано 22 апреля 2007 г. Дэвидом А. Меллисом, изменено 9 апреля 2012 г. Томом Иго

*/

/ скорость передачи const long baudRate = 115200;

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

// начальное и конечное значения для сообщения, отправленного на Serial const String startString = "*", endString = "#";

const char contactCharacter = '|';

// идентификатор контакта 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; // переменная для чтения состояния кнопки float sensorValue1 = 0; датчик поплавкаValue2 = 0; датчик поплавкаValue3 = 0;

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

// Нам нужна эта функция, чтобы установить контакт со скетчем обработки // Сохраните ее здесь void installContact () {while (Serial.available () <= 0) {Serial.print (contactCharacter); // отправляем символ и ждем ответа… delay (loopPauseTime); } Serial.read (); }

void setup () {// устанавливаем pinModes для всех контактов pinMode (buttonPin1, INPUT); pinMode (buttonPin2, ВХОД); pinMode (pitchReading, INPUT); pinMode (скорость чтения, ВХОД); pinMode (InfraReading, INPUT);

// инициализируем последовательную связь Serial.begin (baudRate); в то время как (! серийный); // сглаживание для (int thisReading = 0; thisReading <numReadings; thisReading ++) {readings [thisReading] = 0; }

// ждем рукопожатия installContact (); }

void loop () {// опрашиваем все контакты и сопоставляем показания с соответствующим диапазоном buttonState1 = digitalRead (buttonPin1); buttonState2 = digitalRead (buttonPin2); sensorValue1 = analogRead (pitchReading); sensorValue2 = analogRead (скорость чтения); sensorValue3 = analogRead (инфракрасное считывание);

// сопоставление входящих значений с необходимыми значениями 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 + readings [readIndex3]; // переход к следующей позиции в массиве: readIndex3 = readIndex3 + 1;

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

Serial.print (startString); // запускаем последовательность сообщений // записываем все имена и пары значений через запятую Serial.print ("Potentio1"); Serial.print (","); Serial.print (sensorValue1); Serial.print (",");

Serial.print ("потенциал2"); Serial.print (","); Serial.print (sensorValue2); Serial.print (",");

Serial.print («инфра-сенсор»); Serial.print (","); Серийный принт (в среднем 3/100); Serial.print (",");

Serial.print («кнопка 1 на 2 остроумия»); Serial.print (","); Serial.print (buttonState1); Serial.print (","); Serial.print («кнопка2 в5 гел»); Serial.print (","); Serial.print (buttonState2);

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

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

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

Шаг 4: Жнец

Жнец
Жнец

Шаг 1: Ga bovenaan naar Options> Prefrences

Шаг 2: параметры настройки на Control / OSC / web en druk op Add

Шаг 3: Kies bij Режим панели управления для OSC (Open Sound Control)

Шаг 4: Vul je имя устройства в, винк Получение на порт анан уль в воде при обработке bij Sendport staat

Шаг 5: Копирование IP-адреса хоста в процессе обработки

Шаг 6: Друк op ok en de controller is nu verbonden met Reaper

Шаг 5: Behuizing

Behuizing
Behuizing

Порода: 170 мм

Длина: 90 мм.

Hoogte 30 мм

Кноппен: 16 мм (диаметр

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

Датчик Afstand: Breedte 2,9 мм

Удлинить 0,8 мм

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

Шаг 6: Elektronica

Шаг 1:

Заземление и 5 вольт от Arduino с макетной платой

Шаг 2:

Контакт Verbind A0 с потенциалом 1

Контакт Verbind A1 с потенциалом 2

Контакт Verbind A3 с инфракрасным датчиком.

Штифт Verbind A2 встретился с липкой кнопкой.

Штифт Verbind A5 встречался с липкой кнопкой.

Шаг 7: Medewerkers

Medewerkers
Medewerkers

- Майес Эль-Баба

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

- Мишель Де Ванделер

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