Étiquette : DDS

Ampli 23dB pour DDS utilisé comme VFO

K8IQY 23db DDS ampTout d’abord meilleurs voeux à tous pour 2015. Je n’ai pas écrit beaucoup sur le blog ces derniers temps. Je n’ai pas eu beaucoup à consacrer à la radio tout simplement, pris entre les fêtes et les occupations professionnelles.

Voici un circuit amplificateur faible signaux simple qui pourra servir à ceux qui utilisent un DDS type AD9850 dans leur montages (http://www NULL.k8iqy NULL.com/miscellaneous/23dbbipolarddsamplifier/23dbddsamplifier NULL.htm). Parfois le niveau en sortie n’est pas assez élevé, et un petit coup de pouce est nécessaire. La construction est simple et des transistors type PN2222/2N2222 peuvent être utilisés jusqu’à 30 MHz.

12voltShuntAmpsch (http://xv4y NULL.radioclub NULL.asia/wp-content/uploads/2015/01/12voltShuntAmpsch NULL.gif)

Kit pour débutants : le MBDC de KD1JV déjà disponible chez Hendricks QRP kits

Je me répète car j’ai déjà couvert ce kit transceiver QRP avec récepteur à couverture générale (http://xv4y NULL.radioclub NULL.asia/2014/04/12/le-transceiver-mbdc-multi-band-direct-conversion-de-kd1jv-bientot-disponible-chez-hendricks-qrp-kits/), mais je pense sincèrement que c’est un kit parfait pour les nouveaux radioamateurs et ceux qui veulent construire un transceiver en kit pour la première fois.

Facade MBDC JI4DS KD1JV (http://xv4y NULL.radioclub NULL.asia/wp-content/uploads/2014/06/KD1JV_ki4ds_mbdc02a NULL.jpg)J’ai eu la chance de pouvoir commander un des kits produits par KD1JV en pré-série et après l’avoir pas mal testé ces derniers jours j’en suis de plus en plus fan. La version produite par Doug Hendricks KI6DS dispose de plusieurs améliorations qui rendent le design tout simplement excellent à mes yeux (http://www NULL.qrpkits NULL.com/mbdc NULL.html).

Ce que j’aime sur ce kit :

  • Le design de KD1JV, à la fois simple et économique mais performant et stable avec des solutions techniques originales (mélangeur utilisant un 74HC4053, PA classe E…).
  • L’utilisation de solutions techniques moderne (VFO à DDS AD9834, contrôle par micro-contrôleur, filtre audio actifs).
  • La consommation électrique réduite permettant une utilisation portable sur batteries.
  • La couverture générale et la réalisation possible sur plusieurs bandes qui donne une réelle polyvalence et une réelle utilité au kit.
  • L’ergonomie moderne et efficace avec écran LCD 16×2 caractères, encodeur rotatif pour le choix des fréquences, mémoires de fréquence, manipulateur électronique à mémoire, nombreux paramètres dans le Menu.
  • La construction entièrement en composants traditionnels avec peu de bobinages à réaliser et un seul transformateur, toujours intimidant pour les débutants.
  • La mise au point simplissime avec juste un seul potentiomètre à régler pour le contraste de l’écran LCD, non critique.
  • Le kit incluant le boîtier, ce qui permet d’avoir un produit fini et réellement valorisant dans le shack de son constructeur.

Intérieur MBDC KI4DS KD1JV Hendirkcs QRP Kits (http://xv4y NULL.radioclub NULL.asia/wp-content/uploads/2014/06/KD1JV_ki4ds_mbdc05a NULL.jpg)Le prix est de 200 USD, hors frais de port (http://www NULL.qrpkits NULL.com/ordering NULL.html). Cela peut paraître élevé pour un jeune radioamateur qui cherche à s’équiper à moindre frais. Toutefois compte-tenu de la qualité des composants, de la présence du boîtier et de tous les “accessoires” ainsi que de la réelle polyvalence du transceiver, ce prix me paraît tout à fait justifié.

Je suis tellement emballé par ce transceiver et surtout démoralisé par l’absence de kit disponibles sur le marché francophone, que j’ai décidé de faire la traduction du manuel du kit pour KI6DS et KD1JV. Je dois attendre le retour de Steve à son QRA (il est en randonnée en montagne) pour avoir le document original et pouvoir l’éditer, mais en attendant en voici un aperçu avec la description du kit.


 

Le MBDC – Un transceiver Multibandes à conversion directe

Caractéristiques :

  • Conso Rx : 80 M : 70 ma, 160 M : 100 ma
  • Sensibilité : ~ -90 dBm (5 uV)
  • Trois réglages de bande-passante audio
  • Emetteur : 80 M : 5,5W à 13.8V, 620 ma – 160 M : 5,5W at 13.8V, 810 ma

Fonctionnalités :

  • Affichage LCD 2X16
  • Haut-parleur interne
  • Port antenne réception externe
  • Récepteur à Couverture générale de 100 kHz à 21,5 MHz
  • 20 mémoires de fréquence
  • Manipulateur électronique mode Iambic B avec mémoires et mode balise.

Le MBDC (Multi-band, Direct Conversion transceiver) a été conçu en premier lieu pour des opérations sur les bandes radioamateur des 160 et 80 mètres. La gamme étendue de fréquence autorisée par le VOF à DDS permet aussi une couverture générale allant de 100 kHz à 21,5 MHz et le récepteur à conversion directe permet une démodulation tout modes (AM, BLU, CW).

Trois bande-passantes audio sont disponibles pour le récepteur et sont sélectionnables par une pression sur un bouton du panneau frontal. Le Contrôle Automatique du Gain (AGC) et un réglage de volume indépendant protège les oreilles de l’utilisateur en cas de réception de signaux très forts.

160 et 80 mètres ont été choisis comme bandes par défaut pour deux raisons. Premièrement, il y a peu de kits disponiles pour ces bandes. Deuxièmement, un récepteur à Conversion Directe donne de meilleurs résultats sur des bandes qui ne sont pas trop occupées ou saturées. Utiliser un récepteur DC (Direction Conversion) sur 40 mètres ou 20 mètres un jour de concours peut-être une expérience très frustrante !

Pour une utilisation en dehors des bandes radioamateur 160 et 80 mètres, une entrée pour une antenne de réception auxiliaire est disponible. Ceci permet de court-circuiter les filtres passe-bas de l’émetteur ainsi qu’un filtre passe-haut à 1,7 MHz qui de facto limiterait la réception aux deux bandes amateurs. L’entrée antenne auxiliaire peut aussi être utilisée pour la réception sur les deux bandes radioamateur choisies, en effet il est parfois préférable d’utiliser une antenne de réception dédiée sur les bandes-basses pour réduire le bruit de fond. L’entrée antenne auxiliaire va directement vers le mélangeur sans aucun filtrage ou pré-selection car cela compliquerait sérieusement le design et le coût pour avoir la couverture générale.

De plus, le récepteur n’est pas inutilement sensible car il n’y en a pas besoin sur les bandes basses. Trop de sensibilité ne ferait qu’augmenter le bruit de fond et dégrader le rapport signal à bruit. Notez que le récepteur est aussi sensible aux stations présentes sur l’harmonique 2 de l’oscillateur local.
Par conséquent, ajouter une sorte de pré-sélecteur and peut-être un pré-ampli pourrait s’avérer utile lors d’une utilisation intense comme récepteur à couverture générale, ce qui est une raison supplémentaire pour la présence de l’entrée antenne de réception auxiliaire. Une sortie MUTE avec drain ouvert est disponible pour contrôler un pré-sélecteur ou un amplificateur linéaire externe.

A cause de la très large bande de couverture offerte par le VFO à DDS, il aurait été dommage de ne pas rendre possible l’utilisation de cette capacité. En conséquence, il est possible de programmer le MBDC pour opérer sur des bandes autres que 160 et 80 mètres. Néanmoins, ce n’est pas une bonne idée de vouloir utiliser ce poste au delà du 17 mètres à cause de problèmes probables de stabilités et de par le fait que la mise au point des filtres en sortie de l’étage final devient très délicate.

A moins qu’il n’ait été programmé de manière différente, l’émetteur est uniquement activé entre les limites des bandes radioamateur 160 et 80 mètres. Si vous vous placez en dehors de la bande actuellement sélectionnée, l’émetteur sera désactivé ce qui sera indiqué par une astérisque [ * ] dans le coin gauche en haut sur l’affichage.

Les limites peuvent être programmées pour que l’émetteur soit activé entre deux fréquences de otre choix. Celles-ci sont typiquement les valeurs haute et basse d’une bande radioamateur donnée. Toutefois, si une utilisation en tant que générateur de signal est souhaitée, elles peuvent être placées sur les limites de couverture du VFO, soit 100 KHz à 21,5 MHz. Ces limites programmables permettent aussi de régler le transceiver pour opérer sur les bandes VLF.

MBDC par KD1JV : Mon premier récepteur à conversion directe

C’est toujours un peu émouvant d’écouter pour la première fois un nouveau transceiver. Durant ces derniers moi j’ai peu à peu assemblé mon kit MultiBand Direct-Conversion de KD1JV (http://xv4y NULL.radioclub NULL.asia/2014/04/12/le-transceiver-mbdc-multi-band-direct-conversion-de-kd1jv-bientot-disponible-chez-hendricks-qrp-kits/). Hier j’en étais aux dernières connexions de potentiomètres et autres “accessoires”. Vint le moment dé vérité avec la mise sous tension et les tests de fonctionnement…

MBDC composants passifs (http://xv4y NULL.radioclub NULL.asia/wp-content/uploads/2014/06/DSCN3774 NULL.jpg)Prudemment, j’ai commencé par vérifier la présence de toutes les tensions d’alimentation avec une résistance de 50Ω en série afin de limiter le courant et les dégâts potentiels en cas de court-circuit. Tout semblant parfaitement en règle, j’ai installé les circuits intégrés, fini de câbler l’écran LCD et avec la même petite appréhension appliqué à nouveau du 12V sur l’alimentation.

Magie, l’écran LCD s’anime et le poste réagit aux commandes de l’encodeur rotatif et des boutons de MENU et de sélection de filtre. Pris par le temps j’essaie de le connecter rapidement à une antenne mais là, déception, pas moyen de recevoir un signal… Tant pis, je dois partir en ville et je verrais ça à mon retour.

KD1JV MBDC composants installés, photo XV4Y (http://xv4y NULL.radioclub NULL.asia/wp-content/uploads/2014/06/DSCN3786 NULL.jpg)Quelques heures plus tard je reprends les choses méthodiquement et vérifie avec l’oscilloscope que le DDS AD9850 produit bien un signal (par ailleurs visuellement très distordu sur l’entrée du 74HC4053 utilisé comme mélangeur). J’utilise mon ANTAN comme générateur de signal de dépannage (http://xv4y NULL.radioclub NULL.asia/xv4tuj-station-radioamateur-en-ok20ua/analyseur-dantenne-antan-de-f6bqu/) et là surprise j’entends bien un signal! En fait j’avais juste oublié que le MBDC dispose de deux entrées antenne, une RX/TX après les filtres passe-bas, et une, non-filtrée, pour la réception seulement. Une petite modification dans le câblage et je peux maintenant connecter le récepteur à mon antenne pour écouter un peu les bandes.

La première impression est celle d’une réception très douce, parfois manquant d’ailleurs un peu de pêche sur les signaux faibles. Le filtrage audio offre 3 bandes passantes (WD non filtrée, NB1 environ 3 KHz et NB2 environ 1000 Hz) dont les deux dernières sont légèrement amplifiée, la réception de signaux AM avec le filtre médian (NB1) est très agréable pour la voix (mais un peu étroite pour la musique par exemple). C’est mon premier récepteur à conversion directe, et si je m’attendais à entendre les porteuses AM et écouter les deux bandes latérales (réception DSB), je suis surpris de l’effet de battement quand on est très légèrement décalé de la fréquence de réception. Le signal plutôt pur du DDS doit d’ailleurs accentuer cet effet, mais il est parfois difficile de se défaire de la voix chevrotante des émissions AM. Une bonne calibration du DDS minimisera cette effet.

Assemblage MBDC par KD1JV fini , photo XV4Y (http://xv4y NULL.radioclub NULL.asia/wp-content/uploads/2014/06/DSCN3807 NULL.jpg)Il ne me reste plus qu’à arpenter les allées du “marché aux puces” locale pour lui trouver un boîtier adéquat. Je vais totalement inhibé la mise en émission du transceiver pour éviter des dommages, le comparateur du DDS (seul alignement à faire) a d’ailleurs été volontairement déréglé pour minimiser le signal transmis. Il faudra aussi que je fasse une mise à jour du firmware du transceiver, la première version livrée ayant un bug et ne comportant pas certaines améliorations comme la fréquence au démarrage programmable (important pour moi).

Article balises WSPR à DDS pour CQ Magazine : codes sources

Table des matières CQ Magazine Février 2014 (http://www NULL.cq-amateur-radio NULL.com/cq_highlights/2014_cq/2014_01_cq/PDF_NO_1_2014_02_CQ_TOC NULL.pdf)L’article que j’ai écrit pour CQ Magazine décrivant comment construire sa propre balise WSPR autonome avec DDS paraîtra le mois prochain. Afin d’alléger la pagination, les codes sources et autres documents volumineux sont publiés sur une page de ce blog. Les curieux peuvent donc en profiter pour jeter un oeil au code source et y faire leurs propres améliorations tant qu’ils respectent la licence GPL…

Ma pomme dans CQ Magazine de Décembre – Kits balise WSPR

Sommaire CQ Décembre 2013 (http://xv4y NULL.radioclub NULL.asia/wp-content/uploads/2013/11/2013_12_cq_toc NULL.jpg)Le numéro “Spéciale technique” de décembre de CQ Magazine (http://www NULL.cq-amateur-radio NULL.com/) contiendra un article que j’ai écrit à propos des micro-contrôleurs MSP430 et du LaunchPad de Texas Instruments. En fait j’ai proposé cet article il y a plus d’un an mais ils ne trouvaient pas la place adéquate dans leurs colonnes.

Pour continuer sur ma lancée, je leur ai aussi proposé un article détaillant comment fabriquer sa propre balise WSPR ou QRSS avec un DDS AD9850 et un LaunchPad MSP430. C’est en fait la balise que je proposais en kit (http://xv4y NULL.radioclub NULL.asia/2013/03/21/la-balise-wspr-de-g4jvf/) dont je vais publier les schémas et code source. En principe l’article est accepté pour une publication au premier semestre 2014, j’attends leurs demandes de corrections.

Il y a quelques jours Hans G0UPL a lancé son kit Ultimate QRSS beacon 3 (U3) (http://hanssummers NULL.com/ultimate3 NULL.html)qui a maintenant atteint un bon niveau de fonctionnalité et surtout de stabilité (les premières versions ont essuyées pas mal de bogues). Il propose en option les kits module GPS et platine de filtre de bande à commutation par relais. C’est aujourd’hui l’offre la plus intéressante car il en produit des volumes de plusieurs centaines d’exemplaires. Son seul inconvénient c’est que Hans refuse d’en ouvrir le code source et qu’il est donc impossible de faire vos propres adaptations…

Au passage je suis content de voir que mon travail a porté ses fruits et que Hans a intégré dans son codes des idées issues du mien comme la mise en veille du DDS par le bit W34 et le mode WSPR-15 (pour les VLF). Je suis sûr que le côté “reprogrammable” de mes kits l’a aussi poussé à diffuser les binaires de ses firmwares en ligne pour que les utilisateurs puissent faire les mises à jour, ce qu’il ne voulait pas faire au début.

Un wobuloscope à partir d’un Raspberry Pi et d’un DDS

MI0IOU Wobuloscope Raspberry Pi (http://xv4y NULL.radioclub NULL.asia/wp-content/uploads/2013/10/MI0IOU_wobby1 NULL.jpg)Aujourd’hui, les “vrais techniciens” ne jurent que par l’analyseur de spectre ou l’analyseur de réseau vectoriel (VNA). Ces équipements sont devenus relativement bon marché et des versions “simplifiées” du dernier sont même à la portée de toutes les bourses radioamateurs ou presque. Toutefois, il fut un temps où ces équipements étaient rares et où le Wobuloscope était l’équipement de choix pour les amateurs. Largement suffisant pour caractériser un filtre ou un circuit oscillant, j’ai mis les mains sur un appareil vintage lorsque je préparais ma licence au radio-club RCNEG de F6KKU (merci à F6GUB et F9ZS(SK) au passage).

Tom de MI0IOU a conçu un équipement équivalent mais en le remettant à la mode grâce au Raspberry Pi et aux modules DDS AD9850 d’origine chinoise (http://asliceofraspberrypi NULL.blogspot NULL.co NULL.uk/2013/10/raspberry-pi-wobbulator-introduction NULL.html). Le RPi pilote le DDS et en fait varier la fréquence, et il effectue la lecture d’un signal “redressé” par un circuit de détection simple. Le RPi n’ayant pas d’entrée analogique, un module convertisseur analogique-numérique (ADC) est nécessaire. La couverture est uniquement pour les bandes HF, mais c’est suffisant pour la plupart d’entre nous. Des exemples de mesures sont disponibles sur le blog de MI0IOU (http://asliceofraspberrypi NULL.blogspot NULL.co NULL.uk/2013/10/using-raspberry-pi-wobbulator-to-test_28 NULL.html). Tom met aussi à disposition le code Python à installer sur le Raspberry Pi.

Je vais vous avouer que j’avais commencé à travailler sur un circuit similaire en utilisant un LaunchPad MSP430. L’idée était de reprendre mon code de contrôle de l’AD9850 (http://xv4y NULL.radioclub NULL.asia/2013/03/19/code-source-vfo-avec-dds-ad9850ad9851-et-launchpad-msp430/) et de faire la lecture avec le port ADC du micro-contrôleur. L’affichage était en texte sur l’écran d’un micro-ordinateur connecté au MSP430 part le port USB. Faute de temps libre pour ce type de projet, celui-ci est passé en voie de garage tout comme celui de kit station météo complète (http://xv4y NULL.radioclub NULL.asia/2013/02/04/station-meteo-avec-serveur-web-code-source/) avec modules sans-fil et pression atmosphérique.

Promotions jusque -50% pour la fête des pères chez ICStation.com

DDS Signal Generator Module AD9850 0-40Mhz Sine Square Wave (http://www NULL.icstation NULL.com/product_info NULL.php?ref=5&products_id=1871&affiliate_banner_id=1)
Mon partenaire ICStation offre actuellement des promotions allant jusque -50% sur les kits, modules et composants électroniques. Sur les modules DDS AD9850 et AD9851 d’Analog Device cette remise atteint 30% par exemple, tous les prix étant port compris.

Cette offre est valable du 16 au 23 juin. Si vous achetez chez eux, merci de passer par ce lien (http://www NULL.ICStation NULL.com/index NULL.php?ref=5)

La balise WSPR de G4JVF

(http://xv4y NULL.radioclub NULL.asia/wp-content/uploads/2013/03/wsprddr2 NULL.jpg)Balise WSPR XV4Y par G4JVFPhilipp de G4JVF a construit une balise WSPR autour de mon kit avec DDS (http://xv4y NULL.radioclub NULL.asia/boutique/?slug=product_info NULL.php&products_id=33) et d’un amplificateur 5W de Kits and Parts (http://kitsandparts NULL.com/qrp_amp2 NULL.php).

L’ensemble produit entre 5W sur 80 mètres et 800mW sur 15 mètres où l’ampli commence s’essouffler… Dans tous les cas la puissance est largement suffisante pour être reçu dans le monde entier. L’utilisation avec les maigres 10mW du DDS permet même quelques reports de réception à courte distance.

Philipp a réalisé une adaptation dans le boîtier très propre qui lui permet de retirer le LaunchPad pour procéder à des mises à jour du firmware très facilement. Il a pour cela du déporter certaines commandes et boutons en façade.

Filtre Passe-bas G4JVF (http://xv4y NULL.radioclub NULL.asia/wp-content/uploads/2013/03/lp1 NULL.jpg)Comme vous le voyez sur les photos, il a aussi réalisé un filtre passe-bas commutable pour différentes bandes HF. A ce sujet, ni lui ni moi n’avons encore eu l’occasion de regarder la sortie de l’amplificateur à l’oscilloscope, mais le signal du DDS étant propre et le PA loin d’être saturé, il se peut que sur les bandes haute au moins aucun filtre ne soit vraiment nécessaire.

Balise WSPR agile DDS autonome XV4Y par G4JVF (http://xv4y NULL.radioclub NULL.asia/wp-content/uploads/2013/03/wsprddr2 NULL.jpg)En tous cas merci à Philippe de me faire partager son retour d’expérience. C’est là où un kit “ouvert” comme celui que je propose à son intérêt, car largement modifiable et permettant de faire évoluer le logiciel interne en fonction des besoins des OM. Je viens d’ailleurs d’y ajouter la gestion de plusieurs QTH (indicatifs et QRA locator) pour un OM qui passe la moitié de l’année en Thaïlande et l’autre aux USA.

Code source VFO avec DDS AD9850/AD9851 et LaunchPad MSP430

sVFO DDS AD9850 MSP430 XV4Y (http://xv4y NULL.radioclub NULL.asia/wp-content/uploads/2013/03/100_3446 NULL.jpg)J’ai eu le temps de mettre la main à une première version d’un programme simple de VFO pour mon kit à base de DDS AD9850 ou AD9851 (http://xv4y NULL.radioclub NULL.asia/boutique/?slug=product_info NULL.php&products_id=33).

Cette première mouture reste assez simple avec juste un système VFO A et VFO B mais pas de mémoires. Les fonctionnalités des boutons suivent la description ci-dessous.

 

Pour une pression brève sur le bouton :

  • UP : Augmente la valeur du chiffre sélectionné (pour le VFO sélectionné)
  • DOWN : Diminue la valeur du chiffre sélectionné (pour le VFO sélectionné)
  • LEFT : Sélectionne le chiffre de rang supérieur (plus à gauche)
  • RIGHT : Sélectionne le chiffre de rang inférieur (plus à droite)
  • OK : Valide la fréquence et la transmet au DDS

Pour une pression longue (supérieure à 1 seconde) sur le bouton :

  • LEFT : Positionne la fréquence sur la limite basse de la bande suivante
  • RIGHT : Egalise les fréquences des deux VFO (VFO A = VFO B)
  • OK : Change le VFO sélectionné (VFO A/B)

A noté que la broche P2_2 du MSP430 (celle connectée à la broche 3 du connecteur 4 pins) est maintenant utilisée en entrée. Si son état change (passant à 0V par exemple), le VFO actuellement utilisé est momentanément interverti. Cela permet donc de trafiquer en split avec la fréquence transmise par le DDS qui change du VFO A vers VFO B (ou l’inverse) tant que la PTT est pressée.

/* Simple VFO with DDS for MSP430G2553
 * Code for Energia 009

 * By Yannick DEVOS - XV4Y - March 2013
    http://xv4y.radioclub.asia/

    Copyright 2012-2013 Yannick DEVOS under GPL 3.0 license
    Any commercial use or inclusion in a kit is subject to author approval

====
 * Agile Frequency generation using AD9850/9851 DDS
 * Output to Nokia 5110 compatible LCD
 * Check if P2_2 has changed state and switch VFO (like when PTT is pressed to operate split)

Usage for short press of buttons :
- Up / Down      increase or decrease the frequency following the choosen digit
- Left / Right   increase or decrease the digit
- OK             validate the frequency and send it to the DDS
Long press of buttons :
- Left           Set the current VFO to the next band bottom frequency
- Right          VFO A = VFO B
- OK             Switch between VFO A and VFO B

====
Revision history :
v1.00    2013-03-18
         First release

====
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You can download a copy of the GNU General Public License at <http://www.gnu.org/licenses/>
*/

// Here modify to your taste or needs

#define PTT_key          P2_2
#define ANALOG_BUTTONS   A5
//#define AUTO_VALID       // Uncomment if you want the DDS frequency to be udapted automatically after each value change

#define DEFAULT_FREQ    8            // Value 8 in Frequencies array is 14000000
// Here under don't touch anything unless you know what you do

#include <legacymsp430.h>
#include <AD9850.h> // Library for AD9850 control by MSP430

#include <LCD_5110.h>

              // Frequencies (1 Hz precision) you can select
const unsigned long int frequencies[] = {
  137000, 471000, 501000, 1830000, 3500000, 5200000, 7000000, 10100000,
  14000000, 18068000, 21000000, 24890000, 28000000, 50000000, 70000000};

const byte Analog_Noise = 5;    // Margins for reading analog buttons

boolean   vfo=0, saved_PTT;  // VFO A or B and PTT input state
char      multiplier, aff_multiplier, freq_select=DEFAULT_FREQ;
unsigned  long int frequency_A=frequencies[DEFAULT_FREQ], frequency_B=frequencies[DEFAULT_FREQ], debounce;

char chaine_txt[6] = {' ', ' ', ' ', ' ', ' ', 0x00};

//AD9850 myDDS (P1_0, P1_1, P1_2, P1_4);  // Call the AD9850 Library, AD9850 pins for CLOCK, LOAD, DATA and RESET
AD9850 myDDS (P1_1, P1_2, P1_0, P1_4);  // Call the AD9850 Library, AD9851 pins for CLOCK, LOAD, DATA and RESET

LCD_5110 myScreen(P2_3,    // Chip Select *
         P1_6,    // Serial Clock *
         P2_5,    // Serial Data *
         P2_4,    // Data/Command *
         NULL,    // Reset *
         P1_7,    // Backlight
         NULL);  // Push Button 0

//******************************************************************
// Defining pins mode
// Encoding the WSPR sequence

void setup() {
  pinMode(PTT_key, INPUT_PULLUP);

  myDDS.begin();

  pinMode(ANALOG_BUTTONS, INPUT);

  myScreen.begin();
  myScreen.setBacklight(1);

  myScreen.setFont(1);
  myScreen.text(0, 0, "sVFO");
  myScreen.text(0, 2, "AD9850");
  myScreen.setFont(0);
  myScreen.text(0, 4, "v1.00 - XV4Y");
  myScreen.text(0, 5, "Init...");

  delay(1000);

  myDDS.reset();

  myDDS.SetFrequency( frequency_A, 0, false );

  digitalWrite( PTT_key, LOW );

};

//******************************************************************
// Here starts the actual sequence sending

void loop() {
    myScreen.clear();
    myScreen.setBacklight(1);
    myScreen.setFont(1);
    if (vfo == 0) {
      myScreen.text(0, 0, "VFO A");
      myDDS.SetFrequency( frequency_A, 0, false );
    } else {
      myScreen.text(0, 0, "VFO B");
      myDDS.SetFrequency( frequency_B, 0, false );
    };

    myScreen.setFont(0);
    display_freq (frequency_A, 3);
    display_freq (frequency_B, 5);

    while (read_buttons()==5 || read_buttons()==4 || read_buttons()==2) delay(10); // Debounce except for UP/DWN

    while (1) {
      // Update the frequencies display
      if (multiplier > 5) {
        aff_multiplier = multiplier + 2;
      } else if (multiplier > 2) {
        aff_multiplier = multiplier + 1;
      } else {
        aff_multiplier = multiplier;
      };
      myScreen.text(0, 4, "          ");
      if (vfo == 0) {
        myScreen.text(9-aff_multiplier, 4, "^");
      } else {
        myScreen.text(9-aff_multiplier, 4, "v");
      }
      display_freq (frequency_A, 3);
      display_freq (frequency_B, 5);

      // Read the analog buttons input
      if(read_buttons()==1) {            // Up we increase frequency
        delay(200);  // Debounce
        if (vfo == 0) {
          frequency_A = frequency_A + powf(10,(float)multiplier);
        } else {
          frequency_B = frequency_B + powf(10,(float)multiplier);
        };
#if defined AUTO_VALID
        break;
#endif

      } else if (read_buttons()==3) {    // Down we decrease frequency
        delay(200);  // Debounce
        if (vfo == 0) {
          frequency_A = frequency_A - powf(10,(float)multiplier);
        } else {
          frequency_B = frequency_B - powf(10,(float)multiplier);
        };
#if defined AUTO_VALID
        break;
#endif

      } else if (read_buttons()==2) {    // Left we increase multiplier
        debounce = millis();
        while (read_buttons()==2) {  //Debounce
          if ((millis()-debounce)>1000) {  // Long press we do "Band UP"
            freq_select++;
            if (freq_select > 14) freq_select = 0;
            if (vfo == 1) frequency_B = frequencies[freq_select]; else frequency_A=frequencies[freq_select];
            multiplier--;
            break;
          };
        };
        multiplier++;
        if (multiplier > 8) multiplier = 8;

      } else if (read_buttons()==4) {    // Right we decrease multiplier
        debounce = millis();
        while (read_buttons()==4) {  //Debounce
          if ((millis()-debounce)>1000) {  // Long press we do VFO A=B
            if (vfo == 1) frequency_A = frequency_B; else frequency_B=frequency_A;
            multiplier++;
            break;
          };
        };
        multiplier--;
        if (multiplier < 0) multiplier = 0;

      } else if (read_buttons()==5) {    // OK we go out
        debounce = millis();
        while (read_buttons()==5) {  //Debounce
          if ((millis()-debounce)>1000) {  // Long press we switch VFO A/B
            if (vfo == 1) vfo=0; else vfo=1;
            break;
          };
        };
        break;   // Short press we just leave the loop so the frequency is transmitted to the AD9850
      }

      // Check if we are transmitting split (momentaneous VFO A->B switch)
      if (saved_PTT != digitalRead(PTT_key)) {
        saved_PTT = digitalRead(PTT_key);
        if (vfo == 1) vfo=0; else vfo=1;
        break;
      };
    }

};

//******************************************************************
// Display the frequency
void display_freq (unsigned long freq, char ligne) {
  myScreen.text(10, ligne, " Hz ");
  chaine_txt[5] = 0x00;
  chaine_txt[4] = 0x30 + (((freq)/1)%10);
  chaine_txt[3] = 0x30 + (((freq)/10)%10);
  chaine_txt[2] = 0x30 + (((freq)/100)%10);
  chaine_txt[1] = '.';
  chaine_txt[0] = 0x30 + (((freq)/1000)%10);
  myScreen.text(5, ligne, chaine_txt);
  chaine_txt[5] = 0x00;
  chaine_txt[4] = 0x30 + (((freq)/10000)%10);
  chaine_txt[3] = 0x30 + (((freq)/100000)%10);
  chaine_txt[2] = '.';
  chaine_txt[1] = 0x30 + (((freq)/1000000)%10);
  chaine_txt[0] = 0x30 + (((freq)/10000000)%10);
  myScreen.text(0, ligne, chaine_txt); 
}

//******************************************************************
// Display a 2 digits number
void display_number (byte number, char column, char ligne) {
  chaine_txt[2] = 0x00;
  chaine_txt[1] = 0x30 + (number%10);
  chaine_txt[0] = 0x30 + ((number/10)%10);
  myScreen.text(column, ligne, chaine_txt);
}

//******************************************************************
// Return a button value depending on the analog reading
byte read_buttons () {
  int value = analogRead(ANALOG_BUTTONS);
  if ( value<(1+Analog_Noise) ) {
    return 1;
  } else if ( value<(78+Analog_Noise) ) {
    return 2;
  } else if ( value<(146+Analog_Noise) ) {
    return 3;
  } else if ( value<(205+Analog_Noise) ) {
    return 4;
  } else if ( value<(255+Analog_Noise) ) {
    return 5;
  } else {
    return 0;
  }
}

Divers nouvelles : kits et e-mails

Ecran LCD kit balise WSPR DDS (http://xv4y NULL.radioclub NULL.asia/wp-content/uploads/2013/01/100B3380 NULL.jpg)Depuis ce week-end je suis très occupé à préparer, tester et empaqueter les kits WSPR à DDS qui m’ont été commandé ces dernières semaines. Pas mal de boulot en perspective car les commandes sont toutes personnalisées (indicatifs, locator, fréquences… différents pour WSPR suivant chaque OM) et certaines comportent des options (écran LCD et DDS AD9851 au lieu du 9850). Pour bien faire j’ai encore noté des problèmes de qualité (mauvais contact) sur les écrans LCD et il faut que je les tests bien un par un. Demain il faudra que je fasse toute la paperasse administrative et si tout va bien tout partira par la poste demain après-midi ou au plus tard mercredi, et devrait sortir du pays avant le nouvel an vietnamien (Tét)!

Autre mauvaise nouvelles du lundi, l’adresse e-mail que j’utilisais pour mes correspondances relatives à la radio ne marche plus. C’était une adresse free.fr que j’utilisais depuis presque 20 ans, mais Free à du se rendre compte que je n’étais plus client chez eux depuis un bail… A partir de maintenant tout passe sur une nouvelle adresse chez mon hébergeur professionnel, j’espère juste qu’aucun message important ne sera perdu en route…