JX Wave Generator – Arduino-compatibele DDS-oscillator met OLED-display
Onderdelen en benodigdheden
| Onderdeel | Aantal | Opmerking |
|---|---|---|
| Arduino Nano R3 | 1 | Andere Arduino-modellen werken waarschijnlijk ook |
| SH1106 I2C OLED-display 128x64 pixels (4 pins) | 1 | |
| AD9833 DDS-module | 1 | |
| Draaiencoder met drukknop | 1 | Vereist soldeerbout |
| Draaiencoder-module (voor breadboard) | 1 | Beter voor breadboard-montage |
| 5V relaismodule (optioneel) | 1 | Alleen nodig voor AC/DC-koppelingsmodus |
| Reed-relais 5V 500 Ohm | 1 | Beste keuze voor kleine signalen, kan direct op Arduino-pins (10 mA) |
| Condensator 10 µF | 1 | |
| Condensator 10 nF (polyester) | 1 | |
| AC-DC 100-220V naar 5V stap-naar-beneden voedingmodule (optioneel) | 1 | Voor voeding zonder USB |
Benodigde tools en machines
- Soldeerbout (optioneel, alleen voor permanente montage)
Apps en online diensten
- image2cpp – om aangepaste iconen om te zetten naar hexadecimaal formaat voor PROGMEM
Over dit project
Lang heb ik het kopen van een oscilloscoop uitgesteld. Nu ik er een heb, is het tijd voor een betaalbare signaalgenerator voor hobbygebruik – essentieel voor het diagnosticeren van audiocircuits en meer. Door mijn passies voor elektronica en programmeren te combineren, is zelf bouwen met Arduino de ideale oplossing.
Kenmerken
- Uitgangsfrequentie tussen 1 Hz en 999.999 Hz
- Twee frequentie-aanpassingsmodi: logaritmisch en per cijfer
- Drie golfvormen: sinus, driehoek en blokgolf
- AC- of DC-uitgangskoppeling
- Continue sweep tussen twee vooraf gedefinieerde frequentiewaarden
- Volledig bedienbaar met één enkele draaiknop
- Geïntegreerde schermbeveiliging om de levensduur van het OLED-display te verlengen
Let op
WEES EXTREEM VOORZICHTIG bij het werken met netspanning! Risico op elektrische schok en/of schade aan huid en ogen. Wees voorzichtig – je hebt maar één leven!
Snelreferentie
Prototype
Ik gebruikte een voorgeassembleerde relaismodule met 10A contacten, omdat ik geen micro reed-relais had. Dat zou de beste keuze zijn om transistoren, diodes en weerstanden te vermijden wanneer power-relais niet nodig zijn. Een Arduino digitale pin kan maximaal 40 mA leveren, dus je kunt geen elektromechanisch relais met een 120/150 ohm spoel direct aansluiten.
Code
Het project bestaat uit drie bestanden:
- JX_Wave_Generator_8.7.7.ino – Hoofdprogramma (versie 8.7.7, kleine revisie 16-01-2021)
- JXWG_Defs.h – Definities, variabelen en configuratie
- JXWG_Graphics.h – Icoondata en grafische elementen
Belangrijkste codefragmenten
Hoofdprogramma (JX_Wave_Generator_8.7.7.ino)
/* Copyright (c) 2020 Janux - MIT-licentie */
#include "JXWG_Defs.h"
#include "JXWG_Graphics.h"
void setup() {
// Encoder pinmodi instellen
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 snelheid 615 kHz
attachInterrupt(digitalPinToInterrupt(PinS), encoderSwitch, FALLING);
DDS_Init();
setConfig(); // Laad opgeslagen configuratie
}
void loop() {
JX_WaveGenerator_MAIN();
}
// Hoofdfunctie met staatmachine voor verschillende bedienmodi
void JX_WaveGenerator_MAIN() {
// ... state machine implementatie voor LOGARITHMIC, SINGLEDIGIT, SWEEP, OPTIONS, etc.
}
// Interrupt handler voor encoder drukknop
void encoderSwitch(void) {
encoderPush = true;
}
// Utility functies voor display, frequentieberekening, sweep, configuratieopslag, etc.
Definities (JXWG_Defs.h)
#ifndef JXWG_Defs
#define JXWG_Defs
#include
#include
#include
#include
#define PinA 5
#define PinB 4
#define PinS 3
SimpleRotary Encoder(PinA, PinB, PinS);
// Werkmodi
#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
// AD9833 pins
#define DDS_FSY 9
#define DDS_CLK 10
#define DDS_DAT 11
// Golfvormen
#define wSquare 0x28
#define wSine 0x00
#define wTriangle 0x02
// Configuratiestructuur voor EEPROM
typedef struct {
char version[6];
byte workmode;
byte wavetype;
byte couplingmode;
byte reservedbyte;
long sweepmax;
long sweepmin;
long sweepstep;
} config_type;
#endif
Grafische data (JXWG_Graphics.h)
Bevat alle bitmap-data voor iconen (werkmodi, golfvormen, koppelingsmodi, sweep-parameters) opgeslagen in PROGMEM. Totaal 1148 bytes programma-geheugen.
Schema's
Productieproces
- Waterdruppels vastleggen met Arduino Nano – DIY High-Speed Fotografie
- Bluetooth-gecontroleerde Arduino Spybot bouwen
- FlickMote: Gebarengecontroleerde IR-afstandsbediening voor Slimme Huizen
- DIY Arduino TV-B-Gone: Universele TV-uit-schakelaar
- Bouw een Aangepaste LED Hoofdklok met Alarm – Zichtbaar vanaf 12 Meter
- Find Me: Slimme Item Locator met Arduino en Bluetooth
- Geoptimaliseerde Voedingsoplossingen voor Arduino Projecten
- Bouw een DIY VR-skateboard met Arduino, Google Cardboard en Bluetooth
- Arduino Mega koppelen aan een NEO‑6M GPS-module: stapsgewijze handleiding
- Arduino Boter-Kaas-Eieren met MAX7219 LED Matrix en Kartonnen Behuizing
- Bouw een Slimme Arduino Vierpotige Robot: Stap-voor-Stap Handleiding