Professional Documents
Culture Documents
МАШИНСКИ ФАКУЛТЕТ
СТУДИЈСКИ ПРОГРАМ МЕХАТРОНИКА
Драган Ерцег
Кандидат:
Драган Ерцег
УНИВЕРЗИТЕТ У БАЊОЈ ЛУЦИ
МАШИНСКИ ФАКУЛТЕТ
СТУДИЈСКИ ПРОГРАМ МЕХАТРОНИКА
САДРЖАЈ:
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
ДОДАТАК 2 ............................................................................................................................ 56
ДОДАТАК 3 ............................................................................................................................ 68
ЛИТЕРАТУРА ........................................................................................................................ 71
= ∙ = 1 ∙ 5 ∙ 10 = 5 ∙ 10 [ ] = 5[ ].
Као што смо већ констатовали у претходном поглављу, основни проблем који доводи
до великог одступања у жељеној дужини одсјечене цијеви настаје због различитих
вриједности пређених путева колица и цијеви до момента стезања стеге S. Да бисмо
ријешили овај проблем морамо на неки начин мјерити пређени пут колица и поредити
га са пређеним путем цијеви (који мјеримо помоћу инкременталног енкодера). Пут који
прeђе цијев за сјечење је = ∙ , док је пут који прeђу колица у том времену
= ∙ , гдје je представља брзину кретања цијеви, а средњу брзину кретања
колица у времену Т. Тренутна брзина кретања колица је = ∙ , гдје представља
убрзање колица, док је средња брзина кретања колица = ∙ , односно пређени пут
= ∙ = ∙ ∙ = ∙ .
Стега треба да се ухвати за цијев кад су путеви који пређу колица и цијев исти,
без обзира да ли су у том тренутку њихове брзине исте. Претпостављамо да је брзина
цијеви у времену Т константна, док је у моменту стезања брзина колица увијек већа од
брзине цијеви. Када се вриједности ова два пређена пута изједначе, тј. када буде
= стега S треба да стегне цијев. У том случају добијамо да се цијев и колица крећу
истом брзином, тј. = . Овим смо постигли да активирање стеге S не зависити од
тога када ће граничник g да активира прекидач s, већ ће цијели процес зависити од тога
када ће се пређени путеви колица и цијеви изједначити.
А, чијим се кретањем извлачи уже “wire encoder - а”, на основу чега можемо мјерити
пређени пут колица. Када се вриједност пређеног пута цијеви, који се мјери помоћу
инкременталног енкодера и пређеног пута колица који се мјери помоћу “wire encoder -
a” поклопе, шаље се импулс разводном вентилу стеге S и иницира се стезање. На овај
начин смо обезбиједили да су задата и стварна дужина цијеви исте. Достизањем
крајњег положаја стеге S, активира se крајњи прекидач but7, који уз услов да је
претходно активиран и прекидач but2 иницира активирање разводног вентила тестере
D и сјечење цијеви. Након тога колица долазе до прекидача but1, чијим се активирањем
враћају у почетни положај. Овим је циклус сјечења цијеви завршен и процес се може
поново наставити.
Након што смо изабрали управљачки систем, потребно је изабрати сензоре који
ће обезбиједити захтијевану дужину цијеви. Као и код избора управљачког система,
тако и код избора сензора постоји неколико врста сензора који могу да испуне задатке
који се пред њих постављају. У овом случају за сензор је изабран енкодер са ужетом
(wire encoder SP1 – 50) и он је приказан на слици 2.5. Помоћу овога енкодера можемо
мјерити линеарно помјерање цилиндра А, а тиме и пређени пут колица.
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.
микроконтролер: 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.
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.
Напомена: Дизајн Ардуино платформе може користити ATmega8, 168 или 328
микроконтролер. Тренутни модели користе ATmega328, на слици 3.3. приказана је
шема ATmega168. Пин конфигурација је идентична за сва три процесора.
Ардуино Уно се може напајати путем USB везе или са екстерним напајањем.
Извор напајања је аутоматски одабран. Екстерно (не USB) напајање може доћи из
AC/DC адаптера или батерије. Адаптер може бити спојен прикључком 2,1 mm у
утичницу, улаз за екстерно напајање на слици 3.2.
VIN - улазни напон на Ардуино плочу када се користи екстерно напајања (за
разлику од 5 V из USB прикључка ово је други регуларни извор напајања).
5 V - регулисано напајање користи се за напајање микроконтролера и осталих
компоненти на плочи. Оно може бити из VIN преко on-board регулатора, или
преко USB – a.
3V3 - 3.3 V напајања генерише се помоћу FTDI чипа.
GND - маса.
Ардуино Уно има 6 аналогних улаза, са ознаком А0 до А5, од којих сваки пружа
10 битну резолуције (тј. 1024 различите вриједности) тако да се за улазни континуални
напон од 0 V до 5 V на излазу добија дигитални број од 0 до 1023. Од аналогних пинова
два се могу конфигурисати за посебне намјене. То су пинови А4 и А5 преко којих се
може обезбиједити ефикасна и широко примјењивана I2C (Inter-Integrated Circuit)
серијска комуникација.
pinMode(A0, OUTPUT);
digitalWrite(A0, HIGH);
микроконтролер: 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.
#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
}
Инкрементални енкодери
енкодери раде на принципу генерисања поворке импулса чијим
се бројањем израчунава угаони померај. Због тога се инкрементални енкодери често
називају бројачким енкодерима. Инкремен
Инкрементални
тални енкодер је оптички уређај помоћу
којег се мјери угао, при чему се (узимај
(узимајући
ући у обзир и вријеме) може мјерити и угаона
брзина осовине. На примјер ако се мјери промјена угла у току 1 секунде онда се добија
угаона брзина [ ⁄ ].. Ови енкодери се састоје из три главна елемента: диска,
свјетлосног извора (емитер) и свјет
свјетлосног
лосног детектора) Диск је монтиран на осовину и
смештен између пара емитер-детектор
емитер детектор (слика 3.6). Како се осовина окреће отвори у
диску пресецају емитоване светлосне зраке. Хардвер и софтвер, повезани на детектор,
прате ове светлосне импулсе и помоћу њих оп опажају
ажају ротацију осовине.
одређивађе смјера обртања. Када се ротор окреће у смјеру казаљке (CW eng. Clockwise )
канал А предњачи за у односу на канал B. За супротни смјер (CCW eng. Counter –
clockwise) канал B предњачи за у односу на канал А .Овакав тип сигнала се назива
квадратурни. Детекцијом узлазних и силазних ивица фазних импулса и комбинацијом
овако добијених импулса са фазним импулсима, резолуција енкодера се може увећати
до четири пута. Овај поступак приказан је на слици 3.7.
а) б)
Програм писан за Ардуино назива се скеч (енг. sketch). Сваки Ардуино програм састоји
се из три дијела. У првом дијелу дефинишемо варијабле и константе које су видљиве у
цијелом програму (глобалне променљиве), те укључујемо библиотеке уколико су нам
потребне за реализовање програма. Друга два дијела програма састоје се од главних
функција програма: setup() која се извршава само једном, на почетку рада програма и
loop() која представља главни дио програма. Највећи дио кодирања је унапријед
дефинисан тако да не треба да се креће са програмирањем од нуле (што програмирање
много олакшава).
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);
}
}
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 система.
void loop ()
{
if(primljen)
{
serial_buffer[0] = '\0';
primljen = false;
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(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]);
}
}
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;
}
}
}
void glavni()
{
if(digitalRead(but8)==LOW) //but8 globalna promenljiva
{
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);
if(potValue2<=2)
h=true;
}
}
Processing је под open source лиценцом што је данас прилично популарно. Како
неке компаније посједују већину тржишта, оpen source лиценца је готово једини начин
да програми доспију на тржиште. То опет неминовно доводи до чињенице да постоји
много развојних окружења, али ни једно није успјело завладати иоле већим дијелом
тржишта. Чињеница је да се Processing није развио превише на тржишту, али је као
такав ипак нешто боље прихваћен него остали алати за развој. Такође, програмери се
охрабрују да објављују кодове својих апликација како би остали корисници могли
учити од њих и из њих. На тај начин су настале неке апликације које би иначе било
немогуће направити без помоћи и асистенције.
програма над којим се користе print() и println() функције. Алатна трака допушта
покретање програма, креирање новог скеча, отварање, снимање и учитавање.
Покретањем Run функције, код се аутоматски компајлира и отвара у новом прозору.
Stop зауставља покренуту апликацију, али не затвара прозор. Функција за учитавање
(функција Учитај) омогућава да се скица креира као Java апликација у HTML – u. Мени
пружа исту функционалност као и алатна трака, с тим да пружа и неке додатне
могућности за рад са датотекама.
void setup()
{
size(200,200);
background(255);
smooth(); //команда која омогућава заобњене ћошкове
}
void draw()
{
stroke(0); line(pmouseX ,pmouseY ,mouseX ,mouseY); //цртање
линије у зависности од координата миша
}
5.4 Варијабле
Ако неку вриједност у нашој апликацији морамо више пута позивати онда
морамо користити варијабле. У Processing – u се варијабле наводе прије почетка
писања програма, у заглављу. У заглављу се може навести само декларација варијабле,
а касније се варијабла може иницијализовати. Декларација има синтаксу
int varijabla; и она је потребна да се зна колико се меморије мора резервисати за
одређену варијаблу.
Ток програма могуће је контролисати наредбама као што су if, else, while,
for итд. Наредба if омогућава да се одабере извршавање једног дијела програма (једне
или више наредби) у зависно од неког услова. Услов је логичког типа (boolean), што
значи да или се улази у петљу или се прескаче петља. Синтакса наредбе је:
if (uslov){
naredbe A;
}
else {
naredbe B;
}
Ако је задовољен услов онда се наставља дио кода naredbe A;, а ако услов
није задовољен наставља се дио кода naredbe B;.
While петља је наредба контроле тока која омогућава коду да се извршава више
пута на основу враћеног логичког. Синтакса наредбе је:
while (uslov){
naredbe;
}
Важне опције класе Serial су: stop() затварање порта, available() враћа
број доступних бајтова, read() чита доступне податке, readString() чита податке и
враћа их као string тип података, write() шаље податке, те list() враћа листу
доступних серијских портова.
2
1
3
Слика 5.6: Изгледа SCADA система за контролу „летеће тестере”
2. Омогућава нам избор жељеног режима рада (жута боја означава изабрани режим
рада)
void crtajKrugove(){
k1.crtaj(); k2.crtaj(); k3.crtaj();
}
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(){
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.
КОЛИЦА ЕНКОДЕР СА
УЖЕТОМ
СТЕГА
ТЕСТЕРА
ИНКРЕМЕНТАЛНИ ЕНКОДЕР И
МОТОР
#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 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 tonePin=7;
//int tune[] =
//{
// NOTE_D0,NOTE_D1,NOTE_D2,
//};
int brojC=5;
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 loop ()
{
if(primljen)
{
serial_buffer[0] = '\0';
primljen = false;
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;
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)
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;
}
}
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]);
}
}
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;
}
}
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 );
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
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]);
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;
}
//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
}}
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());
}}
}
У овом додатку дат је код за класу која нам омогућава цртање кругова и писање
натписа:
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;
}
}
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);
}
}
[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
[6] Драган Ерцег ”Пројектовање и израда мобилног робота који прати означену
линију”, Дипломски рад, Машински факултет Универзитета у Бањој Луци, Октобар
2013