Repeatere
START.



Repeater 1
hardware.



Repeater 2
hardware.



Repeater 3
hardware.



Repeater 4
hardware.



Repeater 5
hardware.



Autostart
ASR PC.



Rep 3 og 4
brug.



Rep 5
brug.



Rep 3 og 4
sofware.



Repeater nostalgi.


Til www.OZ1LN.dk

Arduino repeater 3, ESBJERG 4 meter 70.5000/ 69.900 MHz, software.

Arduino repeater 4, ESBJERG 70 cm 434.9625/434.9625 MHz, software.

Programversion: Styring af analog rep 3 og 4 21-04-2022_v_1_16_L

Dette Arduino repeaterprogram bygger på de metoder som blev brugt i version 1 fra 2018.

Der er lavet et par timere mere for at kunne udføre flere nyttige funktioner.
Det er dejligt nemt at bygge timere, det kræver kun nogle få linjer kode, og der er ingen fare for
at brænde sig på loddekolben ;o)

Forklaring til programmets virkemåde.

Du kan læse det hele fra toppen og ned, eller du kan hoppe til det afsnit du vil se ved at klikke
på en af linjerne her:

Programmets historie og formål.
Hovedprogram.
millis-timere.
aliveBlink.
Input signaler.
if-ligninger 1.
SlutGenerator.
Max_TX_timer.
GenStart_Max_TX_timer.
MorseGenerator.
if-ligninger 2.
Deklaration af pins.
Deklaration af millis-variable.
Deklaration af globale variable.
Deklaration af konstanter.
setup.
Fejlfinding.
Hukommelsesforbrug.
Download af hele programmet.


Programmets historie og formål.

Allerførst i programteksten fortæller man, hvad det er for et program, hvad det kan, hvilke krav der er
til hardware, hvem der har skrevet det osv.

Linjer som begynder med // er kun til kommentarer. De bruges ikke af programmet og er kun til hjælp
og info til læseren, så det måske er nemmere at se, hvordan programmet virker.

01

Herefter beskrives programmets enkelte dele, IKKE i den rækkefølge de står i programteksten, men
sådan cirka i den rækkefølge de bliver aktive, når programmet kører.

Forklaringer til alle de kedelige deklarationer af variable mm som altid skal stå først i programmet er
gemt til sidst. Det er bare noget der skal være der, ellers virker det ikke.

Til top af siden.

Hovedprogrammet kører i en uendelig sløjfe (loop), fra programmet startes og til man stopper det.

Underprogrammerne kaldes efter hinanden, og hvis deres startbetingelser er rigtige
kører de, ellers springes der videre til den næste osv.

aLiveBlink kører altid, og det får lysdioden på NANO til at blinke.

14

Til top af siden.

millis-timere.
Programmet er bygget op med 7 timere, som gensidigt styrer hinanden.
Timerne er opbygget efter samme princip med brug af Arduino funktionen millis().

millis() er en tæller som starter når programmet startes og tæller op, 1 skridt hvert millisekund,
indtil den efter 49,7 døgn når til 4.294.967.295, og så begynder den bare forfra.
En millis()-timers virkemåde er beskrevet her:
http://www.arduino.cc/en/Tutorial/BlinkWithoutDelay

Fordelen ved denne metode er at man kan lave timere som ikke standser programafviklingen, mens
timerne venter på at tiden går.
Hvis man i stedet brugte funktionen delay() standser programafviklingen helt, når delay() starter
og begynder først igen når delay-tiden er gået.
Med funktionen delay() aflæses altså for eksempel ikke porte i hele timerens ventetid , og intet sker.

Bruger man millis() bruges der kun brøkdele af sekunder for at tjekke, og straks videre i teksten.

Til top af siden.
aliveBlink er kopi af et eksempel i Arduino lærebogen på en millis-timer.

Det eneste underprogrammet laver er at blinke med Arduinoens lysdiode, så man kan se at programmet kører.

