Arduino-управление на модел на танк по радиоканал с nRF24L01
Част III

 

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


    Оказа се, че роботостроенето е голямо забавление. С описаните конструкции в Част II и настоящата Част III на едноименните статии си поставих за цел да изпробвам не просто управление на робот, а осъществяване на връзка между две платки Arduino UNO (Nano). За целта управлението е много подходящо, тъй като резултата е не само виден, но и атрактивен за околните.

    След като осъществих управление на робот по радиоканал на 433 MHz, реших да експериментирам канал на честота 2400 MHz. Закупих два модула nRF24L01, потърсих необходимата библиотека за управление RF24 [1]  и подходящ скеч. Бях вече закупил шаси, комплект редуктор (напомням, че се наложи да сменя моторите) и драйвери за управление на мотори. Наглед простичко начало.
 

    На следващата снимка (поглед отгоре) са отбелязани значенията на всеки от изводите на nRF24L01:

    Направих съответните връзки между различните модули, но нищо не става от първия път, ако предварително не сме проучили темата. Така се получи и с първия ми неуспешен опит. Порових се на RF24L01 2.4GHz Radio/Wireless Transceivers How-To [2] за да намеря урок относно свързване на Arduino платка с радиочестотен модул nRF24L01. Намерих такава страница и се зачетох. В нея, се оказа, че има доста сериозна забележка, касаеща свързване на осемте извода на RF-модула. Тоест, в зависимост от използваната библиотека, изводите се свързват към различни пинове на Arduino. Но ето за какво става дума:

    Аз бях свързал изводи 3 и 4 на модула с изводи 7 и 8 на платката. Веднага направих корекция, както в предавателния код, така и в приемния код, заменяйки изводи 7 => 9 и 8 => 10. Така и в предавателната и в приемателната платка RF-модула заемат еднакви изводи – 9, 10, 11, 12, 13. IRQ8 не се използва. След това подреждане, направих промяна в номерацията на цифровите пинове които подават командите за управление към драйвера за мотор L298. Изходите станаха 2, 3, 4, 5, с което също се подредиха последователно. Тук трябва да вметна забележката, че за този експеримент използвам мощния драйвер за мотор L298, тъй като тока на моторите е доста висок, а стартовия достига дори до 3А. Трябва да се има предвид, че драйвера има шина с изход от вградения в него интегрален стабилизатор 7805, чието напрежение от +5V може да се използва за директно захранване на платката Arduino. Изпробвах и този начин на захранване, но се оказа че искренето на моторите подава грешни команди за изпълнение, поради което в крайния вариант на експеримента захраних Arduino през вход VIN, на който подадох напрежението от батерията, в случая 12V.

    Схемата на свързване на предавателя и приемника имат следния вид като изводите 7 и 8 не са заменени с 9 и 10:

    Целият експеримент е осъществен с използване на стандартни кабелчета и бредборд, а като шаси използвах вече показаното шаси на Tamyia в предишната част.


 

    Предавателят монтирах директно с кабелчета за платката Arduino:


 

    Монтажът на приемната част ми отне повече време, тъй като използвах възможностите, които даваше шасито. Ползата от фабричните отвори се оказа полезна при монтажа не само на редуктора с моторите, но и на платките Arduino и моторния драйвер L298. И двете платки монтирах върху дистанционни шпилки във височина. По този начин драйверът за моторите се окачи над самите мотори, а платката Arduino в предната част на щасито, като под нея се образува достатъчно пространство, в което поместих акумулаторната Li-Ion батерия 11,2V.

Архив: arh_adruino_tank_v3.zip [zip,ino][2kb]

    И тъкмо направих видео файла, показан по-горе, и ми хрумна да експериментирам с още една функционалност. С няколко промени в скеча реших да направя пропорционалност на телеуправлението. За какво иде реч – пропорционално на отклонението на ръчката на джойстика да се променя скоростта на управление на двигателите. Това позволява промяна на скоростта на движение напред и назад от нула до максимум и от максимум до нула в зависимост от положението на джойстика. Но в скеча, чиито функции показах с видео файла, тази възможност не съществуваше. Движението на двигателите беше едноскоростно – включени или изключени.

    За да направя тази функционалност беше необходимо да захраня моторите само от пинове PWM (ШИМ). До този момент двигателите се управляваха чрез цифрови пинове 2,3,4,5. От тях пинове 3 и 5 са ШИМ. Необходими ми бяха още като например 3,5 и 6,9. Но в скеча пиновете, с които се осъществява командването на радиомодула (9, 10, 11, 12, 13) два с PWM (9 и 10) са заети.

    Промяната която направих е следната:

    а) промених обмяната на данни между Arduino и nRF24L01

    Като преадресирах пиновете в ред - RF24 myRadio (9, 10); с RF24 myRadio (8, 10); с което освободих пин9 с ШИМ за моя експеримент.

nRF24L01 Arduino pins:
1 GND
2 3V3
3 8
4 10
5 13
6 11
7 12

    б) преадресирах пиновете за управление на моторите:

от:
int OUT1 = 2;
int OUT2 = 3;
int OUT3 = 4;
int OUT4 = 5;

със:
int OUT1 = 3;
int OUT2 = 5;
int OUT3 = 6;
int OUT4 = 9;

    По този начин осъществих идеята за пропорционално управление на скоростта на моторите. Постигнах плавна промяна на скоростта на моторите към увеличаване или намаляване. Казано на шофьорски език: скоростта се променя в зависимост от педала на газта.

    Приложения в архива програмен код е с нанесените промени.

    На следващите снимки може да видите модела на танка в завършен вид, като за целта съм изработил печатна платка върху която са монтирани всички модули и части:

    Пожелавам успех в ардуиностроенето!


Литература:

1.
Arduino driver for nRF24L01
2. RF24L01 2.4GHz Radio/Wireless Transceivers How-To
3. Гусеницы для RC робота на arduino nrf24l01
4. Wireless Arduino controlled Tank (nRF24L01)

Валери Терзиев
28 декември 2016 година, доп. 16 март 2017 година