Archiv der Kategorie: Software

(M)eine kleine Wetterstation mit einem Raspberry Pi (Teil 5)

Vorbereitung für die Ausgabe der Daten

Node-Red Sicherheit

Sobald die Wetterstation aus dem lokalen Netzwerk auch im Internet erreichbar ist, kann jeder, der die IP-Adresse kennt und Zugriff auf den Port hat, die Bedienoberfläche erreichen und alle Veränderungen in meinen Programmierungen vornehmen, die er möchte. Damit das nicht passiert, sichere ich den Zugang mit einem Benutzernamen und Kennwort ab. Beschrieben wird der Vorgang auf der Seite Node-RED : Security unter diesem Link: https://nodered.org/docs/security Die erforderliche Einstellung dazu wird in der Datei ~/.node-red/settings.js vorgenommen. Zusätzlich habe ich dazu Tool node-red-admin installiert. Das ist übrigens auf der Seite Node-Red : Command-line Administration unter diesem Link beschrieben: https://nodered.org/docs/node-red-admin.

Raspberry Pi aus dem Internet erreichbar

In meinem Router gebe ich für den Raspberry Pi den (Standard-) Port 1880 frei. Nach einem Neustart von Node-Red mit

oder Neustart des Raspberry Pi ist der Zugang zur Entwicklungsoberfläche aus dem Internet nun über diesen Link erreichbar: dl8aap.ddns.net:1880. Wie man eine solche DynDNS-Adresse einrichtet. steht in vielen Beiträgen im Internet und soll nicht Bestandteil meiner Aufbaubeschreibung sein.

Installation Node-Red-Dashboard

Damit Daten auf einer Webseite im Internet dargestellt werden können, muss das Node-Red-Dashboard nachinstalliert werden.

Ich melde mich mit meinen Zugangsdaten an der Entwicklungsoberfläche an und installiere das Dashboard über den Paletten-Manager:

Über die Seite Palette wähle ich den Tab Install (1) und suche nach dashboard (2). Ich wähle den Eintrag node-red-dashboard und klicke auf den kleinen Button install (3). Das dauert nun eine Weile, bis der Button Close erscheint. 

Mit Close (4) schließe ich den Palettenmanager, und es stehen jetzt die Dashboard-Elemente zur weiteren Verwendung zur Verfügung. Im Grunde sind dies alles Elemente, die zur Darstellung auf (m)einer Internetseite benutzt werden können. Es stehen einige Tausend Nodes zum Download bereit. Es dürfen auch eigene Nodes erstellt werden.

Bei jeder Änderung wechselt der Button Deploy auf rot.

Mit einem Klick auf Deploy (1) werden dann die Änderungen gespeichert und übernommen und die neue Ausgabe erzeugt. Diese Ausgabe kann ich mir anschauen mit Klicken auf das Grafik-Symbol (2) und auf das Link-Symbol (3).

Da ich noch keine Elemente (UI nodes) hinterlegt bzw. programmiert habe, begrüßt mich Node-Red entsprechend und weist mich freundlich darauf hin noch einige Elemente in einen Flow hinzuzufügen und auszuliefern.

Der erste Flow

Ein erster Test könnte so aussehen:

Aufgabe: Gib mir jede Sekunde die aktuelle Rechnerzeit aus.

Lösung: Dazu platziere ich einen inject-node und einen debug-node auf die Arbeitsoberfläche und verbinde die beiden Nodes.

Ich öffne mit einem Doppelklick den inject-node. Im Edit-Fenster ändere ich den Repeat-Modus auf interval und stelle auf every 1 seconds. Die blauen Punkte zeigen an, dass eine Veränderung an diesem Knoten vorgenommen, aber noch nicht gespeichert wurde. Ein Klick auf Done, und der Node ist programmiert. 

Der debug-node ist schon passend vorbereitet, um eine Nachrichtenladung msg.payload vom inject-node im Debugfenster darzustellen.

Mit einem Klick auf Deploy wird dieser kleine Flow 1 gespeichert und ausgeliefert.

Jetzt erscheint im Debug-Fenster jede Sekunde die Ausgabe der aktuellen Rechnerzeit. Aber 1536668952289? Das ist die Unix-Zeit in Tausendstel Sekunden beginnend mit 1.1.1970 00:00 Uhr, die im Raspberry Pi läuft. Umgerechnet ist das 11.09.2018 14:32:03.289 Uhr.

 

Test des Internet-Dashboard

Aufgabe: Gib mir alle 7 Sekunden den Rückgabewert eines Internet-Ping von www.google.de und zeige den aktuellen Wert in einem Gauge-Knoten, sowie die Werte der letzten 12 Stunden in einer Liniengrafik auf dem Dashboard (für das Internet).

Lösung: Zunächst muss eine Oberfläche für das Dashboard vorbereitet werden. Node-Red weiß sonst nicht, wohin es die Elemente platzieren soll.

In der Sektion dashboard den Tab Layout wählen. Nun den Button +tab klicken. Damit wird quasi eine neue Seite erzeugt. Hinter diesem neuen Tab 1 kann man mit edit die Eigenschaften dieses Tabs anpassen. Ich wähle den Namen Home und bestätige dies mit Klick auf Update. Hinter dem neuen Home-Tab klicke ich auf +group. Es wird eine quasi eine Matrix für die neue Seite angelegt. Hierauf können die Ausgabe-Knoten ausgerichtet werden.

Jetzt platziere ich die notwendigen Nodes. Ein Ping-Node, ein Gauge-Node und ein Chart-Node und verbinde sie untereinander.

Doppelklick auf den Ping-Node öffnet den Edit-Modus. Hinter Target gebe ich ein: www.google.de. Hinter Ping (S) gebe ich ein: 7 und bestätige mit Done. Dieser Knoten sendet einen Internet-Ping alle 7 Sekunden an Google.de

Doppelklick auf den Gauge-Node öffnet den Edit-Modus. Hinter Group wähle ich aus der Auswahlbox den Eintrag Group 1 [Home]. Damit wird dieses Element auf die zuvor erzeugte Matrix gesetzt. Hinter Units gebe ich ein: ms, weil der Ping seine Nachrichtenladung in Millisekunden übergibt. Die Range bestimme ich mit min=0 und max=300. Bestätigung mit Done.

Doppelklick auf den Chart-Node öffnet den Edit-Modus. Hinter Group wähle ich aus der Auswahlbox den Eintrag Group 1 [Home]. Damit wird dieses Element ebenfalls auf die zuvor erzeugte Matrix gesetzt. Hinter x-axis gebe ich ein: last 12 hours. Hinter Y-axis gebe ich für min=0 und max=300 ein. Bestätigung mit Done.

Nun den Flow mit Deploy ausliefern und das fertige Ergebnis über das Link-Symbol anschauen.

Die Aufgabe ist somit erfüllt, das Dashboard funktioniert zur vollen Zufriedenheit.

Node-Red bietet die Möglichkeit den entwickelten Flow zu Speichern bzw. als Backup auszugeben. Das geht über den Menü-Button, Export und Clipboard. Der Flow wird damit in die Zwischenablage exportiert.

Über die Funktion Import kann so ein vollständiger Flow z.B. von Dritten oder aus einem Backup importiert werden.

In der folgenden Box ist das “Skript” für den obigen Flow enthalten. Per Copy & Paste kann der Flow importiert werden.

Für alle weiteren Aktivitäten mit Node-Red empfehle ich das Studium des Node-Red Kochbuchs hinter diesem Link: https://cookbook.nodered.org/

Im Internet finden sich auch eine Menge Beiträge, die die unterschiedlichsten Themen zum Node-Red behandeln. Auch ich bin hier für ein paar spezielle Dinge schnell fündig geworden, die ich im weiteren Verlauf meines Installationsberichtes gerne weitergebe.

Ich denke es ist nun an der Zeit mit meiner Beschreibung im Teil 6 mit der Auswahl der passenden Sensoren am Raspberry Pi und die Verbindung mit dem Node-Red fortzufahren.

 

 

(M)eine kleine Wetterstation mit einem Raspberry Pi (Teil 4)

Weitere Grundkonfiguration des Raspberry Pi

Der Löwenanteil von Software ist auf dem Raspberry Pi nun erstmal vorinstalliert. Jedoch soll noch die IP-Adresse des Gerätes festgelegt werden. Eigentlich ist das nicht nötig, aber ich möchte das Gerät später in einer anderen Umgebung betreiben, in der ausschließlich mit festen IP-Adressen gearbeitet wird.

Festlegen der statischen IP-Adresse

Die Einstellung findet statt in der Datei /etc/dhcpcd.conf. Vorher aber muss man sich den Namen der momentanen Schnittstelle ausgeben lassen. Das passiert mit der Eingabe von 

Das Ergebnis sieht dann in etwa so aus:

