Archives par mot-clé : audio

Spectroscope Audio avec Arduino

[GTranslate]

Si vous souhaitez réaliser ce montage, je propose sur ma boutique en ligne un kit facile à monter contenant tous les composants nécessaires avec la carte micro-contrôleur préprogrammé (http://xv4y NULL.radioclub NULL.asia/boutique/?slug=product_info NULL.php&products_id=29).

Arduino Spectrum Scope FFT XV4Y (http://xv4y NULL.radioclub NULL.asia/wp-content/uploads/2012/10/100_3300 NULL.jpg)Je vous l’avais dit, c’est une petite idée qui me trottait dans la tête depuis quelques temps et j’ai enfin pu la mettre en application. Le montage (ou plutôt le programme car de montage il y en a peu) que vous propose affiche le spectre d’un signal audio de 150 Hz à 3150 Hz en vous donnant le niveau maxi et la bande de fréquence où celui-ci se trouve. Ce n’est pas un analyseur de spectre à proprement dit, puisqu’il utilise la Transformée de Fourier Rapide (http://fr NULL.wikipedia NULL.org/wiki/Transformée_de_Fourier_rapide) à point fixe sur des entiers. En pratique ça fait la même chose…

Le but, c’est de faire joli et d’impressionner les filles d’aider l’opérateur télégraphie à ajuster son VFO pour se caler sur la fréquence de la station reçue (faire le battement nul, quoi).

Pour le réaliser, vous avez besoin :

  1. d’un Arduino avec ATMega168 ou ATMega328,
  2. Arduino Spectrum Scope FFT XV4Yd’un écran LCD 16×2 avec contrôleur Hitachi HD44780 ou compatible
  3. de fils et cavaliers en bon nombre
  4. d’une capacité de 10µF/16V (valeur non critique) avec le point froid (le “-“) sur l’entrée A0 de l’Arduino pour coupler l’audio de votre récepteur au montage
  5. du programme que je mets à disposition ci-dessous que vous allez compiler et télécharger dans l’Arduino

Je vais être franc, je n’ai pas beaucoup écrit de lignes de code pour faire ce programme et je me suis basé sur des librairies existantes. Mon talent (si j’en ai un) est de faire que ça marche! Toutes les références de librairies sont indiquées dans les sources et je vous conseille de vous reporter à leurs documentations respectives.

Arduino Spectrum Scope FFT générateur BF NE555 XV4Y (http://xv4y NULL.radioclub NULL.asia/wp-content/uploads/2012/10/100_3298 NULL.jpg)Les niveaux audio attendus sont entre 0 et 5V (ceux de l’ADC de l’Arduino). Vous pouvez changer l’échelle d’affichage en fonction de ce que vous mettez en entrée. Par exemple, la sortie audio fixe du port ACC du TS-590s donne 1,2V maximum, donc je mettrais le paramètre MAX_AUDIO à 256. Pour mes essais (et les photos), j’ai fait un petit montage générateur BF à base de NE555 (http://electroniccircuitsforbeginners NULL.blogspot NULL.com/2009/12/tone-generator-circuit NULL.html). Celui-ci fourni un beau signal carré plein d’harmoniques qui fait très beau sur l’afficheur!

Ce programme est libre d’utilisation et de modification dans le cadre de la licence GNU GPL v3 (http://www NULL.gnu NULL.org/licenses/gpl NULL.html). Toute inclusion dans un produit commercial ou un kit de composant est sujette à autorisation préalable de l’auteur (moi) et au respect des licences des autres librairies. J’apprécie tous commentaires ou toutes idées d’amélioration!

/*
Arduino HAM Audio Spectrum v1.01
By Yannick DEVOS - XV4Y
http://xv4y.radioclub.asia/

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

====
This program act as an audio Spectrum scope for the low frequency range
It is aimed at help HAM operators to "zero beat" a CW station

You just need to feed some audio (5V peak) into Analog Input 0 of an Arduino board and connect an LCD display.

The display is on a 16x2 LCD Display with HD44780 compatible driver, use the traditional 4 bits interface on pins 12,11,5,4,3,2
It as a graphical display for 20 spectrum bands and also display the numbers for the highest received signal and its band
Frequency is displayed in 20 150 Hz band between 150Hz and 3150Hz

In order to compile this program with Arduino 1.0.1, you will need to install 3 libraries :
- New LiquidCrystal
https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home
- LCDBitmap
http://arduino.cc/playground/Code/LCDBitmap
- Fixed FFT lib for Arduino 1.0
http://code.google.com/p/neuroelec/downloads/detail?name=ffft_library_for_Arduino_1.0.zip&can=2&q=

It is based on various works, please see below.

====
Revision history :
v1.00    2012-10-10
         First release
v1.01    2012-10-11
         Adding the F_STEP parameter and explaining how to change the sample rate    

====
This Example acquire analog signal from A0 of Arduino, and Serial out to Processing application to visualize.
Tested with preamplified audio data. Take a look at http://www.youtube.com/watch?v=drYWullBWcI

Analog signal is captured at 9.6 KHz, 64 spectrum bands each 150Hz which can be change from adcInit()
Load the this file to Arduio, run Processing application.

Original Fixed point FFT library is from ELM Chan, http://elm-chan.org/works/akilcd/report_e.html
A way to port it to the Arduino library and most demo codes are from AMurchick http://arduino.cc/forum/index.php/topic,37751.0.html
Processing app is based on codes from boolscott http://boolscott.wordpress.com/2010/02/04/arduino-processing-analogue-bar-graph-2/

====
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/>
*/

#include <stdint.h>
#include <ffft.h>
#include <Wire.h>
#include <LiquidCrystal.h>
#include <LCDBitmap.h>

// Here a few things that yoy may want to change

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);  // You can change this settings to your convenance, please see the library documentation

LCDBitmap bitmap(&lcd, 0, 0);

#define  IR_AUDIO  0    // ADC channel to capture
#define  F_STEP    150  // Width of the frequency bands in Hertz. This constant is only for display. To actually change the
                        // the size of the bands you have to change the FFT_N constant in ffft.h.
                        // 64 gives 300Hz (6300Hz displayed), 128 gives 150Hz (3150Hz displayed), 256 gives 75Hz.
                        // More samples means slower execution. Values higher than 256 do not seem to work. SRAM exhaustion ?
#define  MAX_AUDIO 512  // The maximum audio level you're expecting (for scaling), 5V is 1023
#define  OFFSET    1    // Spectrum band offset for display, first band has a lot of 50Hz hum so we skip it
#define  REFR_RATE 10   // Rate for refreshing the numerical display

// There are no user settings that you can modify here below

volatile  byte  position = 0;
volatile  long  zero = 0;
volatile  int   val, j, max_i, max_val, refresh;

byte graph[20];

int16_t capture[FFT_N];			/* Wave captureing buffer */
complex_t bfly_buff[FFT_N];		/* FFT buffer */
uint16_t spektrum[FFT_N/2];		/* Spectrum output buffer */

void setup() {
  lcd.begin(16,2);
  lcd.home ();

  adcInit();
  adcCalb();

  lcd.clear();
  bitmap.begin();
}

void loop() {
   if (position == FFT_N) {
     fft_input(capture, bfly_buff);
     fft_execute(bfly_buff);
     fft_output(bfly_buff, spektrum);

     max_val = max_i = 0;

     for (byte i = 0; i < 21; i++) {                 // We are capturing more (64 bands) than we can actually display (only 20)...
        j = i+OFFSET;
        val = map(spektrum[j],0,MAX_AUDIO,0,16);   // Scaling for display, only 16 dots high
        graph[i] = val;
        if (spektrum[j]>max_val) {          // Save the higher values for further display it
          max_val = spektrum[j];            // The value
          max_i = j;                        // Its band
        }
     }

    // Here we draw the graph
    bitmap.barGraph(20, graph, ON, UPDATE);

    // Here we display the highest numerical value but not each cycle because it flickers
    refresh++;
    if (refresh == REFR_RATE) {
      lcd.setCursor ( 4, 0 );
      lcd.print("Max F:    ");
      lcd.setCursor ( 10, 0 );
      lcd.print((max_i+1)*F_STEP);
      lcd.setCursor ( 14, 0 );
      lcd.print("Hz");
      lcd.setCursor ( 4, 1 );        // go to the next line
      lcd.print("Value:    ");
      lcd.setCursor ( 10, 1 );
      lcd.print(max_val*5);
      lcd.setCursor ( 14, 1 );
      lcd.print("mV");
      refresh = 0;
    }
    position = 0;
  }
}

// free running ADC fills capture buffer
ISR(ADC_vect) {
  if (position >= FFT_N)
    return;

  capture[position] = ADC + zero;
  if (capture[position] == -1 || capture[position] == 1)
    capture[position] = 0;

  position++;
}

void adcInit() {
  /*  REFS0 : VCC use as a ref, IR_AUDIO : channel selection, ADEN : ADC Enable, ADSC : ADC Start, ADATE : ADC Auto Trigger Enable, ADIE : ADC Interrupt Enable,  ADPS : ADC Prescaler  */
  // free running ADC mode, f = ( 16MHz / prescaler ) / 13 cycles per conversion 
  ADMUX = _BV(REFS0) | IR_AUDIO; // | _BV(ADLAR); 
//  ADCSRA = _BV(ADSC) | _BV(ADEN) | _BV(ADATE) | _BV(ADIE) | _BV(ADPS2) | _BV(ADPS1) //prescaler 64 : 19231 Hz - 300Hz per 64 divisions
  ADCSRA = _BV(ADSC) | _BV(ADEN) | _BV(ADATE) | _BV(ADIE) | _BV(ADPS2) | _BV(ADPS1) | _BV(ADPS0); // prescaler 128 : 9615 Hz - 150 Hz per 64 divisions, better for most music
  sei();
}

void adcCalb() {
  lcd.setCursor ( 0, 0 );        // go to the next line
  lcd.print("FFFT Spectrum");
  lcd.setCursor ( 0, 1 );        // go to the next line
  lcd.print("Calibration");
  long midl = 0;
  // get 2 meashurment at 2 sec
  // on ADC input must be NO SIGNAL!!!
  for (byte i = 0; i < 2; i++) {
    position = 0;
    delay(200);
    midl += capture[0];
    delay(200);
  }
  zero = -midl/2;
}

Problèmes avec le haut-parleur du KX3

Ca faisait un petit moment que je n’étais pas allé faire un tour sur le blog de Julian G4ILO (http://blog NULL.g4ilo NULL.com) et dans son flux RSS sur le blog d’AE5X j’ai vu qu’il y avait pas mal de nouveaux articles.

En particulier un qui relate les défauts constatés par Julian sur la BF du KX3 quand on utilise le haut-parleur (http://blog NULL.g4ilo NULL.com/2012/08/kx3-distorted-audio-problem NULL.html). Ce KX3 est un cadeau qui a été offert à Julian et récupérant peu à peu de sa maladie il se reprend à bricoler.

Modification du boîtier KX3 (http://www NULL.worldwidedx NULL.com/elecraft-kx3/142103-elecraft-kx3-speaker-buzz-fix NULL.html)Une rapide recherche montre que le problème est courant (http://www NULL.worldwidedx NULL.com/elecraft-kx3/142103-elecraft-kx3-speaker-buzz-fix NULL.html) et qu’il ne concerne pas l’électronique (comme sur le K3 dont la BF est détestée par certains) mais bien la mécanique. Y compris sur les archives de la liste de diffusion Elecraft on retrouve plusieurs fois ce défaut ici (http://elecraft NULL.365791 NULL.n2 NULL.nabble NULL.com/KX3-Speaker-Grille-td7558357 NULL.html) et ici (http://elecraft NULL.365791 NULL.n2 NULL.nabble NULL.com/KX3-speaker-distortion-from-mechanical-vibration-td7559450 NULL.html) et encore ici (http://forum NULL.radioamateur NULL.ca/index NULL.php?topic=6262 NULL.120). D’autres problèmes de réglages d’usine semblent exister mais peuvent être réglés (http://www NULL.worldwidedx NULL.com/elecraft-kx3/140921-returning-my-elecraft-kx3 NULL.html) en allant changer certaines valeurs dans les paramètres usines du transceiver sous la conduite d’Elecraft.

La qualité mécanique et la finition des produits d’Elecraft est souvent décriée par certains acheteurs qui la comparent à celle souvent sans faille des produits nippons (si on fait abstraction du bas de gamme qui reste bas de gamme). Une fois filtrés les commentaires idylliques d’acheteurs fans de la marque ou chauvins, on se rend compte qu’à prix équivalent les équipements d’Elecraft mais aussi de Ten-Tec sont souvent moins bien finis (qualités des plastiques, ajustement, ergonomie…). Je ne parle pas là de la qualité de l’architecture électronique ou des performances (le KX3 est en haut du classement de Rob Sherwood (http://www NULL.sherweng NULL.com/table NULL.html)), mais bien de défauts de finition qui à la longue peuvent rendre fous certains OM.

La bonne nouvelle c’est que tant Elecraft que Ten-Tec sont à l’écoute de leurs clients et dans la mesure du possible apporte des solutions logicielles (mise à jour du firmware) que matérielles. Pour le cas de Julian, Elecraft a envoyé sans discuter un nouveau haut-parleur. Point le plus important, ces constructeurs ne font pas sourde-oreille comme c’est souvent le cas des grands groupes japonais. C’est en effet le plus frustrant d’avoir l’impression de passer pour un idiot par un service communication qui réfute tout problème, même si la grande conscience de la qualité des ingénieurs japonais font que le défaut sera corrigé (dans la mesure d’un coût raisonnable, ce qui est une autre histoire).

Enfin pour conclure il faut bien se rendre compte que ce qui fait le prix de nos équipements aujourd’hui ce n’est pas tant le matériel lui-même, car même si les grands constructeurs ont des usines et des services d’achat très performants, les petites séries produites pour le marché radioamateur ne permettent pas de grandes économies. Ce qui fait le coût c’est le temps passé par les ingénieurs sur un projet et la qualité du support technique et de la garantie que l’on aura ensuite. Dans les grands groupes, ce coût est souvent réduit au détriment de celui des services marketing et commerciaux…