10 музыкальных проектов Arduino: от терменвокса до DJ-контроллера

Пройдите тест, узнайте какой профессии подходите
Сколько вам лет
0%
До 18
От 18 до 24
От 25 до 34
От 35 до 44
От 45 до 49
От 50 до 54
Больше 55

Для кого эта статья:

  • Музыкальные энтузиасты и хоббисты, интересующиеся DIY-проектами
  • Люди, желающие развить технические навыки в электронике и программировании
  • Учителя и студенты, заинтересованные в практическом обучении через творчество и эксперименты с Arduino

    Arduino открывает бесконечные музыкальные горизонты даже для тех, кто никогда не держал в руках паяльник! Представьте: вы создаёте собственный синтезатор, MIDI-контроллер или даже целый барабанный модуль с нуля. Эти 10 впечатляющих музыкальных проектов превратят ваше увлечение электроникой в настоящую симфонию творчества. Готовы воплотить звуковые фантазии в реальность и удивить друзей самодельными музыкальными инструментами? Следуйте нашим пошаговым инструкциям и станьте маэстро DIY-музыки! 🎵🔌

Хотите расширить свои технические навыки за пределы Arduino? Погрузитесь в мир Python-разработки с курсами Skypro и откройте новые возможности для ваших музыкальных проектов! Python идеально дополняет навыки работы с Arduino: вы сможете создавать более сложные музыкальные алгоритмы, визуализации звука и даже веб-интерфейсы для управления вашими DIY-инструментами. Представьте собственное музыкальное приложение, которое взаимодействует с вашими Arduino-устройствами! 🐍🎹

Музыкальная магия Arduino: от идеи к звуку

Arduino стала настоящим прорывом для DIY-энтузиастов, желающих воплотить свои музыкальные идеи в реальность. Платформа предлагает доступный вход в мир электронных инструментов без необходимости глубоких познаний в электронике. Секрет успеха Arduino в музыкальной сфере кроется в универсальности — с её помощью можно создавать как простейшие звуковые устройства, так и профессиональные инструменты концертного уровня. 🎸

Звукоизвлечение на Arduino возможно несколькими способами:

  • PWM-синтез — самый базовый метод генерации звука непосредственно через цифровые выходы платы
  • Работа с внешними DAC (цифро-аналоговыми преобразователями) для более чистого и контролируемого звука
  • MIDI-коммуникация с внешними синтезаторами, позволяющая Arduino выступать в роли контроллера
  • Использование специализированных аудио-щитов вроде Arduino Music Shield или Adafruit Music Maker

Алексей Петров, преподаватель робототехники
Мой первый музыкальный проект на Arduino родился случайно. Я готовил демонстрацию для школьников и хотел чем-то их удивить. Решил собрать простую "музыкальную перчатку" с гибкими датчиками на пальцах, подключенными к Arduino Nano. Каждый палец активировал определенную ноту через маленький пьезоизлучатель. Представляете мое удивление, когда один из семиклассников через неделю принес свою версию — перчатку, управляющую сэмплами через Bluetooth! Он не только повторил мою схему, но и существенно улучшил ее. С тех пор я всегда рассказываю эту историю студентам, чтобы показать: даже простейший проект может стать отправной точкой для настоящих инноваций.

Основная прелесть Arduino в музыкальных проектах — это возможность быстро пройти путь от концепции до работающего прототипа. Благодаря огромному сообществу разработчиков, большинство типичных задач уже решено, а готовые библиотеки значительно упрощают программирование звуковых функций. Например, для работы с MIDI достаточно подключить библиотеку MIDI Library, а для генерации тонов через PWM существует встроенная функция tone().

Почему именно Arduino становится выбором музыкальных экспериментаторов?

  • Низкий порог входа и доступность компонентов
  • Простой C-подобный язык программирования
  • Богатый выбор сенсоров для управления звуком
  • Компактность и энергоэффективность готовых решений
  • Возможность автономной работы без компьютера
Пошаговый план для смены профессии

5 простых и 5 продвинутых проектов для творчества

Начнем с проектов, которые подойдут даже новичкам в мире Arduino и электроники. Эти устройства можно собрать за один вечер, используя минимум компонентов. 🔧

