Potentiomètre pour changer les fréquences radio FM

Bonsoir,

Je souhaite restaurer une vielle radio en utilisant le montage objet de ce fil de discussion :
https://forum.arduino.cc/t/polarite-de-mes-condensateurs-arduino-nano-et-rda5807m/851252/12
mais sans le jack 3.5 et avec un haut-parleur.
Le problème c'est que je dois contrôler les fréquences avec un potentiomètre.
Pour le volume c'est très simple surtout avec la fonction map mais pour les fréquences j'ai du mal ! Avant de venir vous voir j'ai fait beaucoup de recherches sur internet mais je n'ai rien trouver.
Aussi, si quelqu'un veut bien m'aider, je l'en remercie par avance.
J'ai vu qu'il existait des encodeurs rotatifs mais je ne comprends comment programmer pour changer les fréquences.
Merci.

Déplacé dans la partie francophone du forum.

Merci d’utiliser l’anglais pour les catégories générales

Tu peux aussi utiliser map() pour les fréquences.
Il suffit de mapper la dynamique de codage de la tension en sortie du potentiomètre (0 - 1023) sur la bande de fréquence à couvrir.
2 problèmes possibles:

  • Le 1er pourrait éventuellement être de faire coïncider la position du potentiomètre, la fréquence reçue et la position d'une aiguille sur l'écran du poste.
  • le 2nd pourrait être un pas un peu grossier dû au fait que l'ADC ne code la position du potentiomètre que de 0 à 1023. Il faudra un bon filtrage sur cette valeur car sinon le poids faible va bouger en permanence ce qui serait équivalent à perdre un bit sur le codage de la valeur et 512 pas pour coder la fréquence pourrait être un peu limite.

Concernant l'usage d'un encodeur rotatif, les modèles bon marché ne donnent qu'une position relative donc ce n'est pas très adapté si tu dois coupler le bouton avec un indicateur en face avant du poste.

Merci.

Un encodeur me paraît être une solution plus stable qu'un potentiomètre, à moins d'utiliser un modèle de bonne qualité et si possible multi-tours (cher).

Voir la librairie https://github.com/PaulStoffregen/Encoder

Dans le principe, l'objet Encoder comporte une variable position :

  • une méthode read() pour lire la position
  • une méthode write() pour modifier la position

Lorsque l'on tourne d'un cran vers la droite, la position est incrémentée.
Lorsque l'on tourne d'un cran vers la gauche, la position est décrémentée.

L'association position / fréquence peut être faite à partir d'un règle simple :
De 87,6 MHz à 107,9 MHz il y a 204 pas (si l'on veut un pas de 0.1MHz), ou 408 si l'on veut un pas de 0.05MHz.

Il suffit de considérer que la position zéro correspond à 87,6 MHz et d'ajouter la position de l'encodeur :

  • position / 10 si l'on désire un pas de 0.1MHz
  • position / 20 si l'on désire un pas de 0.05MHz

Dans le premier cas la position évoluera donc de 0 à 203. Dans le second cas la position évoluera de 0 à 406.

Si la variable position de l'encodeur passe en dessous de ZÉRO, il suffit de la remettre à ZÉRO dans le code. Si elle passe au dessus de 203 ou 406, il suffit de la remettre à cette valeur.

Dernier détail : sauvegarder la position courante de l'encodeur en EEPROM permettra de la retrouver au démarrage.
Pas mal d'encodeurs possèdent un bouton central (encodeurs à 5 broches). Il suffit d'appuyer dessus pour mémoriser la position.

j'ai extrait un bout de code que j'avais qui fait en gros cela (sans la partie EEPROM)

#include <Encoder.h> // https://www.pjrc.com/teensy/td_libs_Encoder.html
const byte encodeurDTPin = 2; // Encodeur DT
const byte encodeurCLKPin = 3; // Encodeur CLK
Encoder encodeurRotatif(encodeurDTPin, encodeurCLKPin); // attaché sur pins 2 (Encodeur DT) et 3 (Encodeur CLK)

// fréquences de 87,5 MHz à 108Mhz en KHz 87500 --> 108000
const long minFrequence = 87500;
const long maxFrequence = 108000;
const long deltaFrequence = 50; // 0.05MHz

const long minEncoder = 0;
const long maxEncoder = (maxFrequence - minFrequence) / deltaFrequence;

long frequence = minFrequence;

void afficheFrequence()
{
  Serial.print(F("Frequence: "));
  Serial.print(frequence / 1000.0, 2);
  Serial.println(F(" MHz"));
}

bool gestionFrequence()  // retourne vrai si la frequence a été modifiée
{
  bool frequenceChangee = false;
  static long anciennePosition = 0;

  long nouvellePosition = encodeurRotatif.read() >> 1; // mon encodeur envoie 2 impulsions par tick, donc je disvise par 2
  if (nouvellePosition > maxEncoder) {
    encodeurRotatif.write(maxEncoder << 1);
    nouvellePosition = maxEncoder;
  } else if (nouvellePosition < minEncoder) {
    encodeurRotatif.write(minEncoder << 1);
    nouvellePosition = minEncoder;
  }

  if (nouvellePosition != anciennePosition) {
    frequence = minFrequence + nouvellePosition * deltaFrequence;
    anciennePosition =  nouvellePosition;
    frequenceChangee = true;
  }
  return frequenceChangee;
}


void setup() {
  Serial.begin(115200);
  encodeurRotatif.write(0);
  afficheFrequence();
}

void loop() {
  if (gestionFrequence()) afficheFrequence(); // si la frequence a changé on l'affiche
  // ici on peut faire autre chose de non bloquant

}

si vous ouvrez le moniteur Série à 115200 bauds et que vous tournez le bouton de l'encodeur rotatif, vous verrez les fréquences changer

Un simple essai avec un potentiomètre permet de constater qu'il est très difficile de faire tourner le potentiomètre pour obtenir une variation de fréquence de 0.1MHz. C'est trop sensible.
J'ai utilisé un potentiomètre à piste plastique, avec une piste carbone ce sera pire.

Par contre avec un potentiomètre 10 tours c'est beaucoup plus facile.

c'est pour cela que l'encodeur quadratique est une bonne idée :wink:
et son bouton peut servir de on/off ou autres usages comme vous l'avez suggéré

C'est clair pour moi, surtout étant donné le prix ridicule.
Avec un potentiomètre on aura toujours le risque de se trouver dans une zone de la piste où la mesure de l'ADC sera instable.
Avec l'encodeur ce risque n'existe pas.

Merci à tous.
J'envisage de me faire la main en achetant :
https://www.amazon.fr/WayinTop-Rotatif-Encodeur-Encoder-Capuchon/dp/B07T3672VK/ref=sr_1_9?__mk_fr_FR=%C3%85M%C3%85%C5%BD%C3%95%C3%91&crid=232TKD7ISK7BQ&dchild=1&keywords=arduino+encodeur+rotatif&qid=1623219020&sprefix=arduino+encodeur+rot%2Caps%2C173&sr=8-9
Par contre pour restaurer ma vieille radio ça va être compliqué car il me faut un encodeur avec une broche de 50mm :


Du coup il va falloir bricoler quelque chose...
Merci à tous.
Bonne journée.

Les encodeurs que vous envisagez devraient faire le job

Pour la longueur de la tige faudra bidouiller un peu… :slight_smile:

Un potentiomètre de mauvaise qualité permet aussi de faire l'affaire si on change le système de commande, on peut faire comme un joystick. Pour un pot de 10kΩ:

  • 3 à 7kΩ -> la fréquence est fixe
  • 0 à 3kΩ -> la fréquence diminue de 0,1MHz rapidement pour 0kΩ, lentement pour 3kΩ
  • 7 à 10kΩ -> la fréquence augmente de 0,1MHz rapidement pour 0kΩ, lentement pour 3kΩ

Cela permet d'utiliser un composant simple. Évidemment l'idéal est de mettre un ressort de rappel en position centrale.

oui mais c'est moins intuitif (surtout sans ressort de rappel)

Un joystick fait l'affaire :
Gauche droite : fréquence
Haut bas : volume

Et le bouton qui sert à rien : potar pour faire varier le retro éclairage :grinning:

toujours avec le même souci d'experience utilisateur. Pas forcément simple de taper juste sur la bonne fréquence

J'utilise ceci en général :
Un morceau de tube Ø intérieur 6mm collé sur l'axe de l'encodeur.
Un axe 6mm (récupéré sur un vieux potentiomètre) de la longueur voulue collé dans le tube.

La solution de Villeroy me plait bien.

De toute façon sans affichage de la fréquence cela n'a jamais été simple de trouver une station.
Fait appel à tes souvenirs des postes de quand tu étais jeune :

Grandes ondes : faciles presque pas de stations : Paris Inter, Radio luxembourg et Europe 1 et dans le Sud Ouest Radio Andore qui émettait moitié en français, moitié en espagnol, dans le Sud Est Radio Monte Carlo.

Petites ondes : déjà plus délicat

Ondes Courtes : la galère

Et la MF c'est un peu les OC.

ça peut marcher oui
un encodeur rotatif va permettre d'affiner, un appui sur le bouton et on bascule vers la modification du son, un appui long on sauve en EEPROM... ça fait un tout en un 'numérique'

encore un truc de softeux (numérique) versus hardeux (analogique) :crazy_face: :crazy_face:

Merci, je me demandais comment je pouvais faire.

Pour le volume c'est ok, avec un peu de W40, il fonctionne comme à ses débuts :slightly_smiling_face:


J'ai déjà nettoyé la carcasse que je vais la laisser dans son jus :slightly_smiling_face:

Merci à tous.
Bonne soirée.

Il ne me restera plus qu'à trouver comment brancher ce vieux potentiomètre qui fait office de volume mais aussi de marche arrêt. Il y a deux connexions supplémentaires pour le cran d'arrêt-marche au début de la rotation.