Arduino का उपयोग कर मिडी सीक्वेंसर समय सटीकता


11

मैं इन संगीत निर्देशकों का निर्माण करता हूं ।

यहाँ छवि विवरण दर्ज करें

केवल यह वास्तव में एक अनुक्रमक नहीं है, यह एक अनुक्रमकर्ता के लिए एक भौतिक इंटरफ़ेस है। सीक्वेंसर एक एप्लिकेशन है जो एक लैपटॉप पर चलता है जिसे सीक्वेंसर कनेक्ट करता है, यह चीज उपयोगकर्ता को मक्खी पर ड्रम लूप बनाने देती है। यह बहुत मजेदार है, लेकिन इसके लिए लैपटॉप की आवश्यकता होती है क्योंकि सीक्वेंसर 'ऑन-बोर्ड' नहीं है।

मुझे अपने डिवाइस पर सीक्वेंसिंग करना अच्छा लगेगा।

अब मान लें कि मैं जानता हूं कि यूएसबी मिडी कनेक्टिविटी के लिए क्लास कंप्लायंस के लिए कैसे हल किया जाए, और यह भी मान लें कि मैं यह पता लगा सकता हूं कि 5 पिन डिन पोर्ट से मिडी नोट्स भेजने के लिए एक आर्दीनो को कैसे वायर किया जाए। इवेंट लूप के हर रन पर मिनट मात्रा में असंगत समय के कारण समय के साथ मैं सबसे अधिक चिंतित हूं।

कुछ बातें जो मुझे पता हैं:

  1. आपको delay()टेम्पो लूप को नियंत्रित करने के लिए भरोसा नहीं करना चाहिए । विलंब फर्मवेयर के सभी ऑपरेशन को रोक देता है, और यह काम नहीं कर सकता क्योंकि मुझे अनुक्रम चलने के दौरान भौतिक उपयोगकर्ता इंटरफ़ेस को बदलने की आवश्यकता है।

  2. पर आधारित गणना millis()बेहतर होती है क्योंकि फ़र्मवेयर तब भी काम कर सकता है जब एक निश्चित गिनती समाप्त हो जाती है।

  3. भले ही मेरा कोई भी भौतिक नियंत्रण व्यवधान दिनचर्या को चालू न कर रहा हो, लेकिन कुछ संचालन मुख्य loop()से चलने में देरी कर सकते हैं । यदि मैं एक फ़ंक्शन डिज़ाइन करता हूं जो उपयोगकर्ता इनपुट की प्रतीक्षा करता है, तो यह स्पष्ट रूप से एक "समय सीमा" के लापता होने की समस्या पैदा कर सकता है यदि millis()गिनती खत्म हो गई है। मुझे पता है कि यह समस्या मेरे अपने डिजाइन की है ...

प्रशन:

A. क्या एवीआर-आधारित आर्दीनो एक यूजर इंटरफेस को प्रदूषित करने और एक मिशन क्रिटिकल टाइमिंग लूप चलाने के लिए एक उपयुक्त माइक्रोकंट्रोलर है? मुझे पता है कि वहाँ एक एआरएम Arduino आधारित है जो अब बहुत तेज़ है। एक Teensy 3.0 एक बेहतर विकल्प होगा? ये दोनों 3.3 वी बोर्ड हैं, इसलिए इसके साथ काम करने के लिए मुद्दों का एक और सेट है ... लेकिन मैं अभी के लिए इसे अनदेखा करूंगा।

B. क्या मुझे कार्य को दो माइक्रोप्रोसेसरों में विभाजित करना चाहिए? एक मतदान और यूजर इंटरफेस को अपडेट करने के लिए और दूसरा मिशन क्रिटिकल टाइमिंग लूप के लिए।

सी। कुछ और?

