На главную страницу | Новости | FAQ | Ссылки | Для детей | Контакты

ARDUINO ROBOTS
Arduino для начинающих электронщиков. Модули и проекты на базе Arduino. Разработка роботов


Работа с последовательным портом UART (serial) на Arduino


Последовательный интерфейс (serial) предназначен передачи данных через универсальный асинхронный порт UART. Порт UART очень часто используется для передачи данных с Ардуино на компьютер, и обратно, а также для связи нескольких плат ардуин между собой.

Для многопортовых DUE/MEGA см. здесь.

Основные функций для работы с последовательным портом (Serial)


Serial.begin(rate) -- Открывает последовательный порт и задаёт скорость для последовательной передачи данных. Типичная скорость обмена для компьютерной коммуникации - 9600.

Очевидно, когда задействован последовательный порт, выводы 0 (RX) и 1 (TX) не могут использоваться для других целей.

Serial.println(data) -- Передаёт данные в последовательный порт, сопровождая автоматическим возвратом каретки и переходом на новую строку.

Serial.print(data) -- тоже самое без возврата каретки и перехода на новую строку.

Serial.begin(скорость_передачи); -- Инициализация порта. Задает скорость передачи в битах в секунду. Нормированные скорости: 300, 1200, 2400, 4800, 9600, 14400, 19200, 38400, 57600, или 115200.

count = Serial.available(); -- Принимаемые по последовательному порту байты попадают в буфер микроконтроллера, откуда Ваша программа может их считать. Функция возвращает количество накопленных в буфере байт. Последовательный буфер может хранить до 128 байт.

if (Serial.available() > 0) { // Если в буфере есть данные
    // здесь должен быть прием и обработка данных
}

char = Serial.read(); -- Считывает следующий байт из буфера последовательного порта. возвращает -1 если нет входящих данных

Serial.flush(); -- Ожидает окончания передачи исходящих данных (до версии Arduino 1.0 функция очищала буфер последовательного соединения)..

Разные варианты функции print:


Serial.print(b, DEC); -- выводит ASCII-строку -- десятичное представление числа b.

Serial.print(b, BYTE) -- выводит младший байт числа b.

(аналогично HEX, OCT, BIN).

Serial.print(str) // если str -- строка или массив символов, побайтно передает str на COM-порт.

Serial.println(); -- отличие заключается в том, что после данных дополнительно выводятся два символа – символ возврата каретки (ASCII 13, или '\r') и символ новой линии (ASCII 10, или '\n').

Функция write:


Serial.write(uint8_t c); -- Записывает данные в последовательный порт. Данные посылаются как байт или последовательность байт.

Serial.write(val); // где val - переменная для передачи, как единственный байт

Serial.write(str); // где str - строка для передачи, как последовательность байт

Serial.write(buf, len); // где buf - массив для передачи, как последовательность байт; len - длина массива.

Пример 1. Передача данных по Serial-порту с Arduino на компьютер


Инициализация порта со скоростью 9600 бот и передача данных (от Arduino на внешние устройства, например на компьютер):

void setup() {
    Serial.begin(9600); // открывает порт и устанавливает скорость 9600 бит/c
    Serial.println("Hello Computer");

}
void loop() {}

Пример 2. Передача данных по Serial-порту с компьютера на Arduino


serialEvent() -- функция вызывается автоматически, когда поступают данные.

Пример:

String inputString = "";  
void serialEvent() 
{  
    // Далем что то с поступившими данными 
    while (Serial.available()) {
    char inChar = (char)Serial.read();  // get the new byte
    inputString += inChar;
    if (inChar == '\n') {
      stringComplete = true;
    }
}

Serial.setTimeout() -- задает максимальное время (в мс) для работы Serial.readBytesUntil();

Возможные проблемы


1) auto-reboot DTR: возможна автоперезагрузка МК при передаче на него данных по serial-пору. Чтобы отключить это, надо поставить конденсатор 10мкФ между RES и GND. Я ставил электролитический кондер (естественно, + на RES).

Как соединить две ардуины по UART (serial) порту


Схема соединения двух ардуин:


1-ая ---- 2-ая

GND <---> GND

RX <---> TX

TX <---> RX


Длина провода и скорость: RS-232 (англ. Recommended Standard 232) -- стандарт физического уровня для асинхронного интерфейса (UART).

Расстояние связи по RS232 максимум 15 метров.

Но всё зависит от скорости.

