<?xml version="1.0" encoding="utf-8"?> 
<rss version="2.0">

<channel>

<title>Nonfinishism studious, заметки с тегом: Piezo</title>
<link>http://medinskiy.net/nfss/tags/piezo/</link>
<description></description>
<generator>E2 (v2842; Aegea)</generator>

<item><title>Электронные клавиши.</title><guid isPermaLink="true">http://medinskiy.net/nfss/all/elektronnye-klavishi/</guid><link>http://medinskiy.net/nfss/all/elektronnye-klavishi/</link><description>&lt;p&gt;C помощью нескольких резисторов и нескольких кнопок мы собираемся сделать небольшой электро-клавишный инструмент.&lt;/p&gt;
&lt;p&gt;В принципе, можно подключить несколько выключателей к цифровым входам и использовать их для воспроизвдения различных нот. Но в этом проекте мы будем конструировать что-то вроде &lt;a href="http://ru.wikipedia.org/wiki/Резисторные_матрицы" target="_blank"&gt;резисторной матрицы&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;С помощью этого приёма можно считывать нажатия нескольких клавиш, используя только один аналоговый вход. Это очень полезно, когда обнаруживается недостаток в цифровых входах. Несколько выключателей соединяются параллельно с аналоговым входом Arduino и плюсом, на минус они подключаются через общий резитор. На плюс большая часть выключателей подсоединяется через свой резитор. С таким подключением при нажатии различных кнопок на пине будет разное наряжение. Если нажать несколько кнопок одновременно, на входе получится другое значение, в зависимости от того какие резиторы оказались соединёнными параллельно.&lt;/p&gt;
&lt;p&gt;Схема подключения этого всего к Arduino выглядит так:&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="http://medinskiy.net/nfss/pictures/keyboard_схема.jpg" width="640" height="434" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Первый выключатель подсоединяется к плюсу напрямую без резистора, второй — через резистор на 220 Ом, третий — через резистор на 10кОм, четвёртый — через резистор на 1МОм. Вторые выходы выключателей соединяются с аналоговым входом Arduino и через общий резистор в 10кОм идут на 0. В общем получается схема &lt;a href="http://ru.wikipedia.org/wiki/Делитель_напряжения" target="_blank"&gt;делителя напряжения&lt;/a&gt;, которую мы уже &lt;a href="http://medinskiy.net/nfss/all/svetovoy-termenvoks/" target="_blank"&gt;использовали&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Собранный макет:&lt;/p&gt;
&lt;div class="tiles"&gt;
            &lt;a href="pictures/IMG_0209.jpg" rel="lightbox"&gt;
                &lt;img src="pictures/IMG_0209.jpg" /&gt;
            &lt;/a&gt;
&lt;a href="pictures/empty.jpg" &gt;
                &lt;img src="pictures/empty.jpg" /&gt;
            &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Программа, с помощью которой вся эта шарманка будет играть:&lt;/p&gt;
&lt;pre&gt;&lt;span style="color: #cc6600;"&gt;int&lt;/span&gt; notes[]={
  262,294,330,349};&lt;span style="color: #7e7e7e;"&gt;//ноты до-фа (массив)&lt;/span&gt;
&lt;span style="color: #cc6600;"&gt;int&lt;/span&gt; keys=A0;&lt;span style="color: #7e7e7e;"&gt;//клавиши&lt;/span&gt;
&lt;span style="color: #cc6600;"&gt;int&lt;/span&gt; speak=8;&lt;span style="color: #7e7e7e;"&gt;//пьезоэлемент&lt;/span&gt;

&lt;span style="color: #cc6600;"&gt;void&lt;/span&gt; &lt;span style="color: #cc6600;"&gt;&lt;b&gt;setup&lt;/b&gt;&lt;/span&gt;(){
  &lt;span style="color: #cc6600;"&gt;pinMode&lt;/span&gt;(speak, &lt;span style="color: #006699;"&gt;OUTPUT&lt;/span&gt;);
  &lt;span style="color: #cc6600;"&gt;&lt;b&gt;Serial&lt;/b&gt;&lt;/span&gt;.&lt;span style="color: #cc6600;"&gt;begin&lt;/span&gt;(9600);
}