Kenner haben nun gesehen, dass es die altbekannte Bezeichnung eth0 nicht mehr gibt. Dafür gibt es nun eine eindeutige Zuordnung der Bezeichnung, beginnend mit enx und nachfolgend der MAC-Adresse der Schnittstelle, hier rot umrandet. Diese Bezeichnung merke ich mir und werde sie gleich in die Datei /etc/dhcpcd.conf zur weiteren Bearbeitung eintragen.
Warum es keine eth0-Bezeichnung mehr geben soll, oder wie man das System wieder in diese Form versetzen kann, ist ausführlich an anderen Stellen im Internet beschrieben.

Ich starte den Midnight Commander mit sudo mc und editiere die Datei /etc/dhcpcd.conf.

Weiter unten In den letzten Zeilen finde ich den Eintrag # Example static IP configuration und setze die vier Zeilen dadrunter wie folgt:

Alles andere bleibt erstmal so wie es ist.

Ich setze die IPv4-Adresse nun fest auf 192.168.80.80 mit der Subnetzmaske 255.255.255.0. Das sagt die Angabe von /24 aus. Mein Router hat die Adresse 192.168.80.200. Danach wird die Liste der DNS-IPs angegeben, sie lauten Google1-DNS, Google2-DNS, Router-DNS. Sorry, ja Google-DNS (sorry) bietet neben den Telekom und Vodafone Servern einen ziemlichen Geschwindigkeitsvorteil.

Die oben genannten privaten IP-Adressen (192.168.x.y) sind natürlich in anderen Netzwerken entsprechend anzupassen.

Nach dem Speichern der Datei und einem Neustart des Raspberry Pi bekommt dieser statt der IP-Konfiguration vom DHCP-Server nun die IP-Konfiguration aus der soeben angepassten dhcpcd.conf. Bei einem Wechsel in ein anderes Netzwerk kann ich nun später bequem die Einstellung an dieser Stelle anpassen.

IPv6 Protokoll deaktivieren

Um IPv6 dauerhaft zu deaktivieren, sollte man erstmal feststellen, ob IPv6 aktiviert ist. Das bekommt man heraus mit der Eingabe von

Nun werden bei aktiviertem IPv6 Einträge markiert ausgegeben. Ansonsten ist die Ausgabe leer. Mit den folgenden zwei Eingabezeilen wird die Datei /etc/sysctl.conf um einen Eintrag ergänzt,

Nach einem Neustart des Raspberry Pi sollte nun IPv6 deaktiviert sein. Das kann wieder mit dem obigen Befehl kontrolliert werden. Auch die Ausgabe von ifconfig bestätigt die Änderung

Wenn man diese nun letzte Zeile in dieser Datei entfernt und den Raspberry Pi neu startet, ist IPv6 wieder aktiviert. Ob man IPv6 wirklich deaktivieren sollte oder nicht, ist in jedem Anwendungsfall unterschiedlich. Es gibt mittlerweile einige Webseiten-Betreiber, die ihre Anschlüsse auf IPv6 umgestellt haben. In meinem Fall aber brauche ich dieses Protokoll nicht.

Die richtige Uhrzeit

In meinem Netzwerk wird die Uhrzeit schon vom Router bezogen. Dafür haben auch bereits die Einstellungen im Konfigurationsprogramm raspi-config gesorgt. Siehe dazu bitte den Beitrag “(M)eine kleine Wetterstation mit einem Raspberry Pi (Teil 2)” meines Tagebuches. Da sind auch die Umschaltungen von Sommer- und Winterzeit schon inbegriffen. Das lasse ich auch erstmal so. Wer das allerdings ändern möchte, ist z.B. hier gut beraten: https://linuxconfig.org/how-to-setup-ntp-server-and-client-on-debian-9-stretch-linux

Im Standard arbeitet der Raspberry Pi mit seinem Linux in der UTC-Zeit – genau das richtige für den Amateurfunk, denn diese ist auf unserer Erdkugel überall gleich.

RTC?

Allerdings überlege ich mir, wenn das Gerät irgendwo alleine ohne Netzwerk stehen sollte, ob ich ihm nicht eine batteriegepufferte RTC, eine sog. Real-Time-Clock einsetze. Wie das mit einer kleinen preisgünstigen I2C-Schaltung geht, kann man hier erfahren: https://tutorials-raspberrypi.de/raspberry-pi-rtc-modul-i2c-echtzeituhr/

GPS?

Auch der Einsatz und Zeitabgleich mit einem GPS-Modul könnte in einem Nebenprojekt münden. Und wie das geht, kann man hier nachlesen: https://raspberry.tips/projekte/gps-tracking-mit-dem-raspberry-pi

Im nächsten Teil 5 geht es um die Einrichtung des Node-Red-Dashboards und weiterer Bausteine für die Sensoren.

 

(M)eine kleine Wetterstation mit einem Raspberry Pi (Teil 3)

Installation der Grundprogramme

