You are on page 1of 71

УНИВЕРЗИТЕТ У БАЊОЈ ЛУЦИ

МАШИНСКИ ФАКУЛТЕТ
СТУДИЈСКИ ПРОГРАМ МЕХАТРОНИКА

Драган Ерцег

ПРОЈЕКТОВАЊЕ УПРАВЉАЧКОГ СИСТЕМА ЛЕТЕЋЕ


ТЕСТЕРЕ НА ЛИНИЈАМА ЗА ПРОИЗВОДЊУ ШАВНИХ
ЦИЈЕВИ У ПРЕДУЗЕЋУ „МЕТАЛ” А. Д. – ГРАДИШКА

ЗАВРШНИ РАД ДРУГОГ ЦИКЛУСА

Бања Лука, мај 2017.


Тема: Пројектовање управљачког система летеће тестере на
линијама за производњу шавних цијеви у предузећу
„МЕТАЛ” а. д. – Градишка

Ужа научна област: Мехатроника

Кључне ријечи: Летећа тестера, Ардуино, SCADA, Processing.

Комисија: Др Симо Јокановић, ван. професор, предсједник Комисије


Др Бранко Блануша, ван. професор, члан Комисије
Др Дарко Кнежевић, ван. професор, коментор
Др Михајло Стојчић, ван. професор, ментор

Кандидат:
Драган Ерцег
УНИВЕРЗИТЕТ У БАЊОЈ ЛУЦИ
МАШИНСКИ ФАКУЛТЕТ
СТУДИЈСКИ ПРОГРАМ МЕХАТРОНИКА

ПРОЈЕКТОВАЊЕ УПРАВЉАЧКОГ СИСТЕМА ЛЕТЕЋЕ


ТЕСТЕРЕ НА ЛИНИЈАМА ЗА ПРОИЗВОДЊУ ШАВНИХ
ЦИЈЕВИ У ПРЕДУЗЕЋУ „МЕТАЛ” А. Д. – ГРАДИШКА

ЗАВРШНИ РАД ДРУГОГ ЦИКЛУСА

Ментор: Др Михајло Стојчић, ван. професор

Кандидат: Драган Ерцег

Број индекса: 71/2013

Студијски програм: Мехатроника

Бања Лука, мај 2017.


Овом приликом желим да захвалим свом
ментору, др Михајлу Стојчићу, ванредном
професору на стручној помоћи приликом
израде овог рада.

Такође, желим да захвалим породици и


пријатељима који су ме подржавали током
студирања.
САД РЖАЈ

САДРЖАЈ:

1. УВОД .................................................................................................................................. 7
2. АНАЛИЗА ПОСТОЈЕЋЕГ И ПРОЈЕКТОВАЊЕ НОВОГ УПРАВЉАЧКОГ
СИСТЕМА................................................................................................................................. 8
2.1 Анализа постојећег рјешења управљања на „летећим тестерама” у предузећу
„МЕТАЛ“ а. д. Градишка ..................................................................................................... 8
2.2 Приједлог новог рјешења управљања на „летећим тестерама” у предузећу
„МЕТАЛ“ а. д. Градишка ................................................................................................... 10
2.3 Избор компоненти које ће обезбиједити жељено понашање система ............ 12
2.4 Ардуино ПЛК – а ................................................................................................. 14
3. УГРАЂЕНЕ КОМПОНЕНТЕ ......................................................................................... 15
3.1 Ардуино ................................................................................................................ 15
3.2 Ардуино хардвер.................................................................................................. 16
3.3 Ардуино софтвер ................................................................................................. 20
3.4 Инкрементални енкодер...................................................................................... 21
3.5 Енкодер са ужетом (wire encoder) ...................................................................... 23
4. АРДУИНО УПРАВЉАЧКИ ПРОГРАМ ....................................................................... 25
4.1 Серијска веза између Ардуина и SCADA система ............................................ 26
4.2 Анализа података добијених са серијског порта .............................................. 27
4.3 Потпрограми за аутоматски, циклусни и ручни режим рада .......................... 28
5. ПРОЈЕКТОВАЊЕ SCADA СИСТЕМА ........................................................................ 33
5.1 Програмски пакет “Processing” ......................................................................... 33
5.2 Координатни систем и употреба основних наредби у Processing – u ............ 35
5.3 Функције setup() и draw() .................................................................................... 37
5.4 Варијабле .............................................................................................................. 38
5.5 Рад са сликама, текстом и серијском везом у Processing – u .......................... 40
5.6 Реализација апликације у Processing – u ........................................................... 41
6. СИМУЛАЦИЈА РАДА УПРАВЉАЧКОГ СИСТЕМА ................................................ 43
6.1 Пнеуматска шема система .................................................................................. 43
6.2 Електрична шема система................................................................................... 44
6.3 Тестирање израђеног графичког интерфејса .................................................... 46
7. ЗАКЉУЧАК ..................................................................................................................... 48
ДОДАТАК 1 ............................................................................................................................ 49

Машински факултет у Бањој Луци 5


САД РЖАЈ

ДОДАТАК 2 ............................................................................................................................ 56
ДОДАТАК 3 ............................................................................................................................ 68
ЛИТЕРАТУРА ........................................................................................................................ 71

Машински факултет у Бањој Луци 6


1. УВОД

Задатак овог рада је пројектовање новог управљачког система и графичког


интерфејса за „летеће тестере” на линијама за производњу шавних цијеви у предузећу
„МЕТАЛ” а. д. – Градишка. Постоје различите конструкције ових машина и оне нпр.
могу бити са великом тачношћу сјечења или са великим одступањима дужине
одсјечене цијеви. У предузећу „МЕТАЛ“ а. д. - Градишка инсталирана је „летећа
тестера“, која спада у групу машина са великим грешкама у дужини одсјечених цијеви
(одступање дужине одсјечене цијеви су и до 70 mm). Дакле, потребно је на постојећој
машини коришћењем ПЛК – а (програмабилно логичког контролера) и/или микроко-
нтролера пројектовати нови управљачки систем који ће обезбиједити да грешка у
дужини одсјечене цијеви не буде већа од 10 mm. Такође, један од захтјева је и да се
коришћењем неког од SCADA (енг. Supervisory Control And Data Acquisition) система
и/или неког другог програмског језика пројектује графички интерфејс, који ће
омогућити кориснику унос потребних података и команди за лакши рад и управљање
системa.

За управљачки уређај изабрали смо Ардуино микроконтролерску платформу.


Ардуино као управљачки систем, изабран је због тога што се програм написан за
Ардуино може врло лако, уз мале модификације прилагодити Ардуино ПЛК - у.

У другом поглављу овог рада извршена је анализа постојећег система и


утврђени су разлози који доводе до одступања у дужини одсјечене цијеви. Посебна
пажња посвећена је приједлогу новог управљачког система и избору компоненти које
ће обезбиједити захтијевано понашање система, односно које ће обезбиједити да
грешка у дужини одсјечене цијеви не буде већа од 10 mm.

Детаљно објашњење коришћених компоненти и опис њихових карактеристика


дато је у трећем поглављу. Акценат је стављен на Ардуино микроконтролерску
платформу која је коришћена за реализацију новог управљачког система.

Четврто и пето поглавље овог рада посвећено је програмском дијелу „летеће


тестере”, јер сам хардвер без одговарајућег софтвера ништа не значи. Такође, нешто
више је речено о вези између графичког интерфејса (SCADA) и микроконтролерске
платформе Ардуино, као и о програмском пакету “Processing” у коме је израђен
графички интерфејс за управљачки систем.

Посљедњe поглавље овог рада доноси нешто више о раду у лабораторији. У


овом поглављу датa je електрична и пнеуматска шема система, као и начин спајања
појединих компоненти са микроконтролером. Такође, приказано је како се користи
графички интерфејс за овај управљачки систем и тестиран је Ардуино програм.
2. АНАЛИЗА ПОСТОЈЕЋЕГ И ПРОЈЕКТОВАЊЕ
НОВОГ УПРАВЉАЧКОГ СИСТЕМА

У овом поглављу је описано постојеће рјешење управљачког система на


„летећим тестерама” у предузећу „МЕТАЛ“ а. д. Градишка. Након тога, дат је детаљан
приједлог новог управљачког система и списак коришћених компоненти, којим би се
ријешили постојећи проблеми управљачког система у поменутом предузећу, односно
рјешење којим би се обезбиједило жељено понашање система.

2.1 Анализа постојећег рјешења управљања на „летећим тестерама” у


предузећу „МЕТАЛ“ а. д. Градишка

Шавне цијеви производе се на специјалним линијама код којих се трака


постепено обликује у цијев. Овако формирана цијев даље се заварује, хлади, кали-
брише, сјече на унапријед задату дужину и на крају се пакује. Како је процес
производње цијеви на овим линијама непрекидан, то је сјечење цијеви неопходно
извршити у току њеног кретања, тј. „у ходу“. Тај задатак се реализује на посебно
конструисаним машинама познатим под називом „летеће тестере“ (енг. flying saw).
Постоје различите конструкције ових машина, од веома скупих, са великом тачношћу
сјечења цијеви до јефтиних машина код којих је одступање у дужини одсјечене цијеви
велико.

На слици 2.1 је приказана функционална шема постојеће „летеће тестере“ која се


користи на линијама цијеви у предузећу „МЕТАЛ“ а. д. Градишка, која спада у групу
машина са великим грешкама у дужини одсјечених цијеви (одступање дужине
одсјечене цијеви је и до 70 mm). Ова машина састоји се од постоља F са стазом на коју
су смјештена колица K која се крећу по њој. На колицима се налазе уређај за стезање –
стега S и уређај за сјечење – тестера P. Погон колица, стеге и посмака тестере остварен
је преко пнеуматских цилиндара са одговарајућим разводницима: колица преко цили-
ндара A и B, стеге преко цилиндра C и тестере преко цилиндра D, слика 2.1. Погон пиле
L на тестери је остварен преко електромотора E. Крајњи положаји цилиндра A, C и D
детектују се преко граничних прекидача: b, p, s и n. У почетном тренутку клипњаче
цилиндра B, C и D су увучене, а клипњача цилиндра A је извучена, као што је
приказано на слици 2.1. На машини је смјештен и сигурносни прекидач е чијим
активирањем се зауставља комплетна линија. Граничник g при кретању колицa
активира поменуте граничне прекидаче, при чему су прекидачи p и s тако конструисани
да их је могуће активирати само када се колица крећу у смјеру кретања цијеви
(прекидач са кољеном). Дужина цијеви, која се сјече поставља се и мјери помоћу
дигиталног бројача (енг. preset counter), при чему се као сензор дужине користи
оптички енкодер (енг. optical encoder) резолуције 1 mm.
АНАЛИЗА ПОСТОЈЕЋЕГ И ПРОЈЕКТОВАЊЕ НОВОГ УПРАВЉАЧКОГ СИСТЕМА

У тренутку када је измјерена дужина цијеви, достигла постављену дужину,


бројач генерише импулс за сјечење. Тај импулс истовремено поништава текућу врије-
дност бројача, тако да се наредним бројањем импулса са енкодера мјери дужина
сљедеће цијеви. Импулс за сјечење, такође, преко пнеуматских цилиндара A и B
активира кретање колица у смјеру кретања цијеви, након чега се преко граничника g
активира прекидач s који иницира стезање стеге S. Помоћу стеге, колица се „хватају“ за
цијев, тако да је надаље брзина кретања колица иста као брзина кретања цијеви, тј.
= , па је могуће почети са сјечењем цијеви. У току кретања колица граничник
даље активира прекидач p (који даје информацију да су се колица ухватила за цијев и
да се може отпочети са сјечењем цијеви), који уз услов да је већ активиран прекидач b
(који је активиран када је клипњача цилиндра D увучен) , изазива извлачење клипњаче
цилиндра D, а тиме и помјерање пиле L. У току помјерања листа пиле, прекидач b је
преко посебног граничника активиран, а тек на крају сјечења он се преко тог грани-
чника деактивира, што опет изазива аутоматско враћање цилиндра D у почетни положај
(поново је активиран прекидач b). Истовремено активирање прекидача n и b сигнали-
зира да је процес сјечења цијеви завршен, што изазива отпуштање стеге и враћање
колица назад у почетни положај. У повратном ходу колица, цилиндар B има улогу
амортизера, чиме је омогућено „меко“ заустављање колица. У случају да процес
сјечења није завршен до активирања прекидача е линија се аутоматски зауставља, чиме
се спријечава губитак у циклусу сјечењa и евентуална хаварија која може довести до
повреде оператера.

Слика 2.1: Шема летеће тестере “flying saw”

С обзиром да на постојећим линијама цијеви у „МЕТАЛ“ а. д., Градишка,


системи за управљање на „летећим тестерама“ дају велике грешке у дужини сјечења
цијеви, што узрокује велики шкарт код даљног конфекционирања цијеви. Због тога се
јавља потреба за пројектовањем новог система управљања на постојећим „летећим
тестерама“. Рјешавање тог проблема је тема овог мастер рада.

Машински факултет у Бањој Луци 9


АНАЛИЗА ПОСТОЈЕЋЕГ И ПРОЈЕКТОВАЊЕ НОВОГ УПРАВЉАЧКОГ СИСТЕМА

До великог одступања у дужини одсјечене цијеви првенствено долази због тога


што су различити пређени путеви које цијев и колица пређу до момента стезања стеге S.
Ова одступања настају због различитих брзина цијеви и колица у времену Т, гдје Т
представља вријеме које протекне од тренутка слања импулса за сјечења цијеви до
тренутка за стезањa стеге S (не постоји уређај за мјерење пређеног пута колица).
Импулс за сјечење цијеви преко разводних вентила покреће пнеуматске цилиндре А и B
и тиме активира кретање колица, након чега се преко граничника g активира прекидач s
који иницира стезање стеге S. Када се активира прекидач s (у оваквој конструкцији
машине), претпостављамо да су у том тренутку пређени путеви колица и цијеви исти,
тј. = , гдје представља пређени пут колица, а пређени пут цијеви. Међутим,
то је само претпоставка, јер ми у ствари не знамо колики су пут прешла колица. Колица
крећу из стања мировања и она треба да се ухвате за цијев кад су путеви које пређу
цијев и колица исти. Претпостављамо да је брзина цијеви у времену Т константна, док
је у моменту стезања, брзина колица увијек већа од брзине цијеви (због тога што се
клипњача цилиндра креће брже од цијеви). На брзину колица могу утицати разни
фактори. Први и основни фактор који утиче на брзину кретања колица је стишљивост
ваздуха као и начин довода ваздуха до самих цилиндара. Што значи да ови проблеми
могу довести до тога да се пнеуматски цилиндри А и B (колица) активирају са
кашњењем од неколико десетина милисекунди. Други фактор који може да утиче на
одступање у дужини одсјечене цијеви je механички прекидач који иницира стезање
стеге S, јер граничник g активира прекидач s који даје импулс за стезање уз
претпоставку да је = . Ако механички прекидач s не одреагује одмах када га
активира граничник g, већ закасни неколико десетина милисекунди, то ће унијети
додатно кашњење које ће се одразити на дужину одсјечене цијеви. Као врло важан
разлог треба навести и то да у моменту иницијализације сјечења, колица крећу из стања
мировања, тако да им је због инерције, потребно неко вријеме да се убрзају и пређу
исти пут као и цијев. Сва ова временска кашњења се разликују од циклуса до циклуса,
па отуда и дужина одсјечене цијеви одступа од жељене дужине. На основу свега овог,
можемо закључити да ће до стезања стеге доћи са одређеним кашњењем, па ће се због
тога разликовати жељена од стварне дужине цијеви. У зависности од фактора које смо
поменули (стишљивости ваздуха, исправности механичког прекидача s, похабаности
граничника g, инерције колица) ова кашњења могу бити мања или већа, што се
одражава и на вриједност одступања у дужини жељене вриједности цијеви. Уколико
укупно кашњење нпр. износи 50 ms, уз претпоставку да је брзина цијеви 1 m/s. тада ће
одступање жељене од стварне дужине цијеви износити:

