Archiv pro měsíc: Únor 2013

Automatizovaný příjem snímků NOAA

Nejprve byla anténa QFH, pak softwarové rádio s čipsetem Realtek RTL2832U, pak byl software na ovládání rádia zvaný gqrx, který je založený na gnuradio a pak tu byl uživatel, který musel čekat, až přiletí satelit, čekat čtvrt hodiny a sehnat několik příkazů na vytvoření obrázku pomocí programu wxtoimg. Uživatele to přestalo bavit a tak si napsal skript, který sám sestaví obrázek a nahraje jej na web server. Pak ale musel napsat skript, který ty obrázky seřadí podle data pořízení. Jenže ani to mu moc nepomohlo a nezbylo nic jiného, než přemýšlet jak automatizovat úplně všechno. První problém bylo sehnat čas příletu družice na viditelnou část oblohy. Z GPredict se nějak viditelně vydolovat nedal. Díky dobré duši, která implementovala GPredict do jazyka PHP a zveřejnila kód se dala první část odškrtnout. Zdrojové kódy stáhnete zde. Predict.php všechno zařizuje, pro vaše potřeby využijte souboru visible_passes.php ve složce examples. Tento soubor si jen poupravte dle svých potřeb. Já potřeboval čas příletu a dobu, po kterou satelit zůstává na viditelné části oblohy. Tento skript neběží na webserveru, je volán cronem vždy po 4. hodině ranní, kdy začíná první část přeletů viditelných od nás a zkontroluje přelety na dalších 24 hodin. Zatím běží na klasickém PC, běh na Raspberry Pi ještě vyzkouším. Pokud skript neběží, možná jsem udělal chybu zde při úpravách, ale je téměř samovysvětlující, takže není problém jej opravit/předělat podle svých potřeb.

noaa.php

<?php
/**
 * This is an example of how to use Predict for determining upcoming visible
 * passes of the International Space Station.  Please read the inline comments
 * for details.
 *
 * Run this from the root checkout, not from examples, or the include paths
 * will not work.
 */

require_once 'Predict.php';
require_once 'Predict/Sat.php';
require_once 'Predict/QTH.php';
require_once 'Predict/Time.php';
require_once 'Predict/TLE.php';

function sortByAos($a, $b) {
   if ($a[2] == $b[2]) {
        return 0;
    }
    return ($a[2] < $b[2]) ? -1 : 1;
}
// Track execution time of this script
$start = microtime(true);

// The observer or groundstation is called QTH in ham radio terms
$predict  = new Predict();
$qth      = new Predict_QTH();
$qth->alt = 300; // Altitude in meters

// Munich, example east of the meridian
$qth->lat = 48.1505; // Lat North
$qth->lon = 11.5809; // Lon East

// The iss.tle file is the first 3 lines of
// http://celestrak.com/NORAD/elements/stations.txt
// Make sure you update this content, it goes out of date within a day or two
exec("wget http://celestrak.com/NORAD/elements/weather.txt -O ~USERNAME/.wxtoimg/weather.txt");
$tleFile = file('http://celestrak.com/NORAD/elements/noaa.txt'); // Load up the NOAA from celestrak
$indexes = array(19, 18, 15);
$list = array();

