Привет! Сегодня еще один урок. Мы уже рассмотрели много разных ситуаций работы с Ардуино. И в одном из предыдущих уроков научились записывать данные из программы в последовательный порт, чтобы следить за выполнением программы. Теперь рассмотрим чтение данных из последовательного порта, чтобы управлять программой и схемой с его помощью.
Зачем это может понадобиться? Конечно, для управления вашим устройством через компьютер или любое другое подключенное устройство ввода, которое поддерживает передачу данных через COM порт.
Содержание
- Для выполнения этого урока нам понадобятся
- Serial.read()
- Serial.available()
- Serial.readString()
- Serial.parseInt()
- Программа
- Полный текст программы
- Заключение
Статью про запись данных в последовательный порт для отладки программы, вы можете найти по ссылке ниже. Пожалуйста, посмотрите ее, если пропустили или уже забыли о чем речь.
Cервопривод. Датчики. Ардуино
Для выполнения этого урока нам понадобятся
- Ардуино UNO
- Макетная плата
- Перемычки
- Сервопривод
- Блок батареек
- Кабель USB
Serial.read()
Команды Serial.print() и Serial.println() мы уже знаем. Они записывают данные в последовательный порт. Команда для чтения данных, как не трудно догадаться — Serial.read().
Эта функция считывает и возвращает байт информации из буфера последовательного порта.
Если никакой информации нет, то возвращает -1.
Тип данных будет int.
Хитрость этой функции, с которой обязательно придется столкнуться в том, что она считывает именно байт информации и представляет его в виде кода символа из таблицы ASCII. Это значит, если вы введете слово из 5 букв, то каждый символ будет считан отдельно и его код из таблицы будет выведен в монитор последовательно. Например, код символа 0 — это 48, А код символа F — это 70. Причем только в десятичной системе счисления. Естественно, с символами Кириллицы все еще сложнее.
Попробуем загрузить в ардуино несколько примеров.
void setup() {
Serial.begin(9600);
}
void loop() {
if (Serial.available() > 0) {
Serial.println(Serial.read(), DEC);
}
}
// 1 - 49 // a - 97 // F - 70 // ] - 93
Serial.available()
Эта функция получает доступную для чтения из последовательного порта информацию. Максимум в буфере может быть до 64 байт. Эта те данные, которые записаны в порт и ожидают чтения. Следовательно, это удобно использовать для проверки последовательного порта на готовность к чтению. Если функция возвращает состояние отличное от 0, значит можно получить данные из порта. Попробуйте загрузить такой скетч в ардуино и проверить монитор порта.
void setup() {
Serial.begin(9600);
}
void loop() {
if (Serial.available() > 0) {
Serial.println(Serial.read(), DEC);
} else {
Serial.println("Ожидаем данные");
}
}
Serial.readString()
Считывает из буфера символы, формирует из них строку типа String и выводит ее. С такой функцией уже можно принимать в программу целые команды. Хотя их еще нужно специальным образом обработать. Но в нашей программе будем использовать именно эту функцию.
void setup() {
Serial.begin(9600);
}
void loop() {
if (Serial.available() > 0) {
String str = Serial.readString();
Serial.println(str);
}
}
Serial.parseInt()
Эта функция ищет целое число во входном потоке. Если число не было введено, выведет 0. Если ввести строку знаков, в которой будут числа, выведет только числа.
void setup() {
Serial.begin(9600);
}
void loop() {
if (Serial.available() > 0) {
x = Serial.parseInt();
Serial.println(x);
}
}
//sfdfsdf - 0 //sdfdf34 - 34 // dsf3df3 - 3 \n 3
Программа
Ок. Давайте попробуем собрать схему и написать программу управления сервоприводом на основе данных вводимых в последовательный порт.
Программа будет принимать данные из порта, анализировать их, и если данные подходят для сервопривода отправлять на привод угол для перемещения вала.
В простейшем варианте такой программы используем функцию Serial.parseInt() чтобы получить только цифру и установить ее на сервопривод. Не забудьте ограничить максимальное и минимальное значение переменной функцией constrain().
void loop() {
if (Serial.available() > 0) {
x = Serial.parseInt();
x = constrain(x, 0, 180);
Serial.println(x);
myservo.write(x);
}
}
Но, что если мы хотим принимать не только числовые данные, но и обрабатывать строковые команды. Тогда необходимо принимать все символы и обрабатывать их. Воспользуемся функцией Serial.readString(), чтобы организовать чтение данных из последовательного порта.
Затем сравним строку с несколькими значениями, которые уже будут внесены в программу. Если ни одна текстовая команда не подойдет, попробуем преобразовать строку в число и передать на сервомотор.
Полный текст программы
#include <Servo.h> // zen может заменить символ #
Servo myservo;
int pos=0;
String str;
void setup() {
Serial.begin(9600);
myservo.attach(9);
}
void loop() {
if (Serial.available() > 0) {
str = Serial.readString();
if (str == "one"){pos = 1;}else
if (str == "ten"){pos = 10;}else
if (str == "ninety"){pos = 90;}else{
pos = str.toInt();
}
pos = constrain(pos, 0, 180);
pos = str.toInt();
Serial.println(str);
}
myservo.write(pos);
}
Заключение
Теперь мы можем использовать последовательный порт на ардуино для передачи команд на устройство и управления оборудованием от него. В следующих уроках и проектах мы будем использовать эти полезные функции.