= ∙ = 1 ∙ 5 ∙ 10 = 5 ∙ 10 [ ] = 5[ ].

2.2 Приједлог новог рјешења управљања на „летећим тестерама” у


предузећу „МЕТАЛ“ а. д. Градишка

Као што смо већ констатовали у претходном поглављу, основни проблем који доводи
до великог одступања у жељеној дужини одсјечене цијеви настаје због различитих
вриједности пређених путева колица и цијеви до момента стезања стеге S. Да бисмо

Машински факултет у Бањој Луци 10


АНАЛИЗА ПОСТОЈЕЋЕГ И ПРОЈЕКТОВАЊЕ НОВОГ УПРАВЉАЧКОГ СИСТЕМА

ријешили овај проблем морамо на неки начин мјерити пређени пут колица и поредити
га са пређеним путем цијеви (који мјеримо помоћу инкременталног енкодера). Пут који
прeђе цијев за сјечење је = ∙ , док је пут који прeђу колица у том времену
= ∙ , гдје je представља брзину кретања цијеви, а средњу брзину кретања
колица у времену Т. Тренутна брзина кретања колица је = ∙ , гдје представља
убрзање колица, док је средња брзина кретања колица = ∙ , односно пређени пут
= ∙ = ∙ ∙ = ∙ .

Стега треба да се ухвати за цијев кад су путеви који пређу колица и цијев исти,
без обзира да ли су у том тренутку њихове брзине исте. Претпостављамо да је брзина
цијеви у времену Т константна, док је у моменту стезања брзина колица увијек већа од
брзине цијеви. Када се вриједности ова два пређена пута изједначе, тј. када буде
= стега S треба да стегне цијев. У том случају добијамо да се цијев и колица крећу
истом брзином, тј. = . Овим смо постигли да активирање стеге S не зависити од
тога када ће граничник g да активира прекидач s, већ ће цијели процес зависити од тога
када ће се пређени путеви колица и цијеви изједначити.

Мјерење пређеног пута колица најлакше се може извршити помоћу “wire


encoder - a” (енкодера са ужетом). Помоћу овога енкодера можемо мјерити линеарно
помјерање цилиндра А, а самим тим и пређени пут колица. На слици 2.2 приказан је
приједлог нове шеме „летеће тестере”. Са but8 је означен крајњи прекидач, чијим се
активирањем цјелокупан процес зауставља. Овај прекидач представља неку врсту
нужног стопа. Активирањем прекидача but1 колица се враћају у почетни положај, док
активирање прекидача but7 означава да је стега стегнула цијев, односно да је цилиндар
C извучен до крајњег положаја. Прекидачи but10 и but3 означавају почетни и крајњи
положај тестере, односно цилиндра D.

Слика 2.2: Приједлог нове шеме летеће тестере “flying saw”

Импулс за сјечење, иницира микроконтролер када инкрементални енкодер (који


мјери дужину цијеви) достигне задату (жељену) вриједност. По достизању задате
вриједности, микроконтролер шаље импулс разводном вентилу који активира цилиндар

Машински факултет у Бањој Луци 11


АНАЛИЗА ПОСТОЈЕЋЕГ И ПРОЈЕКТОВАЊЕ НОВОГ УПРАВЉАЧКОГ СИСТЕМА

А, чијим се кретањем извлачи уже “wire encoder - а”, на основу чега можемо мјерити
пређени пут колица. Када се вриједност пређеног пута цијеви, који се мјери помоћу
инкременталног енкодера и пређеног пута колица који се мјери помоћу “wire encoder -
a” поклопе, шаље се импулс разводном вентилу стеге S и иницира се стезање. На овај
начин смо обезбиједили да су задата и стварна дужина цијеви исте. Достизањем
крајњег положаја стеге S, активира se крајњи прекидач but7, који уз услов да је
претходно активиран и прекидач but2 иницира активирање разводног вентила тестере
D и сјечење цијеви. Након тога колица долазе до прекидача but1, чијим се активирањем
враћају у почетни положај. Овим је циклус сјечења цијеви завршен и процес се може
поново наставити.

2.3 Избор компоненти које ће обезбиједити жељено понашање система

Да би цјелокупан систем испунио све захтјеве који се постављају пред њима,


односно да бисмо добили што мање одступање у дужини одсјечене цијеви потребно је
правилно изабрати компоненте које ће то омогућити. Као и код пројектовања било
којег другог система полазимо од блок дијаграма. На слици 2.3 приказан је блок
дијаграм „летеће тестере”. У питању је систем са негативном повратном спрегом, где је
излаз оно што сензор мјери (позиција колица), док је референца r пређени пут цијеви од
тренутка иницирања сјечења.

Превасходно потребно је изабрати уређај који ће управљати објектом


(разводним вентилима цилиндара А, C и D), тако да он испуни захтјеве који се
постављају пред њим. Избор се врши на основу захтјева система, његове сложености и
поузданости. При избору управљачког уређаја морамо водити рачуна како о хардверу
тако и о софтверу.

Слика 2.3: Блок дијаграм

За управљачки уређај изабрали смо Ардуино микроконтролерску платформу.


Ардуино прoграмски језик базиран је на програмским језицима C++ и Java (прецизније
Јавином производу „Processing”). Тиме је обезбијеђена подршка великог броја
корисника, јер се за ове програмске језике може слободно рећи да су водећи у подручју
развоја нових софтверских рјешења. Ардуино као управљачки систем, изабран је због
тога што се програм написан за Ардуино може врло лако, уз мале модификације
прилагодити Ардуино ПЛК - у. Компатибилност микроконтролера и ПЛК - а врло је
битна, због тога што је цјелокупан систем могуће реализовати и испитати у лаборато-

Машински факултет у Бањој Луци 12


АНАЛИЗА ПОСТОЈЕЋЕГ И ПРОЈЕКТОВАЊЕ НОВОГ УПРАВЉАЧКОГ СИСТЕМА

ријским условима помоћу микроконтролера, који је много јефтинији у поређењу са


ПЛК - ом. Када смо све реализовали и испитали у лабораторији, у индустријским
условима можемо користити ПЛК, јер употреба микроконтролера у индустријским
условима носи многе проблеме са собом због утицаја шумова на њега.

Постоји више различитих Ардуино платформи које зависе од намјене, али


највише коришћена због ниске цијене и могућности обављања различитих задатака који
се пред њу поставе, јесте Ардуино Уно. Управо је из тог разлога за управљање изабрана
микроконтролерска платформа Ардуино Уно, слика 2.4.

Слика 2.4: Ардуино Уно

Након што смо изабрали управљачки систем, потребно је изабрати сензоре који
ће обезбиједити захтијевану дужину цијеви. Као и код избора управљачког система,
тако и код избора сензора постоји неколико врста сензора који могу да испуне задатке
који се пред њих постављају. У овом случају за сензор је изабран енкодер са ужетом
(wire encoder SP1 – 50) и он је приказан на слици 2.5. Помоћу овога енкодера можемо
мјерити линеарно помјерање цилиндра А, а тиме и пређени пут колица.

Слика 2.5: Енкодер са ужетом “wire encoder”

Машински факултет у Бањој Луци 13


АНАЛИЗА ПОСТОЈЕЋЕГ И ПРОЈЕКТОВАЊЕ НОВОГ УПРАВЉАЧКОГ СИСТЕМА

2.4 Ардуино ПЛК – а

Постоје двије врсте ПЛК – а заснованих на Ардуино микроконтролерској


платформи, а то су: ARDBOX и M – DUINO Ethernet. ARDBOX је Ардуино ПЛК (слика
2.6а) заснован на Ардуино Леонардо микроконтролерској платформи, док је M –
DUINO Ethernet (слика 2.6б) заснован на Ардуино мега платформи. За програмирање и
надзор рада Ардуино ПЛК – а користи се стандардно Ардуино развојно окружење које
ће бити детаљно описано у поглављу 3.3 Ардуино софтвер. Ардуино ПЛК је такође
могуће програмирати и у leader дијаграму.

ARDBOX је доступан у двије верзије: ARDBOX 20 I/Os Analog (10 In/10 Out) и
ARDBOX PLC 20 I/Os RELAY (10 In/10 Out), при чему његови излази могу бити
дигитални, аналогни и релејни. M – DUINO Ethernet ПЛК – а је доступан у шест
различитих верзија: M-DUINO PLC19R I/O Rele/Analog/Digital (7 In/12 Out), M-
DUINO21 I/O Analog/Digital (13 In/8 Out), M-DUINO PLC38R I/O Rele/Analog/Digital (14
In/24 Out), M-DUINO PLC42 I/O Analog/Digital (26 In/16 Out), M-DUINO PLC57R I/O
Rele/Analog/Digital (21 In/36 Out), M-DUINO PLC58 I/O Analog/Digital (36 In/22 Out) и
излази му могу бити дигитални, аналогни, релејни и PWM.

а) ARDBOX ПЛК – а б) M – DUINO Ethernet ПЛК – а

Слика 2.6: Изглед Ардуино ПЛК - а

Техничке карактеристике ARDBOX ПЛК – а:

 микроконтролер: ATmega32u4
 радни напон: 12 до 24 V
 напајање напоном (препоручено): 24 V
 I/O пинови: 20
 аналогни 10 bit: 6
 Interrupt: 4
 flash меморија: 32 KB (ATmega32u4) од којих је 4 KB искоришћено за bootloader
 SRAM: 2.5 KB (ATmega32u4)
 EEPROM: 1 KB (ATmega32u4)
 радни такт: 16 MHz.

Машински факултет у Бањој Луци 14


3. УГРАЂЕНЕ КОМПОНЕНТЕ

У овом поглављу ћемо детаљније описати компоненте које смо изабрали у


претходном поглављу и обратићемо више пажње на њихове карактеристике. За
управљачки систем изабрали смо Ардуино Уно, док као сензоре користимо
инкрементални енкодер и енкодер са ужетом (wire encoder).

3.1 Ардуино

Управљачки систем је „мозак” цјелокупног система. Он заправо представља


рачунар и има задатак да прима сигнале од сензора и с обзиром на то какве је сигнале
добио, извршава одговарајуће радње. Најједноставнији управљачки систем може бити
микроконтролер, јер је он цјеловити рачунар, има своју меморију и свој процесор. За
мозак „летеће тестере” изабрана је развојна платформа Ардуино. Ардуино је универ-
зални микроконтролер заснован на ATmel микропроцесору и идеалан је за развој
управљачке електронике. Ардуино платформа је open-source физичка рачунарска
платформа, заснована на једноставној I/O плочи и развојном окружењу. Open-source
IDE (енг. Integrated Development Environment - интегрисано развојно окружење) се може
бесплатно преузети са Ардуино сајта (тренутно за Mac OS X, Windows и Linux).
Намијењен је за умјетнике, дизајнере и све заинтересоване кориснике који желе
стварати интерактивне објекте или окружење. Главна намјена цијелог система је
комуникација са различитим хардвером који је на њега прикључен.

Хардвер се састоји од једноставног отвореног хардверског дизајна Ардуино


плоче са Atmel AVR процесором и пратећим улазно – излазним елементима. Софтвер се
састоји од развојног окружења које чине стандардни компајлер и bootloader који се
налази на самој плочи.

Ардуино је доступан у неколико различитих верзија, које зависе од намјене. На


слици 3.1. су приказане неке од Ардуино плоча.

Слика 3.1: Ардуино плоче


УГРАЂЕНЕ КОМПОНЕНТЕ

Официјалне Ардуино плоче су:

 Arduino Uno,
 Arduino Leonardo,
 Arduino Mega 2560,
 Arduino WiFi Shield,
 Arduino Lilypad,
 Arduino Ethernet Shield,
 Arduino Mega ADK,
 Arduino Fio,
 Arduino Wireless SD Shield,
 Arduino Ethernet,
 Arduino Pro,
 Arduino Wireless Proto Shield,
 Arduino ArduinoBT,
 Arduino Nano,
 Arduino Motor ShieldMini,
 Arduino Pro Mini,
 Arduino Due.

За реализовање овог пројекта изабран је основни модел, а то је Ардуино Уно,


због чега ћемо у наставку говорити о тој платформи.

3.2 Ардуино хардвер

Ардуино Уно је микроконтролерска платформа која се базира на ATmega328


чипу. Има 14 дигиталних I/О пинова (од којих 6 могу да се користе као PWM излази), 6
аналогних улаза, кристални осцилатор од 16 MHz, USB конектор, улаз за екстерно
напајање, ICSP конектор и тастер за ресетовање. Садржи све што је потребно за
подршку микроконтролеру, а једноставно се повезује са рачунаром преко USB кабла
(или се треба обезбиједити спољашње напајање преко адаптера или батерије). Ардуино
Уно разликује се од осталих платформи у смислу да не користи USB - to - Serial чип,
већ умјесто њега има AТmega8U2 који је програмиран као USB – to – Serial конвертор.
То обезбјеђује брже учитавање програма, а и нису потребни драјвери за Linux или Mac.

На слици 3.2 је приказана микроконтролерска платформа Ардуино Уно. Срце


Ардуина чини интегрисано коло (чип AТmega328) са 28 пинова. Овај 8 – битни
микроконтролер има 32 KB програмске флеш меморије, 1 KB EEPROM меморије и 2 KB
интегрисане RAM меморије. Његова максимална радна фреквенција је 20 MHz, али
овдје се користи радна фреквенција од 16 MHz.

Машински факултет у Бањој Луци 16


