สารบัญ:

Retro Controller: 7 ขั้นตอน
Retro Controller: 7 ขั้นตอน

วีดีโอ: Retro Controller: 7 ขั้นตอน

วีดีโอ: Retro Controller: 7 ขั้นตอน
วีดีโอ: รีวิวเกมส์10,000เกมส์ในเครื่องเดียว 2.4g wireless controller gamepad 2024, พฤศจิกายน
Anonim
ตัวควบคุมย้อนยุค
ตัวควบคุมย้อนยุค

Wij zijn eerste jaar studenten uit de opleiding Multimedia & Communicatietechnologie (Multec) aan de Erasmushogeschool บรัสเซลส์.

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

Ons idee kwam van van een cassette, ons doel ถูก om een controller te maken dat lijkt op een cassette

ขั้นตอนที่ 1: วัด Heb Je Nodig?

วัด Heb Je Nodig?
วัด Heb Je Nodig?

ส่วนประกอบ

- 2 ปุ่ม;

- 2 Potentio เมตร;

- 2 weerstanden (1K กวาง);

- Arduino อูโน่/นาโน

- Draadjes (สคีมา zie elektronisch)

- ประสานเสียง

- แผ่น MDF

เครื่องมือ

- เครื่องตัดเลเซอร์

- คนีตัง

- สตริปทัง

- Soldeerbout (พบดีบุก)

ของโปรแกรมมา

- นักวาดภาพประกอบ/ผู้ออกแบบ (Tekenprogramma)

- ยมทูต

- กำลังประมวลผล

- Arduino

ขั้นตอนที่ 2: การประมวลผลโค้ด

การประมวลผลรหัส
การประมวลผลรหัส

/**

* ร่างพื้นฐานเพื่อรับข้อความอนุกรมจาก Arduino * และแปลข้อความเหล่านั้นเป็นข้อความ OSC สำหรับ Reaper * * คุณจะต้องปรับพารามิเตอร์ผู้ใช้ * และคุณจะต้องติดตั้งไลบรารี: oscP5 * * สร้างขึ้นสำหรับ werkcollege AV&IT * โดย annoo bob eddi * ต.ค. 2017 * */ ///////////////////// พารามิเตอร์ผู้ใช้ /////////////////////////////////////// /////////

/ ตรวจสอบให้แน่ใจว่าคุณใช้อัตรา baud เดียวกันใน Arduino Sketch สุดท้าย int baudRate = 115200;

// ไปหาที่อยู่ IP ใน Reaper เมื่อใช้ OSC // นี่คือที่อยู่ที่กำลังประมวลผลส่งไปและ Reaper รับฟัง // ใส่สตริงนี้ใน remoteIP ที่นี่

//final String remoteIP = "192.168.1.43"; //เช่น. "127.0.0.1";

Final String remoteIP = "vul hier ip ใน gevonden ใน reaper";

// จด sendPort และกรอกข้อมูลใน Reaper // นี่คือพอร์ตที่การประมวลผลส่งไปและ Reaper รับฟัง

ขั้นสุดท้าย listenPort = 11000, sendPort = 12000;

// ListenPort ที่นี่คือการดีบักอย่างแข็งขัน

// portNames อยู่ที่นี่เพื่อแก้ไขข้อบกพร่องเช่นกัน

สุดท้าย String portName = "vul hier de portname ใน gevonden ใน Arduino";

// สตริงสุดท้าย portName = "COM6"; // "/dev/ttyUSB0";

///////////////////// สิ้นสุดพารามิเตอร์ผู้ใช้ //////////////////////// ////

นำเข้าการประมวลผล.ซีเรียล.*; นำเข้า java.util.*;

นำเข้า oscP5.*; นำเข้า netP5.*;

OscP5 oscP5; NetAddress myRemoteLocation;

Serial commsPort; // the serial port boolean messageArrived = false;

สตริงขาเข้า = "", OSCMessage ขาเข้า = "";

อักขระสุดท้าย startChar = '*', endChar = '#'; อักขระสุดท้าย contactCharacter = '|';