Простые проекты:

  1. Музыкальный светодиодный куб (3×3×3) — Устройство, где светодиоды мигают в такт воспроизводимой мелодии. Идеальный старт для понимания основ синхронизации звука и света.
  2. Терменвокс на фоторезисторе — Классический электронный инструмент в миниатюре. Изменяя освещенность фоторезистора рукой, вы меняете высоту генерируемого тона.
  3. One-Button MIDI Controller — Простейший контроллер с одной кнопкой, отправляющий MIDI-сигналы на компьютер. Можно использовать для запуска сэмплов или переключения пресетов.
  4. Мелодичный дверной звонок — Замените стандартный звонок на программируемый, воспроизводящий вашу любимую мелодию через пьезоизлучатель.
  5. Ритм-машина с 4 кнопками — Миниатюрная драм-машина с программируемыми ритмическими паттернами, активируемыми кнопками.
Название проекта Сложность (1-5) Время сборки Ключевые компоненты
Музыкальный LED куб 2 2-3 часа 27 светодиодов, пьезоизлучатель
Терменвокс 1 30 минут Фоторезистор, динамик
One-Button MIDI 2 1 час Тактовая кнопка, USB-кабель
Дверной звонок 1 1 час Пьезоизлучатель, кнопка
Ритм-машина 3 3-4 часа 4 кнопки, динамик

Теперь перейдем к более амбициозным проектам для тех, кто уже освоил основы работы с Arduino и готов к новым вызовам. 🚀

Продвинутые проекты:

  1. MIDI-клавиатура на 12 клавиш — Полноценная MIDI-клавиатура с одной октавой, подключаемая к компьютеру или внешнему синтезатору.
  2. Arduino Synthesizer Shield — Модульный синтезатор в формате шилда для Arduino с аналоговыми осцилляторами, фильтрами и огибающей.
  3. Laser Harp — Лазерная арфа, где прерывание лучей фотодатчиками запускает различные ноты. Выглядит эффектно и звучит футуристично!
  4. Step Sequencer с LED-индикацией — 16-шаговый секвенсор с программированием паттернов и визуальной обратной связью через матрицу светодиодов.
  5. Gesture-Controlled DJ Controller — Инновационный контроллер, считывающий движения рук с помощью акселерометров и гироскопов для управления диджейским ПО.

Марина Соколова, звукорежиссер
Я долго искала уникальный контроллер для живых выступлений, но все коммерческие решения казались однотипными. Решила создать свой на Arduino Mega. Основной идеей стал круговой сенсорный интерфейс — 12 емкостных сенсоров, расположенных по кругу, как часовой циферблат. Каждый сенсор запускал определенный луп, а движение пальца по кругу модулировало фильтр. Внутри круга разместила джойстик для управления эффектами реверберации и дилэя.

На первом же выступлении контроллер привлек больше внимания, чем сама музыка! Трое слушателей подошли после шоу с просьбой сделать такой же для них. Так хобби превратилось в небольшой бизнес — сейчас я выпускаю лимитированные серии кастомных контроллеров на Arduino для музыкантов-экспериментаторов. Самое удивительное, что коммерческие версии моих устройств по-прежнему стоят дешевле фабричных аналогов, при этом предлагая гораздо больше возможностей для кастомизации.

Необходимые компоненты и программное обеспечение

Для реализации музыкальных проектов на Arduino потребуется определенный набор аппаратного и программного обеспечения. Рассмотрим базовые и специализированные компоненты, необходимые для создания собственных музыкальных устройств. 🎛️

Базовое оборудование:

  • Плата Arduino — Для большинства проектов подойдет Arduino Uno или Nano. Для более сложных конструкций с множеством входов/выходов рекомендуется Arduino Mega.
  • Макетная плата — Беспаечная макетная плата (breadboard) позволит быстро собирать и модифицировать схемы без пайки.
  • Соединительные провода — Набор проводов типа "папа-папа", "мама-папа" и "мама-мама" для соединения компонентов.
  • USB-кабель — Для подключения Arduino к компьютеру, загрузки скетчей и питания платы.

Аудио-компоненты:

  • Пьезоизлучатель — Простейший способ генерации звука, подходит для базовых проектов.
  • Динамик (8 Ом) — Обеспечивает более качественное звучание, но требует усилителя.
  • Аудио-усилитель — Например, LM386 или PAM8403 для усиления выходного сигнала Arduino.
  • Аудио разъемы — 3.5 мм джек или RCA разъемы для подключения к внешним системам.
  • Аудио-шилды — Готовые решения вроде Adafruit Music Maker Shield или Sparkfun MP3 Player Shield.

