соединяться с цифровыми выходами других модулей, которые действуют не так, как выключатель, но устанавливают те же уровни напряжения HIGH и LOW. В таких случаях функции pinMode следует передавать аргумент INPUT вместо INPUT_PULLUP.

Цифровые выходы

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

Настройка контактов на работу в режиме цифровых выходов осуществляется в функции setup с помощью следующей команды:

pinMode(outputPin, OUTPUT);

Чтобы на цифровом выходе установить уровень напряжения HIGH или LOW, нужно вызывать команду digitalWrite:

digitalWrite(outputPin, HIGH);

Монитор последовательного порта

Так как плата Arduino подключается к компьютеру через порт USB, есть возможность пересылать сообщения между ними, используя компонент Arduino IDE, который называется монитором последовательного порта (Serial Monitor). Для иллюстрации изменим скетч 01_03 так, чтобы вместо изменения частоты мигания светодиода после установки уровня напряжения LOW на цифровом входе 7 он посылал сообщение.

Загрузите следующий скетч:

// sketch 01_04_serial

int switchPin = 7;

void setup()

{

  pinMode(switchPin, INPUT_PULLUP);

  Serial.begin(9600);

}

void loop()

{

  if (digitalRead(switchPin) == LOW)

  {

    Serial.println("Paperclip connected");

  }

  else

  {

    Serial.println("Paperclip NOT connected");

  }

  delay(1000);

}

Теперь откройте монитор последовательного порта в Arduino IDE, щелкнув на кнопке с изображением, напоминающим лупу. Вы сразу же должны увидеть несколько сообщений, появляющихся одно за другим (рис. 1.14).

Рис. 1.14. Монитор последовательного порта

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

Так как встроенный светодиод в этом скетче не используется, отпала и необходимость в переменной ledPin. Зато появилась новая команда Serial.begin, запускающая обмен сообщениями через последовательный порт. Ее параметр определяет скорость передачи. Подробнее о взаимодействиях через последовательный порт рассказывается в главе 13.

Чтобы записать сообщение в монитор порта, достаточно выполнить коман­ду Serial.println.

В данном примере Arduino посылает сообщения в монитор последовательного порта.

Массивы и строки

Массивы предназначены для хранения списков значений. Переменные, которые нам встречались до сих пор, могли хранить только одно значение, обычно типа int. Массив, напротив, может хранить список значений и позволяет обращаться к отдельным значениям по их позициям в списке.

В C, как и в большинстве других языков программирования, нумерация позиций в массиве начинается с 0, а не с 1. Это означает, что первый элемент фактически является нулевым элементом.

Мы уже сталкивались с одной из разновидностей массивов в предыдущем разделе, где знакомились с монитором последовательного порта. Сообщения, такие как «Paperclip NOT connected» (скрепка не замыкает контакты), называют массивами символов, потому что фактически они являются коллекциями символов.

Например, научим Arduino посылать в монитор порта всякую чепуху.

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

// sketch 01_05_gibberish

char* messages[] = {

               "My name is Arduino",

               "Buy books by Simon Monk",

               "Make something cool with me",

               "Raspberry Pis are fruity"};

void setup()

{

  Serial.begin(9600);

}

void loop()

{

  int delayPeriod = random(2000, 8000);

  delay(delayPeriod);

  int messageIndex = random(4);

  Serial.println(messages[messageIndex]);

}

Все сообщения, или строки, как часто называют коллекции символов, имеют тип char*. Символ звездочки (*) говорит о том, что это указатель на что-то. Подробнее об указателях будет рассказываться в главе 6. Квадратные скобки ([]) в конце объявления переменной указывают, что данная переменная хранит массив данных типа char*, а не единственное значение char*.

Внутри функции loop переменной delayPeriod присваивается случайное значение из диапазона от 2000 до 7999 (второй аргумент random не входит в диапазон). Затем вызовом функции delay выполняется пауза, продолжительность которой равна полученному промежутку.

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

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

Аналоговые входы

Контакты с метками от A0 до A5 на плате Arduino можно использовать для измерения приложенного к ним напряжения. Уровень напряжения должен находиться в диапазоне от 0 до 5 В. Измерение выполняется с помощью встроенной функции analogRead, которая возвращает значение в диапазоне от 0 до 1023: значение 0 соответствует напряжению 0 В, а значение 1023 — напряжению 5 В. То есть, чтобы преобразовать число в значение, находящееся в диапазоне от 0 до 5, нужно разделить полученное число на 5: 1023/5 = 204,6.

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

Загрузите следующий скетч в плату Arduino и затем замкните скрепкой контакты A0 и 3.3V (рис. 1.15).

Рис. 1.15. Соединение контактов A0 и 3.3V

// sketch 01_06_analog

int analogPin = A0;

void setup()

{

  Serial.begin(9600);

}

void loop()

{

  int rawReading = analogRead(analogPin);

  float volts = rawReading / 204.6;

  Serial.println(volts);

  delay(1000);

}

Откройте монитор последовательного порта, и вы должны увидеть поток чисел (рис. 1.16). Числа должны быть близки к значению 3,3.

Рис. 1.16. Вывод значений напряжения

ВНИМАНИЕ

Не замыкайте между собой контакты электропитания (5V, 3.3V и GND). Это может привести к выходу из строя платы Arduino, а может быть, и компьютера.

Если теперь один конец скрепки оставить соединенным с контактом A0, а другой подключить к контакту 5V, числа в мониторе изменятся и будут близки к 5 В. Теперь соедините контакт A0 с контактом GND, и вы увидите числа 0 В.

Аналоговые выходы

Плата Arduino Uno не имеет настоящих аналоговых выходов (такие выходы вы найдете на плате Arduino Due), но она имеет несколько выходов с широтно-импульсной модуляцией

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату