Projekt BBPA - Port´alov´y jeˇr´ab December 12, 2007
login ID
Martin Bereznanin xberez01 74888
Daniel Piˇsi xpisid00 78335
1
Jan Kubizˇ n´ak xkubiz01 78550
1
Zad´ an´ı
Na modelu port´alov´eho jeˇr´abu vytvoˇrte aplikaci, kter´a ˇreˇs´ı probl´em hanojsk´ ych vˇeˇz´ı. Jeˇr´ab mus´ı umˇet pracovat v automatick´em i manu´aln´ım reˇzimu.
2
2.1
Technologick´ y popis u ´lohy
Pohyb po ose X
Pojezd jeˇr´abu v ose X je zajiˇstˇen stejnosmˇern´ ym motorem M1. Odmˇeˇrov´an´ı polohy pro osu X zajiˇsˇtuje analogov´ y potenciometrem Pot, jehoˇz v´ ystupn´ı hodnota je v rozsahu ˇ max. 0 V – 10 V. Odmˇeˇrov´an´ı polohy v ose X zajiˇstuj´ı diskr´etn´ı sn´ımaˇce um´ıstˇeny v pˇeti poloh´ach. Jsou oznaˇceny jako K1 aˇz K5. Jsou-li logick´e v´ ystupy rovny 1, tak je voz´ık jeˇr´abu pˇr´ıtomen.
2.2
Pohyb po ose Y
Odv´ıjen´ı lana (pro osu Y) je zajiˇstˇeno krokov´ ym motorem M2. Pro tento nelze zjistit v jak´em smyslu je navinuto lano na bubnu navij´aku.
2.3
Indikace pohybu a polohy magnetu
Magnet slouˇz´ı pro pˇresouv´an´ı bˇremen. Je upevnˇen na konci lana. Nejvyˇsˇs´ı horn´ı poloha magnetu je sn´ım´ana ˇcidlem K Up um´ıstˇen´ ym na voz´ıku jeˇr´abu. Indikace dosednut´ı 2
magnetu na podloˇzku nebo bˇremeno je zajiˇstˇeno faktem, ˇze kladka, pˇres kterou vede lano k magnetu, je po obvodu ozuben´a. Pˇri pohybu kladky (pohybuje li se magnet v ose Y) zuby stˇr´ıdavˇe sp´ınaj´ı a rozp´ınaj´ı sp´ınaˇc K Down. Pro zjiˇstˇen´ı, zda magnet dosedl na podloˇzku, nebo bˇremeno, lze vyuˇz´ıt toho, ˇze pˇri dosednut´ı se v lanˇe sn´ıˇz´ı napˇet´ı, ozuben´a kladka se t´ım pˇrestane ot´aˇcet a sn´ımaˇc K Down nebude vyd´avat pulzy.
2.4
Bezpeˇ cnostn´ı tlaˇ c´ıtka
Pomoc´ı tlaˇc´ıtka START (zelen´e tlaˇc´ıtko na panelu jeˇr´abu) se zap´ın´a jeˇr´ab. Je pˇrivedeno napˇet´ı na sn´ımaˇce, motory a ˇr´ıd´ıc´ı desku. Naopak tlaˇc´ıtko STOP (ˇcerven´e tlaˇc´ıtko na panelu jeˇr´abu) zp˚ usob´ı zastaven´ı motor˚ u a ˇr´ıd´ıc´ı deska a sn´ımaˇce se odpoj´ı od nap´ajen´ı.
3 3.1
ˇ sen´ı Reˇ Hlavn´ı smyˇ cka programu
Hlavn´ı smyˇcka slouˇz´ı pˇredevˇs´ım k zabezpeˇcen´ı krajn´ıch poloh a regulaci nav´ıjen´ı lanka v z´avislosti na horizont´aln´ım pohybu magnetu. Tato smyˇcka je vol´ana 100x za sekundu. 3.1.1
Pˇ rep´ın´ an´ı reˇ zim˚ u
Pˇrep´ın´an´ı mezi jednotliv´ ymi reˇzimy je zajiˇsˇteno dle promˇenn´e SysState, kter´a m˚ uˇze nab´ yvat hodnot 0, 1, 2. switch SysState of case 0; InitControl(DCSpd_loc, DCDir_loc, StepperSpd_loc, StepperDir_loc, StepperEn_loc); StateText=’Inicializace’; case 1; ManualControl(DCSpd_loc, DCDir_loc, StepperSpd_loc, StepperDir_loc, StepperEn_loc); StateText=’Manualni rezim’; case 2; AutomaticControl(DCSpd_loc, DCDir_loc, StepperSpd_loc, StepperDir_loc, StepperEn_loc, MagOn_loc); HanoiTowerAlgorithm(); StateText=’Automaticky rezim’; end;
3.1.2
Zjiˇ stˇ en´ı pohybu magnetu
Zjiˇstˇen´ı, zda se magnet pohybuje, je nutn´e pˇri pˇrekl´ad´an´ı jednotliv´ ych plechovek. Promˇenn´a MagnetStopTime je po kaˇzd´em pr˚ uchodu smyˇckou v pˇr´ıpadˇe, ˇze se hodnota ˇcidla
3
K Down nezmˇenila, inkrementov´ana. Pokud se hodnota zmˇenila, tak je MagnetStopTime vynulov´ano. Pokud hodnota MagnetStopTime dos´ahne hodnoty 100 (= 1 sekunda), tak je zˇrejm´e, ˇze se magnet neh´ ybe. if (K_Down_prev = K_Down) then if (MagnetStopTime < 65535) then MagnetStopTime = MagnetStopTime + 1; end else MagnetStopTime = 0; ImpCnt = ImpCnt + 1; end; if (not Model_On) thenswitch SysState of case 0; InitControl(DCSpd_loc, DCDir_loc, StepperSpd_loc, StepperDir_loc, StepperEn_loc); StateText=’Inicializace’; case 1; ManualControl(DCSpd_loc, DCDir_loc, StepperSpd_loc, StepperDir_loc, StepperEn_loc); StateText=’Manualni rezim’; case 2; AutomaticControl(DCSpd_loc, DCDir_loc, StepperSpd_loc, StepperDir_loc, StepperEn_loc, MagOn_loc); HanoiTowerAlgorithm(); StateText=’Automaticky rezim’; end; MagnetStopTime = 0; end; if (MagnetStopTime < 100) then MagnetMove = true; else MagnetMove = false; end;
3.1.3
Oˇ setˇ ren´ı krajn´ıch poloh
N´asleduj´ıc´ı k´od zajiˇsˇtuje zastaven´ı motor˚ u pˇri dosaˇzen´ı horizont´aln´ıch krajn´ıch poloh. if ((DCDir_loc and (POT>MaxRight)) or (not DCDir_loc and (POT<MaxLeft))) then DCSpd_loc=0; StepperSpd_loc=0; end;
4
Pˇri sepnut´ı ˇcidla K Up se za pˇredpokladu, ˇze se magnet st´ale pohybuje nahoru, se motor nav´ıjej´ıc´ı lanko zastav´ı. if (K_Up and (StepperDir_loc = StepperUp) ) then StepperSpd_loc = 0; end;
Z´aroveˇ n doch´az´ı ke sjet´ı magnetu o 4 pulzy n´ıˇz v pˇr´ıpadˇe, ˇze je sepnuto ˇcidlo K Up. if (HeightCor) then if (DCDir_loc xor StepperUp) then StepperSpd_loc = StepperSpd_loc + 800; else StepperSpd_loc = StepperSpd_loc - 800; end; if (ImpCnt > 4) then HeightCor = false; end; end;
3.1.4
Regulace v´ yˇ sky magnetu
Rychlost motoru, kter´ y nav´ıj´ı lanko, je pˇrepoˇc´ıt´av´ana na z´akladˇe rychlosti motoru ˇ zajiˇstuj´ıc´ıho horizont´aln´ı pohyb. Experiment´alnˇe jsme zjistili necitlivosti obou motor˚ u a konstantu pomˇeru jejich rychlost´ı. if (DCSpd_loc > 650) then if(DCSpd_loc > DCLimitSpd) then DCSpd_loc = DCLimitSpd; end; StepperEn_loc=true; StepperDir_loc = (not DCDir_loc) xor StepperUp; StepperSpd_loc = (DCSpd_loc-650)*1.07 + 300; end;
3.2
Inicializace
Inicializace je v´ ychoz´ı reˇzim po spuˇstˇen´ı programu. 3.2.1
Zjiˇ stˇ en´ı smˇ eru nav´ıjen´ı
Zjiˇstˇen´ı smˇeru je prvn´ım krokem inicializace. Po spuˇstˇen´ı se magnet zaˇcne pohybovat ˇ na horn´ı ˇcidlo (K Up), nebo na podloˇzku. (zat´ım nev´ıme jak´ ym smˇerem) a naraz´ı bud 5
Po n´arazu na podloˇzku je promˇenn´a MagnetMove v hlavn´ı smyˇcce zmˇenˇena na nulu. Zmˇen´ı se smˇer pohybu nav´ıjen´ı magnetu. switch state of case 0; (* Magnet nahoru *) if (K_Up or (not MagnetMove)) then StepperUp = K_Up; stp_en = false; state=1; else stp_spd = StepperInitSpd; stp_dir = true; stp_en = true; end;
3.2.2
Nastaven´ı bezpeˇ cn´ e v´ yˇ sky magnetu
Z pˇredchoz´ıho kroku je zn´am smˇer nav´ıjen´ı lanka, proto m˚ uˇzeme nastavit bezpeˇcnou v´ yˇsku magnetu. Pokud je magnet moment´alnˇe na podloˇzce, tak vyjede na zar´aˇzku u (= bezpeˇcn´a poloha) nez´avisle na poˇc´ateˇcn´ım K Up. Z n´ı dojde k poklesu o 6 pulz˚ stavu (zda byl dole nebo nahoˇre) . 3.2.3
Sejmut´ı analogov´ ych hodnot sn´ımaˇ c˚ u polohy a doraz˚ u
N´aslednˇe magnet najede na levou krajn´ı polohu a uloˇz´ı si analogovou hodnotu. Pot´e jede zpˇet ke sv´emu prav´emu dorazu a pˇri sepnut´ı ˇcidel K2, K3 a K4 opˇet uloˇz´ı jejich hodnotu. Ty jsou pot´e vyuˇzity pˇri ˇreˇsen´ı u ´lohy hanojsk´ ych vˇeˇz´ı. Nakonec dojede na prav´ y doraz, kde uloˇz´ı analogov´ y u ´daj o poloze ˇcidla K5. Toto je jeho inicializaˇcn´ı poloha. T´ımto proces inicializace konˇc´ı a je moˇzn´e pokraˇcovat v manu´aln´ım nebo automatick´em reˇzimu.
3.3 3.3.1
Manu´ aln´ı reˇ zim Grafick´ e rozhran´ı a zobrazen´ı na internetu pˇ res http server
Kontrolka v lev´em horn´ım rohu indikuje chod, zda program bˇeˇz´ı (zelenou barvou). Textov´ y popisek vedle n´ı zobrazuje souˇcasn´ y reˇzim - inicializace, manu´aln´ı a automatick´ y reˇzim. Pod n´ım jsou zobrazeny kontrolky indikuj´ıc´ı sepnut´ı sn´ımaˇc˚ u K1 - K5, sn´ımaˇc analogov´e horizont´aln´ı polohy a sn´ımaˇc pohybu magnetu. Posuvn´ıky u ´plnˇe napravo lze mˇenit poˇc´ateˇcn´ı a c´ılovou polohu pro u ´lohu Hanojsk´ ych vˇeˇz´ı. V manu´aln´ım reˇzimu lze pouˇz´ıvat tlaˇc´ıtka se ˇsipkami k pohybu magnetu a tlaˇc´ıtko v prav´em horn´ım rohu k jeho sp´ın´an´ı. Grafick´e rozhran´ı je moˇzn´e zobrazit tak´e prostˇrednictv´ım webov´e str´anky. M´a vˇsak ˇ ıd´ıc´ı u jist´a omezen´ı. Slouˇz´ı pouze k zobrazovan´ı aktu´aln´ı pozice magnetu. R´ ´kony jako je pohyb ˇci sp´ın´an´ı magnetu v manu´aln´ım reˇzimu, ˇci pˇrep´ın´an´ı reˇzim˚ u nebo poˇc´ateˇcn´ı 6
a c´ılov´e polohy umoˇznˇeno z d˚ uvodu bezpeˇcnosti nen´ı. Z´aroveˇ n je str´anka obnovov´ana kaˇzdou 1 s, coˇz se projev´ı nesouvisl´ ymi zmˇenami na indik´atoru analogov´e horizont´aln´ı polohy.
3.3.2
Zdrojov´ y k´ od
Manu´aln´ı reˇzim zajiˇsˇtuje pˇriˇrazen´ı odpov´ıdaj´ıc´ıch rychlost´ı a smˇer˚ u po stisknut´ı jednotliv´ ych tlaˇc´ıtek. procedure ManualControl( var dc_spd : real; var dc_dir : boolean; var stp_spd : real; var stp_dir : boolean; var stp_en : boolean ); begin if (ButtonLeft or ButtonRight) then dc_spd=DCSpd; else dc_spd=0; end; dc_dir = ButtonRight; if (ButtonDown or ButtonUp) then stp_spd=StepperSpd; stp_en=true;
7
else stp_spd=0; end; stp_dir = ButtonUp; end_procedure;
3.4 3.4.1
Automatick´ y reˇ zim Pˇ resun plechovek
Po dosaˇzen´ı ˇz´adan´e pozice se magnet zastav´ı a dle promˇenn´e CanAction dojde k nabr´an´ı nebo poloˇzen´ı plechovky. if ((dc_dir and (POT >= xThd[xPosW])) or (not dc_dir and (POT <= xThd[xPosW]))) then xPosU = xPosW; dc_spd = 0; end; if (xPosU = xPosW) then switch CanAction of case 1; CanGrab(stp_spd, stp_dir, stp_en, mag_on); case 2; CanPut(stp_spd, stp_dir, stp_en, mag_on); end; end; end;
3.4.2
Nabr´ an´ı a poloˇ zen´ı plechovky
Po dosaˇzen´ı polohy plechovky je magnet spuˇstˇen dol˚ u. Kdyˇz je detekov´ano, ˇze se magnet jiˇz neh´ ybe, tak dojde k sepnut´ı magnetu a k nabr´an´ı plechovky. N´aslednˇe je plechovka opˇet vytaˇzena do horn´ı polohy. Obdobnˇe funguje i pokl´ad´an´ı plechovky. 3.4.3
Dynamick´ a zmˇ ena rychlosti
Pˇri rozjezdu doch´az´ı k postupn´emu navyˇsov´an´ı rychlosti. Pˇri naj´ıˇzdˇen´ı do polohy fin´aln´ı se tato rychlost naopak sniˇzuje. Maxim´alnˇe jde dos´ahnout rychlosti 2200. if (xPosW > xPosU) then dc_dir = true; dc_spd = 1.5*abs(POT-xThd[xPosW])+1000; a = 2*abs(POT-xThd[xPosU])+1000;
8
if (a < dc_spd) then dc_spd = a; end; if (2200 < dc_spd) then dc_spd = 2200; end; end; end;
3.4.4
Algoritmus Hanojsk´ ych vˇ eˇ z´ı
Pouˇzit´ y algoritmus je zaloˇzen na efektivn´ım bin´arn´ım TH algoritmu. Kromˇe rychlosti v´ ypoˇctu nab´ız´ı i n´ızkou pamˇeˇtov´a n´aroˇcnost. Prov´adˇenou akci umoˇzn ˇuje vypoˇc´ıtat pouze na z´akladˇe ˇc´ısla kroku. Kromˇe zm´ınˇen´ ych v´ yhod m´a p˚ uvodn´ı algoritmus i sv´a u ´skal´ı. Nepˇr´ıjemn´ ym faktem je nemoˇznost volby v´ ychoz´ı pozice a z´avislost c´ılov´e pozice na poˇctu disk˚ u. Tento nedostatek lze ˇreˇsit vhodnou modifikac´ı vypoˇcten´e akce. Tu lze realizovat vyuˇzit´ım vypoˇcten´ ych pozic jako index˚ u vhodnˇe pˇredpˇripraven´eho pole. Tento pˇr´ıstup n´am umoˇznil elegantnˇe rozˇs´ıˇrit p˚ uvodn´ı algoritmus o volbu v´ ychoz´ı a c´ılov´e polohy nez´avisle na poˇctu disk˚ u. (* Po vykonani vsech potrebnych kroku system prechazi do manualniho rezimu *) if (MoveNum >= bitshl(1, DiscCnt)) then AutoRgmOn = false; ManualRgmOn = true; SysState = 1; return; end; (* Naplneni transformacniho pole *) if (bitand(DiscCnt, 1) = 1) then Pegs[0] = SrcPeg; Pegs[1] = 3 - SrcPeg - DstPeg; Pegs[2] = DstPeg; else Pegs[0] = SrcPeg; Pegs[1] = DstPeg; Pegs[2] = 3 - SrcPeg - DstPeg; end;
(* Vychozi pozice *) (* Odkladaci pozice *) (* Cilova pozice *)
(* Binarni TH algoritmus *) f = bitand(MoveNum, MoveNum-1) % 3; t = (bitor(MoveNum, MoveNum-1) + 1) % 3;
9
(* Transformace vystupu *) f = Pegs[f]; t = Pegs[t];
4
Z´ avˇ er
D´ıky tomuto projektu jsme mˇeli moˇznost se sezn´amit s programov´ ym prostˇred´ım ControlWeb a problematikou Hanojsk´ ych vˇeˇz´ı. V´ ysledkem naˇs´ı usilovn´e pr´ace je program, kter´ y je schopen ˇreˇsit tuto u ´lohu automaticky. Stejnˇe tak m´a uˇzivatel moˇznost ovl´adat jeˇr´ab manu´alnˇe. Vˇse je zabezpeˇceno tak, aby nedoˇslo k ˇz´adn´emu rizikov´emu stavu.
10