मेरा मुख्य लक्ष्य कंप्यूटर का उपयोग नहीं करना है। मैं स्विंग के लिए भी गणना करना चाहता हूं, लेकिन इस मामले में, स्विंग का मतलब नहीं है अगर मुझे लॉक और टाइमिंग सटीक टेम्पो नहीं मिला है। आपके सुझाव के लिए धन्यवाद!


1
Arduino हमेशा कुछ व्यवधान दिनचर्या स्थापित करता है, जिससे घबराहट होती है। कई मामलों में यह कोई समस्या नहीं है, लेकिन इसके बारे में पता होना अच्छा है। noInterrupts();घबराना बंद कर देता है, लेकिन यह भी बंद हो जाता है सभी चाहता था बाधित।
जिप्पी

1
जब आप कहते हैं कि "बोर्ड पर सीक्वेंसिंग करें", तो क्या इसका मतलब है कि बार, बीपीएम और टिक-ट्रैक इन-बोर्ड की धड़कनें हैं? तब संभवतः आप उस बटन को याद रखना चाहते हैं जो बार के भीतर दबा हुआ है ताकि डिवाइस का "दिमाग" आपके लैपटॉप को मिडी-नोट्स खिला सके? फिर क्या आप कुछ गड़गड़ाहट की आवाज़ को निकालना चाहते हैं यदि आपने उन्हें पहले से रिकॉर्ड किए गए नोट पर फिर से मारा? आदि .. तुम कितनी दूर जाना चाहते हो? अपनी धड़कनों का संग्रहण? बार का अनुक्रम बनाना जो एक पूर्ण ट्रैक के अनुरूप है? विशिष्ट सलाखों का संपादन? टेम्पो विशिष्ट सलाखों के परिवर्तन? यह सब सीपीयू खाता है इसलिए सबसे अच्छे सीपीयू के लिए जाएं।
एंडी उर्फ

हाँ, यह सब।
स्टीव कोलेई

2
यह एक मीठा दिखने वाला मामला है जो आपने बनाया है!
14

3
दूसरों ने जो कहा है, इसके अलावा, यह एक सोच की तरह दिखता है कि शायद आप उत्पादन और बिक्री करना चाहते हैं। एक Arduino की लागत $ 20 है, जबकि एक AVR की लागत $ 2 है। न केवल आप अपने आवेदन के लिए हार्डवेयर पर नियंत्रण हासिल करेंगे, बल्कि आप बहुत सारा पैसा बचा लेंगे।
फिल फ्रॉस्ट

जवाबों:


5

समय के साथ संवेदनशील कार्यों के लिए व्यवधान आपके मित्र हैं, लेकिन केवल तभी जब आप समय के महत्वपूर्ण पहलुओं को बीच में डालते हैं, और कोई अन्य व्यवधान नहीं होता है जिसकी उच्च प्राथमिकता होती है। "AVR- आधारित" Arduino (जैसे ATmega328P) पर माइक्रोकंट्रोलर्स ने डेटाशीट के पृष्ठ 58ff पर विस्तृत रूप से रुकावट प्राथमिकताएं तय की हैं । इसलिए यदि आपने TIMER2 COMPA का उपयोग अपने महत्वपूर्ण समय के व्यवधान के रूप में किया है और कोई अन्य व्यवधान आपको ठीक नहीं होना चाहिए (क्योंकि इसकी सर्वोच्च प्राथमिकता है)। यदि आप भी निम्न प्राथमिकता वाले व्यवधानों का उपयोग करना चाहते हैं, तो आपको यह सुनिश्चित करने की आवश्यकता है कि उनकी रुकावट सेवा की दिनचर्या में प्रवेश करते समय वे सभी वैश्विक रुकावटों को फिर से सक्षम करें:

जब कोई व्यवधान उत्पन्न होता है, तो ग्लोबल इंटरप्ट इनेबल आई-बिट क्लियर हो जाता है और सभी इंटरप्ट्स अक्षम हो जाते हैं। उपयोगकर्ता सॉफ़्टवेयर नेस्टेड इंटरप्ट को सक्षम करने के लिए I-bit को तर्क एक लिख सकता है। सभी सक्षम व्यवधान वर्तमान व्यवधान की दिनचर्या को बाधित कर सकते हैं।