&lt;span style="color: #cc6600;"&gt;void&lt;/span&gt; &lt;span style="color: #cc6600;"&gt;&lt;b&gt;loop&lt;/b&gt;&lt;/span&gt;(){
  &lt;span style="color: #cc6600;"&gt;int&lt;/span&gt; keysVal=0;&lt;span style="color: #7e7e7e;"&gt;//переменная для хранения значения клавиши&lt;/span&gt;
  keysVal=&lt;span style="color: #cc6600;"&gt;analogRead&lt;/span&gt;(keys);
  &lt;span style="color: #cc6600;"&gt;&lt;b&gt;Serial&lt;/b&gt;&lt;/span&gt;.&lt;span style="color: #cc6600;"&gt;println&lt;/span&gt;(keysVal); 
  &lt;span style="color: #cc6600;"&gt;if&lt;/span&gt;  (keysVal==1023){
    &lt;span style="color: #cc6600;"&gt;tone&lt;/span&gt;(speak,notes[0]);
  }
  &lt;span style="color: #cc6600;"&gt;else&lt;/span&gt; &lt;span style="color: #cc6600;"&gt;if&lt;/span&gt; ( (keysVal&amp;gt;=990)&amp;amp;&amp;amp;(keysVal&amp;lt;=1010)){
    &lt;span style="color: #cc6600;"&gt;tone&lt;/span&gt;(speak,notes[1]);
  }
  &lt;span style="color: #cc6600;"&gt;else&lt;/span&gt; &lt;span style="color: #cc6600;"&gt;if&lt;/span&gt; ( (keysVal&amp;gt;=505 )&amp;amp;&amp;amp;(keysVal&amp;lt;=515)){
    &lt;span style="color: #cc6600;"&gt;tone&lt;/span&gt;(speak,notes[2]);
  }
  &lt;span style="color: #cc6600;"&gt;else&lt;/span&gt; &lt;span style="color: #cc6600;"&gt;if&lt;/span&gt;( (keysVal&amp;gt;=5)&amp;amp;&amp;amp;(keysVal&amp;lt;=10)){
    &lt;span style="color: #cc6600;"&gt;tone&lt;/span&gt;(speak,notes[3]);
  } 
  &lt;span style="color: #cc6600;"&gt;else&lt;/span&gt;{
    &lt;span style="color: #cc6600;"&gt;noTone&lt;/span&gt;(speak);&lt;span style="color: #7e7e7e;"&gt;//если ничего не нажато, замолчать&lt;/span&gt;
  }  
}&lt;/pre&gt;
&lt;p&gt;Для того, чтобы программа могла воспроизвести ноты, она должна где-то хранить список частот, для каждой ноты. Мы будем играть ноты до, ре, ми, фа (262Гц, 294Гц, 330Гц и 349Гц). Для этого в программе мы используем массив.&lt;/p&gt;
&lt;p&gt;Массивы используют для хранения списков однотипных элементов, например, частоты нот, используя одно имя переменной. Это достаточно удобный инструмент для быстрого и эффективного доступа к информации.  Массив объявляется так же как и обычная переменная, но после её имени следует пара квадратных скобок []. Если нужно присвоить значения сразу всем элементам массива, то после знака равенства эти значения перечисляются через запятую и обрамляются фигурными скобками {}.&lt;/p&gt;
&lt;p&gt;Для того, чтобы прочитать значения из массива, к массиву обращаются по имени и в квадратных скобках указать индекс (номер) конкретного элемента.  Номера элементов в массиве начинаются с нуля. Первый элемент имеет индек 0, второй — 1 и т. д.&lt;/p&gt;
&lt;p&gt;Теперь небольшое описание программы:&lt;/p&gt;
&lt;p&gt;Сначала мы создаем массив с частотами звуков, которые будем воспроизводить. В функции &lt;strong&gt;setup() &lt;/strong&gt;указываем режим работы выхода, к которому подключен пьезоэлемент и включаем консоль (она нам нужна, чтобы определить какие значения за аналоговом входе будут выдавать нажатия различных кнопок).&lt;/p&gt;
&lt;p&gt;В основной программе, сначала мы считываем значение с аналогового входа, затем выводим его на консоль. Этими двумя строчками мы ограничились в первом варианте программы и запустили её, записали значения, кототорые получали на входе при нажатии разных кнопок. Поскольку для каждой кнопки значения немного отличались для разных нажатий, то мы решили использовать не конкретные предпределённые значения, а интервалы. В зависимости от интервала, в котором находится считанное со входа значение, мы выдаем тот или иной тон, частоты берем из нашего массива. Если ни одна из кнопок не нажата, то даем команду «замолчать».&lt;/p&gt;
&lt;p&gt;Небольшое видео:&lt;/p&gt;
&lt;div class="e2-text-video"&gt;
&lt;iframe width="768" height="480" src="http://www.youtube.com/embed/C4TEtNeGo7E" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;div class="tiles"&gt;
     &lt;a href="pictures/IMG_0207.jpg" rel="lightbox[01]"&gt;
                &lt;img src="pictures/IMG_0207.jpg" /&gt;
        &lt;/a&gt;
  &lt;a href="pictures/IMG_0209.jpg" rel="lightbox[01]"&gt;
                &lt;img src="pictures/IMG_0209.jpg" /&gt;
           &lt;/a&gt;
  &lt;a href="pictures/keyboard_схема.jpg" rel="lightbox[01]"&gt;
                &lt;img src="pictures/keyboard_схема.jpg" /&gt;
           &lt;/a&gt;
