Чтение онлайн

на главную - закладки

Жанры

Программируем Arduino. Основы работы со скетчами
Шрифт:

Функция sampleWindowFull читает значение аналогового входа 128 раз и предполагает, что сигнал колеблется относительно средней точки 2,5 В, поэтому она вычитает 512 из прочитанного значения, в результате чего может получиться положительное или отрицательное значение. Затем оно масштабируется константой GAIN, чтобы немного усилить слабые сигналы. Далее 10-битный замер делением на 4 преобразуется в 8-битное значение, чтобы можно было уместить его в массив типа char. Массив im хранит мнимую часть сигнала, установленную в 0. Это внутренняя особенность алгоритма; желающие больше узнать об этом могут обратиться к

статье https://ru.wikipedia.org/wiki/Быстрое_преобразование_Фурье.

void sampleWindowFull

{

for (int i = 0; i < 128; i++)

{

int val = (analogRead(analogPin) — 512) * GAIN;

data[i] = val / 4;

im[i] = 0;

}

}

Функция updateData вычисляет амплитуду в каждом частотном интервале. Сила сигнала вычисляется как длина гипотенузы прямоугольного тре­угольника, двумя другими сторонами которого являются действительная и мнимая части сигнала (практическое применение теоремы Пифагора!):

void updateData

{

for (int i = 0; i < 64; i++)

{

data[i] = sqrt(data[i] * data[i] + im[i] * im[i]);

}

}

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

Массив data можно было бы использовать, например, для управления высотой столбиков диаграммы на жидкокристаллическом дисплее. Подключить источник сигнала (например, аудиовыход MP3-плеера) можно с помощью той же схемы, обеспечивающей колебание сигнала относительно средней точки 2,5 В, что была показана ранее, на рис. 13.4.

Пример измерения частоты

В этом, втором примере плата Arduino Uno используется для вывода оценки частоты сигнала в монитор последовательного порта (sketch_13_07_FFT_Freq). Большая часть кода в этом скетче повторяет код из предыдущего примера. Главное отличие в том, что после обработки массива data определяется индекс элемента с наибольшим значением и используется для оценки частоты. Затем функция loop выводит это значение в монитор последовательного порта.

В заключение

Цифровая обработка сигналов — сложная тема, ей посвящено множество отдельных книг. Из-за ее сложности я коснулся только наиболее полезных приемов, которые можно попробовать применить при использовании платы Arduino.

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

14. Многозадачность с единственным процессом

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

Переход из мира программирования больших систем

Плата Arduino привлекла множество энтузиастов (в том числе и меня), которые работают

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

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

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

Почему вам не нужны потоки выполнения

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

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

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

Функции setup и loop

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

Оценка, затем действие

Большинство проектов для Arduino предназначено для управления чем-то. Поэтому функция loop часто:

Поделиться:
Популярные книги

Эпоха Опустошителя. Том I

Павлов Вел
1. Вечное Ристалище
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Эпоха Опустошителя. Том I

Проблема майора Багирова

Майер Кристина
1. Спецназ
Любовные романы:
современные любовные романы
6.60
рейтинг книги
Проблема майора Багирова

Законы Рода. Том 13

Андрей Мельник
13. Граф Берестьев
Фантастика:
аниме
фэнтези
5.00
рейтинг книги
Законы Рода. Том 13

Газлайтер. Том 15

Володин Григорий Григорьевич
15. История Телепата
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Газлайтер. Том 15

О, Путник!

Арбеков Александр Анатольевич
1. Квинтет. Миры
Фантастика:
социально-философская фантастика
5.00
рейтинг книги
О, Путник!

Прометей: каменный век

Рави Ивар
1. Прометей
Фантастика:
альтернативная история
6.82
рейтинг книги
Прометей: каменный век

Её (мой) ребенок

Рам Янка
Любовные романы:
современные любовные романы
6.91
рейтинг книги
Её (мой) ребенок

Идеальный мир для Лекаря 8

Сапфир Олег
8. Лекарь
Фантастика:
юмористическое фэнтези
аниме
7.00
рейтинг книги
Идеальный мир для Лекаря 8

Прометей: каменный век II

Рави Ивар
2. Прометей
Фантастика:
альтернативная история
7.40
рейтинг книги
Прометей: каменный век II

Цвет сверхдержавы - красный. Трилогия

Симонов Сергей
Цвет сверхдержавы - красный
Фантастика:
попаданцы
альтернативная история
8.06
рейтинг книги
Цвет сверхдержавы - красный. Трилогия

Болтливый мертвец

Фрай Макс
7. Лабиринты Ехо
Фантастика:
фэнтези
9.41
рейтинг книги
Болтливый мертвец

На границе империй. Том 9. Часть 2

INDIGO
15. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 2

Истребители. Трилогия

Поселягин Владимир Геннадьевич
Фантастика:
альтернативная история
7.30
рейтинг книги
Истребители. Трилогия

Лишняя дочь

Nata Zzika
Любовные романы:
любовно-фантастические романы
8.22
рейтинг книги
Лишняя дочь