Teknologiaktiviteter for barn 10-12 år

 51 total views,  1 views today

Basert på erfaringer fra en sommerleir for barn, her er noen idéer til aktiviteter for barn knyttet til teknologi og koding.

Anders Fongen, 2025

Innledning

Undertegnede (heretter betegnet “jeg”) deltok på KFUM-KFUKs sommerleir på Knattholmen 23-27 juni 2025, med oppdraget med å lage en “teknologi-aktivitet” over 3 dager x 5 timer. Aldersgruppen for denne leiren er 9-12 år.

8 deltakere hadde meldt seg på aktiviteten, fra dag 2 var det 7 deltakere i gruppen. Vi var to instruktører for gruppen: 

nr.1 (meg) har 20 års erfaring med IKT-undervisning på høgskolenivå, men har liten erfaring med barn i denne aldergruppen.

nr.2 er pensjonert grunnskolelærer med mye erfaring med aldersgruppen, ingen spesiell kompetanse innen IKT.

Målsetning og pedagogisk grunntanke

  • Viktigst: Magi, lek
  • Litt viktig: Kunnskap, innsikt, ferdigheter
  • Deltagelse, ikke beskuelse
  • Utendørs aktivitet om været tillater det

Den opprinnelige listen over “læringsmål” var:

  • Grunnleggende lodding av elektronikk
  • Forstå energiformer og -overganger (optisk, kinetisk, kjemisk, elektromagnetisk)
  • Beherske sambandsdisiplin og -protkoller
  • Beherske enkel bruk av multimeter
  • Gjennom eksperimenter, forstå forskjellen mellom likespenning og vekselspenning
  • Forstå og beherske sammenkopling av en solcelleanlegg
  • Forstå prinsippene ved satellittkommunikasjon
  • Beherske enkel bruk av morsesignaler
  • Tilegne seg (økte) programmeringsferdigheter i Micro:Bit og Scratch

Aktiviteter med sterkt veiledningsbehov er vanskelig å gjennomføre med kun én instruktør med IKT-faglig kompetanse. Noen aktiviteter ble derfor ikke gjennomført av denne grunn. Se eget avsnitt som utdyper dette.

Beskrivelse av aktivitetene

Her følger en mer detaljert beskrivelse av de aktivitetene som ble gjennomført over de tre dagene som var til rådighet.

Generelle observasjoner fra gjennomføringen

  • Aldersgruppen 9-12 år har kort “attention span”, og forklaringer og instrukser i forkant av aktiviteter “nådde ikke” helt frem. I den grad gruppen var samlet var det enklere å gi slike forklaringer etterhvert som behovet oppsto.
  • Naturfagkunnskapene er minimale i den aldersgruppen, og elementære begreper som elektroner, magnetisme, energiformer måte forklares fra bunnen av. 
  • Digital avlesning i måleinstrumenter var barna fortolig med, men analog avlesning (galvanometer, kompass) ga bedre forståelse av resulatverdiene (mye/lite, større/mindre, fort/langsomt). Et analogt oscilloskop på lav sweep-hastighet gir bedre forståelse av vekselspenning, fordi tidsaksen kunne oberveres direkte.

Rommet som vi disponerte

Til denne aktivitetsgruppen disponerte vi salen kalt “Svenner”, som var ca. 80 kvm med løse bord og stoler. Rommet hadde en veranda, denne ble brukt til å etablere antenner for HF- og VHF-frekvensbåndet. Verandaen ble også brukt til å sette opp et solcelleanlegg.

Ulike bord i salen ble brukt til diverse akitivteter: To bord for elektronikk-eksperimenter, ett bord til radiostasjon (basert på en Yaesu FT-897 transceiver), ett bord for PCer, tiltenkt programmering av Micro:Bit og Scratch, ett bord for å bygge morsenøkler.

Rommet kunne avlåses utenom aktivitetstiden, noe som var nødvendig fordi deltakerne hadde med egne laptop’er, og utstyret forøvrig var verdifullt.

Omtale av hver enkelt aktivitet

Gjennomførte aktiviteter var:

Gjemsel med sambandsradioer

For å trene deltakerne i bruk av sambandsradioer for å løse en konkret oppgave, ble de utstyrt med en lisensfri håndholdt UHF-radio for bruk i PMR-frekvensområdet (446 MHz). De ble så delt opp i par, og ett par skulle gjemme seg et sted på leirområdet. De andre tre parene skulle så bruke radiosambandet til å smarbeide om å lete etter dem. Regelen var at paret som gjemte seg, måtte svare på anrop og spørsmål om hva de kunne se fra gjemmestedet: “Kan du se parkeringsplassen? Kan du se kapellet?”. Alle parene fikk etter tur lov til å gjemme seg, og i alt gjorde vi denne leken tre ganger. Været var fint og innbød til utendørsaktiviteter fremfor å sitte inne på laboratoriet vårt. Aktiviteten vakte litt hyggelig oppmerksomhet blant leirdeltakerne forøvrig, der barna sprang rundt i terrenget med sambandsradioene og pratet. 

Deltakerne brukte en stund på å motstå fristelsen til å lage tullelyder på sambandet, og etter hvert vokste det frem en forståelse for hvordan sambandet kunne utnyttes bedre, og hvordan letingen etter hvert ble mer planmessig. 

Bygge morsenøkkel og trene morsesignaler

Basert på et byggesett utviklet og produsert av Torbjørn Skauli (kallesignal LA4ZCA) fikk deltakerne anledning til å bygge sin egen 3d-printede morsenøkkel. Byggeveiledningen var tydelig og instruktiv, og byggingen tok i snitt ca 30 minutter. Som bildet viser er morsenøkkelen plassert på en plate sammen med batteri og en “buzzer” med det formål å trene morsesignaler uten tilkoplet radio. Med en enkel modifikasjon kan nøkkelen også benyttes på en radiosender. Én enkel sammenkopling skjer med å vikle to ledninger sammen, noe som fort kan løsne. Derfor gikk jeg over alle morsenøklene i ettertid og loddet denne koplingen.

For trening av morsesignaler hadde jeg i tankene å bruke sambandsradioene sammen med morsenøklene og sende morsesignaler med radioenes FM-modulasjon (såkalt “modulated CW”). På denne måten kunne deltakerne trene morsesignaler seg i mellom utenfor synsrekkevidde. Det som viste seg var derimot at tonen fra “buzzeren” var for lys (høy frekvens) til å overføres over radiosambandet.

Treningen på morsesignalering skjedde derfor ved at noen av deltakerne satt sammen med meg og vi brukte en morsenøkkel til å lytte og sende. INGEN TABELL OVER MORSETEGNENE BLE DELT UT. Vi drillet på bokstaver som f.eks. hadde 1-5 prikker (E,I,S,H,5) og streker (T,M,O,0), og sende morsenøkkelen rundt så alle fikk drill på rytme og signalvarighet. Videre drillet vi på bokstaver som har nærliggende morsetegn (F,L) (Y,Q) (B,D,6) (U,V,4) og økte gradvis alfabetet som deltakerne kunne skille mellom kun ved lytting.

Jeg var overrasket hvor konsentrert deltakerne i den aktuelle alderen (10-12 år) var i denne drillingen, og hvor raskt de tilegnet seg deler av morsealfabetet kun ved lytting. Jeg føler meg nokså sikker på at de på kort tid kunne tilegnet seg ferdigheter til en morsesamtale på lav hastighet.

Grunnleggende eksperimenter innen elektronikk, elektromagnetisme og energiformer

Jeg hadde forberedt noen enkle eksperimenter for at deltakerne skal erfare:

  • Likestrømmens retning, pluss- og minuspoler. Måling med multimeter
  • Galvaniske elementer (“potetbatteri”, sink-kobber-saltvann)
  • Elektrisk generert magnetfelt
  • Prinsippet med dynamo/elektromotor
  • Vekselstrøm, vist med lysdioder, signalgenerator og oscilloskop
  • Oppkopling og måling på solcellanlegg (inkl. ladekontroller og batteri)

På det ellers nedsnakkede nettstedet Temu.com kan man anskaffe en del materiell knyttet til realfagsundervisning. Jeg kjøpte en del materiell derfra, billig og av dårlig kvalitet:

  • En enkel elektromotor for å vise hvordan elektromagnetisme kan omsette elektrisk energi til kinetisk, og hvordan rotasjonsretningen bestemmes av strømmens retning.
  • En dynamo koplet til en LED og drevete av en sveiv med utveksling, for å demonstrere motsatt energiovergang, men som også fungerte som elektromotor. 
  • Et lite kar med tre rom og seriekoplet med elektroder i sink og  kobber. Ble brukt til å konstruere et galvanisk element med tilstrekkelig strøm til å drive en LED.

Også noen hjemmelagde komponenter ble brukt:

  • En krets med tre motstander i serie. Sammen med et voltmeter brukt til å demonstrere spenningsfordeling i en likestrømskrets.
  • En krets med to LED koplet i motsatt retning. Ved påført likespenning indikerte LEDene strømmens retning.

Eksperimentene som ble utført kan sammenfattes slik:

  • Skifte batteriene på en lommelykt, plassere dem med riktig polaritet
  • Bruke multimeter for å finne det defekte batteriet blant flere
  • Sette 9 volt batteri mot stålull og se at det antennes
  • Bruke multimeter for å avlese motstandsverdier i en krets av seriekoplede motstander (for å erfare hvordan de adderes)
  • Sette likespenning på motstandskretsen og måle hvordan spenningsverdien fordeler seg over motstandene. Deler så spenningsverdien på mostandsverdien for gi “et hint” om Ohms lov.
  • Dytte en sink- og en kobberbit i en potet og måle spenningsforskjellen. Gjenta med å bruke håndflatene og et kar med saltvann.
  • Sette spenning på en spole som er viklet rundt et kompass og observere at kompassnålen snur seg.
  • Kople et batteri til en elektromotor og observere at den roterer. Bytt polaritet og observere at motoren reverserer.
  • Kople en LED til en dynamo med sveiv og observere at lampen lyser når man sveiver. Vis også at LED ikke lyser ved omvendt polaritet på spenningen. Kople så dynamoen til et batteri og observere at den også er en elektromotor. 
  • Kople et batteri til kretsen med to LEDer i motsatt retning. Lampen som lyser viser strømmens retning. Snu polariteten og se at den andre lampen lyser.
  • Kople denne kretsen til en signalgenerator ved lav utgangsfrekvens, og studer hvordan LED-lampene lyser vekselvis i takt med signalet, og hvordan sinus- og firkanbølger viser ulike lysmønstre.
  • Øke signalfrekvensen slik at begge LED-lampene tilsynelatende lyser hele tiden. Bestem frekvensen da dette fenomenet inntrer. Bruk så et digitalkamera med kort lukkertid og ta et bilde av lampene, for å vise at kun én av dem lyser til enhver tid.  
  • Kople signalgeneratoren til en høyttaler og bestem den høyeste og laveste frekvensen som øret kan oppfatte. Her kan man også sammenligne hørselen til en ung deltaker og en voksen instruktør.
  • Kople signalgeneratoren til et oscilloskop, med laveste frekvens og lavest mulig sweep-rate. Da fremstår signalet som en enkelt prikk på skjermen som svinger vertikalt. Ved å øke både frekvens og sweep-rate vil etterhvert de kjente bølgemønstrene danne seg på oscilloskopet. Når forståelsen av den horisontale tidsdimensjonen er etablert, er det også lettere å diskutere ulike bølgemønstre (sinus vs. firkant).
  • Kople signalgeneratoren til en uskjermet ledning og sett frekvensen i MHz-området. Lytt etter dette signalet i en radio med SSB-modus. Etablerer forståelse av at et radiosignal er intet annet enn et vekselstrømssignal.
  • Kople opp et solcelleanlegg med panel, ladekontroller og batteri. Kople på en last, f.eks. en radiostasjon. Sett inn et “toveis” amperemeter i batterikretsen for å se når batteriet tappes og når det lades. Viser hvor stor forskjell i ladestrøm det er på sollys og skygge.

Bruk av radiosamband på amatørbåndene

Det ble satt opp en komplett HF/VHF radiostasjon i aktivitetsrommet (basert på en Yaesu FT-897 transceiver) for å demonstrere og øve på radiobruk utover det interne radiosambandet omtalt tidligere.

Deltakerne brukte mitt kallesignal (LA6UIA) for å gjennomføre oppkall (i henhold til § 9 i “Forskrift om radioamatørlisens”). Siden deltakerne ikke hadde tilstrekkelig engelskkunnskaper til en internasjonal forbindelse ble det gjort oppkall via norske repeatere på VHF-båndet. Deltakerne fikk hyggelig svar på oppkall, og alle fikk anledning til å bruke radiostasjonen for å presentere seg og øve på god mikrofonbruk. De var veldig fornøyd og inspirert etter denne aktiviteten.

Navigasjon etter GPS-signaler

Leirstedet er omgitt av et skogholt egnet for “skattejakt”. Jeg hang opp refleksbrikker langs en spasertur i skogen på ca 1,5 km. Den nøyaktige GPS-posisjonen ved hver brikke ble notert og publisert på flipover i aktivitetsrommet.

Deltakerne ble delt inn i par, utstyrt med gamle android-baserte mobiltelefoner (de fikk ikke ha sine egne telefoner i aktivitetstiden) med app’en “GPS Test Plus”. I denne app’en kan GPS-posisjoner legges inn som waypoints, og siden navigere til disse. Appen viser ikke kartinformasjon, kun retning og avstand til målet. Målet med aktiviteten var å lære hvordan posisjonsdata (lengde- og breddegrad) beskriver et punkt på jordoverflaten, og at det er mulig å regne ut retning og avstand til en posisjon fra eget ståsted.

Deltakerne skrev inn posisjonene til alle refleksbrikkene (jeg kontrollerte at de var korrekte) inn i appen, deretter sendt ut i to par for å finne brikkene i terrenget. De to parene ble sendt ut i motsatt retning for at de ikke skulle dilte etter hverandre. Til turen ble de også utstyrt med sambandsradio i tilfelle de skulle trenge hjelp underveis.

Skogsterrenget har kystpreg med mye kratt, og deltakerne ville ikke fullføre oppgaven ved å følge retningen i en rett linje. De måtte derfor “lese” terrenget i tillegg til å avlese GPS-appen. Alle deltakerne fullførte oppdraget og var ved godt mot. 

Aktiviteter som var planlagt, men ikke gjennomført

En del planlagte aktiviteter ble planlagt, men ikke gjennomført. Her er en kort begrunnelse hvorfor:

Lodding

Det finnes byggesett for elektroniske kretser som egner seg for nybegynnere. De er billige og finnes på de vanlige Internett-butikkene (Aliexpress, Banggood). Loddebolter var tatt med sammen med diverse verktøy. Lodding ble allikevel ikke gjennomført fordi:

  1. Aktivitetsrommet var nyoppusset og jeg ønsket ikke svimerker på bordene. Jeg ville trengt plater eller gamle bord for formålet for dekke dem, noe som ikke var mulig å finne.
  2. Opplæring i lodding krever mye oppmerksomhet fra instruktøren, og med 8 deltakere vurderte jeg det som ugjennomførbart.
  3. Ganske mye tid, kanskje mer enn en full dag, ville vært nødvendig for gjennomføringen, og ville fortrengt andre aktiviteter.
  4. Selv for enkle kretser er sjansen stor for mislykket konstruksjon og en krets som ikke virker. Dårlig erfaring for en deltaker.
  5. En loddestasjon krever mye mer verktøy enn bare en loddebolt, noe som ikke var tilgjengelig. Mye verktøy måtte gå på omgang.

Programmering/koding

Jeg hadde skaffet et tilstrekkelig antall PCer for å kunne gjennomføre programmering på Micro:Bit og med Scratch. Når dette ikke ble gjennomført etter planen skyldtes det disse faktorene:

  1. Deltakerne hadde sterk trang til å game når de fikk anledning til å bruke PC, noe som ikke var ønskelig.
  2. Deltakerne hadde varierende ferdigheter og erfaring med programmering, så de ville trengt ulike oppgaver, med øket veiledningsbehov som resultat.
  3. Tiden som ville krevdes for et antall programmeringsprosjekter ville fortrenge andre ønskede aktiviteter.

Satelittkommunikasjon

Jeg hadde tatt med nødvendige radioer, antenner og programvare for å ta ned samtaletrafikk fra lavtflyvende satelliter, og jeg hadde valgt SO-50 som kandidat. Den sender (downlink) på 145,800 MHz med FM-modulasjon. Den har en banevinkel på 64 grader og befinner seg innen rekkevidde et par ganger om dagen. Planen var å bruke en håndholdt beam-antenne og følge satelitten med den idet den passerte, basert på beregninger gjort i programmet “Gpredict”. Når dette ikke ble gjennomført skyldtes dette følgende forhold:

  1. Eksperimentet ville kreve en del teknisk teoriprat i forkant, og deltakerne hadde lite tålmodighet for å sitte stille og høre på.
  2. Jeg følte meg ikke sikker på hvor “magisk” deltakerne ville oppleve det å høre noen som pratet på radioen, selv om de visste at dette gikk via verdensrommet.

Oppkopling av en radiostasjon

Aktiviteten var planlagt til å gi deltakerne innsikt i sammenkopling av de komponentene som inngår i en radiostasjon, og gi dem forståelse for resonans og avstemming av en antenne. Dette ble forlatt fordi:

  1. Det erfaringsmessig kan ta lang tid før man oppnår kontakt med noen.
  2. Utstyret var best egnet for morsekommunikasjon, som deltakerne ikke ville forstå.
  3. Forståelsen av resonans og avstemming var trolig utenfor deltakernes modenhet.

Morsekommunikasjon

Med de egenbygde morsenøklene var idéen at de skulle bruke dem til virkelig kommunikasjon, gjennom spill. Jeg hadde forberedt spillet “battleship” slik at deltakerne kunne sitte parvis med sine morsenøkler og gi hverandre de nødvendige beskjedene med morsetegn. Ikke gjennomført fordi:

  1. Det ville krevet mye øvelse i forkant, da spillets regler må forstås og trenes på før man kan erstatte den talte kommunikasjonen med morsesignaler
  2. Det var ikke mulig å bruke de selvbygde morsenøklene over sambandsradioene, da pipelyden derfra var for lys. Det ville derfor vært nødvendig at deltakerne satt parvis innenfor hørevidde, noe som ville tatt vekk litt av “magien” ved bruk av morse.

Konklusjonen fra disse ikke gjennomførte aktivitetene er at jeg hadde overvurdert hva som lot seg gjennomføre innen den tiden vi hadde til rådlighet (3×5 timer). Jeg hadde også overvurdert hvor mottakelige deltakerne var for prat om teori, og undervurdert hvor mye assistanse deltakerne trenger i slike aktiviteter. 

Vedlegg: Lysark knyttet til forberedelsene

Til informasjon vedlegges et sett med lysark knyttet til forbredelsene til leiren. Lysarkene ble i noen utstrekning brukt som “bruksanvisninger” til de ulike eksperimentene. De inneholder enkelte detaljer som ikke er nevnt i denne rapporten, og har dessuten en del ekstra bilder.

LoRa-radioer brukt på radioamatørbåndene

 621 total views,  1 views today

LoRa (Long Range) er en radioteknologi som byr på mange anvendelser for radioamatører, men den må brukes i overensstemmelse med myndighetenes regelverk. Denne artikkelen gir en teknisk forklaring på modulasjonen og protokollene brukt i LoRa, og en presentasjon av hvordan LoRa-maskinvare kan koples opp konfigureres av et program skrevet i MicroPython. Den nødvendige konfigurasjonen for å operere i tråd med regelverket blir forklart, dessuten et enkelt eksperiment for å måle rekkevidden av LoRa-signaler.

(c) Anders Fongen, november 2024

Innledning

Innen digital transmisjon er det en lovmessig sammenheng mellom bitrate, båndbredde og signal/støy-forhold (SNR), uttrykt i Shannons Lov. Dersom anvendelsen av kommunikasjonskanalen ikke trenger høy bitrate, kan man klare seg med lav effekt (lavere SNR) eller liten båndbredde. Slike anvendelser er radioamatørene kjent med gjennom FT8 og WSPR.

LoRa er en kommunikasjonsteknolog som benytter den samme lovmessigheten ved å bruke radiosignaler med lang rekkevidde (lav SNR) , lav bitrate (opptil 22 kbit/sek) og lav utstrålt effekt (lavt strømforbuk). LoRa er utviklet med tanke på Internet of Things, med trådløs kommunikasjon mellom sensorer o.l. utstyrt med batteristrøm. En LoRa-radio er en liten og billig integrert krets som konfigureres og styres av en mikrokontroller (Arduino, ESP32, Raspberry Pico eller tilsvarende).

Resten av artikkelen vil hovedsaklig ha et teknisk fokus på modulasjon som brukes i LoRa, samt forklare hvordan en LoRa-radio kan koples opp og programmeres. Underveis vil relevante myndighetskrav bli diskutert, og erfaringer noen enkle eksperimenter bli presentert.

Kommunikasjon i bredt spekter (Spread Spectrum)

Tradisjonell radioteknologi har bestrebet seg på å sende ut radioenergi i et lite frekvensområde, slik at ulike sendere kan sende “side om side” i spekteret. Modulasjonen som er brukt i slike anvendelser (f.eks. kringkastingsradio) er følsom for annen radioenergi i samme frekvensbånd (forstyrrelser). Dette forholdet krever myndighetskontroll med bruk av frekvensspekteret, og overvåking av at bestemmelsene overholdes.

En alternativ måte er å spre radioenergien over et større frekvensspekter, på en måte som gjør kommunikasjonen mer robust mot forstyrrelser fra andre radiokilder, og som lar flere kommunikasjonskanaler benytte samme frekvensområde. På engelsk kalles slik modulasjon Spread Spectrum (SS).

Sentralt i SS-modulasjon er at hver overførte bit skal være representert på flere frekvenser, slik at et forstyrrende smalbåndssignal ikke skal hindre biten å bli overført. Vi finner SS-modulasjon i Bluetooth (som benytter såkalt frekvenshopping) og 3G (som benytter CDMA).

LoRa bruker SS-modulasjon ved å sende en samling bits i et symbol som representeres ved et signal som endrer frekvens fra lav til høy over en bestemt tidsperiode. Dette kan høres ut som fuglekvitter på en vanlig SSB-mottaker og kalles for “chirp”. Offisielt kalles denne typen modulasjon for Chirp Spread Spectrum.

Illustrasjonen ovenfor viser radioenergien i et chirp med tidsaksen horisontalt og amplituden vertikalt. Et chirp har ingen fase- eller amplitudemodulasjon, og informasjonen i det overførte symbolet avgjøres av hvilken frekvens chirp’et starter og slutter på. Mer om dette siden.

Båndbredde, symbolrate, spredningsfaktor

Den fysiske utformingen av et chirp bestemmes som nevnt av informasjonsinnholdet i symbolet som overføres i chirp’et, og tidsforløpet av overføringen bestemmes av signalets båndbredde, samt en parameter som kalles spredningsfaktor.

Informasjonen som overføres i et chirp kalles et symbol, og antall chirp som sendes pr. sekund kalles Symbolraten. Symbolraten (SR) er bestemt av båndbredden (BW) og spredningsfaktor (SF) på denne måten:

F.eks. vil en båndbredde på 62,5 kHz og spredningsfaktor 8 gi:

Koderate, og overførte bits pr. sekund (bitrate)

Antall bits overført i et symbol angis av spredningsfaktoren. SF=8 betyr at hvert symbol inneholder 8 bits. Dersom, i tråd med eksemplet over, symbolraten er 244 pr. sekund, blir brutto bitrate 1952 bits pr. sekund.

Men LoRa inkluderer også noen såkalt feilkorrigerende bits i datastrømmen, for å kunne detektere og endog rette opp overføringsfeil i noen utstrekning. Jo flere slik feilkorrigerende bits som legges inn, desto større og flere bitfeil kan rettes opp. En LoRa-radio konfigureres til en koderate (code rate, forkortet CR) skrevet f.eks. 4:5, som betyr at for 5 overførte bits er 1 bit satt inn for feildeteksjon/-retting, 4 bits er nyttedata. Mulige verdier for CR er 4:5, 4:6, 4:7, 4:8.

CR=4:5 betyr at netto bitrate er 80% av brutto, og regneeksemplet ovenfor gir en netto bitrate på 1952*0.8=1562 bits pr. sekund.

Her er en online kalkulator for å beregne netto bitrate. Den følger nettopp de regnereglene som nå er forklart.

Symbolverdien

Som nevnt overføres en gruppe bits med et symbol, et antall som tilsvarer verdien av spredningsfaktoren (SF). Verdien av dette er symbolet er derfor i området 0 til 2SF-1.

Et chirp vil starte på en frekvens, gå til høyeste frekvensen i båndbredden, fortsette fra laveste frekvens og avslutte på den samme frekvensen som den startet med. Symbolverdien representeres av den frekvensen som chirp’et starter og slutter på. Dette forløpet vil bli vist med en radiomottaker litt senere i artikkelen. Figuren nedenfor viser denne modulasjonsteknikken med frekvens langs vertikalaksen og tidsforløpet langs horisontalaksen (kilde).

Frekvensområdet som rommer chirp’ens båndbredde må derfor deles opp med 2SF antall “punkter”, hver av dem vil representere en bestemt symbolverdi.

Hvordan ser/høres dette ut i praksis

Vi kan sette opp en LoRa-sender med en båndbredde og spredningsfaktor som gjør at radiosignalet blir hørbart med en SSB-mottaker, og som gir et bilde i et “vannfall” som illustrerer chirp-modulasjonen.

Vi velger å sette opp senderen (måten dette skjer på vil vises senere i artikkelen) med BW=7800 Hz, SF=12. Dette gir en SR=1,9 pr. sekund, og en sendevarighet for hvert symbol på 525 millisekunder.

Med en bredbåndsmottaker og et “vannfallsdisplay”, i dette tilfellet RTL-SDR radio og Linux-programmet Gqrx (i Windows kan programmet SDR# gjøre samme jobben), kan vi motta LoRa-sendingene og studere dem i vannfallet. Slik vises LoRa-sendingene i mottagerprogrammet:

Lydsignalet som følger med er fra Gqrx-programmet som demodulerer som et SSB-signal. Forløpet i vannfallet viser omtrent det som allerede er forklart:

  • Chirp’ene opptrer omtrent 1,9 ganger pr. sekund.
  • Bortsett fra 2 chirp’er i starten av sendingen går alle lyder fra lav til høy frekvens.
  • Chirp’ene starter på ulike frekvenser, de skaper ikke et regelmessig sagtakk-mønster.

For å studere signalforløpet mer nøyaktig, lar vi Gqrx-programmet demodulere som et FM-signal og lagre det demodulerte signalet som en lydfil. Da vil frekvensen omsettes direkte til en amplitude, så vi kan studere frekvensforløpet med et lydredigeringsprogram, i dette tilfellet Audacity (finnes også for Windows). Sendingen som er vist i videoen over presenteres på denne måte i Audacity:

Vertikalaksen representerer her frekvensen, og den horisontale aksen tidsforløpet. De forskjellige delene av sendingen er ikke forklart i denne artikkelen, så kun i korthet starter sendingen med et “hode” av 6 up-chirps og 2.25 down-chirps. Området som vises i lyseblått er eksempel på et symbol som starter og slutter på samme frekvens, og som alltid endrer seg fra lav til høy frekvens, men “vrenger seg” fra høyeste til laveste frekvens. Det er også mulig å se nederst i vinduet at varigheten av det lyseblå området er 523 millisekunder, meget nære den verdien som vi beregnet ovenfor.

Tilkoplingen mellom LoRa-radioen og en mikrokontroller.

Bildet under viser en LoRa-radio t.h. med kretsen Semtech SX1278. Den har ingen betjeningsfunksjoner, kun tilkoplingspunkter for en kontroller som kan konfigurere og styre radioen gjennom elektriske signaler. Normalt vil disse tilkoplingspunktene forbindes til en mikrokontroller, som er en liten datamaskin som kan knyttes til en skjerm, knapper, andre datamaskiner, og som kan programmeres. Bildet nedenfor viser disse komponentene montert på et breadboard, med nødvendige ledningsforbindelser. Et breadboard er velegnet for eksperimentering fordi det er lett å gjøre endringer underveis og mulig å demontere komponentene siden for bruk i andre eksperimenter.

Mikrokontrolleren Raspberry Pico (til venstre) koplet til LoRa-radioen SX1278 (til høyre)

Sammenkoplingen mellom mikrokontrolleren og LoRa-radioen skjer gjennom en SPI-buss, som gjør sammenkoplingen enkel og med få kontaktpunkter. En SPI-buss kan kople kontrolleren (master) til flere ytre enheter (slaver) i tillegg til LoRa-radioen, f.eks. et display eller en GPS-mottaker. Figuren under viser hvordan en slik forgrening kan gjøres. I tillegg må LoRa-radioen ha strømtilførsel og en antenne.

Ledningsnettet i en SPI-buss. Kilde: https://electrosome.com/spi/

Det finnes også enheter hvor mikrokontrolleren er fabrikert sammen med en LoRa-radio, da er det enklere å sette opp et eksperiment eller en prototyp.

Oppsett for programmering

For å styre LoRa-radioen trenger mikrokontrolleren et program som kommuniserer med LoRa-radioen gjennom SPI-bussen. Mange slags mikrokontrollere kan brukes til dette formålet, og de programmeres med ulike verktøy og ulike programeringsspråk. Den kontrolleren som brukes i dette eksperimentet er Raspberry Pico. Den er utstyrt med støtte for SPI-buss og kan programmeres i programmeringsspråket “MicoPython”, som er mye lettere å arbeide med enn f.eks. C. Figuren under viser de nødvendige ledningsforbindelser mellom mikrokontrolleren og LoRa-modulen:

Raspberry Pico har tildels like funksjoner på flere tilkoplingspunkter, så flere muligheter finnes enn hva som vises på bildet. Det vesentlige er at de fire ledningene som hører til SPI-bussen (MISO/RX, MOSI/TX,SCK,GND), 3.3 v spenningsforsyning og avbruddsline (mellom GP20 og DIO0) er koplet til.

Programvaren i mikrokontrolleren må dessuten vite hvilke porter den skal bruke for å betjene LoRa-radioen, så det må være samsvar mellom disse opplysningene og den oppkoplingen som er valgt.

Programmet som skal utføre de ønskede sende- og mottaks-operasjoner gjennom en LoRa-kanal må skrives inn i programmeringsverktøy. Her finnes flere å velge mellom, men vi anbefaler Thonny, som er enkel i bruk og godt tilpasset mikrokontrollere som Raspberry Pico. PCen med Thonny koples til Raspberry Pico med en USB-kabel, og oppsettet av Thonny for å komme i gang med programmering er godt beskrevet på nettet, og vil ikke forklares her.

Biblioteksmodul for LoRa-programmering.

I dette eksperimentet har vi benyttet en LoRa-modul med Semtech SX1278. Programmeringseksemplet under gjelder for kretser med betegnelsen SX127X. En del LoRa-moduler benytter kretser med betegnelsen SX126X, som krever et annet programmeringsbibliotek og en litt annen programmeringsmetode.

LoRa-radioen er komplisert å sette opp, så vi overlater disse operasjonene til programvare som andre har skrevet, kalt en biblioteksmodul. Modulen som er brukt i dette eksperimentet kalles lora.py og den kan hentes herfra. Den skal lagres i mikrokontrollerens minne, det gjøres via Thonny.

Vi vil dog anbefale en liten endring i lora.py. Erstatt linje 56-57 på denne måten for å få en sikrere oppstart av LoRa-radioen:

#        while self._read(REG_VERSION) != 0x12:
#            time.sleep_ms(100)
#       The two commented lines are changed into
        v = self._read(REG_VERSION)
        while  v != 0x12:
            sleep_ms(100)
            v = self._read(REG_VERSION)
#           raise Exception('Invalid version or bad SPI connection')

Programmet som vi selv vil skrive må gjøre følgende:

  1. Beskrive hvilke tilkoplingspunkter på Raspberry Pico som skal brukes for å styre LoRa-radioen.
  2. Sette opp LoRa-radioen med de ønskede parametrene (frekvens, båndbredde, spredningsfaktor m.m.)
  3. Beskrive sending og mottak av brukerdata i henhold til anvendelsen av utstyret.

Under vises et bilde av Thonny som har et lite program kalt hello_send.py. Alt programmet gjør er å sende en “Hello world”-melding hvert 5. sekund.

Testprogrammets enkelte deler

Her vil testprogrammets deler vises og forklares i kommentarsetningene:

# Importere nødvendige biblioteksmoduler
from time import sleep
from lora import LoRa
from machine import Pin, SPI

# Deklarere hvilke tilkoplingspunkter for SPI
# Merk av dette er GP-tallene, ikke pin-nummer
SCK  = 18
MOSI = 19
MISO = 16
# Chip select
CS   = 17
# Receive IRQ
RX   = 20

# Setup SPI-bussen med riktige parametre
spi = SPI(
    0,
    baudrate=10000000,
    sck=Pin(SCK, Pin.OUT, Pin.PULL_DOWN),
    mosi=Pin(MOSI, Pin.OUT, Pin.PULL_UP),
    miso=Pin(MISO, Pin.IN, Pin.PULL_UP),
)
spi.init()

# Beskrivelse av LoRa-parametrene
lora = LoRa(
    spi,
    cs=Pin(CS, Pin.OUT),
    rx=Pin(RX, Pin.IN),
    frequency=433.660,
    bandwidth=20800,
    spreading_factor=10,
    coding_rate=8,
    preamble_length=4,
    crc=True,
    tx_power=17
)

# Nå er alt klart for sending og mottak
c = 0
while True:
    print(c," Sending a message")
    c = c+1
    lora.send('Hello world!')
    sleep(5)

For å motta meldinger gjennom lora.py må vi skrive litt ekstra kode for å håndtere det forholdet at meldinger kan mottas når som helst, og vi trenger å skrive en event handler for slike hendelser. Den viste handleren nedenfor viser kun meldingsinnholdet på konsollet, i praksis vil det være omfattende programlogikk der.

# Receive event handler
def handler(x):
    print("received:",x.decode())
    beep(0.2) # Metoden beep er ikke vist her

# Set handler til å kalles ved mottatte LoRa-meldinger
lora.on_recv(handler)

# Put module in recv mode
lora.recv()

# Loop forever
while True:
    pass

Demonstrasjonsvideo av LoRa-kommunikasjon

I videoen nedenfor vises bruk av disse enkle programmene for å overføre meldinger gjennom LoRa. Dette er også oppsettet som er brukt for å anslå rekkevidden til signalet, som beskrevet senere i artikkelen.

Lovlig bruk av LoRa innenfor myndighetenes regelverk

Bruk av radiosendere er strengt regulert i Norge, og det er på sin plass med noen vurderinger om hvordan LoRa-sendinger kan foregå på lovlig vis. Det er to regelverk som kommer til anvendelse: Fribruksforskriften, som stiller krav til radiosendinger for allmenheten, og Forskrift om radioamatørlisens, som angir krav til radiosendinger for personer med radioamatørlisens (radioamatørlisens tildeles personer som har bestått en såkalt lisensprøve).

La oss først ta for oss vilkårene i Fribruksforskriften, siden den vedkommer alle. Kapittel IV (§11) lister opp en del frekvenser som kan brukes, med oppgitt maksimal utstrålt effekt, båndbredde og sendetid.

Seksjon (1) angir et frekvensområde med maksimal utstrålt effekt på 25 mW (14 dBm), og et minimumskrav til båndbredden på 600 kHz. Dette er større enn maksimal båndbredde for LoRa, noe som må forstås dit hen at LoRa ikke kan benyttes.

Seksjon (2) angir et frekvensområde med maksimal utstrålt effekt på 500 mW (27 dBm) en maskimal båndbredde på 200 kHz, ingen krav til minimums båndbredde. Det er derimot krav til automatisk kontroll av utstrålt effekt, og det er ikke klart om LoRa kan møte dette kravet. Med LoRas standardverdier for båndbredde vil det være 125 kHz som er maksimalt tilatt.

Seksjonene (3)-(6) Påbyr alle mobile/nomadiske stasjoner å være “under kontroll” av et aksesspunkt. Siden LoRa ikke baserer seg på bruk av aksesspunkt slik som f.eks. Wlan gjør, er dette kravet ikke mulig å etterkomme.

Med en litt “lempelig” tolkning av bestemmelsene i seksjon (2) later det til at frekvensene 865,6–865,8 MHz, 866,2–866,4 MHz, 866,8–867,0 MHz og 867,4–867,6 MHz kan benyttes med 125 kHz båndbredde, og med utstrålt effekt en del lavere enn 500 mW (for å kompensere for kravet til automatisk effektkontroll). Merk at kravet om maksimal sendetid på 2,5-10 prosent ikke kan konfigureres i LoRa-radioen, men må besørges av overføringsprotokollene i den aktuelle anvendelsen. Også at det er LoRa-radioen av betegnelsen SX1276 som kan operere i dette frekvensområdet.

For brukere med radioamatørlisens gjelder §7 i Forskrift om radioamatørlisens, som angir maksimal båndbredde og utstrålt effekt for de ulike frekvensbåndene. Det eneste aktuelle frekvensbånd for LoRa er 432-438 MHz, hvor maksimal kanabåndbredde er 30 kHz. Det er mulig å konfigurere LoRa for en båndbredde på 20,8 kHz. NRRL’s (Norsk Radio Relæ Liga, landsorganisasjonen for radioamatører) båndplan angir området 433,600-434,000 MHz som egnet for digital dataoverføring, og da med utstrålt effekt opptil 300 W.

Med en ny bestemmelse gjeldene fra 1.november 2024 tillater myndighetene nå en båndbredde på 200 kHz i dette frekvensområdet. Anbefalte frekvenser for to slike kanaler er 433,775 MHz og 433,900 MHz. Radioamatører kan derfor benytte disse to frekvensene til LoRa med en båndbredde på 125 kHz og utstrålt effekt opptil 300 watt.

Begge typene LoRa-radioer (SX1276 og SX1278) kan operere på 433 MHz. For å oppnå høyere effekt enn 100 mW må et ekstra forsterkertrinn benyttes.

Merk at det finnes LoRa-moduler som ikke tillater konfigurasjon av båndbredden, bl.a. E32-modulene fra Ebyte. Disse er fast konfigurert til 500 kHz båndbredde og er uegnet for å operere på lovlige vilkår.

Hvorfor er dette robust?

LoRa kan sende over lange distanser med relativt lav effekt fordi den sender med lav bitrate og sprer radioenergien over mange frekvenser. Dette gir mottakeren mulighet til å bruke mer tid på å analysere det mottatte signalet og eliminere bakgrunnsstøy, og forstyrrelser fra andre kilder vil ikke hindre bit-overføringen med mindre hele båndbredden blir forstyrret.

Med ulike verdier av skaleringsfaktoren SF kan det gjøres en avveining mellom rekkevidde og bitrate. En økning av SF med 1 vil halvere symbolraten og gi mottakeren dobbelt så mye tid til å analysere signalet (gi en forbedret følsomhet med 2,5 dB) , men også gi en tilnærmet halvering av bitraten.

Et praktisk eksperiment ble gjennomført hvor et 100 mW signal ble sendt ut via en enkel mobilantenne satt på husveggen, og mottageren ble plassert i en bil koplet til en mobilantenne på biltaket (se bilde). Med denne konfigurasjonen (BW=20,8 kHz, SF=10) fikk mottakeren mottatt feilfrie meldinger i kupert terreng opptil 15 km avstand. Programmene brukt til dette eksperimentet er de samme som vist i videoen tidligere i artikkelen.

Takantennen brukt av LoRa-mottakeren, ca 15 km unna senderen.

Interessante anvendelser for radioamatører

LoRa kan neppe løse andre oppgaver enn f.eks. bruk av AX.25-modulasjon (1200 bits per sekund i en smalbåndskanal) mellom UHF-radioer, men kan derimot løse oppgaver med enklere og billigere utstyr med mye lavere vekt og lavere strømforbruk.

En nærliggende LoRa-anvendelse er lokasjonstjenesten APRS, som kan vise et kart med posisjonen til APRS-sendere i et stort område. Vanligvis brukes hele VHF-radioer til dette formålet, men med LoRa blir dette utstyret så billig og lite at det kan bygges inn i halsbåndet til en jakthund, eller på et modellfly.

LoRa er også velegnet for å bygge mesh-nett (hvor LoRa-stasjonene vidersender sendinger for andre) for formidling av meldinger m.m. Prosjektet Meshtastic er et eksempel på et slikt system.

Men vel så viktig er den muligheten mikrokontrolleren og bruk av MicroPython skaper til å designe egne protokoller og egne systemer for synlighet og samarbeid. Med det programmeringsverktøyet og biblioteksmodulen som her er vist, er det relativt enkelt å eksperimentere med egendesignede protokoller for innovative og nyskapende anvendelser.

Neighbourhood noise in the radio spectrum

 640 total views

Due to planned maintenance, the electric power in my neighbourhood was disconnected for hours today. That offered the opportunity to study the effect of background noise emitted from electric appliances.

(c) Anders Fongen, Oct 2024

When listening to the radio on the HF band, one can hear a lot of background noise which reduces the clarity of the reception. The emitters of the noise can be near or far away, which is interesting to distinguish, since the sources near you can be eliminated, most easily by packing your radio gear and drive somewhere else, to your cabin or into the mountains.

The neighbourhood which I live in had a power outage today, due to planned and announced maintenance. The affected area was small and included only 32 households (see map below). This disconnection gave me an opportunity to study the effect of radio spectrum noise (particularly in the HF region) from this area. The Xiegu G90 was powered by a battery and conncted to the outdoor antenna, then tuned to the 20 meter band in USB mode.

The map showing the extent of the affected households

I enjoyed the clarity of the reception and had a few QSOs before the electric power was expected to return. The radio display was filmed that moment when these 32 households again was able to power their cable modems, dimmers, plasma TVs, routers etc., and the difference in the receiver conditions was remarkable, which can be seen in the 20 seconds clip below.

Please observe the waterfall display as the power returns, and how excellent signals become completely drowned in the elevated noise floor, totally invisible in the waterfall.

Video recording of the moment when the power returned to the neighbourhood

After the power had returned I also switched off the main circuit breaker in the house to informally identify how much of the noise was coming from my own home. Hmm, quite a lot, since I have two wireless routers, ethernet switches, and dozens of wifi-connected house appliances. They are, like appliances in my neighbours’ house, essential for the daily life of our home, and cannot be switched off anytime.

From this experiment, I now realize how much the reception quality can be improved by taking the radio gear somewhere else (my home town is surrounded by mountain areas easily accesible by car) and operate a mobile/portable configuration.

Rattlegram: Enkel meldingstjeneste for mange typer radioer

 517 total views

Dette blir en kort artikkel om en app (Android og IOS) som tilbyr en meldingsutveksling over alle slags radioer som har et talesamband.

(c) 2024 Anders Fongen

Appen heter Rattlegram, og gjør én eneste jobb: Konverterer tekstmeldinger til et lydsignal, og omvendt. Den enkleste måten å demonstrere appen på er å legge to enheter (Android eller IOS) side om side og la begge kjøre appen. Det som skrives inn på den ene enheten, vises på den andre, og vi hører klart lydsignalet om bærer innholdet av meldingen. Man kan også eksperimentere med ulik avstand mellom enhetene og varierende bakgrunnsstøy for å danne seg et inntrykk av hvor robust kommunikasjonen er.

Merk allerede nå at mobilenheten aldri bruker sine radiosendere: Ingen WiFi, Bluetooth eller 5G. Ingen av eksperimentene her forutsetter mobildekning på stedet.

Det neste trinnet i eksperimenteringen er å sende via to transceivere som hver er innen hørevidde for sin enhet som kjører rattlegram. Først tester vi med noen lisensfrie UHF-radioer fra Biltema, for å vise at radioamatørutstyr ikke er påkrevet for å utveksle tekstmeldinger. For å sende en melding holdes sendeknappen (PTT) på radioen inne mens sendefunksjonen på appen aktiveres. På mottagersiden ligger radioen og Andoid/IOS-enheten ved siden av hverandre og trenger ingen betjening for å motta meldinger.

Her er en video hvor dette blir demonstrert:

Siden forsøker vi det samme eksperimentet med to VHF-transceivere for amatørbåndet (144 MHz), og oppnår det samme resultatet.

Fordelen med “ubetjent” mottak av meldinger

Hva er nå fordelen med en slik meldingsutveksling fremfor ganske enkelt å sende talemeldinger? Den mest opplagte fordelen er at mottageren trenger ikke å være betjent, men kan samle opp meldinger til neste gang operatøren kommer innom og sjekker displayet. En annen er muligheten for å sende komplisert tekstinnhold, f.eks. en url, og innhold fra copy&paste uten behov for bokstavering over et talesamband. En tredje er at sendte og mottatte meldinger blir lagt i en liste som fungerer som en logg over meldingsutvekslingen.

Et tenkt brukstilfelle er slik: Operatørene har alle radioene stand by i lyttemodus, og med Rattlegram på en mobil ved siden av. Dersom operatøren må forlate radiostasjonen for et stund, vil mobilenheten i mellomtiden samle opp mottatte meldinger og vise dem i listen. En stasjon A som anroper stasjon B uten å få svar, kan derfor følge opp med en Rattlegram-melding med innholdet “Gjør et oppkall når du er tilbake” eller lignende.

Parrot-funksjonen: Digipeater

I et tredje eksperiment ble “parrot”-funksjonen i Rattlegram undersøkt. Med denne funksjonen aktivert vil mottatte meldinger sendes ut igjen etter noen sekunder. En lik funksjon forvisser avsenderen om at meldingen er korrekt mottatt, og den gjør det mulig med indirekte overføring av melding via en digipeater (på en fjelltopp el.lign) mellom parter som ikke har direkte radiokontakt.

En slik funksjon forutsetter at radiosenderen kan sende ubetjent, uten at noen trykker inn PTT-knappen. Appen har ingen mulighet for å styre en PTT-funksjon, så radioen må settes opp med VOX-kontroll (sending starter når mikrofonen detekterer lyd). Radioen kan fortsatt være akustisk koplet til mobilenheten (se bilde), men i dette eksperimentet måtte følsomheten på radiomikrofonen settes til høyest følsomhet, og mobilenheten måtte stille høyttaleren på full styrke og plasseres nærmest mulig radioens mikrofon.

Akustisk kopling mellom radio og mobilenheten. Radioen må konfigureres til VOX-kontroll av senderen.

Et annet alternativ er å kople en kabel mellom radio og mobilenheten, muligens via et eksternt lydkort som koples til mobilenhetens USB-port med en OTG-kabel. Her er det en del plunder som venter, så det kan kreve litt prøving og feiling før dette fungere som ønsket. En kablet konfigurasjon er vist i videoen nedenfor, og i dette tilfellet ble det valgt å bruke to radioer for henholdsvis sending og mottak. En opplagt fordel med en kablet forbindelse er at operasjonen blir lydløs og mindre følsom for annen støy i rommet.

Her vises en video som demonstrerer digipeater-konfigurasjon av Rattlegram:

Systemdiagram

På bildet nedenfor vises et slags systemdiagram, hentet fra Ribbit-prosjektet, som står bak Rattlegram-appen. Den viser hvordan to mobilenheter (uten bruk av 5G, WiFi eller BT) kan utveksle meldinger gjennom radioer (akustisk koplet eller kablet) med direkte link mellom seg, eller via en talerepeater eller digipeater. Skissen viser også en mulighet for å bruke mobilenhetens egen 5G-radio, men det er ikke implementert i denne versjonen av Rattlegram.

Systemskisse for ulike måter Rattlegram kan sende og motta meldinger.

Hvilke radioforbindelser virker/virker ikke?

Rattlegram benytter en såkalt OFDM-modulasjon og såkalt feilrettende koder for å gjøre overføringen robust og effektiv. Det oppnås en bitrate på noe over 2 kbit/sekund, noe er veldig bra. Men erfaringene med ulike radioer og modulasjonstyper viser at mikrofon og høyttaler bør være av god kvalitet med god lydgjengivelse.

  • En DMR-link er sterkt komprimert og gir kun forståelig tale med dårlig lydkvalitet, og viser seg ikke å fungere for Rattlegram, noe som ikke er overraskende.
  • En FM-link i VHF- (145 MHz) og UHF-båndet (433 MHz) virker, som vist i eksperimentvideoene.
  • En FM-link via en lokal VHF/UHF crossband-repeater fungerer fint, som ventet
  • En FM-link via en “offentlig” VHF-repeater fungerte ikke, skyldtes muligens for svakt signal
  • Overføring via en HF-link fungerer fint med FM- eller USB-modulasjon på frekvensene 7-29 MHz. De to HF-transceiverne sto like ved hverandre, så en link med “realistisk” signal-støy forhold ble ikke testet.

Mottak og bruk av ADS-B signaler fra fly

 774 total views

I denne artikkelen beskriver jeg hvordan det er mulig å ta imot radiosignaler fra fly med ADS-B meldinger, og hvilken informasjon disse meldingene inneholder.

(c) Anders Fongen, februar 2024

Fly i normal trafikk sender ut radiosignaler med meldinger om flight-id., posisjon, høyde, fart og retning. Dette skjer i et meldingsformat som kalles ADS-B og er en digital transmisjon på frekvensen 1080 MHz. Dette signalet brukes av luftkontrollen som supplement til radar, og tjenester som Flightradar24 benytter også i stor grad disse radiosignalene.

Kan du ha interesse av å bruke disse signalene? Selv har jeg planer om å bruke fly som reflektorer av radiosignaler, og på den måten utvide rekkevidden av VHF/UHF-signaler over horisonten. Da trenger jeg å vite hvordan antennen skal stilles for å peke mot flyet, og jeg må derfor vite hvor det befinner seg til enhver tid.

Hva du trenger for å motta ADS-B

  • En SDR mottaker av typen RTL-SDR. De finnes på Ebay fra en hundrelapp og oppover. De selges ofte som utstyr for å kunne motta digital TV på PC, men egner seg til mange andre formål også.
  • En Linux-maskin, gjerne en Raspberry Pi. Har du en gammel PC stående som ikke brukes og som har en USB port og nettverksadapter (WLAN eller Ethernet), så bruk gjerne den. Du vil trenge litt Linux-erfaring for å gjennomføre det som blir beskrevet her.
  • Noe gratis programvare som lastes ned fra Internet, bl.a. dump1090.

Oversikt over konfigurasjonen som skal vises her

  1. Radiosignalet fra fly mottas av SDR-dongelen som er koplet til en Linux-maskinens USB-port.
  2. Fra SDR går et “råsignal” (I/Q-signalet) til Linux-maskinen (grønn pil), hvor programmet dump1090 dekoder signalet og henter ut meldingene. Disse meldingene, gjengitt på såkalt SBS-1 format, sendes ut fra Linux-maskinen med TCP-protokoll på port 30003 (rød pil).
  3. Meldingene på SBS-1 format kan leses med et program som man kan skrive selv etter hvilke ønsker man har. Jeg har valgt å lage et Python-program for en Raspberry Pico W mikrokontroller som henter ut flyenes løpende posisjon (lengdegrad, breddegrad, høyde) og regne ut retningen til en direktiv antenne som skal følge flyet.
  4. Raspberry Pico lager elektriske signaler for å styre to motorer på et enkel platform (blå pil) for å stille inn ønsket retning og vinkel (azimuth og elevation).

Konfigurasjon av Raspberry pi (2)

Komponent (2) skal ta imot I/Q-signaler fra SDR-dongelen, dekode ADS-B meldingene som overføres, og presentere data på SBS-1 format gjennom en TCP-forbindelse. For dette trenges en enkel Linux-maskin som må konfigureres for dette formålet. Den følgende beskrivelsen tar utgangspunkt i en Raspberry Pi v.3, men fremgangsmåten blir nokså lik også for andre type Linux. Sørg for at Linux-versjonen er nylig oppdatert.

Følgende kommandoer kan gis for å installere drivere og dump1090-programmet:

$ sudo apt update
$ sudo apt upgrade
$ sudo apt install librtlsdr-dev
$ sudo apt install rtl-sdr
$ git clone https://github.com/antirez/dump1090.git dump1090
$ cd dump1090
$ make

Evt. feilmeldinger følges opp og rettes. På katalogen dump1090 ligger nå programmet dump1090 som startes med kommandoen ./dump1090 --net.

SDR-dongelen kan nå koples til maskinens USB-port og en egnet antenne, slik som vist på figuren. Deretter kan dump1090-programmet startes. Det gir ingen løpende utdata til skjermen, man overvåker utdata på metoden som er vist nedenfor.

Utdata fra dump1090

Som vist på figuren over har vi satt opp dump1090 til å sende ut data i SBS-1 format til TCP-port 30003. Med programmet netcat kan vi ta en titt på hvordan dataene ser ut, og gjøre oss opp en mening om hvordan de kan behandles. Ta en titt på denne videoen:

Det er i hovedsak opplysninger om posisjon og flight-id som er at interesse for denne anvendelsen, men data om retning og fart er også tilgjengelig.

Analyse av SBS-1 data og beregning av antenneretning (3)

Figuren over viser hvordan utdata fra dump1090 overføres via TCP-protokoll til alle som ønsker det (rød pil). Figuren viser derfor at flere ulike anvendelser kan hente disse dataene fra samme dump1090-instans.

I det eksperimentet som beskrives her, skjer denne bearbeidingen i en Raspberry Pico W, som er en mikrokontroller med WLAN-grensesnitt og som kan programmeres i Micropython. Programkoden i denne mikrokontrolleren kan deles i tre deler:

  1. Et hovedprogram som etablerer en TCP-forbindelse til dump1090-noden (2), kaller så på Python-moduler for analyse, beregning og antennestyring
  2. En modul for å analysere SBS-1 melding for posisjon og identifikasjon av fly, og for å beregne antenneretning til flyet.
  3. En modul som mottar opplysninger om antenneretning og styrer servomotorene på antenneplattformen i henhold til disse opplysningene.

1 – Hovedprogram

Hovedprogrammet initialiserer TCP-forbindelsen, WLAN-adapteret, I2C-bussen og oppretter nødvendige objekter for de påfølgende operasjonene. Slik ser programkoden ut:

from wlan_config import wlan_config # WLAN configuration module
from AzElPlatform import AzElPlatform # Az-El antenna control
from AzElCalculator import AzElCalculator
import socket
from machine import Pin, I2C
import ssd1306

# using default address 0x3C
# TODO change GPIO numbers if necessary
i2c = I2C(0,sda=Pin(8), scl=Pin(9))
display = ssd1306.SSD1306_I2C(128, 64, i2c)

# Configure wlan
wlan_config()

# Make network tocket and connect to ads-b listener
sock = socket.socket()

# TODO change IP address to the actual dump1090 node
sock.connect(("192.168.2.11",30003))

# Configure bearing calculator (lat,lon,alt)
# TODO Replace numbers with your own location
azelcalc = AzElCalculator(61.1353,10.4419,253)

# Initialize platform motor control
# TODO change numbers to your own use of GPIO ports
azelplat = AzElPlatform(16,17)

# Start reading ads-b messages
while True:
    message = sock.readline().decode()
    result = azelcalc.analyzeMessage(message)
    if result != None:
        print(result) # For debugging only
        
        # If flightId is present, send to OLED display
        flightId = result['flightid']
        if flightId != None:
            distance = int(result['distance']/1000)
            display.fill(0)
            display.text('%s-%d km'%(flightId,distance),5,8)
        else:
            display.fill(0)
        display.show()
        # Find azimuth and elevation from result
        azimuth = float(result['azimuth'])
        elevation = float(result['elevation'])
        # Point antenna in that direction
        azelplat.setDirection(int(azimuth),int(elevation))

Deler av programkoden styrer et OLED-display for å vise flight-id og avstand til fly som blir fulgt av antennen. Disse kan kommenteres bort om dette er uten interesse.

Modulen wlan_config som importeres her er presentert i en annen blogg-artikkel: WLAN-konfigurasjon i Raspberry Pico W. Der vises hvordan wlan-adapteret kan konfigureres uten å skrive nettverkspassordet inn i koden.

2 – Analyse og behandling av SBS-1 utdata, beregningav retning

Metoden analyzeMessage() i modulen AzElCalculator mottar en SBS-1 melding som parameter og henter ut flight-id og posisjonsdata fra den. Programmet beregner så retningen for en antenne som skal følge dette flyet, i form av horisontal og vertikal vinkel (Azimuth og Elevation). For denne beregningen brukes Python-modulen AltAzRange som kan hentes fra denne adressen. Programkoden for AzElCalculator ser slik ut (merk at noen av linjene er lange og er brukket i flere deler):

# Receive SBS-1 message, find position of aircraft and
# calculate azimuth and elevation for the direction to it
from AltAzRange import AltAzimuthRange
class AzElCalculator:
    def __init__(self,myLatitude,myLongitude,myAltitude):
        AltAzimuthRange.default_observer(myLatitude,myLongitude,myAltitude)
        self.airplane=AltAzimuthRange()
        self.flightId = [(None,None),(None,None),(None,None),(None,None),(None,None)]
        
    def analyzeMessage(self,messageLine):
        elements = messageLine.split(",")
        
        # ES Airborne Position Message
        if (elements[1] == '3'):
            icao = elements[4]
            altitude = elements[11]
            if altitude == '': return None
            latitude = elements[14]
            if latitude == '': return None
            longitude = elements[15]
            if longitude == '': return None
            self.airplane.target(float(latitude),float(longitude),float(altitude)*0.3048)
            # Observe that the position is not returned, only the direction
            result = self.airplane.calculate()
            result['icao'] = icao
            result['flightid'] = self.getFlightId(icao)
            return result
        # ES Identification and Category
        elif (elements[1] == '1'):
            icao = elements[4]
            flightid = elements[10].strip()
            if flightid == '': return None
            self.storeFlightId(icao,flightid)
            return None
        # ES Airborne Velocity Message
        elif (elements[1] == '4'):
            result = dict()
            result['icao'] = elements[4]
            result['groundspeed'] = elements[12]
            result['track'] = elements[13]
            result['flightid'] = self.getFlightId(result['icao'])
            # We can return the "result" object, but choose not to
            # return result # is this data is needed
            return None

    def storeFlightId(self,icao,flightId):
        if self.getFlightId(icao) == None:
            # Add flight id to list
            self.flightId.insert(0,(icao,flightId))
            self.flightId.pop() # Kill the oldest entry
    
    def getFlightId(self,icao):
        for (i,f) in self.flightId:
            if i == icao: return f
        return None

3- Styre en direktiv antenne mot flyet

Oppgaven med programmering av to servomotorer for å styre en antenne i to akser (horisontalt og vertikalt) skjer med modulen AzElPlatform som er presentert i en tidligere blogg-artikkel: Styring av servomotor fra Raspberry Pico og Micropython. For ordens skyld gjengis programkoden er:

# Python class to control a simple Azimuth-Elevation
# platform. It uses two SG90 servo motors for the two
# axes. Since they only rotate 180 degrees, the 180
# degree range of the elevation rotor is used to cover
# the left half (180-359 degrees) of the azimuth

from machine import Pin, PWM
class AzElPlatform:

    def __init__(self,azrotor, elrotor):
        self.azport = PWM(Pin(azrotor))
        self.elport = PWM(Pin(elrotor))

        self.azport.freq(50)
        self.elport.freq(50)

    def setDirection(self,az,el): # Angle in degrees
        # Check parameters: 0-359 and 0-90 allowed
        if not az in range(0,360): return
        if not el in range(0,91): return
        if az>180:
            az = az-180
            el = 180-el # Bend elevation backwards for left half
        # Experimentally established values for
        # Calculation of duty cycles corresponding
        # to rotor angles
        dutyAz = 7800 - az * 6600/180
        dutyEl = el * 7000/180 + 1200

        self.azport.duty_u16(int(dutyAz))
        self.elport.duty_u16(int(dutyEl))
Raspberry Pico W med OLED display viser flight-id NOZ191 med avstand 78 km og følger dette flyet med en direktiv antenne.

Oppsummering

I denne blogg-artikkelen har jeg presentert noen aktiviteter som inkluderer bruk av Software Defined Radio, avansert digital dekoding av radiosignaler fra fly, noe programmering og beregninger på posisjonsdata, og styring av servomotorer for antenner.

Mange av disse emnene vil være av interesse i andre anvendelser enn akkurat den som her er presentert. Bruk gjerne delløsningene i denne artikkelen til dine egne prosjekter, og send meg en melding om resultatene blir interessante.

Morsetrener på en Micro:Bit

 675 total views,  3 views today

Med dette utstyret kan man trene på sending og mottak av morsesignaler sammen med andre. Hver deltaker trenger en Micro:Bit (version 2), og programvaren finner du nederst på siden.

Her demonstrerer jeg hvordan Micro:Bit kan brukes for å sende og motta morse

Med morsealfabetet kan du sende og motta tekst ved å overføre korte og lange pipesignaler. På 1800-tallet kom telegraf-tjenesten i gang i Norge, fra nord til sør ble ledninger trukket som kunne overføre elektrisk strøm for dette formålet. Den gang fantes ikke radio, og heller ikke elektronikk som kunne overføre et talesignal. Profesjonelle operatører som var trent i bruk av morse sørget for at telegrammer ble sendt og mottatt, skrevet ned på papir med vanlige bokstaver og levert til mottakeren med bud.

Etter hver ble radiosenderen oppfunnet, men fortsatt uten muligheter for å overføre tale. Morsesignaler var også her i vanlig bruk mellom skip og til landstasjoner.

Da radioene ble utviklet til også å overføre tale, fortsatte allikevel morsesignaler å være i vanlig bruk. Det viste seg at et system med pipetoner var lettere å oppfatte når det var dårlig radioforbindelse, og man trengte mindre effekt for å få frem meldingene. En radiosender med mindre effekt er lettere og billigere, og egner seg i bærbart utstyr.

Mens profesjonell bruk av morse mellom skip og landstasjoner ble avviklet i år 2000, er det fortsatt mange radioamatører som bruker morse, og det er egne frekvensbånd som brukes til dette formål. Bruk av morse er

  • morsomt, fordi det krever øvelse
  • lett å kombinere med selvbygget radioutstyr
  • effektivt, signalene når over lange avstander med lav effekt og enkle antenner

Morsetrening

Morsealfabetet er lett å være, det finner du mange steder på nettet. Her ser du en slik tabell hvor de korte pipesignalene er vist som prikker, de lange som streker.

Det er grunner til at du ikke anbefales å pugge morse som prikker og streker, fordi det kommer til å hindre deg i å oppfatte signalene som bokstaver og ord når hastigheten øker. Det er mye bra programvare gratis tilgjengelig som trener deg i nettopp dette.

Men det er også viktig å trene morse sammen med andre, hvor dere kan sende til hverandre på skift og lage en faktisk samtale. Slik trening vil lære dere å bruke de vanligste forkortelsene, be om repetisjon av deler av meldingen ved behov osv. Dessuten er det morsommere å lære noe nytt sammen med andre. Om du allerede er radioamatør med tilgang til en radiostasjon kan du øve med virkelige radiosendere, i motsatt fall må du bruke andre overføringsmekanismer, som f.eks.

  • En internet taletjeneste (Messenger, Zoom, Skype m.fl.)
  • Lydsignaler i luft

I begge disse tilfellene ovenfor trenger du en morsenøkkel og en “piper” som avgir et pipesignal når du trykker ned spaken på morsenøkkelen. Som du ser her er en morsenøkkel ganske dyr, men du kan selvsagt lagt din egen fordi det er bare en enkel elektrisk bryter.

Alt i ett med Micro:Bit v2

Micro:Bit er en mikrokontroller som inkluderer en del brytere, sensorer, radio, lamper og lydgivere og koster ca kr.400,- (version 2 kreves for dette formålet). Den kan programmeres og brukes til mange formål, og vi har laget programvare slik at den kan brukes til morsetrening. Programmet er gratis og kan lastes ned fra denne siden via en link lenger ned.

  • Bruker knappene på kretskortet som morsenøkkel
  • Brukere lydgiver og lamper på kretskortet for å vise/spille morsesignaler
  • Bruker den innebygde radioen for at flere deltakere kan sende og motta signaler
  • En “virkelig” morsenøkkel kan koples til kretskortet om ønskelig

Med Micro:Bit v2 og den nødvendige programvaren har en gruppe med deltakere alt de trenger for å sende og motta morsesignaler over radio (men med kort rekkevidde, opp til ca 10 meter).

Innlasting av programvaren

  1. Last ned filen CWtransceiver.hex
  2. Kople MicroBit til PC med en USB-kabel
  3. Nå vil det vises en ny “disk” i FileExplorer, kalt MICROBIT
  4. Kopiere CWtransceiver.hex til denne “disken” (drag and drop i FileExplorer)

For å teste at programvaren er riktig installert, trykk ned Button A (på venstre side av kretskortet. Da skal du høre en pipetone.

Bruksanvisning for morsetreneren

  1. Du kan bruke treneren alene for å øve sending av morsetegn. Da bruker du Button A for å lage pipelyd.
  2. Om flere Micro:Bit-enheter er i nærheten av hverandre, vil signaler som sendes på en enhet spilles av med pipelyder også på de andre enhetene. Der vil også led-lampene på kretskortet lyse opp i samme takt.
  3. Om du berører touch-sensoren (på forsiden av kretskortet like ved USB-kontakten, den har to prikker med en oval rundt), vil LED-displayet skiftevis vise “P” og “S”. Om du vil sende morse slik som vist ovenfor (kalt “Straight Key”) skal det vises en “S” i displayet. Dersom det står en “P” i displayet vil Button A og Button B utgjøre en såkalt paddle keyer. Dette er en mer effektiv måte å sende morsetegn på, men den krever litt øvelse for å beherske. Demonstrasjonsvideoen i starten viser hvordan den kan brukes.
    * Button A gir en serie med prikker mens den holdes nede
    * Button B gir en serie med streker mens den holdes nede
    * Begge knappene nedtrykket gir en serie med skiftevis prikk og strek
    * Mens Button A holdes nede, kan Button B gis et kort trykk. Da vil streken bli sendt ferdig, deretter en prikk før strekene igjen blir sendt. Tilsvarende gjelder i motsatt retning.
  4. Om du ønsker å endre hastigheten på prikker og streker i “P” (paddle keyer) innstillingen gjør du som følger:
    * Hold Button A nede slik at du hører en serie prikker bli sendt.
    * Snu kretskortet på høykant til høyre (slik at Button A er øverst). Da vises en høyrepil i LED-displayet og du hører at hastigheten på prikkene øker. Rett opp kretskortet når hastigheten er passe. Tilsvarende senkes hastigheten om du snur kretskortet til venstre (da vises en venstrepil).

Communication between DMR and a computer network

 1,281 total views,  1 views today

Anders Fongen, November 2022

Abstract: The integration of a sensor network with services from voice communication, text messaging and Global Positioning System (GPS) creates opportunities for improved situational awareness, better safety for field operators, higher confidence in sensor readings and improved return on equipment investment. Digital Mobile Radio (DMR) has been the choice of communication technology for a series of experiments where these potentials have been investigated. Additional technology components used were mostly inexpensive and open source.

The article was published in the The Sixteenth International Conference on Sensor Technologies and Applications (SENSORCOMM 2022) October 2022, Lisbon Portugal.

Demonstration videos

Below are two demonstration videos from the integration experiment, view these if you are not into reading academic papers:

The first video shows how to integrate a DMR radio into an pub-sub network using the MQTT protocol.

Demonstration video from the integration experiment – pubsub intergation

The second video shows how two MMDVM units can provide routing of IP packets across a DMR radio link.

Demonstration video from the integration experiment – IP routing

Full text of article

Download source code

This link allows you to download the source code in the form of a compressed tar file. Please observe that this is experimental code not meant for production, and:

  • The module gwtest.py is the root module, and the execution starts there
  • You will need to import the module dmr_utils3, paho-mqtt, netifaces, etc.
  • You will need to inspect the source code and modify values for ip-addresses, DMR-ids, UDP port number, MQTT topics etc.
  • You need to configure pi-star so that it connects to the Controller at its IP-address.
  • The code also includes code to route IP-packets over a DMR link. Un-comment this code if necessary, but this will require the program to run in root mode (sudo…)
  • If you make improvements and want to share them with me, you are welcome to contact me. Please accept that I cannot spend much time on advice and support otherwise.

The QYT KT8900 radio with an Allstarlink node

 2,662 total views,  1 views today

Good news: The QYT KT-8900 and KT-8900D radios are well suited for running an Allstalink node. The configuration menu REP-M (#43 on KT-8900, #51 on KT-8900D) allows two radios to make a repeater by connecting a cable between the two microphone connectors (RJ45 plugs). The configuration feeds a RPT-CTLR signal when the squelch opens (or subtone received) through the mic connector which is wired to the PTT on the other radio.


The RPT-CTLR is effectively a COR signal which can be wired to the DMK URI for Allstarlink operation, and no modification to the radio circuit board is necessary. As a proof of concept, I sacrificed an ethernet cable and soldered a DB25 plug on it according to the wiring shown on the picture. This works as expected and with good sound quality. The KT-8900D offers much radio for the money, and I believe it should be interesting for use in private Allstarlink nodes.
The RPT-CTLR is active low, so you need to set “carrierfrom=usbinvert” in simpleusb.conf


After 3 hours operation on 95% duty cycle, the radio is only lukewarm, using low output power (10w)

The Allstalink node connected to the Mic connector of KT8900D

The wiring arrangement for the DB25 and the DMK URI board