// เพื่อให้แน่ใจว่าเราส่งเฉพาะพารามิเตอร์ (ค่า) ที่เปลี่ยนแปลง // ตัวแปรทั่วโลกเหล่านี้ถูกลบออกที่นี่ แต่ควร // ไม่ควรเริ่มต้นที่นี่! HashMap oldParams, newParams, toSendParams;

// เราจำเป็นต้องแยกข้อความในทุก ๆ เครื่องหมายจุลภาค void processIncoming () { String resVec = incoming.split(", "); // เราได้ชื่อ + คู่ค่า // ดังนั้นสำหรับทุกชื่อ (+2)… ลอง{ สำหรับ (int i = 0; i< resVec.length; i+=2) { float value = Float.parseFloat(resVec[i+) 1]); // ใส่ไว้ใน Hashtable newParams.put(resVec, value); ใหม่ } } // หากเกิดข้อผิดพลาด ให้จับการแสดงผลและออก catch (ยกเว้นข้อยกเว้น) { println ("ข้อความข้อยกเว้น: " + อดีต); printArray(resVec); ทางออก(); } }

// เพื่อกรองข้อความของเรา /* ตรวจสอบให้แน่ใจว่ามีเพียงข้อความออก OSC เมื่อ * ข้อความอินพุต (ซีเรียล) เปลี่ยนแปลง * นั่นคือ: หากเราเปิด/กดปุ่มและมันจะเปลี่ยนค่า * ดังนั้นเราจึงกรองค่าที่เข้ามาที่เปลี่ยนแปลงจริงออก * หมายเหตุ: เราจะไม่หลีกเลี่ยงค่ากระโดด * เนื่องจากมาจากมาตรความเร่งหรือเซ็นเซอร์ระยะทาง * คุณจะต้องทำให้ค่าเหล่านั้นราบรื่นใน Arduino */ void filterParams () { toSendParams = new แฮชแมป (); สำหรับ (คีย์สตริง: newParams.keySet ()) { // หากคีย์มีอยู่แล้วหาก (oldParams.containsKey (คีย์)) { // คีย์ปัจจุบันและค่าไม่เหมือนกัน ให้อัปเดตหาก (!oldParams.get (คีย์)). เท่ากับ (newParams.get (คีย์))) { toSendParams.put (คีย์ newParams.get (คีย์)); } } else{ // ไม่มีคีย์ใน params เก่า ดังนั้นวางไว้! toSendParams.put(คีย์ newParams.get(คีย์)); } oldParams.put(คีย์ newParams.get(คีย์)); } }

เป็นโมฆะ makeOSC () { สำหรับ (คีย์สตริง: toSendParams.keySet ()) { OscMessage myMessage = ใหม่ OscMessage ("/" + คีย์); myMessage.add(toSendParams.get(คีย์)); /* ส่งข้อความ */ oscP5.send(myMessage, myRemoteLocation); } }

เป็นโมฆะ translateMessage () { processIncoming (); filterParams(); makeOSC(); } // เมื่อเราต้องการพิมพ์ไปที่หน้าต่าง void ShowIncoming() { // เพื่อดูข้อความขาเข้าตามที่กำหนดไว้ในข้อความ HashMap ("ขาเข้าจาก Arduino", 20, 20); int y = 20; สำหรับ (คีย์สตริง: newParams.keySet()) { y = y+20; ข้อความ(คีย์, 20, y); ข้อความ (newParams.get(คีย์), 300, y); } }

เป็นโมฆะ showOsc () { ข้อความ (IncomingOSCMessage, 300, 200); OSCMessage ขาเข้า =""; }

การตั้งค่าเป็นโมฆะ () { ขนาด (1000, 800); // ขนาดสเตจ เติม (255); พื้นหลัง(0); oldParams = ใหม่ HashMap (); newParams = ใหม่ HashMap (); //printArray(Serial.list()); commsPort = ซีเรียลใหม่ (นี่, ชื่อพอร์ต, baudRate);

/* เริ่ม oscP5, ฟังข้อความขาเข้า */ oscP5 = ใหม่ OscP5 (นี่, listenPort);

/* myRemoteLocation คือ NetAddress NetAddress รับ 2 พารามิเตอร์ * ที่อยู่ IP และหมายเลขพอร์ต myRemoteLocation ใช้เป็นพารามิเตอร์ใน * oscP5.send() เมื่อส่งแพ็กเก็ต osc ไปยังคอมพิวเตอร์ อุปกรณ์ แอปพลิเคชัน * เครื่องอื่น การใช้งานดูด้านล่าง สำหรับวัตถุประสงค์ในการทดสอบพอร์ตการฟัง * และพอร์ตของที่อยู่ตำแหน่งระยะไกลจะเหมือนกัน ดังนั้นคุณจะ * ส่งข้อความกลับไปที่ร่างนี้ */ myRemoteLocation = NetAddress ใหม่ (remoteIP, sendPort); }

