Ардуино для начинающих. Урок 10. Serial и processing

В этом и последующих уроках мы будем говорить об интерфейсах связи Arduino. Их несколько, но начнем мы с Serial интерфейса. Мы его уже использовали прошлых уроках, когда выводили значения с датчиков на экран компьютера. Сегодня мы расширим наши возможности и будем использовать на компьютере показания с датчиков.

В этом уроке используется:

Отличный набор для начинающих: Купить
Arduino Uno: Купить
Arduino Nano: Купить
Arduino Mega: Купить
Потенциометры с колпачками 5 шт: Купить

Serial и processing.

Для начала мы напишем скетч для ардуино, который будет принимать символ через Serial соединение и отправлять его обратно. Это очень просто сделать, но есть один момент с которым может быть загвоздка. Вот этот скетч:

 // Возвращаем отправленное значение
void setup () {
	// Открываем порт на скорости 9600 бод
	Serial.begin(9600);
}

void loop () {
	// Ждем данные
	while (Serial.available() == 0);

	// Считываем данные
	int val = Serial.read() - '0';

	// Возвращаем данные в порт
	Serial.println(val);
}

Сначала мы открываем порт на скорости 9600 бод (бит в секунду). Этой скорости достаточно для выполнения большинства задач. Вы можете использовать и другую скорость, но не забудьте поставить такую же скорость на компьютере в мониторе порта.

Потом мы запускаем цикл, который ждет появление данных в Serial. Программа выйдет из этого цикла только когда мы отправим какие то данные. Потом считываем данные и приводим их к типу int,
вычитанием десятичного представления символа «0». И отправляем данные обратно. Данный способ подходит только для тех случаев, когда мы ожидаем получить только одну цифру. При отправке других значений программа будет возвращать не то что мы ожидаем. Можете разобраться с этим используя таблицу кодов символов ASCII:

таблица кодов ascii
таблица кодов ascii

Теперь сделаем кое что посложнее. Сейчас напишем скетч для управления, встроенным в Arduino, светодиодом с компьютера через Serial интерфейс. Этот скетч не намного сложнее предыдущего:

 // Управление светодиодом с компьютера
int ledPin = 13;
void setup () {
	// Открываем порт на скорости 9600 бод
	Serial.begin(9600);
	// Назначаем пин светодиода выходом
	pinMode(ledPin, OUTPUT);
}

void loop () {
	// Ждем данные
	while (Serial.available() == 0);

	// Считываем данные
	int val = Serial.read() - '0';

	// Выполняем дествия в зависимости от данных
	if (val == 1) {
		Serial.println("Led is On");
		digitalWrite(ledPin, HIGH);
	} else if (val == 0) {
		Serial.println("Led is Off");
		digitalWrite(ledPin, LOW);
	} else {
		Serial.println("Invalid!");
	}
	// Очищаем буфер
	Serial.flush();
}

Тут вы не найдете ничего нового, что мы бы не разбирали в этом или прошлых уроках, кроме Serial.flush(). Этот метод очищает оставшиеся символы в буфере памяти, так как мы работаем только с одним символом и остальные нам не нужны. В видео подробно рассказано зачем эта строчка.

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

Схема очень проста. Мы просто подключим потенциометр к аналоговому пину Arduino. Скетч тоже очень прост:

int potPin = 0;
void setup () {
	Serial.begin(9600);
}

void loop () {
	// Считываем и преобразовываем данные
	int val = map(analogRead(potPin), 0, 1023, 0, 255);
	
	// Отправляем данные
	Serial.println(val);

	// Задержка для стабильности работы
	delay(50);
}

Если вы прошли прошлые уроки, то в этом скетче вам все будет понятно. Если вы что то не знаете или забыли можете посмотреть прошлые уроки или справочник по языку программирования ардуино. А вот и код для Processing:

 // Подключаем библиотеку монитора порта
import processing.serial.*;

// Инициируем порт
Serial port;

// Переменная для хранения значения яркости
float brightness = 0;

void setup () {
	// Задаем размер окна
	size(500, 500);
	// Слушаем ком порт СОМ3
	port = new Serial(this, "COM3", 9600);
	port.bufferUntil('\n');
}
void draw () {
	// Изменяем цвет фона окна
	background(0, 0, brightness);
}

// Получаем значения с ардуино
void serialEvent (Serial port) {
	brightness = float(port.redStringUntil('\n'));
}

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

5 комментариев

  1. Влад

    Не работает Serial.flash(). Вместо одной выходят несколько надписей Invaild. Что делать?

  2. Александр

    Влад, поменяй одну букву в слове Serial.flash()
    Должно быть: Serial.flush()

  3. Валерий

    В предпоследнюю строку последнего скетча вкралась опечатка.
    Вместо redString в операторе brightness = float(port.redStringUntil(‘\n’)); там имелось в виду
    readString, т.е. brightness = float(port.readStringUntil(‘\n’));

  4. АлексТ

    А как в процессинге работать с 2-3-4…. Ком портами ?
    И как обмениваться float ?

  5. Дмитрий

    подскажите пожалуйста как принимать 10 разных значений?
    чем их разделить или может передавать последовательно?
    требуется передать данные с разных датчиков а приняв отобразить в нужных местах. форму в Processing нарисовал, осталось продумать как в нужном порядке передать через Serial (использую Bluetooth) и приняв «разложить по полочкам»

Добавить комментарий для Аноним Отменить ответ

Ардуино