Графики, случайные числа, условия

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

Статья включает в себя умение комбинировать условия и случайные цифры. Мы также покажем, насколько просто представить информацию, поступающую на ПК, в виде графика!

Arduino — построение графиков

Конечно, IDE Arduino со временем меняется. Теперь там есть очень удобная опция, позволяющая быстро строить графики по информации, отправляемой по UART.

Чтобы иметь возможность использовать этот инструмент, нам нужна новая версия Arduino IDE, если вы установили ее недавно, то в меню инструментов вы должны будете увидеть опции Монитор порта и Плоттер по последовательному соединению.

Монитор и плоттер
Нужные нам опции в меню Arduino IDE

Если вы видите только одну опцию, то обновите свою IDE до новой версии. Последняя версия программы, конечно же, доступна бесплатно на сайте проекта Ардуино.

Чтобы построить график, нам нужно через равные промежутки времени посылать на компьютер числа, каждое число в новой строке. Сначала соберем схему, которая будет строить диаграмму напряжения, измеренного на входе A5, к которому мы подключим потенциометр в качестве делителя напряжения.

Схема подключения будет выглядеть так:

Потенциометр подключен к A5
Потенциометр подключен к A5

Программа, отправляющая данные на терминал, будет выглядеть так:

Используя опцию «Монитор порта» и поворачивая ручку потенциометра, мы увидим следующее:

Изменение напряжения на А5
Изменение напряжения на А5

Немного не понятно, правда? Однако достаточно включить вторую опцию, т.е. «Плоттер по последовательному соединению», и мы увидим все происходящее гораздо более четко. График покажет измерения, при изменении настроек потенциометра:

График измерения напряжения на A5
График измерения напряжения на A5

Так теперь намного понятнее? Когда применяют графики на практике? Конечно тогда, когда мы используем датчики (расстояния, температуры и т.д.). В предыдущей статье мы рассмотрели датчик расстояния HC-SR04, а это значит, что мы попробуем построить график измеренного расстояния!

Arduino — график расстояний до препятствий

Для этого вернемся к схеме сборки из предыдущей статьи:

Принципиальная схема сборки
Схема подключения датчика расстояния

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

Пришло время запустить инструмент для построения графиков. Здесь может быть по-разному, иногда  работает, а иногда нет. Почему?

Мы всегда рискуем наткнуться на какие-то помехи при использовании таких датчиков.

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

Такого, в принципе, не может быть, особенно, если производитель указал максимальное измерение расстояния в 400 см.
Неверное показание датчика
Неверное показание датчика

Помехи привели к автоматическому выбору шкалы на графике, а это затрудняет последующее считывание правильных результатов. Как мы можем это исправить? Желательно программно. Добавим простое условие, которое будет проверять, какое значение мы отправляем на компьютер. Это будет выглядеть так:

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

Теперь график будет показывать правильно:

Правильный график работы датчика
Правильный график работы датчика

Во время записи измерений мы быстро переместили препятствие перед датчиком. Как видите, наше ограничение несколько раз спасало нас от ошибок измерения. Кстати, стоит обратить внимание на то, как построение графика позволяет легче заметить проблемы с качеством показаний с датчика! Например: если вы видите относительно высокие значения шума, значит показания датчика нестабильны.

Читать также:  Комплект для тренировки реакции своими руками

Arduino — график нескольких значений

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

На практике код будет выглядеть так:

После подстановки случайных значений график будет выглядеть следующим образом:

Схема сборки для работы с логическими операторами
Схема сборки для работы с логическими операторами

Графики также могут быть особенно полезны при использовании датчиков расстояния или положения. Здесь мы построили график для нескольких значений одновременно:

График изменения положения
График изменения положения

Домашнее задание 9.1

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

Arduino — случайные числа

Иногда бывают моменты, когда нам нужно, чтобы программа работала «непредсказуемо». Например. Робот, поворачивающийся в любую сторону при обнаружении препятствия, или простая игра, в которой компьютер выполняет свое непредсказуемое действие. В предыдущем примере мы использовали именно такие значения, для одновременной демонстрации разных данных на одном графике.

Выбор случайного числа
Выбор случайного числа компьютером, похож на игру в кости

