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

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


    Пътят на експеримента:

    Изминах дълъг и труден път докато стигнах до свързването на две платки Arduino по радиочестотен канал. Трябваше да прочета много теми и експерименти, публикувани в интернет (виж "Литература"). Но бях се амбицирал след като реализирах дистанционно управляем модел на танк. Тръпката се оказа много жива. И ако в публикуваната от мен статия "Arduino-управление на модел на танк Т200" радиоуправлението беше осъществено чрез специализирани интегрални схеми енкодер-декодер HT-12E/D, съвсем естествено, бързо стигнах до идеята за свързване на две Arduino платки чрез радиоканал.

    От проучванията ми в интернет пространството се запознах с много проекти: едни, осъществени с блутут-модули, други с безжични, трети с трансивери на 2,4GHz. Срещнах и много комбинации на управление например като: управление от компютър чрез блутут-модул, управление с дистанционно, или управление чрез смарт-телефон с OS Android. Но за всички крайният резултат беше управление на една платка Arduino от разстояние.

    След като се ориентирах в интернет пространството за начините на предаване на данни, а именно превръщане на скеча на предаващата платка Arduino в сериен поток от данни, предаването му чрез ASK (Amplitude Shift Keying), приемането и декодирането им от приемащата платка Arduino, която изпълнява подадените команди. Информацията за начина на обработване на сигнала при използване на ASK e многообразна, но най-просто може да се опише чрез поток от "1" и "0", които модулират ВЧ генератора на предавателя, излъчват се, приемат се от приемник, на чийто изход след детектирането се получава същата поредица от импулси. За целта най-евтини отново се оказаха радиомодулите предавател-приемник на 433,92 MHz (или 315 MHz).

    От различните проекти на същата тематика, които разгледах в интернет, ми направи впечатление използването на няколко библиотеки, които позволяваха свързването на две Arduino платки. Такива например са:

        - VirtualWire
        - RC Switch
        - RadioHead

    и други.

    Някои от авторите с по-голям опит в програмирането са създали свои собствени библиотеки, каквато е например ardubottom.h. Но аз съм начинаещ и трябваше да се възползвам от чуждия опит. Така започнах да "опитвам" различни проекти на принципа "copy-paste". Реализирах 5-6 проекта на други автори, но ударих на камък – нито един не даде резултати в моята домашна лаборатория. И така след близо месец неуспешни опити се поразговорих с Веско, мой приятел и колега, който ме посъветва да започна с най-простичките примери като BLINK. Но аз вече бях преминал по този елементарен път и реших, че по-скоро е редно да спра за известно време, да отпочина и след това да се съсредоточа в последователното осъществяване на един проект и ако се налага, да се опитам да преработя програмния код съобразно моите изисквания.

    Като за начало реших да започна всичко отначало, да препрочета отново написаното в интернет и да потърся грешките, които съм допуснал (или друг е допуснал). Така се съсредоточих върху "новото" начало в управление на серво-машинка по радиочестотен канал на 433MHz. Отново прочетох статията на руския колега Мелников, след това я препрочетох, но не намерих заигравки или скрити подводни камъни. Казах си – няма причини да не тръгне, нахъсах се и подготвих две Arduino платки на два отделни бредборда – по един за всяка (предавател и приемник):
 

    ЗАБЕЛЕЖКА: Използваните Arduino платки трябва да бъдат базирани на процесора ATMEGA 328, каквито са Arduino Uno R3 или Arduino Nano V3. Тази забележка не е случайна. В първите си експерименти аз се сблъсках с този феномен. Заради по-малките си размери аз си бях закупил две платки Arduino Micro, базирано на процесор ATMEGA 32U4. Но с него ударих на камък – програмните кодове за сериен трансфер не работеха поради различните инструкции на процесора. Това беше една от допуснатите грешки – моята грешка.

    Поради горната забележка, започнах новите си експерименти с Arduino Nano 3.0. Монтирах платките върху два бредборда, направих съответните кабелни връзки. Проверих още няколко пъти монтажа за грешки и след като се уверих, че такива няма, заредих поотделно платките със съответните скечове за предавателя и приемника и-и-и-и-и-и до тук. Зареждането на скеча на приемника прекъсна със съобщението:

    "Error compiling bord Arduino Nano".

    Бях наистина изненадан тъй като бях спазил всички инструкции на Мелников.

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

    typedef uint8_t boolean;

    трябва да се премахне. Отворих файла с Notepad и го демаркирах:

    //typedef uint8_t boolean;

    И с това кратко действие скечът заработи:

    Този, който би искал да експериментира свое устройство за управление на серво-машинка може да намери в архива скеча с името: 2016 Virtual_Wire_ServoTimer2




    Този експеримент имаше за цел да се уверя в работата на библиотеките и естествено в осъществяването на комуникация между двете платки Arduino. Но за моите цели управлението на серво-машинка не беше необходимо. По-скоро трябваше да се съсредоточа върху управление на два мотора, такова, каквото описах в Част I на едноименната статия. С това щях да запазя функционалността на вече създадения модел на танк.


    Осъществяване на идеята:

    Всъщност, сигурно си задавате въпроса защо е необходимо да се опитвам да направя радиоуправлението чрез Arduino платки, след като вече съм го направил със специализирани интегрални схеми енкодер-декодер. Да, защото първоначалната идея беше да свържа две Arduino платки по радиоканал, а създадения вече модел на танк е особено подходящ за случая. В интернет пространството срещнах проект, който можеше да ми бъде полезен. Същественото отличие от моя замисъл беше, че авторът управлява серво-машинка и мотор, докато в моя проект серво-машинката е излишна, а моторите са два. В замяна на това, трябваше съществено да преработя програмния код управляващ приемника (танка) за да осигуря необходимите команди за движение. За да запазя първоначалната функционалност на танка, новия проект трябваше да изпълнява същите команди:

    - СТОП
    - Напред
    - Назад
    - Наляво
    - Надясно

    И ако в Част I командите се подаваха чрез бутони, тук ще използвам джойстик, с което ще имитирам в голяма степен фабричните радиоуправляеми модели. Ето схемата на свързване на предавателя:

    Батерията, която използвам за предавателя е 9V блок 6F22, акумулаторна, 280 mA/h. За експериментите тя е достатъчна по капацитет, но имайте предвид, че консумацията на Arduino Nano е около 30-33 mA, което предполага по-бързото й изтощаване при по-интензивна употреба.

    На следващата схема са дадени електрическите връзки в приемника. Приемната част също се захранва с батерия с напрежение 9V, но докато в предавателя използвах малка блок батерия 6F22, тук поради по-голямата консумация на ток (до 1А) използвам 6 бр. х 1,5V батерии размер AA. В схемата по-долу съм използвал готов модул Motor Shield с ИС L9110, чието максимално захранващо напрежение е 12V. Модулът може да се замени с друг подобен, със захранващо напрежение не по-ниско от 6V, тъй като това напрежение е най-ниското, при което Arduino платката може да работи. Връзките на модула нарочно не са означени с номера на използваните изводи тъй като може да се използват и какви да са други подходящи модули: TB6612, L293, L298 или Motor Shield за Arduino. Препоръчвам преди да направите промени в конструкцията да изпълните всички стъпки така, както съм ги описал (поне аз така правя, когато повтарям чужда конструкция).



