/********************************************************************* * PROGRAM TIL MAGNETIC LOOP CONTROLLER * * august 2015 * * OZ1OP version 23 * *********************************************************************/ /*MAG-LOOP ANTENESYSTEM BESTÅR AF: * MAG-LOOP ANTENNE * ANTENNEBOKS * ANTENNEROTOR * ANTENNESENSOR * CONTROLLERBOKS * ROTORKONTROLER * STRØMFORSYNING * * ANTENNE: * Magnetic loop antenne. 22 mm kobberrør. Diameter 140 cm. * Koblingssloejfe: koax faradaysloejfe. * * ANTENNEBOKS: * split kondensator 7-40pF * microswich aktiveres af steppermotorakslen * steppermotor * steppermotordrive: SparkFun (r), * * CONTROLLERBOKS: * Arduino uno microcontroller * lcd skaerm, 4 linier 20 karakterer * encoder med tryk-kontakt * 2 kontakter * antennesensor * * FORBINDELSE TIL MAG-LOOP ANGTENNESYSTEMET * antennesignal: coax low-loss kabel * power og styresignaler til antenneboks: 6 leder kabel * power og styresignaler til rotor: 3 lederkabel. * * ROTOR: * mag-loop antennen er opsat paa en rotor. * unerkantan af antennen er 2 meter over jorden */ /*SYSTEMET HAR FOELGENDE FUNKTIONALITETER: * *Ved opstart sættes kondensatoren altid i stilling minimum capacitet. *kontakt "on/off" aktiviverer/deaktiverer motordrive. *kontakt "coarse/fine" aendrer virkningsgraden af encoder-knappen *encoder-knappen drejer kondensatoren *ved hjaelp af tilsluttet antennesensor vises: forward power, reflekteret power og SWR *ved tryk på encoderknapen aktiveres en automatisk tuning-proces * * *LCD SKAERM VISER:: * *linie 0: advarsel ved hoej effekt/advarsel ved lav effekt *linie 1: tuning. Bedst opnået SWR. pos af cond. efter sidste tuning *linie 2: position af kondensatoren (0-800)/ SWR *linie 3: forward power i watt. reflekteret power i watt */ /* *ARDUINOBOARD FORBINDELSER *14 (=A00): Mode: digital in. kontakt coarse/fin. stilling 'fine' --> pin LOW *15 (=A01): Mode: digital in. kontakt enable: on/of stilling 'off' --> pin LOW *19 (=A05): encoderkontakt stilling 'nedtrykket' --> lin LOW *A02: mode analog in: antennesensor reflekteret pwr *A03: mode analog in: antennesensor forward pwr *0: *1: *2: mode digital in: encoder *3: mode: digital out. motordrive. step *4: mode digital in. encoder *5: mode digital out. motordrive. dir *6: mode digital in. Micre swich på driver aksel til kondensator. kontakt aktiveret --> pin LOW *7, 8.9.10.11.12: CD display *13:mode digital out. enable pin på motordrive */ //PROGRAMSTART: //********************************************************************************* //INKLUDEREDE BIBLIOTEKER****INKLUDEREDE BIBLIOTEKER****INKLUDEREDE BIBLIOTEKER**** //********************************************************************************* //include encoder #include Encoder encoder(2,4); //--------------------------------------------------------------------------------- //include LCD #include LiquidCrystal lcd(12, 11, 10, 9, 8, 7); //--------------------------------------------------------------------------------- //include accelstepper #include AccelStepper Cstepper(1,3,5); //********************************************************************************* //VARIABLE****VARIABLE****VARIABLE****VARIABLE****VARIABLE****VARIABLE************* //********************************************************************************* //konstanter----------------------------------------------------------------------- const int maxStepper =800; //stepper drejer fra 0 (=miimum capacitet) til -800 (=maximum capacitet) const int minStepper= 0; //flags---------------------------------------------------------------------------- boolean enable = true; //enable: motordriveren er aktiv boolean grovFin = true; //true: Corse/fine kontakt staar paa stiling: fine boolean tune=HIGH; //HIGH: tuning er aktiveret boolean tuneSucces = false; //true: tuning er gennemført med succes boolean atuProgress=false; //true: tuning er igang //variable------------------------------------------------------------------------- long int encoderPos=0; //global encoder position long int oldEncoderPos=0; long int Cpos =0; //global position af stepperen long int i=0; long int time=0; int encoderStep=0; //antal step encoderen har drejet sig int indexEncoder=8; //omsætningsfaktor fra encoder til stepper. (8 svarer til at 1 trin på encoderen svarer til 8 trin på stepperen) //indexEncoder updateres af kontakten; coarse/fine float SWR = 0; //udregnes fra ePwrFwd og ePwrRef float ePwrFwd =0; //målt spænding fra antennesensor, Forward float ePwrRef =0; //målt spænding fra antennesensor, Reflekteret float wr=0; //effekt reflekteret. udregnes fra ePwrRef float wf=0; //effekt forward. udregnes fra ePwrFwd float SWRok=1.2; //graense for SWR ved aut tuning //*********************************************************************************** //PINDEF****PINDEF****PINDEF****PINDEF****PINDEF****PINDEF****PINDEF****PINDEF******* //*********************************************************************************** const int pwrRefPin =2; //mode: analog input: updateres af antennesensor, ref pwr const int pwrFwdPin= 3; //mode: analog input: updateres af antennesensor, fwd pwr const int akselKontaktPin = 6; //mode: dig input: opdateres af mikroswich på kondensatoraksel const int enablePin = 13; //mode: dig output: sætter motordriveren enable const int grovFinKontaktPin = 14; //mode: dig input: updateres af corse(fine kontaten const int enableKontaktPin = 15; //mode: dig input: updateres af on/off kontakten const int encoderKontaktPin = 19; //mode: dig input: updateres ved tryk på encoderknappen //*********************************************************************************** //SETUP****SETUP****SETUP****SETUP****SETUP****SETUP****SETUP****SETUP*************** //*********************************************************************************** void setup() { //----------------------------------------------------------------------------------- // PIN MODE pinMode(enablePin,OUTPUT); pinMode(akselKontaktPin, INPUT_PULLUP); pinMode(grovFinKontaktPin, INPUT_PULLUP); pinMode(enableKontaktPin, INPUT_PULLUP); pinMode(enablePin,OUTPUT); //pinMode(pwrFwdPin,INPUT); //pinMode(pwrRefPin,INPUT); pinMode(encoderKontaktPin,INPUT_PULLUP); //----------------------------------------------------------------------------------- //SETUP ACCELSTEPPER Cstepper.setMaxSpeed(1000); Cstepper.setSpeed(1000); //----------------------------------------------------------------------------------- //SETUP LCD lcd.begin(20, 4); //----------------------------------------------------------------------------------- // SETUP SERIAL Serial.begin(9600); Serial.println("Magnetic Loop antenna Controller"); //----------------------------------------------------------------------------------- //VELKOMST LCD lcd.setCursor(0,0); lcd.print("Mag Loop Controler"); lcd.setCursor(0,1); lcd.print("version 23"); lcd.setCursor(0,2); lcd.print("OZ1OP - 2015"); lcd.setCursor(0,3); lcd.print(" "); delay(4000); //------------------------------------------------------------------------------------ //INITIALISERING nulstilKond(); clearLCD(); } //************************************************************************************ //LOOP****LOOP****LOOP****LOOP****LOOP****LOOP****LOOP****LOOP****LOOP**************** //************************************************************************************ void loop() { laesEnableKontakt(); laesGrovFinKontakt(); laesEncoderKontaktPin(); laesEncoder(); updatCstepper(); laesSWR(); updatLcd(); } //************************************************************************************ //FUNKTIONER****FUNKTIONER****FUNKTIONER****FUNKTIONER****FUNKTIONER****************** //************************************************************************************ //------------------------------------------------------------------------------------ void nulstilKond() //kondensatoren drejes i neg retning indlil mikroswich aktiveres. { lcd.setCursor(0,1); lcd.print("Initialiserer "); lcd.setCursor(0,2); lcd.print("Cpos: "); lcd.setCursor(0,3); lcd.print(" "); digitalWrite(enablePin,HIGH); Cstepper.setCurrentPosition(0); Cstepper.moveTo(-10000); Cstepper.setSpeed(300); while(Cstepper.distanceToGo()!=0){ Cstepper.runSpeedToPosition(); if(digitalRead(akselKontaktPin)==LOW){break;} lcd.setCursor(6,2); lcd.print(Cstepper.currentPosition()); lcd.print(" ");} Cstepper.setCurrentPosition(0); //------stepperen har aktiveret mikroswich. //Drejer nu tilbage til minimum capacitet. stepperPos sættes til 0. Cstepper.moveTo(90); Cstepper.setSpeed(300); while(Cstepper.distanceToGo()!=0){ Cstepper.runSpeedToPosition(); lcd.setCursor(6,2); lcd.print(Cstepper.currentPosition()); lcd.print(" "); } Cstepper.setCurrentPosition(0); digitalWrite(enablePin,LOW); } //------------------------------------------------------------------------------------- void laesEncoder() //encoderen aflæses. 'encoderStep' opdateres med antal skridt encoderen er drejet. { encoderPos = encoder.read(); encoderPos=encoderPos/4; if (encoderPos != oldEncoderPos) { encoderStep=encoderPos-oldEncoderPos; oldEncoderPos = encoderPos; encoderStep=encoderStep*indexEncoder; } } //-------------------------------------------------------------------------------------- void updatLcd() { //updat linie 0...................................................... if(tuneSucces==true){ lcd.setCursor(0,0); lcd.print("ATU: succes"); } if(tuneSucces==false){ lcd.setCursor(0,0); lcd.print("ATU n/a "); } if (SWR>2){ lcd.setCursor(12,0); lcd.print("SWR"); } else{ lcd.setCursor(12,0); lcd.print("---"); } if(wf>90){ lcd.setCursor(17,0); lcd.print("PWR"); } else{ lcd.setCursor(17,0); lcd.print("---"); } //updat linie 1............................................................. if(atuProgress==true){ lcd.setCursor(10,1); lcd.print("ATU "); } if(atuProgress==false){ lcd.setCursor(10,1); lcd.print("operate ");} if(enable==false){ lcd.setCursor(0,1); lcd.print("motor off "); } if(enable==true){ lcd.setCursor(0,1); lcd.print("motor on "); } //updat linie 2.......................................................................... lcd.setCursor(0,2); lcd.print("Cpos"); lcd.setCursor(6,2); lcd.print(Cstepper.currentPosition()); lcd.print(" "); lcd.setCursor(11,2); lcd.print("0-800 "); // updat linie 3................................................... lcd.setCursor(0,3); lcd.print("PF:"); lcd.print(int(wf)); lcd.print(" "); lcd.setCursor(6,3); lcd.print("PR:"); lcd.print(int(wr)); lcd.print(" "); if(SWR>=2){lcd.setCursor(10,3); lcd.print(" SWR "); lcd.print(SWR);} if(SWR<1.5){lcd.setCursor(10,3); lcd.print(" *** "); lcd.print(SWR);} if(ePwrFwd<20){ lcd.setCursor(11,3); lcd.print(" SWR n/a "); } } //---------------------------------------------------------------------------- void updatCstepper() { int nyPos; if(enable==true){ Cpos=Cstepper.currentPosition(); nyPos=Cpos+encoderStep; if (nyPos>=maxStepper){nyPos=maxStepper;} if (nyPos<=minStepper){nyPos=minStepper;} Cstepper.moveTo(nyPos); Cstepper.setSpeed(400); while(Cstepper.distanceToGo()!=0){ Cstepper.runSpeedToPosition(); } encoderStep=0; Cpos=Cstepper.currentPosition(); } } //---------------------------------------------------------------------------- void laesSWR(){ ePwrFwd=0; ePwrRef=0; ePwrFwd=analogRead(pwrFwdPin); ePwrRef=analogRead(pwrRefPin); SWR=(ePwrFwd+ePwrRef)/(ePwrFwd-ePwrRef); wf=ePwrFwd*ePwrFwd/2000; wr=ePwrRef*ePwrRef/2000; } //----------------------------------------------------------------------------- void laesEnableKontakt(){ enable=digitalRead(enableKontaktPin); if (enable==true){digitalWrite(enablePin,HIGH);} if(enable==false){digitalWrite(enablePin,LOW);} } //----------------------------------------------------------------------------- void laesGrovFinKontakt(){ grovFin=digitalRead(grovFinKontaktPin); if(grovFin==true){indexEncoder=10;} if(grovFin==false){indexEncoder=1;} } //----------------------------------------------------------------------------- void laesEncoderKontaktPin(){ tune=digitalRead(encoderKontaktPin); if(tune==LOW){ time = millis(); while (time + 5000 > millis()){ lcd.setCursor(0,1); lcd.print("ATU avail."); laesSWR(); if (wf<5){ lcd.setCursor(10,1); lcd.print("low signal"); tuneSucces=false; } if (wf>=5&&wf<=20){ lcd.setCursor(10,1); lcd.print("ok signal "); tuning(); break; } if (wf>20){ lcd.setCursor(10,1); lcd.print("sig HIGH !"); tuneSucces=false; } } clearLCD(); } } //--------------------------------------------------------------------------- void tuning() //Automatisk tunings proces: { int long nyPos; tuneSucces==false; /*1.trin.................................................................................... * kondensator drejes -70. Hvis tuning er succes, sættes flag og program returneres til Void Loop * ved manglende succes fortsættes til trin 2 */ Cpos=Cstepper.currentPosition(); nyPos=Cstepper.currentPosition(); nyPos=nyPos-70; if (nyPos<=0){nyPos=0;} digitalWrite(enablePin,HIGH); //motordrive saettes i enable enable=true; for (i=Cpos;i>nyPos;i--){ //tuning starter atuProgress=true; //flag atuProgress sættes true og anvendes af LcdUpdat Cstepper.moveTo(i); Cstepper.setSpeed(500); while(Cstepper.distanceToGo()!=0){ Cstepper.runSpeedToPosition(); } Cpos=Cstepper.currentPosition(); laesSWR(); updatLcd(); if (SWR=800){nyPos=800;} for (i=Cpos;i