Modtagning af QO-100

Jeg ville prøve at modtage signaler fra QO-100, som er den første geostationære amatørradiosatellit, så jeg har anskaffet mig en parabolantenne til 130 kr. fra Paraboleksperten i Ballerup, og en LNA til 58 kr. fra Harald Nyborg. Nogle gange kaldes det en LNA (low-noise amplifier) og nogen gange LNB (low-noise block), men det er det samme.

Jeg har anbragt parabolen i en parasolfod.

LNA’en indeholder en lille antenne til modtagning af linært polariserede signaler, en signalforstærker, og en downconverter til at flytte signalerne fra det lettere utilgængelig 10,5 GHz-område og ned i det mere RTL-SDR-venlige UHF-område. LNA’en indeholder en oscillator som svinger på 9,75 GHZ, hvilket flytter et signal på f.eks. 10,5 GHz ned til differensfrekvensen på

10500 MHz – 9750 MHz = 750 MHz

LNA’en monteret i parabolens brændpunkt.

Men LNA’en fungerer ikke, med mindre den får noget strøm. En LNA har faktisk to antenner i sig – en til vandret polariserede signaler, og en til lodret polariserede signaler. LNA’en skal have enten 13 VDC eller 18 VDC, plus på inderlederen af koaksialkablet og minus på skærmen. Forstærkeren virker lige godt, om den får det ene eller det andet, men man vælger mellem den lodrette og vandrette antenne med spændingen: 13 volt giver lodret, 18 volt vandret.

Her kunne man godt være fristet til bare at sætte en strømforsyning på coax’et, men det går ikke – RTL-SDR’en bliver ked af at få så stor en spænding ind ad antenneindgangen. Derfor er det nødvendigt med en bias-T. En bias-T er dybest set en dims, der tillader at hælde en jævnspænding den ene vej, men ikke den anden, og samtidig lade de højfrekvente radiosignaler passere.

Bias-T’en kostede mig 40 kr. på ebay.

Her kunne man godt sige godt – nu har jeg en parabol, en LNA, en bias-T, en 13 V strømforsyning og en laptop, så nu skal jeg i gang med at lytte!

Jeg har imidlertid valgt en lidt mere kompliceret løsning. Det skyldes, at det er koldt udenfor (brrrr!) og jeg vil hellere sidde inde i min varme stue og lytte til satellitten end ude på terrassen. Dertil kommer, at jeg har elektricitet i mit skur lige bag parabolen, så løsningen er at stikke RTL-SDR’en i en Raspberry Pi 3, som så vha. programmet rtl_tcp kan streame de rå IQ-samples til min laptop. Jeg nøjes derfor med 5 meter coax, som løber ind i en lille plastikkasse fra IKEA, hvor Raspberry Pi, RTL-SDR og bias-T ligger.

Hvordan strømforsyner jeg bias-T’en? Jo, jeg tænkte, at den nok ikke bruger super meget strøm, og man kan faktisk hive +5V ud af en Raspberry Pi – mere eller mindre direkte fra strømforsyningen. Jeg satte derfor en DC-DC-converter, indstillet til 13,4 V, til Raspberry Pi’ens 5V og GND-pinde, for at se, om den kan forsyne bias-T’en. Jeg havde godt nok frygtet at se en del undervoltage-beskeder på Raspberry Pi’en, men det sker faktisk ikke!

Raspberry Pi, strømforsyning, RTL-SDR, Bias-T og DC-DC-converter (pakket ind i tape for at undgå kortslutninger) i en plastikkasse. Ja, det kunne muligvis have været lidt mere elegant.

Næste problem: Når man streamer IQ-samples over et netværk, kommer der altid klumper i streamen før eller siden. Det håndterer den “etablerede” version af rtl_tcp ikke særlig godt. Derfor har Stephen Blinick omskrevet rtl_tcp, så den ikke bruger “linked lists” længere, men i stedet en ringbuffer. Det giver et alvorligt performanceboost, så jeg har installeret hans “fork” af rtl_tcp i stedet for den officielle; Stephens version kan man hente her: https://github.com/blinick/rtl-sdr