подробнее здесь

http://robotic-controls.com/learn/arduino/arduino-arduino-serial-communication

Работа Arduino MEGA/DUE с несколькими последовательными serial портами


Многопортовые ардуино.

Как вы уже заметили, на ардуиновских платах Mega и Due имеется по 4 последовательных порта, а именно:

Serial - выводы 0 (RX) and 1 (TX);

Serial1 - выводы 19 (RX) and 18 (TX);

Serial2 - выводы 17 (RX) and 16 (TX);

Serial3 - выводы 15 (RX) and 14 (TX).

Естественно, что на Due используется напряжение 3.3 В (на MEGA как обычно 5 В).

Как с ними работать?

Здесь синим цветом выделены собственно имена объектов (Serial, Serial1,Serial2,Serial3), которые используются в коде программы для работы с их методами. Всё просто! Например,

// Пример работы с несколькими serial-портами:

void setup() {
  // инициализируем те порты, котор:
  Serial.begin(9600);
  Serial1.begin(9600);
  Serial2.begin(9600);
  Serial3.begin(9600);
}

 // и так же с ними работаем:

void loop() {
  // выводим строку в порт-2:
  Serial2.print("Hello World!");

  // читаем данные из порта-1 и пишем в порт-3:
  if (Serial1.available()) {
    int inByte = Serial1.read();
    Serial3.write(inByte);
  }
}

Пример вывода на дисплей LCD1602 через последовательный порт UART Arduino из-под Linux средствами языка Python


Короче говоря, есть комп с линуксом, к которому подключена Arduino через USB, а к арудине подключен дисплей LCD1602, и мы хотим на него выводить инфу.

Сначала привожу полный код программы для Arduino UNO, к которой подключен дисплей LCD1602:

 #include < LiquidCrystal_I2C.h >
LiquidCrystal_I2C lcd(0x27,16,2);  /* или 0x3F. */
const char TERM_SYMBOL = '#';
String inputString = "";  
void serialEvent() 
{  
	while (Serial.available()) {
		char inChar = (char)Serial.read();  // get the new byte
		Serial.print(inChar);
		if (inChar != TERM_SYMBOL) {
			inputString += inChar;
		}
		else {
			lcd.setCursor(0, 0);    
			lcd.print(inputString);  // Выводим текст
			inputString = "";  
		}
	}
}
void setup()
{
	Serial.begin(9600);
	Serial.println("Hi Computer");
	lcd.init();                  // Инициализация 
	lcd.backlight();             // Включаем подсветку
	lcd.print("Ready to work");  // Выводим текст
}
void loop()  // цикл
{
}

Скачать исходник.

Я сделал здесь решетку '#' в качестве символа завершения передачи пакета данных. Как только в потоке данных встречается символ #, данные выводятся на дисплей, и буфер обнуляется, при этом сам символ '#' не выводится. Конечно, можно было бы использовать '\n' или др.

Далее мы напишем скрипт на Python, который будет выводить инфу на дисплей. Я выбрал Python, потому что это прикладной язык и он лучше всего подходит для подобных задач. С такими языками как C++/C# и т.п. больше возни с библиотеками, а здесь всё просто, особенно если это дело происходит под линуксом.

Первым делом устанавливаем необходимые библиотеки (для 2-ой или 3-ей версии python)

$sudo apt-get install python-serial

или

$sudo apt-get install python3-serial

Далее в интерпретаторе python пишем:

import serial
ser = serial.Serial("/dev/ttyUSB0")
ser.baudrate = 9600      
ser.write('                #')  # очищаем строку
ser.write("123; It's work#")  # выводим какие-либо данные

Здесь ардуина у меня подключена к порту /dev/ttyUSB0 - это я узнавал из Arduino IDE. Обычно она всегда на этом порту сидит, если других устройств на последовательный порт не подключено.

Как вы уже догадались, и в первой, и во второй программы должна быть указано одинаковая скорость в бодах. В моем случае это 9600 - стандартная, хотя и маленькая скрость. Может быть и больше (читай выше).




Платы ARDUINO по низкой цене

Нажми на изображение, чтобы заказать в интернет-магазине:


arduino NANO купить дешево arduino UNO купить дешево arduino UNO R3 ORIG купить дешево arduino MEGA купить дешево arduino DUE купить дешево



Now 21.11.24 16:24:58, Your IP: 13.59.73.248; arduino.zl3p.com/basic/serial
ePN