Чтение данных из последовательного порта. Урок 6. Ардуино

Чтение данных из последовательного порта

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

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

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

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

Последовательный порт. Урок 5. Ардуино

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

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

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>

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);
}

Заключение

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

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

Ваш адрес email не будет опубликован.