Jeg starter radiomodtageren med kommandoen

sudo /home/pi/rtl-sdr/build/src/rtl_tcp -a 0.0.0.0 -s 900001

Der er to årsager til den lave samplerate:

  1. Jeg streamer alle disse IQ-samples over wi-fi, så jeg vil gerne mindske belastningen på netværket lidt,
  2. smalbåndstransponderen på QO-100, i hvilken jeg (i hvert fald pt.) primært er interesseret, er ikke bredere end 500 kHz, så 900001 samples pr. sekund er tilstrækkeligt.

Jeg modtager streamen i gqrx med disse indstillinger:

Og nu kan jeg modtage QO-100:

Raspberry Pi-dørklokke

Da jeg (forholdsvis!) nemt kunne trække et kabel fra min dørklokke til den ene af de Raspberry Pi’er, der kører 24/7, var det jo lidt oplagt af få dørklokken på nettet. Vi kan nemlig godt have svært ved at høre klokken, når døren ud til gangen er lukket, og vi står i køkkenet og larmer. Og så ville det jo være smart, om ens mobiltelefon kunne sige ding-dong, når man trykker på knappen.

Figur 1: En klassisk Friedland Ding Dong.
Figur 1: En klassisk Friedland “Ding Dong”.

Det er en klassisk Friedland “Ding Dong”, som tager fire C-batterier. Der er fire skrueterminaler i den: To, der går til trykknappen, og to ubrugte. Det viser sig, at når man trykker på knappen, ligger der ca. 4,8 V på de to ubrugte skrueterminaler. Det skal så hældes ind i en Raspberry Pi. Og det går selvfølgelig ikke sådan uden videre, så jeg har lavet et lille interface:

Figur 2: Diagram over interfacet mellem dørklokke og Raspberry Pi. Lavet med det gratis værktøj Digi-Key Scheme-it, som varmt kan anbefales.

(Hvordan skal man i grunden smide sådan noget sammen? Pt. er det bare en fuglerede…)

Figur 3: En rigtig god, gammel 8 µF foliekondensator. Mums!
Figur 3: En rigtig god, gammel 8 µF foliekondensator.

Kondensatoren er en gammel 8 µF foliekondensator – se figur 3. Hvorfor ikke? Jeg burde jo nok beregne den nødvendige kondensatorværdi ud fra tidskonstanten

τ = RC

men eftersom der ikke er nogen modstand, kan tidskonstanten hurtigt blive meget lille, uanset hvor stor en kondensatorværdi jeg vælger – eller er der noget, jeg har misforstået?

Jeg kører GPIO4 med en pull-up-modstand (indbygget i Raspberry Pi), og så har jeg skrevet et lille program i Python, som ser sådan her ud:

import datetime
import logging
import os
import RPi.GPIO as GPIO
import subprocess
import sys
import time

GPIO.setmode(GPIO.BCM)
pin = 14
GPIO.setup(pin, GPIO.IN, GPIO.PUD_UP)

while True:
try:
logging.basicConfig(filename="dingdong.log", format="%(asctime)s %(message)s", level=logging.DEBUG)
GPIO.wait_for_edge(pin,GPIO.FALLING)
logging.info("Ding")
subprocess.call("/home/pi/dingdong/tweet.sh", shell=True)

except:
logging.warning(sys.exc_info()[0])

Det program ligger i en fil, der hedder dingdong.py. Den kaldes fra et init-script:

echo 14 > /sys/class/gpio/export
echo in > /sys/class/gpio/gpio14/direction
python3 /home/pi/dingdong/dingdong.py

der køres af cron ved boot.

Så når nogen ringer på, sendes der et tweet, som min mobiltelefon så gør mig opmærksom på.

Problemer

  1. Kredsløbet er temmelig støjfølsomt. Skramler jeg lidt rundt om det, kan det trigge en jording af GPIO4.
  2. Processen med et tweet er alt for langsom. Der kan gå flere minutter, før jeg modtager en push-notifikation, og så er folk jo nok gået igen. Det må da for katten kunne lade sig gøre at sende et signal til en mobiltelefon i real time?!