สารบัญ:
- ขั้นตอนที่ 1: วัด Heb Je Nodig?
- ขั้นตอนที่ 2: การประมวลผลโค้ด
- ขั้นตอนที่ 3: รหัส Arduino
- ขั้นตอนที่ 4: Reaper
- ขั้นตอนที่ 5: Behuizing
- ขั้นตอนที่ 6: Elektronica
- ขั้นตอนที่ 7: Medewerkers
วีดีโอ: Retro Controller: 7 ขั้นตอน
2024 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2024-01-30 13:07
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?
ส่วนประกอบ
- 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
/* รหัสนี้เป็นแบบร่างพื้นฐานในการสื่อสารกับการประมวลผลผ่านซีเรียล
เป็นพิมพ์เขียวที่คุณสามารถใส่รหัสของคุณเองซึ่งระบุไว้สำหรับปุ่ม โพเทนชิโอมิเตอร์ หรือเซ็นเซอร์ของคุณเอง
มีการจับมือกันเพื่อให้แน่ใจว่าเรามีการติดต่อและรูปแบบที่เรากำลังสื่อสารได้รับการตัดสิน
สิ่งสำคัญคือต้องสร้างข้อความในลักษณะเดียวกัน เพื่อให้การประมวลผลรู้วิธีแยกแยะและส่งข้อความ 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
พันธุ์: 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
- เมย์ส เอล บาบา
- Arno Gorissen
- มิเคียล เดอ วานเดอแลร์
แนะนำ:
Retro Arcade - (ขนาดเต็มขับเคลื่อนโดย Raspberry Pi): 8 ขั้นตอน
Retro Arcade - (ขนาดเต็มขับเคลื่อนโดย Raspberry Pi): ก่อนอื่นฉันอยากจะขอบคุณสำหรับการดูคู่มือการสร้างสำหรับระบบ Retro Arcade นี้ ฉันกำลังนำกล่องอาร์เคดรุ่นเก่ามาวางไว้ในตู้แบบสแตนด์อโลนที่มีจอภาพไวด์สกรีนขนาด 24 นิ้ว การวัดในคู่มือนี้ค่อนข้างหยาบเพื่อให้ค
Retro "Rayotron" Night Light (ตอนที่ 1): 16 ขั้นตอน
Retro "Rayotron" Night Light (ตอนที่ 1): บทนำในเดือนธันวาคมปี 1956 Atomic Laboratories ได้โฆษณา Rayotron ว่าเป็นเครื่องกำเนิดไฟฟ้าสถิตและเครื่องเร่งอนุภาคต้นทุนต่ำเครื่องแรกสำหรับครูวิทยาศาสตร์และมือสมัครเล่น [1] Rayotron เป็นสายพานยางขนาดใหญ่พิเศษ
Retro CP/M Stand Alone Emulator: 8 ขั้นตอน
Retro CP/M Stand Alone Emulator: โปรเจ็กต์นี้ใช้โมดูล VGA32 ESP v1.4 เพื่อเรียกใช้ชุดค่าผสมหรือ RunCPM และ FabGL เพื่อให้คอมพิวเตอร์แบบสแตนด์อโลนที่ใช้ระบบเทียบเท่ากับ CP/M 2.2 เป็นที่นิยมในช่วงปี 1980 เป็นระบบปฏิบัติการสำหรับคอมพิวเตอร์ขนาดเล็ก สามารถกลับเข้า
ผู้เล่น 2 คน Stand-Up Retro Arcade โดย Micro Center: 20 ขั้นตอน
ผู้เล่น 2 คน Stand-Up Retro Arcade โดย Micro Center: Micro Center ในพื้นที่ของคุณตอนนี้มีทุกสิ่งที่คุณต้องการเพื่อสร้างตู้ Retro Arcade ที่ใช้ Raspberry Pi ของคุณเอง ชุดอุปกรณ์นี้ปรับแต่งได้อย่างสมบูรณ์ รวมถึงตู้, Raspberry Pi, ปุ่ม, จอยสติ๊ก, อุปกรณ์เสริมสำหรับเสียงและวิดีโอ และอื่นๆ มัน'
NES Controller Shuffle (Nintendo Controller MP3, V3.0): 5 ขั้นตอน (พร้อมรูปภาพ)
NES Controller Shuffle (Nintendo Controller MP3, V3.0): ฉันลอก ryan97128 ออกจากการออกแบบของเขาสำหรับ Nintendo Controller MP3 เวอร์ชัน 2.0 และฉันได้ยินมาว่าเขาได้แนวคิดมาจาก Morte_Moya ที่ฉลาดทั้งหมด ดังนั้นฉันจึงรับเครดิตไม่ได้ อัจฉริยะทั้งหมดของพวกเขา ฉันแค่ต้องการเพิ่มความสะดวกสบายและเติมเงิน -