(पृष्ठ १४ का डेटाशीट )

यह एआरएम आधारित Arduinos पर थोड़ा अलग है क्योंकि उनके Cortex-M3 कोर में "नेस्टेड वेक्टर इंटरप्ट कंट्रोलर" है, जहां प्राथमिकताएं तय नहीं की जाती हैं (सॉफ्टवेयर में सेट की जा सकती हैं), और नेस्टेड इंटरप्ट हैंडलिंग मानक है। महत्वपूर्ण अनुप्रयोगों के समय के लिए, एआरएम आधारित Arduino आपको अधिक लचीलापन देगा। हालाँकि, मुझे नहीं लगता कि यह वास्तव में आपके आवेदन के लिए आवश्यक है।

बड़ा सवाल यह है कि अरुडिनो पुस्तकालयों के साथ इन चीजों को कैसे लागू किया जा सकता है। सबसे अच्छा प्रदर्शन पाने के लिए आपको शायद पुस्तकालयों के बाहर कुछ हद तक कोड करना होगा, कम से कम समय के लिए महत्वपूर्ण बिट्स, यानी देरी () या मिली () पूरी तरह से चीजों से बचें।

आपको विभाजित करने की आवश्यकता है या नहीं, इस बात पर निर्भर करता है कि आप कितना प्रसंस्करण करना चाहते हैं। फिर से, पुस्तकालयों के बाहर जाने से आपको बेहतर प्रदर्शन मिल सकता है।


3

यह उपयुक्त प्रोग्रामिंग के साथ, निश्चित रूप से एक ATmega328P पर किया जा सकता है (कुछ हद तक ड्रम की जटिलता पर निर्भर करता है। मैं मान रहा हूँ ~ <50 ड्रम घटनाओं में पाश। क्या यह उचित है?)।

ध्यान दें कि मैंने कहा ATmega328P , जरूरी नहीं कि एक Arduino

Arduino वातावरण की पृष्ठभूमि में बहुत सारी डिफ़ॉल्ट चीजें चल रही हैं, जो बेहद नियतात्मक प्रोग्रामिंग (जैसा कि आपको कुछ समय-महत्वपूर्ण के लिए आवश्यक होगा) को चुनौती देता है।

यहां आपको जो वास्तविक प्रश्न पूछने की आवश्यकता है, वह यह है कि प्रोग्रामिंग में आपकी रुचि कितनी है, बनाम आप एक उपकरण को विकसित करने में कितनी रुचि रखते हैं?

जब मैं काफी आश्वस्त हूं कि यह संभव है, सब कुछ आप एक ही ATmega पर चाहते हैं (ड्रम पाश, कई अनुरूप आदानों, एलसीडी, बटन, मिडी इंटरफेस) करने के लिए असली सवाल कितना काम उस में सब कुछ निचोड़ करने के लिए किया जाएगा? फिर, क्या आप एम्बेडेड MCU कोड को ऑप्टिमाइज़ करना या इंस्ट्रूमेंट्स बनाना सीखना चाहते हैं? यह काफी आसान करने के लिए बस एक तेजी से एमसीयू के लिए जाना अगर जरूरत है, लेकिन आप एमसीयू प्रदर्शन को निर्धारित करने की जरूरत है आप की जरूरत है अब में, आप एहसास नहीं है कि आप नहीं कर सकते काम का इतना छह महीने, काफी काम करने के लिए सब कुछ के रूप में तेजी से आप के रूप में मिलता है जरुरत।