Нам пригодится функция, возвращающая случайное значение. Однако, честно говоря, эта цифра не будет полностью непредсказуемой. Поэтому в случае компьютеров / микроконтроллеров мы говорим о псевдослучайных числах. Это довольно сложная тема, и мы не будем сейчас ею заниматься.

Однако стоит помнить, что значения, рандомизированные компьютером, не являются абсолютно случайными с точки зрения статистики.

Функция random () отвечает за возврат случайного значения, которая может принимать два аргумента. Благодаря этому мы формируем диапазон чисел. На практике мы чаще всего используем функцию одним из двух способов. Дан только верхний диапазон:

Тогда возвращаемое значение будет числом от 0 до числа на единицу меньше, чем число в круглых скобках. Мы также можем влиять на нижнюю границу диапазона. Для этого просто добавьте второй аргумент:

Помните! Максимальное выпавшее число всегда будет на 1 меньше указанного нами верхнего диапазона!

Пришло время опробовать эту функцию на практике. Для этого напишем самую банальную программу. Ее задача — отображать в терминале числа с интервалом в 1 секунду (опция «Монитор порта» в меню «Инструменты»):

Давай проверим:

Результат первого запуска программы
Результат первого запуска программы случайных чисел

Нам нужны были случайные числа, и мы их получили. Теперь давайте запустим загруженную программу еще несколько раз. Как и ожидалось, случайные числа должны каждый раз отличаться, верно?

Второй запуск программы Третий запуск программы Четвертый запуск программы
Второй запуск программы Третий запуск программы Четвертый запуск программы

К сожалению, каждый раз мы получаем одни и те же строки. Как мы уже писали, «случайность» возвращаемых чисел одинакова. Микроконтроллер на плате Arduino — это очень точная схема, в нем нет случайных значений.

Как вы можете догадаться, Arduino генерирует случайные числа, выполняя определенные операции с ранее показанным значением.

Следовательно, одно и то же действие, делает последовательные числа идентичными.

Чтобы улучшить работу алгоритма рандомизации, лучше всего начинать с другого значения в качестве первого начального значения перед каждым запуском.

Это число, из которого генерируются следующие, называется seed. Для нас самое главное, что в языке Arduino тоже есть такое понятие. Программу напишем с помощью функции:

Читать также:  Библиотеки Ардуино

В его аргументе, отмеченном здесь как start_value, вы должны каждый раз вводить случайное значение. Чтобы отображать числа, нам понадобится случайное значение. У вас есть идеи, как это сделать? Если нет, прочтите статью об АЦП в Arduino.

Чтобы наша Arduino могла использовать «более случайные» числа, мы можем кое-что изменить в начале:

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

Конечно, это будет работать лучше всего, если вход A0 не используется в качестве стандартного ввода / вывода.

Давайте быстро усовершенствуем нашу программу и проверим ее на практике:

С этого момента, каждый раз при запуске, мы будем получать разные значения:

Первый запуск Второй запуск Третий запуск
Первый запуск Второй запуск Третий запуск

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

Домашнее задание 9.2

Проверьте, что произойдет, если вместо показания, считываемого с аналогового входа, мы введем туда постоянное значение. Как тогда будет себя вести генератор псевдослучайных чисел?

Домашнее задание 9.3

Напишите программу, которая будет работать по типу игровых костей. Подключите кнопку к Arduino. Каждое нажатие на нее должно отправлять на компьютер случайно выбранное значение (через UART) — конечно, в диапазоне от 1 до 6.

Случайное мигание светодиода

Давайте воспользуемся полученными знаниями, чтобы написать программу, которая будет случайным образом мигать светодиодом, встроенным в Arduino. Предположим, что длина свечения составляет примерно от 100 до 990 мс. Однако время выключения светодиода будет в пределах 50-490мс. Оба значения должны изменяться с интервалом в 10 мс.

Для этого нам понадобятся два случайных значения:

Мы могли бы вставить случайно выбранные значения в функцию задержки delay, но тогда задержка могла бы принимать значения, например, от 100 до 999. Как это исправить?

Все, что нам нужно сделать, это рандомизировать значения в 10 раз меньше и умножить их на 10, прежде чем подставлять их в функцию задержки:

Теперь эти значения можно подставить в программу:

На практике светодиод мигает так, как мы и хотели, т.е. совершенно случайным образом!

Случайное мигание светодиода
Случайное мигание светодиодом