2016_ardu_2_motors [zip,ino,h][3kb]

    Програмните кодове за този проект са два, по един за предавателя и приемника. Използвам програмния код за предавателя без да съм нанасял в него промени, докато в кода на приемника съм направил съществени промени – премахнал съм серво-машинката и съм добавил няколко команди с които робота придобива предварително плануваната функционалност.


    Кратко описание на предавателния код:

    Преди всичко той обхваща инструкции, чиято цел е да поставят параметрите на джойстика по "Х" и "Y" координати. Изпращането на данни към приемника се свежда до изпращане на няколко символи F, B, L, R, N. Тоест, именно в това е хитростта на кода – всяка буква (символ) носи в себе си команда. Тези символи се групират в сериен изход и се изпращат през pin1 – TX, за който е свързан предавателя. Серийната поредица се излъчва непрекъснато и се приема от приемника. Предавателният код е включен в архива с името: "_433MHz_RC_Car_Joystick_TX".


    Кратко описания на приемния код:

    Приемника се свързва към pin0 – RX на Arduino платката, през който серийния формат данни влиза в платката за обработка. Скечът разпознава символите, изпратени от предавателя F, B, L, R, N и към всеки един от тях прикрепя малък скеч, с който се изпълнява определена команда. За целта отново използвам Arduino IDE командата SWITCH … CASE. Всеки символ е отделен CASE. Символите имат следните значения F – Forward, B – Backward, L – Left, R – Right, N – Nowhere (последният е СТОП). Всеки един CASE съдържа комбинация от втора степен на двата мотора: включен / изключен мотор.


    Ще онагледя с два примера значението на казаното:

    Ако приемника получи символ "F", CASE изпълнява командите "включен ляв мотор" и "включен десен мотор". Тоест, движението е напред - FORWARD. Няма да описвам всички CASE команди, но ще се спра на още една – например ляв завой "L" – Left. Логично при изпълнението на тази команда предадена със символа "L" командата CASE изпълнява следната функция: "спира ляв мотор" и "включен десен мотор". По описаните два начина са изградени и другите CASE команди с които се осигурява движението на робота надясно и назад. Приемателния код е включен в архива с името: "_433MHz_Mot_Only_Reciever".

    А сега няколко практически съвета за инсталиране на библиотеката ardubottom.h :

    Библиотеките най-общо казано са системни или локални.

    Системните библиотеки се инсталират в IDE чрез менюто Sketch => Include Library => Add .ZIP Library … Инсталираната библиотека попада в IDE фолдера "libraries"’. Системните библиотеки се включват в даден скеч с: #include <Servo.h>.

    Локалните библиотеки се добавят във формата на файл във фолдера, в който се намира скеча. След това в прозореца IDE на стартирания скеч се добавя нов прозорец, в който се извиква библиотеката. Локалната библиотека се включва в скеча с "#include "Servo.h". Разликата е в употребата на стрелки или кавички. Ето порядъка на инсталация на библиотеката ardubottom.h за този скеч:
 

    Неправилната инсталация на библиотеките може да доведе до грешка при проверка на скеча "Error compiling bord Arduino Nano". Това съобщение за грешка не отразява правилно причината. То не дава представа за причината на грешката – в скеча или в библиотеката. Но когато библиотеката е инсталирана локално, функцията "проверка" проверява не само скеча, но и библиотеката и с подчертаване с жълт цвят може да даде по-точни указания. Именно по този начин открих грешките в първия скеч, която се оказа в ServoTimer2.h.

    А ето драйверът L9110-D, който използвам за тази конструкция:

    Направих експеримент и с драйвер за мотори L298, който не беше удачен:

    Забележка №1: Ако използвате драйвер L9110 не превишавате захранващото напрежение над 10V поради опасност от повреда. Ако използвате драйвер TB6612 напрежението не трябва да надвишава 13V.

    Забележка №2: Ако използвате драйвер TB6612 трябва да имате предвид, че той се захранва с две напрежения: +5V от Arduino за съвместяване на логическите нива и +(4.5 ÷ 13.5)V за захранване на електромотори.

    Забележка №3: Командите за управление на горните драйвери не изискват промяна.

    Забележка №4: Изборът на подходящ мотор е от изключително значение като пиковия ток (най-често при първоначален пуск) не трябва да превишава максимално допустимия на драйверите. В противен случай моторът няма да се завърти или драйверът ще изгори в буквалния смисъл на думата.

    Предвид на последната забележка, в процеса на реализацията на конструкцията практически регистрирах недостатъците на китайските електромотори. Например, редуктора, който бях закупил беше в комплектацията с такива мотори с напрежение 3-6 волта и скорост 11,200 оборота в минута, които не бяха необходими за моя проект. По-големия недостатък е сравнително високия консумиран ток при нормално завъртане (захранване 6 волта) който беше около 360mA, изключително висок, а пусковия ток достигаше 10 пъти по-голяма стойност. Наложи се да го заменя с друг по-маломощен мотор. (Токоизправителят в домашната ми "лаборатория" е със защита с максимален ток 1.5А, при което на практика при пуска на мотора тя сработваше и напрежението му падаше наполовина, а драйверът изгоря с пушек). На следващата снимка съм показал отляво оригиналния мотор, а в дясно моторът с който съм го заменил, с напрежение 12V.

    Сглобяването на редуктора беше цяло приключение. Самият той представлява два редуктора с два мотора в един корпус и правилността на монтажа е от значение за да получим еднакви предавателни числа. В случая 344:1 за да получа с избрания от мене мотор (показан по-горе) около 1,5-2 об./сек. Скоростта на въртене има значение за линейната скорост на робота. Например: по-малко предавателно число, по-висока линейна скорост.

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

    Преди да започна сглобяването на двата редуктора, подредих всички съставни части и зъбчати колела по размери в две еднакви и еднотипни групи, по една за всяка от половинките. Естествено, първо сглобих редукция с по-малко предавателно число (144:1), при което осите се завъртяха твърде бързо. Но именно така установих, че консумирания ток е твърде голям, съответно пусковия и-и-и-и...., както казах по-горе, модулът "драйвер за мотори" изгоря с пушек, след което се наложи да търся друг подходящ по размери мотор за да може да се монтира в същите фабрични отвори. Това "маркетингово проучване" ми отне една седмица, докато попаднах на подходящия мотор, показан по-горе със скорост на въртене 7200rpm при захранващо напрежение 12V. На снимките все още редукторът е показан с оригиналните мотори.

    Разбира се, в процеса на осъществяване на този проект всички мои проучвания бяха така да се каже, интегрирани, тоест, знаех какво търсех и съобразявах всички части по съвместимост. Причината е, че не исках (сърце не ми даваше) да разглобя и разчастя металния танк, който ви представих в Част I на едноименната статия. Така реших да го заменя с евтин пластмасов модел и закупих ново шаси и комплект вериги и колела.
 

    Сглобяването на шасито и напасването на веригите беше част от удоволствието да видя крайния продукт, който излезе от ръцете ми. Аз направих промени и в конструкцията на модела като промених местоположението на колелата, тъй като дистанцията между осите беше малка, с които трябваше да избягна както наклоняването напред-назад, така и затормозяване при движение по неравна повърхност:
 

    Оригиналния вид на шасито може да видите на следващата снимка:

    След всички проби, които извърших на бредборд, седнах пред компютъра и изчертах графичен оригинал на печатна платка, която беше съобразена с размера на металния танк от Част I, но и с по-малките размери на опитния пластмасов образец от горната снимка.

    На тази платка съм монтирал Arduino Nano модул – приемник на 433MHz и два отделни драйвера за мотори. Единият на малката платчица е фабричен с ИС L9110, а другият вдясно е с два броя ИС MC33152, които вече описах в предишните си конструкции за управление на мотори и модел на танк. Предвидил съм възможност за допълнително включване на светодиод за индикация на захранването, но и самата платка Arduino Nano също има такъв. Тази опция е по избор. Към драйверите за мотори MC33152 съм предвидил към захранването на всяка от интегралните схеми по един диод, свързан последователно към захранването. Причината за това решение е, че като всеки уред и моторите имат толеранс +/-10%, което означава, че броя на оборотите при еднакво захранване е възможно да бъдат: 7200rpm до +/-720rpm. Тоест ще се различават. Компенсирам това неудобство чрез последователно включени диоди, които при в права посока намаляват захранващото напрежение с 0,7 волта, приблизително 10% от напрежението на батерията при напрежение 9V. Това е необходимо за съгласуваната работа на двата мотора. Изходите на моторите и изходите на драйверите са предпазени с искрогасящи кондензатори 100nF/63V.

    На следващите снимки е показан окончателния вариант на модела, в който като драйвер за мотор е използвана ИС TB6612:

    И накрая, след всички експерименти за свързване на две платки Arduino по радиоканал, аз избрах управление на модел, тъй като е най-атрактивно. В интернет може да намерите много полезни за дома устройства, които използват различни радиочестотни канали. Литературата по-долу е свързана с първоначалното запознаване с принципите на осъществяване на връзка между две (или повече) платки Arduino. От всички модули на драйвери за управление на електромотор, за моя проект най-удачни се оказаха драйверите ИС L9110 и TB6612. L9110 се захранва с напрежение 9V, а TB6612 с 9V-12V. На следващите видеоклипове ще забележите, че използвания драйвер за мотор е TB6612. В архива към статията съм приложил графичен оригинал на печатната платка, на която съм комбинирал двата драйвера.

    Следващото видео илюстрира работата на робота с експерименталното шаси.


    А на видеото по-долу може да видите завършения модел на танк, показан в Част I.

Архив [zip,pcb,fzz,jpg][468kb]

   Успех на всички в ардуиностроенето!


Литература:

1.
Arduino ServoTimer2 and VirtualWire 433MHz Receiver
2. RF Joystick for Arduino
3. Wirelessly Control A Robot Using Arduino and RF Modules
4. Подключение к Arduino 433МГц радиопередатчика и радиоприемника. Беспроводное управление реле
5. Arduino и беспроводной радиомодули на 433 МГц
6. Remote controlled robot using Arduino, 555 timer circuit and 433MHz RF modules
7. Радиоуправление на Arduino
8. Project: Ardu-Bot-Tom - RF Link Controlled Robot
9.Валери Терзиев, Николай Николов "Приемник за пропорционално телеуправление", сп. "Радио, телевизия и електроника", 1988 / кн.1
10.Николай Николов, Валери Терзиев "Пропорционално телеуправление - изпълнителни механизми", сп. "Радио, телевизия и електроника", 1988 / кн.4

Валери Терзиев
30 ноември 2016 година