Funktionen aflæser det tal som millis er kommet til, og gemmer det i variablen BlinkLastTime.
Ved hvert gennemløb tjekkes, om (millis()- BlinkLastTime) er blevet lig med eller større end BlinkDelay.
BlinkDelay er den tid i millisekunder, som vi ønsker tidsforsinkelsen skal være, her sat til 1000 eller 250.
Når tiden er gået skifter BlinkStatus værdi til det omvendte af hvad den lige var før, og lysdioden
tændes eller slukkes med digitalWrite(13,BlinkStatus)
Den ny værdi for millis() hentes og gemmes i BlinkLastTime, og timeren kører en tur igen, osv.

Test_input1
Til top af siden.

Input signaler.

Hvis der kommer signal på en af inputlinjerne begynder der at ske noget.

Der er 2 inputsignaler, et fra radioens modtagersquelch (input1) og et fra ASR systemet (input2).
Når der er signal på input1 eller input2 ændrer Input1_Ind eller Input2_Ind fra 0 til 1.
Det starter enten Input1_StartTimer eller Input2_StartTimer.

Disse 2 timere (tællere) virker på samme måde. Beskrivelsen her gælder derfor begge.
Den aktive timer begynder at tælle op fra 0 i spring på 100 msec (Input_Step).

Når tælleren når værdien 'Input_BounceTid' sættes flaget (Input1_OK eller Input2_OK) fra 0 til 1.
Input_BounceTid er 0.2 sekund. Dette forhindrer at korte støjpulser påvirker repeateren.

Når tælleren når værdien 'Input_StartTid' sættes flaget Rep_OK fra 0 til 1. Input_StartTid er 1 sekund.

Hvis inputsignalet forsvinder inden tælleren har nået værdierne nulstiller tælleren sig selv.

Se under "if-ligningerne" hvordan disse flag påvirker repeateren.

Test_input1
Test_input2
Til top af siden.

if-ligninger 1 bliver tjekket, hvergang den uendelige sløjfe kører en omgang.

if-ligningerne udfører forskellige funktioner, tænder og slukker for sender og lysdioder, og ændrer værdier
på de forskellige flag og variable, som igen styrer timere.

For at repeateren skal starte øjeblikkeligt når der kommer et input fra modtageren eller ASR systemet er der
lavet et par koldstarts if-linjer, se nedenfor.

HVIS ( der er et input ) OG ( flag 'TX_Stop' er nul ) OG ( flag 'Rep_OK' er 0 ) sættes ( flag 'KoldStart_OK' til 1 ).
HVIS ( flag 'KoldStart_OK' er 1 ) sendes der kommando til Nano ben 'tx_tast' om at gå høj, dvs taste senderen.

15

Senderen starter altså øjeblikkelig, selv om 'Input_StartTid' ikke er nået endnu.

Efter 'Input_StartTid' er flag 'Rep_OK' blevet sat til 1 af programmet 'Input_StartTimer'.
Det virker på den næste if-linje, som sender kommando om at taste senderen. se herunder.

De næste if linjer styrer, at der sendes tastsignal til ASR systemet, HVIS der er signal på input1 (modtageren)

16

Til top af siden.

SlutGenerator kører, når repeateren er i gang og når der IKKE modtages signal på indgangene.

Variablen 'SlutInterval' tælles op fra 0 med skridt på SlutStep (70 msec).

Hvis der kommer signal på en af indgangene bliver SlutGeneratoren nulstillet, og den begynder forfra, når
indgangssignalet forsvinder.

Tælleren udløser forskellige funktioner, afhængigt af den øjeblikkelige værdi af SlutInterval.

SlutInterval på 10 udsender et dyt, HVIS flag 'Input1_Drift' er 1.
(Flag 'Input1_Drift' er 1, hvis det seneste signal er kommet fra ASR. Dette styres af if-linjer.)

SlutInterval på 13 udsender et dyt.

SlutInterval på 15 resetter 'Max_TX_Timer', som begynder forfra.
Derved fås igen fuld taletid hvis man venter med at taste indtil dyttet på interval 13 er hørt.

