Générateur pure sinusoidal de SHumann

Bonjour a tous, je sollicite l'aide de la communauté Arduino afin de m'aider pour la parti code pour la réalisation d'un projet de générateur de Shumann.

Son fonctionnement est assez simple, il me faut un signal analogique sinusoïdale le plus pure possible(sans micro coupure entre chaque période, forme sinusoïdale parfaite, maximum de définition/dynamique (dans la limite des 5v de sortie arduino et des 1024 position du 10bit qu'il offre si je ne me trompe pas) avec :

  • 6 preset de temps de fonctionnement(le 6eme étant infini)
  • 6 preset de fréquence fixe(le 6eme en modulation de fréquence)
  • 6 preset d'amplitude fixe(le 6eme en modulation d'amplitude)

et donc si c'est pas trop compliqué la possibilité de modulation sur la fréquence et l'amplitude
(le 6eme preset des lignes Fréquence et Amplitude).

Le tout paramétrable avec un seul bouton pour simplifié et facilité son utilisation et un afficheur OLED 128x64 sur 4 lignes pour affiché le temps de fonctionnement défini,la fréquence défini, l'amplitude défini et le temps restant de fonctionnement sous forme de compte a rebours.

Niveau matériel ca sera donc un Arduino nano,un afficheur OLED 128x64 et un seul bouton poussoir pour la programmation des différentes variables.

Un potentiomètre 10 ou 100k en sortie d'arduino pour ajuster le gain(et calibré la puissance maxi) car la partie puissance serra assuré par un module d'ampli audi BTL qui a un gain fixe, le tout alimentera une charge sous forme de bobine spiral en PCB.Très simple.

Pas vraiment l'envie d'utiliser le mode PWM avec un filtrage RC en sortie pour générer ce signal sinusoïdal(signal pas assez propre,trop d'harmonique,pas assez « lisse »),j'ai trouver un code d'un vrai générateur sinusoïdal avec la fonction sin arduino qui pourra j'imagine facilité le début du code de ce projet:

Par contre il est en 8bit donc 256 valeurs ,il faudrait le passer en 10bit 1024 valeurs pour avoir le maximum de résolution.

Je devrais m'en sortir pour inclure les librairies d'afficheur Oled 128x64 SSD1306 et GFX de Adafruit, dans l’IDE Arduino par contre je n'en sais pas plus pour la suite...

A défaut de savoir codé,j'ai fait la description de son fonctionnement en français pour facilité sa compréhension et son codage en langage arduino:

Les 4 lignes de données qui s'affiche en continu sur l’écran sont:

Temps :
Fréquence :
Puissance : (qui est l'amplitude du signal, voir 'variables dans le code et a l'afficheur' plus bas)

et une 4eme ligne qui affiche le compte a rebours en temps réel

donc réglage de taille de font size sur 2 dans le code pour 4 lignes sur écran OLED 128x64

Les 6 preset par paramètres(valeurs par défaut a l'allumage => premier preset) sont:

Temps : 5min / 10min / 15min / 20min / 30min / inf (pour infini)

Fréquence : 7,83Hz / 14,1Hz / 20,6Hz / 26Hz / 32,4 / MOD (pour modulation ,aller retour infini 20-40hz en T1 secondes)

Puissance : 0,5w / 1w / 3w / 5w / 10w / MOD (pour modulation,aller retour infini 3w-7w en T2 secondes

Toutes les valeurs de preset devront etre editable dans le code.

Il n'y a q'un preset de modulation de fréquence et un preset de modulation d'amplitude.
on a 2 variables de temps, T1 et T2 et 4 limites associés(20-40hz et 3-7w) qui sont paramétrable uniquement dans le code (voir explication « variables dans le code » plus bas)

L'affichage se présente comme ceci:

Temps: ** min _______________ (** deviens «inf» pour le 6eme preset)
Fréquence: ** , ** Hz _______ (** , ** deviens «MOD» pour le 6eme preset)
Puissance: * , * Watt_________ (* , * deviens «MOD» pour le 6eme preset)
Temps restant : ** : ** _______(minute : seconde)

A l'allumage :

Une image (drawBitmap ) de démarrage s'affiche en continu (si la taille du code le permet).Je l' intégrais au format approprié dans le code...si on me dit ou et comment :slight_smile:

Un appuis bref sur le bouton :

  • Coup l'affichage de l'image de démarrage et affiche l'interface principal sur les 4 lignes avec les paramètres et leurs variables par défaut(première valeur de preset) comme ceci:

Temps: 05 min _______________ (05 deviens «inf» pour le 6eme preset)
Fréquence: 07,83 Hz _______ (07,83 deviens «MOD» pour le 6eme preset)
Puissance: 0,5 Watt_________ (0,5 deviens «MOD» pour le 6eme preset)
Temps restant : 05:00 _______(minute : seconde)

  • active la sortie analogique sinusoïdal avec les paramètres par défaut(première valeur de chaque preset)
  • le compte a rebours de la 4eme ligne commence a décompter

Mode programmation et fonctionnement:

L'affichage est fixe et le compte a rebours décompte(on a déjà appuyer une fois sur le bouton pour lancé l'affichage (des valeurs par défaut),le générateur est en route le Temps restant décompte):

1-un appuis bref sur le bouton relance le compte a rebours a sa valeur défini(=>reset compte a rebours) sans interruption de la sortie analogique=>permet de relancer le timer par un simple appuis pour prolonger l'utilisation

2-Un appuis de 3s fait entré en mode programmation(sans interruption de la sortie analogique)

  • la variable du 1er paramètre/ligne «Temps:» clignote et est éditable (par appuis bref et successif du bouton)

  • chaque appuis bref sur le bouton fait passer a la valeur preset suivante de la variable (les 6 preset défilent a chaque appuis avec un bouclage infini)

3-Un nouvelle appuis de 3s (=>validation et changement de paramètre/ligne)

  • Valide/implémente instantanément la valeur de la variable en cour dans le code(sans interruption de la sortie analogique)

  • Stop le clignotement de la variable en cour (qui passe en fixe)

  • Passe a la variable du paramètre/ligne suivant qui se met a clignoté(bouclage infini des 3 paramètres/lignes=> quand on arrive au paramètre «Puissance», un appuis de 3s fait repasser au paramètre «Temps» ainsi de suite)

  • le compte a rebours démarre/est relancé (a chaque appuis de 3s) a sa valeur défini en ligne1.

4-Quand une des variables clignote(mode programmation) et après 5s sans action du bouton(=>validation automatique et sortie du mode programmation):

  • Valide/implémente instantanément la valeur de la variable en cour dans le code(sans interruption de la sortie analogique)

  • Stop le clignotement de la variable en cour(qui passe en fixe)

  • le compte a rebours démarre/est relancé a sa valeur défini en ligne1.

Les variables programmées son stockées même si on arrête l'arduino(c'est possible?) si non re démarrage avec les valeurs par défaut(1er preset de chaque paramètre)

En mode programmation, chaque validation de paramètre(soit après un appuis de 3s ou après 5s sans action du bouton) relance le compte a rebours a sa valeur défini en ligne1.

L'afficheur reste actif tout le temps du décompte du compte a rebours.

A la fin du compte a rebours la sortie analogique s’arrête, l'afficheur affiche l'image de démarage, le compteur se réinitialise a sa valeur défini(reset compteur), les variables programmées son stockées même si on arrête l'appareille, le système attends un appuis bref sur le bouton pour relancé un cycle=>retour a l'état d'allumage.

Matos:
-Arduino nano
-Afficheur OLED 128x64
-1 bouton poussoir

Sortie analogique : (laquelle choisir?)
Uniquement un signal sinusoïdal analogique(le plus simple avec la fonction «sin» arduino?)
d'amplitude 0-5v
avec un offset de 2,5v pour centré la sinusoïde entre 0 et 5v(je métrerait un condo en série a la sortie pour supprimer la composante continue)

variables dans le code et a l'afficheur:
1-le temps est exprimé en seconde dans le code
en minute sur la 1er ligne de l'afficheur
en minute et seconde pour le compte a rebours
chaque valeur des 6 preset doit pouvoir être changer dans le code(en seconde ca me parait plus simple).

2-les fréquences sont exprimées en hertz avec 2 chiffres après la virgule (soit xx,xxHertz ) dans le code et a l'afficheur
chaque valeur des 6 preset doit pouvoir être changer dans le code.

3-les amplitudes sont exprimées en watt sur l'afficheur
en valeur numérique dans le code(0=>0v, 1024=>5v ?) ou en % d'amplitude ou en volt si c'est plus simple
il y aura donc un coefficient entre valeur numérique du code et watt affiché a l’écran ( coefficient paramétrable et ajustable depuis le code que je déterminerais par des mesures direct )
chaque valeur numérique des 6 preset doit pouvoir être changer dans le code.

4-Pour les 2 preset(les 6eme) de modulation de fréquence et d'amplitude, on a :

  • 2 variables de temps exprimés en seconde (ces variations doivent être très lentes donc plusieurs secondes )
    T1 pour la modulation de la fréquence, temps pour passer de 20 a 40hz
    T2 pour la modulation d'amplitude, temps pour passer de 3 a 7w
    ces variables doivent être modifiable dans le code

  • 4 variables de limites de modulation(début et fin) associés a T1 et T2
    ces variables doivent être modifiable dans le code
    20-40hz(par défaut) pour la modulation de fréquence(noté startHZ et endHZ dans le code)
    3-7w(par défaut) pour la modulation d'amplitude mais ca sera des valeurs numérique ou % ou tension dans le code comme vu précédemment(noté startAMP et endAMP dans le code).

Les modulations se passent comme suite:

  • pour la modulation de fréquence=>de 20hz( valeur de startHZ) vers 40hz( valeur de endHZ) dans un temps T1 puis de 40hz(endHZ) vers 20hz(startHZ) toujours en un temps T1 et ainsi de suite(mode bounce ou aller/retour infini)

  • pour la modulation d'amplitude=>de 3w(startAMP) a 7w(endAMP) dans un temps T2 puis de 7w(endAMP) a 3w(startAMP) toujours en un temps T2 et ainsi de suite(mode bounce ou aller/retour infini)

si la partie modulation de fréquence et amplitude sont trop compliqué a codé,on peut se limité a un fonctionnement avec seulement 6 preset fixe pour chaque paramètres.
mais ca serrait vraiment un plus de l'avoir...

j'ai un oscilo pour contrôler le bon fonctionnement et faire l'étalonnage de puissance/amplitude.

je crois que tout est la....merci d'avance :wink:

Les fréquences sont imposées.
La Théorie c'est le domaine des Mathématiques.
La réalisation c'est le domaine de la Physique.
En Physique tu n'auras jamais 7,83 Hz, tu auras 7,83 Hz ± x Hz.

Premier point à définir : quelle valeur maximale de x est acceptable.

Quel taux d'harmonique est acceptable : toujours pareil : le calcul mathématique est une chose, la réalisation physique en est une autre.

Deuxième point : on ne choisit pas un microcontrôleur à priori, on choisit le microcontrôleur qui est capable de faire le travail demandé.
As-tu vérifié que la carte nano qui est équipée d'un microcontrôleur 8 bits peut réaliser ces valeurs de fréquences ? Si elle ne peut pas faire 7,83 Hz, mais que 6,9 ou 8,9 Hz (valeurs au pif pour illustrer la question) est-ce grave ?

Il existe maintenant des microcontrôleurs 32 bits qui auront plus de possibilités pour approcher la fréquence théorique.
Il existe des microcontôleurs doté de DAC pour générer un signal analogique.
Il existe des modules DAC externes.
DAC = Digital Analog Converter, convertisseur numérique analogique (CNA) en français.

Cartes équipées de microcontrôleurs 32 bits les plus connues.
Elles se programment toutes avec les fonctions Arduino (IDE Arduino ou platformIO)

  • Carte Arduino : série des MKR (microcontrôleurs SAMD21 de chez Microchips).
  • Cartes "dites Espressif" : divers fabricants qui utilisent divers microcontrôleurs Espressif ESP32
  • Cartes équipées de microcontrôleurs STM32 de chez STMicroelectronic.

PS tu parles d'amplitude en watt.
Comment comptes-tu faire pour obtenir des watts ?
Watts électriques (avant l'antenne) ou watts réellement émis ?
L'antenne a un rendement.

Merci pour cette réponse rapide et les points abordés.

Effectivement même a +/-1% de marge (7,75hz-7,90hz) on est déjà limite niveau précision...et +/-2% =>7,67 -7,98 déjà trop...je me disait a des fréquences généré aussi basse l'arduino peut être capable d’être en dessous de +/- 1% ...
Si un cycle de code fait ~150us(ou je me trompe?), a 7.83hz ca nous fait 851 points de définition temporel possible sur une période complète et a 40hz plus que 166 points temporel pour une période complète, se qui me parais suffisant en terme de précision( avec 1024 points de définition en amplitude)
mais c'est la théorie, va t on avoir une stabilité et une précision suffisante au final? a votre avis?

Quel taux d'harmonique est acceptable?
pas celui d'un fonctionnement en duty cycle variable+filtre RC pour sur!
même si je sais avec ma technique proposer que le signal sinusoidal sera crénelé, 166 a 851 pas temporel et 1024 pas d'amplitude sera largement propre niveau harmonique(mais c'est a mesurer directement sur la charge inductive final) mais je me fait pas trop de soucis a ces niveaux de définition.

As-tu vérifié que la carte nano qui est équipée d'un microcontrôleur 8 bits peut réaliser ces valeurs de fréquences ?
réponse partiel au dessus, un 328p a 8Mhz qui ne peut pas sortir du 7/40hz...ca me parais bizarre non ?

chois d'une autre techno
j'y ai pensé mais je veux rester dans du très simple et maîtrisable a mon niveau donc arduino nano(pour le moment), si c'est trop compliquer je me rabats sur des options que j'ai déjà validés avec un GBF de labo(précis au 100eme de hz et mv) ou une appli GBF sur android + module récepteur audio blutooth avec lesquelles ca marche déjà vraiment très bien mais c'est pas "standalone"
j'ai trouver d'autres techniques pour faire du sinusoïdal( pwm+ filtre rc(déja évoqué) ou une sorte de tableur avec toute les valeurs d'une période(et on applique des coef dessus pour varier freq et amp) qu'on viens "ploter" en sortie analog
mais ca me parais moins versatile niveau code...

PS tu parles d'amplitude en watt....
oui c'est pour le coté utilisateur novice; c'est plus parlant d'afficher des watts(une puissance) sur l'afficheur qu'une valeur en tension ou % qui ne parle pas trop...
dans le code ca serra une valeur numérique d'amplitude du signal de sortie exprimer en tension ou % ou valeur numérique mais a l'afficheur ca sera juste un chiffre( de 0.5 a 10) qui correspondra a des watt sur la charge consommer par la bobine , je fait l’étalonnage avec un potar (câblé en diviseur de tension)en sortie d'arduino avant d'attaquer l'ampli audio qui a un gain fixe...je fait déja ca avec mon GBF: a 0.54v d'amplitude GBF j'ai 5w en sortie, 0.76v=>10w, 0.92v 15w....idem pour l'apli GBF sous android(avec le volume de la tablette et du module récepteur Bluetooth a fond et je varie l'amplitude uniquement sur l'app)....

L'antenne a un rendement.
oui je sais :slight_smile: j'ai bossé dans les radio fréquences...

j'ai modifier le code du lien de mon 1er post pour faire sortir le signal en pin A0 et checker le signal a l'oscilo, j'ai un signal carré!!! (duty cycle 50%)
a croire que la fonction sin ne fonctionne que pour une sortie en port série ??
(Serial.begin(9600); dans son code)
une explication?

de plus si je descent f0 (la fréquence dans son code) en dessous de 1 le signal deviens impulsionnel( duty cycle de 5 a 10%) mais je crois que ca viens de sa formule mathématique, faut que je creuse j'ai pas eu le temps aujourd’hui....une piste pour solutionner ca?

encore merci pour ta réponse :wink:
Jay

Par principe pas à moi.
Clairement je n'ai pas lu ta longue prose sur la génération de la fréquence.
J'ai simplement attiré ton attention pour savoir si tu avais vérifié que c'était possible.
Je ne suis pas un adepte du "je pense que" mais plutôt du "j'ai vérifié que".

Une nano ne peut délivrer que des signaux numériques, impossible de sortir autre chose que les niveau 0 V ou + 5 V.
La "sortie série" te donne des résultats de calcul, rien de plus et surtout pas un signal physique.
Ces deux types de "sorties" n'ont strictement rien avoir ensemble.

Pour des signaux analogiques, il y a deux types de convertisseurs :
ADC : Analog Digital Converteur ou convertisseur analogique (vers) numérique.
Et son inverse :
DAC : Digital Analog Converteur ou en français convertisseur numérique (vers) analogique.

Il y a aussi des méthodes détournées avec la PWM mais il faut y associer des modules de filtrage.

Le site de Mike Gammon qui a énormément publié sur les micros avr comme ceux de la nano.

Éviter la vitesse de 9600 source potentielle de ralentissement , passer au minimum à 115200.

Ça dépend de quoi tu parles sur un ATmega 328 il n'y a pas de DAC. Et digitalWrite() ne prend qu'un argument sur 8 bits.

Tu devrais peut-être regarder ça:

https://fr.aliexpress.com/item/2035449656.html

As tu vérifier que le calcul de ton sinus n'augmente pas le temps d'un cylce?

Bonjour a tous et merci pour vos participations!

J'avais déjà pensé a un DAC ou DDS (merci pour le lien ;)) mais ca me parait trop compliquer a mettre en oeuvre pour mon très faible niveau de codeur et une utilisation aussi basique...

J'ai testé le PWM+ filtre a partir de ce code:

et je me rends compte des limites de précision de fréquence/stabilité de l'arduino même pour du 7/40hz.
Sans compter le filtrage qui marche pour du 7hz et bcp moins bien pour du 40hz et vis versa...normal...

Donc je pense partir sur une tout autre solution très simple et efficace que j'avais déja en tête et que je n'ai pas encore abordé:
Un module DFplayer(micro module player mp3/wav avec carte SD, DAC 24bit 48khz) je pourrais mettre autant de fichier audio .wav que je veux(très facile a générer pour moi),ca facilité les modalités de control avec les fonctions play/stop/repeat/track nb/30 niveaux de volume(pour la modulation d'amplitude et niveaux de sortie)...

On arrive a un code très simple...donc si l'un de vous se sent pour poser la base du code....j'en serais ravis :slight_smile:

PS: Connaissez vous une interface graphique de programmation arduino qui vas bien?
dans le genre Vittascience, blockly@rduino mais avec librairie standards( en tout cas pour le oled et le DFplayer)...

Pas d'accord, le filtrage dépend uniquement de la fréquence du PWM si tu utilises une fréquence de PWM suffisamment élevée.

Maintenant, j'aimerais bien voir la taille d'une antenne qui pourrait émettre une onde électromagnétique de 38000 km de longueur d'onde.

John Owen a réalisé deux projets :
http://www.vwlowen.co.uk/arduino/AD9833-waveform-generator/AD9833-waveform-generator.htm
http://www.vwlowen.co.uk/arduino/AD9850-waveform-generator/AD9850-waveform-generator.htm
Le code est ultra-simple par rapport à celui permettant de gérer un DFPLAYER.

Merci pour les liens.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.