- Разлика между UART и RS485 комуникация
- Необходими компоненти
- Електрическа схема за жична комуникация на дълги разстояния
- Преобразуващ модул MAX485 UART-RS485
- Ethernet CAT-6E кабел
- Обяснение на кода на Arduino
- Заключение
Отдавна използваме платки за разработка на микроконтролери като Arduino, Raspberry Pi, NodeMCU, ESP8266, MSP430 и др. В нашите малки проекти, при които разстоянието в повечето случаи между сензорите и платката е не повече от няколко сантиметра при макс. на тези разстояния комуникацията между различните сензорни модули, релета, задвижващи механизми и контролери може лесно да се осъществи чрез обикновени джъмперни проводници, без да се притесняваме от изкривяването на сигнала в средата и електрическите шумове, пълзящи в нея. Но ако изграждате система за управление с тези разработчици на разстояние по-голямо от 10 до 15 метра, тогава трябва да вземете под внимание силата на шума и сигнала, защото ако искате системата ви да работи надеждно, тогава не можете да си позволите да загубите данни при прехвърляне.
Има много различни видове серийни комуникационни протоколи като I2C и SPI, които могат лесно да бъдат внедрени с Arduino и днес ще разгледаме друг най-често използван протокол, наречен RS485, който се използва много често в индустриална среда с висок шум за прехвърляне на данните през на голямо разстояние. В този урок ще научим за комуникационния протокол RS485 и как да го приложим с двата Arduino Nano, които имаме при нас, и как да използваме модула за преобразуване MAX485 RS485 към UART. Преди това също сме изпълнявали MAX485 комуникация с Arduino, а също и MAX485 комуникация с Raspberry pi, можете също да ги проверите, ако се интересувате.
Разлика между UART и RS485 комуникация
Повечето от евтините сензори и други модули като GPS, Bluetooth, RFID, ESP8266 и др., Които често се използват с Arduino, Raspberry Pi на пазара, използват UART TTL базирана комуникация, тъй като изискват само 2 проводника TX (предавател) и RX (Приемник). Това не е стандартен комуникационен протокол, но е физическа схема, с която можете да предавате и получавате серийни данни с други периферни устройства. Той може да предава / приема данни само последователно, така че първо преобразува паралелните данни в серийни данни и след това предава данните.
UART е асинхронно предавателно устройство, поради което няма тактов сигнал за синхронизиране на данните между двете устройства, вместо това използва битове за стартиране и спиране в началото и края на всеки пакет данни, за да маркира крайниците на прехвърляните данни. Предаваните от UART данни се организират в пакети. Всеки пакет съдържа 1 стартов бит, 5 до 9 бита за данни (в зависимост от UART), незадължителен бит за четност и 1 или 2 стоп бита. Той е много добре документиран и широко използван, а също така има бит за паритет, който позволява проверка на грешките. Но има някои ограничения за него, тъй като не може да поддържа множество роби и множество господари и максималният кадър от данни е ограничен до 9 бита. За прехвърляне на данни скоростите на предаване както на Master, така и на Slave трябва да са между 10% една от друга. По-долу е показан примерът за това как даден герой е предавател по линия за данни на UART. Сигналът и минимумите се измерват спрямо нивото на GND, така че изместването на нивото на GND ще има пагубен ефект върху трансфера на данни.
От друга страна, RS485 е по-базирана на индустрията комуникация, която е разработена за мрежа от множество устройства, които също могат да се използват на дълги разстояния и на по-големи скорости. Той работи по метод за измерване на диференциална сигнализация, а не при измерване на напрежение wrt GND щифт. Сигналите RS485 са плаващи и всеки сигнал се предава по линия Sig + и Sig-линия.
Приемникът RS485 сравнява разликата в напрежението между двете линии, вместо абсолютното ниво на напрежение на сигнална линия. Това работи добре и предотвратява съществуването на земни контури, често срещан източник на комуникационни проблеми. Най-добри резултати се постигат, ако Sig + и Sig-линиите са усукани, тъй като усукването обезсилва ефекта на електромагнитния шум, индуциран в кабел, и осигурява много по-добър имунитет срещу шума, което позволява на RS485 да предава данните до 1200 m обхват. Усуканата двойка също така позволява скоростите на предаване да бъдат много по-високи от възможните с прави кабели. При малки разстояния на предаване с RS485 могат да се реализират скорости до 35Mbps, въпреки че скоростта на предаване ще намалява с разстоянието. При 1200 m скорост на предаване можете да използвате само 100kbps скорост на предаване. За реализирането на този комуникационен протокол ви е необходим специален Ethernet кабел. Има много категории Ethernet кабели, които можем да използваме като CAT-4, CAT-5, CAT-5E, CAT-6, CAT-6A и др. В нашия урок ще използваме CAT-6E кабел който има 4 усукани двойки 24AWG проводници и може да поддържа до 600MHz. Той се прекратява в двата края от RJ45 конектор. Типичните нива на напрежение на линията от линейните драйвери са минимум от ± 1,5 V до максимум около ± 6 V. Входната чувствителност на приемника е ± 200 mV. Шумът в диапазона от ± 200 mV по същество се блокира поради шумопотискане в общ режим. Пример за това как байт (0x3E) се прехвърля през двата реда на RS485 комуникация.
Необходими компоненти
- 2 × MAX485 конвертор модул
- 2 × Arduino Nano
- 2 × 16 * 2 Буквено-цифров LCD
- 2 × 10k потенциометри за чистачки
- Cat-6E Ethernet кабел
- Макети
- Джъмперни проводници
Електрическа схема за жична комуникация на дълги разстояния
Изображението по-долу показва схемата на предавателя и приемника за жична комуникация на Arduino на дълги разстояния. Имайте предвид, че веригите на предавателя и приемника изглеждат еднакви, единственото нещо, което се различава, е кодът, записан в него. Също така за демонстрацията използваме една платка като предавател и една платка като приемник, но можем лесно да програмираме платките да работят и като предавател, и като приемник с една и съща настройка
Схемата на свързване за горната схема също е дадена по-долу.
Както можете да видите по-горе, има две почти идентични двойки вериги, всяка от които има Arduino nano, 16 * 2 буквено-цифров LCD и MAX485 UART към RS485 конвертор IC, свързани към всеки край на Ethernet Cat-6E кабел чрез RJ45 конектор. Кабелът, който използвах в урока, е с дължина 25 метра. Ще изпратим някои данни от страната на предавателя по кабела от Nano, който се преобразува в RS485 сигнали чрез MAX RS485 модул, работещ в главен режим.
В приемащия край конверторният модул MAX485 работи като Slave и при прослушване на предаването от Master той отново преобразува получените данни RS485 в стандартните 5V TTL UART сигнали, за да бъдат прочетени от приемащия Nano и показани на 16 * 2 буквено-цифрови LCD, свързани към него.
Преобразуващ модул MAX485 UART-RS485
Този модул за преобразуване на UART-RS485 има вграден чип MAX485, който е приемо-предавател с ниска мощност и ограничена скорост, използван за комуникация RS-485. Работи при единично захранване + 5V и номиналният ток е 300 μA. Той работи върху полудуплексна комуникация, за да реализира функцията за преобразуване на нивото TTL в ниво RS-485, което означава, че може или да предава или приема по всяко време, а не и двете, може да постигне максимална скорост на предаване от 2.5Mbps. Приемо-предавателят MAX485 отвежда захранващ ток между 120μA и 500μA при ненатоварени или напълно натоварени условия, когато водачът е деактивиран. Драйверът е ограничен за ток на късо съединение и изходите на драйвера могат да бъдат поставени в състояние на висок импеданс чрез веригата за термично изключване. Входът на приемника има функция за безопасност, която гарантира висока логическа мощност, ако входът е с отворена верига.В допълнение, той има силно действие срещу смущения. Той също така има вградени светодиоди, които показват текущото състояние на чипа, т.е. дали чипът се захранва или неговите предаващи или получаващи данни, което улеснява отстраняването на грешки и използването.
Схемата на схемата, дадена по-горе, обяснява как вграденият MAX485 IC е свързан с различни компоненти и осигурява 0,1-инчови стандартни разстояния, които да се използват с макет, ако искате.
Ethernet CAT-6E кабел
Когато мислим за пренос на данни на дълги разстояния, ние веднага мислим за свързване с интернет чрез Ethernet кабели. В днешно време използваме предимно Wi-Fi за интернет връзка, но по-рано използвахме Ethernet кабели към всеки персонален компютър, за да го свържем с интернет. Основната причина за използването на тези Ethernet кабели по нормални проводници е, че те осигуряват много по-добра защита срещу вливане на шум и изкривяване на сигнала на големи разстояния. Те имат защитен кожух над изолационния слой, за да се предпазят от електромагнитните смущения, а също така всяка двойка жици е усукана заедно, за да се предотврати образуването на токови контури и по този начин много по-добра защита срещу шума. Те често се завършват с 8-пинови RJ45 конектори в двата края. Има много категории Ethernet кабели, които можем да използваме като CAT-4, CAT-5,CAT-5E, CAT-6, CAT-6A и др. В нашия урок ще използваме CAT-6E кабел, който има 4 усукани двойки 24AWG проводници и може да поддържа до 600MHz.
Картина, показваща как двойка проводници са усукани вътре в изолационния слой на CAT-6E кабела
RJ-45 конектор, предназначен за CAT-6E Ethernet кабел
Обяснение на кода на Arduino
В този проект използваме два Arduino Nano, един като предавател и Един като приемник, всеки управляващ 16 * 2 буквено-цифров LCD за показване на резултатите. И така, в кода на Arduino ще се съсредоточим върху изпращането на данните и ще покажем изпратените или получените данни на LCD екрана.
За страна на предавателя:
Започваме с включването на стандартната библиотека за управление на LCD и декларираме пина D8 на Arduino Nano като изходен щифт, който по-късно ще използваме, за да декларираме модула MAX485 като предавател или приемник.
int enablePin = 8; int potval = 0; #include
Сега идвам към частта за настройка. Ще издърпаме щифта за активиране високо, за да поставим модула MAX485 в режим на предавател. Тъй като това е полудуплексна интегрална схема, следователно не може едновременно да предава и приема. Също така ще инициализираме LCD дисплея тук и ще отпечатаме приветствено съобщение.
Serial.begin (9600); // инициализиране на сериен при скорост на предаване 9600: pinMode (enablePin, OUTPUT); lcd.begin (16,2); lcd.print ("CIRCUIT DIGEST"); lcd.setCursor (0,1); lcd.print ("Transmitter Nano"); забавяне (3000); lcd.clear ();
Сега в цикъла записваме непрекъснато нарастваща целочислена стойност върху серийните линии, която след това се предава на другия нано. Тази стойност се отпечатва и на LCD за показване и отстраняване на грешки.
Serial.print ("Изпратена стойност ="); Serial.println (potval); // Сериен запис на POTval към RS-485 Bus lcd.setCursor (0,0); lcd.print ("Изпратена стойност"); lcd.setCursor (0,1); lcd.print (potval); забавяне (1000); lcd.clear (); потвал + = 1;
Страна на приемника:
Тук отново започваме с включването на стандартната библиотека за управление на LCD и декларираме пина D8 на Arduino Nano като изходен щифт, който по-късно ще използваме, за да декларираме модула MAX485 като предавател или приемник.
int enablePin = 8; #include
Сега идвам към частта за настройка. Ще дръпнем щифта за активиране високо, за да поставим модула MAX485 в режим на приемник. Тъй като това е полудуплексна интегрална схема, следователно не може едновременно да предава и приема. Също така ще инициализираме LCD дисплея тук и ще отпечатаме приветствено съобщение.
Serial.begin (9600); // инициализиране на сериен при скорост на предаване 9600: pinMode (enablePin, OUTPUT); lcd.begin (16,2); lcd.print ("CIRCUIT DIGEST"); lcd.setCursor (0,1); lcd.print ("Receiver Nano"); забавяне (3000); digitalWrite (enablePin, LOW); // (Pin 8 винаги LOW, за да получи стойност от Master)
Сега в цикъла проверяваме дали има нещо на разположение на серийния порт и след това четем данните и тъй като входящите данни са цяло число, ние ги анализираме и показваме на свързания LCD.
int pwmval = Serial.parseInt (); // Получаване на INTEGER стойност от Master чрез RS-485 Serial.print ("Получих стойност"); Serial.println (pwmval); lcd.setCursor (0,0); lcd.print ("Получена стойност"); lcd.setCursor (0,1); lcd.print (pwmval); забавяне (1000); lcd.clear ();
Заключение
Тестовата настройка, която използвахме за този проект, можете да намерите по-долу.
Цялостната работа на този проект може да бъде намерена във видеото, свързано по-долу. Този метод е един от простите и лесни за изпълнение методи за прехвърляне на данните на големи разстояния. В този проект сме използвали само скорост на предаване от 9600, което е доста под максималната скорост на трансфер, която можем да постигнем с модула MAX-485, но тази скорост е подходяща за повечето сензорни модули там и всъщност нямаме нужда всички максимални скорости, докато работите с Arduino и други разработчици, освен ако не използвате кабела като Ethernet връзка и не изисквате цялата честотна лента и скорост на трансфер, които можете да получите. Поиграйте сами със скорост на прехвърляне и опитайте и други видове Ethernet кабели. Ако имате въпроси, оставете ги в раздела за коментари по-долу или използвайте нашите форуми и аз ще се опитам да отговоря най-добре на тях. Дотогава, Адиос!