SlutInterval på 50 udsender et dyt, HVIS flag 'Input1_Drift' er 1.
SlutInterval på 53 udsender et dyt.

SlutInterval på 90 sætter flag 'Morse_OK' og dette starter morsegeneratoren.
Når morsegeneratoren er færdig med kaldesignalet tælles videre.

SlutInterval på 100 nulstiller alt og repeateren går i hvile.

Slutgenerator

Afslutningen styres af et par if-ligninger, se herunder.

HVIS ('Rep_OK' er 0) OG ('KoldStart_OK') er 0 sendes kommando GÅ LAV til Nano ben 'tx-tast' og senderen slukker.

HVIS ('Rep_OK' er 0) nulstilles variablerne 'MaxInterval' og 'SlutInterval', og repeateren er slukket.

22

Til top af siden.

Max_TX_timer holder styr på max taletid 'Max_TX_tid', som er valgt til 300 sekunder.
MaxInterval tælles op med 1, hver gang der er gået tiden 'MaxStep' (1000 mS)

Tælleren nulstilles, hvis SlutGenerator() når værdien 15 (15*70 mSec), og det vil sige at man har holdt
en skiftepause og har hørt et dyt. (se forklaringen til SlutGenerator)

Derved får man fornyet taletid, og andre har mulighed for at komme ind i skiftepauserne.

Hvis der tales uafbrudt uden pauser vil tælleren nå til værdien 'Max_TX_tid', og derefter udsendes 6 dyt med
3 forskellige toner, derefter et eller to dyt, og til slut et eller to dyt.

På værdi 'Max_TX_tid' + 14 sekunder sættes 'TX_Stop' til 1, repeaterens sender slukkes, og timerne nulstilles.

Max_Timer

Den endelige lukning styres af et par if-ligninger, se herunder.

HVIS ('TX_stop' er 1) sættes 'tx_tast' og 'tast_til_ts3' LOW og begge tasteledninger er lukket.

'TX_Stop = 1' nulstiller MaxInterval og SlutInterval, og mange af underprogrammerne låses.

24

Når det er kommet hertil er der kun 1 ting der kan få repeateren på benene igen : HOLD EN PAUSE.

Det klarer GenStart_Max_TX_timer.

Til top af siden.

GenStart_Max_TX_timer

Timeren er kun aktiv når taletiden er overskredet (TX_Stop lig med 1)

'GenStart_Interval' tælles op med 'GenStartStep' (1000 mSec), men 'GenStart_Interval' holdes nulstillet, hvis
der er signal på repeaterens modtager eller fra ASR systemet.

Når indgangene er fri (ingen sender) og 'GenStartInterval' derfor ikke længere er blokeret kører tælleren.
Når GenStart_TX_tid (3*1000 mS) er gået sættes TX_Stop til nul.

Senderen starter, der høres et par dyt og eventuelt morse kaldesignal, og repeateren er åben igen.

Der kan tales når man har hørt det første dyt.

GenStart1

En if-ligning styrer blokeringen, indtil der ikke er signal på indgangene. Se herunder.

HVIS ('Input2_OK' er 1) ELLER ('Input1_OK' er 1) nulstilles 'GenStartInterval' og 'SlutInterval'.

23

Til top af siden.

MorseGenerator kører kun når variablen Morse_OK er lig med 1.

Morse_OK sættes til 1 af SlutGenerator(), lige før repeateren lukkes efter en samtale.
MorseInterval tælles op med 1, hver gang tiden SlutStep er gået.

SlutStep er valgt til 70 mSec, det giver en passende morsetakt.
Når MorseInterval når de forskellige værdier udsendes toner, som tilsammen danner kaldesignalet.

Der bruges funktionen tone(), hvor 1. parameter angiver outputpin, 2. parameter tonens frekvens i Hz
og 3. parameter tonens længde i millisekunder.

Når MorseInterval når det højeste tal sættes Morse_OK til 0, og den resetter sig selv.

Morse

