תוכן עניינים:

בקר רטרו: 7 שלבים
בקר רטרו: 7 שלבים

וִידֵאוֹ: בקר רטרו: 7 שלבים

וִידֵאוֹ: בקר רטרו: 7 שלבים
וִידֵאוֹ: קונסולת רטרו ניידת עם 6,000 משחקי רטרו מדהימים 2024, נוֹבֶמבֶּר
Anonim
בקר רטרו
בקר רטרו

אנו הם הראשון שנה סטודנטים מההשכלה מולטימדיה ותקשורת (Multec) aan de Erasmushogeschool Brussel.

אנחנו כבר יכולים לשלוט במוזיקה בכלי מוזיקה שיכולים להתחיל/לעצור, להצליח ולשנות יותר.

הרעיון שלנו הגיע לקסטה, והמטרה שלנו הייתה לבקר שנוכל ליצור קלטת על קלטת.

שלב 1: Wat Heb Je Nodig?

Wat Heb Je Nodig?
Wat Heb Je Nodig?

רכיבים

- 2 כפתורים;

- 2 מטרים פוטנציאליים;

- 2 weerstanden (1K איילים);

- Arduino uno/nano

- Draadjes (ראה סכמה אלקטרונית)

- Soldeerplaat

- לוח MDF

כלים

- חיתוך לייזר

- Kniptang

- סטריפנג

- Soldeerbout (עם פח)

תוכניות

- אילוסטרטור/אינדיזיין (תוכנת Teken)

- קוצר

- מעבד

- ארדואינו

שלב 2: עיבוד קוד

עיבוד קוד
עיבוד קוד

/**

* שרטוט בסיסי לקבלת הודעות סידריות מ- Arduino * ומתרגם אותן להודעות OSC עבור Reaper * * יהיה עליך להתאים את פרמטרי USER * ותצטרך להתקין ספרייה: oscP5 * * שנוצרה עבור werkcollege AV&IT * מאת annoo bob eddi * אוקטובר 2017 * */////////////////////// פרמטרים של משתמשים ////////////// ////////

/ וודא שאתה משתמש באותו קצב שידור בשיטת Arduino final int baudRate = 115200;

// לך וחפש את כתובת ה- IP ב- Reaper בעת שימוש ב- OSC // זוהי הכתובת שעיבוד שולח אליה ו Reaper מקשיב לה. // הכנס את המחרוזת הזו ל- remoteIP, כאן.

// מחרוזת סופית remoteIP = "192.168.1.43"; //לְמָשָׁל. "127.0.0.1";

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

// שימו לב ל- sendPort ומלאו זאת ב- Reaper. // זהו היציאה שאליו העיבוד שולח ו Reaper מקשיב.

int int listenPort = 11000, sendPort = 12000;

// ה- listenPort כאן נועד לאיתור באגים באופן פעיל.

// שמות הנמל נמצאים כאן כדי לאתר באגים גם כן.

final String portName = "vul hier de portname נמצא ב- Arduino";

// final String portName = "COM6"; // "/dev/ttyUSB0";

/////////////////////// סוף של פרמטרים של משתמשים ////////////// ////

ייבוא עיבוד. סדרה.*; יבוא java.util.*;

יבוא oscP5.*; יבוא netP5.*;

OscP5 oscP5; NetAddress myRemoteLocation;

CommsPort סידורי; // היציאה הטורית boolean messageArrived = false;

String incoming = "", IncomingOSCMessage = "";

char charginal startChar = '*', endChar = '#'; הסופי char contactCharacter = '|';

// כדי לוודא שאנו שולחים רק את הפרמטרים (הערכים) המשתנים // משתנים גלובליים אלה מסומנים כאן אך אינם צריכים לאתחל כאן! HashMap oldParams, newParams, toSendParams;

// עלינו לפצל את המסר בכל תהליך פסל תהליך Incoming () {String resVec = incoming.split (","); // נקבל זוגות שם+ערך // כך שלכל שם (+2) … נסה {for (int i = 0; i <resVec.length; i+= 2) {float value = Float.parseFloat (resVec [i+ 1]); // הכנס אותם ל- newParams.put החדש של Hashtable (resVec , ערך); }} // אם מתרחשת שגיאה, בואו נתפוס אותה יוצאת ונצא. catch (Exception ex) {println ("הודעת חריגה:" + ex); printArray (resVec); יְצִיאָה(); }}

