UART (Universal Asynchronous Receiver/Transmitter - універсальний асинхронний приймач/передавач) - протокол послідовного зв'язку, в якому дані передаються послідовно, тобто побітно. При такому зв'язку за один раз передається байт даних.
Існує велика кількість різноманітних протоколів зв'язку, призначених для використання з UART. Найбільш відомі:
MODBUS - сімейство протоколів типу «запит-відповідь», популярне в промисловій автоматиці. Орієнтовані на управління обладнанням за допомогою коротких команд.
AT-команди телефонних модемів. Набір текстових команд, що дозволяють управляти роботою модему при встановленні з'єднання.
PPP – протокол, який широко використовувався при підключеннях до інтернету через модем. Дозволяє виконувати аутентифікацію користувача у провайдера, шифрувати дані тощо.
IrDA - сімейство протоколів фізичного рівня для оптичного бездротового керування.
Протокол UART використовує певну структуру кадру для передачі байту даних. Структуа в асинхронному повідомленні наступна:
• Біт START - вказує, що послідовний зв'язок почався, і цей біт завжди має низький рівень сигналу.
• Пакет бітів даних - бітами даних можуть бути пакети від 5 до 9 біт. Як правило, використовується 8-бітний пакет даних, який завжди надсилається після START-біта.
• Біт STOP - це, зазвичай, один або два біти. Відправляється після пакетів бітів даних, щоб вказати кінець кадру. Біт STOP завжди має високий логічний рівень.
Кадр може також мати біт PARITY, який передається після STOP-біта.
UART зазвичай використовується в Raspberry Pi (RPi) як зручний спосіб керування через GPIO або для доступу до завантажувальних повідомлень ядра з послідовної консолі (включено за замовчуванням). Він також може бути використаний як спосіб для взаємодії з Arduino, завантаженого ATmega, ESP8266 та інших мікроконтролерів з RPi. Будьте обережні з рівнями логіки між пристроями, бо, наприклад, RPi має 3,3 В, а Arduino – 5 В. Підключивши їх разом ви можете їх пошкодити.
UART Raspberry Pi
Raspberry Pi має два вбудованих UART:
• PL011 UART
• mini UART
PL011 UART - це UART на базі ARM. Він має кращу пропускну здатність, ніж mini UART
Хоча RPi має два UART, але ми маємо лише одну пару виводів TXD і RXD для роботи.
UART PL011 є основним UART для моделей без функції Bluetooth і зв'язаний безпосередньо з консоллю Linux. Це означає, що через цей UART ви можете надсилати команди Linux з вашого ПК на RPi.
З іншого боку, mini UART є Linux консоллю UART для моделей з Bluetooth, такими як Raspberry Pi 3 і Raspberry Pi Zero W. Для цих моделей UART PL011 зв'язаний безпосередньо з модулем Bluetooth.
UART PL011 є більш надійним, ніж міні UART, оскільки останній має менші за обсягом FIFO, не може контролювати потік, а швидкість передачі даних залежить від тактової частоти GPU. Оскільки частота ядра графічного процесора змінюється, то змінюється і частота UART, що, в свою чергу, змінює швидкість передачі даних через UART. Це робить mini UART нестабільним, що може призвести до втрати даних або їх пошкодження. Щоб зробити mini UART стабільним, треба змінити основну частоту. Також mini UART не підтримує перевірку парності.
Для кращого та ефективного зв'язку рекомендується використовуйте PL011 UART замість mini UART.
Для використання послідовного зв'язку треба включити UART RPi. В іншому випадку ми не зможемо спілкуватися через послідовний порт, оскільки порти UART використовуються для виведення консолі Linux та модуля Bluetooth.
В RPi у вікні терміналу введіть наступну команду, щоб дозволити UART,
sudo raspi-config
Виберіть -> Interfacing Options:
Після вибору меню Interfacing, виберіть пареметр Serial, щоб дозволити UART:
Також дозволити використання UART можна через вкладку Interfaces меню параметрів у графічному інтерфейсі RPi.
Виводи Raspberry Pi 3 UART:
UART виводи мають номери: в режимі BCM 14, 15, а в режимі WiringPi 15, 16.
Якщо ви встановили WiringPi2-Python, то наступний приклад на python відкриває UART RPi на швидкості 9600 бот і надсилає 'hello world':
import wiringpi2 as wiringpi
wiringpi.wiringPiSetup()
serial = wiringpi.serialOpen('/dev/ttyAMA0',9600)
wiringpi.serialPuts(serial,'hello world!')
Зверніть увагу, що виводи RPi використовують рівні логіки 3,3 В, тому ви не можете підключити їх безпосередньо до пристроїв, які використовують 5 В: Arduino UNO або ПК.
Для доступу до mini UART в Raspberry Pi 3 присвоюється порт ttyS0. А для доступу до PL011 в Raspberry Pi 3 буде присвоєний порт ttyAMA0. В інших моделях RPi доступний тільки порт ttyAMA0.
Апаратний порт mini UART, тобто GPIO14 (TXD) та GPIO15 (RXD) відомий як serial0, тоді як інший порт UART, який за замовчуванням підключений до модуля Bluetooth, відомий як serial1. Ці імена створюються як псевдоніми для переносимості версій RPi. Псевдоніми створюються в Raspbian. Отже, ми можемо замінити ttyS0 або ttyAMA0 на serial0.
Коли ми використовуємо serial0 як UART-порт замість ttyS0 або ttyAMA0, то програма, написана для Raspberry Pi 3, також буде працювати на старих моделях RPi.
Для кращої продуктивності послідовного зв'язку на GPIO14 та GPIO15 необхідно використовувати порт ttyAMA0, який підключений до модуля Bluetooth. Для використання цього порту ми повинні обміняти порти UART, тобто отримати ttyAMA0 на GPIO14 та GPIO15, а ttyS0 (mini UART) в модулі Bluetooth.
Обмін послідовними портами можна здійснити за допомогою міні-UART (ttyS0) для модуля Bluetooth через оверлей пристрою, тобто pi3-miniuart-bt. Або це можна зробити, повністю відключивши Bluetooth через заборону пристрою, тобто pi3-disable-bt.
Щоб поміняти порт UART, відкрийте файл config.txt, як показано нижче.
sudo nano /boot/config.txt
а потім додайте нижче в кінці файлу рядок, як показано нижче.
dtoverlay = pi3-miniuart-bt
або
dtoverlay = pi3-disable-bt
Після додавання рядка збережіть зміни у файлі та перезавантажте систему.
Ми можемо перевірити нове відображення послідовних портів за допомогою
ls -l /dev
Карта UART для /dev/ttyS0 і /dev/ttyAMA0 показана нижче:
Підключення Raspberry Pi до ПК з використанням UART
Щоб підключити RPi до ПК через UART, необхідно мати USB Serial Cable, який підтримує 3,3В:
Як видно на зображенні вище, кабель має чотири дроти «мама», які можна підключити до RPi. Червоний дріт повинен бути підключений до +5 В, чорний - до GND, зелений - до TXD та білий - до RXD.
Даний кабель живиться від мікросхеми PL2303 і сумісний з Windows XP/Vista/7/8/10. Драйвер для кабелю можна завантажити зі сторінки Prolific’sdownloadpage.
Тепер можна використати термінал Putty, щоб спілкуватися з RPi через UART. За замовчуванням UART RPi використовує такі параметри: 115200 бод, 8 біт, без паритету, 1 стоп-біт і без контролю потоку.
Відкрийте Putty і виберіть перемикач "Serial". Потрібно також вказати COM-порт і швидкість, хоча Putty використовує ті ж самі параметри, що й вказані вище, за замовчуванням:
Якщо не знаєте, який номер COM-порту використати для кабелю USB, то необхідно:
1. Натиснути клавіші Windows+R, щоб відкрити діалогове вікно Run («Виконати») та набрати devmgmt.msc. Натисніть клавішу Enter, щоб відкрити диспетчер пристроїв в консолі ММС.
2. Клацнути стрілку на порти (COM & LPT), щоб виявити всі COM-порти на вашому ПК. Якщо ваш кабель USB-послідовний порт підключений, то він буде відображений у списку.
Коли все готово, натисніть кнопку Open на Putty, щоб використати консоль Linux через UART!
Тестування послідовного зв’язку між Raspberry Pi і ПК
Для перевірки послідовного з’єднання виконаємо підключення, які показані нижче:
Інтерфейс Raspberry Pi з ПК/ноутбуком для послідовного з’єднання
При цьому використана плата конвертора:
Відкрийте вікно терміналу на ПК/ноутбуці для приймання даних, які будуть передані з RPi.
Тепер, введіть наступну команду для передавання даних з терміналу RPi:
echo “Hello” > /dev/ttyS0
Ця команда передає рядок “Hello” на вихід порта UART, тобто на вивід Tx і він повине бути відображений в додатку термінала ПК/ноутбука.
Нагадуємо, що за замовчуванням, до GPIO14 (TX) і GPIO15(RX) підключений mini UART.
Ще один приклад з’єднання через UART RPi з використанням Python:
”””
З’єднання через UART RPi з використанням Python
http://www.electronicwings.com
”””
import serial
from time import sleep
ser = serial.Serial ("/dev/ttyS0", 9600) #відкривання порта на заданій
#швидкості в бодах
while True:
received_data = ser.read() #читання послідовного порта
sleep(0.03)
data_left = ser.inWaiting() #перевірка отриманого байта
received_data += ser.read(data_left)
print (received_data) #виведення отриманих даних
ser.write(received_data) #послідовна передача даних
Використані функції:
serial.Serial(port,baudrate)
Це клас для послідовного порта, який використовується для відкривання порта. Створіть примірник для цього класу (тут використовується ім’я ser, але воно може бути будь-яким іншим).
Наприклад:
ser = serial.Serial(/dev/ttyS0, 9600)
Параметри:
Port – ім’я порта, тобто. ttyUSB0, ttyS0, тощо або None
Baudrate – Швидкість обміну в бодах, наприклад, 9600, 38400, тощо.
Наведені вище функції мають більше параметрів, але не всі вони використовуються тут. Щоб детальніше ознайомитися з ними звертайтеся за посиланням Python API for PySerial.
read(Size)
Ця функція використовується для читання даних на послідовному порту.
Параметр:
Size – Кількість байт для читання. За замовчуванням Size рівне 1.
Return:
Байти, прочитані з порта.
write(Data)
Ця функція використовується для відправлення/передавання даних через послідовний порт.
Параметр:
Data – Дані для передавання
Return:
Кількість байт для запису/передавання
Вихід з терміналу Raspberry Pi:
Виведення на термінал ПК/ноутбука:
На стороні ПК/ноутбука тут використане програмне забезпечення Realterm.
Використання UART для спілкування з іншими пристроями
Ви не можете використовувати /dev/serial0 UART для спілкування з іншими пристроями, якщо вони зв'язані з консоллю. На щастя, існує спосіб від'єднати цей порт від консолі Linux. Просто виконайте такі дії:
1. На терміналі запустіть sudo raspi-config
2. Виберіть 8 Advanced Options
3. Виберіть A8 Serial
4. Будь ласка, виберіть <No>, коли буде питання: “Would you like a login shell to be accessible over serial?”
5. Виберіть <Ok> та перезавантажте
Якщо ви правильно виконали наведені вище кроки, то тепер можете використовувати RPi UART для спілкування з мікроконтролерами, GPS-пристроями або іншими периферійними пристроями, що підтримують послідовнийінтерфейс!
Нижче наведений простий скрипт на python, який надсилає "Hello" до Arduino UNO через послідовний порт:
#!/usr/bin/env python
import time
import serial
ser = serial.Serial(
port='/dev/serial0',
baudrate = 9600,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
bytesize=serial.EIGHTBITS,
timeout=1
)
while 1:
ser.write('Hello\n')
time.sleep(1)
Використана вище бібліотека Python для послідовного порта є однією з вбудованих бібліотек. Послідовний порт ініціалізується за допомогою рядків:
ser = serial.Serial(
port='/dev/serial0',
baudrate = 9600,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
bytesize=serial.EIGHTBITS,
timeout=1
)
Тут вказані параметри послідовного порту RPi.
Щоб записати в послідовний порт просто необхідно використати функцію .write ():
ser.write ('Hello \ n')
В рядку доданий символ переходу на новий рядок (\n) в кінці "Hello".
Зверніть увагу, що для такого підключення треба матиперетворювач рівня логіки через різні рівні напруги!
Дотримуйтесь цієї електричної схеми:
Вам також потрібно завантажити ескіз SerialEvent до Arduino UNO. Перейдіть до File > Examples > 04.Communication > SerialEvent.
Щоб переглянути повідомлення з RPi, відкрийте монітор послідовного порта на IDE Arduino та встановіть швидкість передавання даних 9600.
Підключення модуля GPS до Raspberry Pi через UART
Існує два способи підключення UART/послідовних пристроїв до Raspberry Pi. Легкий спосіб, і важкий шлях.
Ми продемонструємо підключення обома способами на прикладі використання модуля GPS.
Простий шлях – використання зовнішнього конвертора USB-UART
Безсумнівно, найпростіший спосіб додати послідовний порт - це використати кабель з конвертором USB - UART. Кабель просто підключіть до порту USB, як ми робили вище для підключення RPi до ПК. На іншому кінці кабелю є проводи або роз’єм, які забезпечують живлення, землю, RX, TX та, можливо, інші контрольні функції чи додаткові пристрої. Замість кабелю можна використати плату-коніертор на мікросхемах CP2102 або CP2104.
Виконаємо підключення модуля GPS таким способом:
⦁ GPS Vin до USB 5В або 3В (червоний провід на кабелі USB)
⦁ GPS Ground до USB Ground (чорний провід)
⦁ GPS RX до USB TX (зелений провід)
⦁ GPS TX до USB RX (білий провід)
Після підключення адаптера USB вам потрібно з'ясувати, яке ім’я отримав послідовний порт. Знайти ім’я можна шляхом відключення-підключення до USB, а потім набравши команду:
dmesg | tail -10
(або просто dmesg) і шукати текст, схожий на наведений нижче:
Унизу ви побачите назву приєднаного пристрою, в даному випадку ім’я ttyUSB0, тобто наш пристрій послідовного порту доступний на /dev/ttyUSB0
Використання вбудованого UART
Якщо ви не хочете підключати зовнішнє устаткування до RPi, то можете використати вбудований UART на виводах RX/TX.
Але якщо ви це зробите, то втратите доступ до послідовну консолі, тому, якщо ви використовуєте кабель PiUART або консольний кабель чи HAT, який дозволяє підключатись безпосередньо до консолі, це більше не спрацює, і вам доведеться використовувати HDMI+клавіатуру або ssh-метод запуску команд!
Це не велика проблема, адже консоль послідовного входу більше не доступна за замовчуванням на Raspbian, але про це варто попередити!
Після перезавантаження ви можете використовувати вбудований UART за допомогою /dev/ttyS0
Під’єднайте GPS таким чином: