Следующая версия | Предыдущая версия |
products:laboratory_iot:exp23 [2020/05/18 12:31] – создано labuser29 | products:laboratory_iot:exp23 [2020/05/18 15:40] (текущий) – [Программный код эксперимента] labuser29 |
---|
===== Эксперимент 23. Темп, длительность и паузы ===== | ===== Эксперимент 23. Темп, длительность и паузы ===== |
| |
Если в прошлом эксперименте ты попробовал выполнить дополнительное задание и записать мелодию, то, вероятно, понял, что это не просто, учитывая, что ужно учитывать и ноты и их длительности и паузы между ними. А если после написания такой мелодии потребуется изменить ее темп, то придется пересчитывать все паузы. Должен быть другой, более удобный способ записывать мелодии. | Если в прошлом эксперименте ты попробовал выполнить дополнительное задание и записать мелодию, то, вероятно, понял, что это не просто, учитывая, что нужно описывать и ноты и их длительности и паузы между ними. А если после написания такой мелодии потребуется изменить ее темп, то придется пересчитывать все паузы. Должен быть другой, более удобный способ записывать мелодии. |
| |
| Для этого запишем мелодию, последовательность ее нот, в массив, а длительности этих нот в другой. С помощью оператора цикла будем получать эти данные и исполнять. Для записи темпа заведем отдельную переменную, которая будет учитываться в расчете длительностей. |
| |
| ==== Схема эксперимента ==== |
| Схему эксперимента оставим прежней, займемся программой. |
| |
| {{ :products:esp-iot:exp7_sch.png?nolink |}} |
| //Рисунок 1. Электрическая принципиальная схема эксперимента// |
| |
| {{ :wiki:exp7_mont.png?direct&600 |}} |
| //Рисунок 2. Монтажная схема эксперимента// |
| |
| |
| ==== Программный код эксперимента ==== |
| |
| <file python Exp23.py[enable_line_numbers="2", start_line_numbers_at="1"]> |
| from machine import Pin, PWM |
| import time |
| _init() |
| |
| tempo = 2 |
| |
| tones = { |
| 'c': 262, |
| 'd': 294, |
| 'e': 330, |
| 'f': 349, |
| 'g': 392, |
| 'a': 440, |
| 'b': 494, |
| 'C': 523 |
| } |
| |
| speaker = PWM(Pin(15, Pin.OUT)) |
| |
| melody = 'abcdefgC' |
| rhythm = [8, 2, 1, 8, 3, 4, 6, 8] |
| |
| for tone, length in zip(melody, rhythm): |
| speaker.duty(512) |
| speaker.freq(tones[tone]) |
| time.sleep(tempo/length) |
| speaker.duty(0) |
| time.sleep(tempo/length/4) |
| </file> |
| |
| Мелодию мы записали строкой ''abcdefgC'', а ритм массивом ''[8, 2, 1, 8, 3, 4, 6, 8]''. |
| С помощью цикла ''for'' и оператора ''in'' проходим по всем элементам мелодии. Для этого мы использовали оператор ''zip''. Он нужен для одновременного перебора сразу двух массивов и получения их элементов в переменные ''tone'' и ''length''. Так на первой итерации в переменной ''tone'' окажется ''a'', а в ''length'' — ''8''. На второй итерации ''b'' и ''2'' соответственно. |
| |
| Здесь внимательный читатель заметит, что ''melody'' не является массивом, а является строкой. Почему же мы говорим о ней как о массиве и работаем как с массивом. Оказывается в Python любую строку можно представить как массив символов и обращаться к ним по индексу, что мы и делаем. |
| |
| Получив ноту и ее длительность настраиваем частоту и скважность. Нота начинает звучать: |
| <code python [enable_line_numbers="2", start_line_numbers_at="24"]> |
| speaker.duty(512) |
| speaker.freq(tones[tone]) |
| </code> |
| |
| Нота звучит, пока мы ждем время, равное ее длительности. В расчете учитывается темп: |
| <code python [enable_line_numbers="2", start_line_numbers_at="26"]> |
| time.sleep(tempo/length) |
| </code> |
| |
| Чтобы ноты не сливались, мы делаем между ними маленькие паузы. Паузы между нотами также зависят от темпа и длительности ноты, но в 4 раза короче. |
| <code python [enable_line_numbers="2", start_line_numbers_at="27"]> |
| speaker.duty(0) |
| time.sleep(tempo/length/4) |
| </code> |
| |
| ==== Дополнительное задание ==== |
| <WRAP center round tip 60%> |
| * Измени темп мелодии и длительности отдельных нот. |
| </WRAP> |