УГРАЂЕНЕ КОМПОНЕНТЕ

Слика 3.2: Микроконтролерска плоча Ардуино Уно

Напомена: Дизајн Ардуино платформе може користити ATmega8, 168 или 328
микроконтролер. Тренутни модели користе ATmega328, на слици 3.3. приказана је
шема ATmega168. Пин конфигурација је идентична за сва три процесора.

Слика 3.3: Распоред пинова на контролеру и аналогија пинова на Ардуино плочи

Ардуино Уно се може напајати путем USB везе или са екстерним напајањем.
Извор напајања је аутоматски одабран. Екстерно (не USB) напајање може доћи из
AC/DC адаптера или батерије. Адаптер може бити спојен прикључком 2,1 mm у
утичницу, улаз за екстерно напајање на слици 3.2.

Машински факултет у Бањој Луци 17


УГРАЂЕНЕ КОМПОНЕНТЕ

Платформа може радити на вањском напону 7 – 20 V. Ако је улазни напон мањи


од 7 V, тада 5 V пин може имати напон мањи од 5 V и рад Ардуина може бити неста-
билан. Ако се користи више од 12 V, регулатор напона се може прегријати и оштетити
плочу. У литератури се препоручује распон напона од 7 – 12 V.

У наставку текста, детаљније су описане функције још неких прикључака на


Ардуино плочи:

 VIN - улазни напон на Ардуино плочу када се користи екстерно напајања (за
разлику од 5 V из USB прикључка ово је други регуларни извор напајања).
 5 V - регулисано напајање користи се за напајање микроконтролера и осталих
компоненти на плочи. Оно може бити из VIN преко on-board регулатора, или
преко USB – a.
 3V3 - 3.3 V напајања генерише се помоћу FTDI чипа.
 GND - маса.

Сваки од 14 дигиталних пинова на микропроцесору Ардуино Уно може се


користити као улаз или излаз користећи pinMode(), digitalWrite() i digitalRead()
функције, што је у софтверском дијелу овог рада детаљно објашњено. Они раде на 5 V,
при чему је улазна или излазна струја на сваком од ових пинова највише 40 mА. На
сваком од ових пинова интегрисани су pull-up отпорници вриједности од 20 до 50 kΩ,
који се могу софтверски укључити или искључити. У почетном стању (енг. default)
отпорници су искључени.

Осим тога, неки пинови имају специјалне функције:

 Серијски: 0 (RX) i 1 (TX). Користи се за примање (RX) и пренос (TX) серијских


података TTL напонског нивоа. Ови пинови су повезани са одговарајућим
пиновима у ATmega8U2 USB – TTL серијском чипу.
 Прекидни (interupt) пинови: 2 и 3. Ови пинови могу бити конфигурисани за
покретање вањског (екстерног) прекида, при чему се прекиди могу активирати
ниском/високом ивицом или промјеном вриједности што се софтверски
одређује.
 PWM: 3, 5, 6, 9, 10, i 11. Осигурава 8 – битни PWM излаз помоћу analogWrite()
функције.
 SPI: 10 (SS), 11 (Mosi), 12 (MISO), 13 (SCK). Ови пинови подржавају SPI (Serial
Peripheral Interface) комуникацију користећи SPI библиотеку.
 LED: 13. Ту је LED спојен на дигитални пин 13. Када је на пину висока
вриједност LED свијетли, а када је на пину ниска вриједност LED не свијетли.

Ардуино Уно има 6 аналогних улаза, са ознаком А0 до А5, од којих сваки пружа
10 битну резолуције (тј. 1024 различите вриједности) тако да се за улазни континуални
напон од 0 V до 5 V на излазу добија дигитални број од 0 до 1023. Од аналогних пинова
два се могу конфигурисати за посебне намјене. То су пинови А4 и А5 преко којих се
може обезбиједити ефикасна и широко примјењивана I2C (Inter-Integrated Circuit)
серијска комуникација.

Машински факултет у Бањој Луци 18


УГРАЂЕНЕ КОМПОНЕНТЕ

Постоји неколико других пинова на плочи:

- AREF - референтни напон за аналогне улазе, analogReference().


- Reset - када се на овај пин доведе 0 V (ниска вриједност), микроконтролер се
ресетује.

Ардуино Уно може успоставити комуникацију са рачунаром, другим Ардуино


плочама или другим микроконтролерима. ATмega328 пружа UART TTL (5 V) серијску
комуникацију, која је доступна на дигиталним пиновима 0 (RX) и 1 (ТX). ATмega328
серијску комуникацију остварује преко USB - а и појављује се као виртуални COM порт
на рачунару. ATмega16U2 Firmware користи стандардни USB COM дрajвер, а вањски
дрajвер није потребан. Ардуино софтвер омогућава једноставнији мониторинг
текстуалних података који се са Ардуино плоче серијски шаљу. Ово омогућава
једноставно тестирање програма у току њиховог развоја. При преносу података преко
USB - to - serial чипа и USB прикључка на рачунару RX i TX LED на плочи ће
засвијетлити (ове LED диоде не свијетле кад је серијска комуникација остварена преко
дигиталних пинова D0 и D1).

Аналогни пинови се могу користити као дигитални при чему се морају


конфигурисати помоћу наредбе pinMode на следећи начин:

pinMode(A0, OUTPUT);
digitalWrite(A0, HIGH);

ATмega328 такође, подржава I2C (TWI) и SPI комуникацију. Софтвер укључује


Wire библиотеку која поједностављује коришћење I2C bus – а.

Техничка спецификација Ардуино Уно микроконтролерске плоче:

 микроконтролер: ATmega328
 радни напон: 5 V
 напајање напоном (препоручено): 7 – 12 V
 максимално напајање напоном (не препоручује се за дуготрајан рад): 20 V
 дигитални I/O пинови: 14 (од којих 6 обезбјеђује PWM излаз)
 аналогни улазни пинови: 6
 струја по I/O пину (5 V): 40 mA
 струја по I/O пину (3.3 V): 50 mA
 flash меморија: 32 KB (ATmega328) од којих је 0.5 KB искоришћено за bootloader
 SRAM: 2 KB (ATmega328)
 EEPROM: 1 KB (ATmega328)
 радни такт: 16 MHz.

Машински факултет у Бањој Луци 19


УГРАЂЕНЕ КОМПОНЕНТЕ

3.3 Ардуино софтвер

Програмирање микроконтролера је наука сама за себе, те се о њој неће пуно


говорити у овом раду, осим објашњења кода и његовог алгоритма. За израду програма
помоћу којег ради „летећа тестера” кориштен је софтверски алат Ардуино. Ардуино
интегрисано развојно окружење је апликација написана у Java програмском језику.
Креирана је тако да уведе у програмирање ученике, студенте и остале почетнике, који
нису упознати са начином развоја софтвера. Састоји се од уређивача кода (едитора
текста), са могућностима као што су означавање кода, упаривање заграда, аутоматско
увлачење линија. Овај уређивач може да преведе код, а затим да га пребаци у чип
једном командом. У овом случају није потребно подешавати параметре превођења кода
или покретати програме из командне линије.

Слика 3.4: Почетни приказ Ардуино софтвера 1.6.12

Ардуино интегрисано развојно окружење долази са C и C++ библиотеком


званом ”Wiring” која чини уобичајене улазно/излазне операције веома једноставним.
Ардуино програми пишу се у C и C++ програмском језику. Корисници да би
направили извршни програм, морају дефинисати само две функције:

 setup() – функција која се извршава једном на почетку и служи за почетна


подешавања,
 loop() – функција која се извршава у петљи све вријеме док се не искључи
Ардуино платформа.

Слика 3.5: Ардуино софтвер

Машински факултет у Бањој Луци 20


УГРАЂЕНЕ КОМПОНЕНТЕ

Типичан први програм у Ардуино програмском окружењу је програм који


укључује и искључује LED диоду и он је дат сљедећим кодом:

#define LED_PIN 13
void setup () {
pinMode (LED_PIN, OUTPUT);// definisi pin 13 kao digitalni izlaz
}
void loop () {
digitalWrite (LED_PIN, HIGH); // ukljuci LED
delay (1000); // sacekaj jedanu sekundu (1000
milisekundi)
digitalWrite (LED_PIN, LOW); // iskljuci LED
delay (1000); // sacekaj jedanu sekundu
}

Да би овај код исправно радио, анода LED диоде мора


мора бити повезана на пин 13, а
катода LED диоде на уземљење (у овом случају негативни дио напајања). Овај примјер
од стране стандардног C++ преводиоца, не би био виђен као исправан програм,
међутим када корисник
корисник изда команду за превођење, овом коду се додаје извесно
заглавље и једна једноставна main() функција чиме он постаје исправан. Ардуино
развојно окружење користи GNU toolchain и AVR Libc за превођење програма.

3.4 Инкрементални енкодер

Инкрементални енкодери
енкодери раде на принципу генерисања поворке импулса чијим
се бројањем израчунава угаони померај. Због тога се инкрементални енкодери често
називају бројачким енкодерима. Инкремен
Инкрементални
тални енкодер је оптички уређај помоћу
којег се мјери угао, при чему се (узимај
(узимајући
ући у обзир и вријеме) може мјерити и угаона
брзина осовине. На примјер ако се мјери промјена угла у току 1 секунде онда се добија
угаона брзина [ ⁄ ].. Ови енкодери се састоје из три главна елемента: диска,
свјетлосног извора (емитер) и свјет
свјетлосног
лосног детектора) Диск је монтиран на осовину и
смештен између пара емитер-детектор
емитер детектор (слика 3.6). Како се осовина окреће отвори у
диску пресецају емитоване светлосне зраке. Хардвер и софтвер, повезани на детектор,
прате ове светлосне импулсе и помоћу њих оп опажају
ажају ротацију осовине.

Слика 3.6: Једнофазни енкодер

Инкрементални енкодери своју позицију и брзину саопштавају преко импулса


фазе A и фазе B који су фазно помјерени за 90º. Овај фазни помјерај омогућава

Машински факултет у Бањој Луци 21


УГРАЂЕНЕ КОМПОНЕНТЕ

одређивађе смјера обртања. Када се ротор окреће у смјеру казаљке (CW eng. Clockwise )
канал А предњачи за у односу на канал B. За супротни смјер (CCW eng. Counter –
clockwise) канал B предњачи за у односу на канал А .Овакав тип сигнала се назива
квадратурни. Детекцијом узлазних и силазних ивица фазних импулса и комбинацијом
овако добијених импулса са фазним импулсима, резолуција енкодера се може увећати
до четири пута. Овај поступак приказан је на слици 3.7.

Слика 3.7: Увећање резолуције енкодера

У зависности од смјера обртања генеришу се UP и DOWN импулси, и то четири


пута већом учесталошћу од фазне. Производе се инкрементални енкодери са 50 до
10,000 импулса по обртају, међутим највећу примјену имају енкодери са 1,024, 2,500 и
5,000 импулса. Енкодери са 1,024 импулса по обртају користе се за главна вретена
алатних машина, а енкодери са 2,500 и 5,000 импулса за осе помоћног кретања.
Савремени енкодери се могу спајати на BUS рачунарске мреже чиме се знатно смањује
број потребних каблова.

Слика 3.8: Принцип рада инкременталног оптичког енкодера

Машински факултет у Бањој Луци 22


УГРАЂЕНЕ КОМПОНЕНТЕ

3.5 Енкодер са ужетом (wire encoder)

Енкодери са ужетом (слика 3.9) омогућавају мјерење линеарног помака на већим


удаљеностима. Wire encoder SP – 1 је енкодер који може мјерити дужину до 1270 mm.

Слика 3.9: Шема потенциометра са ужетом

За реализацију овог рада кориштен је потенциометарски претварач линеарног


помјераја који је функционално исти као ротациони инкрементални енкодер.
Потенциометар је кориштен из разлога што је много јефтинији од енкодера, а постижу
се потпуно исти резултати као да се примјењује енкодер. Потенциометарски
претварачи линеарног помјераја имају мјерно подручје од 10 mm до неколико метара,
док потенциометарски претварачи угаоног помјераја имају најмање мјерно подручје од
0° до 1°, а највеће од 0° до више од 360° . За мјерно подручје веће од 355° користе се
вишенавојни потенциометри.

Слика 3.10: Изведба потенциометра са ужетом произвођача CELESCO

Машински факултет у Бањој Луци 23


УГРАЂЕНЕ КОМПОНЕНТЕ

Улазна отпорност SP –1 сензора износи 10 kΩ ±10%. Максимална вриједност


улазног напон износи 30 V. На слици 3.11а приказано је како се мијења излазни сигнал
у зависности од тога колико је уже извучено. Начин спајања овог потенциометра
приказан је на слици 3.11б. Видимо да се овај потенциометар релативно лако спаја. Има
три прикључка CW(3) – улаз (+in) CCW(1) – уземљење (GND) и S(2) – излаз (out).

а) б)

Слика 3.11: Излазни сигнал и начин спајања потенциометра са ужетом

Машински факултет у Бањој Луци 24


4. АРДУИНО УПРАВЉАЧКИ ПРОГРАМ

Програм писан за Ардуино назива се скеч (енг. sketch). Сваки Ардуино програм састоји
се из три дијела. У првом дијелу дефинишемо варијабле и константе које су видљиве у
цијелом програму (глобалне променљиве), те укључујемо библиотеке уколико су нам
потребне за реализовање програма. Друга два дијела програма састоје се од главних
функција програма: setup() која се извршава само једном, на почетку рада програма и
loop() која представља главни дио програма. Највећи дио кодирања је унапријед
дефинисан тако да не треба да се креће са програмирањем од нуле (што програмирање
много олакшава).

Слика 4.1: Картица Tools у Ардуино програмском окружењу

Након што напишемо код, требамо извршити команду из менија


”Tools→Boards” и изабрати микроконтролер који користимо (у нашем случају то је
микроконтролерска платформа eng. Arduino/Genuino Uno). Затим под ”Tools→Serial”
треба одабрати порт микроконтролера који је додјељен микроконтролеру при
инсталацији софтвера на рачунару. Уколико користимо неки други порт на рачунару,
нећемо моћи да упишемо код програма на микроконтролер. На траци са алаткама
(слика 4.1), налази се пет опција (Upload, Verify, New, Open, Save). Опција са стрелицом
десно представља ”Upload”, кликом на ”Upload”, наш код ћемо уписати у меморију
микроконтролера. Ако све прође без грешке, то ће указати да је код успешно уписан у
меморију микроконтролера, у супротном ће нас програм обавијестити о постојању
грешке и даће нам опис о томе шта је грешка. Поред ”Upload” опције имамо још
опције ”Verify“, ”New“, ”Open“ и ”Save“, следствено.
АРДУИНО УПРАВЉАЧКИ ПРОГРАМ