In diesem Teil 3 wird dem Raspberry Pi nun weitere Software verpasst, die für mein Dafürhalten unerlässlich sind. Mit dem Rasperry Stretch Lite müssen auch keine Softwarepakete entfernt oder deaktiviert werden, die nur unnötig Ballast sind/waren: keine Wolfram-Engine, kein Libre-Office, kein grafischer Desktop oder Programmiertools. Aber einige kleine Helferlein braucht es dann doch:

MC – Der Midnight Commander

Bekannt aus den früheren Jahren der Computerentwicklung ist dieser Dateimanager auf der Konsole ungeschlagen. Selbst FTP-Verbindungen oder Zugriffe auf entfernte Systeme sind in diesem Programm integriert. Die Installation gelingt mit der Eingabe von

Der Aufruf des Programms erfolgt mit

Um auch Sudo-Rechte für das Dateisystem zu bekommen startet man das Programm mit 

Bei der Frage welcher Editor künftig benutzt werden soll, entscheide ich mich für mcedit. Aber hier kann jeder selbst entscheiden, was ihm am nächsten ist.

Mit F10 beendet man das Programm.

HTOP

HTOP ist ein erweitertes Werkzeug zur Überwachung der Tasks und Dienste, sowie die CPU und Speicherauslastung. Die Installation erfolgt mit

Der Aufruf erfolgt mit

oder

Mit F10 beendet man das Programm.

Node-Red

Für die programmierbare Visualisierung von Daten benutze ich das Programmpaket Node-Red. Es ist von IBM unter Java entwickelt und bietet in einer grafischen Verwaltungs- und Programmieroberfläche auf Webbasis eine Vielzahl von Knoten (Nodes), die im Baukastenprinzip untereinander verbunden werden können. Meine These: “Mit Node-Red bekommst Du den Kaffeegenuss im und über das Internet voll unter Kontrolle.” Die Programmierung dieser Flussdiagramme (Flows) erfolgt ausschließlich auf der Weboberfläche, sowie auch das Veröffentlichen auf der eigenen Webseite.

Beispiel eines Flows. By 1-ByteOwn work, CC BY-SA 4.0, Link

Für meine Experimente ist Node-Red genau das richtige Werkzeug, um meine Sensoren, Aktoren und alle Kontrollmechanismen über eine Oberfläche zu verwalten und zu betreiben.

Install und Upgrade

Die Installation nehme ich vor, wie im Internet beschrieben. Über diesen Link kommt man auf die Node-Red Organisations-Webseite: https://nodered.org/docs/hardware/raspberrypi

Auf der Konsole des Raspberry Pi startet man die Installation mit folgendem Kommando:

Die folgenden Fragen können mit y beantwortet werden. Dann startet die Installation des kompletten Node-Red-Paketes inklusive der Pi-spezifischen Nodes. Das dauert etwa 15 Minuten. Die aktuelle Version ist die 0.19.2.

Bei Upgrades kann immer wieder der obige Befehl benutzt werden.

 

Sobald fertig, starte ich Node-Red das erste Mal mit der Eingabe von

Im Standard wird der IP-Port 1880 für Node-Red benutzt. Über einen Internet Browser startet man nun in der Adresszeile http://<IP-Adresse des Raspberry Pi>:1880 die Entwicklungs-Oberfläche von Node-Red auf dem Raspberry Pi. Also in meinem Fall von meinem lokalen Firefox: http://192.168.80.80:1880.

 

Node-Red-Dienst starten / stoppen

Damit Node-Red bei jedem Neustart des Raspberry Pi startet, wird mit dem folgenden Befehl der Dienst von Node-Red aktiviert. Vorher beende ich das laufende Node-Red mit Strg-C (womit man im Linux so einige Programme abbrechen kann) und gebe dann den Befehl ein, so wie es auch schon in der Konsole als Information ausgegeben wurde:

Stoppen bzw. Deaktivieren kann man den Dienst wieder mit

Mit einem Neustart des Raspberry Pi überprüfe ich die gewünschte Funktion.

und stelle nach ein paar Sekunden die volle Funktionalität im lokalen Browser fest.

Also ist erstmal alles gut und ich kann anfangen den ersten Sensor anzubinden

Weiter geht es mit “(M)eine kleine Wetterstation mit einem Raspberry Pi (Teil 4)”

WebSDR Server von sdr.hu = OpenWebRX

Zum Testen für die Relaisstation auf dem Ravensberg DB0RVB habe ich auf meinem Linux-Mint-Rechner die Installation der OpenWebRX-Software vorgenommen. Das Ziel ist es auf dem Standort mitten in Deutschland für das 2m-Band ein WebSDR zur Beobachtung von Ausbreitungsbedingungen vorzuhalten.

