gkSDR peut s’interfacer avec des périphériques externes (appelés “accessoires”) comme par exemple:
- Un capteur de position angulaire pour connaître l’orientation de l’antenne,
- Un contact “sec” pour savoir que le TX est passé en émission,
- Une mesure analogique de la tension de la batterie, du niveau de puissance d’émission, etc.
Ces informations sont affichées dans un onglet spécifique (à l’exception de l’orientation de l’antenne qui est utilisée dans plusieurs parties). Une copie d’écran et un exemple sont présentés plus loin dans cette page. Un accessoire peut envoyer des informations au logiciel SDR ou en recevoir (par exemple connaître la fréquence actuelle pour sélectionner la bonne antenne ou piloter un transverter externe, ou encore envoyer via une commande CAT la fréquence de travail à un émetteur-récepteur externe).
Deux types d’interfaces sont proposées:
- Interface par une ligne série, pour un PIC, un arduino, un raspberryPI ou équivalent,
- Par le réseau, via une interface XMLRPC, pour du python ou Matlab par exemple.
Interface accessoires via une ligne série “RS232″
Le paramétrage se fait via le fichier de configuration, dans la section “Accessories”, par exemple sous Windows :
1 2 3 4 |
[Accessories] comm_port=14 bauds=38400 rotor_resolution=4096 |
Cette séquence indique qu’un accessoire est connecté au port COM14, et qu’il communique à 38400 bauds. La ligne rotor_resolution indique que le capteur d’orientation de l’antenne envoie une réponse entre 0 et 4095 (voir plus loin).
Pour envoyer des informations à gkSDR sous Arduino, on initialisera le croquis comme suit:
1 2 3 4 |
void setup() { Serial.begin(38400); Serial.println("<READY>"); } |
Les commandes sont ensuites envoyées sous forme de chaînes de caractères. Elles commencent toujours par le symbole < et se terminent par le symbole >. gkSDR ignore la déclaration de l’accessoire dans le fichier de configuration tant qu’au moins une trame n’a pas été reçue. C’est pour cette raison que la fonction setup() envoie “<READY>”.
Les marqueurs de début et fin (< et>) sont traités comme suit :
- tant que le < n’est pas reçu, les données sont ignorées,
- quand le > est détecté, la commande est analysée.
Quelques exemple :
<R781> : indique que le rotor (commande R) est à la position 781. Comme nous avons (voir plus haut) indiqué que nous avions 4096 points par tour, le logiciel en déduit que l’antenne est orientée de 781/4096 tour, soit 781/4096*360 = 68.64 degrés par rapport au nord.
Sous arduino, en supposant que la position courante est obtenue grâce à un encodeur optique, le code suivant envoie la position – si elle à changé – à gkSDR:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#include <Encoder.h> Encoder rot(5, 6); void checkOptical() { long newPos ; // read optical encoder newPos = rot.read() % 4096 ; if( newPos < 0 ) { newPos = 4095 ; rot.write( 4095 ); } if( newPos != pos ) { pos = newPos ; Serial.print("<R"); Serial.print(pos); Serial.println(">"); } } |
<S+10> : incrémenter la fréquence du VFO actuel (onglet actif) de 10 Hz. Permet de simuler un bouton “up” ou “down” (<S-1000> faire ‘descendre’ la fréquence actuelle de 1000 Hz).
Cas général:
Supposons que vous vouliez afficher le niveau de batterie, la température du PA, le TOS et la puissance émise. Vous disposez des sondes de mesure et vous numérisez les signaux grâce à des convertisseurs AD, par exemple ceux qui équipent l’Arduino ou votre PIC.
Il faut d’abord déclarer dans le fichier de configuration que vous avez des instruments “analogique” (ici 4):
1 2 3 4 5 6 |
[Indicators] count=4 I0_Name=Batterie I1_Name=Température I2_Name=TOS I3_Name=Puissance |
Il est important de respecter la syntaxe I0_xxx : I pour instrument, 0 pour indiquer qu’il s’agit du premier, puis xxx pour son nom. On retrouve alors une section pour chaque instrument:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
[Batterie] min=10 max=15 points=255 unit=Volts [Température] min=0 max=30 points=255 unit=Deg [TOS] min=1 max=3 points=255 [Puissance] min=100 max=300 points=255 |
La batterie sera lue de 10 à 15 Volts, la valeur est codée sur 255 points (0 = 10 Volts, 255 = 15 volts).
La température sera de 0 à 30 Deg, codée sur 255 points (0=0 degrés, 255 = 30 degrés).
De même, on déduit que le TOS va de 1 à 3, la puissance de 100 à 300 sans unité.
Sur la ligne série, la commande à envoyer pour indiquer que la température est de 15 degrés (128 points) sera :
<I1:128> : L’indicateur numéro 1 (la température) lit 128 points. Le logiciel fera la conversion.
<I0:0> Indique que la batterie est à 10 volts.
L’onglet indicateur dispose alors automatiquement les “vu-mètres” dans l’ordre de déclaration du fichier.
Interface via XMLRPC
Le protocole XMLRPC est un protocole léger réseau disponible dans de nombreux langages (java, python, javascript, perl etc.). Il permet donc, depuis un ordinateur du réseau, de piloter gkSDR à distance.
Un ensemble d’exemple permettant de piloter gkSDR depuis Matlab (via Java) est proposé avec le logiciel.
Pour plus d’informations sur XMLRPC, voire ces liens :
- informations générales sur XMLRPC : http://en.wikipedia.org/wiki/XML-RPC
- En Python : https://docs.python.org/2/library/xmlrpclib.html
- En Perl : http://search.cpan.org/~daan/XML-RPC-0.9/lib/XML/RPC.pm