4.1 Серијска веза између Ардуина и SCADA система

Серијску везу, осим за програмирање Ардуина користимо и за комуникацију


између Ардуина и рачунара или неког другог уређаја. Ардуино има серијски порт
UART. Он комуницира помоћу два пина, пин 0 (RX) и пин 1 (TX). Дакле, ако се користи
серијска веза у раду Ардуина тада пинове 0 и 1 не можемо користити у друге сврхе.
Покретање серијске везе врши се наредбом:

Serial.begin (9600);

Аргумент наредбе је брзина преноса серијском везом која код Ардуина може
бити до 115200 бита/секунди. Након покретања серијске везе, уз помоћ наредбе
available() можемо провјерити колико смо знакова серијском везом примили. Ако је
број знакова које смо примили већи од 0 тада знакове можемо преузети наредбом
read(). Слање података од Ардуина према вањском уређају је врло једноставно и врши
се наредбом print(). Ако нам веза више није потребна можемо је зауставити наредбом
end(). Примјер програма који прима податак серијском везом и одмах га шаље назад уз
реченицу “Primio sam:” дат је сљедећим кодом:

int incomingByte = 0;
void setup() {
Serial.begin(9600);
}
void loop() {
if (Serial.available() > 0) { incomingByte = Serial.read();
Serial.print("Primio sam: "); Serial.print(incomingByte,
DEC);
}
}

У овом раду серијска веза употребљава се за комуникацију Ардуина са


рачунаром, односно са SCADA системом. SCADA преко серијске везе шаље
информације Ардуину о броју комада одсјечених цијеви, дужини цијеви као и о
изабраном режиму рада (аутоматски, ручни или циклусни режим рада).

Слика 4.2: Серијска комуникација рачунар (SCADA) – Ардуино

Машински факултет у Бањој Луци 26


АРДУИНО УПРАВЉАЧКИ ПРОГРАМ

Потпрограм помоћу којег добијамо потребне вриједности са серијског порта (из


”Processing” - a) је:

void serialEvent()
{
int input;

while (Serial.available())
{
input = (char)Serial.readBytesUntil('&', serial_buffer,
sizeof(serial_buffer) - 1);
serial_buffer[input] = '\0';
primljen = true;
}
}

Циклус while нам условљава понављање кода све док серијска веза прима
податке. Код у петљи чита податке са серијске везе и смјешта их у променљиву input.
Серијски порт чита податке све док се не појави карактер '&' који представља
посљедњи карактер који је послат серијском везом. На овај начин смо сигурни да је
Ардуино примио све податке које смо му послали из SCADA система.

4.2 Анализа података добијених са серијског порта

Када смо добили податке са серијске везе неопходно их је декодирати и


разврстати, тако да Ардуино зна који се подаци односе на дужину цијеви, број комада
или изабрани режим рада. Декодирање података вршимо са сљедећим кодом:

