1.47M
Категория: ПрограммированиеПрограммирование

Основы кибернетики и робототехники

1.

Основы кибернетики и робототехники
Лекция 7 + Лаба 7

2.

Массивы
Массивы (arrays) — именованный набор однотипных переменных, с
доступом к отдельным элементам по их индексу.
По сути это набор переменных, которые называются одним именем и
имеют личные номера. Для объявления массива достаточно
указать квадратные скобки после имени переменной с любым типом
данных.
Указать компилятору размер массива можно двумя способами: явным
числом в квадратных скобках, либо при объявлении записать в каждую
ячейку значение, тогда компилятор сам посчитает их количество.
Рассмотрим пример объявления массива разными способами:

3.

// указываем количество ячеек
int myInts[6];
// указываем содержимое ячеек, компилятор сам посчитает их
количество
int myPins[] = {2, 4, 8, 3, 6,};
// указываем и то и то, количество ячеек в [ ] должно совпадать с {
} или быть больше!
float Sens[3] = {0.2, 0.4, -8.5};
// храним символы
char message[6] = {'h', 'e', 'l', 'l', 'o'};

4.

Обращение к элементам
Обращение к элементу массива осуществляется точно так же, в квадратных скобках. Важно
помнить, что отсчёт в программировании начинается с нуля, и первый элемент массива
имеет номер 0 (ноль):
// первый элемент массива myInts равен 50
myInts[0] = 50;
// записать в ячейку 3 массива myPins
// значение элемента 0 массива myInts
myPins[3] = myInts[0];

5.

Длина массива в Ардуино
Для определения размера массива можно воспользоваться функцией sizeof(), которая вернёт размер
массива в количестве байтов. Зачем?
Допустим в программе массив задаётся без указания размера, но элементы задаются явно (в фигурных
скобках) и в процессе разработки программы размер массива может меняться. Чтобы не
пересчитывать размер вручную и не менять его везде в программе, можно использовать эту функцию.
Примечание: если размер массива неизвестен на момент компиляции программы – sizeof() не сможет
его посчитать и выдаст размер указателя (2 байта на AVR).
Ещё один момент: sizeof(имя_массива) даёт вес массива, а не количество элементов в нём! Если
массив состоит из элементов типа byte – его вес совпадёт с размером. В остальных случаях нужно
разделить вес массива на вес одного элемента, например так: sizeof(arr) / sizeof(arr[0]) – делим на вес
элемента, чтобы не привязываться к типам данных. Результат вычисляется на этапе компиляции и в
процессе работы программы время на вычисление не тратится.

6.

Разновидности массивов Ардуино
Одномерные – массивы, размерность которых представлена одним символом.
Многомерные – массивы, в которых каждый элемент может сам являться массивом.
В многомерных массивах имеется несколько индексов, для каждого из «подмассивов». Вот
примеры создания массивов разных размерностей:
int array1[10]; // одномерный массив из 10 элементов
int array2[10][2]; // двумерный массив из 10 элементов, каждый из которых
является массивом из 2 элементов.
int array3[10][2][5]; // многомерный массив из 10 элементов, каждый из
которых является массивом из 2 элементов, каждый из которых состоит из 5
элементов… в доме, которой построил Джек.

7.

Многомерные массивы полезны, если
нам нужно хранить вложенные структуры
данных. Например, текст состоит из
массива абзацев, каждый из которых
содержит массив строк, каждая из
которых содержит массив элементов типа
char.
Работа с массивами всегда требует особой внимательности от программиста.
Вы можете обратиться к несуществующему элементу массива, если неверно
зададите индекс.
Компилятор Arduino здесь не является надежным помощником, потому что не
сообщит вам об ошибке на этапе компиляции. Но во время исполнения
ошибка приведет к краху программы с сообщением о том, что индекс вышел
за пределы массива: Index Out Of Bound Exception.

8.

Примеры многомерных массивов
// двумерный массив, 5 строк 10 столбцов
byte myArray[5][10];
// матрица 3х4
byte myMatrix[][4] = {
{10, 11, 12, 13},
{14, 15, 16, 17},
{18, 19, 20, 21},
};
// матрица 2х3
byte myTable[][3] = {{10, 11, 12}, {13, 14, 15}};

9.

Массивы и FOR циклы
Чаще всего для перебора элементов цикла используется цикл for, счетчик
цикла используется как индекс для доступа к каждому элементу массива.
Например, для вывода массива через Serial порт можно использовать
следующий код:

10.

Библиотеки Arduino
Библиотеки – это готовые части программы, которые можно подключать к
любому Arduino-проекту, они помогают подключить разные компоненты,
например, датчики, индикаторы, двигатели, а также управлять портами,
памятью, математическими функциями.
Подключить библиотеки можно в начале кода с помощью директивы #include
(нужна для подключения и внесения в работу кода различных файлов).

11.