Элементы управления:

  • Потенциометры — Для регулировки параметров звука (10K-100K Ом).
  • Тактовые кнопки — Для создания клавиатур и контроллеров.
  • Сенсоры — Фоторезисторы, датчики расстояния (ультразвуковые, ИК), акселерометры (ADXL335, MPU6050).
  • Емкостные сенсоры — Модули MPR121 для создания сенсорных интерфейсов.
  • MIDI-разъемы — DIN-5 разъемы для классических MIDI-подключений.

Программное обеспечение:

  • Arduino IDE — Основная среда разработки для программирования Arduino.

  • Библиотеки: – Tone — встроенная библиотека для генерации тонов – MIDI Library — для работы с MIDI-протоколом – Mozzi — для продвинутого синтеза звука – VS1053 — для работы с MP3-декодером – Adafruit Wave Shield Library — для воспроизведения WAV-файлов

  • Дополнительный софт: – Hairless MIDI — для MIDI-коммуникации между Arduino и компьютером – Audacity — для подготовки аудиофайлов – Fritzing — для создания схем подключения

Тип проекта Рекомендуемая плата Ключевые компоненты Библиотеки
Простой синтезатор Arduino Uno/Nano Динамик, потенциометры Tone
MIDI-контроллер Arduino Uno/Leonardo Кнопки, потенциометры, MIDI-разъем MIDI Library
Секвенсор Arduino Mega LED-матрица, кнопки, потенциометры Tone, FastLED
Сэмплер Arduino Mega SD-карта, аудио-шилд SD, VS1053/Adafruit Wave
Гестурный контроллер Arduino Nano 33 IoT Акселерометр, гироскоп, Bluetooth MIDI Library, ArduinoBLE

Схемы подключения и код для каждого проекта

Рассмотрим подробные схемы и базовый код для пяти из наших музыкальных проектов. Эти примеры можно использовать как основу для дальнейших экспериментов и модификаций. 📝

1. Терменвокс на фоторезисторе

Схема подключения:

  • Фоторезистор подключается к аналоговому входу A0 через резистор 10кОм на землю
  • Пьезоизлучатель/динамик подключается к цифровому пину 8 и GND

Код:

cpp
Скопировать код
const int sensorPin = A0;     // Пин фоторезистора
const int speakerPin = 8;     // Пин динамика

void setup() {
  pinMode(speakerPin, OUTPUT);
}

void loop() {
  int sensorValue = analogRead(sensorPin);  // Чтение значения фоторезистора (0-1023)
  int frequency = map(sensorValue, 0, 1023, 100, 2000);  // Преобразование в частоту (100-2000 Гц)
  
  tone(speakerPin, frequency);  // Генерация звука соответствующей частоты
  delay(10);  // Небольшая задержка для стабильности
}

2. Ритм-машина с 4 кнопками

Схема подключения:

  • Четыре кнопки подключаются к цифровым пинам 2, 3, 4, 5 (другой контакт к GND)
  • Резисторы 10кОм от 5V к каждому пину кнопки (подтягивающие резисторы)
  • Динамик подключается к пину 8 через резистор 100 Ом

Код:

cpp
Скопировать код
const int buttonPins[4] = {2, 3, 4, 5};  // Пины для кнопок
const int speakerPin = 8;                // Пин динамика
const int sounds[4] = {200, 300, 500, 800};  // Частоты для звуков (бас, малый, хай-хэт, тарелка)

void setup() {
  for (int i = 0; i < 4; i++) {
    pinMode(buttonPins[i], INPUT_PULLUP);  // Настройка пинов кнопок с внутренними подтягивающими резисторами
  }
  pinMode(speakerPin, OUTPUT);
}

void loop() {
  for (int i = 0; i < 4; i++) {
    if (digitalRead(buttonPins[i]) == LOW) {  // Если кнопка нажата
      tone(speakerPin, sounds[i], 100);       // Воспроизведение соответствующего звука
      delay(100);                             // Задержка для предотвращения дребезга
    }
  }
  noTone(speakerPin);  // Остановка звука, если ни одна кнопка не нажата
}