&lt;/div&gt;
</description><pubDate>Tue, 26 Mar 2013 22:24:31 +0300</pubDate></item><item><title>Световой терменвокс.</title><guid isPermaLink="true">http://medinskiy.net/nfss/all/svetovoy-termenvoks/</guid><link>http://medinskiy.net/nfss/all/svetovoy-termenvoks/</link><description>&lt;p&gt;А теперь мы немного помузицируем. С помощью фоторезистора и &lt;a href="http://ru.wikipedia.org/wiki/Пьезоэлектрический_громкоговоритель" target="_blank"&gt;пьезоэлемента&lt;/a&gt; мы будем делать световой терменвокс. &lt;a href="http://ru.wikipedia.org/wiki/Терменвокс" target="_blank"&gt;Терменвокс&lt;/a&gt; — это музыкальный инструмент, издающий звуки, в зависимости от движений, которые производит музыкант вокруг инструмента. Такие звуки часто используют в фильмах ужасов.&lt;/p&gt;
&lt;!--more--&gt;&lt;p&gt;У терменвокса две антенны, при изменении положения рук исполнителя относительно них  изменяется ёмкость &lt;a href="http://ru.wikipedia.org/wiki/Колебательный_контур" target="_blank"&gt;колебательного контура&lt;/a&gt; антенн. Эти антенны подключены к аналоговой схеме, которая создает звук. Одна антенна отвечает за частоту звука, а вторая за его громкость. Arduino, конечно же, не может воспроизвести загадочные звуки этого инструмента, но можно эмулировать их с помощью функции &lt;strong&gt;tone(). &lt;/strong&gt;На рисунках ниже можно увидеть разницу между модуляциями произведёнными функцией &lt;strong&gt;analogWrite() &lt;/strong&gt;и функцией &lt;strong&gt;tone()&lt;/strong&gt;. Эти модуляции заставляют воспроизводящие устройства (такие как наушники, колонки или пьезоэлементы) издавать различые звуки.&lt;/p&gt;
&lt;table&gt;
&lt;tr &gt;
&lt;td valign="middle"&gt;
Большую часть времени сигнал равен нулю, но частота такая же как и в ШИМ 150
&lt;/td&gt;
&lt;td align="center"&gt;
&lt;img src="pictures/pwm50.jpg" align="middle"&gt;
PWM 50: analogWrite(50)
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr &gt;
&lt;td valign="middle"&gt;
Большую часть времени сигнал равен единице, но частота такая же как и в ШИМ 50
&lt;/td&gt;
&lt;td align="center"&gt;
&lt;img src="pictures/pwm150.jpg" align="middle"&gt;
PWM 150: analogWrite(50)
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr &gt;
&lt;td valign="middle"&gt;
Рабочий цикл составляет 50% (половину времени сигнал есть, половину времени нет), но частота изменилась.
&lt;/td&gt;
&lt;td align="center"&gt;
&lt;img src="pictures/tone440.jpg" align="middle"&gt;
TONE 440: tone(9,440)
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr &gt;
&lt;td valign="middle"&gt;
Рабочий цикл такой же как и в Tone 440, но частота больше вдвое.
&lt;/td&gt;
&lt;td align="center"&gt;
&lt;img src="pictures/tone880.jpg" align="middle"&gt;
TONE 880: tone(9,440)
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;Вместо определения ёмкости с помощью Arduino, мы будем использовать фоторезистор, чтобы определять количество света. Двигая руки над фоторезистором, мы будем менять количество света, которое на него попадает, так же как проекте &lt;a href="http://medinskiy.net/nfss/all/lampa-hameleon-color-mixing-lamp/" target="_blank"&gt;«Лампа хамелеон»&lt;/a&gt;. Изменение напряжения на аналоговом входе будет определять ноту какой частоты играть.&lt;/p&gt;
&lt;p&gt;Фоторезистор к Arduino мы подключим используя схему &lt;a href="http://ru.wikipedia.org/wiki/Делитель_напряжения" target="_blank"&gt;делителя напряжения&lt;/a&gt;. Ранее мы уже заметили, что когда считываем напряжение с этой схемы используя функцию &lt;strong&gt;analogRead()&lt;/strong&gt;, получаемые значения не всегда полностью покрывают диапазон от 0 до 1023 (максимальный диапазон, который может быть считан с аналогового входа). Резистор фиксированного сопротивления, подсоединённый к «земле», ограничивает считываемые значения снизу, а максимальная яркость освещения — сверху. Вместо того, чтобы ограничивать диапазон возможных значений, можно откалибровать сенсор, получив максимальное и минимальное значения, и соотнести их с частотой извлекаемого звука с помощью функции &lt;strong&gt;map()&lt;/strong&gt; (как мы уже &lt;a href="http://medinskiy.net/nfss/all/ispolzovanie-servoprivoda/" target="_blank"&gt;делали&lt;/a&gt;), таким образом, диапазон частот, которые будет издавать наш терменвокс, станет максимально возможным. Так же к нашему сенсору добавится дополнительная «фича»: куда бы мы не перенесли схему, например, в более темное помещение, она будет автоматически подстраиваться.&lt;/p&gt;
&lt;p&gt;Итак , вот схема, которую мы будем собирать:&lt;/p&gt;
&lt;div class="tiles"&gt;
            &lt;a href="pictures/Theremin_схема_1.jpg" rel="lightbox"&gt;
                &lt;img src="pictures/Theremin_схема_1.jpg" /&gt;
            &lt;/a&gt;