Die Materialliste sieht in etwa so aus:

  • 1 Linux-Rechner mit Internetanbindung
  • 1 DVB-T-Stick mit RTL-Technologie
  • 1 Rundstrahlantenne mit horizontaler Polarisation
  • 1 Software von András Retzler OpenWebRX
  • 1 Feste IP-Adresse (z.B. DynDNS) für den öffentlichen Auftritt
  • nicht vergessen: Stromversorgung, Verbindungs- und Antennenkabel etc.

Ob ein Raspberry für diesen Zweck ausreicht, muss ich noch ausprobieren. Bei meinem Brackel-Rechner mit Intel Dual-Core wird die CPU aber schon sehr belastet. Ein Pi2 sollte mit seinen vier Kernen vielleicht schon ausreichen. Kann ich nicht testen, weil ich habe im Moment keinen. Allerdings wollen wir auf dem Relaisstandort recht stromsparend arbeiten. Netzteile mit 60W und mehr sind quasi tabu.

Die Installation ist recht schnell und einfach, wenn man sich an die Installationsanleitung von András hält. Die bekommt man hier: http://blog.sdr.hu/2015/06/30/quick-setup-openwebrx.html

Nachdem dann auch mit einem Editor die ../openwebrx/config_webrx.py mit meinen Daten ausgestattet wurde, startet man den SDR-Server mit

cd ../openwebrx
./openwebrx.py

 

Aufruf des Clients am lokalen Browser mit http://localhost:8073.

So habe ich noch einen DynDNS-Eintrag spendiert, um aus dem Internet auf den Server zugreifen zu können: http://dl8aap.ddns.net:8073

Durch eine pfiffige Kompression des Datenstroms ist die Netzwerkbelastung ziemlich schlank. Statt 2MBit/s fahren nur noch 200k/s durch die Leitung.

So in etwa soll es dann aussehen:

Gut zu erkennen ist bei 145,750 MHz der Kabelkanal S6 mit einem unnötigen Sender. Um den zu entfernen, arbeite ich grad an einem Sperrfilter für meine Kabelanlage. Und der Nachbar bekommt dann auch gleich eines verpasst…!

Datenübertragung im Subaudiobereich

Im Amateurfunk wird es auf den frequenzmodulierten VHF und UHF-Bändern immer enger. Die Bandbreiten schrumpfen. Wenn man also mal eine Datenübertragung parallel zum Träger und der Sprachsignale übertragen will (ähnlich RDS im UKW-Rundfunk), bleibt eigentlich nur noch der Bereich unter 300 Hertz. Normalerweise ist dieser Bereich für CTCSS-Töne “reserviert”. Also nutzen wir sie doch experimentell… Sprachfrequenzen werden im Audiobereich 300 … 2700 Hz übertragen. Da stört sich also nix.

Hier eine Idee, wie man z.B. einen Arduino Nano beibringen könnte Daten in diesem Bereich dem Trägersignal hinzuzusetzen. Die eingebaute Tone()-Funktion erzeugt 5V-Rechtecksignale von 31 … 65535 Hz. So also mal schnell ein Arduino-Sketch niedergeschrieben und in den Nano geschoben:

Fakt ist: Die tone()-Funktion des Arduino kann nur unsigned int Werte annehmen. Bis hinunter zu 31 Hz kann ein Signal unterhalb 300 Hz erzeugt werden. Aber eben nur ganzzahlige Werte. Ein CTCSS-Pilotton von 88,5 Hz ist demnach nicht darstellbar. Was bleibt ist die Erzeugung der 10-fachen Frequenz und dann mit einem Teiler-IC durch 10 zu teilen. Das kann dann ein CD4018 erledigen, also 885 : 10 = 88,5.

Hier die Idee:

CD 4018 Beschaltung als Teiler durch 10

CD 4018 Beschaltung als Teiler durch 10

Hier der aktuelle Arduino-Sketch:

/*
  Dieser Sketch wurde mit dem Arduino Nano entwickelt
  und sollte aber auch auf allen anderen Arduinotypen lauffähig sein.
  Ich hatte eben keinen anderen, die Dinger sind so saubillig geworden...
  Natürlich kann man immer etwas verbessern, also tu es, ich tu auch was
  
  Carsten Koch, DL8AAP - Letzter Stand 22.9.2016
*/

// Der Timer muss eingebunden werden
#include "TimerOne.h"

//            0   1   2   3   4   5   6   7   8   9  Beg End
int T[12] = {915,693,710,719,744,770,797,825,854,885,670,2541}; // CTCSS-Frequenzen mal 10 in Hertz, werden später durch Hardware durch 10 geteilt
int dur = 180;                                                  // Dauer eines Datenbits in ms
int dur_roger = 120;                                            // Dauer des Rogerbeep in ms
int freq_roger = 3000;                                          // Frequenz des Rogerbeep in Hertz
int dur_break = 500;                                            // Pause zum nächsten Datenwort in ms
int pin_id = 10;                                                // Ausgabepin für die zu sendende String-ID
int pin_roger = 11;                                             // Ausgabepin für den Rogerbeep
String ID = "1234567890";                                       // zu sendende Ziffern
String zeichen = "";                                            // Puffervariable
int x;                                                          // Puffervariable
int pttPin = 7;                                                 // Pin 7 ist HIGH, schaltet nach Masse auf LOW als PTT gedrückt
int ledPin = 13;                                                // Visuelle Darstellung des PTT-Status
long intervall = 10000;                                         // Timerintervall in µsek
int send_id = 1;                                                // 0=String-ID aus, 1=String-ID an
int send_roger = 1;                                             // 0=Rogerbeep aus, 1=Rogerbeep an
int play = 0;                                                   // Zusatzvariable für den Rogerbeep

void setup() {
  pinMode(pttPin, INPUT_PULLUP);             // pttPin wird als Input mit einem Pullup-Widerstand auf HIGH gesetzt
  pinMode(ledPin, OUTPUT);                   // ledPin wird als Output gesetzt
  Timer1.initialize(intervall);              // Der Timer wird mit dem Timerintervall gesetzt
  Timer1.attachInterrupt(switch_ptt_state);  // Die Funktion switch_ptt_state wird als Timer-Funktion gesetzt
}

void loop() {
  // In der loop() wird der ID-String an der pin_id ausgegeben
  // aber nur, wenn der Schalter send_id auf 1 steht
  if (send_id == 1) {
    start_id();
    for(int i = 0; i&lt;ID.length(); i++) {
      zeichen = ID[i];
      x = zeichen.toInt();
      play_id(T[x]);
    }
    end_id();
    pause_id();
  }
}

// Weitere eigene Funktionen

void switch_ptt_state() {
  // Diese Funktion wird vorrangig vor der loop()-Funktion aufgerufen
  //digitalWrite(ledPin,digitalRead(ledPin)^1);
  if (digitalRead(pttPin) == LOW) {
    // Wenn die PTT getastet wird = LOW, dann sind wir im TX-Modus
    //ptt = tx;
    digitalWrite(ledPin,HIGH); // Lass die TX-Lampe brennen
    play = 1; // Um den Rogerbeep später auszulösen, wird play auf 1 gesetzt
  }
  else {
    //ptt = rx;
    // Sobald wir im RX Modus sind und der Rogerbeep gesendet werden soll, dann tu das
    if (play==1) {
      // Wenn der Rogerbeep gesendet werden soll,
      if (send_roger == 1) {
        // Dann unterbreche den Pin bei dem, was er grad spielt
        noTone(pin_id);
        // und spiele den Rogerbeep
        play_roger(); 
      }
      // Der Rogerbeep wurde erzeugt, play kann wieder auf 0 gesetzt werden
      play = 0;
    }
    // Schalte die TX-Lampe aus
    digitalWrite(ledPin,LOW);
  }
}

void start_id() {
  // Startsignal für Datenwort
  // wird doppelt so lange gespielt, wie ein Datenbit
  tone(pin_id,T[10],dur*2);
  delay(dur*2+10);
}

void play_id(unsigned int f) {
  // Datenbit eines Datenworts
  // f=übergebene Frequenz des Tones
  tone(pin_id,f,dur);
  delay(dur+10);
}

void end_id() {
  // Endsignal für Datenwort
  // wird doppelt so lange gespielt, wie ein Datenbit
  tone(pin_id,T[11],dur*2);
  delay(dur*2+10);
}

void pause_id() {
  // Pause zum nächsten Datenwort
  noTone(pin_id);
  delay(dur_break);
}

void play_roger() {
  // Rogerbeep
  tone(pin_roger,freq_roger,dur_roger);
  delay(dur+10);
}

Danach durchläuft das Signal einen aktiven Tiefpassfilter 4. Ordnung mit einer Grenzfrequenz von 300 Hz nach vorheriger Verstärkung von 3 dB. Das Signal des Rogerbeeps (ca. 1 … 3 kHz) wird daran vorbei geschleust. Damit werden dann alle Obertöne des Rechtecksignals unterdrückt. Im Idealfall bleibt ein (relativ) sauberer Sinus als Nutzsignal.