Ниже приведены подробные описания и примеры использования стандартных библиотек
Arduino.
• Serial — Библиотека для обмена данными через последовательный порт (UART).
• Servo — Библиотека для легкого и точного управления сервоприводами.
• Wire — Библиотека для работы с интерфейсами связи TWI/I2C. Упрощает обмен данными
с устройствами, датчиками и сенсорами.
• WiFi — Подключение к интернету с использованием WiFi шилда.
• TFT — Нужна для отрисовки текста, изображений и картинок на TFT дисплее Arduino.
• Stepper — Библиотека для управления шаговыми моторами.
• LiquidCrystal — Для работы Arduino с жидкокристаллическими экранами (LCD)
• Ethernet — Для подключения к интернету с использованием Arduino Ethernet shield.
• SD — Библиотека для записи и считывания информации с SD карт памяти.
• GSM — Библиотека для подключения Ардуино к GSM сети. Необходима для отправки и
получения SMS и звонков, а так же для выхода в интернет с помощью GPRS.
Используется с GSM shield.
• EEPROM — Библиотека для чтения и записи в энергонезависимую память Arduino.

12.

13.

Пьезоизлучатель
Пьезоизлучатель – это электроакустическое устройство, способное воспроизводить звук, либо излучать
ультразвук, благодаря обратному пьезоэлектрическому эффекту.
Пьезоизлучатель может называться по разному - пищалка, зумер, piezo buzzer или speaker. Суть одна издать звук.
Есть два вида - активный и пассивный. Они похожи и новичка ставят в тупик.

14.

Активный зумер может работать самостоятельно, достаточно просто подать питание. При подключении
следут следить за полярностью. На наклейке есть значок плюса (+).
У него есть две ножки, и, как правило, одна ножка длиннее другой. Длинная ножка - плюс, короткая минус. Соедините длинную ножку к питанию 5В, а короткую к земле, и вы услышите противный звук.
Пассивный зумер внешне похож, но всё-таки отличается немного. При подключении как из прошлого
примера с активным динамиком, вы ничего не услышите. Для пассивного зумера просто подать
питание не достаточно, нужно использовать программные методы, которые есть в составе Arduino.

15.

Задание 1.
Переходим к программной части. Активный зумер пищит громче и отчётливее, пассивный немного
грубовато. Самый простой способ - подать напряжение на нужный вывод.
Если собрать схему с предыдущего слайда, то звук будет постоянным, при написании данной программы,
звук будет прерывистым.

16.

Функция tone()
Генерировать звук в Ардуино можно многими способами. Самый простой — это использовать
функцию tone(). Поэтому, прежде всего, посмотрим как работает эта функция.
Функция tone() используется для генерации на выходе микроконтроллера ШИМ-сигнала с 50%
заполнением и с заданной частотой.
Воспроизводиться на Ардуино может одновременно только один сигнал. Если аудио сигнал
воспроизводится уже на каком то порту, то новый вызов функции tone() с номером другого
порта ни к чему не приведет. Если функция tone() Arduino будет вызвана с номером того же
порта, то будет воспроизводится сигнал с новой частотой. Т.е. воспроизводится может только
одна частота сигнала и на одном пине.

17.

Синтаксис
tone(pin, frequency)
tone(pin, frequency, duration)
Параметры:
pin — номер порта вход/выхода, на котором будет генерироваться сигнал
frequency — частота сигнала в Герцах
duration — длительность сигнала в миллисекундах
Функция tone, noTone использует аппаратный таймер, поэтому использовать в скетче ШИМ (PWM)
сигнал для пьезодинамика невозможно на портах выхода 3 и 11 (кроме платы Arduino Mega).
Генерация сигнала является полуаппаратной, то есть пин Ардуино включается/выключается по
прерыванию таймера (Timer 2), поэтому на высокой частоте звука, микроконтроллер может немного
притормаживать.

18.

Задание 2.
Дополните программу воспроизведением сигнала с частотами: 1915, 1700, 1519, 1432, 1275, 1136, 1014.
В конце выключите звук при помощи функции noTone();.

19.

Задание 3.
Одну ноту играть не интересно. Пусть будет массив из десяти нот.

20.

Задание 4.
Если управлять не только нотами, но и их
продолжительностью, то можно писать мелодии.
Говорят, следующая мелодия воспроизводит
"Имперский марш" из "Звёздных войн".

21.

Задание 5.
Итак, у нас есть пять подключенных к
ардуино светодиода и мы хотим
включать их и выключать используя
функцию random(). А также оформить
доступ к ним с помощью массива.

22.

Задание 6.
Объявление массива и использование цикла
для инициализации элементов массива.

23.

Задание 7.
Суммирование элементов двух массивов.
Создайте два массива, заполните их рандомными элементами. После чего сложите
эти два массива (т.е. первый элемент первого массива с первым элементом второго
массива и т.д.), записав суммы в третий массив. Выведите все три массива на экран,
как в прошлой задаче.
Задание 8.
Умножение и деление элементов двух массивов.
Создайте два массива, заполните их рандомными элементами. После чего
перемножьте эти два массива, записав суммы в третий массив. После чего поделите
эти два массива, записав суммы в четвертый массив. Выведите все четыре массива
на экран также в столбик.

24.

Создание двумерного массива.
Задание 9.
Создайте матрицу 5х5 и заполните ее рандомными значениями. После чего разделите каждый элемент
матрицы на 2 и запишите результат в новую матрицу. Используйте тип данных с плавающей точкой.
Задание 10.
Создайте матрицу 5х5 и заполните ее рандомными значениями. После чего найдите максимальный и
минимальный элемент матрицы.
English     Русский Правила