&lt;a href="pictures/empty.jpg" &gt;
                &lt;img src="pictures/empty.jpg" /&gt;
            &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Собранный макет:&lt;/p&gt;
&lt;div class="tiles"&gt;
            &lt;a href="pictures/photo-3_t.jpg" rel="lightbox"&gt;
                &lt;img src="pictures/photo-3_t.jpg" /&gt;
            &lt;/a&gt;
&lt;a href="pictures/empty.jpg" &gt;
                &lt;img src="pictures/empty.jpg" /&gt;
            &lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Пишем программу, для управления терменвоксом:&lt;/p&gt;
&lt;pre&gt;&lt;span style="color: #cc6600;"&gt;int&lt;/span&gt; sVal;&lt;span style="color: #7e7e7e;"&gt;//Значение на фоторезисторе&lt;/span&gt;
&lt;span style="color: #cc6600;"&gt;int&lt;/span&gt; sLow=1023; &lt;span style="color: #7e7e7e;"&gt;//минимальное значение фоторезистора&lt;/span&gt;
&lt;span style="color: #cc6600;"&gt;int&lt;/span&gt; sHigh=0;&lt;span style="color: #7e7e7e;"&gt;//максимальное значение фоторезистора&lt;/span&gt;
&lt;span style="color: #cc6600;"&gt;int&lt;/span&gt; ledPin=13;&lt;span style="color: #7e7e7e;"&gt;//встроенный светодиод&lt;/span&gt;