foreach ($indexes as $index){
	$index *= 3;  //3 rows for satellite
	$tle     = new Predict_TLE(substr($tleFile[$index], 5, 2), $tleFile[$index+1], $tleFile[$index+2]); // Instantiate it
	$sat     = new Predict_Sat($tle); // Load up the satellite data
	$now     = Predict_Time::get_current_daynum(); // get the current time as Julian Date (daynum)

	// You can modify some preferences in Predict(), the defaults are below
	//
	 $predict->minEle     = 0; // Minimum elevation for a pass
	 $predict->timeRes    = 5; // Pass details: time resolution in seconds
	 $predict->numEntries = 10; // Pass details: number of entries per pass
	 $predict->threshold  = 90; // Twilight threshold (sun must be at this lat or lower)

	// Get the passes and filter visible only, takes about 4 seconds for 10 days
	$results  = $predict->get_passes($sat, $qth, $now, 1);
	$filtered = $predict->filterVisiblePasses($results);

	$zone   = 'Europe/Berlin'; // Pacific time zone
	$format = 'H:i mdy';         // Time format from PHP's date() function
	$epoch  = 'U';

	// Format the output similar to the heavens-above.com website
	//echo "<tr><td>Sat\t<td>AOS\t<td>ELE\t<td>LOS\t</tr>";
	foreach ($filtered as $pass) {
	    if (round($pass->max_el) < 17){
	       continue;
	    }
	    $list[] = array($pass->satname, Predict_Time::daynum2readable($pass->aos, $zone, $format), Predict_Time::daynum2readable($pass->aos, $zone, $epoch), Predict_Time::daynum2readable($pass->los, $zone, $epoch), round($pass->max_el));
	}
}

//delete the pass with worse max elevation from overlaping ones
usort($list, 'sortByAos');
$i=0;
while ($i < (sizeOf($list)-1)){
	if ($list[$i][3] >= $list[$i+1][2]) {
		if ($list[$i][4] > $list[$i+1][4]){
			array_splice($list, $i+1, 1);
		} else {
			array_splice($list, $i, 1);
		}		
		continue;
	}
	$i++;
}

//echo $wake_date > /sys/class/rtc/rtc0/wakealarm

foreach ($list as $pass) {
    $cmd = "echo \"cd /home/USERNAME && ./apt ".$pass[0]. " ";
    $cmd .= $pass[3] - $pass[2] - 60;
    $cmd .= "\" | at -m ";
    $cmd .= "\"". $pass[1] . " +1 minute\"\n";
    
    exec($cmd);
    //echo $cmd;
}
//echo "Execution time:  " . number_format((microtime(true) - $start) * 1000, 2) . "ms\n"; 
exit;

Zde vidíte, že php skript stáhnete TLE pro sebe a wxtoimg, Predict vypočítá potřebné časy, které php zapíše do příkazu at. At spustí mnou připravený skript, který zaznamená vysílání ze satelitu a přechroupe záznam do podoby obrázku. Ten nahraje na webovou prezentaci meteostanice pomocí nástroje curl. Nezapomeňte upravit username.
Bash skript původně zpracovával nahrávky z gqrx, z této doby pochází ta skvělá konstrukce na čtení datového razítka na začátku skriptu. Využívá programu rtl_fm z balíčku od osmocom. Dále tam najdete sox (třeba nainstalovat) pro práci se zvukovým záznamem a samozřejmě WXtotImg (také doinstalovat).

apt.sh

#!/bin/bash

bandwidth=150k
login='LOGIN:PASSWORD'

#Freq +- 0.006 ?
case $1 in
15)freq=137.54M;;
17)freq=137.5M;;
18)freq=137.9065M;;
19)freq=137.092M;;
*)exit 1;;
esac

filename=`date -u +%Y%m%d-%H%M%S`.s16
timeout $2 /usr/local/bin/rtl_fm -f $freq -s $bandwidth > $filename
#timeout $2 /usr/local/bin/rtl_sdr $filename.bin -f $freq -s 1.8e6
if [ $? -ne 124 ]; then
	rm $filename
	exit 1
fi

if [ ! -f $filename ]; then
	echo "Soubor $filename neexistuje."
	exit 2
fi

#set variables 
date=`echo $filename | cut -d- -f1`
time=`echo $filename | cut -d- -f2 | cut -d. -f1`
year=`echo $date | cut -c1-4`
month=`echo $date | cut -c5-6`
day=`echo $date | cut -c7-8`
hour=`echo $time | cut -c1-2`
minute=`echo $time | cut -c3-4`
second=`echo $time | cut -c5-6`

