Схемы

Как создать воздушную гитару с Arduino, также известной как гитара AIRduino: 5 шагов

Я Бегу Навстречу Дали...

Я Бегу Навстречу Дали...

Оглавление:

Anonim

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

    Цель состоит в том, чтобы получить ощущение игры на настоящей гитаре. Гитара AIRduino состоит из одной перчатки и одной палки.Перчатка используется для установки тона, а ручка - для запуска звука.

    Для выполнения такого трюка мы использовали акселерометр и ультразвуковой датчик (см. Шаг 1 для описания концепции).

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


    Команда AIRduino:

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

    Расходные материалы:

    Шаг 1: Описание концепции

    Воздушная гитара должна работать как правша.
    Гитарный контроллер разделен на две части: левый контроллер и правый контроллер.
    С помощью контроллера левой руки игрок может согнуть пальцы и нажать перчатку, чтобы изменить высоту звука.
    Правый контроллер представлен палкой, которую нужно встряхнуть, чтобы вызвать звук воздушной гитары.
    Игрок также может изменить расстояние между правой рукой и левой рукой, чтобы передать тоны, имитируя различные лады на гитаре гитары.
    Для выполнения таких трюков основными компонентами являются акселерометр, чтобы «почувствовать» дрожание палки, взломанный ультразвуковой датчик для измерения расстояния между правой рукой и палкой, и проводящая ткань для создания перчатки.
    В общем, это довольно легко построить игрушку. Единственная сложность - взлом ультразвукового датчика, который требует некоторой ловкости. Вам понадобятся некоторые базовые электронные навыки, чтобы понять инструкции, а также выяснить, что вы сделали неправильно, когда что-то испортили, а гитара в итоге не работает. Мы были там. :-)

    Шаг 2: Список покупок

    Вот список того, что вам нужно для создания собственной гитары AIRduino:
    1. Провода: к сожалению, много для этого прототипа. Они были использованы для соединения двух перчаток и частей Arduino вместе. Не стесняйтесь улучшать эту часть дизайна, сделав его беспроводным!
    2. Акселерометр: используется в ручке в правой руке, чтобы обнаружить сотрясение. Мы использовали трехосевой акселерометр, но достаточно одной оси
    3. Ультразвуковой датчик: используется для измерения расстояния между обеими руками игрока, мы использовали Parallax # 28015
    4. Проводящие и эластичные ткани: для создания перчаток,
    5. Arduino: ядро ​​гитары, которая обрабатывает все. Arduino Diecimila работает отлично.
    6. Потенциометры: для настройки некоторых параметров потенциометр с максимальным значением от 1 кОм до 1 МОм в порядке.
    7. Клей-расплав: удобный способ скрепить вещи,
    8. Гнездо 3,5 мм: используется для вывода звука,
    9. Классические электронные компоненты: резисторы (10 кОм), конденсатор (10 мкФ), светодиоды и какой-то блок питания для Arduino. (Аккумулятор 9В просто отлично).

    Шаг 3: Схема

    Вот электронные схемы для гитары AIRduino.
    Как видите, это довольно легко понять и, следовательно, также построить.
    Посмотрите на изображение, если вы хотите понять, какой компонент куда идет. Как вы, наверное, понимаете, это никак не масштабировать. Кабели намного длиннее, чем показано на схеме.
    Вы могли также заметить, что излучатель ультразвукового датчика находится на ручке, а приемник - на левой руке. Это сложная часть, о которой я упоминал ранее: вы должны отпаять ультразвуковой излучатель от ультразвукового датчика, чтобы отделить его от платы датчика.
    Подробнее об этом на следующих шагах. Теперь приступим к работе!

    Шаг 4: Строим перчатку

    Перчатка содержит один ультразвуковой приемник и четыре кнопки. Это оно!
    Ультразвуковой приемник расположен в черном ящике, видимом на некоторых изображениях ниже.
    Перчатка имеет одну большую область, которая только что заземлена на плате Arduino. Когда палец прижимается к ладони, создается соединение между проводящей тканью на пальце и ладонью.
    Ниже приведены изображения двух разных моделей перчаток. Один имеет съемные пальцы, что позволяет обоим игрокам с очень маленькими и очень большими руками. Другая модель сшита прямо на стандартную перчатку. Я бы порекомендовал вторую версию, ее легче собрать и легче надеть.

    Шаг 5: Код

    Вот необходимый код Arduino:
    Часть создания звука в реальном времени взята из этого замечательного урока.
    ------------------------------------------------------
    // Массив, содержащий форму волны
    // гитарного звука
    осциллограмма =
    {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};
    // массив, используемый в качестве буфера, чтобы избежать
    // ошибочное пунктуальное расстояние
    // измерения
    unsigned 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;
    // индексная переменная для позиции в
    // осциллограммы
    volin waveindex = 0
    текущее значение байта volatile = 0;
    // Пин используется для ультразвукового датчика
    const int pingPin = 7;
    // Контакты для потенциометров
    const inttainPin = 1;
    const int чувствительностьPin = 2;
    // Пины для каждого пальца слева
    // рука
    const int finger1 = 9;
    const int finger2 = 10;
    const int finger3 = 11;
    const int finger4 = 12;
    int fingerValue = 0;
    большая продолжительность, дюймы, см;
    void setup () {
    pinMode (3, OUTPUT); // Динамик на контакте 3
    pinMode (finger1, INPUT);
    pinMode (finger2, INPUT);
    pinMode (finger3, INPUT);
    pinMode (finger4, INPUT);

    /**************************
    Конфигурация аудио ШИМ
    ****************************/
    // установить Timer2 в режим быстрого ШИМ
    // (удваивает частоту ШИМ)
    bitSet (TCCR2A, WGM21);
    bitSet (TCCR2B, CS20);
    bitClear (TCCR2B, CS21);
    bitClear (TCCR2B, CS22);
    // теперь разрешаем прерывания, которые регистрируются
    // были установлены
    SEI ();

    /*************************
    Конфигурация прерывания от Таймера 1
    *************************/
    // отключаем прерывания
    // регистры настроены
    кли ();
    / * Нормальная работа порта, контакты отключены
    от работы по таймеру (прерывание ШИМ) * /
    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);
    / * Инициализирует сравнение результатов
    Зарегистрируйте A на 160, чтобы установить
    начальный шаг * /
    OCR1A = 160;
    // отключаем прерывание захвата ввода
    bitClear (TIMSK1, ICIE1);
    // отключаем вывод
    // Сравнить B Match Interrupt
    bitClear (TIMSK1, OCIE1B);
    // включить вывод
    // Сравнение прерывания матча
    bitSet (TIMSK1, OCIE1A);
    // отключаем прерывание переполнения
    bitClear (TIMSK1, TOIE1);
    // теперь разрешаем прерывания
    // регистры были установлены
    SEI ();
    }
    // Обработчик переполнения таймера
    ISR (TIMER1_COMPA_vect) {
    / * таймер1 ISR. Каждый раз
    называется это устанавливает спикер к
    следующее значение в форме волны . частота
    модуляция осуществляется путем изменения
    время между последовательными вызовами
    эта функция, например для тона 1 кГц,
    установить время, чтобы он работал
    через форму волны 1000 раз
    Второй. * /
    // сбрасываем waveindex, если он достиг
    // конец массива
    if (waveindex> 102) {
    waveindex = 0;
    }
    // Установить выходное значение
    if (объем> 0,03) {
    analogWrite (speakerpin,
    waveformVolume waveindex);
    }
    waveindex ++;
    // Обновляем высоту тона
    OCR1A = шаг;
    }

    void loop ()
    {
    // Деактивируем входы, отправляем пинг
    // сообщение и ждем ответа.
    кли ();
    pinMode (pingPin, OUTPUT);
    digitalWrite (pingPin, LOW);
    delayMicroseconds (2);
    digitalWrite (pingPin, HIGH);
    delayMicroseconds (5);
    digitalWrite (pingPin, LOW);
    длительность = pulseIn (pingPin, HIGH, 2000);
    SEI ();
    // преобразовать время в расстояние
    // в сантиметрах
    // и сохраняем в буфере
    distance_buffer distance_index ++
    % distance_length = длительность / 20;
    // Находим в буфере самый короткий
    // измеренное расстояние
    см = 16000;
    for (int i = 0; i <distance_length; i ++) {
    см = мин (см, расстояние_буфер i);
    }
    // Проверяем, какие пальцы нажаты
    fingerValue = 5;
    если (! digitalRead (finger4)) {
    fingerValue = 4;
    }
    если (! digitalRead (finger3)) {
    fingerValue = 3;
    }
    если (! digitalRead (finger2)) {
    fingerValue = 2;
    }
    если (! digitalRead (finger1)) {
    fingerValue = 1;
    }
    // Обновление сустейна и
    // значения чувствительности
    плавать сустейн =
    карта (аналогЧитать (сустПин), 0,
    1024, 101, 130) / 100.0;
    int чувствительность =
    Карта (analogRead (sensitivityPin),
    0, 1024, 100, 200);
    // Обновляем громкость
    объем = объем / сустейн;
    if (громкость <0) {
    громкость = 0;
    }

    // Проверка акселерометра
    int acc = analogRead (0);
    int accDiff = lastAcc - acc;
    // Обновляем значение громкости
    if (accDiff> 5 * (200 - чувствительность)) {
    громкость + = (плавать)
    Пау (accDiff,
    чувствительность / 100,0) / 50000;
    }
    lastAcc = acc;
    // Проверяем, что громкость не превышает 1
    if (volume> .95) {
    объем = 0,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);
    }
    ------------------------------------------------------