JX Wave Generator – Générateur DDS compatible Arduino avec affichage OLED
Composants et fournitures
| Composant | Quantité | Notes |
|---|---|---|
| Arduino Nano R3 | 1 | Tout modèle Arduino devrait fonctionner |
| Écran OLED SH1106 I2C 128x64 pixels (4 broches) | 1 | |
| Module DDS AD9833 | 1 | |
| Encodeur rotatif avec bouton-poussoir | 1 | Nécessite un fer à souder |
| Module encodeur rotatif (pour montage sur breadboard) | 1 | Meilleur pour le prototypage sur breadboard |
| Module relais 5V (optionnel) | 1 | Optionnel, pour changer le mode de couplage AC/DC |
| Relais reed 5V 500 Ω | 1 | Idéal pour les petits signaux, se connecte directement aux broches Arduino (10 mA) |
| Condensateur 10 µF | 1 | |
| Condensateur 10 nF (polyester) | 1 | |
| Module alimentation AC-DC 100-220V vers 5V (optionnel) | 1 | Pour alimenter le circuit sans USB |
Outils nécessaires
- Fer à souder (générique) – non indispensable pour les tests sur breadboard
Applications et services en ligne
- image2cpp – Pour convertir vos icônes personnalisées en format hexadécimal pour PROGMEM
À propos du projet
Depuis longtemps, je repoussais l'achat d'un oscilloscope. Maintenant que j'en ai un, il me fallait aussi un générateur de signaux peu coûteux pour mes loisirs, indispensable pour diagnostiquer des circuits audio et bien plus. Allier électronique et informatique, le mieux est de le faire soi-même avec Arduino.
Fonctionnalités
- Fréquence de sortie entre 1 Hz et 999 999 Hz
- Deux modes de variation de fréquence : logarithmique et chiffre par chiffre
- Trois types d'ondes : sinusoïdale, triangulaire et carrée
- Couplage de sortie AC ou DC
- Balayage continu entre deux fréquences prédéfinies
- Contrôle exclusif par un unique bouton rotatif
- Économiseur d'écran intégré pour préserver la durée de vie de l'OLED
Note importante
SOYEZ EXTRÊMEMENT PRUDENT lors de l'utilisation de la tension secteur ! Risque de choc électrique et de dommages corporels. Prenez soin de votre vie, vous n'en avez qu'une !
Références rapides
Prototype
J'ai utilisé un module relais pré-assemblé avec contacts 10A, n'ayant pas de micro relais reed sous la main. Ce serait le meilleur choix pour éviter transistors, diodes et résistances quand les relais de puissance ne sont pas nécessaires. Une broche numérique Arduino ne peut délivrer que 40 mA maximum, donc on ne peut pas connecter directement un relais électromécanique avec une bobine de 120/150 Ω.
Code source
Le projet se compose de trois fichiers :
JX_Wave_Generator_8.7.7.ino– Programme principalJXWG_Defs.h– Définitions, constantes et variablesJXWG_Graphics.h– Données graphiques (icônes en PROGMEM)
JX_Wave_Generator_8.7.7.ino (extrait)
/* Copyright (c) 2020 Janux – Licence MIT */
#include "JXWG_Defs.h"
#include "JXWG_Graphics.h"
void setup() {
// Configuration encodeur (avec ou sans résistances pull-up)
pinMode(PinA, INPUT);
pinMode(PinB, INPUT);
pinMode(PinS, INPUT);
digitalWrite(PinA, HIGH);
digitalWrite(PinB, HIGH);
digitalWrite(PinS, HIGH);
pinMode(PinCoupling, OUTPUT);
Encoder.setDebounceDelay(5);
display.begin(SH1106_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
Wire.begin();
TWBR = 5; // I2C à 615 kHz
attachInterrupt(digitalPinToInterrupt(PinS), encoderSwitch, FALLING);
DDS_Init();
setConfig(); // Charge la config et valeurs de démarrage
}
void loop() {
JX_WaveGenerator_MAIN();
}
// Fonction principale – machine d'états selon le mode (LOGARITHMIC, SINGLEDIGIT, SWEEP, OPTIONS, etc.)
void JX_WaveGenerator_MAIN() {
// ... logique de contrôle par encodeur rotatif ...
// Gestion des modes : fréquence, type d'onde, couplage, balayage (sweep)
// Affichage OLED, sauvegarde config en EEPROM, économiseur d'écran
}
JXWG_Defs.h – Définitions principales
#ifndef JXWG_Defs
#define JXWG_Defs
#include
#include
#include
#include
#define DEBUG 0
#define OLED_RESET -1
Adafruit_SH1106 display(OLED_RESET);
#define PinA 5
#define PinB 4
#define PinS 3
SimpleRotary Encoder(PinA, PinB, PinS);
// Modes de fonctionnement
#define LOGARITHMIC 0
#define SINGLEDIGIT 1
#define SWEEP 2
#define OPTIONS 3
#define OPTMODE 4
#define OPTWAVE 5
#define OPTCOUP 6
#define OPTSWEEP 7
#define SWEEPEDIT 8
#define DIGITCHANGE 9
#define PinCoupling 7
// Constantes d'affichage
#define XPOS 28
#define YPOS 21
#define DELTAX 12
#define DELTAY 4
#define SMALL 1
#define BIG 2
#define CW 1
#define CCW 2
#define PUSH 1
#define LONGPUSH 1
#define MAXDIGIT 6
// Types d'onde
#define SQUARE 0
#define SINE 1
#define TRIANGLE 2
// Modes de couplage
#define AC 0
#define DC 1
#define OFF 2
// Statut balayage
#define STILL 0
#define BREAK 1
#define PAUSE 2
// Broches AD9833
#define DDS_FSY 9
#define DDS_CLK 10
#define DDS_DAT 11
// Registres AD9833
#define wSquare 0x28
#define wSine 0x00
#define wTriangle 0x02
// Variables globales, structure de config EEPROM, macros utilitaires...
#endif
JXWG_Graphics.h – Icônes (extrait)
#ifndef JXWG_Graphics
#define JXWG_Graphics
// Icônes 25x16 stockées en PROGMEM : imgLog, imgDigit, imgSweep, imgSqr, imgSin, imgTri,
// imgCoAc, imgCoDc, imgCoOff, imgSwMax, imgSwMin, imgSwOpt, imgSwStep, imgSwStart,
// imgSwPause, imgTurn, imgSwRun, imgSwPsd, et versions small (9x8)
// Total : 1148 octets de mémoire programme
#endif
Schémas
Processus de fabrication
- Photographie Haute Vitesse : Capturez les Gouttes d'Eau avec Arduino Nano
- Construire un Spybot Arduino piloté par Bluetooth
- FlickMote : Télécommande IR à gestes pour maison connectée
- TV-B-Gone DIY Arduino : Télécommande universelle pour toutes les TV
- Construire une horloge maître LED personnalisée avec alarme – Visible à 12 mètres
- Find Me : Localisateur d'objets intelligent avec Arduino et Bluetooth
- Solutions d'alimentation optimisées pour projets Arduino
- Construisez un skateboard VR DIY avec Arduino, Google Cardboard et Bluetooth
- Connecter un module GPS NEO‑6M à l'Arduino Mega : Guide pas à pas