FM, DAB+ et C++ moderne

Discutions générales sur le DSPiy et tout ce qui s'y rattache
louisr
Messages : 468
Enregistré le : mar. 14 juil. 2015 15:52
Localisation : Bordeaux/Poitiers

FM, DAB+ et C++ moderne

Messagepar louisr » ven. 10 janv. 2025 21:12

Bonjour à tous,


J'ai profité de mes vacances de fin d'année pour (enfin) terminer un projet que j'avais entamé ... il y a quasiment 3 ans maintenant :gene:. Il s'agit d'un tuner FM/DAB+ pour compléter la chaine HIFI de mon père.

Il n'y a pas énormément de module permettant de démoduler le DAB+ disponible pour le grand public, je me suis tourné vers le module "T4A" que j'ai trouvé sur ce site. Il s'agit d'une petite carte avec un SoC qui gère toute la partie démodulation FM/DAB+. Autour, il n'y a pas besoin de grand chose : des régulateurs pour le 3V3 et le 1V2, un DAC (PCM5102), une EEPROM et un STM32F4 qui gère le tout. J'ai aussi rajouté écran OLED 3.12" de chez Newhaven Display (le grand frère de celui du DSPIY !), quelques bouton poussoirs et un récepteur IR pour le contrôle et la visualisation. En gros, par grand chose d'exceptionnel côté électronique ! Voila un petit schéma de principe :

schema.png


Le tout est mis dans un boitier HIFI2000 très largement surdimensionné mais qui match bien avec le reste de la chaine hifi. D'ailleurs je recommande à 100% les services d'usinages et impression du fabricant, c'est tellement simple que ça en enlève presque le plaisir :hehe:. Voici quelques photos :

IMG_20250106_142620.jpg


IMG_20250106_142534.jpg



J'ai passé un peu plus de temps sur le code du STM32, car ça m'a servi d'excuse pour apprendre un peu dans ce domaine. En particulier, j'ai jusque la toujours utilisé les outils de développement de ST (cubeIDE et leur librairie HAL). Je voulais passer à autre chose car :
  1. Je déteste Eclipse :gene:
  2. Je déteste HAL :gene: :gene:
  3. Je voudrais pas trop dépendre d'un seul fabricant et utiliser un max d'outils open-source
  4. J'utilise quotidiennement VScode, et donc je voudrais avoir tous mes outils dessus
  5. Je voudrais programmer en C++ (cubeIDE/HAL techniquement le permet, mais pas fait pour)

Le C++ n'a pas forcément bonne presse pour l'embarqué, en parti à cause de l'allocation dynamique et du polymorphisme "dynamique" qui est assez couteux. Cependant, après quelques vidéos youtube et article de blog j'ai été convaincu que le C++ avait aussi de très bon argument. Vous pouvez trouver un petit resumé ici, mais en gros j'ai retenu 3 argument principaux :

  1. La programmation orienté objet. J'y ai goûté, ça sera difficile de revenir en arrière ::d
    1. L'abstraction "zero-cost". C'est un principe qui permet de rajouter beaucoup de couche d'abstraction au code (à travers des objets par exemple) mais qui n'ajoute pas de "overhead", notamment grace à l'optimisation du compilateur.
      1. Le code exécuté au moment de la compilation (compile time execution). Cet aspect vient surtout avec les versions moderne du C++, en gros depuis C++11. On peut écrire du code qui sera exécuté au moment de la compilation, par exemple pour générer des lookup table. Mais c'est également utiliser pour l'abstraction "zero-cost". C'est un aspect très très puissant du C++, et de plus en plus de fonctionnalité du langage peuvent être exécuté à ce moment la.

Il y a d'autres aspects intéressant. Mais le gros point négatif pour moi c'est la complexité du langage. Notamment car le C++ dit "moderne" est assez différent du C++ plus ancien, mais la compatibilité avec les versions précédentes doit être garantie. Il y a donc par exemple plein de façon d'écrire la même chose, avec des petites subtilités qui sont souvent pas simple à appréhender. Bref, je suis toujours très débutant mais plutôt convaincu.

Côté STM32, je suis parti sur modm.io pour le côté bas niveau. C'est une sorte de générateur de librairie, qui s'inspire un peu du "device tree" de linux. L'idée c'est de décrire ce que l'on va utiliser dans le STM32 (eg: l'UART, le SPI, etc) et va générer les bons objets en C++ avec la configuration qui va bien. Cela permet de générer uniquement ce qu'il faut, et avec un overhead dans la plupart des cas nul par rapport à écrire dans les registres directements. L'outil offre aussi des fonctions de debug et des fonctions plus hauts niveau (eg une methode de scheduler par exemple) mais je n'ai pas trop testé ce dernier point pour l'instant. Ca s'intégre très bien dans VScode, donc pour l'instant je suis très satisfait. L'outil est assez bien documenté, et il y a des mise à jour régulière. Pour l'instant c'est majoritairement pour des STM32, mais il aussi d'autre target comme le RP2040 par exemple.

Côté architecture, j'ai fait quelque chose d'assez classique (un genre de "Superloop") qui me satisfait qu'à moitié. Dans ce cas précis il n'y a rien de très critique, et le code reste globalement très simple. Mais pour des projets plus complexes, je suis toujours à la recherche d'une approche plus satisfaisante. J'ai testé la librairie [Boost::ext].SML dans certain composant du tuner. Cette libraire permet de décrire le système comme une machine d'état, et de manière assez lisible :

Code : Tout sélectionner

   return make_transition_table(
   //  Start                   Event                     Guard           Action                                    Next
   //+---------------------+------------------------+----------------+---------------------------------------------+---------------------+
       *"state1"_s             +    "e1"_e        [guard1]             /(action1)                       = "state2"_s,
        "state2"_s             +    "e2"_e        [guard2]             /(action2)                       = "state1"_s,
                        );


Ce code décrit une machine d'état avec une table de transition. En fonction de l'état présent, et sous condition d'un événement et d'un "guard", la machine peut passer à l'état suivant et exécuter une action précise. C'est une approche que j'aime beaucoup car assez familière; je l'ai pas mal utilisé sur des FPGA notamment. Le gros avantage [Boost::ext].SML est que, grace aux méthode d'exécution à la compilation du C++, la table de transition est transformée par la librairie en un grand "switch case" ou "if else if ..." à la compilation, et donc l'overhead de la machine d'état est faible ou nul. Le développeur de librairie le démontre assez bien en montrant l'assembleur généré. Les points négatifs pour moi sont que c'est pas toujours très simple/clair de savoir ce qu'il se passe réellement, et que c'est assez dur comprendre les erreurs de compilations. Le temp de compilation est aussi pas mal allongé car beaucoup de chose à faire. Ces deux derniers point sont améliorés dans la V2 de la librairie mais je n'ai pas encore testé.

Sinon il y a des approches à base de scheduler type RTOS ou autre mais je ne suis pas vraiment convainvu pour l'instant. Intel met à disposition la librairie compile-time-init-build qui utilise une approche similaire mais avec beaucoup de chose exécutées à la compilation, et donc avec un overhead minimal. Il y aussi pas mal d'autres outils à dispo, pour du debugs par exemple. Je pense tester prochainement. Sinon côté debug pur, il y aussi les outils d'orbcode qui me font de l'oeil (en parti développé par un des developpeur de modm.io). Je pense qu'il y a un peu de boulot pour tout mettre en place mais ça me semble prometteur !

Bref, tout ça pour dire que le C++ pour l'embarqué c'est super, et qu'il y a plein d'outils open-source à disposition qui permettent de faire tout plein de chose sympa pour occuper les soirées et les week-end :hehe: :hehe:

Et surtout, mon père peut écouter la radio dans son salon ! :cote:

Louis

Avatar de l’utilisateur
alka
Administrateur du site
Messages : 3097
Enregistré le : mer. 15 juil. 2015 15:18
Localisation : 92
Contact :

Re: FM, DAB+ et C++ moderne

Messagepar alka » sam. 11 janv. 2025 11:28

Très beau projet, très pro et cerise sur le gateau, c'est FIP :amen:

J'écoute beaucoup la radio par internet (et surtout FIP et ses web radios). Depuis que DAB+ est réellement disponible chez moi, je me suis posé la question d'un tuner à brancher sur mon dspiy pour avoir une source indépendante d'internet. Mais je n'ai pas le courage de le faire en diy :-|

Pourquoi un STM et pas un ESP32 ?

louisr
Messages : 468
Enregistré le : mar. 14 juil. 2015 15:52
Localisation : Bordeaux/Poitiers

Re: FM, DAB+ et C++ moderne

Messagepar louisr » sam. 11 janv. 2025 11:42

Merci ::d

alka a écrit :Depuis que DAB+ est réellement disponible chez moi, je me suis posé la question d'un tuner à brancher sur mon dspiy pour avoir une source indépendante d'internet. Mais je n'ai pas le courage de le faire en diy :-|


Honnêtement, je trouve l'intérêt du DAB+ assez limité vis-à-vis des webradio, mais c'était ce que mon papa voulait :]. Après effectivement on ne dépend pas d'internet, ça a aussi son intérêt !

alka a écrit :Pourquoi un STM et pas un ESP32 ?


Pas de raison particulière en dehors que je connais plutôt bien les STM32 et pas du tout les ESP32. Il faudra que je m'y mette un jour, à moins que je saute directement vers les RISC-V :]

Avatar de l’utilisateur
alka
Administrateur du site
Messages : 3097
Enregistré le : mer. 15 juil. 2015 15:18
Localisation : 92
Contact :

Re: FM, DAB+ et C++ moderne

Messagepar alka » sam. 11 janv. 2025 12:13

louisr a écrit :
alka a écrit :Pourquoi un STM et pas un ESP32 ?
Pas de raison particulière en dehors que je connais plutôt bien les STM32 et pas du tout les ESP32. Il faudra que je m'y mette un jour, à moins que je saute directement vers les RISC-V :]

dans la famille ESP32 il y a le C3 qui est un RISC-V.

L'intéret de l'ESP32 c'est le coté diy-friendly, wifi et BT intégrés. Et comme c'est chinois, les cartes de dév pullulent a prix dérisoire.
J'utilise VScode avec l'extension C/C++ arduino et c'est plutot cool.

Thierry a touché aux deux, STM et ESP . Son avis sera plus pertinent que le mien.

louisr
Messages : 468
Enregistré le : mar. 14 juil. 2015 15:52
Localisation : Bordeaux/Poitiers

Re: FM, DAB+ et C++ moderne

Messagepar louisr » sam. 11 janv. 2025 14:24

Merci pour l'info, je ne savais pas qu'ESP avait du RISC-V aussi.
En fait, une des principales raisons pour lesquelles je n'utilise pas d'ESP, c'est que je n'ai jamais eu de projet avec du BT/WIFI jusqu'à présent. Mais si cela devait arriver, je sauterai le pas sans hésiter ! :cote:

Parmi les choses qui m'intéressent aussi, il y a Rust. La communauté Rust pour l'embarqué a bien grandi, et on commence à voir pas mal de choses intéressantes. Il y a même des experts du C++ pour l'embarqué qui font la promotion de Rust, c'est dire ! :D
Cela reste encore un peu un pari, car rien ne garantit que cela va marcher sur le long terme, et ça impliquerait d'apprendre un nouveau langage. Mais peut-être que je le testerai rapidement lors d'un week-end pluvieux, pour me faire une idée !

Avatar de l’utilisateur
thierryvalk
Administrateur du site
Messages : 3750
Enregistré le : jeu. 9 juil. 2015 20:08
Localisation : Belgique

Re: FM, DAB+ et C++ moderne

Messagepar thierryvalk » sam. 11 janv. 2025 21:44

Très beau projet, surtout que c'est technique, mais aussi avec un beau boitier, c'est un projet bien fini.

Niveau STM je ne connais pas, étant belge je suis plus NXP que ST. NXP anciennement Philips était implanté en Belgique. Comme quoi le choix d'un processeur...
Et c'est bien compliqué aujourd'hui. Nos produits initialement européen sont issus de gros groupes financiers et en face des produits chinois très alléchants, mais chinois.

C++ Oui dans certains cas c'est presque obligé, pour ma part, en embarqué, le c reste la solution la plus fiable. C++ restera encore longtemps trop lourd et douteux au niveau de la gestion mémoire.

Par contre dans 10 à 20 ans je me demande si notre métier existera encore.

Je suis heureux d'apprendre que je ne suis pas le seul à ne pas aimer Éclipse...

louisr
Messages : 468
Enregistré le : mar. 14 juil. 2015 15:52
Localisation : Bordeaux/Poitiers

Re: FM, DAB+ et C++ moderne

Messagepar louisr » dim. 12 janv. 2025 13:17

thierryvalk a écrit :Très beau projet, surtout que c'est technique, mais aussi avec un beau boitier, c'est un projet bien fini.

Merci Thierry :amen:
thierryvalk a écrit :Niveau STM je ne connais pas, étant belge je suis plus NXP que ST. NXP anciennement Philips était implanté en Belgique. Comme quoi le choix d'un processeur...
Et c'est bien compliqué aujourd'hui. Nos produits initialement européen sont issus de gros groupes financiers et en face des produits chinois très alléchants, mais chinois.

Oui je suis d'accord. Et il y a des effets de mode aussi. De toute façon pour ce genre d'application, et avec les performances des µC modernes, (quasiment) n'importe lequel aurait fait l'affaire ! J'ai fait mon acte patriotique et j'ai choisi ST :ange:
thierryvalk a écrit :C++ Oui dans certains cas c'est presque obligé, pour ma part, en embarqué, le c reste la solution la plus fiable. C++ restera encore longtemps trop lourd et douteux au niveau de la gestion mémoire.