अगर मैं आप थे, तो पहली बात यह है कि मैं इसे arduino सामान के बिना काम कर रहा हूं (मूल रूप से, इसे एक कच्चे ATmega के रूप में मानते हैं, और AVR स्टूडियो या इसी तरह का उपयोग करते हैं)। फिर, आप और अधिक प्रभावी ढंग से विश्लेषण कर सकते हैं कि आपको किस तरह के प्रदर्शन की आवश्यकता है, और अगर एटीमेगा इसे प्रबंधित कर सकता है।

एक बार जब आप arduino सामान से मुक्त हो जाते हैं, तो आप अलग-अलग MCU का उपयोग करने के लिए बहुत अधिक स्वतंत्र होते हैं (वे आम तौर पर अधिक समान होते हैं। यदि आप इसे प्रलेखन से एक व्यक्ति का पता लगा सकते हैं, तो आप शायद दूसरों के लिए भी ऐसा कर सकते हैं)।

मैं हाल ही में एक बहुत ATxmega उपकरणों के साथ काम कर रहा हूँ, और वे वास्तव में अच्छा कर रहे हैं। आपको तीन रुकावट प्राथमिकताएं मिलती हैं, जो समय-महत्वपूर्ण सामान का प्रबंधन करना आसान बनाती हैं। वे भी (Sane परिधीय डिजाइन के साथ काम करने के लिए वास्तव में अच्छा कर रहे हैं! सुविधाजनक बंदरगाह संरचनाओं! आदि ...)।

NXP से LPC डिवाइस भी हैं, जो ARM आधारित हैं, साथ ही Atmel के ARM डिवाइसों में से कुछ (Arduino ड्यू पर इस्तेमाल किए गए), या ST से STM32 MCUs हैं। इनमें से किसी में भी महत्वपूर्ण रूप से होगा अधिक प्रदर्शन होगा फिर एक ATmega, या एक ATxmega।

एक बड़े, अधिक शक्तिशाली प्रोसेसर का प्राथमिक नकारात्मक मूल्य है, लेकिन जब तक आप उन इकाइयों के हजारों नहीं बना रहे हैं, प्रति इकाई विधानसभा और विनिर्माण लागत लागत अंतर को पार करने के लिए बहुत अधिक हैं (जो संभवतः केवल कुछ डॉलर होंगे ) कि यह मूल रूप से अप्रासंगिक है।


अच्छी तरह से रखा - एक वाणिज्यिक उत्पाद के लिए एक Arduino बस जाने का रास्ता नहीं है - वे सत्ता में भूखे, धीमे हैं, और आईडीई इष्टतम (तेज / छोटे) कोड के लिए नहीं बनाया गया है, बल्कि सुविधा और आसान सीखने के लिए है। कम लागत के लिए आपके पास एक STM32 F4 (32-बिट कॉर्टेक्स एम 4> 100 मेगाहर्ट्ज) या समान हो सकता है, हालांकि यह ओवरकिल होगा। मुझे लगता है कि छोटे PIC32, कॉर्टेक्स एम 3 या एवीआर 32 में से एक जैसा कुछ है, शायद जाने का रास्ता है, जैसा कि आप उल्लेख करते हैं। कई रुकावट प्राथमिकताएं, डीएमए, परिष्कृत परिधीय, तेज / कम शक्ति और भरपूर मात्रा में यह एक Arduino की तुलना में एक आसान विकल्प है।
ओली ग्लेसर

@ ओलीग्लासर - मुझे लगता है कि आपको एक Arduino और ATmega के बीच स्पष्ट रूप से परिसीमन करने की आवश्यकता है । आप एक ATmega पर छोटे, तेज कोड कर सकते हैं, और यह कि ATmega एक Arduino बोर्ड पर भी हो सकता है। दूसरी ओर, Arduino "IDE", shittiest कोड संपादकों में से एक है जिसे मैंने कभी भी उपयोग किया है। दूसरी ओर, OptiBoot बूटलोडर बहुत अच्छा है। सिर्फ इसलिए कि कुछ हिस्से बकवास हैं इसका मतलब यह नहीं है कि आपको पूरी चीज को फेंक देना चाहिए।
कॉनर वुल्फ