output=$year$month$day$hour$minute$second.wav
hvc=noaa$1-$year$month$day-$hour$minute$second-hvc.png
no=noaa$1-$year$month$day-$hour$minute$second-no.png
mcir=noaa$1-$year$month$day-$hour$minute$second-mcir.png
tmp=noaatmp.wav
map=map.png
thumbnail=noaa.png

#QTH
lat=48.1505
lon=11.5809
ele=300
#dawn=7
#dusk=17
#day/night is determined by python script

sox -r $bandwidth -c 1 -L $filename $tmp
sox $tmp $output rate 11025

touch -r $filename $output

/usr/local/bin/wxmap -T "NOAA $1" -L"$lat/$lon/$ele" -G /home/USERNAME/.wxtoimg -p 0 -l 0 -od "$day $month $year $hour:$minute:$second" $map

/usr/local/bin/wxtoimg -c -e MCIR -m $map -t "NOAA $1" -o $output $mcir
/usr/bin/curl -T $mcir ftp://ftp.server/ --user $login

if [ $? -eq 0 ]; then
	convert $mcir -resize 25% $thumbnail
	/usr/bin/curl -T $thumbnail ftp://ftp.server/ --user $login
	
	/usr/local/bin/wxtoimg -c -e NO -m $map -A -t "NOAA $1" -o $output $no
	/usr/bin/curl -T $no ftp://ftp.server/ --user $login
	
	#hourt=`echo $hour | sed 's/^0//'`
	python ./sun.py
	if [ $? -eq 1 ]; then
		/usr/local/bin/wxtoimg -c -e HVC -m $map -A -K -t "NOAA $1" -o $output $hvc
		/usr/bin/curl -T $hvc ftp://ftp.server/ --user $login
		rm $hvc
	fi	
	rm $no $mcir $thumbnail $output
fi

rm $tmp $filename $map

exit 0

Pro určení zda je den či noc používám ne zcela přesný výpočet místního hvězdného času a jeho porovnání vypočteného času východu a západu Slunce, opět hvězdného. To vše kvůli senzoru 4, který se odesílá až hodinu po východu Slunce, zde je ještě prostor pro vylepšení.
sun.py

#!/usr/bin/python

from datetime import datetime
import time
import math

def days_between(d1, d2):
    return (d2 - d1).days + (d2 - d1).seconds/84600.0
    
def echo_time(t):
    print (math.modf(t)[1])+math.ceil((math.modf(t)[0])*60)/100

#QTH
lat = math.radians(48.1505)
lon = math.radians(11.5809)
ele = 300
utcoffset = 1

#Twilight
now = datetime.utcnow()
equinox = datetime.strptime("03-20", "%m-%d")
equinox = equinox.replace(now.year)

if days_between(equinox, now) < 0:
	equinox = equinox.replace(now.year - 1)

d = days_between(equinox, now)
lamb = math.radians(360.0/365.2422 * d)
print "Lambda=", math.degrees(lamb), "d=", d

beta = 0.0
epsilon = math.radians(23.5)

delta = math.asin(math.sin(lamb)*math.sin(epsilon))
alfa = math.acos(math.cos(lamb)/math.sqrt(1-math.pow(math.sin(lamb)*math.sin(epsilon),2)))
if math.sin(lamb)*math.cos(epsilon)/math.sqrt(1-math.pow(math.sin(lamb)*math.sin(epsilon),2)) < 0:
	alfa = 2*math.pi - alfa

ts = math.acos(-math.tan(lat)*math.tan(delta))
if ts>math.pi:
	t1 = ts
	t2 = 2.0*math.pi - ts	
else:
	t1 = 2.0*math.pi - ts
	t2 = ts
	
t1 = math.degrees(t1)
t2 = math.degrees(t2)
while t1 > 360:
    t1 -= 360
while t2 > 360:
    t2 -= 360
print alfa
riselst = t1+math.degrees(alfa)
dawnlst = t2+math.degrees(alfa)
while riselst > 360:
    riselst -= 360
while dawnlst > 360:
    dawnlst -= 360