3. MIDI-клавиатура на 12 клавиш

Схема подключения:

  • 12 кнопок подключаются к цифровым пинам 2-13
  • Каждая кнопка соединяется с GND через резистор 10кОм
  • MIDI выход: резистор 220 Ом от пина TX (1) к контакту 5 MIDI-разъема DIN-5
  • Контакт 2 MIDI-разъема на землю, контакты 1, 3, 4 не подключены

Код (требуется библиотека MIDI Library):

cpp
Скопировать код
#include <MIDI.h>

const int NUM_BUTTONS = 12;
const int BUTTON_PINS[NUM_BUTTONS] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13};
const int MIDI_NOTES[NUM_BUTTONS] = {60, 62, 64, 65, 67, 69, 71, 72, 74, 76, 77, 79}; // C4-G5 (одна октава)
boolean buttonState[NUM_BUTTONS] = {false};
boolean lastButtonState[NUM_BUTTONS] = {false};

MIDI_CREATE_DEFAULT_INSTANCE();

void setup() {
  MIDI.begin(MIDI_CHANNEL_OFF);  // Инициализация MIDI без прослушивания входящих сообщений
  Serial.begin(31250);           // MIDI использует скорость 31250 бод
  
  for (int i = 0; i < NUM_BUTTONS; i++) {
    pinMode(BUTTON_PINS[i], INPUT_PULLUP);  // Настройка пинов кнопок
  }
}

void loop() {
  for (int i = 0; i < NUM_BUTTONS; i++) {
    buttonState[i] = digitalRead(BUTTON_PINS[i]) == LOW;  // Чтение состояния кнопки (инвертировано из-за INPUT_PULLUP)
    
    if (buttonState[i] != lastButtonState[i]) {  // Если состояние изменилось
      if (buttonState[i]) {  // Если кнопка нажата
        MIDI.sendNoteOn(MIDI_NOTES[i], 127, 1);  // Отправка Note On на канал 1 с максимальной velocity
      } else {  // Если кнопка отпущена
        MIDI.sendNoteOff(MIDI_NOTES[i], 0, 1);   // Отправка Note Off
      }
      lastButtonState[i] = buttonState[i];  // Сохранение текущего состояния
      delay(1);  // Небольшая задержка для стабильности
    }
  }
}

4. Музыкальный светодиодный куб (3×3×3)

Схема подключения:

  • 27 светодиодов организованы в куб 3×3×3 с общими анодами для каждого уровня
  • Аноды уровней подключаются к пинам 2, 3, 4 через транзисторы BC337
  • Катоды колонн (9 колонн) подключаются к пинам 5-13 через резисторы 220 Ом
  • Пьезоизлучатель подключается между пином A0 и GND

Код (упрощенный вариант):

cpp
Скопировать код
const int levelPins[3] = {2, 3, 4};       // Пины для уровней куба
const int columnPins[9] = {5, 6, 7, 8, 9, 10, 11, 12, 13};  // Пины для колонн
const int speakerPin = A0;                // Пин пьезоизлучателя

// Ноты в формате частот
const int notes[] = {262, 294, 330, 349, 392, 440, 494, 523};

void setup() {
  for (int i = 0; i < 3; i++) {
    pinMode(levelPins[i], OUTPUT);
  }
  
  for (int i = 0; i < 9; i++) {
    pinMode(columnPins[i], OUTPUT);
  }
  
  pinMode(speakerPin, OUTPUT);
  
  // Выключаем все светодиоды
  for (int i = 0; i < 3; i++) {
    digitalWrite(levelPins[i], LOW);
  }
  
  for (int i = 0; i < 9; i++) {
    digitalWrite(columnPins[i], HIGH);  // HIGH для выключения (общий анод)
  }
}

void loop() {
  // Пример эффекта: волна с музыкой
  for (int level = 0; level < 3; level++) {
    // Включаем текущий уровень
    digitalWrite(levelPins[level], HIGH);
    
    // Воспроизводим ноту для текущего уровня
    tone(speakerPin, notes[level * 2], 150);
    
    // Зажигаем светодиоды на текущем уровне по спирали
    for (int col = 0; col < 9; col++) {
      digitalWrite(columnPins[col], LOW);  // Включаем светодиод (LOW для включения при общем аноде)
      delay(50);
      digitalWrite(columnPins[col], HIGH); // Выключаем светодиод
    }
    
    // Выключаем текущий уровень
    digitalWrite(levelPins[level], LOW);
  }
}

5. Gesture-Controlled DJ Controller

Схема подключения (для Arduino Nano 33 IoT с встроенным IMU):

  • Встроенный акселерометр/гироскоп LSM6DS3
  • 2 потенциометра подключены к аналоговым входам A0 и A1
  • 4 кнопки подключены к цифровым пинам 2, 3, 4, 5 (с резисторами 10кОм на землю)
  • RGB-светодиод: пины 6 (красный), 7 (зеленый), 8 (синий) через резисторы 220 Ом

Код (требуется библиотека Arduino_LSM6DS3 и MIDI):

cpp
Скопировать код
#include <Arduino_LSM6DS3.h>
#include <MIDI.h>

const int potPin1 = A0;           // Потенциометр 1
const int potPin2 = A1;           // Потенциометр 2
const int buttonPins[4] = {2, 3, 4, 5}; // Кнопки
const int ledPins[3] = {6, 7, 8}; // RGB LED

float accelerometerThreshold = 2.5;
int lastPot1Value = 0;
int lastPot2Value = 0;
bool buttonStates[4] = {false};
bool lastButtonStates[4] = {false};

MIDI_CREATE_DEFAULT_INSTANCE();

void setup() {
  // Инициализация MIDI
  MIDI.begin(MIDI_CHANNEL_OMNI);
  Serial.begin(115200);
  
  // Инициализация IMU
  if (!IMU.begin()) {
    while (1); // Зависаем, если IMU не инициализирован
  }
  
  // Настройка пинов
  for (int i = 0; i < 4; i++) {
    pinMode(buttonPins[i], INPUT_PULLUP);
  }
  
  for (int i = 0; i < 3; i++) {
    pinMode(ledPins[i], OUTPUT);
  }
}

void loop() {
  // Чтение акселерометра
  float x, y, z;
  if (IMU.accelerationAvailable()) {
    IMU.readAcceleration(x, y, z);
    
    // Отправка CC сообщений на основе наклона
    if (abs(x) > accelerometerThreshold) {
      int value = map(constrain(x, -accelerometerThreshold, accelerometerThreshold), 
                      -accelerometerThreshold, accelerometerThreshold, 0, 127);
      MIDI.sendControlChange(20, value, 1); // CC #20 для X-оси
      
      // Индикация на RGB LED
      analogWrite(ledPins[0], map(value, 0, 127, 0, 255));
    }
    
    if (abs(y) > accelerometerThreshold) {
      int value = map(constrain(y, -accelerometerThreshold, accelerometerThreshold), 
                      -accelerometerThreshold, accelerometerThreshold, 0, 127);
      MIDI.sendControlChange(21, value, 1); // CC #21 для Y-оси
      
      // Индикация на RGB LED
      analogWrite(ledPins[1], map(value, 0, 127, 0, 255));
    }
  }
  
  // Чтение потенциометров
  int pot1Value = map(analogRead(potPin1), 0, 1023, 0, 127);
  int pot2Value = map(analogRead(potPin2), 0, 1023, 0, 127);
  
  // Отправка только при изменении (предотвращение флуда MIDI)
  if (abs(pot1Value – lastPot1Value) > 2) {
    MIDI.sendControlChange(22, pot1Value, 1); // CC #22 для потенциометра 1
    lastPot1Value = pot1Value;
    
    // Индикация на RGB LED
    analogWrite(ledPins[2], map(pot1Value, 0, 127, 0, 255));
  }
  
  if (abs(pot2Value – lastPot2Value) > 2) {
    MIDI.sendControlChange(23, pot2Value, 1); // CC #23 для потенциометра 2
    lastPot2Value = pot2Value;
  }
  
  // Чтение кнопок для триггеров
  for (int i = 0; i < 4; i++) {
    buttonStates[i] = digitalRead(buttonPins[i]) == LOW;
    
    if (buttonStates[i] != lastButtonStates[i]) {
      if (buttonStates[i]) {
        MIDI.sendNoteOn(36 + i, 127, 1); // Ноты 36-39 для кнопок
      } else {
        MIDI.sendNoteOff(36 + i, 0, 1);
      }
      lastButtonStates[i] = buttonStates[i];
    }
  }
  
  delay(10); // Небольшая задержка для стабильности
}