बिल्कुल - मैं एक पूरे के रूप में Arduino का उल्लेख कर रहा था, बोर्ड और IDE शामिल है - ATmega नहीं, जो मुझे यकीन है कि किसी भी अन्य तुलनीय यूसी (PIC16 / 18F, आदि) के रूप में अच्छा है मैंने इसे अपनी सूची में शामिल किया होगा लेकिन मुझे लगता है कि 8-बिट और 16/32-बिट के बीच की कीमत के साथ आजकल बहुत करीब है। यह शायद एक अतिरिक्त $ 1 खर्च करने का एक अच्छा विचार है और आपको पता है कि आपके पास प्रोसेसर की शक्ति को समाप्त करना है (जब तक आप उल्लेख नहीं करते हैं, हम बड़ी संख्या में बात कर रहे हैं। और पूरी तरह से सबसे कम कीमत के लिए बनाया गया था, लेकिन फिर मुझे संदेह है कि एक Arduino :-) माना जाता होगा)
ओली ग्लेसर

1

टाइमिंग की सटीकता के बारे में सोचना शुरू करने से पहले मुझे टाइमर पर पढ़ने की ज़रूरत थी (एक arduino के साथ मिडी स्टेप सीक्वेंसर का निर्माण भी, हालांकि यह उन ^ ^ से कम शांत दिखने की गारंटी है)। लेखों की यह श्रृंखला सबसे अधिक जानकारीपूर्ण रही है:

http://maxembedded.com/category/microcontrollers-2/atmel-avr/avr-timers-atmel-avr/

अभी मुझे लगता है कि सटीक समय प्राप्त करने का मेरा समाधान होगा।

ए। AVR arduino का उपयोग करें

B. कार्य को एक माइक्रोप्रोसेसर पर रखें

सी। जरूरत है कि सटीक प्राप्त करने के लिए prescalers, टाइमर और व्यवधान का उपयोग करें।

अपडेट करें

Arduino के लिए मूल मिडी ट्यूटोरियल का उपयोग करना और टाइमर और प्रीस्कूलर पर इस लेख को देखने के बाद, निम्नलिखित कोड वह है जो मैं साथ आया था। कोड प्रत्येक तिमाही दूसरे पर मिडी नोट चलाने के लिए टाइमर 1 और सीटीसी मोड का उपयोग करता है और प्रत्येक तिमाही सेकंड में एक नोट बंद होता है (जो कि वास्तव में 120 बीपीएम होना चाहिए)। अफसोस की बात है, यह अभी भी 120bpm की तुलना में सिर्फ धीमी गति से आ रहा है, हालांकि यह सबसे निकटतम है जिसे मैंने प्राप्त किया है ...

// Includes
#include <avr/io.h>
#include <avr/interrupt.h>

int last_action=0;

void setup()
{
    //  Set MIDI baud rate:
    Serial.begin(31250);

    // initialize Timer1
    cli();          // disable global interrupts
    TCCR1A = 0;     // set entire TCCR1A register to 0
    TCCR1B = 0;     // same for TCCR1B

    // set compare match register to desired timer count:
    OCR1A = 15624;
    // turn on CTC mode:
    TCCR1B |= (1 << WGM12);
    // Set CS12 bits for 256 prescaler:
    TCCR1B |= (1 << CS12);
    // enable timer compare interrupt:
    TIMSK1 |= (1 << OCIE1A);
    // enable global interrupts:
    sei();
}

void loop()
{
    // do some crazy stuff while my midi notes are playing
}

ISR(TIMER1_COMPA_vect)
{
  // Turn notes on
  if (last_action == 0) {
    send_note(0x90, 60, 0x45);
    last_action = 1;

  // Turn notes off
  } else {
    send_note(0x90, 60, 0x00);
    last_action = 0;
  }
}