// כדי לסנן את ההודעות שלנו/ * אנו מוודאים שיש רק הודעת OSC-out כאשר * הודעת הקלט (סדרתית) משתנה * כלומר: אם אנו סובבים/לוחצים על הכפתור והיא משנה ערך. * אז אנו מסננים את הערכים הנכנסים שלמעשה משתנים * שימו לב: לא נמנע מקפיצות מערכים * כפי שמקורם למשל במד תאוצה או בחיישני מרחק * תצטרכו להחליק אותם בעצמכם ב- Arduino */ void filterParams () {toSendParams = new מפת גיבוב(); עבור (מפתח מחרוזת: newParams.keySet ()) {// אם המפתח כבר קיים אם (oldParams.containsKey (מפתח)) {הנוכחי של המפתח והערך אינם זהים, עדכן אם (! oldParams.get (מפתח).equals (newParams.get (מפתח))) {toSendParams.put (מפתח, newParams.get (מפתח)); }} else {// מפתח אינו קיים במערכות ישנות, אז נגיד! toSendParams.put (key, newParams.get (key)); } 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 (); } // כאשר נרצה להדפיס לחלון חלל של ShowIncoming () {// כדי לראות הודעה נכנסת, כפי שהוגדר בטקסט HashMap ("נכנס מארדואינו", 20, 20); int y = 20; עבור (מפתח מחרוזת: newParams.keySet ()) {y = y+20; טקסט (מפתח, 20, y); טקסט (newParams.get (מפתח), 300, y); }}

void showOsc () {text (IncomingOSCMessage, 300, 200); IncomingOSCMessage = ""; }

הגדרת חלל () {גודל (1000, 800); // מילוי גודל הבמה (255); רקע (0); oldParams = HashMap חדש (); newParams = HashMap חדש (); // printArray (Serial.list ()); commsPort = new Serial (this, portName, baudRate);

/ * התחל oscP5, האזן להודעות נכנסות */ oscP5 = OscP5 חדש (זה, listenPort);

/* myRemoteLocation הוא NetAddress. a NetAddress לוקח 2 פרמטרים, * כתובת ip ומספר יציאה. myRemoteLocation משמש כפרמטר ב- * oscP5.send () בעת שליחת מנות osc למחשב, התקן, * יישום אחר. שימוש ראה להלן. למטרות בדיקה יציאת ההאזנה * והיציאה של כתובת המיקום המרוחק זהה, ומכאן שתשלח * הודעות בחזרה למערכון זה. */ myRemoteLocation = NetAddress חדש (remoteIP, sendPort); }

void draw () {if (messageArived) {רקע (0); translateMessage (); ShowIncoming (); messageArrived = false; } showOsc (); }

