<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://wiki.linuxformat.ru/wiki/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://wiki.linuxformat.ru/wiki/index.php?action=history&amp;feed=atom&amp;title=LXF106%3AArduino</id>
		<title>LXF106:Arduino - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.linuxformat.ru/wiki/index.php?action=history&amp;feed=atom&amp;title=LXF106%3AArduino"/>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF106:Arduino&amp;action=history"/>
		<updated>2026-05-13T00:23:43Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.19.20+dfsg-0+deb7u3</generator>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF106:Arduino&amp;diff=7815&amp;oldid=prev</id>
		<title>Crazy Rebel: викификация, оформление, иллюстрация</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF106:Arduino&amp;diff=7815&amp;oldid=prev"/>
				<updated>2009-05-05T08:58:21Z</updated>
		
		<summary type="html">&lt;p&gt;викификация, оформление, иллюстрация&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;: '''Arduino''' Аппаратный хакинг для любителей гаражной электроники[[Категория:Учебники]]&lt;br /&gt;
&lt;br /&gt;
==Arduino: Набор барабанщика==&lt;br /&gt;
&lt;br /&gt;
{{Цикл/Arduino}}&lt;br /&gt;
&lt;br /&gt;
: Подобно Лео Фендеру, Роберту Мугу и Леону Термену, '''Грэм Моррисон''' взялся за сложную вещь и показал, что все на самом деле просто – на примере драм-машины и Arduino.&lt;br /&gt;
&lt;br /&gt;
Теперь, когда мы потратили несколько месяцев на игру «Саймон сказал», давайте попробуем собрать на основе Arduino что-нибудь еще. Сегодня мы займемся простой барабанной установкой с пьезоэлектрическими датчиками для обнаружения ударов и генерации звука. Пьезоэлементы недороги (менее 10 убитых енотов), и они являются одними из наиболее универсальных компонентов, которые&lt;br /&gt;
имеются в вашем комплекте электроники. Они могут не только генерировать звук при подключении к динамику, но и работать в обратном&lt;br /&gt;
направлении, то есть порождать напряжение при деформации.&lt;br /&gt;
&lt;br /&gt;
{{Врезка|left|Заголовок=Что нам понадибится|Содержание=&lt;br /&gt;
* Arduino&lt;br /&gt;
* Макетная плата&lt;br /&gt;
* 4 пьезопреобразователя&lt;br /&gt;
* 4 резистора на 1 МОм&lt;br /&gt;
* Динамик (или еще один пьезоэлемент)&lt;br /&gt;
* Изолента|Ширина=150px}}&lt;br /&gt;
&lt;br /&gt;
Вы скажете, что мы могли бы использовать для этого и обычные&lt;br /&gt;
кнопки, однако у пьезоэлементов есть несколько важных преимуществ.&lt;br /&gt;
Они могут быть прикреплены к любой поверхности, от оборотной стороны коврика мыши и крышки стола до кожи реального барабана. До&lt;br /&gt;
тех пор, пока к элементу передается достаточное количество вибраций,&lt;br /&gt;
он будет генерировать ток. Кроме того, в отличие от кнопочного подхода в стиле «вкл/выкл», пьезоэлементы являются аналоговыми устройствами и генерируют поток энергии, который соответствует контуру&lt;br /&gt;
удара. Это важное качество, потому что при использовании пьезоэлементов в качестве барабанных триггеров мы можем принять во внимание скорость и продолжительность удара по инструменту.&lt;br /&gt;
&lt;br /&gt;
===Подключение===&lt;br /&gt;
&lt;br /&gt;
Подключение пьезоэлемента выполняется просто, но очень важно&lt;br /&gt;
не перепутать полярность. Большинство деталей поставляется с уже&lt;br /&gt;
прикрепленными проводами – черный для «минуса» и красный для&lt;br /&gt;
«плюса». Если же проводов нет, то минусовой провод подключается к&lt;br /&gt;
центральной части пьезоэлемента, а плюсовой – к краю. Красный провод на каждом пьезоэлементе должен быть подключен к отдельной&lt;br /&gt;
клеммной колодке на макетной плате, и от каждой колодки необходимо провести провод до аналогового входа Arduino. Мы использовали&lt;br /&gt;
позиции '''0–3'''.&lt;br /&gt;
&lt;br /&gt;
Тот же контакт нужно подключить через резистор на 1 МОм к «земле». Так как мы используем несколько пьезоэлементов, то рекомендуем взять '''GND''' от Arduino и подключить его к одной из шин на макетной&lt;br /&gt;
плате. Другой провод (черный) должен быть напрямую подключен к&lt;br /&gt;
'''GND'''. Мы нашли, что легче всего прикрепить пьезоэлементы на поверхность стола или что-то такое же твердое. Наконец, для генерации звука&lt;br /&gt;
подключим динамик на то же место, что и в игре «Саймон сказал», с&lt;br /&gt;
минусовым проводом на 9-м цифровом контакте Arduino и положительным – на контакте '''9 В'''.&lt;br /&gt;
&lt;br /&gt;
===Решение проблем===&lt;br /&gt;
&lt;br /&gt;
Существуют два основных вопроса, которые мы должны решить в&lt;br /&gt;
данном проекте. Первый связан с характером пьезоэлементов и профилями, генерируемыми при ударе. Второй – обработка двух и более&lt;br /&gt;
одновременных ударов. Вы, наверное, думаете, что обнаружение удара&lt;br /&gt;
по пьезоэлементу заключается просто в ожидании появления напряжения определенного уровня. Это действительно так, но здесь возникают&lt;br /&gt;
проблемы – в один и тот же момент времени могут быть зарегистрированы несколько фальшивых ударов. Так происходит потому, что однократный удар будет резонировать, создавая несколько пиков после&lt;br /&gt;
первоначального воздействия. Чтобы найти решение этой проблемы,&lt;br /&gt;
мы сняли сигнал с одного из аналоговых входов Arduino и послали&lt;br /&gt;
его через последовательный порт назад на наш компьютер с Linux.&lt;br /&gt;
'''Монитор''' в ''Arduino IDE'' выдал результаты, а мы скопировали и вставили&lt;br /&gt;
их в ''OpenOffice.org Calc'', а затем построили диаграмму, чтобы увидеть&lt;br /&gt;
характер огибающей удара. Вы можете посмотреть на сгенерированные нами графики во врезке.&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Заголовок=Анализ огибающей|Содержание=Ниже приведены результаты захвата, осуществленного с входов пьезоэлементов, подключенных к Arduino. Как вы видите, результат нелинеен. На первой диаграмме синий контур обозначает жесткого воздействие, в то время как оранжевый контур показывает мягкое. Хотя&lt;br /&gt;
жесткое воздействие длится дольше, масштаб каждого примерно одинаков. Вы можете увидеть на втором графике, что широкий круг ударов, в том числе, более тяжелые и мягкие, а также множественные удары, приводят к похожим результатам. Единственным надежным показателем нового воз-действия является скорость, с которой первый скачок переходит от низкого значения к высокому.&lt;br /&gt;
[[Изображение:LXF106_73_1.jpg|300px]]&lt;br /&gt;
|Ширина=300px}}&lt;br /&gt;
&lt;br /&gt;
Они ясно показывают, что поиск общего элемента, точно отражающего одиночный удар, затруднен. Мы пытались решить этот вопрос&lt;br /&gt;
с огибающей последовательностью, чтобы понять, какая часть цикла&lt;br /&gt;
вывода с пьезоэлемента читается в настоящее время, и игнорировать&lt;br /&gt;
ложные пики. Это работало не очень хорошо, и мы пришли к лучшей&lt;br /&gt;
идее. Существует один аспект каждого удара, который является общим&lt;br /&gt;
для всех: быстрый рост напряжения происходит только на первом&lt;br /&gt;
ударе, в то время как кривизна кривых вторичных и третичных пиков&lt;br /&gt;
менее резкая. Чтобы запрограммировать это, нам достаточно обнаруживать темпы изменения сигнала до определенного порога для выявления реальных срабатываний пьезоэлемента. Это подводит нас ко&lt;br /&gt;
второй проблеме – обработке более чем одного удара одновременно.&lt;br /&gt;
Если наша программа будет сидеть и ждать, действительно ли было&lt;br /&gt;
срабатывание пьезоэлемента 1 или нет, мы не сможем зафиксировать&lt;br /&gt;
сигналы с пьезоэлементов 2, 3 или 4. Это плохо.&lt;br /&gt;
&lt;br /&gt;
Решением будет применение простой машины состояний. Мы создадим цикл, который будет проверять величину входного сигнала&lt;br /&gt;
с каждого из пьезоэлементов. Если она превысит начальный порог,&lt;br /&gt;
мы отметим состояние этого входа как потенциальный удар. Затем мы&lt;br /&gt;
сможем продолжить проверку входов. Если другое значение, поступающее на тот же вход, будет значительно выше, чем первое, то мы предполагаем, что это удар и вызываем звук барабана, сбрасывая состояние. Если этого не произойдет и значение с этого же входа будет ниже&lt;br /&gt;
порогового уровня, мы можем спокойно игнорировать удар и снова&lt;br /&gt;
сбросить состояние входа.&lt;br /&gt;
&lt;br /&gt;
===А теперь – закодируем это!===&lt;br /&gt;
&lt;br /&gt;
Перво-наперво, давайте введем понятные имена для различных констант и переменных. '''STAGE0''' содержит значение порога срабатывания,&lt;br /&gt;
а '''STAGE1''' – значение, которого должно достичь напряжение, чтобы&lt;br /&gt;
считается ударом. '''MAXPADS''' – это число пьезоэлементов, подключенных к Arduino, а '''speakerOut''' характеризует цифровой разъем для&lt;br /&gt;
динамика. '''val''' будет целым числом, которое мы используем для чтения&lt;br /&gt;
аналоговых входов.&lt;br /&gt;
 #define STAGE0 100&lt;br /&gt;
 #define STAGE1 400&lt;br /&gt;
 #define MAXPADS 4&lt;br /&gt;
 int speakerOut = 12;&lt;br /&gt;
 int val = 0 ;&lt;br /&gt;