void loop ()
{
if(primljen)
{
serial_buffer[0] = '\0';
primljen = false;

//Dekodiranje podataka dobijenih sa seriskog porta


broj_komada1 = 1000 * (serial_buffer[1] - 48) + 100 *
(serial_buffer[2] - 48) + 10 * (serial_buffer[3] - 48)+
(serial_buffer[4] - 48);
duzina1 = 1000 * (serial_buffer[5] - 48) + 100 *
(serial_buffer[6] - 48) + 10 * (serial_buffer[7] - 48) +
(serial_buffer[8] - 48);

broj_komada2 = 1000 * (serial_buffer[9] - 48) + 100 *


(serial_buffer[10] - 48) + 10 * (serial_buffer[11] - 48)+
(serial_buffer[12] - 48);
duzina2 = 1000 * (serial_buffer[13] - 48) + 100 *
(serial_buffer[14] - 48) + 10 * (serial_buffer[15] - 48) +
(serial_buffer[16] - 48);

Машински факултет у Бањој Луци 27


АРДУИНО УПРАВЉАЧКИ ПРОГРАМ

broj_komada3 = 1000 * (serial_buffer[17] - 48) + 100 *


(serial_buffer[18] - 48) + 10 * (serial_buffer[19] - 48)+
(serial_buffer[20] - 48);
duzina3 = 1000 * (serial_buffer[21] - 48) + 100 *
(serial_buffer[22] - 48) + 10 * (serial_buffer[23] - 48) +
(serial_buffer[24] - 48);

broj_komada4 = 1000 * (serial_buffer[25] - 48) + 100 *


(serial_buffer[26] - 48) + 10 * (serial_buffer[27] - 48)+
(serial_buffer[28] - 48);
duzina4 = 1000 * (serial_buffer[29] - 48) + 100 *
(serial_buffer[30] - 48) + 10 * (serial_buffer[31] - 48) +
(serial_buffer[32] - 48);

broj_komada5 = 1000 * (serial_buffer[33] - 48) + 100 *


(serial_buffer[34] - 48) + 10 * (serial_buffer[35] - 48)+
(serial_buffer[36] - 48);
duzina5 = 1000 * (serial_buffer[37] - 48) + 100 *
(serial_buffer[38] - 48) + 10 * (serial_buffer[39] - 48) +
(serial_buffer[40] - 48);
}

Када смо декодирали податке, неопходно их је смјестити у низове: nizV[5] = {}


резервисан за дужину цијеви и nizG[5] = {} резервисан за број комада цијеви.
Испитивање који је режим рада активан вршимо тако што провјеравамо који податак са
серијског бафера има вриједност 1. Код помоћу којег то радимо је сљедећи:

nizV[0]=duzina1;
nizV[1]=duzina2;
nizV[2]=duzina3;
nizV[3]=duzina4;
nizV[4]=duzina5;

nizG[0]=broj_komada1;
nizG[1]=broj_komada2;
nizG[2]=broj_komada3;
nizG[3]=broj_komada4;
nizG[4]=broj_komada5;

if (serial_buffer[41]==1) //Automatski rezim aktivan


{
aut=1;
count=0;
}
if(serial_buffer[42]==1) //Rucni rezim aktivno
ruc=1;
if(serial_buffer[43]==1) //Ciklusni rezim aktivan
cik=1;

4.3 Потпрограми за аутоматски, циклусни и ручни режим рада

Након што смо све податке са серијског порта декодирали и смјестили у


одговарајуће низове, и утврдили који режим рада је активан можемо извршити главни

Машински факултет у Бањој Луци 28


АРДУИНО УПРАВЉАЧКИ ПРОГРАМ

дио програма који се односи на изабрани режим рада. За сваки режим рада аутоматски,
ручни и циклусни написан је одговарајући потпрограм који извршава задатке везане за
одговарајући режим.

Потпрограм за аутоматски режим рада је:

void automatski(int V, int G)


{
while(b) //Promenljivaj b oznacava da se nalazimo u
automatskom rezimu b=true sve dok se ne zavrsi
automatski ciklus
{
glavni();
if(digitalRead(but2)==HIGH)
{
// noTone(tonePin);
c=true;
}
//ovo je bilo umjesto potValue2 digitalRead(but4)==HIGH
if(potValue2<=2 && c)
{
i++;
c=false;
}

if(i==G)
{
b=false;
i=0;
}

if(cik==1)
{
cik=0;
b=false;
i=0;
}}}

Потпрограм за циклусни режим рада је:

void ciklusnirezim()
{
if(cik==1)
{
cik=0;
V=1000;
a=true;
count=V-1;
}

while(a)
{
glavni();
if(digitalRead(but3)==HIGH)
l=true;

Машински факултет у Бањој Луци 29


АРДУИНО УПРАВЉАЧКИ ПРОГРАМ

if(digitalRead(but7)==HIGH&&l)
{
digitalWrite(RELAY2,LOW);
l=false;
V=0;
}
// tone(tonePin,tune[3]);
}
}

Потпрограм за ручни режим рада је:

void single()
{
while(m)
{
if(digitalRead(but7)==LOW)
digitalWrite(RELAY2,HIGH);
if(digitalRead(but7)==HIGH&&digitalRead(but3)==LOW)
digitalWrite(RELAY3,HIGH);
else if(digitalRead(but3)==HIGH)
{
digitalWrite(RELAY3,LOW);
s=true;
m=false;
}
if(digitalRead(but10)==HIGH&&s&&digitalRead(but3)==LOW&&
digitalRead(but7)==HIGH)
if(digitalRead(but7)==HIGH&&s)
{
digitalWrite(RELAY2,LOW);
s=false;
}
}
}

Потпрограм glavni(), односи се на дио кода у којем се извршавају наредбе


помоћу којих контролишемо кретање колица, тестере и стеге. На почетку потпрограма
провјеравамо да ли је активиран крајњи прекидач (нужни стоп) but8, уколико није
можемо започети извршавање потпрограма. Након што смо провјерили да нужни стоп
није укључен, испитујемо да ли је but1 (враћа колица у почетни положај) активан.
Уколико прекидач but1 није активан и уколико од инкременталног енкодера (који мјери
дужину цијеви) добијемо вриједност која је једнака задатој вриједности дужине цијеви,
а при томе се колица налазе у почетном положају (цилиндар који симулира кретање
колица извучен је до краја) шаље се сигнал електропнеуматском разводном вентилу за
активирање кретање колица (RELAY1,HIGH). Ако је цилиндар, који симулира колица,
извучен до краја (уже увучено потпуно) то значи да је вриједност енкодера са ужетом
мања од 2 (није нула зато што очитавамо аналогну вриједност па варира). Вриједности
енкодера са ужетом очитавамо помоћу команде potValue1=analogRead(potPin),
након чега вршимо мапирање очитане вриједности енкодера, због тога што је највећа
вриједност на излазу аналогног порта (1023) мања од максималне дужине извученог

Машински факултет у Бањој Луци 30


АРДУИНО УПРАВЉАЧКИ ПРОГРАМ

ужета (1270 mm). Мапирање се врши помоћу команде potValue2 = map(potValue1,


0, 1023, 0, 1270). Уколико је услов count!=0 испуњен, тј. уколико имамо очита-
вање са инкременталног енкодера (подпрограм doA()), приступамо провјеравању када
ће се ова вриједности изједначити са вриједности добијеном од енкодера са ужетом.
Када се ове двије вриједности изједначе, то значи да су пређени путеви колица и цијеви
исти, након чега стега може да стегне цијев. На овај начин смо обезбиједили да су
пређени путеви колица и цијеви исти. Стезањем цијеви активира се прекидач but7, уз
услов да је активан прекидач but10 могуће је извршити сјечење цијеви. Активирањем
прекидача but3, сигурни смо да је цијев одсјечена и тестера се враћа у почетни положај.
Поновним активирањем прекидача but10 стега отпушта цијев, колица наилазе на
прекидач but1 и враћају се у почетни положај, чиме се један радни циклус завршава.

void glavni()
{
if(digitalRead(but8)==LOW) //but8 globalna promenljiva
{

//Ako je cilindar od kolica izvucen znaci da je vrijednost


enkodera sa užetom manja od 2 (nije 0 zato sto ocitavamo
analognu vrijednost pa varira)
if(k&&h&&digitalRead(but1)==LOW)
{
digitalWrite(RELAY1, HIGH);
k=false;
}

else if(digitalRead(but1)==HIGH&&digitalRead(but3)==LOW)
{
digitalWrite(RELAY1,LOW);
h=false;
a=false;
}
potValue1 = analogRead(potPin);
potValue2 = map(potValue1, 0, 1023, 0, 1270);

if(count!=0)
{
if(potValue2 >= count)
digitalWrite(RELAY2,HIGH);
if(digitalRead(but1)==HIGH)
f=true;
if(f&&digitalRead(but10)==HIGH)
{
digitalWrite(RELAY2,LOW);
f=false;
}
}
if(digitalRead(but2)==HIGH&&digitalRead(but7)==HIGH&&
digitalRead(but3)==LOW&&h)
digitalWrite(RELAY3,HIGH);
else if(digitalRead(but3)==HIGH)
digitalWrite(RELAY3,LOW);

Машински факултет у Бањој Луци 31


АРДУИНО УПРАВЉАЧКИ ПРОГРАМ

if(potValue2<=2)
h=true;
}
}

Све ове потпрограме позивамо из loop () петље у зависности од изабраног


режима рада. Укупан Ардуино код дат је у Додатку 1.

Машински факултет у Бањој Луци 32


5. ПРОЈЕКТОВАЊЕ SCADA СИСТЕМА

SCADA представља систем за мјерење, праћење и контролу индустријских


система. Сваки процес у индустрији који има смисла аутоматизовати је одличан
кандидат за примјену SCADA система. Ови системи постоје у разним облицима од 60-
тих година, а од 90-тих година 20. вијека доживљавају велику експанзију са појавом све
бржих и ефикаснијих рачунарских и микроконтролерских уређаја. Могу се употребити
од нпр. једноставног праћења температуре, влажности ваздуха, притиска, до веома
комплексног праћења и контроле производних процеса фабрике или саобраћаја на
жељезници.

У овом поглављу ће бити нешто више речено о програмском пакету Processing у


коме је израђена SCADA која омогућава контролу „летеће тестере”.

5.1 Програмски пакет “Processing”

Processing узима у обзир софтверске концепте у односу на визуализацијске


форме, кретања и интеракцију. Интегрише програмски језик, односно развојно
окружење и методологију учења у јединствени и цјеловит едукацијски систем. Сам алат
је креиран, тако да олакша учење програмирања у визуалном окружењу. Користе га
студенти, умјетници, дизајнери и истраживачи у процесу учења, развоја прототипова и
у производњи. Језик је развијен како би почетници могли развити властите апликације
за само неколико минута (уз помоћ упутства), али и за напредне кориснике који
користе додатне функције. Програмско окружење Processing дозвољава коришћење
векторскe графикe, употребу разних модела, затим употребу функција тастатуре и
миша, мрежну подршку и објектно орјентисано програмирање. Библиотеке (енг.
library) омогућују проширење развојног окружења на генерисање звука, примање и
слање података у различитим форматима, као и увоз/извоз 2D и 3D формата.

Сврха Processinga је приближити програмирање ширим масама, као што је то


прије био случај са програмским језицима Logo и Max. Како би се то постигло, било је
неопходно поједноставити програмско окружење Processing.

Иако доноси неке промјене, Processing не одступа много од основних начела


програмирања. Processing поједностављује програмирање како би било доступније
онима који су заинтересовани за програмирање, али немају довољно теоријског знања о
истом. У самом концепту основна идеја је у томе да не би требало бити разлике између
обичног корисника рачунара и програмера. Поједностављење доноси нови проблеме, а
то су ограничења. Што је алат више поједностављен, то има већа ограничења, што
значи да се не могу у потпуности искористити потенцијали рачунара.
ПРОЈЕКТОВАЊЕ SCADA

Processing је под open source лиценцом што је данас прилично популарно. Како
неке компаније посједују већину тржишта, оpen source лиценца је готово једини начин
да програми доспију на тржиште. То опет неминовно доводи до чињенице да постоји
много развојних окружења, али ни једно није успјело завладати иоле већим дијелом
тржишта. Чињеница је да се Processing није развио превише на тржишту, али је као
такав ипак нешто боље прихваћен него остали алати за развој. Такође, програмери се
охрабрују да објављују кодове својих апликација како би остали корисници могли
учити од њих и из њих. На тај начин су настале неке апликације које би иначе било
немогуће направити без помоћи и асистенције.

Слика 5.1: Окружење Processing

Синтакса Processinga је деривирана из синтаксе програмских језика у широј


употреби (C, C++, Java…), тако да само окружење представља добру базу за почетак
учења. Према ауторима, вјештине научене у овом програмском језику омогућују
људима да лакше науче остале алате попут Web програмирања, мрежног управљања и
рачунарске графике. Такође, на тржишту је врло мало програмских језика који
интегришу умјетност и програмирање (подразумијева се умјетност настала помоћу
рачунара). Због синтаксе програмског језика, која је слична синтакси раширенијих
програмских језика, много искуснији корисници врло брзо могу научити развијати
напредније апликације. Processing се данас између осталог користи у неким
умјетничким школама, приватним факултетима али и јавним универзитетима.

Processing развојно окружење, слика 5.1, (енг Processing Development


Environment, PDE) састоји се од једноставног текст едитора за писање кода, дијела
намијењеног исписивању порука, текстуалне конзоле, табова за менаџмент датотеке,
алатне траке са кратицама за најчешће кориштене функције, те различитих менија. Када
се апликација покрене, она се отвара у новом прозору.

Дијелови софтвера написани у Processing – u називају се скеч (енг. Sketches) као


и код Ардуина. Конзола приказује текст укључујући error поруке, као и текст из

Машински факултет у Бањој Луци 34


ПРОЈЕКТОВАЊЕ SCADA

програма над којим се користе print() и println() функције. Алатна трака допушта
покретање програма, креирање новог скеча, отварање, снимање и учитавање.
Покретањем Run функције, код се аутоматски компајлира и отвара у новом прозору.
Stop зауставља покренуту апликацију, али не затвара прозор. Функција за учитавање
(функција Учитај) омогућава да се скица креира као Java апликација у HTML – u. Мени
пружа исту функционалност као и алатна трака, с тим да пружа и неке додатне
могућности за рад са датотекама.

Слика 5.2: Изглед менија у Processingu

5.2 Координатни систем и употреба основних наредби у Processing – u

Координатни систем (слика 5.3) који користи Processing није стандардни


Картезијев координатни систем већ има исходиште у горњем лијевом углу радног
прозора. Његова x оса расте у смјеру према десно, а y оса расте према доле.

Слика 5.3: Изглед координатног система у Processing – u

Машински факултет у Бањој Луци 35


ПРОЈЕКТОВАЊЕ SCADA

Сваки основни облик мора имати неке основне параметре да би се могла


одредити нпр. његова ширина, висина, дужина, касније и боја итд. Најједноставнији
облик у Processing - u је тачка. За цртање тачке потребна су два улазна параметра x и y
координата. Наредба за цртање тачке гласи: point(20,60), гдје су 20 и 60, x и y
координате тачке на екрану. Линију је такође једноставно нацртати, за то нам требају
двије тачке: line(10,30,80,60). Ова наредба црта линију кроз двије тачке
point(10,30) и point(80,60). Наредба за цртање правоугаоника је
rect(20,30,50,40).

Постоји више наредби за цртање правоугаоника:

 CORNER правоугаоник је дефинисан са горњим лијевим углом те висином и


ширином,
 CENTER правоугаоник је дефинисан координатама средишта те висином и
ширином и
 CORNERS правоугаоник је дефинисан координатама горњег лијевог угла и
доњег десног угла.

Начин цртања правоугаоника позива се наредбом rectMode(). За цртање


елипсе користи се наредба ellipse().

Важан елемент поред цртања једноставних контура је коришћење боја.


Најједноставније боје у Processing – u су нијансе сиве. Нијансе сиве се означавају
бројевима од 0 до 255. У оваквом опису боја 0 означава црну боју, а 255 означава
бијелу боју. Бројеви између 0 и 255 дају нијансе сиве боје. Постоје три функције за
коришћење боја, а то су:

 Stroke() – боја контуре објекта,


 Fill() – боја испуњава унутрашњост објекта,
 Background() – одређује боју позадине прозора у којем цртамо објекте.

Постоје и функције noStroke() и noFill() које служе за прекидање функција


stroke() и fill(), али је битно напоменути да се не смију ове двије функције
користити заједно, јер се ништа на екрану неће видјети. Processing омогућава
коришћење RGB боја. Код коришћења RGB боја имамо три аргумента. Сваки од ових
аргумената означава по једну основу боју (R – црвена, G – зелена и B – плава).
Аргумент за сваку боју је број од 0 до 255, 0 означава да те боје нема, а 255 значи да те
боје има највише могуће. У падајућем менију Tools постоји алат Color Selector. Овај
алат нам омогућава да одабиром боје из визуелне палете боја одаберемо боју и нијансу
боје коју желимо, а алат нам врати вриједности аргумената R, G и B. Код боја постоји и
четврти аргумент који се зове Alpha, а означава транспарентност боје. Он такође има
вриједност од 0 до 255. Гдје 0 означава потпуно транспарентну боју, а 255 потпуно
непрозирну боју.

Машински факултет у Бањој Луци 36


ПРОЈЕКТОВАЊЕ SCADA

Примјер кода коришћења наредби за цртање основних контура и коришћење


боја у Processing – u је:

size(300,200); //величина екрана


background(150); //сива
stroke(0); //црна
fill(250,13,60); //црвена
rect(50,50,100,50); //цртање правоугаоника
rectMode(CENTER); //начин цртања
fill(79,250,13); //зелена
rect(50,50,100,50);
rect(280,100,40,200);
noFill();
ellipse(80,150,100,50); //цртање елипсе
rectMode(CORNERS);
noStroke(); //нема контуре
fill(252,217,10,50); //жута, провидност 80.4%
rect(160,0,300,40);
fill(252,217,10,150); //жута, провидност 41.2%
rect(160,60,300,100);
fill(252,217,10,200); //žuta, провидност 21.6%
rect(160,120,300,160);

Слика 5.4: Примјер цртања контура и коришћење боја у Processing – u

5.3 Функције setup() и draw()

Ако желимо постићи да наш програм постане динамичан, морамо користити


функције setup() и draw(). Функција setup() наводи се прва и у њој се наводе
наредбе за програм, нпр. позадина скеча, величина скеча итд, које се учитавају само
једном и то приликом покретања програма. Функција draw() наводи се друга и она се
изводи стално док је програм покренут, најчешће 30 пута у секунди за једноставније
апликације. Број понављања ове функције може се задати помоћу наредбе

Машински факултет у Бањој Луци 37


ПРОЈЕКТОВАЊЕ SCADA

frameRate(). Варијабле mauseX и mauseY су варијабле које дају тренутне координате


позиције миша. Уз ове наредбе отварају се многобројне могућности приликом писања
програма, као нпр. можемо цртати правоугаоник чије димензије зависе од позиције
миша. Помоћу варијабли pmauseX и pmauseY можемо запамтити координате миша које
су биле у претходном frame – u. Примјер коришћења функција setup() и draw(), као
и варијабли координата миша је:

void setup()
{
size(200,200);
background(255);
smooth(); //команда која омогућава заобњене ћошкове
}
void draw()
{
stroke(0); line(pmouseX ,pmouseY ,mouseX ,mouseY); //цртање
линије у зависности од координата миша
}

Слика 5.5: Цртање линије у зависности од координата миша

5.4 Варијабле

Ако неку вриједност у нашој апликацији морамо више пута позивати онда
морамо користити варијабле. У Processing – u се варијабле наводе прије почетка
писања програма, у заглављу. У заглављу се може навести само декларација варијабле,
а касније се варијабла може иницијализовати. Декларација има синтаксу
int varijabla; и она је потребна да се зна колико се меморије мора резервисати за
одређену варијаблу.

Машински факултет у Бањој Луци 38


ПРОЈЕКТОВАЊЕ SCADA

Типове варијабли су:

 boolean – логичка варијабла (TRUE – истина или FALSE – лаж),


 char – словa, ‘a’, ‘b’, ‘c’,…
 int – цјелобројни податак,
 float – децимални податак,

Иницијализација варијабле значи пуњење адресе те варијабле и има синтаксу


varijabla=50;. Иницијализација и декларација се могу комбиновано позивати на
сљедећи начин: int varijabla=50;. Processing има неке уграђене системске
варијабле (неке од њих смо навели mouseX) као што су:

 width – ширина прозора у пикселима,


 height – дужина прозора у пикселима,
 frameCount – број фрејмова,
 frameRate – број фрејмова у секунди,
 key – посљедња притиснута типка на тастатури,
 keyCode – бројчани код притиснуте типке,
 keyPressed – Да ли је типка притиснута?
 mousePressed – Да ли је типка миша притиснута?
 mouseButton – Која типка миша је притиснута: лијева, десна или средња?

Ток програма могуће је контролисати наредбама као што су if, else, while,
for итд. Наредба if омогућава да се одабере извршавање једног дијела програма (једне
или више наредби) у зависно од неког услова. Услов је логичког типа (boolean), што
значи да или се улази у петљу или се прескаче петља. Синтакса наредбе је:

if (uslov){
naredbe A;
}
else {
naredbe B;
}

Ако је задовољен услов онда се наставља дио кода naredbe A;, а ако услов
није задовољен наставља се дио кода naredbe B;.

While петља је наредба контроле тока која омогућава коду да се извршава више
пута на основу враћеног логичког. Синтакса наредбе је:

while (uslov){
naredbe;
}

Још једна наредба за понављање је for. Синтакса за ову наредбу је:

Машински факултет у Бањој Луци 39


ПРОЈЕКТОВАЊЕ SCADA

for (deklaracija i inicijalizacija, uslov, prebrojavanje)


{
naredbe;
}

У аргументу наредбе for имамо три аргумента. Први аргумент је


иницијализација или декларација варијабле од које зависи улазак у петљу, услов уласка
у петљу, пребројавање промјена варијабле од које зависи колико ћемо дуго остати у
петљи.

5.5 Рад са сликама, текстом и серијском везом у Processing – u

Када у Processing - u желимо користити слике, морамо позвати класу PImage.


Класа се позива наредбом loadImage(). LoadImage() има један аргумент (string) који
представља назив фајла са комплетном путањом до слике коју желимо учитати. Кад
желимо учитати слику у апликацију то радимо наредбом image(img,0,0,20,30),
гдје је img варијабла у коју је сачувана претходно учитана слика, прве двије нуле су
координате горњег лијевог угла. Четврти и пети аргументи (20,30) су координате доњег
десног угла.

Да бисмо користили font у Processingu, прво га морамо креирати. Креирање


фонта радимо преко потпрограма Create Font којег можемо наћи у менију Tools. У
потпрограму Create Font одаберемо врсту и величину фонта, потом притиснемо OK.
Програм сада креира датотеку фонта са екстензијом .vlw, након чега је копира у
фолдеру наше апликације. Затим је потребно дефинисати објекат Pfont. Након тога
можемо учитати фонт наредбом loadFont(), чији је аргумент име фајла фонта који
смо креирали. Посљедњи корак је дефинисање фонта текста наредбом
textFont(f,36), гдје је први аргумент варијабла у коју је учитан наш креирани фонт,
а други је величина фонта. Потом можемо исписати фонт наредбом text(”Ovo je
tekst!”,10,100), први аргумент је string који исписујемо, а друга два су координате
на које текст желимо поставити.

Успостављање везе између рачунара и Ардуина врши се серијском везом. Како


би серијска веза радила у Proceesing апликацијама постоји класа serial. Класа serial
омогућава слање и примање података путем серијске везе. Серијски порт отвара се
помоћу наредбе: Serial(this, COM1, 9600, N, 8, 1.0). Гдје је COM1 име порта
који отварамо, 9600 је брзина комуникације, N паритет податка (може бити ”E” паран,
”O” непаран), 8 је број битова у податку, а 1.0 је број стоп битова.

Важне опције класе Serial су: stop() затварање порта, available() враћа
број доступних бајтова, read() чита доступне податке, readString() чита податке и
враћа их као string тип података, write() шаље податке, те list() враћа листу
доступних серијских портова.

Машински факултет у Бањој Луци 40


ПРОЈЕКТОВАЊЕ SCADA

5.6 Реализација апликације у Processing – u

Processing апликација (SCADA), служи као веза између оператера на машини и


машине односно управљачког система, тј. Ардуина. Ардуино прима податке од SCADA
система путем серијске везе, затим се врше одређене операције са тим податцима и на
крају добијамо жељено понашање машине (жељену дужину и број цијеви). У овој
апликацији написали смо више потпрограма који нам омогућавају слање података
серијском везом, уношење жељених вриједности о дужини и броју цијеви, те избору
одговарајућег режима рада. Такође приликом реализације ове апликације коришћене су
неке готове библиотеке, које су нам омогућиле да постигнемо жељене карактеристике
апликације.

2
1

3
Слика 5.6: Изгледа SCADA система за контролу „летеће тестере”

SCADA приказана на слици 5.6, омогућава нам извршавање жељених операција


над „летећом тестером” и састоји се из три дијела:

1. Омогућава унос жељених вриједности дужине и броја комада цијеви

Numberbox n = controlP5.addNumberbox(" ")


.setSize(100, 35)
.setPosition(350, 130)
.setValue(0)
;
makeEditable( n );

Машински факултет у Бањој Луци 41


ПРОЈЕКТОВАЊЕ SCADA

Функција controlP5.addNumberbox(" "), омогућава креирање поља за унос


дужине и броја комада. При чему се за свако ново поље мора позивати нова функција
controlP5.addNumberbox(" "). Потпрограм makeEditable() омогућава уношење
жељених вриједности са тастатуре.

2. Омогућава нам избор жељеног режима рада (жута боја означава изабрани режим
рада)

void crtajKrugove(){
k1.crtaj(); k2.crtaj(); k3.crtaj();
}

Потпрограм void crtajKrugove() омогућава цртање кругова за избор


жељеног режима рада Аутоматски, Циклусни или Ручни режим рада.

3. Када смо унијели и изабрали све жељене параметре, тада преко дугмета ПОКРЕНИ
ПРОЦЕС шаљемо изабране податке путем серијске везе ка Ардуину.

if( mouseX> b3X1 && mouseX< b3X2 && mouseY> b3Y1 && mouseY<
b3Y2 && mousePressed){
restartpritisnut = loadImage("restartpritisnut.png");
image(restartpritisnut,b3X1,b3Y1);}
else{
image(restart,b3X1,b3Y1);}

За креирање дугмета покрени процес користимо функцију


loadImage(”restartpritisnut.png”), помоћу које учитавамо слику дугмета, над
којим затим вршимо додатне операције, тј. провјеравамо да ли је курсор миша
притиснут над овим дугметом или не.

void mousePressed(){
if ( mouseX> b3X1 +10 && mouseX< b3X2+10 && mouseY> b3Y1+10
&& mouseY< b3Y2+10 ){ //prostor koji oznacava dugme - samo u
tom prostoru pritiskom na dugme se salje signal Arduinu
dugme_salji=1;
}
}

На овај начин смо обезбиједили да сви подаци које смо изабрали буду послати
ка Ардуину и да при томе ни један податак не буде изостављен, јер се подаци шаљу тек
када притиснемо дугме покрени процес. Код за реализацију SCADA система дат је у
Додатку 2 и 3.

Машински факултет у Бањој Луци 42


6. СИМУЛАЦИЈА РАДА УПРАВЉАЧКОГ
СИСТЕМА

У овом поглављу нешто више ћемо рећи о тестирању (симулацији) урађеног


Ардуино програма и SCADA система у лабораторијским условима. Такође приказаћемо
пнеуматску и електричну шема израђеног система.

6.1 Пнеуматска шема система

На слици 6.1 дата је поједностављена шема „летеће тестере”. Поједностављење


се односе на дио колица, гдје се користи само један цилиндар (главни цилиндар А), док
цилиндар који има улогу амортизера (цилиндар B, поглавље 2) у овој симулацији није
употребљаван.

Слика 6.1: Пнеуматска шема

За колица је везан енкодер са ужетом (означен са бројем 1 на слици 6.1) помоћу


којег мјеримо пређени пут колица. Када су пређени путеви колица и цијеви (који
мјеримо помоћу инкременталног енкодера 2) исти активира се стега S тако да даље
колица и цијев имају исту брзину, = . Прекидач but2, након наиласка колица „на
њега” и уз услов да су пређени путеви колица и цијеви иста (цијев је симулирана
помоћу мотора који је повезан са инкременталним енкодером), активира тестеру. Када
колица наиђу на прекидач but1 то је знак да треба да се врате у почетни положај,
СИМУЛАЦИЈА РАДА

уколико колица пређу овај прекидач и не врате се у почетни положај постоји


сигурносни прекидач but8 који има улогу нужног стопа, тј. његовим активирање све се
зауставља. Стега посједује само један прекидач и он означава да је стега достигла
крајњи положај, што је врло битно у процесу сјечења. Ако стега не достигне крајњи
положај (не стегне како треба), приликом сјечења може доћи до хаварије, јер би се у
том случају цијев помјерала и дошло би до пуцања тестере. Прекидачи but3 и but10
престављају крајње прекидаче тестере. Прекидач but10 означава да је тестера у свом
почетном положају, што значи да процес може започети, јер све док се тестера не нађе
у свом почетном положају процес не може започети. Други прекидач but3 означава да
је тестера одсјекла комда до краја. Све до поновног активирања прекидача but10, стега
не смије пустити цијев.

КОЛИЦА ЕНКОДЕР СА
УЖЕТОМ

СТЕГА

ТЕСТЕРА

ИНКРЕМЕНТАЛНИ ЕНКОДЕР И
МОТОР

Слика 6.2: Реализација летеће тестере у лабораторији

6.2 Електрична шема система

Електрична шема система дата је на слици 6.3 и приказује на који је начин


повезан Ардуино са електропнеуматским разводним вентилима, крајњим прекидачима,
енкодерима и звучником.

Будући да је радни напон Ардуина 5 V, а разводни вентили раде на 24 V, то


значи да нам је потребан релеј који ће активирати разводни вентил када Ардуино
пошаље сигнал за активирање разводног вентила. У ту сврху користимо 5 V релеј
(слика 6.4 и 6.5). Како имамо три цилиндра (за колица, тестеру и стегу) користићемо
три различита релеја, од којих ће сваки да активира одговарајући разводни вентил.

Машински факултет у Бањој Луци 44


СИМУЛАЦИЈА РАДА

Слика 6.3: Електрична шема

Машински факултет у Бањој Луци 45


СИМУЛАЦИЈА РАДА

Слика 6.4: Изгледа модула са релејом од 5V

Слика 6.5: Практична реализација модула са релејом од 5V

6.3 Тестирање израђеног графичког интерфејса

Након што је имплементирана електрична и пнеуматска шема система у


лабораторији, потребно је тестирати и графички интерфејс израђен у Processing – у
(SCADA). Тестирање се прије свега односи на провјеру серијске везе између Processinga
и Ардуина, односно из Processinga шаљемо жељене информације о дужини и броју
цијеви и провјеравамо да ли је Ардуино примио те податке и при томе провјеравамо
функционалност цилиндара.

Машински факултет у Бањој Луци 46


СИМУЛАЦИЈА РАДА

Слика 6.6: Изглед графичког интерфејса реализованог у Processing – u

Када само послали податке, притиском на дугме “ПОКРЕНИ ПРОЦЕС”,


Ардуино након примања и обраде података, започиње да извршава процес. Након што
је завршена серија од 5 комада дужине 1200 mm Ардуино се „оглашава” звучним
сигналом, што значи да је прешао на серију од 7 комада дужине 1800 mm. На овај начин
смо показали да израђени интерфејс ради како треба. Будући да се и цилиндри који
служе како симулација колица, стеге и тестере, такође понашају у складу са
захтијеваним условима, то значи да је и тај дио задатка испуњен.

Машински факултет у Бањој Луци 47


7. ЗАКЉУЧАК

У овом раду описан је поступак и начин израде новог управљачког система и


графичког интерфејса за „летеће тестере” на линијама за производњу шавних цијеви у
предузећу “МЕТАЛ” а. д – Градишка. Израђени графички интерфејс олакшава
употребу „летеће тестере” корисницима. Овако израђени графички интерфејс и
управљачки систем пружа добру основу за унапређење, надоградњу и проширење
постојећег система.

Добра страна оваквог система је што је управљачки систем (Ардуино програм) у


потпуности одвојен од графичког интерфејса (Processing програма). Таква структура
система омогућава одвојено развијање једног дијела система без познавања другога.
Међутим, једна од мана система је што управљачки систем не може да ради, док не
добије потребне информације од графичког интерфејса, односно од SCADA система.

Израђени систем представља добру основу управљачког система и графичког


интерфејса за управљање „летећом тестером” и пружа доста могућности за побољшање
како у хардверском тако и у софтверском дијелу. Једна од могућности побољшања је
примјена дигиталног енкодера са ужетом умјесто аналогног који је коришћен у овом
раду, затим употреба програмабилно логичког контролера умјесто микроконтролера,
итд. Што се тиче графичког интерфејса и ту се јавља доста простора за побољшања, као
што су индикација колико је цијеви у сваком тренутку израђено, надзор над
складиштењем цијеви, итд.

Овим радом показано је како се у данашње вријеме уз помоћ open source


технологије може направити квалитетан систем за управљање и надзор сложеним
машинама, као што је то „летећа тестера”. Овакви системи у пракси данас су врло
тражени, јер омогућавају додатну аутоматизацију и већи степен искоришћења старијих
машина као што је то случај са „летећом тестером” у предузећу “МЕТАЛ” а. д
Градишка.
ДОДАТАК 1

#define A 2
#define B 3

#define NOTE_D0 98
#define NOTE_D1 294
#define NOTE_D2 330

boolean k=false;
boolean h=false;
boolean a=false;
boolean b=false;
boolean c=false;
boolean g=false;
boolean f=false;
boolean m=false;//za single mode
boolean s=false;
boolean l=false;

int aut=0; //Logicka promenljiva za automatski rezim


(processing)
int cik=0; //Logicka promenljiva za ciklusni rezim (
processing)
int ruc=0; //Logicka promenljiva za rucni rezim (processing)