&lt;span style="color: #cc6600;"&gt;void&lt;/span&gt; &lt;span style="color: #cc6600;"&gt;&lt;b&gt;setup&lt;/b&gt;&lt;/span&gt;(){
  &lt;span style="color: #cc6600;"&gt;pinMode&lt;/span&gt;(ledPin,&lt;span style="color: #006699;"&gt;OUTPUT&lt;/span&gt;);
  &lt;span style="color: #cc6600;"&gt;digitalWrite&lt;/span&gt;(ledPin,&lt;span style="color: #006699;"&gt;HIGH&lt;/span&gt;); &lt;span style="color: #7e7e7e;"&gt;//начало калибровки&lt;/span&gt;
  &lt;span style="color: #cc6600;"&gt;while&lt;/span&gt;(&lt;span style="color: #cc6600;"&gt;millis&lt;/span&gt;()&amp;lt;5000) { &lt;span style="color: #7e7e7e;"&gt;//калибруем в течении 5 секунд&lt;/span&gt;
    sVal=&lt;span style="color: #cc6600;"&gt;analogRead&lt;/span&gt;(A0);
    &lt;span style="color: #cc6600;"&gt;if&lt;/span&gt; (sVal&amp;gt;sHigh){
      sHigh=sVal;
    }
    &lt;span style="color: #cc6600;"&gt;if&lt;/span&gt;(sVal&amp;lt;sLow){
      sLow=sVal;
    }
  }
  &lt;span style="color: #cc6600;"&gt;digitalWrite&lt;/span&gt;(ledPin,&lt;span style="color: #006699;"&gt;LOW&lt;/span&gt;);&lt;span style="color: #7e7e7e;"&gt;//окончание калибровки&lt;/span&gt;
}