ถือเป็นโมฆะวาด () { ถ้า (messageArrived) { พื้นหลัง (0); แปลข้อความ (); แสดงขาเข้า (); messageArrived=เท็จ; } showOsc(); }

ถือเป็นโมฆะ serialEvent (Serial commsPort) { // อ่านไบต์จากพอร์ตอนุกรม: ถ่าน inChar = commsPort.readChar (); สวิตช์ (inChar) { กรณี contactCharacter: commsPort.write (contactCharacter); // ขอเพิ่มเติม println("starting…"); หยุดพัก; กรณี startChar: ขาเข้า = ""; หยุดพัก; case endChar: messageArrived = true; //println("ข้อความสิ้นสุด"); หยุดพัก; ค่าเริ่มต้น: ขาเข้า += inChar; หยุดพัก; } }

/* ข้อความ osc ขาเข้าจะถูกส่งต่อไปยังเมธอด oscEvent */ เป็นโมฆะ oscEvent (OscMessage theOscMessage) { ค่าลอย = theOscMessage.get (0).floatValue (); // รับอาร์กิวเมนต์ osc ที่ 1

IncomingOSCMessage += "\n" + String.format("### ได้รับข้อความ osc: " + " addrpattern: " + theOscMessage.addrPattern() + ": %f", ค่า); println(OSCMessage ขาเข้า); }

ขั้นตอนที่ 3: รหัส Arduino

รหัส Arduino
รหัส Arduino

/* รหัสนี้เป็นแบบร่างพื้นฐานในการสื่อสารกับการประมวลผลผ่านซีเรียล

เป็นพิมพ์เขียวที่คุณสามารถใส่รหัสของคุณเองซึ่งระบุไว้สำหรับปุ่ม โพเทนชิโอมิเตอร์ หรือเซ็นเซอร์ของคุณเอง

มีการจับมือกันเพื่อให้แน่ใจว่าเรามีการติดต่อและรูปแบบที่เรากำลังสื่อสารได้รับการตัดสิน

สิ่งสำคัญคือต้องสร้างข้อความในลักษณะเดียวกัน เพื่อให้การประมวลผลรู้วิธีแยกแยะและส่งข้อความ OSC ที่ถูกต้องไปยัง DAW ของเรา

สร้างขึ้นสำหรับ werkcollege AV&IT ต.ค. 2017

code smooothing สร้าง 22 เมษายน 2550 โดย David A. Mellis ปรับปรุง 9 เมษายน 2555 โดย Tom Igoe

*/

/ อัตราบอด 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; // ตัวแปรสำหรับอ่านสถานะ float sensorValue1 = 0; เซ็นเซอร์ลอยค่า2 = 0; เซ็นเซอร์ลอยค่า3 = 0;

// ปรับการอ่าน int ให้ราบรื่น [numReadings]; // การอ่านจากอินพุทอนาล็อก int readIndex3 = 0; // ดัชนีของการอ่านค่าปัจจุบันทั้งหมด 3 = 0; // ยอดรวมลอยเฉลี่ย 3 = 0; // เฉลี่ย

// เราต้องการฟังก์ชันนี้เพื่อสร้างการติดต่อกับแบบร่างการประมวลผล // เก็บไว้ที่นี่เป็นโมฆะ createContact() { while (Serial.available() <= 0) { Serial.print(contactCharacter); // ส่งถ่านและรอการตอบกลับ… ล่าช้า (loopPauseTime); } Serial.read(); }

การตั้งค่าเป็นโมฆะ () {// ตั้งค่า pinMode สำหรับพินทั้งหมด pinMode (buttonPin1, INPUT); pinMode(ปุ่มPin2, INPUT); pinMode (pitchReading, INPUT); pinMode (การอ่านความเร็ว, อินพุต); pinMode (infraReading, INPUT);

// เริ่มต้นการสื่อสารแบบอนุกรม Serial.begin (baudRate); ในขณะที่ (!ซีเรียล); // ปรับให้เรียบสำหรับ (int thisReading = 0; thisReading < numReadings; thisReading ++) { การอ่าน [thisReading] = 0; }

// รอการจับมือสร้างContact(); }

วงเป็นโมฆะ () { // โพลพินทั้งหมดและจับคู่การอ่านกับช่วงที่เหมาะสม buttonState1 = digitalRead (buttonPin1); buttonState2 = digitalRead (ปุ่มพิน2); sensorValue1 = analogRead (pitchReading); sensorValue2 = analogRead (การอ่านความเร็ว); sensorValue3 = analogRead (infraReading);

//การจับคู่ค่าขาเข้ากับค่าที่จำเป็น sensorValue1 = map(sensorValue1, 0, 1023, 0, 100.0)/-100.0; sensorValue2 = แผนที่ (sensorValue2, 0, 1023, 0.0, 100)/100.0; sensorValue3 = แผนที่ (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(เซ็นเซอร์ค่า1); Serial.print(", ");

Serial.print("potentio2"); Serial.print(", "); Serial.print(เซ็นเซอร์ค่า2); Serial.print(", ");

Serial.print("เซ็นเซอร์อินฟาเรด"); Serial.print(", "); Serial.print (เฉลี่ย 3/100); Serial.print(", ");

Serial.print("knop 1 in2 ปัญญา"); Serial.print(", "); Serial.print (ปุ่มสถานะ1); Serial.print(", "); Serial.print("knop2 in5 geel"); Serial.print(", "); Serial.print(buttonState2);

// เขียนส่วนท้ายของข้อความ Serial.print(endString);

// รอสักครู่..

ล่าช้า (loopPauseTime); }

ขั้นตอนที่ 4: Reaper

ยมทูต
ยมทูต

ขั้นตอนที่ 1: Ga bovenaan naar Options>Prefrences

ขั้นที่ 2: ตั้งค่าล่วงหน้า naar Control/OSC/web en druk op Add

ขั้นตอนที่ 3: Kies bij โหมดพื้นผิวควบคุมสำหรับ OSC (Open Sound Control)

ขั้นตอนที่ 4: ชื่ออุปกรณ์ Vul je ใน, vink รับที่พอร์ต aan en vul ใน wat er ในการประมวลผล สถานะ Sendport

ขั้นตอนที่ 5: Kopieer de Host IP die je hier ziet en vul deze in in Processing

ขั้นตอนที่ 6: Druk op ok en de controller is nu verbonden met Reaper

ขั้นตอนที่ 5: Behuizing

Behuizing
Behuizing

พันธุ์: 170 mm

ความยาว: 90 mm

Hoogte 30 มม.

น็อต: 16 มม. (เส้นผ่านศูนย์กลาง

Potentio เมตร: 3 มม. (เส้นผ่านศูนย์กลาง)

เซ็นเซอร์หลัง: Breedte 2.9 mm

ความยาว 0.8 มม.

วัสดุ: MDF (3mm)

ขั้นตอนที่ 6: Elektronica

ขั้นตอนที่ 1:

Verbind de ground en 5 volt van Arduino พบกับเขียงหั่นขนม

ขั้นตอนที่ 2:

Verbind pin A0 มีศักยภาพ 1

Verbind pin A1 ตรงกับ potentio 2

Verbind pin A3 พร้อมเซ็นเซอร์อินฟราเรด

Verbind pin A2 กับปุ่มเหนียวเหนอะหนะ

Verbind pin A5 พบกับปุ่มเหนียว

ขั้นตอนที่ 7: Medewerkers

Medewerkers
Medewerkers

- เมย์ส เอล บาบา

- Arno Gorissen

- มิเคียล เดอ วานเดอแลร์

แนะนำ: