Устройство вокальных звуковых эффектов на arduino

Ардуино: динамик

На самых первых уроках мы познакомились со светодиодами, которые часто используются в электронике как индикаторы состояния.

Самым простым примером может служить индикатор питания, с помощью которого прибор сообщает пользователю, что он включен. Очень часто вместе со световой индикацией, в устройствах применяется звуковая индикация.

Во многих электронных приборах есть источник звука, который как и световой индикатор помогает пользователю в работе.

Обычно в электронике используются два типа источников звука:

  • громкоговоритель (динамик);
  • звукоизлучатель (зуммер).

В этом уроке мы поговорим о динамике. Разберем подробно его устройство и попробуем проиграть мелодию на Ардуино!

1. Громкоговоритель, он же динамик

Все громкоговорители можно разделить на два подтипа: электродинамический и пьезоэлектрический. Именно от названия первого подтипа пошло хорошо известное нам название динамик.

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

Кроме магнита в динамике еще есть небольшая электромагнитная (или звуковая) катушка, намотанная тонким лакированным проводом. Катушка приклеена к гофрированному подвесу и к диффузору. Все эти части изображены на схеме разреза динамика.

Человеку, знакомому со школьным курсом физики не составит труда догадаться как работает это устройство. Мы знаем, что если подать на звуковую катушку напряжение, то в её витках возникнет электрический ток (ну это уж совсем очевидно). Согласно закону Ампера, на проводник с током, находящийся в магнитном поле будет действовать сила Ампера.

Направление этой силы можно легко вычислить с помощью правила левой руки: если вектор манитного поля направлен в ладонь, а пальцы направлены по току (вдоль витков провода), то большой палец будет указывать направление силы. Именно сила Ампера то притягивает катушку к основанию якоря, то отталкивает от него, в зависимости от направления электрического тока.

То есть подавая на катушку переменный ток, мы заставим её колебаться. Звуковая катушка прочно соединена с диффузором, так что он тоже начнет колебаться. Движение же большого диффузора приведёт к колебанию большой массы воздуха, что мы и называем звуковой волной!

2. Генератор звука на транзисторах

Современные динамики могут иметь очень маленький размер. В нашем уроке мы будем использовать миниатюрный динамик, который мы даже разобрали для наглядности.

В отличие от своих старших собратьев, он имеет немного иную конструкцию. В этом динамике катушка прочно закреплена на основании, а колеблется вместо неё тонкая металлическая мембрана. По кругу же как и прежде размещается постоянный магнит.

Сделаем простейший генератор звука на двух транзисторах. Схема генератора представляет собой так называемый несимметричный мультивибратор, который при подаче питания будет формировать периодический импульсный сигнал.

Принципиальная схема генератора звука на транзисторах

В схеме есть:

  • NPN транзистор 2n2222;
  • PNP транзистор 2n2907;
  • резистор с номиналом от 10 до 100 К;
  • конденсатор 100 нФ.

Внешний вид макета

Собираем сначала схему и в самом конце подключаем к ней батарейку.

В текущем варианте динамик будет издавать пронзительный писк на высокой частоте. Изменить частоту звука можно с помощью конденсатора C1. Если параллельно с C1 подключить еще один или два точно таких же конденсаторов на 100 нФ, частота звука станет ниже.

3. Подключение динамика к Ардуино

Теперь мы знаем как заставить динамик издавать один тон без использования микроконтроллера. Но такой простой генератор может понадобиться разве что сигнального гудка на автомобиле. Нам же больше интересно проигрывать мелодии, речь и разные звуковые сэмплы, с помощью которых робот может общаться с человеком. В этом нам поможет Ардуино.

Подключим динамик к Ардуино по следующей схеме.

Принципиальная схема подключения динамика к Ардуино

Внешний вид макета

4. Программа электронного метронома

Метроном — это устройство, которое задает ритм для музыканта. То есть нам потребуется издавать краткий звук с заданным периодом, скажем в 1 секунду.

Для генерации звука заданной частоты воспользуемся функцией tone, которая имеет следующий формат:

tone( контакт, частота [, длительность] );

  • здесь контакт — номер вывода Ардуино к которому подключён динамик;
  • частота — частота генерируемого звука в герцах;
  • длительность — длительность звука в миллисекундах (параметр необязательный).

Как только мы вызовем функцию tone, Ардуино начнет генерировать импульсный сигнал и будет делать это, пока мы принудительно не выключим генерацию с помощью другой функции — noTone:

noTone( контакт );

Аргумент контакт — это номер вывода Ардуино к которому подключён динамик.

Примечание. Важно учитывать, что Ардуино может одновременно генерировать только один тон на одном контакте. Если вызовем функцию tone для одного контакта, и пока идет генерация попытаемся вызвать tone для другого контакта, то последний вызов будет попросту проигнорирован.

Программа метронома идентична программе для мигания светодиодом, за исключением того, что мы вместо функции digitalWrite применяем tone и noTone.

const byte dynPin = 2; void setup() { pinMode( dynPin, OUTPUT ); // настраиваем контакт №2 на выход } void loop() { tone( dynPin, 100 ); // генерируем звук с частотой 100 Гц delay( 100 ); // пауза 500 миллисекунд noTone( dynPin ); // выключаем звук delay( 900 ); // снова пауза 500 мс }

Загружаем программу на Ардуино и внимаем ритмичному звуку метронома. Следующий пример по-сложнее — будем играть мелодию!

5. Играем ноты на Ардуино

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

const int dynPin = 2; int numTones = 10; // Ноты C,C#,D,D#,E,F,F#,G,G#,A int tones[10] = {261, 277, 294, 311, 330, 349, 370, 392, 415, 440}; void setup(){ pinMode( dynPin, OUTPUT ); } void loop(){ for( int i = 0; i < numTones; i++ ){ tone( dynPin, tones[i] ); delay( 500 ); } noTone( dynPin ); }

Для удобства хранения последовательности нот мы использовали массив tones. В следующем примере мы будем проигрывать десятки нот, и без массива наша программа стала бы через чур громоздкой и непонятной.

6. Мелодия из Звёздных войн на Ардуино

Наконец, попробуем воспроизвести полноценную мелодию из известной всем космической саги.

const byte dynPin = 2; const byte COUNT_NOTES = 39; // частоты нот int tones[COUNT_NOTES] = { 392, 392, 392, 311, 466, 392, 311, 466, 392, 587, 587, 587, 622, 466, 369, 311, 466, 392, 784, 392, 392, 784, 739, 698, 659, 622, 659, 415, 554, 523, 493, 466, 440, 466, 311, 369, 311, 466, 392 }; // длительности нот int durations[COUNT_NOTES] = { 350, 350, 350, 250, 100, 350, 250, 100, 700, 350, 350, 350, 250, 100, 350, 250, 100, 700, 350, 250, 100, 350, 250, 100, 100, 100, 450, 150, 350, 250, 100, 100, 100, 450, 150, 350, 250, 100, 750 }; void setup() { pinMode( dynPin, OUTPUT ); // Настраиваем контакт на выход } void loop() { for (int i = 0; i

Источник: http://robotclass.ru/tutorials/arduino-speaker/

Arduino Vocal Effects Box

This Arduino-powered vocal effects box pitch shifts and distorts incoming audio signals to produce a wide variety of vocal effects. This project is my first experiment with real-time digital signal processing using Arduino.

It samples an incoming microphone signal at a rate of about 40kHz, manipulates the audio digitally, and then outputs 8 bit audio at 40kHz. To minimize the amount of computation required by the Arduino, I used a technique called granular synthesis to manipulate the incoming audio signal.

Essentially, as audio comes into the Arduino it gets cut up and stored as small (millisecond or microsecond sized) samples called “grains.

” These grains are then individually manipulated and played back; they may be lengthened or shortened, stretched or compressed, played back in reverse, copied several times, or mixed with other grains. You can hear a (somewhat creepy) audio sample from the effects box below:

Granular synthesis creates a unique type of distortion caused by discontinuities between individual grains in the outgoing signal.

Sometimes this distortion creates an effect I can only describe as a “ripping” sound, other times it introduces new frequencies into the audio that were not present before.

Here is an example by Aphex Twin, the granular synthesis is especially prominent in the bridge at around 3min in. Another example of granular synthesis, this time applied to vocals for pitch shifting and textural effects, is from Paul Lansky.

My favorite thing to do with this effects box is to use subtle pitch shifting to achieve an androgynous vocal sound, I got the idea for the project after listening to copious amounts of Fever Ray this past winter, you can hear how she pitch shifts her voice to sound somewhat masculine at times.

PARTS LIST

(1x) Arduino Uno REV 3 Radioshack 276-128
(7x) 10K Ohm 1/4-Watt Carbon Film Resistor (2 packages) Radioshack #271-1335 (9x) 20K Ohm 1/4-Watt Carbon Film Resistor (2 packages)

(1x) 1K Ohm 1/4-Watt Carbon Film Resistor Radioshack 271-1321

(1x) 50K-Ohm Linear-Taper Potentiometer Radioshack #271-1716
(1x) 10KOhm Audio Control Potentiometer with SPST Switch Radioshack #271-215 (this will be used to control volume and turn the device on/off)
(5x) 0.25″ Knurled Knob Radioshack 274-424
(2x) 9V Alkaline Battery Radioshack #23-866
(2x) Heavy-Duty 9V Snap Connectors Radioshack #270-324
(1x) PC Board with Copper Radioshack #276-147
(1x) SPST PC-Mountable Submini Toggle Switch Radioshack #275-645
(2x) Male Header Pins Jameco 103393
(3x) 8 pin socket Radioshack 276-1995
(1x) TL082 Wide Dual JFET Input Op Amp Radioshack 276-1715
(3x) 100K Ohm 1/4-Watt Carbon Film Resistor (1 package) Radioshack 271-1347 (1x) 10uF electrolytic capacitor (1x) 47nF capacitor

(3x) 0.1uf capacitor Radioshack 55047557

(2x) 1M-Ohm Linear Taper Potentiometer Radioshack 271-211 (1x) 1MOhm logarithmic potentiometer (1x) 2kOhm 1/4-Watt Carbon Film Resistor

(1x) male header pins Jameco 103393

(1x) 10K-Ohm Linear-Taper Potentiometer Radioshack 271-1715
(1x) DPDT Flatted Metal Lever Toggle Switch Radioshack 275-636
(2x) 1/4″ stereo jack Radioshack 274-141 or Radioshack 274-312
(2x) 5mm High-Brightness White LED (1 package) Radioshack 276-017
(2x) 100 ohm 1/4W 5% Carbon Film Resistor Radioshack 271-1311
(2x) TS922IN Dual Op Amp Digikey 497-3049-5-ND (one TS924 would also work, but they are not available on digikey at the moment)

Additional Materials:
22 Gauge Wire Radioshack #278-1224
Solder Radioshack #64-013 sand paper plywood wood glue hot glue

screws

Download Arduino IDE

Источник: https://www.instructables.com/id/Arduino-Vocal-Effects-Box/

Музыкальная шкатулка на Arduino

Наш следующий проект на контроллере Arduino – музыкальная шкатулка. Программный скетч для Ардуино прилагается, так что вы легко сможете добавить свои мелодии, даже не имея больших познаний в программировании Ардуино.

Принцип работы устройства очень прост – при открытии шкатулка будет играть приятную мелодию, при закрытии шкатулки воспроизведение мелодии прекращается.

Для данного проект потребуется сама плата Arduino и минимум деталей: динамик, потенциометр (переменный резистор), сопротивление на 10кОм, батарейки АА, кнопка и транзистор КТ503А или любой другой маломощный n-p-n транзистор, например КТ315.

Звук – колебательное движение частиц упругой среды, распространяющееся в виде волн в газообразной, жидкой или твёрдой средах. Если сказать просто – это колебания волн. В динамике колеблется мембрана. В зависимости от частоты колебания мы слышим звук разной тональности. От глубины хода мембраны зависит громкость.

Управляют мембраной за счёт подаваемого напряжения. В платах Arduino для вывода звука на динамик используются цифровые или аналоговые выходы. Для воспроизведения мелодии необходимо подавать последовательно звуки определенной частоты и длительности.

Для генерации звуков определенной частоты и длительности  в Arduino используется функция tone():

tone(pin,frequency,duration);

Функция tone() генерирует на выводе pin прямоугольный сигнал  частоты frequency с коэффициентом заполнения 50%. Третий (необязательный) параметр функции duration позволяет задавать длительность сигнала.

Если длительность сигнала не указана, звук будет генерироваться до вызова функция noTone().
Обычно в примерах по генерации звуков на Arduino для воспроизведения звука используется пьезоэлектрический излучатель, но к сожалению громкость звука при этом недостаточна.

Поэтому Мы для воспроизведения звука мы будем использовать маленький динамик.

В качестве контроллера Arduino я использовал Arduino Pro Mini, которая отличается малым размером и очень удобна при использовании на плате. Можно использовать любую плату Ардуино, например, подойдет наиболее популярная Arduino Uno. Соберем схему, показанную на рисунке 1 (схема соединений на рисунке 2).

Рис. 1. Принципиальная схема музыкальной шкатулкиРис. 2. Схема подключения компонентов к Arduino

Для написания скетча нам понадобятся значения частот для нот 1 и 2 октавы и обозначения для каждой ноты (см. таблицу 1).

Таблица 1. Таблица нот

Теперь подберем мелодию, которую будет воспроизводить музыкальная шкатулка. Желательно найти мелодию, записанную на нотном стане. Я выбрал простую мелодию – “В траве сидел кузнечик” (ноты на рисунке 3).

Рисунок 3. Мелодия “В траве сидел кузнечик” на нотном стане.

Теперь приступим к написанию скетча. Потенциометр в схеме (рисунок 1) присутствует для подбора нужного темпа мелодии.

Темп может принимать значения от MIN_TEMPO до MAX_TEMPO. Для вычисления подобранного темпа используем функцию map(), которая преобразует значение на аналоговом входе A0 в значение подобранного темпа.

tempo=map(analogRead(PIN_POT),0,1024,MIN_TEMPO,MAX_TEMPO);

Занесем в массив melody[] последовательность воспроизводимых нот, список длительностей нот занесем в массив duration[], при этом длительность целой ноты равна 32, половинной 16, и т.д. до 1/32 – длительность1. Данные с обозначением нот занесем в массив notes[], а данные с частотами для соответствующих нот занесем в массив frequency[]. Паузу обозначим символом '*'.

// МЕЛОДИЯ – массив нот и массив длительностей
char melody[]={'A', 'E','A','E','A', 'U','G','G','G',
                    'E','U','E','G', 'A','A','A','A',
                    'E','A','E','A', 'U','G','G','G',
                    'E','U','E','G', 'A','A',                     'H','H','H','H','H', 'c','c','c','c','c',
                    'c','H','A','U', 'A','A','A','A',
                    'H','H','H','H','H', 'c','c','c','c','c',
                    'c','H','A','U', 'A', '*'
};
int bb[]={4, 4,4,4,4, 4,4,4,4,
        4,4,4,4, 4,4,4,4,
        4,4,4,4, 4,4,4,4,
        4,4,4,4, 8,8,         4,2,2,4,4, 4,2,2,4,4,
        4,4,4,4, 4,4,4,4,
        4,2,2,4,4, 4,2,2,4,4,
        4,4,4,4, 4,64
};
// массив для наименований нот в пределах двух октав
char names[]={'c','r','d','s','e','f','t','g','u','a','b',
'h','C','R','D','S','E','F','T','G','U','A','B', 'H','F'};
// массив частот нот
int tones[]={261,277,293,311,329,349,370,392,415,440,466,
494, 523,554,587,622,659,698,740,784,830,880,932,988};

В цикле loop() мы проверяем отжатие кнопки (открытие шкатулки). По отжатию кнопки начинается проигрывание мелодии понотно, вызывая процедуру playNote(), в которую передает обозначение текущей ноты и продолжительность.

Процедура playNote() находит по обозначению ноты значение соответствующей частоты и вызывает для проигрывания ноты функцию tone(). Продолжительность звучания ноты – это базовая нотная длительность (32 – для целой, 16 – для полуноты, 8 – для четвертной и т.д.) умноженная на значение темпа произведения – temp.

Значение temp устанавливается по значению потенциометра, и подбирается при отладке, в работе не меняется. Для лучшего звучания музыкального отрезка после воспроизведения каждой ноты делаем небольшую паузу delay(beats*tempo+tempo). По нажатии кнопки при воспроизведении мелодии, воспроизведение прекращается.

При нажатии клавиш обязательно использовать процедуру проверки на дребезг debounce(boolean last).

Запустим Arduino IDE. Создадим новый скетч и внесем в него содержимое листинга 1.

// МЕЛОДИЯ – массив нот и массив длительностей
char melody[]={'A', 'E','A','E','A', 'U','G','G','G',
                    'E','U','E','G', 'A','A','A','A',
                    'E','A','E','A', 'U','G','G','G',
                    'E','U','E','G', 'A','A',                     'H','H','H','H','H', 'c','c','c','c','c',
                    'c','H','A','U', 'A','A','A','A',
                    'H','H','H','H','H', 'c','c','c','c','c',
                    'c','H','A','U', 'A', '*'
};
int bb[]={4, 4,4,4,4, 4,4,4,4,
        4,4,4,4, 4,4,4,4,
        4,4,4,4, 4,4,4,4,
        4,4,4,4, 8,8,         4,2,2,4,4, 4,2,2,4,4,
        4,4,4,4, 4,4,4,4,
        4,2,2,4,4, 4,2,2,4,4,
        4,4,4,4, 4,64
};
// подключить динамик к pin 8
#define PIN_SPEAKER 8
// переменные – темп воспроизведения, ноты, длительности
int tempo,notes,beats;
#define MIN_TEMPO 20
#define MAX_TEMPO 100
// пин подключения потенциометра
#define PIN_POT A0
// пин подключения кнопки
// при отжатии – включить проигрывание мелодии
// при нажатии прекратить
// пин подключения потенциометра
#define PIN_BUTTON 5
// Переменная для сохранения текущего состояния кнопки
int tekButton = LOW;
// Переменная для сохранения предыдущего состояния
int prevButton = LOW; // Переменная для сохранения количества проигрываний
int countPlay = 0; void setup()  {
   // Сконфигурировать контакт динамика как выход
   pinMode(PIN_SPEAKER, OUTPUT);
   // Сконфигурировать контакт кнопки как вход
   pinMode (PIN_BUTTON, INPUT);
}
   
void loop()  {
   tekButton = debounce(prevButton);
   if (prevButton == HIGH && tekButton == LOW) // если отжатие…
      {
      // получить темп воспроизведения
      tempo=map(analogRead(PIN_POT),0,1024,MIN_TEMPO,MAX_TEMPO);
      for(int i=0;i

Источник: http://radioded.ru/proekty-na-arduino/muzykalnaya-shkatulka-na-arduino

Оптический выключатель со звуковым эффектом на Arduino

Добрый день! В этом посте я хочу поделится с хабр сообществом о принципе работы сделанного мной бесконтактного выключателя. Выключатель планируется использовать в системе умный дом.

Основой выключателя является недавно купленный мной улучшенный клон контроллера Arduino, продающегося под названием Carduino Nano V.7

Работает выключатель так: Arduino с выхода D5 постоянно выдает ШИМ сигнал с частотой 976Гц и со скважностью 50%. К выходу D5 через токограничивающий резистор подключен светодиод, излучающий световой сигнал в инфракрасном диапазоне. Фототранзистор подключенный к входу Arduino D2 детектирует отраженный от руки ИК сигнал. Arduino получает ИК сигнал, проверяет его на достоверность и если сигнал из 20 идущих подряд импульсов соответствует частоте 976Гц, то тогда контроллер включает синий светодиод (L) на выходе D13 Arduino и начинает воспроизводить звуковой эффект через выход SPK контроллера. Все тоже самое происходит и при выключении светодиода (L).

Воспроизведение :

При воспроизведении звуковых эффектов используется звуковой фаил формата WAV без сжатия, с частотой 16000Гц и глубиной 8бит. Для улучшения качества воспроизведения звука, используется линейная интерполяция.

Для этого, выборка семплов происходит на частоте 96000Гц и между оригинальными семплами вставляются 4 промежуточных семпла рассчитанных методом линейной интерполяции.

Таким образом снижается шум квантования, улучшеатся качество и для воспроизведения звуков не потребуются дополнительные фильтры.

Схема простая для ее сборки я использовал

1-Carduino Nano V.7 2-IR светодиод из старого пульта ДУ от телевизора, светодиод нужно запаять в термоусадку, во избежании бокового излучения 3-Фототранзистор LTR-3208E 4-Динамическая головка из детской игрушки 5-Резисторы 10к и 68омКак работает схема собранная мной на макетной плате, можно посмотреть на видео.

Код для Arduino Nano:

#include #include
#include
#include “fife.h”
#include “hi.h” ////////переменные проигрывателя////////////////////////////////////
#define speakerPin 11
volatile uint16_t sample=0;
volatile uint8_t lastSample, FirstSample;
volatile byte new_data,future_data,old_data;
volatile byte stat=0;
unsigned char *wave;
unsigned int length;
////////переменные выключателя////////////////////////////////////
uint8_t state = 0;
volatile uint16_t timerCount, lengthImpuls;
volatile uint16_t Counter=0;
////////////начальная предустановка///////////////////////////////
void setup() { pinMode(speakerPin, OUTPUT); //выход на динамик digitalWrite(speakerPin, LOW); //что бы не спалить динамик pinMode(2, INPUT); // Вход, к фототранзистору // digitalWrite(2, HIGH); //Подключить подтягивающий резистор pinMode(13, OUTPUT); //Лампочка pinMode(5, OUTPUT); //выход ШИМ на ИК светодиод TCCR0B = TCCR0B & 0b11111000 | 3; //частота ШИМ 976Гц analogWrite(5,128 ); //запустить ШИМ attachInterrupt(0, Ir_sens, RISING); //внешнее прерывание по фронту Timer1.initialize(10); //инициализация таймера Timer1.attachInterrupt(callback); //прерывание таймера
} ////////////обработка прерывания по таймеру///////////////////////////////
void callback() { timerCount++; }
////////////обработчик внешнего прерывания///////////////////////////////
void Ir_sens()
{ lengthImpuls = timerCount;
timerCount=0;
Counter++; }
///////////////////////Обработчик прерывания по совпадению с OCR2///////////////////
ISR(TIMER2_COMPA_vect) { switch (stat) { case 0:{ old_data = pgm_read_byte(&wave[sample]); OCR2A = old_data; stat=1; ++sample; if (sample == length) stat=4; future_data = pgm_read_byte(&wave[sample]); new_data = (old_data+future_data)/2; } break; case 1: {OCR2A=(old_data+new_data)/2; stat=2; } break; case 2: {OCR2A = new_data; stat=3; } break; case 3: {OCR2A=(new_data+future_data)/2; stat=0; } break; case 4: if(lastSample==0) stat=5; else {–lastSample; OCR2A=lastSample;} break; case 5: stopPlayback(); break; } }
////////////главный цикл программы///////////////////////////////
void loop() { if(lengthImpuls>105 || lengthImpuls99 && lengthImpuls20) { state=~state; digitalWrite(13, state); if(state>0) play_wave((unsigned char *)hi, hi_length); if(state==0) play_wave((unsigned char *)fife, fife_length); _delay_ms(200); while(Counter>10) { if(lengthImpuls>105 || lengthImpuls

Источник: https://habr.com/post/144180/

Octosynth — музыкальный инструмент на базе Arduino своими руками

Перевёл alexlevchenko для mozgochiny.ru

Что же такое Octosynth спросите вы? Оctosynth полифонический синтезатор, что может воспроизводить 8 длительных модулированных импульсов звука, что формируют вместе музыкальный ряд. В английской терминологии – это 8 клавишный электронный орган, что может играть больше, чем один звук за раз, но только в одном ряду/тональности.

Как вы уже догадались из названия, поделка будет работать на базе Arduino.

Шаг 1:

Нам понадобится:

  • Arduino Uno;
  • 12 штекеров (2 штекера в одной гребенке и 6 штекеров в другой. Также 4 в третей (по желанию));
  • 8 длинных проводков (под длинными, не имею ввиду 3 метровые, я говорю о 20-30 см проводах, которые отлично подойдут);
  • Медная лента;
  • Основа (использовал пенопласт). Длина зависит от ширины клавиш;
  • Гнездо для подключения;
  • Батарея;
  • Динамик.

Шаг 2: Прошивка

Загрузим код в Arduino.

Шаг 3: Изготовление

  • Определитесь с длинной основания. Убедитесь в том, что оставили достаточно места для размещения медных пластин на основе.
  • Медные пластины должны быть на миллиметр больше заложенных размеров.
  • Поделим ленту на 8 частей.
  • Припаяем по одному проводу к каждому куску ленты.
  • Припаяем штекеры через провода к лентам. 6 лент к 6 штекера (для 6 аналоговых входов) и затем пару двойных для двух других входов (цифровые входы 6 и 7).
  • Порядок иметь значение. Первый будет (аналоговый 0) идти к крайнему левому краю пенопласта. Аналоговый 5 будет идти к входу 6, так как это «la» в музыкальном ряду.
  • Цифровой вход 6 это «ti», а вход 7 — это высокое «do».

Шаг 4: Монтаж проводки

Подключим провода к Arduino. Присоединим динамик к цифровому выходу 11. Возможно, придётся использовать монтажную колодку.

Шаг 5:

Можете подключить питание к Аrduino. Динамик должен заиграть приветствие.

Дело в том, что пока играет приветствие, система калибрует сама себя. Если же вы прикоснётесь к любой пластине, то в дальнейшем система будет думать, что это пластина = 0. Отсчитайте до 10 прежде, чем играть.

Это полифония, поэтому поделка может играть больше, чем одну ноту за раз. Надеюсь, вам понравится.

(A-z Source)

Рубрика: Электронные самоделки

Источник: http://mozgochiny.ru/electronics-2/octosynth-muzyikalnyiy-instrument-na-baze-arduino-svoimi-rukami/

Как подключить датчик звука (микрофон) к Arduino

Подключим модуль с звуковым датчиком (микрофоном CMA-4544PF-W) к Arduino.

  • Arduino;
  • модуль с электретным капсюльным микрофоном CMA-4544PF-W;
  • 3 светодиода (зелёный, жёлтый и красный);
  • 3 резистора по 220 Ом;
  • соединительные провода.

Электретный микрофон CMA-4544PF-W, который является основой модуля, реагирует на звуковые волны с частотами от 20 Гц до 20 кГц. Микрофон является всенаправленным, т.е.

чувствителен к звуку, приходящему со всех направлений, с чувствительностью -44 дБ.

Более подробно об устройстве и принципе действия электретных микрофонов можно почитать в статье «Устройство и принцип работы электретных микрофонов».

Электретный капсюльный микрофон CMA-4544PF-W

2Схема подключения микрофона к Arduino

Модуль содержит в себе электретный микрофон, которому необходимо питание от 3 до 10 вольт. Полярность при подключении важна. Подключим модуль по простой схеме:

  • вывод “V” модуля – к питанию +5 вольт,
  • вывод “G” – к GND,
  • вывод “S” – к аналоговому порту “A0” Arduino.

Схема подключения электретного микрофона к Arduino

3Скетч для считывания показаний электретного микрофона

Напишем программу для Arduino, которая будет считывать показания с микрофона и выводить их в последовательный порт в милливольтах.

const int micPin = A0; // задаём пин, куда подключён микрофон void setup() { Serial.begin(9600); // инициализация послед. порта } void loop() { int mv = analogRead(micPin) * 5.0 / 1024.0 * 1000.0; // значения в милливольтах Serial.println(mv); // выводим в порт }

Для чего может понадобиться подключать микрофон к Arduino? Например, для измерения уровня шума; для управления роботом: поехать по хлопку или остановиться.

Некоторые даже умудряются «обучить» Arduino определять разные звуки и таким образом создают более интеллектуальное управление: робот будет понимать команды «Стоп» и «Иди» (как, например, в статье «Распознавание голоса с помощью Arduino»).

4«Эквалайзер»на Arduino

Давайте соберём своеобразный простейший эквалайзер по приложенной схеме.

Схема «эквалайзера» на Arduino, датчике звука и светодиодах

5Скетч «эквалайзера»

Немного модифицируем скетч. Добавим светодиоды и пороги их срабатывания.

const int micPin = A0; const int gPin = 12; const int yPin = 11; const int rPin = 10; void setup() { Serial.begin(9600); pinMode(gPin, OUTPUT); pinMode(yPin, OUTPUT); pinMode(rPin, OUTPUT); } void loop() { int mv = analogRead(micPin) * 5.0 / 1024.0 * 1000.0; // значения в милливольтах Serial.println(mv); // выводим в порт /* Пороги срабатывания светодиодов настраиваются вами экспериментальным методом: */ if (mv < 2100) { // порог срабатывания зелёного светодиода, мВ digitalWrite(gPin, HIGH); digitalWrite(yPin, LOW); digitalWrite(rPin, LOW); } else if (mv < 2125) { // порог срабатывания жёлтого светодиода, мВ digitalWrite(gPin, HIGH); digitalWrite(yPin, HIGH); digitalWrite(rPin, LOW); } else if (mv < 2150) { // порог срабатывания красного светодиода, мВ digitalWrite(gPin, HIGH); digitalWrite(yPin, HIGH); digitalWrite(rPin, HIGH); } }

Эквалайзер готов! Попробуйте поговорить в микрофон, и увидите, как загораются светодиоды, когда вы меняете громкость речи.

Полезный совет

Значения порогов, после которых загораются соответствующие светодиоды, зависят от чувствительности микрофона. На некоторых модулях чувствительность задаётся подстроечным резистором, на моём модуле его нет. Пороги получились 2100, 2125 и 2150 мВ. Вам для своего микрофона придётся определить их самим.

Источник: https://soltau.ru/index.php/arduino/item/377-kak-podklyuchit-datchik-z

Операции аналогового ввода—вывода, работа со звуком. Знакомство с Arduino. (часть 3)

Р/л технология

Главная  Радиолюбителю  Р/л технология

Хотя цифровые операции ввода-вывода позволяют решать широкий круг задач, однако наличие в микроконтроллере платы Arduino встроенного аналого-цифрового преобразователя (АЦП) и возможность вывода аналоговых сигналов с помощью широтно-импульсной модуляции (ШИМ) обеспечивают работу с аналоговыми датчиками и всевозможными исполнительными устройствами, воздействующими на объект пропорционально управляющему сигналу.

Строго говоря, в режиме вывода все линии портов Arduino могут передавать только дискретные сигналы, имеющие лишь два состояния. Но микроконтроллер способен изменять эти состояния очень быстро, генерируя прямоугольные импульсы.

Если подать эти импульсы на какое-либо устройство, обладающее инерционными свойствами, то оно станет вести себя так, будто подаваемое на него напряжение постоянное, равное среднему значению импульсного, и меняется плавно, а не скачками между высоким и низким логическими уровнями.

В режиме ШИМ порт формирует импульсный сигнал постоянной частоты и переменной скважности (это отношение периода следования импульсов к их длительности).

Часто вместо скважности оперируют обратной ей величиной – коэффициентом заполнения, который можно изменять от 0 (нет импульсов) до 100% (импульсы следуют, слившись, без пауз).

Следовательно, хотя в каждый отдельный момент выходное напряжение соответствует высокому или низкому логическому уровню, его среднее значение пропорционально коэффициенту заполнения. Если к этому выходу подключить обычный мультиметр, он покажет это значение (конечно, если частотаимпульсов достаточно высока).

В Arduino UNO в режиме ШИМ могут работать выходы D3, D5, D6, D9, D10 и D11. Обычно на плате они помечены знаками “~” или аббревиатурами “PWM”. Следует заметить, что у плат Arduino других модификаций число таких выходов может быть больше или меньше.

В простейшем случае ШИМ можно применить для управления яркостью свечения светодиода. Этот прибор практически безынерционен, но человеческое зрение обладает достаточной инерционностью, чтобы последовательность быстрых вспышек светодиода воспринималась как непрерывное свечение с зависящей от коэффициента заполнения яркостью.

Дискретные выходы, способные формировать ШИМ, настроены на использование этого режима по умолчанию, поэтому вызывать функцию pinMode() для их работы в таком режиме не нужно.

Для установки коэффициента заполнения ШИМ-сигнала имеется стандартная функция analogWrite(N, M), где N – номер вывода, M – число, пропорциональное требуемому коэффициенту заполнения.

Оно должно лежать в интервале от 0 до 255, причём 0 соответствует нулевому коэффициенту заполнения (навыходе постоянный низкий уровень), 255 – коэффициенту заполнения 100 % (на выходе постоянный высокий уровень). Временные диаграммы выходного напряжения при некоторых значениях M и соответственно коэффициента заполнения Кз показаны на рис. 1.

Рис. 1. Временные диаграммы выходного напряжения

Для примера рассмотрим приведённую в табл. 1 программу, которая постепенно увеличивает яркость свечения светодиода, подключённого к цифровому выходу D9, а затем постепенно уменьшает её.

Она основана на стандартном примере examples3.AnalogFading из комплекта поставки Arduino IDE.

Перебор значений коэффициентазаполнения импульсов реализован здесь с помощью уже рассмотренных в [1] операторов цикла for.

Таблица 1.

Для приёма аналоговых сигналов от внешних устройств в Arduino предназначены входы A0-A5, по умолчанию установленные в нужное для этого состояние, так что дополнительной инициализации не требуется. АЦП, встроенный в Arduino UNO, формирует 10-разрядные двоичные коды и входное напряжение, лежащее в интервале от 0 до +5 В, преобразует в целое число от 0 до 1023 (210-1).

Для считывания результата преобразования служит функция analogRead(N), где N – номер аналогового входа.

К аналоговым входам Arduino можно подключать разнообразные датчики, выходное напряжение которых пропорционально измеряемой величине (переменные резисторы, терморезисторы, фоторезисторы и др.). Однако нужно помнить, что на аналоговый вход можно подавать напряжение лишь от 0 до +5 В.

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

Опрос аналогового входа выполняется с частотой менее 10 кГц [2], что может оказаться недостаточным для анализа некоторых быстроизменяющихся сигналов.

Наличие аналоговых входов позволяет превратить Arduino в простейший цифровой вольтметр, измеряющий постоянное напряжение от 0 до +5 В и передающий результат измерения в компьютер. Для этого достаточно загрузить в Arduino программу, приведённую в табл. 2.

Таблица 2

Обратите внимание, что в программе константами заданы образцовое напряжение АЦП Uref (в милливольтах) и коэффициент пересчё-тавыходного кодаАЦП в напряжение Ku. Значение коэффициента вычисляется делением заданного образцового напряжения на 1023.

Коэффициент обычно дробный, поэтому константа Ки имеет тип float (число с плавающей запятой). Константа Uref имеет такой же тип для правильного вычисления коэффициента.

Поскольку в правой части формулы находятся только константы, вычисляет коэффициент не микроконтроллер, выполняя программу, а сам компилятор на этапе её трансляции.

Всё это позволяет повысить точность вольтметра, измерив мультиметром точное значение образцового напряжения на выводе Uref платы Arduino и записав его в программу, присвоив константе Uref. О других способах повысить точность аналого-цифрового преобразования можно прочитать в [3, 4].

При работе рассматриваемой программы на плате мигает светодиод TX, сигнализирующий о передаче информации через последовательный порт. Светодиод RX не светится, так как компьютер ничего не передаёт в ответ. Встроенный терминал Arduino IDE отображает принятую информацию (рис. 2) – результаты измерения напряжения гальванической батареи 3332.

Рис. 2. Окно программы

Arduino может подавать не только световые, но и звуковые сигналы. Для этого к одному из его выходов необходимо подключить пьезоизлучатель звука, например ЗП-1 (рис. 3).

Рис. 3. Подключение пьезоизлучателя звука

Для работы со звуком предусмотрена специальная функция tone(N, F, T), где N – номер вывода, на котором будут сформированы прямоугольные импульсы; F – частота звука, Гц; T – длительность звука, мс. Последний параметр не обязателен. В его отсутствие звук будет непрерывным. Чтобы выключить его, предусмотрена функция noTone(N).

Конечно, пьезокерамический излучатель звука сложно назвать устройством высококачественного воспроизведения, а формируемый микроконтроллером сигнал имеет прямоугольную форму, тем не менее использование этих функций позволяет исполнять несложные мелодии. Пример приведён в табл. 3. Это немного изменённая программа examples 02.

Digital oneMelody, входящая в комплект среды разработки Arduino IDE. Поскольку задавать вручную частоту каждой ноты мелодии неудобно, к программе в её заголовке директивой #include подключён файл pitches.h. Эта операция равносильна включению в программу полного текста этого файла.

В рассматриваемом случае он содержит список названий нот, которые можно воспроизвести, и их частот.

Таблица 3

Излучатель звука должен быть подключён к выходу D8.

Для программы мелодия – это последовательность однотипных констант (значений частоты), которые удобно объединить в массив – пронумерованный список однотипных элементов. При объявлении массива нужно либо перечислить все его элементы, либо указать их общее число. Учтите, что нумерация элементов массива всегда начинается с нуля.

В рассматриваемом примере использованы два массива: int melody[] содержит названия нот мелодии, int note Durations[] – их длительность в миллисекундах. Для обращения к элементу массива указывают его имя с заключённым в квадратные скобки порядковым номером.

Чтобы иметь возможность легко менять число нот в мелодии, оно вычисляется с использованием функций sizeof(V), возвращающих число байтов, занимаемых её аргументом (переменной или их массивом) в памяти микроконтроллера. В рассматриваемом случае массив melody занимает 16 байт, а длина его элементов типа int – два байта.

Поэтому переменная Note получает значение 8 и именно столько раз будет повторено тело цикла for, поочерёдно воспроизводящее ноты.

Если к массиву melody[] добавить несколько нот, соответственно изменится и значение Note. Нужно только не забыть дополнить массив noteDurations[] длительностями звучания этих нот.

Поскольку мелодия исполняется один раз, все необходимые для этого операции помещены внутрь функции setup().

Для повторного исполнения нужно привести микроконтроллер в исходное состояние, нажав на находящуюся на плате Arduino кнопку RESET

Рассмотренные в статье программы для Arduino можно скачать здесь.

Литература

1. Лекомцев Д. Arduino. Операции цифрового ввода-вывода. – Радио, 2016, № 8, с. 51-54.

2. Аналоговые измерения с Arduino. – URL: http://robotosha.ru/arduino/analog-measurements-arduino.html (02.06.16).

3. Arduino Language Reference. Analog I/O – analogReference(). – URL: https://www. arduino.cc/en/Reference/AnalogReference (02.06.16).

4. Функция analogReference(). – URL: http:// arduino.ru/Reference/AnalogReference (02.06.16).

Источник: http://www.radioradar.net/radiofan/radiofan_technology/introduction_arduino_part3.html

[Из песочницы] Гитарные эффекты: алгоритмы, первый опыт аппаратной реализации

Электрогитара давно стала неотъемлемым атрибутом едва ли не каждой музыкальной группы. Вместе с тем, активное развитие получил и рынок устройств, основной функцией которых является обработка гитарного звука.

Как Вы могли догадаться, речь в статье пойдёт о гитарных эффектах.

В статье присутствует описание некоторых гитарных эффектов, а также свод полученного нами при разработке гитарного процессора горького опыта.

Кстати, гитарный процессор мы разрабатывали в качестве курсового проекта в университете.

Что такое гитарные эффекты? Для чего они нужны? Пусть следующее видео ответит за нас:

Теоретическая часть

Ниже приведена классификация эффектов в зависимости от особенностей их реализации:

1) Фильтры – ФНЧ, ФВЧ, полосовой фильтр, эквалайзер 2) Параметрические фильтры – wah-wah (квакушка), фейзер 3) Эффекты над линией задержки – vibrato, flanger, chorus, echo 4) Модуляторы – tremolo, vibrato 5) Нелинейные эффекты – overdrive, distortion, fuzz

6) Пространственные эффекты – reverb

Фильтры

Фильтры, по определению, удаляют часть спектра выше или ниже частоты среза. Для многих ситуаций это слишком грубое вмешательство.
Эквалайзер, с другой стороны, усиливает или ослабляет определенные частотные полосы, не меняя остаток спектра. Эквалайзеры строятся на сериях shelving- и peak-фильтров.

Ниже приведен список часто используемых фильтров:

  • Lowpass filter
  • Highpass filter
  • Bandpass filter
  • Bandreject filter
  • Shelving filter
  • Peak filter

Параметрические фильтры

Некоротые эффекты можно реализовать, меняя параметры простых фильтров с течением времени.

Эффект «Wah-wah» – это узкий bandpass-фильтр, в котором центральная (резонансная) частота перемещается со временем. Фильтрованный звук смешивается с оригинальным.

Эффекты над линией задержки

Все эффекты этого класса объединяет один принцип работы. Входной сигнал сохраняется в участке памяти, которая здесь назыается линией задержки (delay line). На выход же подается сумма входной выборки и выборки откуда-то из линии задержки. Количество и места выборок из линии задержки определяют уникальное звучание эффекта.

Эффекты, которые не сохраняют результат своей работы в линию задержки (т. е. там содержится только чистый входной сигнал) описываются фильтрами с конечной импульсной характеристикой. Эффекты, изменяющие линию задержки, описываются фильтрами с бесконечной импульсной характеристикой.

Эффект «Flanger» – выборка из линии задержки происходит в районе от 0 до 15 мс, причем точное место определяется по низкочастотному (около 1 Гц) синусоидальному закону. Использование низкочастотных синусоид – популярная техника при создании эффектов и имеет собственное название – Low Frequency Oscillator или просто LFO.

Эффект «Echo» – одна или несколько выборок на одинаковом расстоянии, более 50 мс. Вариант с одной выборкой позволяет фактически удвоить количество сыгранных нот. При помощи нескольих выборок можно имитировать игру в просторном помещении. Аналогичной цели достигает так же эффект «Reverb», но о нем позже.

Эффект «Chorus» – имитация игры нескольких инструментов. Несколько выборок (по количеству инструментов) на случайном расстоянии в 10-25 мс.

Модуляция

Модуляция – это процесс, при котором параметры синусоидального сигнала (амплитуда, частота и фаза) меняются на основе аудиосигнала.
Амплитудная модуляция определяется как

y(n) = (1 + a LFO(n)) x(n),

где а – глубина модуляции, число от 0 до 1.

Эффект «Tremolo» – амплитудная модуляция звука с LFO до 20 Гц.

Нелинейные эффекты

Суть нелинейных эффектов сводится к внедрению в звук новых гармоник. Нелинейная обработка звука позволяет, к примеру, ослабить громкие участки, чтобы последующая аппаратура не вносила нежелательных искажений (или чтобы не разбудить соседей при просмотре фильма); усилить тихие участки, делая звук более насыщенным.

Однако, такие фильтры не входят в рамки статьи, поэтому в этом разделе мы сосредоточимся на линейке из трех схожих, очень гитарных, очень эффектных эффектов – overdrive, distortion, fuzz. По сути, это один эффект с разной силой и разными целями.

Овердрайв Вы могли услышать в начале статьи. Как звучит его старший брат, король металла – дисторшн, можно узнать под спойлером.

Пример звучания дисторшна

Реализция этого эффекта проста, и в то же время полна хитростей, что делает создание хорошего дисторшна своего рода искусством. В основе эффекта лежит простая идея – звуки слишком высокой амплитуды должны быть обрезаны. Поначалу это был нежелательный эффект от выхода электронных компонентов в нелинейные режимы работы, но со временем музыканты начали использовать это в своих интересах.

Практическая часть: попытка аппаратной реализации

Первым делом мы решили сделать “седцем” нашей системы Arduino. Этот выбор был обусловлен тем, что опыта работы с другими микроконтроллерами / микропроцессорами у нас практически не было. С arduino мы были хорошо знакомы. Также подкупила простота этой платформы.

Для обработки гитарного сигнала в цифровом виде необходим АЦП/ЦАП. Скромные АЦП/ЦАП, присутствующие на Arduino Mega, нам не подходили из-за малой разрядности. Было решено использовать внешний кодек. Выбор пал на cirrus logic CS4270.

Фото ардуино и кодека

При первом же тесте взаимодействия с кодеком стало ясно, что arduino для наших целей не подойдёт. Предельная частота, с которой мы смогли обмениваться с кодеком данными (принимать оцифрованный сигнал с АЦП, затем без обработки передавать его на ЦАП) составила ~20 кГц. Такая частота является недостаточной для обработки звука.

FreeDSP

Разочаровавшись в возможностях arduino, мы перешли в стадию поиска DSP (DSP — Digital signal processor, специализированный микропроцессор, предназначенный для цифровой обработки сигналов). На просторах интернета был найден проект FreeDSP (http://freedsp.cc/). Информации о нём совсем немного, не считая официального сайта.

FreeDSP — недорогое решение для цифровой обработки сигналов в режиме реального времени, предназначенное для исследователей и DIY сообщества. Плата базируется на ADAU 1701 DSP. Программирование ADAU 1701 осуществляется в SigmaStudio IDE. Более подробную информацию о проекте можно найти по адресу http://www.freedsp.cc/.

Создатели проекта предлагают за скромную сумму приобрести у них все комплектующие для сборки. Однако мы решили сделать всё самостоятельно. Благо на сайте проекта присутствуют все необходимые схемы, а также списки комплектующих. Фотографии процесса сборки можно увидеть под спойлером.

Фото процесса разработки

Итак, freeDSP собран, и даже не воспламеняется при включении в розетку.

Мы уже готовы были открывать шампанское, но далее нас ожидала серия проблем. На сайте freeDSP есть весьма подробное руководство по запуску проекта, однако сделав всё в точном соответствии с ним, перепроверив множество раз каждый пункт, freeDSP отказывался даже выдавать сигнал гитары на выход.

Потратив большое количество времени на перепайку нового ADAU, а также на проверку всевозможных неисправностей, проблема всё же была найдена. Оказалось, что файл, который выдаёт Sigma Studio в формате .hex при компиляции проекта, на самом деле является текстовым файлом. В руководстве по FreeDSP это никак не упоминалось.

Следовательно, пришлось использовать специальные утилиты для преобразования текстового .hex файла в бинарный .hex, который используется программаторами. Одна из таких утилит преобразует исходный файл в intel hex формат, который используется большинством программаторов.

Данная проблема не описана в руководстве к freeDSP, что в свою очередь влечёт массу проблем для разработчиков.

Итак, мы всё же заставили freeDSP работать. Теперь пару слов про программирование: ADAU 1701 загружает программу с EEPROM при запуске. Программирование, как было упомянуто ранее, выполняется в IDE Sigma Studio. Используется графический язык разработки, который отлично заточен под обработку сигналов.

Но следующая проблема не заставила себя долго ждать. Оказалось, что freeDSP не может взаимодействовать с какой-либо внешней памятью. Внутренней же памяти ему хватает лишь на delay длиной в 20ms. К сожалению, этот нюанс мы обнаружили слишком поздно. Для большинства гитарных эффектов память является необходимым условием. В связи с этим, freeDSP был положен на полку до лучших времён.

Наши выводы о работе с freeDSP: данная плата является отличным вариантом в том случае, если вы собираетесь делать обработку звука, не предполагающую наличие памяти (напр. эквалайзер).

Среда разработки проста в освоении. Сборка платы также не вызывает особых затруднений.

Что касается стоимости — на сайте freeDSP указана цена в 65 евро за компоненты, однако если приобретать всё самостоятельно — можно немного сэкономить.

Заключение

В конечном итоге нам всё же удалось сделать скромный гитарный процессор, однако финальная версия в корне отличалась от планируемой изначально и заслуживает отдельной статьи. Часть возможностей процессора показана на видео:

Надеемся, что данной статьёй мы поможем людям, начинающим разработку собственных гитарных эффектов, избежать тех граблей, на которые наступили мы.

Источник

Источник: https://se7en.ws/iz-pesochnicy-gitarnye-yeffekty-algori/

Образовательная робототехника для всех

Приступим к изучению языка программирования C# (си шарп). Будем программировать в среде Visual Studio, которую бесплатно можно скачать с сайта Microsoft. У меня установлена версия 2015, но если у вас другая, то все будет работать так же. При запуске вас…
ДАЛЕЕ

Сделаем машинку, управляемую по bluetooth. Для этого нам понадобится приводная платформа, драйвер двигателя (я использую l293d) и bluetooth-модуль (hc-05 или hc-06). Подключение: Также нам понадобится приложение под Android для управления машинкой. Сделаем его в MIT App Inventor. Внешний вид: Ничего…
ДАЛЕЕ

Продолжим краткий обзор работы с stm32 в Arduino IDE. На платах Ардуино обозначено, какие пины можно использовать для считывания аналоговых сигналов, какие генерируют ШИМ и т.д. На blue pill такого нет и мы должны посмотреть распиновку (кликабельно, оригинал: здесь). Можно…
ДАЛЕЕ

Большинство плат Arduino основаны на микроконтроллерах AVR, которые не отличаются высокой производительностью. Есть платы типа Arduino Due, в которой установлен 32-разрядный микроконтроллер, но она значительно дороже Uno, и размером с Arduino Mega. Однако существуют производительные микроконтроллеры stm32, и с ними…
ДАЛЕЕ

Сегодня сделаем необычный музыкальный инструмент, у которого вместо клавиш будут использоваться съедобные продукты. Тут у нас цукат, хлеб, яблоко, пастила, огурец, сыр, колбаса и капуста и их мы превратим в кнопки. За основу взята вот эта статья с сайта instructables….
ДАЛЕЕ

В этой статье я покажу, как подключить светодиодную матрицу 8×8 к Arduino и вывести на нее символы. Вот так выглядит матрица с драйвером max7219: Подключение: Led matrix -> Arduino Vcc -> 5v GND -> GND DIN -> pin 2 CS…
ДАЛЕЕ

Рассмотрим как подключить и использовать данные джойстика, вот такого: Джойстик позволяет посмотреть наклон по осям X и Y, а также определить нажатие. По сути это два потенциометра и кнопка в одном модуле. Модуль имеет 5 контактов: GND +5V VRx VRy…
ДАЛЕЕ

Сделаем простую игру, в которой задачей игрока будет нажать кнопку быстрее соперника. Для этого нам понадобятся: 3 светодиода 3 резистора 220 ом 3 кнопки Игра будет начинаться с того, что один из игроков нажмет кнопку старт (центральная кнопка). Через случайное…
ДАЛЕЕ

Рассмотрим, как можно измерить напряжение аккумулятора и передать полученные данные в Arduino. Для этого будем использовать очень простой аналоговый датчик напряжения, представляющий собой делитель напряжения. Данный модуль позволяет измерять напряжение до 25 вольт. В нем используются резисторы сопротивлением 30 кОм…
ДАЛЕЕ

Рассмотрим работу с четырехразрядным семисегментным индикатором на чипе TM1637. Управляется данный дисплей по I2C, т.е. нам понадобится всего 2 управляющих пина. Распиновка: 1 — CLK 2 — DIO 3 — VCC 4 — GND Подключим дисплей и потенциометр к Ардуино….
ДАЛЕЕ

Источник: http://studrobots.ru/%D0%BF%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D0%BA%D0%B0/

Ссылка на основную публикацию
Adblock
detector
",css:{backgroundColor:"#000",opacity:.6}},container:{block:void 0,tpl:"
"},wrap:void 0,body:void 0,errors:{tpl:"
",autoclose_delay:2e3,ajax_unsuccessful_load:"Error"},openEffect:{type:"fade",speed:400},closeEffect:{type:"fade",speed:400},beforeOpen:n.noop,afterOpen:n.noop,beforeClose:n.noop,afterClose:n.noop,afterLoading:n.noop,afterLoadingOnShow:n.noop,errorLoading:n.noop},o=0,p=n([]),h={isEventOut:function(a,b){var c=!0;return n(a).each(function(){n(b.target).get(0)==n(this).get(0)&&(c=!1),0==n(b.target).closest("HTML",n(this).get(0)).length&&(c=!1)}),c}},q={getParentEl:function(a){var b=n(a);return b.data("arcticmodal")?b:(b=n(a).closest(".arcticmodal-container").data("arcticmodalParentEl"),!!b&&b)},transition:function(a,b,c,d){switch(d=null==d?n.noop:d,c.type){case"fade":"show"==b?a.fadeIn(c.speed,d):a.fadeOut(c.speed,d);break;case"none":"show"==b?a.show():a.hide(),d();}},prepare_body:function(a,b){n(".arcticmodal-close",a.body).unbind("click.arcticmodal").bind("click.arcticmodal",function(){return b.arcticmodal("close"),!1})},init_el:function(d,a){var b=d.data("arcticmodal");if(!b){if(b=a,o++,b.modalID=o,b.overlay.block=n(b.overlay.tpl),b.overlay.block.css(b.overlay.css),b.container.block=n(b.container.tpl),b.body=n(".arcticmodal-container_i2",b.container.block),a.clone?b.body.html(d.clone(!0)):(d.before("
"),b.body.html(d)),q.prepare_body(b,d),b.closeOnOverlayClick&&b.overlay.block.add(b.container.block).click(function(a){h.isEventOut(n(">*",b.body),a)&&d.arcticmodal("close")}),b.container.block.data("arcticmodalParentEl",d),d.data("arcticmodal",b),p=n.merge(p,d),n.proxy(e.show,d)(),"html"==b.type)return d;if(null!=b.ajax.beforeSend){var c=b.ajax.beforeSend;delete b.ajax.beforeSend}if(null!=b.ajax.success){var f=b.ajax.success;delete b.ajax.success}if(null!=b.ajax.error){var g=b.ajax.error;delete b.ajax.error}var j=n.extend(!0,{url:b.url,beforeSend:function(){null==c?b.body.html("
"):c(b,d)},success:function(c){d.trigger("afterLoading"),b.afterLoading(b,d,c),null==f?b.body.html(c):f(b,d,c),q.prepare_body(b,d),d.trigger("afterLoadingOnShow"),b.afterLoadingOnShow(b,d,c)},error:function(){d.trigger("errorLoading"),b.errorLoading(b,d),null==g?(b.body.html(b.errors.tpl),n(".arcticmodal-error",b.body).html(b.errors.ajax_unsuccessful_load),n(".arcticmodal-close",b.body).click(function(){return d.arcticmodal("close"),!1}),b.errors.autoclose_delay&&setTimeout(function(){d.arcticmodal("close")},b.errors.autoclose_delay)):g(b,d)}},b.ajax);b.ajax_request=n.ajax(j),d.data("arcticmodal",b)}},init:function(b){if(b=n.extend(!0,{},a,b),!n.isFunction(this))return this.each(function(){q.init_el(n(this),n.extend(!0,{},b))});if(null==b)return void n.error("jquery.arcticmodal: Uncorrect parameters");if(""==b.type)return void n.error("jquery.arcticmodal: Don't set parameter \"type\"");switch(b.type){case"html":if(""==b.content)return void n.error("jquery.arcticmodal: Don't set parameter \"content\"");var e=b.content;return b.content="",q.init_el(n(e),b);case"ajax":return""==b.url?void n.error("jquery.arcticmodal: Don't set parameter \"url\""):q.init_el(n("
"),b);}}},e={show:function(){var a=q.getParentEl(this);if(!1===a)return void n.error("jquery.arcticmodal: Uncorrect call");var b=a.data("arcticmodal");if(b.overlay.block.hide(),b.container.block.hide(),n("BODY").append(b.overlay.block),n("BODY").append(b.container.block),b.beforeOpen(b,a),a.trigger("beforeOpen"),"hidden"!=b.wrap.css("overflow")){b.wrap.data("arcticmodalOverflow",b.wrap.css("overflow"));var c=b.wrap.outerWidth(!0);b.wrap.css("overflow","hidden");var d=b.wrap.outerWidth(!0);d!=c&&b.wrap.css("marginRight",d-c+"px")}return p.not(a).each(function(){var a=n(this).data("arcticmodal");a.overlay.block.hide()}),q.transition(b.overlay.block,"show",1*")),b.overlay.block.remove(),b.container.block.remove(),a.data("arcticmodal",null),n(".arcticmodal-container").length||(b.wrap.data("arcticmodalOverflow")&&b.wrap.css("overflow",b.wrap.data("arcticmodalOverflow")),b.wrap.css("marginRight",0))}),"ajax"==b.type&&b.ajax_request.abort(),p=p.not(a))})},setDefault:function(b){n.extend(!0,a,b)}};n(function(){a.wrap=n(document.all&&!document.querySelector?"html":"body")}),n(document).bind("keyup.arcticmodal",function(d){var a=p.last();if(a.length){var b=a.data("arcticmodal");b.closeOnEsc&&27===d.keyCode&&a.arcticmodal("close")}}),n.arcticmodal=n.fn.arcticmodal=function(a){return e[a]?e[a].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof a&&a?void n.error("jquery.arcticmodal: Method "+a+" does not exist"):q.init.apply(this,arguments)}}(jQuery)}var debugMode="undefined"!=typeof debugFlatPM&&debugFlatPM,duplicateMode="undefined"!=typeof duplicateFlatPM&&duplicateFlatPM,countMode="undefined"!=typeof countFlatPM&&countFlatPM;document["wri"+"te"]=function(a){let b=document.createElement("div");jQuery(document.currentScript).after(b),flatPM_setHTML(b,a),jQuery(b).contents().unwrap()};function flatPM_sticky(c,d,e=0){function f(){if(null==a){let b=getComputedStyle(g,""),c="";for(let a=0;a=b.top-h?b.top-h{const d=c.split("=");return d[0]===a?decodeURIComponent(d[1]):b},""),c=""==b?void 0:b;return c}function flatPM_testCookie(){let a="test_56445";try{return localStorage.setItem(a,a),localStorage.removeItem(a),!0}catch(a){return!1}}function flatPM_grep(a,b,c){return jQuery.grep(a,(a,d)=>c?d==b:0==(d+1)%b)}function flatPM_random(a,b){return Math.floor(Math.random()*(b-a+1))+a}