Конкатенация условных операторов

Уже в самом начале наших статей, посвященных Arduino, мы имели дело с условными инструкциями, которые используются для управления работой программы в зависимости от определенной информации. Чаще всего мы проверяли только одно условие, например: «Была ли нажата кнопка?». В программе это выглядело так:

На практике часто бывает, что мы хотим проверить два условия одновременно. Самый простой пример — проверить, нажал ли пользователь более одной кнопки.

Конечно, это можно сделать так:

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

  1. Логический продукт — &&
  2. Логическая сумма — ||

Мы воспользуемся первым из них, когда захотим проверить:

первое условие i второе условие выполняются,
если (condition1 == 1 && condition2 == 1)

Второй используется для проверки:

выполняется либо первое условие, lub второе условие (или оба)
if (condition1 == 1 || condition2 == 1)

Сочетание условий на практике

Для этого подключите к Arduino два светодиода (зеленый и красный) и две кнопки. Схема сборки следующая:

Схема сборки для работы с логическими операторами
Схема сборки для работы с логическими операторами

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

Читать также:  Робот для стирания с магнитной доски

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

Наша программа проверяет выполнение хотя бы одного условия. Соответственно, светодиод также загорится при одновременном нажатии обеих кнопок.

Немного расширим программу и добавим отдельное условие, которое будет включать красный светодиод только при одновременном нажатии обеих кнопок:

Проверьте самостоятельно работу финальной версии программы.

Практический пример — датчик расстояния

Теперь попробуем заняться чем-нибудь более практичным. Подключите кнопку, датчик расстояния и зуммер к Arduino. Схема издаст звуковой сигнал, когда препятствие будет находится между 20 и 40 см или при нажатии кнопки.

Для работы сначала собираем необходимую схему. Чтобы немного усложнить задачу, вместо схемы сборки мы приведем список подключений + подтверждающее фото. Каждый из вас должен уметь собрать такую схему самостоятельно:

  • trigPin датчик расстояния к контакту № 12
  • echoPin датчика расстояния к штырю No 9
  • зуммер для контакта № 11
  • кнопка для штифта No 10

Конечно, вы должны дополнительно подключить источник питания Vcc (положительная шина) к датчику расстояния и заземление к зуммеру, кнопке и, конечно, также к датчику. На практике это выглядит так:

Схема для проверки связи условий
Схема для проверки связи условий на практике

Пора писать программу. Мы уже можем считывать расстояние, и проверка статуса кнопки для нас больше не проблема. Поэтому остановимся на анализе состояния. Как мы уже писали, мы хотим включить зуммер, когда расстояние чтения находится в диапазоне от 20 до 40 см.

Для этого нам нужно проверить, является ли считываемое значение больше 20 и меньше 40 см одновременно. Сделаем это, но при одном условии:

Теперь пора заняться кнопкой. Конечно, мы можем разбить это на два отдельных условия:

Но зачем? Мы не должны дублировать одни и те же фрагменты кода, когда нам это не нужно. В этом случае нет необходимости повторно управлять включением и выключением зуммера. Разве мы не можем объединить условие в одно? Конечно можем!

Мы проверим:

(измеренное расстояние больше 20 i (и)меньше 40) lub (или) (была ли нажата кнопка)

В переводе на компьютерно-читаемый язык это будет:

Таким образом, вся программа выглядит так:

На практике программа работает именно так, как предполагалось. зуммер издает звуковой сигнал, когда препятствие находится на нужном расстоянии или когда нажимается кнопка:

Зуммер издает звуковой сигнал

Помните предыдущие графики, построенные по показаниям этого датчика? Именно из-за этих глюков / пиков мы иногда слышим слабые звуковые сигналы. Конечно, вы можете фильтровать их программно, но мы еще вернемся к этому когда-нибудь!

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

Домашнее задание 9.4

Напишите программы, которые рандомизируют число в диапазоне 0-100, а затем проверяют полученное значение:

  • менее 10 или более 90
  • больше 50, но не в диапазоне 70-85
  • равно 50, 40, 30 или 20
  • колеблется от 10 до 40 или от 60 до 100

В каждом случае отображайте на ПК число и информацию о том, соответствует ли оно условию.

Вывод

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

С Уважением, МониторБанк

Добавить комментарий