كيفية بناء جيتار جوي مع اردوينو ، عكا جيتار ايردوينو: 5 خطوات

الفضاء - علوم الفلك للقرن الØادي والعشرين

الفضاء - علوم الفلك للقرن الØادي والعشرين

جدول المحتويات:

Anonim

  • والفكرة هنا هي بناء جيتار افتراضي يمكن ارتداؤه يتم التحكم فيه بيديه مثل لعب Air Guitar. تم إنشاؤه ونماذج أولية خلال مشروع مدته أسبوعان في تشالمرزجامعة (السويد) لفئة الحوسبة المادية.

    الهدف هو الحصول على شعور العزف على الجيتار الحقيقي. يتكون الغيتار AIRduino من قفاز واحد وعصا واحدة.يستخدم القفاز لضبط النغمة والعصا لتحريك الصوت.

    لتنفيذ مثل هذه الخدعة ، استخدمنا مقياس التسارع وجهاز استشعار صوتي فائق (انظر الخطوة 1 للحصول على وصف المفهوم).

    ألق نظرة على العرض التوضيحي للفيديو للحصول على فكرة أكثر دقة عن كيفية عمله ، وللعمل على بناء خاصتك!


    فريق AIRduino:

    ديفيد فورنييه ، وجان لويس جيوردانو ، ومنيرة سناء ، ومازيار شلباف ، وغوستاف سوتيل.

    اللوازم:

    الخطوة 1: مفهوم الوصف

    من المفترض أن تعمل جيتار جيتار على الغيتار الأيمن.
    تنقسم وحدة التحكم بالجيتار إلى جزأين ، وحدة التحكم اليسرى ووحدة التحكم اليمنى.
    بواسطة وحدة التحكم اليسرى ، يمكن للاعب ثني أصابعه والضغط على القفاز لتغيير درجة النغمة.
    يمثل جهاز التحكم الأيمن بعصا يجب أن تهتز لتحريك صوت الغيتار الجوي.
    يمكن للاعب أيضًا تغيير المسافة بين اليد اليمنى واليد اليسرى من أجل ضبط النغمات ، ومحاكاة الحنق المختلف على رقبة الجيتار.
    لأداء مثل هذه الحيل ، تتمثل المكونات الرئيسية في مقياس التسارع "ليشعر" بالاهتزاز بالعصا ، وهو مستشعر فوق صوتي مخترق لقياس المسافة بين اليد اليمنى والعصا ، والنسيج الموصّل لبناء القفاز.
    الكل في الكل ، إنها لعبة سهلة البناء إلى حد ما. الجزء الصعب الوحيد هو اختراق مستشعر الصوت الفائق الصوت الذي يتطلب بعض البراعة. ستحتاج إلى بعض المهارات الإلكترونية الأساسية لفهم التعليمات ، وكذلك لمعرفة ما الذي ارتكبته عندما أفسدت شيئًا ما ولم يعمل الجيتار في النهاية. لقد كنا هناك. :-)

    الخطوة 2: قائمة التسوق

    فيما يلي قائمة بما تحتاجه لبناء غيتار AIRduino الخاص بك:
    1. الأسلاك: للأسف الكثير لهذا الإصدار النموذج الأولي. لقد تم استخدامها لربط القفازين وأجزاء اردوينو معًا. لا تتردد في تحسين هذا الجزء من التصميم بجعله لاسلكيًا!
    2. التسارع: يستخدم في العصا في يدك اليمنى للكشف عن الهز. استخدمنا مقياس التسارع ذو ثلاثة محاور ، لكن المحاور الواحدة كافية
    3. جهاز استشعار بالموجات فوق الصوتية: يستخدم لقياس المسافة بين يدي اللاعب ، استخدمنا المنظر # 28015
    4. النسيج موصل وتمتد: لبناء القفازات ،
    5. اردوينو: جوهر الجيتار الذي يعالج كل شيء. اردوينو ديسيميلا يعمل بشكل جيد.
    6. مقاييس الجهد: لضبط بعض الإعدادات ، ومقياس الجهد مع أقصى قدر من أي شيء من 1KOhm-1MOhm على ما يرام.
    7. تذوب الساخنة الغراء: وسيلة مريحة لعقد الأشياء معا ،
    8. 3.5 مم جاك الإناث: تستخدم لإخراج الصوت ،
    9. العناصر الإلكترونية الكلاسيكية: مقاومات (10 كيلو) ، مكثف (10 فائق التوهج) ومصابيح LED ونوع من مصدر الطاقة لاردوينو. (بطارية 9V على ما يرام).

    الخطوة 3: الرياضيات

    هنا هي الخطط الإلكترونية للغيتار AIRduino.
    كما ترون ، من السهل جدًا فهمها وبالتالي بناءها أيضًا.
    إلقاء نظرة على الصورة إذا كنت تريد فكرة عن أي مكون يذهب أين. كما قد تفهم على الأرجح ، هذا ليس بالنطاق بأي شكل من الأشكال. الكابلات أطول بكثير مما هو موضح في التخطيطي.
    ربما لاحظت أيضًا أن باعث المستشعر فوق الصوتي موجود على العصا وأن المتلقي في اليد اليسرى. هذا هو الجزء الصعب الذي ذكرته سابقًا: يجب عليك إلغاء إرسال باعث الصوت فوق الصوتي من وحدة الاستشعار فائقة الصوت من أجل فصله عن لوحة المستشعر.
    المزيد عن ذلك في خطوات لاحقة. الآن هيا بنا إلى العمل!

    الخطوة 4: بناء القفازات

    تحتوي القفاز على جهاز استقبال صوتي واحد وأربعة أزرار. هذا هو!
    يوجد جهاز الاستقبال فوق الصوتي في الصندوق الأسود المرئي في بعض الصور أدناه.
    تحتوي القفاز على منطقة واحدة كبيرة متصلة فقط بالأرض على لوح Arduino. عند ضغط الإصبع على راحة اليد ، يتم إنشاء اتصال بين النسيج الموصّل على الإصبع والنخيل.
    فيما يلي صورة لنموذجين مختلفين من القفازات. واحد لديه أصابع قابلة للفصل ، والتي تسمح لكلا اللاعبين بأيد صغيرة وكبيرة للغاية. وخيط النموذج الآخر مباشرة إلى قفاز قياسي. أوصي بالإصدار الثاني ، وهو أسهل في الإنشاء ، وأسهل في التثبيت.

    الخطوة 5: رمز

    هنا هو كود اردوينو المطلوب:
    جزء توليد الصوت في الوقت الحقيقي مأخوذ من هذا البرنامج التعليمي الرائع.
    ------------------------------------------------------
    // مجموعة تحتوي على الشكل الموجي
    // صوت الغيتار
    char الموجي =
    {125, 148, 171, 194, 209, 230, 252, 255,
    253, 244, 235, 223, 207, 184, 169, 167,
    163, 158, 146, 131, 126, 129, 134, 127,
    105, 80, 58, 51,38, 22, 12, 2, 10, 35,
    58, 75, 89, 103, 120, 141, 150, 148, 145,
    144, 140, 129, 116, 105, 95, 86, 75, 72,
    73, 76, 88, 103, 117, 121, 120, 115, 120,
    143, 159, 162, 156, 155, 163, 184, 202,
    214, 215, 211, 213, 212, 205, 196, 182,
    162, 142, 118, 99, 84, 68, 54, 40, 28,
    19, 10, 7, 0, 0, 5, 9, 14, 21, 33,
    49, 59, 65, 75, 92, 110};
    / / نحن نستخدم هذا الشكل الموجي لتغيير
    // حجم الإخراج
    char waveformVolume =
    {125, 148, 171, 194, 209, 230, 252, 255,
    253, 244, 235, 223, 207, 184, 169, 167,
    163, 158, 146, 131, 126, 129, 134, 127,
    105, 80, 58, 51,38, 22, 12, 2, 10, 35,
    58, 75, 89, 103, 120, 141, 150, 148, 145,
    144, 140, 129, 116, 105, 95, 86, 75, 72,
    73, 76, 88, 103, 117, 121, 120, 115, 120,
    143, 159, 162, 156, 155, 163, 184, 202,
    214, 215, 211, 213, 212, 205, 196, 182,
    162, 142, 118, 99, 84, 68, 54, 40, 28,
    19, 10, 7, 0, 0, 5, 9, 14, 21, 33,
    49, 59, 65, 75, 92, 110};
    / / مجموعة تستخدم كمنطقة عازلة لتجنب
    // مسافة دقيقة خاطئة
    // قياسات
    الباحث عن مسافة غير محددة = {16000 ،
    16000, 16000, 16000, 16000, 16000, 16000,
    16000, 16000, 16000, 16000, 16000, 16000,
    16000, 16000, 16000};
    const int distance_length = 3؛
    int distance_index = 0 ؛
    / / قيم تجاوز 2 أوكتافات
    ترددات int = {39 ، 42 ، 44 ، 47 ،
    50, 52, 56, 59, 63, 66, 70, 74, 79,
    84, 89, 94, 100, 105, 112, 118, 126,
    133, 141, 149};
    // الملعب الأولي
    الملعب كثافة العمليات = 160 ؛
    // الحجم الأولي والتسارع
    // معامل
    int lastAcc = 0 ؛
    حجم تعويم = 0 ؛
    // تشغيل الصوت على دبوس 3
    بايت مكبر الصوت = 3 ؛
    // مؤشر متغير لوضع في
    // الموجي
    البايت المتقلبة waveindex = 0
    قيمة البايت المتقلبة = 0 ؛
    // دبوس المستخدمة لأجهزة الاستشعار فائقة الصوتية
    const int pingPin = 7؛
    دبابيس // لجهد الجهد
    const intدامةPin = 1 ؛
    const حساسية int = 2 ؛
    دبابيس // لكل إصبع اليسار
    // اليد
    const int finger1 = 9 ؛
    const int finger2 = 10 ؛
    const int finger3 = 11 ؛
    const int finger4 = 12 ؛
    int fingerValue = 0؛
    مدة طويلة ، بوصة ، سم ؛
    الإعداد باطل() {
    pinMode (3، OUTPUT)؛ // المتحدث على دبوس 3
    pinMode (finger1، INPUT)؛
    pinMode (finger2، INPUT)؛
    pinMode (finger3، INPUT)؛
    pinMode (finger4، INPUT)؛

    /**************************
    تكوين الصوت PWM
    ****************************/
    // ضبط Timer2 على وضع PWM السريع
    // (مضاعفة تردد PWM)
    bitSet (TCCR2A ، WGM21) ؛
    bitSet (TCCR2B، CS20) ؛
    bitClear (TCCR2B، CS21) ؛
    bitClear (TCCR2B، CS22) ؛
    // تمكين المقاطعات الآن أن السجلات
    // تم ضبطها
    SEI ()؛

    /*************************
    الموقت 1 التكوين المقاطعة
    *************************/
    // تعطيل المقاطعات بينما
    يتم تكوين // السجلات
    المبادرة القطرية ()؛
    / * تشغيل المنفذ العادي ، وقطع الدبابيس
    من تشغيل الموقت (كسر pwm) * /
    bitClear (TCCR1A ، COM1A1) ؛
    bitClear (TCCR1A ، COM1A1) ؛
    bitClear (TCCR1A ، COM1A1) ؛
    bitClear (TCCR1A ، COM1A1) ؛
    / * الوضع 4 ، CTC مع TOP تعيين بواسطة التسجيل
    OCR1A. يسمح لنا بتعيين التوقيت المتغير لـ
    المقاطعة عن طريق كتابة قيم جديدة ل
    OCR1A. * /
    bitClear (TCCR1A ، WGM10) ؛
    bitClear (TCCR1A، WGM11) ؛
    bitSet (TCCR1B ، WGM12) ؛
    bitClear (TCCR1B ، WGM13) ؛
    / * اضبط محدد الوقت على / 8. * /
    bitClear (TCCR1B، CS10) ؛
    bitSet (TCCR1B، CS11) ؛
    bitClear (TCCR1B، CS12) ؛
    / * تعطيل قوة الناتج مقارنة ل
    القنوات A و B. * /
    bitClear (TCCR1C ، FOC1A) ؛
    bitClear (TCCR1C، FOC1B)؛
    / * تهيئة الإخراج مقارنة
    سجل A في 160 لتعيين
    الملعب الأولي * /
    OCR1A = 160 ؛
    // تعطيل التقاط التقاط المقاطعة
    bitClear (TIMSK1 ، ICIE1) ؛
    // تعطيل الإخراج
    / / قارن B المباراة المقاطعة
    bitClear (TIMSK1 ، OCIE1B) ؛
    // تمكين الإخراج
    // قارن مقاطعة المباراة
    bitSet (TIMSK1 ، OCIE1A) ؛
    / تعطيل مقاطعة تجاوز السعة
    bitClear (TIMSK1 ، TOIE1) ؛
    // تمكين المقاطعات الآن
    تم تعيين سجلات //
    SEI ()؛
    }
    // الموقت تجاوز معالج
    ISR (TIMER1_COMPA_vect) {
    / * timer1 ISR. في كل مرة
    ويسمى ذلك يحدد المتكلمين ل
    القيمة التالية في الشكل الموجي . تكرر
    يتم التعديل عن طريق تغيير
    التوقيت بين النداءات المتعاقبة لـ
    هذه الوظيفة ، على سبيل المثال للحصول على نغمة 1 كيلو هرتز ،
    ضبط التوقيت بحيث يتم تشغيله
    خلال الطول الموجي 1000 مرة
    ثانية. * /
    / / إعادة تعيين waveindex إذا وصلت
    // نهاية الصفيف
    if (waveindex> 102) {
    waveindex = 0 ؛
    }
    // قم بتعيين قيمة الإخراج
    إذا (الحجم> 0.03) {
    analogWrite (speakerpin،
    waveformVolume waveindex)؛
    }
    waveindex ++؛
    // تحديث الملعب
    OCR1A = الملعب ؛
    }

    حلقة فارغة()
    {
    // إلغاء تنشيط المتداخلات ، وإرسال بينغ
    // رسالة وانتظر الجواب.
    المبادرة القطرية ()؛
    pinMode (pingPin ، OUTPUT) ؛
    digitalWrite (pingPin، LOW)؛
    delayMicroseconds (2)؛
    digitalWrite (pingPin ، عالية) ؛
    delayMicroseconds (5)؛
    digitalWrite (pingPin، LOW)؛
    المدة = pulseIn (pingPin ، HIGH ، 2000) ؛
    SEI ()؛
    / / قم بتحويل الوقت إلى مسافة
    // في السنتيمترات
    // وتخزينها في المخزن المؤقت
    distance_buffer distance_index ++
    ٪ distance_length = المدة / 20 ؛
    / / ابحث في المخزن المؤقت الأقصر
    // المسافة المقاسة
    سم = 16000 ؛
    من أجل (int i = 0 ؛ i <distance_length؛ i ++) {
    cm = min (cm ، distance_buffer i) ؛
    }
    // تحقق من الضغط على الأصابع
    fingerValue = 5 ؛
    إذا (! digitalRead (finger4)) {
    fingerValue = 4 ؛
    }
    إذا (! digitalRead (finger3)) {
    fingerValue = 3 ؛
    }
    إذا (! digitalRead (finger2)) {
    fingerValue = 2 ؛
    }
    إذا (! digitalRead (finger1)) {
    fingerValue = 1 ؛
    }
    // تحديث الإبقاء و
    // قيم الحساسية
    تعويم الحفاظ =
    الخريطة (analogRead (SustainPin) ، 0 ،
    1024, 101, 130) / 100.0;
    حساسية الباحث =
    خريطة (analogRead (sensitivityPin)،
    0, 1024, 100, 200);
    // تحديث مستوى الصوت
    حجم = حجم / الحفاظ ؛
    إذا (الحجم <0) {
    حجم = 0 ؛
    }

    // تحقق من التسارع
    int acc = analogRead (0)؛
    int accDiff = lastAcc - acc؛
    // تحديث قيمة الصوت
    if (accDiff> 5 * (200 - حساسية)) {
    حجم + = (تعويم)
    الأسرى (accDiff،
    حساسية / 100.0) / 50000 ؛
    }
    lastAcc = acc؛
    // تأكد من أن حجم الصوت ليس أعلى من 1
    إذا (حجم الصوت> .95) {
    حجم = .95 ؛
    }
    // تحديث مستوى الصوت في الموجي
    من أجل (int i = 0 ؛ i <= 102 ؛ i ++) {
    waveformVolume i =
    ((الطول الموجي i - 127) * حجم) + 127 ؛
    }
    / / ضبط الملعب حسب المسافة
    // بين اليدين و
    // ضغطت الأصابع
    إذا (سم <102 && سم> 0) {
    إذا (سم> 30) {
    الملعب = الترددات 7 +
    ((((سم - 30) / 24) * 4 + fingerValue - 1) ؛
    }آخر{
    الملعب = الخريطة (سم ، 0 ، 30 ، 39 ، 79) ؛
    }
    }آخر{
    الملعب = الترددات 7 +
    ((((102 - 30) / 24) * 4 + fingerValue - 1) ؛
    }
    // تأخير لتجنب إشارات كذاب
    تأخير (50)؛
    }
    ------------------------------------------------------