Arduino - Предаване на пропорционални команди чрез nRF24L01
/kn34pc.com/конструкции/...

Посвещавам тази статия на моя приятел Николай Др. Николов, който събуди у мен увлечението по моделистиката в младежките ни години.


След като в статията ми "Arduino – предаване на фиксирани команди с nRF24L01, част I" разгледах принципа и програмния код за предаване на команди от тактилни бутони, които в приемната страна след декодиране се онагледяваха с включване и изключване на светодиоди, сега ще разгледам предаването на пропорционални команди със същия Wi-Fi модул.

За разлика от предаването на фиксирани команди, които се прилагат към аналогови или цифрови входове на Arduino и имат логически характер само с две нива, "0" или "1", предаването на пропорционални команди се осъществява чрез изменение на входното ниво на даден аналогов вход, което в приемната част се декодира и за да бъде командата пропорционална (да съответства на завъртането на оста на потенциометъра в предавателя) се използват цифровите изходи с ШИМ (широчинно-импулсна модулация). Разбира се и подходящи за целта изпълнителни механизми, като например сервомотори, сервомашинки и др. Трябва да имаме предвид техническите характеристики на Arduino Nano, а именно че при осъществяване на приемната част изводите с ШИМ (PWM) са шест – 3, 5, 6, 9, 10 и 11. За този проект тези ограничения са спазени, тъй като ще използваме пет сервомашинки, а един изход с ШИМ остава свободен.

Аз ще илюстрирам експеримента, описан в тази статия, чрез сервомашинки, които лесно се намират на пазара и са достатъчно евтини. И бих искал да подчертая, че всеки, който използва този програмен код лесно би могъл да го преработи според своите проекти и изисквания, а също да го комбинира с вече публикувания от моята статия "Arduino – предаване на фиксирани команди чрез nRF24L01".

И сега малко разяснения на програмния код в предавателя и приемника.

Както казах вече няколкократно ограниченията, с които се сблъскваме при осъществяване на по-големи проекти с много допълнителни модули, идват от спецификациите на процесора. И пак искам да повторя – моята цел е да покаже възможностите на Arduino, поради което НЕ използвам разширителни платки (експандери като PCF8574).

    - Комуникацията между предавателя и приемника се осъществява чрез Wi-Fi модула nRF24L01, който от своя страна изисква включването на оперативната библиотека RF24.h (nRF24.h).

    - Предаването на данни се извършва чрез байт, чието наименование е vit[5], като всяка една команда е номерирана и тъй като "0" е значеща цифра, то номерацията е N=n-1, тоест с единица по-малка. Тоест, за байта vit[5], съответните команди се предават чрез vit[0], vit[1] и т.н. до vit[4].

    - В приемника данните от същия байт се приемат и се извличат отделните команди. За улеснение съм направил пълно съответствие като, например, първата команда vit[0] носи информация за pot1 (потенциометър 1) и управлява Servo1.

И в предавателя и в приемника използвам командата за мащабиране map(). В предавателя: чрез нея поставям крайните стойности за потенциометрите, свързани към аналоговите входове на Arduino, а приемника: мащабирам крайните стойности за изпълнение от серво механизмите.

В предавателя:

    pot1 = map((analogRead(A0)), 0, 1023, -225, 225); //servo 1

В приемника:

    pot1 = map(pot1, 0, 1023, 80, -250); //80-центриране; -250-обхват

Забележителното е, че посоката на движение на механизмите може да се променя само чрез един минус или плюс при мащабирането на крайните стойности.

Храдуерното изпълнение е също опростено. Модулът nRF24L01 се свързва в предавателя традиционно към изводи 9, 10, 11, 12, 13, а в приемника нетрадиционно към 14, 15, 11, 12, 13, като по този начин освобождавам изходи 9 и 10, които са с възможност за ШИМ. Обръщам внимание, че първите два извода (9, 10) могат да бъдат избираеми. По този начин получавам възможност за по-пълно използване на ШИМ:

    servo1.attach(3);
    servo2.attach(5);
    servo3.attach(6);
    servo4.attach(9);
    servo5.attach(10);


Разбира се на снимките, които след малко ще покажа, изпълнението на предавателя е върху печатна платка, но всъщност използвам една от по-старите платки за предавател от друга конструкция. С това доста улесних "събирането" на монтажа. Потенциометрите запоих директно за изводите на Arduino платката и с това си спестих много кабели за връзка. Но в приемника нещата не стояха по същия начин. За радост си бях купил една платка за монтаж на Arduino Nano, която се оказа от полза. Единствено трябваше да си изработя сам кабел за връзка между Arduino и Wi-Fi модула nRF24L01. Но ето как изглеждат предавателната и приемната част на този малък проект:

Предавателната част:

Приемната част:


На следващото видео може да видите демонстрация на работата на програмния код в комплекта предавател–приемник.


tx_servo_5.zip [zip,ino][1kb]
rx_servo_5.zip [zip,ino][1kb]

Валери Терзиев
6 ноември 2018 година