char serial_buffer[50] = "";


boolean primljen = false;

int broj_komada1;
int duzina1;
int broj_komada2;
int duzina2;
int broj_komada3;
int duzina3;
int broj_komada4;
int duzina4;
int broj_komada5;
int duzina5;

int potPin = A0;


int potValue1 = 0;
int potValue2 = 0;

int RELAY1 = 10;


int RELAY2 = 8;
int RELAY3 = 12;

int but1 = 9; // vraca kolica u pocetni polozaj


int but2 = 11; // aktivira stegu
int but3 = 7; // vraca testeru u pocetni polozaj
ДОДАТАК 1

int but4 = 6; //provjerava da li su kolica u pocetnom polozaju


int but5 = 5; //ciklusni mode
int but6 = 4; //automatski mod
int but7 = A4; //pokazuje da li je stega stegnula
int but8 = A2; //krajnji prekidac za kolica
int but9 = A3; //Single mod
int but10 = A5; //testera uvucena

//int tonePin=7;
//int tune[] =
//{
// NOTE_D0,NOTE_D1,NOTE_D2,
//};

int brojC=5;

volatile unsigned int count = 0;


int nizV[5] = {}; //Prazan niz rezervisan za duzinu cijevi
int V;

int nizG[5] = {}; //Prazan niz rezervisan za broj komada cijevi


int G;
int i=0;

void setup()
{
pinMode(RELAY1, OUTPUT);
pinMode(but1, INPUT);
pinMode(RELAY2, OUTPUT);
pinMode(but2, INPUT);
pinMode(RELAY3, OUTPUT);
pinMode(but3, INPUT_PULLUP);
pinMode(but4, INPUT);
pinMode(but5, INPUT_PULLUP);
pinMode(but6, INPUT_PULLUP);
pinMode(but7, INPUT_PULLUP);
pinMode(but8, INPUT);
pinMode(but9, INPUT_PULLUP);
pinMode(but10, INPUT_PULLUP);
//pinMode(tonePin,OUTPUT); //Set Pin Mode as output
pinMode(A, INPUT);
pinMode(B, INPUT);
attachInterrupt(0, doA, RISING);
Serial.begin (9600);
}

void(* resetFunc) (void) = 0;

void loop ()
{
if(primljen)
{
serial_buffer[0] = '\0';
primljen = false;

Машински факултет у Бањој Луци 50


ДОДАТАК 1

//Dekodiranje podataka dobijenih sa seriskog porta


broj_komada1 = 1000 * (serial_buffer[1] - 48) + 100 *
(serial_buffer[2] - 48) + 10 * (serial_buffer[3] - 48)+
(serial_buffer[4] - 48);
duzina1 = 1000 * (serial_buffer[5] - 48) + 100 *
serial_buffer[6] - 48) + 10 * (serial_buffer[7] - 48) +
(serial_buffer[8] - 48);

broj_komada2 = 1000 * (serial_buffer[9] - 48) + 100 *


(serial_buffer[10] - 48) + 10 * (serial_buffer[11] - 48)+
(serial_buffer[12] - 48);
duzina2 = 1000 * (serial_buffer[13] - 48) + 100 *
(serial_buffer[14] - 48) + 10 * (serial_buffer[15] - 48) +
(serial_buffer[16] - 48);

broj_komada3 = 1000 * (serial_buffer[17] - 48) + 100 *


(serial_buffer[18] - 48) + 10 * (serial_buffer[19] - 48)+
(serial_buffer[20] - 48);
duzina3 = 1000 * (serial_buffer[21] - 48) + 100 *
(serial_buffer[22] - 48) + 10 * (serial_buffer[23] - 48) +
(serial_buffer[24] - 48);

broj_komada4 = 1000 * (serial_buffer[25] - 48) + 100 *


(serial_buffer[26] - 48) + 10 * (serial_buffer[27] - 48)+
(serial_buffer[28] - 48);
duzina4 = 1000 * (serial_buffer[29] - 48) + 100 *
(serial_buffer[30] - 48) + 10 * (serial_buffer[31] - 48) +
(serial_buffer[32] - 48);

broj_komada5 = 1000 * (serial_buffer[33] - 48) + 100 *


(serial_buffer[34] - 48) + 10 * (serial_buffer[35] - 48)+
(serial_buffer[36] - 48);
duzina5 = 1000 * (serial_buffer[37] - 48) + 100 *
(serial_buffer[38] - 48) + 10 * (serial_buffer[39] - 48) +
(serial_buffer[40] - 48);

nizV[0]=duzina1;
nizV[1]=duzina2;
nizV[2]=duzina3;
nizV[3]=duzina4;
nizV[4]=duzina5;

nizG[0]=broj_komada1;
nizG[1]=broj_komada2;
nizG[2]=broj_komada3;
nizG[3]=broj_komada4;
nizG[4]=broj_komada5;

if (serial_buffer[41]==1) //Automatski rezim aktivan


{
aut=1;
count=0;
}
if(serial_buffer[42]==1) //Rucni rezim aktivno
ruc=1;

Машински факултет у Бањој Луци 51


ДОДАТАК 1

if(serial_buffer[43]==1) //Ciklusni rezim aktivan


cik=1;
if(digitalRead(but8)==LOW)
{
if(aut==1)
{
aut=0;
g=true;
// noTone(tonePin);
count=0;
i=0;
}
for(int j=0; j<brojC&&g;j++)
{
b=true;
V=nizV[j];
G=nizG[j];
automatski(V,G);
// tone(tonePin,tune[1]);
if(j==brojC-1)
g=false;
}
ciklusnirezim();
if(ruc==1)
{
single();
ruc=0;
m=true;
}
}
}
}
//Podprogram pomocu kojeg dobijamo potrebne vrijednosti sa
seriskog porta (iz processinga)
void serialEvent()
{
int input;

while (Serial.available())
{
input = (char)Serial.readBytesUntil('&', serial_buffer,
sizeof(serial_buffer) - 1);
serial_buffer[input] = '\0';
primljen = true;
}
}

void glavni()
{
if(digitalRead(but8)==LOW)
{
//Ako je cilindar od kolica izvucen znaci da je vrijednost
zicanog ekodera manja od 2 (nije 0 zato sto ocitavamo analognu
vrijednost pa varira)

Машински факултет у Бањој Луци 52


ДОДАТАК 1

if(k&&h&&digitalRead(but1)==LOW)
{
digitalWrite(RELAY1, HIGH);
k=false;
}
else if(digitalRead(but1)==HIGH&&digitalRead(but3)==LOW)
{
digitalWrite(RELAY1,LOW);
h=false;
a=false;
}
potValue1 = analogRead(potPin);
potValue2 = map(potValue1, 0, 1023, -13, 1351);

if(count!=0)
{
if(potValue2 >= count-142&& potValue2>20 && potValue2<65)
digitalWrite(RELAY2,HIGH);
if(digitalRead(but1)==HIGH)
f=true;
if(f&&digitalRead(but10)==HIGH)
{
digitalWrite(RELAY2,LOW);
f=false;
}
}
if(digitalRead(but2)==HIGH&&digitalRead(but7)==HIGH
&&digitalRead(but3)==LOW&&h)
digitalWrite(RELAY3,HIGH);

else if(digitalRead(but3)==HIGH)
digitalWrite(RELAY3,LOW);

if(potValue2<=2)
h=true;
}
}