Auf http://www.analog.com/designtools/en/filterwizard/ kann man sich seinen Filter zusammen stellen. Die Ergebnisse für meine Zwecke sehen dann in der Theorie wie folgt aus:

TP-Filter Vorgaben

TP-Filter Vorgaben 3dB Verstärkung mit 300 Hz Grenzfrequenz, 40 dB Dämpfung bei 1 kHz

TP-Filter 4. Ordnung nach Sallen Key

TP-Filter 4. Ordnung nach Sallen Key

TP-Filter 2 x 2. Ordnung

TP-Filter 2 x 2. Ordnung

TP-Filter zu erwartende Kurve

TP-Filter zu erwartende Kurve

Eine entsprechende Schaltung habe ich mal mit LTSpice simuliert. Dabei habe ich die Werte eines TL084 OP benutzt und komme auf die gleichen Filterergebnisse.

300 Hz Tiefpassfilter in der Spice-Simulation

300 Hz Tiefpassfilter in der Spice-Simulation

250 Hz-Signal - rot=Input, grün = Output,

250 Hz-Signal – rot=Input, grün = Output,

Das 500 Hz-Signal (grün) wird schon deutlich vom Eingangssignal (rot) gedämpft

Das 500 Hz-Signal (grün) wird schon deutlich vom Eingangssignal (rot) gedämpft

Deutlich ist die Dämpfung des Signals von fast 50 dB bei 1 kHz zu erkennen.

Deutlich ist die Dämpfung des Signals von fast 50 dB bei 1 kHz zu erkennen.

Blockschaltbild Subaudio-Encoder

Blockschaltbild Subaudio-Encoder mit Rogerbeep

Soweit die Theorie…

Wohlgemerkt, es handelt sich hier zunächst erstmal um einen Encoder. Um das Decodieren kümmern wir uns an anderer Stelle.

Nun geht’s an die Praxis!

Mal ganz schnell Hochfrequenz…

Für die kommenden Projekte (wie z.B. den Spektrumanalyzer) habe ich mir einen kleinen Baustein angeschafft, der mir zwei unabhängige Oszillatoren auf drei Ausgänge (50 Ohm) erzeugt. Hierauf ist ein Si5351 mit einem 25 MHz Takt verbaut. Durch eine geschickte Frequenzteilung werden an den Ausgängen Rechtecksignale im Bereich von 8 kHz bis 160 MHz mit einer Ausgangsspannung von 3 VSS erzeugt. In einem Langzeittest hat sich die Schaltung auf meinem Werktisch als sehr stabil erwiesen, obwohl der Steuerquarz keine Temperaturstabilisierung hat.

Programmiert wird dieser Baustein über einen Arduino Nano oder Mini. Die erforderliche Bibliothek ist bei Adafruit erhältlich. Ein paar Zeilen Programmcode und in den Arduino hochgeladen, und schon steht die programmierte Frequenz am gewünschten Ausgang zur Verfügung.

Hier der Minimal-Code für den Arduino:

Arduino und Si5351

Arduino und Si5351

Si5351 mit 400 Hz Offset

Si5351 mit 400 Hz zuviel – kann aber über eine Correction-Funktion angepasst werden

Der Si5351 "stört" sogar auf der richtigen Frequenz

Der Si5351 “stört” sogar auf der richtigen Frequenz

Arduino Code für den Si5351

Arduino Code für den Si5351

Wenn man also mal ganz schnell eine Frequenz benötigt – so wie ich für 64 MHz, so ist man mit Kosten von insgesamt weniger als 15 € für die beiden Bausteine bestens ausgestattet.

Noch mehr im Sachen im Internet rund um den Si5351:

 

DIY Programmierkabel Yaesu FT-7900

Es ist schon recht mühselig das Yaesu FT-7900 über das Panel zu programmieren. Zugegeben es geht auch, aber über ein Programm ist das wesentlich komfortabler und übersichtlicher. So habe ich mir von G4HFQ ein kleines (aber mächtiges) Programm mit dem Namen FTB7900 für Windows herunter geladen, installiert und gekauft. Diese 15 Euro waren es mir wert.

Das FT-7900 hat an der Rückseite einen 6-poligen Eingang angebracht, über den der Speicherinhalt übertragen werden kann. Außerdem kann hier auch ein TNC angeschlossen werden. Die Belegung dieser Buchse sieht so aus:

6-pin FT-7900

6-pin FT-7900 von der Rückseite betrachtet

Ein altes PS/2-Kabel diente dabei als Grundlage.

6-pin Stecker PS/2

