/* A hardware sajatossagaihoz (tulforgas, elore nehezen indulas stb) idomitott valtozat. Kesznek is tekintheto. 1) Fogadja a Loggertol USB soros porton a rotor vezerlo jelet (HyGain DCU-1 protokollal: erkezik "AP1xxx", ahol xxx a beallitando szog). Vizsgalja, hogy a rotor hogyan all a beallitando poziciohoz kepest. Ha a szogkulonbseg kisebb 10 foknal, az antennat iranyban allonak tekinti, nem forgat, a feher LED-et kigyujtja. Ha a szogkulonbseg nagyobb mint 10 fok, a rotort a megfelelo iranyba forgato jelfogot meghuzatja addig, ameddig a visszajelzett pozicio nem eri el a beallitandot. Ha a rotor a vezerlesre nem indul meg (6 sec alatt a visszajelzett pozicio nem valtozik), 2 sec-ig ellenkezo iranyu, ujabb 7 sec-ig jo iranyu vezerlest ad. Ha tovabbra sincs megfelelo pozicio valtozas, a vezerles megszunik es hibajelzest ad (piros LED ismetlodo 1 villanas-szunet: rotor meg sem indult). Ha a forgas megindult, 2 sec-enkent ellenorzi, hogy forog-e, (megtett-e ez alatt az ido alatt min. 4 fokot), es ha nem (es meg nem fordult iranyba), a vezerles megszunik es hibajelzest ad (piros LED ismetlodo 2 villanas-szunet). Ha az iranyba allas sikeres volt, D13 feher LED gyullad ki. 2) Veszleallitas: A D2. lab (4k7-el +5V-on) foldelesevel. Ez interruptot valt ki, a veszleallas hibajelzese: piros LED ismetlodo 3 villanas - szunet. 3) Barmely hibajelzes (piros LED villog) eseten mindket motor vezerlo jelfogo elenged. A folyamat ujrainditasa: RST lab foldelesevel (RESET piros gomb megnyomasaval). 4) A ket vegpontnak megfelelo digitalis erteket a belso EEPROM-bol olvassa ki, ezeket a D10, D12 nyomogombbal az adott pozicioban fel lehet tolteni. A rekeszek tartalma: 1.memoriarekeszben 10 fok alacsony helyiertek, 2.memoriarekeszben 10 fok magas helyiertek, 3.memoriarekeszben 350 fok alacsony helyiertek, 4.memoriarekeszben 350 fok magas helyiertek. A1: Analog bemenet (GND-hez kepest). D2: Interrupt azonnali leallashoz 4k7-el 5V-ra felhuzva D10: Zold nyomogomb 4k7-el 5V-ra felhuzva, megnyomaskor foldelve Nmax bevetelezesehez (irany: 350 fok) D12: Sarga nyomogomb 4k7-el 5V-ra felhuzva, megnyomaskor foldelve Nmin bevetelezesehez (irany: 10 fok) A2: A nagyobb iranyba forgato kimenet (+ zold LED soros 330 Ohm, katod: GND) A3: A kisebb iranyba forgato kimenet (+ sárga LED soros 330 Ohm, katod: GND) D11: Hibajelzes piros LED kimenet (soros 330 Ohm, katod: GND) D13: Feher LED a panelen es elolapon: kigyullad ha az iranyba allitas OK, kialszik, ha uj irany vezerlest kapott. RST: Foldelve RESET, alapallapotba kerul (piros gomb megnyomasa) 2x16 LCD-kek hattervilagitassal. Elso sor karakterei (0...15 ,0) a masodik sor karakterei (0...15, 2) modon cimezhetok. 2x16 karakteres kijelzo, bekotese: LCD kivezetes Arduino panel kivezetes 1 (GND) GND 2 (Vcc) +5V 3 (Kontraszt) GND es +5V kozti potmeter csuszkaja 4 (RS - Register select) D4 5 (R/W - Read/Write select) GND 6 (E - Enable) D5 7 (D0 - Data0) - 8 (D1 - Data1) - 9 (D2 - Data2) - 10 (D3 - Data3) - 11 (D4 - Data4) D6 12 (D5 - Data5) D7 13 (D6 - Data6) D8 14 (D7 - Data7) D9 15 (LED - Vcc) +5V, 150 ohm ellenallas sorba 16 (LED - GND) GND */ #include "EEPROM.h" // EEPROM eljarast hasznaljuk #include "LiquidCrystal.h" // A LiquidCrystal eljarast hasznaljuk LiquidCrystal lcd(4, 5, 6, 7, 8, 9); // Az LCD bekotese //labak szerint: RS(D4), E(D5), D4(D6) ,D5(D7), D6(D8), D7(D9) byte fok[8] ={B00110,B01001,B01001,B00110,B00000,B00000,B00000}; //fok definialasa LCD-re long beolv = 666; //egyszeri beolvasas A/D eredmenye (10 bites) long beolvelozo = 666; // LCD billeges kizarasahoz byte a1[8] = {B10,B100,B1110,B1,B1111,B10001,B1111}; //ekezetes a byte e1[8] = {B10,B100,B1110,B10001,B11111,B10000,B1110};//ek. e byte i1[8] = {B100,B100,B0,B1110,B100,B100,B1110};//hosszu i byte o1[8] = {B100,B100,B0,B1110,B10001,B10001,B1110};// hosszu o long Nmax; // A legnagyobb szogelfordulaskor mert A/D szam long Nmin; // A legkisebb szogelfordulaskor mert A/D szam int beolvasott = 666; // Az utolso 50 meres A/D szamanak atlaga byte EmaxH; // EEPROM-ba irt Nmax magas helyiertek byte EmaxL; // EEPROM-ba irt Nmax alacsony helyiertek byte EminH; // EEPROM-ba irt Nmin magas helyiertek byte EminL; // EEPROM-ba irt Nmin alacsony helyiertek int Emax; // EEPROM Nmax int Emin; // EEPROM Nmin byte a=999, b=999, c=999, d=999, i; //sorosolvasas szamjegyei long k, m; // soros beolvasasi ido tullepes ellenorzeshez long t; // szamlalas kedo ertekenek rogzitese [millis()] int e; // ez a soros vonalon a Loggerbol beolvasott cel szog int h; // 0, ha nincs hiba. 1, ha szurul. 2, ha forgas kozben megakad int szog; // ez a mert tenyleges szog int szog1; // ez a kiindulasi szog int szog2; // a forgas kozben 2 secenkent mert szog segedvaltozo int t1; // forgas ellenorzesekor idointervallum kezdete int legnagyobb; // az elozo mereskor beolvasott A/D ertek int be; // a beolvasott A/D ertek int j; // valtozo ciklusszamlalasnal void setup() { attachInterrupt(0,hiba,FALLING); // Interrupt veszleallas a D2 labon pinMode(A2, OUTPUT); // Nagyobb iranyba forgato jelfogo vez. (zold) pinMode(A3, OUTPUT); // Kisebb iranyba forgato jelfogo vez. (sarga) pinMode(2, INPUT); //Interrupt : hiba pinMode(11, OUTPUT); // Hibajelzes LED (piros) pinMode(10, INPUT); //Max.szogelfordulaskor fesz meres inditas pinMode(12, INPUT); //Min.szogelfordulaskor fesz meres inditas pinMode(13, OUTPUT); // feher LED a proc. panelen es elolapon lcd.begin(16, 2); lcd.createChar(3, e1); // lcd.write(3) az ekezetes e-t jeleniti meg lcd.createChar(2, fok); //lcd.write(2)a fok karaktert jeleniti meg lcd.createChar(1, a1); // lcd.write(1) ekezetes a-t jelenit meg lcd.createChar(4, i1); // lcd.write(4) hosszu i-t jelenit meg lcd.createChar(5, o1); // lcd.write(5) hosszu o-t jelenit meg analogReference(EXTERNAL); // feszultsegreferencia a proc. 3,3V-ja Serial.begin(9600); EminL = EEPROM.read(1); // 10 fok alacsony helyiertek EminH = EEPROM.read(2); // 10 fok magas helyiertek EmaxL = EEPROM.read(3); // 350 fok alacsony helyiertek EmaxH = EEPROM.read(4); // 350 fok magas helyiertek Emin = word(EminH,EminL); Emax = word(EmaxH,EmaxL); Nmin = Emin; Nmax = Emax; digitalWrite(13,LOW); digitalWrite(A2, LOW); digitalWrite(A3, LOW); h = 0; lcd.clear(); } void loop() { h = 0; digitalWrite(11, LOW); if (digitalRead(12) == LOW) rogzites350(); if (digitalRead(10) == LOW) rogzites10(); szogmeres(); sorosolvasas(); digitalWrite(13, LOW); szog1 = szog; // beolvasott indulo antennaszog szog2 = 0; // forgas ellenorzesehez t = 0; if ((e > szog) & ((e - szog) > 8)) // ha novelni kell { //forgatas inditasa, majd ha szorul es nem forog, kiszabaditasi kiserlet digitalWrite(A3, LOW); //csokkentes kikapcs digitalWrite(A2, HIGH); //noveles bekapcs for (j=1; j<25; j++) { delay(100); // kb. 6 sec-ig forgatni probalja if (szog > (e - 3)) {digitalWrite(A2,LOW); goto befordult;} // es ha kozben elerte a celt, leall szogmeres2(); // kozben 100 ms-enkent meri a szoget if (szog > (e - 3)) {digitalWrite(A2,LOW); goto befordult;} // es ha kozben elerte a celt, leall } if((szog - szog1) < 5) //ha 6 sec alatt nem forgott 5 fokot sem, megszorult { //megprobaljuk a szorulast megszuntetni vissza-oda forgatassal digitalWrite(A2, LOW); //noveles ki delay(100); // jelfogo ez alatt biztosan elenged digitalWrite(A3, HIGH); //csokkentes be for (j=1; j<15; j++) { delay(100); // kb. 2 sec-ig masik iranyba probalja szogmeres2(); // kozben 100 ms-enkent meri a szoget szog2 = szog; // feljegyezzuk, visszaforgatas utan hol all } digitalWrite(A3, LOW); //csokkentes ki delay(100); // jelfogo ez alatt biztosan elenged digitalWrite(A2, HIGH); //noveles be for (j=1; j<25; j++) { delay(100); // kb. 7 sec-ig eredeti iranyba probalja szogmeres2(); // kozben 100 ms-enkent meri a szoget if (szog > (e - 3)) {digitalWrite(A2,LOW); goto befordult;} // es ha kozben elerte a celt (tulford. miatt -8fok), leall } szogmeres2(); if (((szog - szog2) < 6)) //ha ez utan a 7 sec utan utan sem novekedett min. 6 fokkal { //akkor hiba 1 (szorulas) van, leallunk: digitalWrite(A2, LOW); //noveles ki digitalWrite(A3, LOW); //csokkentes ki h = 1; hiba(); //hiba szubrutin hivasa } } // az ezzel bezarult esemenyek tortentek, ha nem indult meg // ha idaig eljutottunk, a forgas megindult szogmeres2(); szog2 = szog; //az eddigi mozgasok utani szogallas t = millis(); do { szogmeres2(); t1 = millis() - t; if (szog > (e - 3)) //tulfordulas miatt 8 fokkal kevesebbet { goto befordult; } if (t1 > 2000) { if (szog <(e - 5)) //meg nem közelitette meg 5 fokra { if((szog - szog2) < 4) // ha 2 sec alatt nem forudlt legalabb 4 fokot { h = 2; hiba(); // hiba (2:forgas akad) szubrutin hivasa } } t = millis(); //ha meg fordult, OK, az idomeres ujra indul szog2 = szog; // itt vagyunk, ha a forgas OK } // akkor szogmeres2(); } while (szog < (e - 3)); // addig forgasson, amig eleri a celt (tulford miatt 3 fokkal kevesebbet) befordult: //akkor viszont leall a forgatas digitalWrite(A2, LOW); //noveles ki digitalWrite(A3, LOW); //csokkentes ki digitalWrite(13, HIGH); // iranyba fordult LED }; if ((szog > e) & ((szog - e) > 8)) // ha csokkenteni kell { //forgatas inditasa, ha szorul es nem forog, kiszabaditasi kiserlet digitalWrite(A2, LOW); //noveles kikapcs digitalWrite(A3, HIGH); //csokkentes bekapcs for (j=1; j<25; j++) { delay(100); // kb. 4 sec-ig forgatni probalja if (szog < (e + 1)) {digitalWrite(A3,LOW);goto fordult;} // es ha kozben elerte a celt, leall szogmeres2(); // kozben 100 ms-enkent meri a szoget if (szog < (e + 1)) {digitalWrite(A3,LOW);goto fordult;} // es ha kozben elerte a celt, leall } if ((szog1 - szog) < 5) //ha 6 sec alatt nem forgott 5 fokot sem, megszorult { //megprobaljuk a szorulast megszuntetni vissza-oda forgatassal digitalWrite(A3, LOW); //csokkentes ki delay(100); // jelfogo ez alatt biztosan elenged digitalWrite(A2, HIGH); //noveles be for (j=1; j<15; j++) { delay(100); // kb. 3 sec-ig masik iranyba probalja szogmeres2(); // kozben 100 ms-enkent meri a szoget szog2 = szog; // visszaforgatas utani szog rogzitese } digitalWrite(A2, LOW); //noveles ki delay(100); // jelfogo ez alatt biztosan elenged digitalWrite(A3, HIGH); //csokkentes be for (j=1; j<25; j++) { delay(100); // kb. 7 sec-ig eredeti iranyba probalja szogmeres2(); // kozben 100 ms-enkent meri a szoget if (szog < (e + 1)) {digitalWrite(A3,LOW);goto fordult;} // es ha kozben elerte a celt, leall } szogmeres2(); if (((szog2 - szog) < 6)) //ha ez utan a 7 sec utan nem novekedett min. 6 fokkal { //akkor hiba 1 (szorulas) van, leallunk: digitalWrite(A2, LOW); //noveles ki digitalWrite(A3, LOW); //csokkentes ki h = 1; hiba(); //hiba szubrutin hivasa } } // az ezzel bezarult esemenyek tortentek, ha nem indult meg // ha idaig eljutottunk, a forgas megindult szogmeres2(); szog2 = szog; //az eddigi mozgasok utani szogallas t = millis(); do { szogmeres2(); t1 = millis() - t; if (szog < (e + 1)) { goto fordult; } if (t1 > 2000) { if (szog >(e + 5)) // ha nem kozelitette meg 5 fokra { if((szog2 - szog) < 4) // ha 2 sec alatt nem fordult legalabb 4 fokot { h = 2; hiba(); // hiba szubrutin hivasa } } t = millis(); //ha meg fordult, OK, az idomeres ujra indul szog2 = szog; // itt vagyunk, ha a forgas OK } // akkor szogmeres2(); } // addig forgasson, amig eleri a celt while (szog > e); // addig forgasson, amig eleri a celt fordult: //akkor viszont leall a forgatas digitalWrite(A2, LOW); //noveles ki digitalWrite(A3, LOW); //csokkentes ki digitalWrite(13, HIGH); // iranyba fordult }; if ((e - szog <8) || ((szog - e) < 8)) // ha olyan keveset kellene forgatni, hogy nem erdemes { digitalWrite(13, HIGH); } } void rogzites350() { Nmax = 0; for (int i = 1; i<51; i++) { Nmax = Nmax + analogRead(1); delay(3); } Nmax = int (Nmax / 50); EmaxH = Nmax/256; EmaxL = Nmax % 256; EEPROM.write (3, EmaxL); EEPROM.write (4, EmaxH); lcd.clear(); lcd.print("Maximum:350"); lcd.write(2); //ez a fok karakter lcd.setCursor(0,2); lcd.print("megm"); lcd.write(3); // ekezetes e karakter lcd.print("rve."); delay(2000); lcd.clear(); szogmeres2(); } void rogzites10() { Nmin = 0; for (int i = 1; i<51; i++) { Nmin = Nmin + analogRead(1); delay(3); } Nmin = int (Nmin / 50); EminH = Nmin/256; EminL = Nmin % 256; EEPROM.write (1, EminL); EEPROM.write (2, EminH); lcd.clear(); lcd.print("Minimum:10"); lcd.write(2); // ez a fok karakter lcd.setCursor(0,2); lcd.print("megm"); lcd.write(3); // ekezetes e karakter lcd.print("rve."); delay(2000); lcd.clear(); szogmeres2(); } void szogmeres() { beolv = 0; legnagyobb = analogRead(1); delay(3); i = 1; do { be = analogRead(1); delay(3); { if ((abs(legnagyobb - be)) < 10) //Helipot KH kizarasa { beolv = beolv + be; legnagyobb = be; i++; } } } while (i <= 50); beolvasott = int (beolv / 50); szog = 10+int((34000*(beolvasott-Nmin)/(Nmax-Nmin))/100); //340 fok * 100, hogy az osztas egeszet adjon if ((abs(beolvelozo - beolv)) > 75) // Ha az utoljara kiirt szoghoz tartozo es az elozo beolv. kulonbsege legalabb 2, { // akkor az LCD-re kiirjuk. Ha kisebb, az oda-vissza billeges lehet, kiiras marad lcd.setCursor(0,0); lcd.print("Antenna "); lcd.write(1); // ekezetes a lcd.print("ll:"); if (szog < 100) lcd.print(" "); if (szog < 10) lcd.print(" "); lcd.print(szog); lcd.write(2); beolvelozo = beolv; } } void szogmeres2() //billeges szures nelkul mutatja a mert szoget { beolv = 0; legnagyobb = analogRead(1); delay(3); i = 1; do { be = analogRead(1); delay(3); { if ((abs(legnagyobb - be)) < 10) //Helipot KH kizarasa { beolv = beolv + be; legnagyobb = be; i++; } } } while (i <= 50); beolvasott = int (beolv / 50); szog = 10+int((34000*(beolvasott-Nmin)/(Nmax-Nmin))/100); //340 fok * 100, hogy az osztas egeszet adjon // if ((abs(beolvelozo - beolv)) > 75) // Ha az utoljara kiirt szoghoz tartozo es az elozo beolv. kulonbsege legalabb 2, // akkor az LCD-re kiirjuk. Ha kisebb, az oda-vissza billeges lehet, kiiras marad lcd.setCursor(0,0); lcd.print("Antenna "); lcd.write(1); // ekezetes a lcd.print("ll:"); if (szog < 100) lcd.print(" "); if (szog < 10) lcd.print(" "); lcd.print(szog); lcd.write(2); beolvelozo = beolv; } void sorosolvasas() { kezdes:; do { if (Serial.available()) d = Serial.read(); szogmeres(); if (digitalRead(10) == LOW) rogzites350(); //eredmenye Nmax if (digitalRead(12) == LOW) rogzites10(); //eredmenye Nmin } while (d!=65); //'A'karakter erkezett k = millis(); do { if (Serial.available()) d = Serial.read(); m = millis(); if ((m - k) > 10) goto kezdes; //hiba: kov.kar.keson erk } while (d!=80); //'P' karakter erkezett do { if (Serial.available()) d = Serial.read(); k = millis(); if ((k - m) > 10) goto kezdes; //hiba: kov.kar.keson erk. } while (d!=49); //'1' karakter erkezett a=999; b=999; c=999; digitalWrite(13,LOW); do { if (Serial.available()) a = Serial.read()-48; m = millis(); if ((m - k) > 10) goto kezdes; //hiba: kov.kar.keson erkezett } while (a!=0 && a !=1 && a !=2 && a !=3); do { if (Serial.available()) b = Serial.read()-48; k = millis(); if ((k - m) > 10) goto kezdes; //hiba: kov.kar.k. } while (b !=0 && b !=1 && b !=2 && b !=3 && b !=4 && b !=5 && b !=6 && b !=7 && b !=8 && b !=9); do { if (Serial.available()) c = Serial.read()-48; m = millis(); if ((m - k) > 10) goto kezdes;//hiba: kov.kar.k. } while (c !=0 && c !=1 && c !=2 && c !=3 && c !=4 && c !=5 && c !=6 && c !=7 && c !=8 && c !=9); e = 100 * a + 10 * b + c; // ez a cel szog if (e < 10) e = 10; if (e > 350) e = 350; lcd.setCursor(0,2); lcd.print("Be"); lcd.write(1); // ekezetes a lcd.print("ll"); lcd.write(4); // hosszu i lcd.print("tand"); lcd.write(5); // hosszu o lcd.print(":"); if (e < 100) lcd.print(" "); if (e < 10) lcd.print(" "); lcd.print(e); lcd.write(2); } void hiba() { digitalWrite(A2, LOW); digitalWrite(A3, LOW); if (h == 0) //ez lenne a kezi megszakitas { do { szogmeres(); digitalWrite(11, HIGH); for (long k=1;k<100000;k++) {asm volatile ("nop"::);} digitalWrite(11, LOW); szogmeres(); for (long k=1;k<200000;k++) {asm volatile ("nop"::);} digitalWrite(11, HIGH); szogmeres(); for (long k=1;k<100000;k++) {asm volatile ("nop"::);} digitalWrite(11, LOW); szogmeres(); for (long k=1;k<200000;k++) {asm volatile ("nop"::);} digitalWrite(11, HIGH); szogmeres(); for (long k=1;k<100000;k++) {asm volatile ("nop"::);} digitalWrite(11, LOW); szogmeres(); for (long k=1;k<800000;k++) {asm volatile ("nop"::);} } while (1); } if (h == 1) // szorul, meg sem indult a forgas { do { digitalWrite(11, HIGH); szogmeres(); //ez kb. 160 msec, eleg, ha eddig vilagit //for (long k=1;k<100000;k++) {asm volatile ("nop"::);} digitalWrite(11, LOW); szogmeres(); for (long k=1;k<800000;k++) {asm volatile ("nop"::);} } while (1); // vegtelensegig ismetelve (RESET-ig) } if (h == 2) // akad, forgas kozben megallt do { digitalWrite(11, HIGH); szogmeres(); //ez kb. 160 msec, eleg, ha eddig vilagit //for (long k=1;k<100000;k++) {asm volatile ("nop"::);} digitalWrite(11, LOW); szogmeres(); //ez kb. 160 msec, eleg ennyi szunet //for (long k=1;k<100000;k++) {asm volatile ("nop"::);} digitalWrite(11, HIGH); szogmeres(); //ez kb. 160 msec, eleg, ha eddig vilagit //for (long k=1;k<100000;k++) {asm volatile ("nop"::);} digitalWrite(11, LOW); szogmeres(); for (long k=1;k<800000;k++) {asm volatile ("nop"::);} } while (1); // vegtelensegig ismetelve (RESET-ig) }