Hvis morsegeneratoren er i gang, og der kommer signal fra modtageren eller ASR systemet stoppes morse straks.
Det sørger et par if-ligninger for, se herunder.

19

Til top af siden.

if-ligninger 2

Der er lige et par if-ligninger tilbage.

Lysdioden på Nano blinker, styret af det lille underprogram 'aLiveBlink'

Når repeateren er i hvile blinkes langsomt med en forsinkelse på 1000 millisekunder.
Når repeateren er i hvile blinkes hurtigt med en forsinkelse på 250 millisekunder.
Forsinkelsen styres af en if-ligning. Se herunder.

20

Antal pausedyt er forskellige, afhængigt af om det seneste signal kom fra modtageren eller fra ASR systemet.

Derved kan radiobrugere høre om det seneste signal kom fra den repeater man selv bruger (1 kort dyt) eller
fra ASR systemet (2 korte dyt). Og hvorfor så lave det? Fordi man kan.

Resultatet gemmes i et flag 'Input1_Drift'. Flaget tænder en LED hvis seneste input er fra ASR systemet.
Flaget bruges i 'SlutGenerator' til at aktivere et ekstra dyt. Se forklaringen om SlutGenerator.

Flaget nulstilles, når repeateren går i hvile. Se herunder.

21

Til top af siden.

Her kommer så alt de kedelige, som man er nødt til at have.

Det står først i programteksten, fordi det er vigtige ting som programmet skal have at vide,
for at det overhovedet kan køre ....

Deklaration af pins

Benene på NANO kan forsynes med navne, så det bliver nemmere at finde rundt i teksten.

const int betyder at det er hel-tal, som ikke kan ændres mens programmet kører.

pins
Til top af siden.

Deklaration af millis-variable

De variable til millis()-tællerne kan få meget store værdier, og typen er derfor valgt
til unsigned long, som er positivtal på op til 4.294.967.295.
Nederst i listen int (heltalsvariabel) og boolean (logisk 0-1) variable.

Millis var
Til top af siden.

Deklaration af globale variable

Her deklareres FLAG, som styrer forskellige funktioner. De kan kun have værdien 0 eller 1.

Globale
Til top af siden.

Deklaration af konstanter

Konstanter er heltal, som ikke ændres mens programmet kører.
De er nyttige hvis man lige har behov for at ændre en værdi, og dermed kan nøjes med at ændre
det her, og ikke de måske mange steder i programmet hvor værdien bruges.

konstanter
Til top af siden.

setup angiver startværdier, og gennemløbes kun 1 gang, i opstarten af programmet.

Her fastsættes blandt andet, hvad benene på NANO bruges til, INPUT, INPUT_PULLUP eller OUTPUT.
PULLUP tænder for en indbygget pull-up-modstand, så man sparer en udvendig komponent.

digitalWrite-sætninger sætter startværdi for output-ben.

Øverst i billedet er der en udblanket linje : Serial.begin(9600).
Den kan aktiveres ved at fjerne //, og der åbnes for visning af programværdier på skærmen, mens
programmet kører. Se forklaringen i afsnittet "Til fejlfinding" herunder.

Setup

Til top af siden.

Til fejlfinding kan man bruge 'serial.print' linjerne til at få en oversigt på skærmen.
De skal gøres aktive, ved at fjerne //, og linjen 'Serial.begin' i 'setup' skal gøres aktiv.
De skal alle være inaktive under normaldrift, fordi de nedsætter programmets hastighed og dermed også morse.

monitor

Til top af siden.

Hukommelsesforbrug.

Når programmeret compileres får man en oversigt over hvor meget hukommelse programmet bruger, se herunder.
Der er stadig lidt plads til forbedringer og udvidelser, hvis nødvendigt ;o)

hukommelse

Til top af siden.

Download af hele programmet: styring_af_analog_rep_3_og_4_asr_v_1_16_Q

Har du oplysninger eller kommentarer til dette er du meget velkommen til at kontakte mig :
OZ1LN(prik)Lasse(snabel-a)gmail(prik)com

Til top af siden.

Valid HTML 4.01 Transitional