Вериги

Как да се изгради въздушна китара с Arduino, Aka на китара AIRduino: 5 стъпки

парень из микс -4 вродеа

парень из микс -4 вродеа

Съдържание:

Anonim

  • Идеята тук е да се изгради виртуална китара, която да може да се носи, която трябва да се контролира с две ръце, много като свиренето на Air Guitar. Той е създаден и прототипиран по време на двуседмичен проект в Чалмърсуниверситет (Швеция) за клас физически изчисления.

    Целта е да се получи усещането за свирене на истинска китара. Китарата AIRduino е направена от една ръкавица и една пръчка.Ръкавицата се използва за задаване на тон и стик за задействане на звука.

    За да извършим такъв трик, използвахме акселерометър и ултразвуков сензор (вж. Стъпка 1 за описание на концепцията).

    Разгледайте демонстрацията на видеото, за да получите по-точна представа за това как работи и да се заемете с работата, за да изградите своя собствена!


    Екипът на AIRduino:

    Дейвид Фурние, Жан-Луи Джордано, Монире Санай, Мазиар Шелбаф и Густав Сотел.

    градина:

    Стъпка 1: Описание на концепцията

    Въздушната китара трябва да работи като дясна китара.
    Контролерът на китара е разделен на две части, ляв контролер и десен контролер.
    Чрез ляв контролер играчът може да свие пръстите си и да натисне ръкавицата, за да промени височината на тона.
    Дясният контролер е представен от пръчка, която трябва да се разклати, за да задейства звука на въздушната китара.
    Играчът може също да променя разстоянието между дясната и лявата ръка, за да насочи тоновете, симулирайки различните прагчета на врата на китарата.
    За да изпълняват такива трикове, основните компоненти са акселерометър, който "усеща" разклащането на пръчката, хакнат ултра-звуков сензор за измерване на разстоянието между дясната ръка и пръчката, и проводяща тъкан за изграждане на ръкавицата.
    В крайна сметка, това е доста лесна за изграждане играчка. Единствената сложна част ще бъде ултразвуковият сензор, който изисква сръчност. Вие ще се нуждаете от някои основни електронни умения, за да разберете инструкциите, както и да разберете какво сте направили погрешно, когато сте объркали нещо и китарата не работи в края. Ние бяхме там. :-)

    Стъпка 2: Списък за пазаруване

    Ето списък на това, което трябва да изградите своя собствена китара AIRduino:
    1. Проводници: за съжаление много за тази прототипна версия. Те са използвани за свързване на двете ръкавици и частите Arduino заедно. Чувствайте се свободни да подобрите тази част от дизайна, като я направите безжична!
    2. Акселерометър: използва се в пръчката в дясната ръка, за да се открие разклащането. Използвахме триосен акселерометър, но достатъчно е една ос
    3. Ултразвуков сензор: използва се за измерване на разстоянието между двете ръце на играча, използвахме Parallax # 28015
    4. Проводими и опънати тъкани: за изграждане на ръкавицата,
    5. Arduino: сърцевината на китарата, която обработва всичко. Arduino Diecimila работи добре.
    6. Потенциометри: за да настроите някои настройки, потенциометър с максимална стойност от 1KOhm-1MOhm е добре.
    7. горещо лепило: удобен начин да се държат нещата заедно,
    8. 3,5 мм женски жак: използва се за аудио изход,
    9. Класически електронни неща: Резистори (10k), кондензатор (10uF), светодиоди и някакъв вид захранване за arduino. (Акумулаторна батерия 9V е много добра).

    Стъпка 3: Схеми

    Ето и електронните схеми за китарата AIRduino.
    Както можете да видите, това е доста лесно да се разбере и следователно също да се изгради.
    Погледнете изображението, ако искате идея кой компонент отива къде. Както най-вероятно разбирате, това не може да се мащабира по никакъв начин. Кабелите са много по-дълги, отколкото е показано в схематичната схема.
    Може също да сте забелязали, че емитерът на ултразвуковия сензор е на пръчката и приемникът е от лявата ръка. Това е трудната част, която споменах по-рано: трябва да отлепите ултра-звуковия излъчвател от ултразвуковия сензорен модул, за да го разделите от бордовия сензор.
    Повече за това на по-късни стъпки. Сега да се заемем с работата!

    Стъпка 4: Изграждане на ръкавицата

    Ръкавицата съдържа един ултразвуков приемник и четири бутона. Това е!
    Ултразвуковият приемник се намира в черната кутия, видима на някои от снимките по-долу.
    Ръкавицата има една голяма площ, която е просто свързана към земята на дъската Arduino. При натискане на пръст върху дланта се създава връзка между проводящата тъкан на пръста и дланта.
    По-долу е представена картина на два различни вида ръкавици. Единият има подвижни пръсти, което позволява на играчите с много малки и много големи ръце. Другият модел се зашива на стандартна ръкавица. Бих препоръчал втората версия, тя е по-лесна за изграждане и по-лесна за поставяне.

    Стъпка 5: Код

    Изисква се кодът Arduino:
    В реално време звук поколение част е взето от този голям урок.
    ------------------------------------------------------
    // Масив, съдържащ формата на вълната
    // на китарен звук
    char waveform =
    {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};
    // масив, използван като буфер за избягване
    // неправилна точност
    // измервания
    неподписан int distance_buffer = {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};
    // Начална стъпка
    int pitch = 160;
    // Първоначален обем и ускорение
    // параметър
    int lastAcc = 0;
    обем на флоат = 0;
    // аудио възпроизвеждане на пин 3
    байт високоговорител = 3;
    // индексна променлива за позиция в
    // вълната
    volatile байт waveindex = 0
    волатилен байт currentvalue = 0;
    // Pin използва за ултразвуков сензор
    const int pingPin = 7;
    // Пин за потенциометри
    const int sustainPin = 1;
    const int sensitivityPin = 2;
    // Пин за всеки пръст отляво
    // ръка
    const int finger1 = 9;
    const int finger2 = 10;
    const int finger3 = 11;
    const int finger4 = 12;
    int fingerValue = 0;
    дълга продължителност, инча, см;
    void setup () {
    pinMode (3, ИЗХОД); // Високоговорител на пин 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 прекъсване конфигурация
    *************************/
    // деактивира прекъсванията докато
    // регистрите са конфигурирани
    CLI ();
    / * Нормална работа на портовете, пин прекъснати
    от работата на таймера (прекъсване на шум) * /
    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);
    / * Деактивиране на силата на изхода
    Канали А и В. * /
    bitClear (TCCR1C, FOC1A);
    bitClear (TCCR1C, FOC1B);
    / * Инициализира Изходно сравнение
    Регистрирайте А на 160, за да зададете
    начална стъпка * /
    OCR1A = 160;
    // деактивира прекъсването на запис на входа
    bitClear (TIMSK1, ICIE1);
    // деактивира изхода
    // Сравнете прекъсването на мач
    bitClear (TIMSK1, OCIE1B);
    // разрешава изхода
    // Сравняване на прекъсване на съвпадение
    bitSet (TIMSK1, OCIE1A);
    // деактивира прекъсването на препълването
    bitClear (TIMSK1, TOIE1);
    // разрешава прекъсванията сега
    // регистрите са зададени
    SEI ();
    }
    // Устройството за препълване на таймера
    ISR (TIMER1_COMPA_vect) {
    / * timer1 ISR. Всеки път
    се нарича тя определя speakerpin на
    следващата стойност в форма на вълната . Честота
    модулацията се извършва чрез промяна на
    синхронизиране между последователни обаждания на
    тази функция, напр. за 1KHz тон,
    настройте времето, така че да работи
    чрез форма на вълната 1000 пъти
    секунда. * /
    // рестартира waveindex, ако е достигнал
    // края на масива
    ако (waveindex> 102) {
    waveindex = 0;
    }
    // Задаване на изходната стойност
    ако (обем> 0.03) {
    analogWrite (speakerpin,
    waveformVolume waveindex);
    }
    waveindex ++;
    // Актуализиране на терена
    OCR1A = стъпка;
    }

    невалидна линия ()
    {
    // Дезактивиране на интерфейсите, изпращане на пинг
    // съобщение и изчакайте отговора.
    CLI ();
    pinMode (pingPin, OUTPUT);
    digitalWrite (pingPin, LOW);
    delayMicroseconds (2);
    digitalWrite (pingPin, HIGH);
    delayMicroseconds (5);
    digitalWrite (pingPin, LOW);
    продължителност = импулс (pingPin, HIGH, 2000);
    SEI ();
    // преобразуваме времето на разстояние
    в сантиметри
    // и се съхранява в буфер
    distance_buffer distance_index ++
    % distance_length = продължителност / 20;
    // Намерете най-краткия буфер
    // измерено разстояние
    cm = 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;
    }
    // Актуализиране на support и
    // стойности на чувствителност
    float support =
    карта (аналогRead (sustainPin), 0,
    1024, 101, 130) / 100.0;
    int чувствителност =
    карта (analogRead (sensitivityPin)
    0, 1024, 100, 200);
    // Актуализиране на звука
    обем = обем / поддържане;
    ако (обем <0) {
    обем = 0;
    }

    // Проверете акселерометъра
    int acc = analogRead (0);
    int accDiff = lastAcc - acc;
    // Актуализира стойността на обема
    if (accDiff> 5 * (200 - чувствителност)) {
    volume + = (float)
    диаграма (accDiff,
    чувствителност / 100.0) / 50000;
    }
    lastAcc = acc;
    // Проверяваме, че обемът не е по-голям от 1
    ако (обем> .95) {
    обем = .95;
    }
    // Актуализиране на силата на звука във формата на вълната
    за (int i = 0; i <= 102; i ++) {
    waveformVolume i =
    ((форма на вълната i - 127) * обем) + 127;
    }
    // Задаване на терена според разстоянието
    // между двете ръце и
    // притиснати пръсти
    ако (cm <102 && cm> 0) {
    ако (cm> 30) {
    стъпка = честоти 7 +
    (((cm - 30) / 24) * 4 + fingerValue - 1);
    } Друг {
    стъпка = карта (cm, 0, 30, 39, 79);
    }
    } Друг {
    стъпка = честоти 7 +
    (((102 - 30) / 24) * 4 + fingerValue - 1);
    }
    // Закъснение, за да се избегнат сигнали, които се отскачат
    забавяне (50);
    }
    ------------------------------------------------------