&lt;span style="color: #cc6600;"&gt;void&lt;/span&gt; &lt;span style="color: #cc6600;"&gt;&lt;b&gt;loop&lt;/b&gt;&lt;/span&gt;(){
  &lt;span style="color: #cc6600;"&gt;int&lt;/span&gt; freq;
  sVal=&lt;span style="color: #cc6600;"&gt;analogRead&lt;/span&gt;(A0);&lt;span style="color: #7e7e7e;"&gt;//считываем значение с фоторезистора&lt;/span&gt;
  freq=&lt;span style="color: #cc6600;"&gt;map&lt;/span&gt;(sVal,sLow,sHigh,50,4000);&lt;span style="color: #7e7e7e;"&gt;//приводим значение&lt;/span&gt;
  &lt;span style="color: #cc6600;"&gt;tone&lt;/span&gt;(8,freq,20);&lt;span style="color: #7e7e7e;"&gt;//извлекаем звук&lt;/span&gt;
  &lt;span style="color: #cc6600;"&gt;delay&lt;/span&gt;(10);
}&lt;/pre&gt;
&lt;p&gt;Небольшой комментарий к программе:&lt;/p&gt;
&lt;p&gt;Объявления переменных:&lt;/p&gt;
&lt;p&gt;sVal — сюда будем считывать значение с фоторезистора;&lt;/p&gt;
&lt;p&gt;sLow и sHigh — максимальное и минимальное значения, которые можно прочитать с фоторезистора. В начале программы они соответственно равны 1023 (минимальное) и 0 (максимальное). В процессе калибровки в этих переменных появятся реальные значения минимума и максимума.&lt;/p&gt;
&lt;p&gt;ledPin — пин со светодиодом, при начале калибровки включим его, по окончании выключим.&lt;/p&gt;
&lt;p&gt;Инициализация:&lt;/p&gt;
&lt;p&gt;Включаем светодиод. Втечении первых пяти секунд, в цикле считывается значение с фоторезистора, если оно меньше уже зафиксированного минимального значения (первоначально 1023), то записываем его в минимальное, если оно больше уже зафиксированного максимального значения (первоначально 0), то записываем его в максимальное. Используем функцию &lt;strong&gt;mills()&lt;/strong&gt;, для определения времени, прошедшего с момента включения Arduino.&lt;/p&gt;
&lt;p&gt;Основная программа: вобщем довольно простая, функция tone() используется для воспроизведения звука, первый её параметр — пин, на который выводить звук, второй — частота звука, третий — длительность.&lt;/p&gt;
&lt;p&gt;Вот что вышло:&lt;/p&gt;
&lt;div class="e2-text-video"&gt;
&lt;iframe width="768" height="480" src="http://www.youtube.com/embed/CFNT91OJ66o" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Настоящий терменвокс позволяет управлять не только частотой звука, но и его громкостью. В этом примере мы можем менять только частоту. Если подсоединить потенциоментр последовательно с пьезоэлементом, то звук можно будет регулировать с помощью его ручки или можно поставить второй фоторезистор. Мы решили подключить потенциометр.&lt;/p&gt;
&lt;p&gt;Схема и фото макета ниже, а вот видео:&lt;/p&gt;
&lt;div class="e2-text-video"&gt;
&lt;iframe width="768" height="480" src="http://www.youtube.com/embed/Qnfdkh-NzWQ" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;div class="tiles"&gt;
     &lt;a href="pictures/photo-1_t.jpg" rel="lightbox[01]"&gt;
                &lt;img src="pictures/photo-1_t.jpg" /&gt;
        &lt;/a&gt;
  &lt;a href="pictures/Theremin_схема_1.jpg" rel="lightbox[01]"&gt;
                &lt;img src="pictures/Theremin_схема_1.jpg" /&gt;
           &lt;/a&gt;
  &lt;a href="pictures/photo-3_t.jpg" rel="lightbox[01]"&gt;
                &lt;img src="pictures/photo-3_t.jpg" /&gt;
           &lt;/a&gt;
  &lt;a href="pictures/photo-2_t.jpg" rel="lightbox[01]"&gt;
                &lt;img src="pictures/photo-2_t.jpg" /&gt;
           &lt;/a&gt;
  &lt;a href="pictures/Theremin_схема_2.jpg" rel="lightbox[01]"&gt;
                &lt;img src="pictures/Theremin_схема_2.jpg" /&gt;
           &lt;/a&gt;
  &lt;a href="pictures/IMG_0198.jpg" rel="lightbox[01]"&gt;
                &lt;img src="pictures/IMG_0198.jpg" /&gt;
           &lt;/a&gt;
&lt;/div&gt;
</description><pubDate>Mon, 18 Mar 2013 12:07:18 +0300</pubDate></item>
</channel>

</rss>