//  plays a MIDI note
void send_note(int cmd, int pitch, int velocity) {
  Serial.write(cmd);
  Serial.write(pitch);
  Serial.write(velocity);
}

अपडेट करें

मैं इसके लिए ~ 24 घंटे से संघर्ष कर रहा हूं और अंत में मंच से कुछ जवाब मिला। मुझे लगता है कि ^ ^ के ऊपर मैंने जो कोड इस्तेमाल किया है वह बहुत अच्छा है। ISR का उपयोग करना, CTC मोड और प्रीस्कूलर आदि का उपयोग करना। मंच पर पहुंचने के बाद मुझे लगता है कि समाधान मिडी सीक्वेंसर पर सटीक प्राप्ति के बारे में कम है, लेकिन मेरा पूरा हार्डवेयर सेटअप (मेरे सिंथेसाइज़र और सैंपलर) एक समान हो गए हैं। मिडी घड़ी, Arduino से घड़ी आती है या नहीं।


0

धीरे-धीरे आप एक टीथर कंप्यूटर से graduallyC- आधारित प्रणाली में संक्रमण कैसे करना चाहते हैं, इस पर निर्भर करते हुए, आप उस बॉक्स के अंदर रास्पबेरी पाई ($ 25-35 खुदरा ) लगाने पर विचार कर सकते हैं । इस तरह से आपके पास USB पोर्ट और GPIO पिन के साथ एक पूर्ण-आधारित कम-शक्ति वाला) लिनक्स आधारित कंप्यूटर हो सकता है।


मुझे यकीन है कि विस्तार ढालें ​​हैं या वे जो भी उन्हें पाई के लिए कहते हैं, लेकिन स्टॉक बोर्ड में 17 GPIO पिन हैं। मैं arduino मेगा पर हर एक पिन का उपयोग कर रहा हूं। 31 टैक + 30 एल ई डी, 10 एनालॉग इन 70+ आई / ओ।
स्टीव Cooley

ओह, मेरा मतलब था कि अगर बाहरी कंप्यूटर को हटाने का तात्कालिक लक्ष्य था, तो आप "सीक्वेंसर [रख सकते हैं] एक ऐसा एप्लिकेशन है जो लैपटॉप पर चलता है" और इसे पाई पर चलाएं, आंतरिक रूप से आपके मौजूदा सिस्टम से उसी तरह जुड़ा हुआ है जैसे कि यह अब जुड़ा हुआ है।
रोब स्टारिंग

@SteveCooley - लगता है जैसे आपको IO मल्टीप्लेक्सिंग / बटन-मैट्रिक्स में देखने की जरूरत है। आपको प्रति बटन एक संपूर्ण समर्पित IO लाइन की आवश्यकता नहीं होनी चाहिए।
कॉनर वुल्फ

@SteveCooley - नरक, आपको वास्तव में एक बटन मैट्रिस की भी आवश्यकता नहीं है। आप केवल 4 rPi पिन का उपयोग करके अपने सभी डिजिटल IO कर सकते हैं। बस सभी बटन लटकाएं और कुछ शिफ्ट रजिस्टर (बटन के लिए समानांतर-सीरियल, एलईडी के लिए सीरियल-समानांतर) बंद करें, और आरपीआई के एसपीआई पोर्ट से शिफ्ट रजिस्टर चलाएं। आपको SPI हार्डवेयर की मदद से पूरे मैट्रिक्स के लिए आसानी से> 1Khz अपडेट दरें मिलनी चाहिए।
कॉनर वुल्फ

यदि केवल एकमात्र कारण जो आप Arduino Mega का उपयोग कर रहे हैं IO है, तो आप कुछ चीज़ों पर बहुत अधिक पैसा खर्च कर रहे हैं, जिन्हें कुछ बाहरी उपकरणों के साथ <$ 3 के लिए बहुत आसानी से किया जा सकता है।
कॉनर वुल्फ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.