Советы по модификации и улучшению устройств

После успешной сборки базовой версии любого из описанных проектов наступает самая увлекательная часть — модификация и улучшение! Вот ряд универсальных советов, которые помогут превратить базовые музыкальные устройства в по-настоящему уникальные инструменты. 🛠️

Улучшение звука

  • Замените пьезоизлучатель на качественный динамик — Используйте динамик 8 Ом с усилителем вроде LM386 или PAM8403 для значительно более чистого и громкого звучания.
  • Добавьте фильтры — Простой RC-фильтр (резистор + конденсатор) может сгладить резкие переходы PWM-сигнала, улучшив тембр.
  • Используйте специализированные аудио-чипы — Модули вроде VS1053 или WTV020SD позволяют воспроизводить качественные сэмплы и даже MP3-файлы.
  • Многоголосие — Для реализации полифонии используйте библиотеку Mozzi вместо встроенной tone(), она позволяет воспроизводить несколько звуков одновременно.

Расширение функционала

  • Добавьте память настроек — Используйте EEPROM для сохранения настроек и пресетов, чтобы они сохранялись при выключении питания.
  • Интегрируйте экран — OLED-дисплей I2C (128×64) позволит отображать настройки, визуализации и меню управления.
  • Реализуйте беспроводное управление — Модули Bluetooth HC-05/HC-06 или ESP8266/ESP32 для Wi-Fi позволят управлять устройством с телефона или планшета.
  • Добавьте секвенсор — Запрограммируйте возможность записи и воспроизведения последовательностей нот или звуков.

Повышение удобства использования

  • Создайте корпус — Разработайте и напечатайте на 3D-принтере (или вырежьте из акрила) корпус для вашего устройства.
  • Используйте качественные компоненты управления — Замените базовые кнопки и потенциометры на профессиональные с долгим сроком службы.
  • Добавьте индикацию — Светодиоды разных цветов для отображения состояния или RGB-ленты для визуальных эффектов.
  • Интегрируйте автономное питание — Литий-полимерные аккумуляторы с контроллером зарядки TP4056 обеспечат мобильность.

Продвинутые технические улучшения

  • Оптимизируйте код — Используйте прямой доступ к портам и регистрам вместо digitalWrite() для критичных по времени операций.
  • Добавьте более сложные эффекты — Реверберация, эхо, хорус можно реализовать программно или с помощью внешних модулей эффектов.
  • Используйте интерруптные таймеры — Для точного тайминга музыкальных событий задействуйте аппаратные таймеры Arduino.
  • Создайте многослойную PCB — Для финальной версии разработайте печатную плату вместо макетной, это повысит надежность и уменьшит размеры.

Идеи для уникальных модификаций каждого проекта

  • Терменвокс — Добавьте второй сенсор для управления громкостью, различные фильтры для изменения тембра, возможность сохранения и воспроизведения записанных фраз.
  • Ритм-машина — Интегрируйте SD-карту для хранения сэмплов, добавьте функции квантизации и свинга, разработайте пошаговый программатор ритмов.
  • MIDI-клавиатура — Добавьте колесо модуляции и питч-бенд, встройте арпеджиратор, создайте функцию разделения клавиатуры на зоны с разными звуками.
  • LED-куб — Запрограммируйте разные визуальные паттерны для разных музыкальных жанров, добавьте микрофон для реакции на внешнюю музыку.
  • DJ-контроллер — Интегрируйте функцию лупера, добавьте семплер для запуска заранее подготовленных фрагментов, создайте автоматический битмэтчинг.

Музыкальные проекты на Arduino — это идеальный баланс творчества и технологий. Начав с простого терменвокса, вы можете пройти путь до создания полноценной музыкальной рабочей станции или уникального инструмента, не имеющего аналогов в мире. Главное преимущество DIY-подхода — возможность реализовать именно те функции, которые нужны лично вам, и получить устройство, полностью соответствующее вашему творческому видению. Экспериментируйте, модифицируйте и не бойтесь ошибок — каждая неудача приближает вас к созданию действительно инновационного музыкального инструмента! 🎹⚡

Читайте также

Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей
Какую функцию использует Arduino для генерации звуковых частот?
1 / 5

Загрузка...