void doA()
{
if (digitalRead(A) == HIGH)
{
if (digitalRead(B) == LOW)
count++; // CW
else
count--; // CCW
}

if(count==V)
{
k=true;
count=0;
}
}

Машински факултет у Бањој Луци 53


ДОДАТАК 1

void automatski(int V, int G)


{
while(b)
{
glavni();
if(digitalRead(but2)==HIGH)
{
// noTone(tonePin);
c=true;
}
//ovo je bilo umjesto potValue2 digitalRead(but4)==HIGH
if(potValue2<=2 && c)
{
i++;
c=false;
}

if(i==G)
{
b=false;
i=0;
}

if(cik==1)
{
cik=0;
b=false;
i=0;
}
}
}
void ciklusnirezim()
{
if(cik==1)
{
cik=0;
V=1000;
a=true;
count=V-1;
}

while(a)
{
glavni();
if(digitalRead(but3)==HIGH)
l=true;
if(digitalRead(but7)==HIGH&&l)
{
digitalWrite(RELAY2,LOW);
l=false;
V=0;
}
// tone(tonePin,tune[3]);
}
}

Машински факултет у Бањој Луци 54


ДОДАТАК 1

void single()
{
while(m)
{
if(digitalRead(but7)==LOW)
digitalWrite(RELAY2,HIGH);
if(digitalRead(but7)==HIGH&&digitalRead(but3)==LOW)
digitalWrite(RELAY3,HIGH);
else if(digitalRead(but3)==HIGH)
{
digitalWrite(RELAY3,LOW);
s=true;
m=false;
}
if(digitalRead(but10)==HIGH&&s&&digitalRead(but3)==LOW&&
digitalRead(but7)==HIGH)
if(digitalRead(but7)==HIGH&&s)
{
digitalWrite(RELAY2,LOW);
s=false;
}
}

Машински факултет у Бањој Луци 55


ДОДАТАК 2

//Ukljucivanje Serial i ControlP5 bibloteka


import processing.serial.*;
Serial port;
import controlP5.*;
ControlP5 controlP5;
char dugme1=0;
char dugme2=0;
char dugme3=0;
char dugme_salji=0;
//x duzina cijev
int x=0;
int x1=0;
int x2=0;
int x3=0;
int x4=0;
// y broj komada
int y=0;
int y1=0;
int y2=0;
int y3=0;
int y4=0;
int CENTAR = 0;
int j=0,smjer=0;
color bojaN = color(255,255,0);
color crvena= color(255,0,0);
color boja1=crvena,boja2=crvena,boja3=crvena;
//dugmad za komande
Krug k1 = new Krug(120,150,20,boja1,true);
//Automatski taster
Krug k2 = new Krug(120,230,20,boja2,true);
//taster za ciklusni rezim
Krug k3 = new Krug(120,310,20,boja3,true);
//taster za rucni rezim
//Natpis nS = new Natpis(" Дужина1 ",380,180,CENTAR,"Times New
Roman",14,0);
//Natpis nN = new Natpis( " БројКомада1
",540,180,CENTAR,"Times New Roman",14,0);
//Natpis nK = new Natpis(" Дужина2 ",380,235,CENTAR,"Times New
Roman",14,0);
//Natpis nP = new Natpis(" БројКомада2 ",540,235,CENTAR,"Times
New Roman",14,0);
//Natpis nM = new Natpis(" Дужина3 ",380,290,CENTAR,"Times New
Roman",14,0);
ДОДАТАК 2

//Natpis nB = new Natpis(" БројКомада3 ",540,290,CENTAR,"Times


New Roman",14,0);
//Natpis nR = new Natpis(" Дужина4 ",380,345,CENTAR,"Times New
Roman",14,0);
//Natpis nU = new Natpis(" БројКомада4 ",540,345,CENTAR,"Times
New Roman",14,0);
//Natpis nO = new Natpis(" Дужина5 ",380,400,CENTAR,"Times New
Roman",14,0);
//Natpis nT = new Natpis(" БројКомада5 ",540,400,CENTAR,"Times
New Roman",14,0);
Natpis nA = new Natpis(" Aутоматски режим
",120,200,CENTAR,"Arial",18,0); //stop
Natpis nC = new Natpis(" Циклусни режим
",120,280,CENTAR,"Arial",18,0); //naprijed
Natpis nR = new Natpis("Ручни режим
",110,360,CENTAR,"Arial",18,0); //nazad-kontra
boolean unutar = false,promjena=false;
int b1X1 = 40; //inicijalizacija X 1 cosak
int b1Y1 = 130; //inicijalizacija Y 1 cosak
int b1X2 = 175; //inicijalizacija X 2 cosak
int b1Y2 = 200; //inicijalizacija Y 2 cosak
int b2X1 = 40; //inicijalizacija X 1 cosak
int b2Y1 = 290; //inicijalizacija Y 1 cosak
int b2X2 = 175; //inicijalizacija X 2 cosak
int b2Y2 = 355; //inicijalizacija Y 2 cosak
//Dugme za restart
PImage restart;
PImage restartpritisnut;
int b3X1 = 40; //inicijalizacija X 1 cosak
int b3Y1 = 400; //inicijalizacija Y 1 cosak
int b3X2 = 175; //inicijalizacija X 2 cosak
int b3Y2 = 465; //inicijalizacija Y 2 cosak
int b4X1 = 40; //inicijalizacija X1 cosak
int b4Y1 = 210; //inicijalizacija Y1 cosak
int b4X2 = 175; //inicijalizacija X2 cosak
int b4Y2 = 280; //inicijalizacija Y2 cosak
void setup(){
size(700,500);
port=new Serial(this,"COM5",9600); //Inicijalizacija
radnog prostora
port.bufferUntil('\n'); //clean the buffer
controlP5 = new ControlP5(this);
pisiNatpise();
Numberbox n = controlP5.addNumberbox("Duzina1")
.setSize(100, 35)
.setPosition(350, 130)
.setValue(0)
;

Машински факултет у Бањој Луци 57


ДОДАТАК 2

Numberbox n1 = controlP5.addNumberbox("Brojkomada1")
.setSize(100, 35)
.setPosition(500, 130)
.setValue(0)
;
Numberbox n2 = controlP5.addNumberbox("Duzina2")
.setSize(100, 35)
.setPosition(350, 185)
.setValue(0)
;
Numberbox n3 = controlP5.addNumberbox("Brojkomada2")
.setSize(100, 35)
.setPosition(500, 185)
.setValue(0)
;
Numberbox n4 = controlP5.addNumberbox("Duzina3")
.setSize(100, 35)
.setPosition(350, 240)
.setValue(0)
;
Numberbox n5 = controlP5.addNumberbox("Brojkomada3")
.setSize(100, 35)
.setPosition(500, 240)
.setValue(0)
;
Numberbox n6 = controlP5.addNumberbox("Duzina4")
.setSize(100, 35)
.setPosition(350, 295)
.setValue(0)
;
Numberbox n7 = controlP5.addNumberbox("Brojkomada4")
.setSize(100, 35)
.setPosition(500, 295)
.setValue(0)
;
Numberbox n8 = controlP5.addNumberbox("Duzina5")
.setSize(100, 35)
.setPosition(350, 350)
.setValue(0)
;
Numberbox n9 = controlP5.addNumberbox("Brojkomada5")
.setSize(100, 35)
.setPosition(500, 350)
.setValue(0)
;
makeEditable( n );
makeEditable( n1 );
makeEditable( n2 );

Машински факултет у Бањој Луци 58


ДОДАТАК 2

makeEditable( n3 );
makeEditable( n4 );
makeEditable( n5 );
makeEditable( n6 );
makeEditable( n7 );
makeEditable( n8 );
makeEditable( n9 );
//Crtanje dugmeta za resart
restart = loadImage("restart.png");
image(restart,b3X1,b3Y1);
}
void draw(){
PFont f1 = loadFont("TimesNewRomanPSMT-48.vlw");
//Inicijalizacija fonta
switch(j){
case 0:
unutar = k1.prekoKruga();
break;
case 1:
unutar = k2.prekoKruga();
break;
case 2:
unutar = k3.prekoKruga();
break;
}
if (unutar){cursor(HAND);}
else{cursor(ARROW); }
if (unutar && mousePressed){
if (j==0){smjer = 0; k1.kBoja = bojaN ;}
if (j==1){smjer = 1; k2.kBoja = bojaN ;}
if (j==2){smjer = 2; k3.kBoja = bojaN ;}
bojiKrugove();
}
crtajKrugove();
if (unutar == false || mousePressed){
if (++j>= 3){
j=0;
}
}
zaglavlje ();
int broj_komada1 = 1111; //max. je 9999
int duzina1 = 1111; //max. je 9999
int broj_komada2 = 2222; //max. je 9999
int duzina2 = 2222; //max. je 9999
int broj_komada3 = 3333; //max. je 9999
int duzina3 = 3333; //max. je 9999
int broj_komada4 = 4444; //max. je 9999
int duzina4 = 4444; //max. je 9999

Машински факултет у Бањој Луци 59


ДОДАТАК 2

int broj_komada5 = 5555; //max. je 9999


int duzina5 = 5555; //max. je 9999
char txt_broj_komada1[] = {'0', '0', '0', '0'};
char txt_duzina1[] = {'0', '0', '0', '0'};
char txt_broj_komada2[] = {'0', '0', '0', '0'};
char txt_duzina2[] = {'0', '0', '0', '0'};
char txt_broj_komada3[] = {'0', '0', '0', '0'};
char txt_duzina3[] = {'0', '0', '0', '0'};
char txt_broj_komada4[] = {'0', '0', '0', '0'};
char txt_duzina4[] = {'0', '0', '0', '0'};
char txt_broj_komada5[] = {'0', '0', '0', '0'};
char txt_duzina5[] = {'0', '0', '0', '0'};
duzina1=x;
broj_komada1=y;
duzina2=x1;
broj_komada2=y1;
duzina3=x2;
broj_komada3=y2;
duzina4=x3;
broj_komada4=y3;
duzina5=x4;
broj_komada5=y4;
//konverzija int to char za broj_komada1
txt_broj_komada1[0] = char(broj_komada1 / 1000 + '0') ;
txt_broj_komada1[1] = char((broj_komada1 % 1000) / 100 +'0');
txt_broj_komada1[2] = char((broj_komada1 % 100) / 10 + '0');
txt_broj_komada1[3] = char(broj_komada1 % 10 + '0');
//konverzija int to char za duzina1
txt_duzina1[0] = char(duzina1 / 1000 + '0') ;
txt_duzina1[1] = char((duzina1 % 1000) / 100 + '0');
txt_duzina1[2] = char((duzina1 % 100) / 10 + '0');
txt_duzina1[3] = char(duzina1 % 10 + '0');
//konverzija int to char za broj_komada2
txt_broj_komada2[0] = char(broj_komada2 / 1000 + '0') ;
txt_broj_komada2[1] = char((broj_komada2 % 1000) / 100 +'0');
txt_broj_komada2[2] = char((broj_komada2 % 100) / 10 + '0');
txt_broj_komada2[3] = char(broj_komada2 % 10 + '0');
//konverzija int to char za duzina2
txt_duzina2[0] = char(duzina2 / 1000 + '0') ;
txt_duzina2[1] = char((duzina2 % 1000) / 100 + '0');
txt_duzina2[2] = char((duzina2 % 100) / 10 + '0');
txt_duzina2[3] = char(duzina2 % 10 + '0');
//konverzija int to char za broj_komada3
txt_broj_komada3[0] = char(broj_komada3 / 1000 + '0') ;
txt_broj_komada3[1] = char((broj_komada3 % 1000) / 100 +'0');
txt_broj_komada3[2] = char((broj_komada3 % 100) / 10 + '0');
txt_broj_komada3[3] = char(broj_komada3 % 10 + '0');

Машински факултет у Бањој Луци 60


ДОДАТАК 2

//konverzija int to char za duzina3


txt_duzina3[0] = char(duzina3 / 1000 + '0') ;
txt_duzina3[1] = char((duzina3 % 1000) / 100 + '0');
txt_duzina3[2] = char((duzina3 % 100) / 10 + '0');
txt_duzina3[3] = char(duzina3 % 10 + '0');
//konverzija int to char za broj_komada4
txt_broj_komada4[0] = char(broj_komada4 / 1000 + '0') ;
txt_broj_komada4[1] = char((broj_komada4 % 1000) / 100 +'0');
txt_broj_komada4[2] = char((broj_komada4 % 100) / 10 + '0');
txt_broj_komada4[3] = char(broj_komada4 % 10 + '0');
//konverzija int to char za duzina4
txt_duzina4[0] = char(duzina4 / 1000 + '0') ;
txt_duzina4[1] = char((duzina4 % 1000) / 100 + '0');
txt_duzina4[2] = char((duzina4 % 100) / 10 + '0');
txt_duzina4[3] = char(duzina4 % 10 + '0');
//konverzija int to char za broj_komada5
txt_broj_komada5[0] = char(broj_komada5 / 1000 + '0') ;
txt_broj_komada5[1] = char((broj_komada5 % 1000) / 100 +'0');
txt_broj_komada5[2] = char((broj_komada5 % 100) / 10 + '0');
txt_broj_komada5[3] = char(broj_komada5 % 10 + '0');
//konverzija int to char za duzina5
txt_duzina5[0] = char(duzina5 / 1000 + '0') ;
txt_duzina5[1] = char((duzina5 % 1000) / 100 + '0');
txt_duzina5[2] = char((duzina5 % 100) / 10 + '0');
txt_duzina5[3] = char(duzina5 % 10 + '0');
//*******************************************
//slanje ka Arduinu
if(dugme_salji==1)
{
dugme_salji=0;
port.write('B');//start bajt //0
port.write( txt_broj_komada1[0]);
port.write( txt_broj_komada1[1]);
port.write( txt_broj_komada1[2]);
port.write( txt_broj_komada1[3]);
port.write( txt_duzina1[0]);//5
port.write( txt_duzina1[1]);
port.write( txt_duzina1[2]);
port.write( txt_duzina1[3]);
port.write( txt_broj_komada2[0]);
port.write( txt_broj_komada2[1]);//10
port.write( txt_broj_komada2[2]);
port.write( txt_broj_komada2[3]);
port.write( txt_duzina2[0]);
port.write( txt_duzina2[1]);
port.write( txt_duzina2[2]); //15
port.write( txt_duzina2[3]);
port.write( txt_broj_komada3[0]);

Машински факултет у Бањој Луци 61


ДОДАТАК 2

port.write( txt_broj_komada3[1]);
port.write( txt_broj_komada3[2]);
port.write( txt_broj_komada3[3]);//20
port.write( txt_duzina3[0]);
port.write( txt_duzina3[1]);
port.write( txt_duzina3[2]);
port.write( txt_duzina3[3]);
port.write( txt_broj_komada4[0]);//25
port.write( txt_broj_komada4[1]);
port.write( txt_broj_komada4[2]);
port.write( txt_broj_komada4[3]);
port.write( txt_duzina4[0]);
port.write( txt_duzina4[1]);//30
port.write( txt_duzina4[2]);
port.write( txt_duzina4[3]);
port.write( txt_broj_komada5[0]);
port.write( txt_broj_komada5[1]);
port.write( txt_broj_komada5[2]);//35
port.write( txt_broj_komada5[3]);
port.write( txt_duzina5[0]);
port.write( txt_duzina5[1]);
port.write( txt_duzina5[2]);
port.write( txt_duzina5[3]);//40
port.write( dugme1);
port.write( dugme2);
port.write( dugme3);
port.write('&');// 44 stop bajt
//****************************************
//prikaz na konzoli
print('B');//start bajt //0
print( txt_broj_komada1[0]);
print( txt_broj_komada1[1]);
print( txt_broj_komada1[2]);
print( txt_broj_komada1[3]);
print( txt_duzina1[0]);//5
print( txt_duzina1[1]);
print( txt_duzina1[2]);
print( txt_duzina1[3]);
print( txt_broj_komada2[0]);
print( txt_broj_komada2[1]);//10
print( txt_broj_komada2[2]);
print( txt_broj_komada2[3]);
print( txt_duzina2[0]);
print( txt_duzina2[1]);
print( txt_duzina2[2]); //15
print( txt_duzina2[3]);
print( txt_broj_komada3[0]);
print( txt_broj_komada3[1]);

Машински факултет у Бањој Луци 62


ДОДАТАК 2

print( txt_broj_komada3[2]);
print( txt_broj_komada3[3]);//20
print( txt_duzina3[0]);
print( txt_duzina3[1]);
print( txt_duzina3[2]);
print( txt_duzina3[3]);
print( txt_broj_komada4[0]);//25
print( txt_broj_komada4[1]);
print( txt_broj_komada4[2]);
print( txt_broj_komada4[3]);
print( txt_duzina4[0]);
print( txt_duzina4[1]);//30
print( txt_duzina4[2]);
print( txt_duzina4[3]);
print( txt_broj_komada5[0]);
print( txt_broj_komada5[1]);
print( txt_broj_komada5[2]);//35
print( txt_broj_komada5[3]);
print( txt_duzina5[0]);
print( txt_duzina5[1]);
print( txt_duzina5[2]);
print( txt_duzina5[3]);//40
print( dugme1);
print( dugme2);
print( dugme3);
print('&');// 44 stop bajt
}
//DUGME 3
if( mouseX> b3X1 && mouseX< b3X2 && mouseY> b3Y1 && mouseY<
b3Y2 && mousePressed){
restartpritisnut = loadImage("restartpritisnut.png");
image(restartpritisnut,b3X1,b3Y1);}
else{
image(restart,b3X1,b3Y1);}
void mousePressed(){
//DUGME 1
if ( mouseX> b1X1 && mouseX< b1X2 && mouseY> b1Y1 && mouseY<
b1Y2 ){ //prostor koji oznacava dugme - samo u tom prostoru
pritiskom na dugme se salje signal Arduinu
dugme1=1; dugme2=0; dugme3=0;
}
//DUGME 2
if ( mouseX> b2X1 && mouseX< b2X2 && mouseY> b2Y1 && mouseY<
b2Y2 ){ //prostor koji oznacava dugme - samo u tom prostoru
pritiskom na dugme se salje signal Arduinu
dugme1=0; dugme2=1; dugme3=0;
}

Машински факултет у Бањој Луци 63


ДОДАТАК 2

//DUGME 3
if ( mouseX> b3X1 +10 && mouseX< b3X2+10 && mouseY> b3Y1+10
&& mouseY< b3Y2+10 ){ //prostor koji oznacava dugme - samo u
tom prostoru pritiskom na dugme se salje signal Arduinu
dugme_salji=1;
}
//DUGME 4
if ( mouseX> b4X1 && mouseX< b4X2 && mouseY> b4Y1 && mouseY<
b4Y2 ){ //prostor koji oznacava dugme - samo u tom prostoru
pritiskom na dugme se salje signal Arduinu
dugme1=0; dugme2=0; dugme3=1;
}
k1.kMisIn = k2.kMisIn=k3.kMisIn=false;
promjena = false;
}
void crtajKrugove(){
k1.crtaj(); k2.crtaj(); k3.crtaj();
}
void bojiKrugove(){
k1.kBoja = (smjer == 0) ? bojaN : boja1;
k2.kBoja = (smjer == 1) ? bojaN : boja2;
k3.kBoja = (smjer == 2) ? bojaN : boja3;
}
//Podprogram za pisanje natpisa
void pisiNatpise(){
//nR.pisi(); nU.pisi(); nO.pisi(); nT.pisi();
nA.pisi(); nC.pisi(); nR.pisi();
}
//Podprogram za zaglavlje
void zaglavlje (){
PFont f1 = loadFont("TimesNewRomanPSMT-48.vlw"); //font
stroke(255);
fill(255);
rectMode(CORNERS); //Pravugaonik
rect(0,0,width, 100);
PImage mf = loadImage("mf.png"); //Slika loga faulteta
image(mf,0,0);
}

//DUZINA CIJEVI
//Funkcija koja se poziva kada se vrijednost u Numberbox-u
duzina1 promjene
public void Duzina1(int vrijednost1){
x = vrijednost1;
println("received "+vrijednost1+" from Numberbox Duzina1");
}
//Funkcija koja se poziva kada se vrijednost u Numberbox-u
duzina2 promjene

Машински факултет у Бањој Луци 64


ДОДАТАК 2

public void Duzina2(int vrijednost2){


x1 = vrijednost2;
println("received "+vrijednost2+" from Numberbox Duzina2 ");
}
//Funkcija koja se poziva kada se vrijednost u Numberbox-u
duzina3 promjene
public void Duzina3(int vrijednost3){
x2 = vrijednost3;
println("received "+vrijednost3+" from Numberbox Duzina3 ");
}

//Funkcija koja se poziva kada se vrijednost u Numberbox-u


duzina4 promjene
public void Duzina4(int vrijednost4){
x3 = vrijednost4;
println("received "+vrijednost4+" from Numberbox Duzina4 ");
}
//Funkcija koja se poziva kada se vrijednost u Numberbox-u
duzina5 promjene
public void Duzina5(int vrijednost5){
x4 = vrijednost5;
println("received "+vrijednost5+" from Numberbox Duzina5 ");
}
//BROJ KOMADA CIJEVI
//Funkcija koja se poziva kada se vrijednost u Numberbox-u
brojkomada1 promjene
public void Brojkomada1(int vrijednost6){
y=vrijednost6;
println("received "+vrijednost6+" from Numberbox Brojkomada1");
}
//Funkcija koja se poziva kada se vrijednost u Numberbox-u
brojkomada2 promjene
public void Brojkomada2(int vrijednost7){
y1=vrijednost7;
println("received "+vrijednost7+" from Numberbox Brojkomada2");
}
//Funkcija koja se poziva kada se vrijednost u Numberbox-u
brojkomada3 promjene
public void Brojkomada3(int vrijednost8){
y2=vrijednost8;
println("received "+vrijednost8+" from Numberbox Brojkomada3");
}
//Funkcija koja se poziva kada se vrijednost u Numberbox-u
brojkomada4 promjene
public void Brojkomada4(int vrijednost9){
y3=vrijednost9;
println("received "+vrijednost9+" from Numberbox Brojkomada4");
}

Машински факултет у Бањој Луци 65


ДОДАТАК 2

//Funkcija koja se poziva kada se vrijednost u Numberbox-u


brojkomada5 promjene
public void Brojkomada5(int vrijednost10){
y4=vrijednost10;
println("received "+vrijednost10+" from Numberbox
Brojkomada5");
}
//Podprogram koji omogucava unosenje vrjednosti u numberbox
void makeEditable( Numberbox n ) {
final NumberboxInput nin = new NumberboxInput( n );
//omogucava unosenje nove vrijednosti kad se otpusti dugme
misa unutar numberbox -a,
//dok se deaktivira cim se kursor pomjeri iz numberbox -a
n.onClick(new CallbackListener() {
public void controlEvent(CallbackEvent theEvent) {
nin.setActive( true );
}
}
).onLeave(new CallbackListener() {
public void controlEvent(CallbackEvent theEvent) {
nin.setActive( false ); nin.submit();
}
});
}
// Ovaj podprogram omogucava da se u numberbox moze upistati
zeljena vrijednost pomocu tastature
public class NumberboxInput {
String text = "";
Numberbox n;
boolean active;
NumberboxInput(Numberbox theNumberbox) {
n = theNumberbox;
registerMethod("keyEvent", this );
}
public void keyEvent(KeyEvent k) {
if (k.getAction()==KeyEvent.PRESS && active) {
if (k.getKey()=='\n') { //potvrdi unjetu vrijednost enterom
submit();
return;
} else if(k.getKeyCode()==BACKSPACE) {
text = text.isEmpty() ? "":text.substring(0, text.length()-1);
}
else if(k.getKey()<255) {
// check if the input is a valid (decimal) number
final String regex = "\\d+([.]\\d{0,2})?";
String s = text + k.getKey();
if ( java.util.regex.Pattern.matches(regex, s ) ) {
text += k.getKey();

Машински факултет у Бањој Луци 66


ДОДАТАК 2

}}
n.getValueLabel().setText(this.text);
}}
public void setActive(boolean b) {
active = b;
if(active) {
n.getValueLabel().setText("");
text = "";
}}
public void submit() {
if (!text.isEmpty()) {
n.setValue( float( text ) );
text = "";
}
else {
n.getValueLabel().setText(""+n.getValue());
}}
}

Машински факултет у Бањој Луци 67


ДОДАТАК 3

У овом додатку дат је код за класу која нам омогућава цртање кругова и писање
натписа:

class Krug {
int kX,kY,kR;
color kBoja, kBack = 152, sBoja = 205, kBojaD =
color(255,255,0);
boolean kMisIn = false; //kDupli = false;
//konstruktor klase Krug
Krug(int x,int y, int r, color boja){
kX = x;
kY = y;
kR = r;
kBoja = boja;
}
//drugi konstruktor klase Krug
Krug(int x,int y, int r, color boja,boolean drugi){
kX = x;
kY = y;
kR = r;
kBoja = boja;
}
void crtaj(){
fill(kBoja);
stroke(sBoja);
ellipse(kX,kY,2*kR,2*kR);
}
boolean prekoKruga(){
if ( sqrt(sq(kX-mouseX)+sq(kY-mouseY) ) < kR)
{
kMisIn = true;
}else{
kMisIn = false;
}
return kMisIn;
}
void strelica(int s){
smooth();
stroke(0);
strokeWeight(2);
noFill();
if (s > 0){
arc(kX,kY,2*(kR+6),2*(kR+6),PI,TWO_PI-PI/2);
ДОДАТАК 3

} else{
arc(kX,kY,2*(kR+6),2*(kR+6),TWO_PI-PI/2,TWO_PI);
}
if (s > 0){
line(kX,kY-(kR+6),kX-5,kY-(kR+6)-3);
line(kX,kY-(kR+6),kX-5,kY-(kR+6)+3);
}else{
line(kX,kY-(kR+6),kX+5,kY-(kR+6)-3);
line(kX,kY-(kR+6),kX+5,kY-(kR+6)+3);
}}}
//klasa pravougaonika
class Kvadrat {
int pX,pY,pD,pH;
color pBoja, pBack = 152, sBoja = 0;
boolean pMisIn = false, pDupli = false;
//konstruktor
Kvadrat(int x,int y,int d,int h,color boja){
pX = x;
pY = y;
pD = d;
pH = h;
pBoja = boja;
}

//drugi konsruktor
Kvadrat(int x,int y,int d,int h,color boja,boolean drugi){
pX = x;
pY = y;
pD = d;
pH = h;
pBoja = boja;
pDupli = drugi;
}
void crtaj(){
fill(pBoja);
stroke(sBoja);
rect(pX,pY,pD,pH);
}
boolean prekoKvadrata(){
if ((mouseX > pX && mouseX < pX+pD) &&
(mouseY > pY && mouseY < pY+pH)) {
pMisIn = true;
}else{
pMisIn = false;
}
return pMisIn;
}
}

Машински факултет у Бањој Луци 69


ДОДАТАК 3

class Natpis{
int nX,nY,nP,nV;
String nT,nFont;
color nB;
//konstruktor klase
Natpis(String textN, int pozX,int pozY, int nLDC, String
fontN, int sizeF, color boja){
nT = textN; //tekst koji se ispisuje
nX = pozX; //x-pozicija
nY = pozY; //y-pozicija
nP = nLDC; //poravnavanje LIJEVO<0,DESNO>0,CENTAR=0
nV = sizeF; //velicina fonta
nFont = fontN; //font,npr. "Arial","Times New Roman"
nB = boja; //boja natpisa
}
void pisi(){
PFont font;
font = createFont(nFont,18);
textFont(font,nV);
textAlign(CENTER);
if (nP < 0){textAlign(LEFT);}
if (nP > 0){textAlign(RIGHT);}
fill(nB);
text(nT,nX,nY);
}
}

Машински факултет у Бањој Луци 70


ЛИТЕРАТУРА

[1] Micbael Margolis ”ARDUINO COOKBOOK – First Edition”, O’Reilly Media, March
2011

[2] Massimo Banzi ”GETTING STARTED WITH ARDUINO – Second Edition”, O’Reilly
Media, September 2011

[3] Casey Reas, Ben Fry ”GETTING STARTED WITH PROCESSING – First Edition”,
O’Reilly Media, June 2010

[4] Daniel Shiffman ”LEARNING PROCESSING – Second Edition”, Elsevir, 2008

[5] Yury Magda ”ARDUINO INTERFACING AND SIGNAL PROCESSING”, 2012

[6] Драган Ерцег ”Пројектовање и израда мобилног робота који прати означену
линију”, Дипломски рад, Машински факултет Универзитета у Бањој Луци, Октобар
2013

You might also like