Pour l'aspect mémoire oui c'est pas toujours très clair je suis bien d'accord. Le framework que j'utilise n'implémente pas par défaut l'allocation sur le heap, donc si par erreur on le fait, ça génère un erreur de compilation. C'est pratique quand on maitrise pas trop :gene:
thierryvalk a écrit :Par contre dans 10 à 20 ans je me demande si notre métier existera encore.

Au vu des dernières avancées, bien malin celui qui peut le prédire ::d

GoodNoize
Messages : 812
Enregistré le : mar. 27 nov. 2018 17:18
Localisation : Jura

Re: FM, DAB+ et C++ moderne

Messagepar GoodNoize » dim. 12 janv. 2025 18:36

Beau travail :)

Alors perso je peu pas commenter la partie soft, ni le hardware d'ailleurs :gene:
Mais question va être plus mécanique :
Comment sont montés les boutons en façade ? C'est des capuchons clipsés dans des bouton tacts ? Comment tu gère le recul du PCB en fonction du bouton ?
Si tu peux me faire un gros plan la dessus ça m'intéresse.
L'intégration est magnifique !

louisr
Messages : 468
Enregistré le : mar. 14 juil. 2015 15:52
Localisation : Bordeaux/Poitiers

Re: FM, DAB+ et C++ moderne

Messagepar louisr » mer. 15 janv. 2025 11:11

GoodNoize a écrit :Beau travail :)

Alors perso je peu pas commenter la partie soft, si le hardware d'ailleurs :gene:
Mais question va être plus mécanique :
Comment sont montés les boutons en façade ? C'est des capuchons clipsés dans des bouton tacts ? Comment tu gère le recul du PCB en fonction du bouton ?
Si tu peux me faire un gros plan la dessus ça m'intéresse.
L'intégration est magnifique !


Hello GoodNoize,
Merci :cote:

Les boutons sont fait en laiton au tour. Je n'ai pas de photo car j'ai plus le tuner sous la main mais voici des photos du plan :

face avant côté intérieur :
Screenshot 2025-01-15 at 12.01.17.png


face avant vue de dessus :
Screenshot 2025-01-15 at 12.02.20.png


Ils sont simplement appuyés sur les switches, soudés au PCB. Je savais pas trop comment faire, et j'avais vu cette solution simpliste sur un appareil commercial alors j'ai juste copié ::d
Ca marche pas trop mal mais ça fait un bruit de clic aigu pas très agréable. Je pense que ça vient du bouton qui est assez lourd et du PCB qui est comparativement fin et avec une grande surface pour vibrer. J'ai essayé d'atténuer avec des pads en caoutchouc mais ça n'a pas résolu le problème. Il faudra que j'y réflechisse mieux la prochaine fois ::d

Louis

GoodNoize
Messages : 812
Enregistré le : mar. 27 nov. 2018 17:18
Localisation : Jura

Re: FM, DAB+ et C++ moderne

Messagepar GoodNoize » lun. 27 janv. 2025 10:19

Oups, je suis passé à côté de ta réponse.
Merci beaucoup pour ces explications :)

Si je comprend bien les boutons ont un épaulement et sont en "tenon" dans la façade. coincés entre le PCB et la façade.
C'est super propre.

louisr
Messages : 468
Enregistré le : mar. 14 juil. 2015 15:52
Localisation : Bordeaux/Poitiers

Re: FM, DAB+ et C++ moderne

Messagepar louisr » lun. 27 janv. 2025 12:53

GoodNoize a écrit :Oups, je suis passé à côté de ta réponse.
Merci beaucoup pour ces explications :)

Si je comprend bien les boutons ont un épaulement et sont en "tenon" dans la façade. coincés entre le PCB et la façade.
C'est super propre.


Merci :amen:

Oui c'est ça. C'est très simple, j'avais un peu peur du résultat mais au final ça marche bien. Le seuil hic c'est le bruit un peu strident pas très agréable.
Je sais pas non plus comment ça va vieillir car c'est le ressort du bouton-poussoir qui fait tout, et la pièce en laiton est assez lourde en comparaison. J'avais pensé à rajouter un ressort supplémentaire mais j'ai pas trouvé de solution simple/clé en main :]

Avatar de l’utilisateur
thierryvalk
Administrateur du site
Messages : 3750
Enregistré le : jeu. 9 juil. 2015 20:08
Localisation : Belgique

Re: FM, DAB+ et C++ moderne

Messagepar thierryvalk » lun. 27 janv. 2025 14:01

Pour les switches tactiles, il existe différentes forces du ressort interne.
Peut-être qu'une force plus faible évitera le bruit.


Retourner vers « DSPiy général »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 8 invités