void serialEvent (Serial commsPort) {// קרא בתים מהיציאה הטורית: char inChar = commsPort.readChar (); switch (inChar) {case contactCharacter: commsPort.write (contactCharacter); // לבקש עוד println ("מתחיל …"); לשבור; case startChar: incoming = ""; לשבור; case endChar: messageArrived = true; // println ("סוף הודעה"); לשבור; ברירת מחדל: נכנסת += inChar; לשבור; }}

/* הודעת osc נכנסת מועברת לשיטת oscEvent. */ void oscEvent (OscMessage theOscMessage) {float value = theOscMessage.get (0).floatValue (); // קבל את טיעון האוסק הראשון

IncomingOSCMessage + = "\ n" + String.format ("### קיבל הודעת osc:" + "addrpattern:" + theOscMessage.addrPattern () + ": %f", value); println (IncomingOSCMessage); }

שלב 3: קוד Arduino

קוד ארדואינו
קוד ארדואינו

/* קוד זה הוא סקיצה בסיסית לתקשורת עם עיבוד באמצעות סדרה.

זהו שרטוט שבו אתה יכול לשים קוד משלך שצוין לכפתורים, פוטנציומטרים או חיישנים משלך.

יש לו לחיצת יד כדי לוודא שיש לנו קשר והפורמט בו אנו מתקשרים נקבע

חשוב לבנות את המסר באותה הדרך, כך שעיבוד ידע כיצד לפרק אותו ולשלוח הודעות OSC נכונות ל- DAW שלנו

עשה עבור werkcollege AV&IT אוקטובר 2017

קוד smooothing נוצר 22 באפריל 2007 על ידי David A. Mellis שונה 9 באפריל 2012 על ידי טום איגו

*/

/ קצב שידור const baudRate = 115200;

// זמן המתנה במסרים בין סקרים לפינים const int loopPauseTime = 200; // מילי שניות

// ערכי התחלה וסיום עבור ההודעה שנשלחה ב- Serial const String startString = "*", endString = "#";

const char contactCharacter = '|';

// pin int's 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; float sensorValue2 = 0; sensor floatValue3 = 0;

// החלקת קריאות int [numReadings]; // הקריאות מהקלט האנלוגי int readIndex3 = 0; // אינדקס הקריאה הנוכחית int total3 = 0; // ממוצע הציפה הכולל של ריצה 3 = 0; // הממוצע

// אנו זקוקים לפונקציה זו כדי ליצור קשר עם סקיצת העיבוד // שמור אותה כאן void etablContact () {while (Serial.available () <= 0) {Serial.print (contactCharacter); // שלח צ'ארה והמתן לתגובה … עיכוב (loopPauseTime); } Serial.read (); }

הגדרת void () {// הגדר את pinModes לכל הסיכות pinMode (buttonPin1, INPUT); pinMode (buttonPin2, INPUT); pinMode (pitchReading, INPUT); pinMode (speedReading, INPUT); pinMode (infraReading, INPUT);

// לאתחל פקודות סדרתיות Serial.begin (baudRate); בעוד (! סדרתי); // smoothing for (int thisReading = 0; thisReading <numReadings; thisReading ++) {readings [thisReading] = 0; }

// המתן ללחיצת יד etablContact (); }

לולאת void () {// סקר את כל הסיכות ומפה את הקריאה לכפתור הטווח המתאיםState1 = 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 = מפה (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;

// אם אנחנו בסוף המערך … אם (readIndex3> = numReadings) {// … עוטף את ההתחלה: readIndex3 = 0; } // לחשב את הממוצע: average3 = (total3 / numReadings); // חיישן החלקה

Serial.print (startString); // התחל רצף הודעות // הסר את כל השם, זוגות הערכים, מופרדים בפסיקים 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: קדימה להעדפות שליטה/OSC/אינטרנט והדפסה על הוספה

שלב 3: בחירת מצב משטח הבקרה עבור OSC (בקרת סאונד פתוחה)

שלב 4: שם המכשיר שלך מלא, נקב לקבל על הפורום ואנוכל אותו בעבודות של משלוח המדינה

שלב 5: העתק של IP מארח

שלב 6: Druk op ok en de controller is no verbonden with Reaper

שלב 5: Behuizing

Behuizing
Behuizing

Breedte: 170 מ מ

אורך: 90 מ מ

Hoogte 30 מ מ

קופץ: 16 מ מ (קוטר

מטרי פוטנציאל: 3 מ מ (קוטר)

חיישן Afstand: Breedte 2.9 מ מ

אורך 0.8 מ מ

חומר: MDF (3 מ מ)

שלב 6: אלקטרוניקה

שלב 1:

חיבורים לקרקע ואן ארדואינו בעל 5 וולט עם קרש לחם

שלב 2:

חיבור סיכה A0 עם פוטנציאל 1

חיבור סיכה A1 עם פוטנציאל 2

חיישן סיכה A3 עם חיישן אינפרא אדום.

חיבור סיכה A2 עם כפתור דביק לא.

חיבור סיכה A5 עם כפתור דביק.

שלב 7: עובדים

עובדים
עובדים

- מייס אל באבא

- ארנו גוריסן

- Michiel De Wandelaer

מוּמלָץ: