Отображаемый в углу “COM7” - это и есть тот самый порт, через который Windows “общается” с Arduino. Его несложно использовать в различных программах, например передавать с платы на компьютер значения датчика температуры. Но не менее важная функция - это вывод значений переменных, что позволяет проверить правильность работы программы. Этот процесс называется “отладка” или “debugging”, что переводится как “поиск жучков”. Самые первые компьютеры тоже работали в двоичной системе счисления, но вместо транзисторов, имели механические реле. По легенде, бабочка попала в такое реле, из-за чего контакты перестали замыкаться, и разумеется, программа стала работать неправильно. Много лет прошло, и компьютеры уже давно не механические, а название так и осталось (подробнее можно прочитать в Википедии).
Рассмотрим вывод данных в порт из программы:
void setup() {
// Открыть порт на нужной скорости
Serial.begin(9600);
}
void loop() {
for(int x=0; x< 64; x++) {
// Вывод числа в разных форматах:
Serial.print(x);
Serial.print("\t");
Serial.print(x, DEC);
Serial.print("\t");
Serial.print(x, HEX);
Serial.print("\t");
Serial.println(x, BIN);
delay(200);
}
Serial.println();
}
Рассмотрим код программы подробнее.
Скорость порта. Она задается в функции setup(). Для того, чтобы два устройства обменивались данными между собой, данные должны передаваться на одинаковой скорости. Скорость измеряется в
Что будет если установить неправильную скорость? Ничего хорошего - система не знает, какой скорость должна быть, так что вместо данных мы получим просто мусор. Последовательный протокол - это одна из самых простых систем передачи данных, и какой-либо защиты или автоматического определения параметров тут нет, пользователь должен настроить все параметры самостоятельно.
Собственно, вывод данных, реализуется с помощью функции Serial.print. Тут все просто, функция посылает данные “как есть”, причем можно послать как текстовую строку, так и значение числовой переменной. Также для удобства чтения можно использовать вариант функции println - она делает так называемый “возврат каретки” (CR, carriage return), устаревший термин, обозначающий перевод курсора на новую строку. Как можно видеть в коде, число можно вывести в разных системах счисления - десятичной, 16-ричной, двоичной. Знак “табуляции” - "\t" вставляет отступ между числами, что также делает чтение более удобным.
Наконец, программа готова, загружаем ее в Arduino. Мы видим как светодиод на плате начинает мигать - Arduino передает данные в порт. Чтобы увидеть их, выбираем в Arduino IDE пункт меню Serial Monitor и видим наши данные.
Для опыта можно попробовать выбрать другую скорость приема - мы увидим, что вместо данных на экране появляются нечитаемые символы.
2.5 Ввод данных: определяем нажатие кнопки
Сложно найти хоть какое-либо электронное устройство, совсем не имеющее кнопок. Кнопки несложно подключить и к Arduino - любой вход микроконтроллера может работать не только как “выход”, но и как “вход”.
Сначала, кнопку надо подключить, как показано на схеме:
На макетной плате это может выглядеть примерно так:
Принцип работы схемы прост. Когда кнопка не нажата, вход Arduino подключен через резистор к линии “питания”, +5В, что соответствует логической единице. Если пользователь нажимает кнопку, напряжение на входе становится равным нулю.
Резистор - важный компонент схемы. Если бы его не было, при отпущенной кнопке значение входа было бы неопределенным - вход Arduino ни к чему был бы не подключен. Точное значение резистора кстати, не столь важно, оно может быть и 1КОм, и 5КОм, и 10КОм. Такой резистор называется “подтягивающим” (pull up), т.к. он соединяет (подтягивает) вход к напряжению питания. Можно кстати, сделать и наоборот - резистор соединить с “землей”, а кнопку замыкать на питание. Такая схема называется pull down. Очевидно, что во втором случае при отпущенной кнопке напряжение будет равно нулю.
Теперь, когда мы собрали схему и разобрались с ней, напишем программу, читающую значение кнопки. Для наглядности, будем зажигать светодиод, когда кнопка нажата:
int buttonPin = 2;
int ledPin = 13;
void setup() {
// Вывод настроен как “выход”
pinMode(ledPin, OUTPUT);
// Вывод настроен как “вход”
pinMode(buttonPin, INPUT);
}
void loop() {
// Читаем состояние вывода:
int buttonState = digitalRead(buttonPin);
// Устанавливаем состояние светодиода:
if (buttonState == HIGH) {
// LED off
digitalWrite(ledPin, LOW);
} else {
// LED on
digitalWrite(ledPin, HIGH);
}
}