print "rise in angle",
echo_time(t1/15.0)
print "in LST",
echo_time(riselst/15.0)
print "set in angle",
echo_time(t2/15.0)
print "in LST",
echo_time(dawnlst/15.0)
	
#JD
r=now.year
m=now.month
d=now.day + (now.hour+(now.minute+now.second/60)/60)/24
if m > 2:
    r = r - 1
    m = m + 12
JD = 1720994.5 + 365.25*r + r/400.0 +- r/100.0 + 30.6*(m+1) + d + 2.0
print "JD=",JD

#JD best
unix = time.time()
J = 2440587.5 + unix/86400.0
T = (J - 2451545.0) / 36525.0
TT = 64.184 + 59.0 * T - 51.2 * math.pow(T,2) - 67.1 * math.pow(T,3) - 16.4 * math.pow(T,4)
JTT = J + TT / 86400.0
d = JTT - 2451545.0
print "JD=",JTT
print d

# Sidereal time
J2k = datetime.strptime("2000-01-01 12:00 UTC", "%Y-%m-%d %H:%M %Z")
#d = days_between(J2k, now)
print d

GMST = 280.46061837 + 360.98564736629 * d
while GMST > 360:
    GMST -= 360
LMST = 280.46061837 + 360.98564736629 * d + math.degrees(lon)
while LMST > 360:
    LMST -= 360
print "GMST",
echo_time(GMST/15.0)
print "LMST",
echo_time(LMST/15.0)

if LMST > riselst or LMST < dawnlst:
    print "Day"
    exit(1)
else:
    print "Night"
    exit(2)

t = GMST + math.degrees(lon) + 1.00273790935*(now.hour+now.minute/60 - 1)
print "t=",
echo_time(t/15.0)

h = math.degrees(math.asin(math.sin(delta)*math.sin(lat)+math.cos(delta)*math.cos(math.radians(LMST))*math.cos(lat)))
print "h=", h, "d=",
echo_time(math.degrees(delta))

GPIO přerušení

Chodil jsem na přednášky a cvičení z „Céčka“ a tak vím, že existuje nějaké přerušení. Pro kontrolu vstupu se dá v základu použít přístup: spustím nekonečnou smyčku a co chvíli se budu dívat, zda se něco neděje, jenže to nelze dělat kontinuálně, proces si musí na chvíli oddychnout a nechat prostor dalším, v tu chvíli však nesleduje vstup a ten se může během krátké chvíle změnit, aniž by to program zpozoroval. Elegantnější cesta je nechat operační systém, aby sledoval tzv. přerušení. a ve chvíli, kdy k němu dojde o události spravil náš proces, který na to zatím čeká. Protože chystám provizorní časomíru, kterou bych i přesto chtěl mít co nejpřesnější, za pomoci RPi a vím, že běžné Linuxové jádro není real-time, vzpomněl jsem si na přerušení, které bych rád porovnal s externím zařízení v podobě čítače pulsů (viz astromik.org a jeho časomíra). Hledal jsem a nakonec našel.
Sice nejde o přerušení v pravém slova smyslu, ale zastane stejnou službu.
Vybereme si pin, já zvolil GPIO 15 (tj. P1-10) a dáme jej k dispozici programům jako vstup:

echo 15 > /sys/class/gpio/export
echo in > /sys/class/gpio/gpio15/direction

Zde jsem nalezl postup. Stahujte, upravujte a kompilujte, tam odkazovaný, soubor. Spusťte a sledujte veselá přerušení vždy, když se změní stav vstupního pinu. Podle jiného programu v pythonu, je časová prodleva mezi dalším přerušením do dt=0,002 s (včetně vypisování na obrazovku), což je dostatečné pro měření do řádu setin sekundy, ale pravděpodobně si to nezadá s měřením s rozlišením na 32×10-3 s, zajištěné externím čítačem.

Teploměr

Rád bych doplnil implementaci teploměru, o kterém si přečtěte povedený návod na stránce astromik.org pod položkou „15) Teploměr DS18B20“.