&lt;br /&gt;
Теперь нам надо создать различные массивы для хранения значений входов пьезоэлемента, контактов Arduino, к которым он подключен, и текущего состояния.&lt;br /&gt;
&lt;br /&gt;
 int piezoStart[] = {0,0,0,0};&lt;br /&gt;
 int piezoIn[] = {0,1,2,3};&lt;br /&gt;
 int piezoState[] = {0,0,0,0};&lt;br /&gt;
&lt;br /&gt;
Процедура начальной установки тоже несложная. Мы инициализируем вывод динамика и используем цикл for для установки аналоговых&lt;br /&gt;
входов для пьезоэлментов:&lt;br /&gt;
&lt;br /&gt;
 void setup() {&lt;br /&gt;
   pinMode(speakerOut, OUTPUT);&lt;br /&gt;
   for (int i=0; i&amp;lt;MAXPADS; i++) {&lt;br /&gt;
       pinMode(piezoIn[i], INPUT);&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Теперь давайте пошалим – то есть пошумим. Есть много разных способов, позволяющих сделать это, но мы выбрали простой вариант, модифицировав тот генератор, что использовался для игры «Саймон...». Единственное отличие этой функции заключается в том,&lt;br /&gt;
что мы добавили выражение '''note = note + 10''', сбрасывая тон в каждом&lt;br /&gt;
цикле и делая звук более похожим на «бум», а также сократили его&lt;br /&gt;
продолжительность.&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Заголовок=Скорая помощь|Содержание=Так как мы используем динамик, подключенный к Arduino, звук барабана монофонический. Но наш код полностью&lt;br /&gt;
поддерживает полифонический вывод, т.е. создание более чем одного звука в каждый момент времени. Одним из решений было бы добавить еще один динамик,&lt;br /&gt;
или даже создать звуковой PWM-выход Arduino. Но вы также можете добавить MIDI-порт и вызывать звуки на внешней драм-машине или синтезаторе. |Ширина=200px}}&lt;br /&gt;
&lt;br /&gt;
 void playTom(int note) {&lt;br /&gt;
   int duration = 50000;&lt;br /&gt;
   long elapsed_time = 0;&lt;br /&gt;
   while (elapsed_time &amp;lt; duration) {&lt;br /&gt;
        digitalWrite(speakerOut, HIGH);&lt;br /&gt;
        delayMicroseconds(note / 2);&lt;br /&gt;
        digitalWrite(speakerOut, LOW);&lt;br /&gt;
        delayMicroseconds(note / 2);&lt;br /&gt;
        elapsed_time += (note);&lt;br /&gt;
        note += 10;&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Нам нужна только одна дополнительная функции для выбора,&lt;br /&gt;
какой барабан используется. В основном цикле, мы генерируем различные звуки барабана в зависимости от того, какой пьезоэлемент&lt;br /&gt;
был ударен, вызывая описанную выше функцию '''playTom''' с различной&lt;br /&gt;
тональностью:&lt;br /&gt;
&lt;br /&gt;
 void playDrum(int drum) {&lt;br /&gt;
    switch (drum) {&lt;br /&gt;
      case 0:&lt;br /&gt;
        playTom(3500); break;&lt;br /&gt;
      case 1:&lt;br /&gt;
        playTom(3000); break;&lt;br /&gt;
      case 2:&lt;br /&gt;
        playTom(2500); break;&lt;br /&gt;
      case 3:&lt;br /&gt;
        playTom(2000); break;&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Теперь – основной управляющий цикл. Все, что мы сделаем – это&lt;br /&gt;
претворим в жизнь оба решения, которые мы описали выше. Первый&lt;br /&gt;
цикл for опрашивает каждый из входов пьезоэлементов по очереди и&lt;br /&gt;
считывает текущее входное значение в '''val'''. Если эта величина выше,&lt;br /&gt;
чем пороговая '''STAGE0''', мы отмечаем, что состояние входа – '''true''', потому что он может быть потенциальным ударом по пьезоэлементу. Затем&lt;br /&gt;
мы продолжаем проверку других входов.&lt;br /&gt;
&lt;br /&gt;
Когда далее мы читаем значение с того же входа, и уровень его&lt;br /&gt;
изменения, определяемый как разность между новым и старым значением, больше чем '''STAGE1''', мы переключаемся на воспроизведение&lt;br /&gt;
звука барабана. Если нет, то очищаем состояние входа и возвращаемся&lt;br /&gt;
к проверке.&lt;br /&gt;
&lt;br /&gt;
 void loop(){&lt;br /&gt;
   for (int i=0; i&amp;lt;MAXPADS; i++) {&lt;br /&gt;
      val = analogRead(piezoIn[i]);&lt;br /&gt;
      if(( val &amp;gt;= STAGE0) &amp;amp;&amp;amp; (piezoState[i] == false)) {&lt;br /&gt;
        piezoState[i] = true;&lt;br /&gt;
        piezoStart[i] = val;&lt;br /&gt;
      } else if ( ((val - piezoStart[i]) &amp;gt; STAGE1) &amp;amp;&amp;amp; (piezoState[i] == true)) {&lt;br /&gt;
        piezoState[i] = false;&lt;br /&gt;
        playDrum(i);&lt;br /&gt;
      } else if ((piezoState[i] == true) &amp;amp;&amp;amp; ( val &amp;lt; STAGE0)) {&lt;br /&gt;
        piezoState[i] = false;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    delay(1);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
На этом все. Скомпилировав и послав эту программу на вашу&lt;br /&gt;
Arduino, вы должны обнаружить, что когда вы один раз ударяете по&lt;br /&gt;
пьезоковрику, динамик генерирует звук. Как видно, этого достаточ-&lt;br /&gt;
но, чтобы создать ритм, поэтому, пока остывает паяльник, вы можете&lt;br /&gt;
открыть в себе Джона Бонэма. Удачи! '''LXF'''&lt;/div&gt;</summary>
		<author><name>Crazy Rebel</name></author>	</entry>

	</feed>