6-pin Stecker PS/2

Für eine Zweidraht-Programmierung des Gerätes benötigt man lediglich den Pin 2 GND und Pin 3 PTT. Ja, richtig, PTT. Hierüber wird die Schnittstelle mit Daten gefüttert, sowohl aus dem Gerät heraus, als auch in das Gerät hinein. Dabei sollte man aber bitte auf die richtigen Pegel achten. Also brauchte ich noch einen RS232-TTL-Konverter.

Fündig wurde ich bei DL8WA, der eine solche Konverter-Schaltung auf seiner Seite veröffentlich hat.

DL8WA 2-wire level converter

DL8WA 2-wire level converter

Diese kleine Schaltung habe ich kurzerhand mit Bauteilen und Kabelresten aus der Kiste auf einer Lochstreifenplatine aufgebaut.

Stückliste

  • D1,D2 = 1N4148 oder 1N4001 oder ähnlich
  • C1 = 4,7µF, 35V
  • T1,T2,T3 = BC546B oder ähnlich
  • R1 = 470 Ohm
  • R2=1 kOhm
  • R4,R6 = 10 kOhm
  • R3,R5 = 100 kOhm
  • D3 = Zener Diode 5,6V
  • P1 = Trimmer 10kOhm
    (So einstellen, dass eine Spannung von 3,3V zwischen Data und GND anliegt, bezogen auf einen nicht angeschlossenen VX-3)

Hier das Ergebnis:

RS232-TTL Konverter nach DL8WA

RS232-TTL Konverter nach DL8WA

Yaesu FT-7900 Programmierkabel

Yaesu FT-7900 Programmierkabel

Nun, schön sieht das Ganze nicht aus, aber es funktioniert hervorragend!

Noch ein Hinweis:
(damit ich das nicht vergesse und hier immer wieder nachschlagen kann)

Um das Yaesu FT-7900 in den Programmiermodus zu versetzen geht man folgendermaßen vor:

  • Taste MHz/PRI gedrückt halten und dabei das Gerät einschalten
  • Mit dem Abstimmknopf die Funktion auf F-7 Clone drehen
  • Taste BAND/SET eine 1/2 Sek. lang drücken Dabei geht das Gerät kurz aus und schaltet sich wieder ein.
  • Zum Empfangen von Daten nun Taste LOW/ACC drücken. Es erscheint — — RX — —
    Software zum Schreiben in das FT-7900 setzen
  • Zum Senden von Daten Taste V/M/MW drücken. Es erscheint — — TX — —
    Software zum Empfang vom FT-7900 setzen
  • Danach FT-7900 ausschalten und wieder normal einschalten

Wenn irgendwas schief geht erscheint ERROR

Mit der selben Prozedur kann man übrigens die Speicher und Konfiguration des Gerätes auf ein anderes FT-7900 klonen.

Nachtrag

Diese erste Schaltung eines anderen OMs hat nicht funktioniert. Die Pegel reichten nicht aus, um annähernd die 3,3V auf TTL zu bringen.

RS232-TTL Konverter nicht brauchbar

RS232-TTL Konverter nicht brauchbar

Konverter für JT65 CSV Logdaten in das ADIF-Format

Offensichtlich besteht momentan noch der Bedarf die Logdaten aus dem JT65 HF Comfort Programm im CSV-Format in das für Amateurfunkzwecke schon fast genormte Format ADIF zu übertragen. Ich habe einige Konvertierungsprogramme ausprobiert, jedoch sind die Bedienungen für nicht Eingeweihte schlecht oder irgendwas anderes funktioniert dann nicht, wie es soll. Download am Ende der Seite. Weiterlesen

Fernsteuerung mit Windows PC für den Kenwood TS-870S

Der Kenwood TS-870 verfügt über eine genormte serielle Schnittstelle zur Steuerung durch einen PC. Und da mein Laptop keine solche serielle Schnittstelle mehr enthält, musste ich mit einem RS232-Konverter das Gerät ansteuern. Bevor ich mir hierzu ein sog. CAT-Kabel besorge, wollte ich erstmal vorher testen, wie man mit dieser Steuerungs-Kontrolle umgeht.

Weiterlesen

SDR# mit Scanner-Plugin

Für meinen jüngst erworbenen DVB-T-Stick mit dem R820T Chip habe ich die Installation des SDR#-Programms durchgeführt. Leider lässt das als stabile Version 1.0.0.1000 zum Download angebotene Version keine großartige Datenbank für die Frequenzverwaltung zu. Dafür gibt es aber ein Plugin, das das SDR# um weitere Funktionen erweitert: Weiterlesen