Pozor: GPIO4 je nyní špatně, teploměr funguje na GPIO18, alespoň u mě, pro ověření použijte dmesg | grep w1

Vytvořil jsem dva skripty, jeden pro záznam teploty a jeden pro vizualizaci dat. První je klasický bash skript čtoucí v cyklu data z teploměru, dokud se kontrolní součet neshoduje. Občas se totiž vyskytují v měření velké chyby, které se takto minimalizují. Skript zapisuje do souboru temps.log datum do prvního sloupce, čas do druhého sloupce a teplotu do třetího. Při zpracování je třeba teplotu vydělit tisícem. Skript lze volat cronem, já zvolil desetiminutový interval, vše je na libovůli. Nezapomeňte však použít ID vašeho teploměru, řetězec znaků mezi devices/ a /w1_slave je pro každé zařízení jedinečný.

#!/bin/bash

if [ -e /sys/bus/w1/devices/28-000001b44be4/w1_slave ]; then 

 txt=`cat /sys/bus/w1/devices/28-000001b44be4/w1_slave`

 while  [ "$(echo $txt | grep 'NO')" != "" ]; do
  txt=`cat /sys/bus/w1/devices/28-000001b44be4/w1_slave`
 done
 temp=`echo $txt | grep t= | cut -d '=' -f3`
 echo `date +%F%t%T%t`$temp >> ~pi/temps.log
fi

Druhý je skript pro gnuplot, který musíte předem nainstalovat. Části jsem sehnal na různých místech v nápovědách a jiných článcích, protože je to poprvé, kdy s gnuplot pracuji přímo:

#!/usr/bin/gnuplot

set terminal png size 1280,960
set output 'temperature.png'
set title "Inside temperature"
set xlabel "Time"
set ylabel "Temperature [C]"

set style line 11 lt 1 lw 0.5 lc rgb "#AAAAAA"
set style line 12 lt 0 lw 0.1 lc rgb "#DDDDDD"
set mxtics 2
set mytics 4
set grid xtics ytics, ls 11
set grid mxtics mytics, ls 12

set xdata time
set xtics rotate by -12
set timefmt "%Y-%m-%d %H:%M:%S"
set format x "%d.%m. %H h"
plot "temps.log" using 1:($3)/1000 title "Temperature" with lines

Mám tak hotovou první část své budoucí meteostanice.

Konec jedné SIM karty

Sám volám přes internet se službou Voocall. Trochu nepohodlí vyváží bohatě cena, kterou jsem již ochoten platit za telefonní služby. Takže mám předplacenou službu, bez závazku, se kterou volám za 1 či 2 Kč do mobilní sítě a za 0,6 či 1,2 Kč do sítí pevných a to vše se sekundovou tarifikací. Prvním kreditem byla stokoruna na vyzkoušení a přesto, že jsem se přestal v hovorech krotit (ne že bych volal bez přestávky, ale při ceně 6,9 za každou minutu jsem si vždy rozmyslel, zda je nutné zmáčknout zelené tlačítko), jsem milou stokorunu zlikvidoval až za více než 3 měsíce. To je jen úvod, jak jsem se stal rodinným telefonním aktivistou.
A tak když jsem viděl, že můj otec s „kreditním tarifem“ od T-Mobile platí za minutu téměř to co já s jejich předplacenkou a ještě jim pravidelně posílá ne základních 300 Kč ale někdy i 500 či 600 začal jsem pro něj hledat cestu ven. Tou cestou byl přechod do programu, který poskytuje 02 pro různé spolky a zájmové skupiny. Ač se mi 02 nelíbí ze všech nejvíc, byla to snad rozumná volba. Tam nám totiž za poloviční cenu nabídli stejně volných minut a po jejich provolání nižší cenu za minutu hovoru. Zkoušel jsem se domluvit s T-Mobile, zda nejsou schopni dorovnat nabídku, abych nemusel podstupovat přenos čísla (a to jsem ještě nevěděl, že to bude horší než jsem si představoval). Nebyli schopní nabídnout nic podobného, jen poloviční slevu na paušál, ale to pořád nestačí při jejich cenách a tak nezbývalo než dát sbohem, stihnout měsíc před koncem smlouvy podat pro jistotu výpověď, protože jsem nechtěl riskovat prodloužení smlouvy, i když jsem se na to několika operátorů ptal, žádný mě nedokázal dostatečně ujistit, že číslo přejde na předplacenku bez mého přičinění. Paradoxně až podáním výpovědi se věci začaly hýbat, volali a nabízeli, posílaly zprávy, že můžeme uzavřít smlouvu atd. ale to už bylo pozdě. Nejlepší na celém bylo, že v momentě, kdy karta přešla na předplacenou, nabídli volání za 2,5 Kč na nějakou dobu, čímž bychom se dostali hluboko pod cenu dosud využívaných služeb.
Mezitím bylo třeba poslat smlouvu směrem 02, to jsem bohužel prošvihl a když nastalo ukončení smlouvy k 22.1.2013, bylo ještě třeba počkat do 5.2.2013 na přenos čísla. Navíc T-Mobile začal dělat problémy s přenosem čísla. Když jsem zaslali smlouvu, bylo číslo ještě „tarifní“ a když jsem zadával kód pro přenos do webové samoobsluhy, bylo již „předplacené“. Druhý den píší, že jsme nesplnili podmínky pro přenos čísla, tak pátrám, volám kam mě jen napadne a dozvím se, že když se žádalo o přenos pro tarifní číslo nelze ho dokončit, když je teď předplacené. No dobře. Volám do 02 a slečna tvrdí, že pokud by vyprodukovali nový kód pro přenos, byl by naprosto totožný a T-Mobile takto zcela běžně dělá obstrukce. Dělat může, stejně už u nich neprovoláme ani korunu, protože máme mezitím od 02 další kartu s novým číslem. Volám zpět na T-Mobile a nutím operátora přenos potvrdit, ale jsou dobře vyškolení a odolní. Tohle se opakuje ještě několikrát, když tvrdím, že už mám nové číslo pro přenos (když už má být stejné), nakonec tam celou objednávku přenosu čísla smazali a musel jsem stejně objednávat další. Přenos čísla se posunul až na 12.2.2013 a to je právě dnes.
Celou věc řeším dva a půl měsíce — zjišťování, podání výpovědi měsíc předem, podání smlouvy s novým operátorem, snad hodina hovorů s různými lidmi na infolikách. Snad to stálo za to.paegas

FET přepínač/switch

Ač nejsem elektrotechnicky vzdělán a mám mlhavou představu o funkci součástek (mlhavější, než bych si představoval), povedlo se mi vytvořit elektronické relé. Totiž můj problém je na světě snad jedinečný. Měřím sepnutí koncových spínačů na vzdálenost 100 m. Na to už je potřeba nějaký zdroj, takže vezmu autobaterii (jedná se vždy o dočasnou instalaci). Jenže jemná elektronika připojená k PC by to nejspíš nezvládla napřímo a tak vezmu 12 V relé a spínám s ním. Zde je rozkol mezi mým a běžným užitím relé. Nižším napětím se obvykle ovládá vyšší, u mě naopak. A pak máte Raspberry Pi, ke kterému potřebuji vyvést ke GPIO kolíku 3,3 V v případě, že je uzavřen 12 V vnější obvod, navíc to potřebuji co nejrychleji, to mi mechanické relé nezajistí. Protože jsem k Raspberry pořídil n-kanálový FET BS107 jako měnič mezi hladinami 5 V a 3,3 V pro připojení příslušenství. Doufal jsem, že půjde udělat i přepínač, který si představuji. Dlouho jsem hledal a nic nenašel, až jsem se jal dělat pokusy a nakonec na to přišel. Řekl jsem si, že tranzistor otevírá napětí na GATE, přivedl jsem tam tedy 12 V od spínače, k SOURCE jsem připojil společnou zem (GND) přes odpor, měl jsem tady zrovna několik kousků 330k navíc, jistě by to chtělo propočítat. Nu a k DRAIN jsem připojil zatím 5 V, v rámci vývoje. Nyní po stisku tlačítka spínače na 12 V větvi, jsem multimetrem naměřil na nožičce SOURCE kýžené nižší z obou napětí. Po uvolnění tlačítka tam však zůstávalo, vzal jsem tedy ještě jeden 330k rezistor a píchnul jej mezi GATE a GND s tím, že náboj či co tam zůstává vybije do země. Stalo se, a přepínač funguje. Zbývá jen zjistit, zda by nestačil nějký levnější a běžný tranzistor, zda je FET opravdu nutný, stejně jako velikosti rezistorů připojených do země.

LED je úmístěna špatně, oprava dole. / LED is wrong placed, explanation is at the end of article.
fet_switch

EDIT: Vyzkoušel jsem mnohem levnější BS170, hlavní rozdíl je v maximálním napětí 200 V oproti 60 V, to však v mém případě vůbec nevadí. Na GME dostanete datasheet od Philips, ale na první pohled byly obrácené nožičky Source a Drain, Při zapojení podle Datasheetu mi to neběhalo, na údajné Source nožičce bylo pořád napětí. Vsadil jsem pouzdro stejně jako předchozí BS107 a funguje, tak jak já očekávám, kde je tedy chyba?

EDIT 10.3.2013: Po sestavení zkušební desky se ukázalo, že pin nastaveny v RPi jako vstupní je obdařen velkou impedancí a dioda se, dle mého prvotního nápadu, nerozsvítí. Stačí jednoduše přehodit LED na větev jdoucí ze SOURCE do země a je po problémech. I přesto, že se LED nerozsvítí, obvod fungoval dle předpokladů, dioda tam ani být nemusí, je určen obsluze pro kontrolu sepnutí koncového snímače.mosfet_switch

Ultrazvukový měřič vzdálenosti

Koupil jsem jej z DX.com, má označení HC-SR04, hledal jsem návod jak modul zprovoznit a našel odkaz na stránku http://www.raspberrypi-spy.co.uk/2012/12/ultrasonic-distance-measurement-using-python-part-1/. S malou obměnou vše funguje. Místo děliče napětí jsem zařadil N-kanál FET BS107, dle návodu na připojení I/O expanderu portů. Ten oddělí napěťové hladiny 3,3 V pro RPi a 5 V pro modul. Jako pull-up resistor jsem použil včera omylem koupený 330 kOhm, ale funguje to i s 10 k potenciometrem protaženým přes krajní svorky. To je vše, program ze stránky raspberry-spy funguje bez potíží.

ADS-B na RTL SDR

Přesunul jsem RTL krabičku z testování na osobním počítači do mého Debianího serveru. Na Debianu mají příznivci softwarového radia balíky gnuradio už předkompilované, zkompilovat jsem ovladače z v4l podle článku na wiki.ubuntu.cz, věnujícímu se právě těmto televizním krabičkám a dále zkompiloval balíčky rtl_sdr, mezi nimiž je i rtl_tcp. Můžu tedy ovládat softwarové rádio přes síť z jiného počítače například mým oblíbeným gqrx. Protože zajímavým zdrojem radiem přenášených dat jsou letadla, pátral jsem, jak si udělat vlastní flightradar24.com s pomocí rtl_adsb a dlouho nic nenašel. Až na blogu G4VXE jsem narazil na referenci k programu dump1090 a ten funguje velmi pěkně. Dokonce chytám data v pásmu 1 GHz stále na tu všesměrovku pro 137 MHz, nicméně dosah není nijak závratný. Postup je snadný:

git clone git://github.com/antirez/dump1090.git

cd dump1090
make

A spustíme v pěkném přehledovém zobrazení příkazem

./dump1090 --interactive

Získám informace z letadel do vzdálenosti 200 km, spíše však méně, víc uvidím s lépe naladěnou anténou.