Файл: С чего начинаются роботы. О проекте Arduino для школьников (В.Н. Гололобов, 2011).pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 16.06.2025
Просмотров: 1229
Скачиваний: 3
Приложение А. О языке программирования Arduino
массивы
int myArray[ ] = {value0, value1, value2…}
Массив — это набор значений, к которым есть доступ через значение индекса. Любое значение в массиве может быть вызвано через вызов имени массива и индекса значения. Индексы в массиве начинаются с нуля с первым значением, имеющим индекс 0. Массив нуждается в объявлении, а дополнительно может заполняться значениями до того, как будет использоваться.
Схожим образом можно объявлять массив, указав его тип и размер, а позже присваивать значения по позиции индекса:
int myArray [5]; // объявляет массив целых длиной в 6 позиций myArray[3] = 10; // присваивает по 4у индексу значение 10
Чтобы извлечь значение из массива, присвоим переменной значение по индексу массива:
x = myArray[3]; // x теперь равно 10
Массивы часто используются в цикле for, где увеличивающийся счѐтчик применяется для индексации позиции каждого значения. Следующий пример использует массив для мерцания светодиода. Используемый цикл for со счѐтчиком, начинающимся с 0, записывает значение из позиции с индексом 0 массива flicker[], в данном случае 180, на PWM-вывод (широтно-импульсная модуляция) 10; затем пауза в 200 ms, а затем переход к следующей позиции индекса.
int ledPin = 10; // LED на выводе 10 byte flicker[ ] = {180, 30, 255, 200, 10, 90, 150, 60};
// выше массив из 8 // разных значений
// задаѐм OUTPUT вывод
for (int i = 0; i < 7; i++) |
// цикл равен числу |
{ |
// значений в массиве |
analogWrite(ledPin, flicker[i];// пишем значение по индексу
delay(200); |
// пауза 200 мС |
} |
}
переменные | 133
Приложение А. О языке программирования Arduino
арифметика
Арифметические операции включают сложение, вычитание, умножение и деление. Они возвращают сумму, разность, произведение или частное (соответственно) двух операндов.
y = y + 3; x = x – 7; i = j * 6; r = r / 5;
Операция управляется используемым типом данных операндов, так что, например, 9/4 даѐт 2 вместо 2.25, поскольку 9 и 4 имеют тип int и не могут использовать десятичную точку. Это также означает, что операция может вызвать переполнение, если результат больше, чем может храниться в данном типе.
Если используются операнды разного типа, то для расчѐтов используется больший тип. Например, если одно из чисел (операндов) типа float, а второе целое, то для вычислений используется тип с плавающей точкой.
Выбирайте типы переменных достаточные для хранения результатов ваших вычислений. Прикиньте, в какой точке ваша переменная переполнится, а также, что случится в другом направлении, то есть, (0-1) или (0- -32768). Для вычислений, требующих дробей, используйте переменные типа float, но остерегайтесь их недостатков: большой размер и маленькая скорость вычислений.
Примечание: Используйте оператор приведения типа (нзвание типа) для округления, то есть, (int)myFloat - для преобразования переменной одного типа в другой «на лету». Например, i = (int) 3.6 - поместит в i значение 3.
смешанное присваивание
Смешанное присваивание сочетает арифметические операции с операциями присваивания. Чаще всего встречается в цикле for, который описан ниже. Наиболее общее смешанное присваивание включает:
x ++ |
// то же, что x = x + 1, или увеличение x на +1 |
x -- |
// то же, что x = x - 1, или уменьшение x на -1 |
x += y |
// то же, что x = x + y, или увеличение x на +y |
x -= y |
// то же, что x = x - y, или уменьшение x на -y |
x *= y |
// то же, что x = x * y, или умножение x на y |
x /= y |
// то же, что x = x / y, или деление x на y |
Примечание: Например, x *= 3 утроит старое значение x и присвоит полученный результат x.
арифметика | 134
Приложение А. О языке программирования Arduino
операторы сравнения
Сравнения одной переменной или константы с другой используются в выражении для if, чтобы проверить истинность заданного условия. В примерах на следующих страницах ?? используется для обозначения любого из следующих условий:
x == y |
// x равно y |
x != y |
// x не равно y |
x < y |
// x меньше, чем y |
x > y |
// x больше, чем y |
x <= y |
// x меньше, чем или равно y |
x >= y |
// x больше, чем или равно y |
логические операторы
Логические операторы, чаще всего, это способ сравнить два выражения и вернуть ИСТИНА или ЛОЖЬ, в зависимости от оператора. Есть три логических оператора: AND, OR и NOT, часто используемые в конструкциях if:
Logical AND:
if (x > 0 && x < 5) // true, только если оба
// выражения true
Logical OR:
if (x > 0 || y > 0) // true, если любое из
// выражений true
Logical NOT:
if (!x > 0) // true, если только
// выражение false
арифметика | 135
Приложение А. О языке программирования Arduino
константы
Язык Arduino имеет несколько предопределѐнных величин, называемых константами. Они используются, чтобы сделать программу удобной для чтения. Константы собраны в группы.
true/false
Это Булевы константы, определяющие логические уровни. FALSE легко определяется как 0 (ноль), а TRUE, как 1, но может быть и чем-то другим, отличным от нуля. Так что в Булевом смысле -1, 2 и 200 — это всѐ тоже определяется как TRUE.
if (b == TRUE)
{
что-нибудь сделаем;
}
high/low
Эти константы определяют уровень выводов как HIGH или LOW и используются при чтении или записи на логические выводы. HIGH определяется как логический уровень 1, ON или 5 вольт(3-5), тогда как LOW — 0, OFF или 0 вольт(0-2).
digitalWrite(13, HIGH);
input/output
Константы используются с функцией pinMode() для задания режима работы цифровых выводов: либо как INPUT (вход), либо как OUTPUT (выход).
pinMode (13, OUTPUT);
константы | 136
Приложение А. О языке программирования Arduino
управление программой
if
Конструкция if проверяет, будет ли выполнено некое условие, такое, как, например, будет ли аналоговое значение больше заданного числа, и выполняет какое-то выражение в скобках, если это условие true (истинно). Если нет, то выражение в скобках будет пропущено. Формат для if следующий:
if (someVariable ?? value)
{
что-нибудь сделаем;
}
Пример выше сравнивает someVariable со значением (value), которое может быть и переменной, и константой. Если выражение или условие в скобках истинно, выполняется выражение в фигурных скобках. Если нет, выражение в фигурных скобках пропускается, и программа выполняется с оператора, следующего за скобками.
Примечание: Остерегайтесь случайного использования «=», как в if (x = 10), что технически правильно, определяя x равным 10, но результат этого всегда true. Вместо этого используйте «==», как в if (x == 10), что осуществляет проверку значения x — равно ли оно 10 или нет. Запомните «=» - равно, а «==» - равно ли?
управление программой | 137
Приложение А. О языке программирования Arduino
if...else
Конструкция if...else позволяет сделать выбор «либо, либо». Например, если вы хотите проверить цифровой вход и выполнить что-то, если он HIGH, или выполнить что-то другое, если он был LOW, вы должны записать следующее:
if (inputPin == HIGH)
{
делаемА;
}
else
{
делаемБ;
}
else может также предшествовать другой проверке if так, что эти множественные, взаимоисключающие проверки могут запускаться одновременно. И возможно даже неограниченное количество подобных else переходов. Хотя следует помнить, что только один набор выражений будет выполнен в зависимости от результата проверки:
if (inputPin < 500)
{
делаемА;
}
else if (inputPin >= 1000)
{
делаемБ;
}
else
{
делаемВ;
}
Примечание: Конструкция if просто проверяет, будет ли выражение в круглых скобках истинно или ложно. Это выражение может быть любым правильным, относительно языка Си, выражением, как в первом примере if (inputPin == HIGH). В этом примере if проверяет только то, что означенный вход в состоянии высокого логического уровня или действительно ли напряжение на нѐм 5 вольт.
управление программой | 138
Приложение А. О языке программирования Arduino
for
Конструкция for используется для повторения блока выражений, заключѐнных в фигурные скобки заданное число раз. Наращиваемый счѐтчик часто используется для увеличения и прекращения цикла. Есть три части, разделѐнные точкой с запятой, в заголовке цикла for:
for (инициализация; условие; выражение)
{
что-нибудь делаем;
}
«Инициализация» локальной переменной, или счѐтчика, имеет место в самом начале и происходит только один раз. При каждом проходе цикла проверяется «условие». Если условие остаѐтся истинным, то следующее выражение и блок выполняются, а условие проверяется вновь. Когда условие становится ложным, цикл завершается.
Следующий пример начинается с целого i равного 0, проверяет, остаѐтся ли i ещѐ меньше 20, и, если так, увеличивает i на 1 и выполняет блок в фигурных скобках:
for (int i = 0; i < 20; i++) |
// декларируем i, проверяем, меньше ли оно |
// чем 20, увеличиваем i на 1 |
|
{ |
|
digitalWrite (13, HIGH); |
// устанавливаем вывод 13 в ON |
delay (250); |
// пауза в ¼ секунды |
digitalWrite (13, LOW); |
// сбрасываем вывод 13 в OFF |
delay (250); |
// пауза в ¼ секунды |
} |
Примечание: В Си цикл for более гибок, чем это можно обнаружить в других языках программирования, включая Basic. Любые или все три элемента заголовка могут быть опущены, хотя точка с запятой требуется. Также выражения для инициализации, условия и выражения могут быть любыми правильными выражениями Си с несвязанными переменными. Такие необычные типы выражений могут помочь в решении некоторых редких программных проблем.
управление программой | 139
Приложение А. О языке программирования Arduino
while
Цикл while продолжается, и может продолжаться бесконечно, пока выражение в скобках не станет false (ложно). Что-то должно менять проверяемую переменную, иначе из цикла никогда не выйти. И это должно быть в вашем коде, как, скажем, увеличение переменной, или внешнее условие, как, например, проверяемый сенсор.
while (someVariable ?? value)
{
что-нибудь делаем;
}
Следующий пример проверяет, будет ли someVariable меньше 200, и если да, то выполняются выражения в фигурных скобках, и цикл продолжается, пока someVariable остаѐтся меньше 200.
while (someVariable < 200) // проверяем, меньше ли 200 переменная
{
что-нибудь делаем; // выполняем операции в скобках someVariable++; // увеличиваем переменную на 1
}
do...while
Цикл do управляемый «снизу» цикл, работающий на манер цикла while, с тем отличием, что условие проверки расположено в конце цикла, таким образом, цикл выполнится хотя бы один раз.
do
{
что-нибудь делаем;
} while (someVariable ?? value);
Следующий пример присваивает readSensor переменной x, делает паузу на 50 миллисекунд, затем цикл выполняется, пока x меньше, чем 100.
do |
|
{ |
|
x = readSensors(); |
// присваиваем значение |
// readSensors() переменной x |
|
delay (50); |
// пауза 50 миллисекунд |
} while (x < 100); |
// продолжение цикла, если x меньше 100 |
управление программой | 140
Приложение А. О языке программирования Arduino
цифровой ввод/вывод
pinMode (pin, mode)
Используется в void setup () для конфигурации заданного вывода, чтобы он работал на вход (INPUT) или на выход (OUTPUT).
pinMode (pin, OUTPUT); // устанавливаем ‘pin’ на выход
Цифровые выводы в Arduino предустановлены на вход, так что их нет нужды явно объявлять как INPUT с помощью pinMode (). Выводы, сконфигурированные как INPUT, подразумеваются в состоянии с высоким импедансом (сопротивлением).
В микроконтроллере Atmega, есть также удобные, программно доступные подтягивающие резисторы 20 кОм. Эти встроенные подтягивающие резисторы доступны следующим образом:
pinMode (pin, INPUT); // настраиваем ‘pin’ на вход
digitalWrite (pin, HIGH); // включаем подтягивающие резисторы
Подтягивающие резисторы, как правило, используются при соединении входов с переключателями. Заметьте, что в примере выше нет преобразования pin на выход, это просто метод активизации встроенных подтягивающих резисторов.
Выводы, сконфигурированные как OUTPUT, находятся в низкоимпедансном состоянии и могут отдавать 40 мА в нагрузку (цепь, другое устройство). Это достаточный ток для яркого включения светодиода (не забудьте последовательный токоограничительный резистор!), но не достаточный для включения реле, соленоидов или моторов.
Короткое замыкание выводов Arduino или слишком большой ток могут повредить выходы или даже всю микросхему Atmega. Порой, не плохая идея — соединять OUTPUT вывод через последовательно включѐнный резистор в 470 Ом или 1 кОм.
цифровой ввод/вывод | 141
Приложение А. О языке программирования Arduino
digitalRead (pin)
Считывает значение заданного цифрового вывода (pin) и возвращает результат HIGH или LOW. Вывод должен быть задан либо как переменная, либо как константа (0-13).
value = digitalRead (Pin); // задаѐм 'value' равным
// входному выводу ‘Pin’
digitalWrite (pin, value)
Выводит либо логический уровень HIGH, либо LOW (включает или выключает) на заданном цифровом выводе pin. Вывод может быть задан либо как переменная, либо как константа (0-13).
digitalWrite (pin, HIGH); // устанавливаем ‘pin’ в высокое состояние
Следующий пример читает состояние кнопки, соединѐнной с цифровым входом, и включает LED (светодиод), подключѐнный к цифровому выходу, когда кнопка нажата:
int led = 13; // соединяем LED с выводом 13 int pin = 7; // соединяем кнопку с выводом 7
int value = 0; // переменная для хранения прочитанного значения
void setup () |
|
{ |
|
pinMode (led, OUTPUT); |
// задаѐм вывод 13 как выход |
pinMode (pin, INPUT); |
// задаѐм вывод 7 как вход |
} |
|
void loop() |
|
{ |
|
value = digitalRead (pin); |
// задаѐм ‘value’ равной |
// входному выводу |
|
digitalWrite (led, value); |
// устанавливаем ‘led’ в |
// в значение кнопки |
|
} |
цифровой ввод/вывод | 142