JX Wave Generator – Arduino-kompatibler DDS-Oszillator mit OLED-Display
Komponenten und Zubehör
| Arduino Nano R3 | 1 | Alternativ kann vermutlich jedes Arduino-Modell verwendet werden |
| SH1106 I2C OLED Display 128x64 Pixel (4 Pin) | 1 | |
| AD9833 DDS-Modul | 1 | |
| Drehgeber mit Taster | 1 | Lötkolben erforderlich |
| Drehgeber-Modul | 1 | Besser für Steckbrett-Montage |
| 5V Relais-Modul (optional) | 1 | Optional, falls keine AC/DC-Kopplungsumschaltung nötig ist |
| Reed-Relais 5V 500 Ohm | 1 | Ideal für Kleinsignale, direkt an Arduino-Pins anschließbar (10 mA) |
| Kondensator 10 µF | 1 | |
| Kondensator 10 nF | 1 | Polyester-Kondensator |
| AC-DC 100-220V auf 5V Step-Down Netzteil-Modul | 1 | Optional, für Stromversorgung ohne USB |
Benötigte Werkzeuge und Maschinen
- Lötkolben (generisch) – nicht zwingend erforderlich, wenn nur auf Steckbrett getestet wird
Apps und Online-Dienste
- image2cpp – Zum Konvertieren eigener Icons in hexadezimales Format für PROGMEM
Über dieses Projekt
Lange habe ich den Kauf eines Oszilloskops hinausgezögert. Nach der Anschaffung wurde klar: Für die Hobby-Elektronik fehlt noch ein preiswerter Signalgenerator – unverzichtbar zur Diagnose von Audio-Schaltungen und mehr. Die Kombination aus Elektronik und Programmierung macht ein Arduino-basiertes Eigenbau-Projekt zur idealen Lösung.
Funktionen
- Ausgangsfrequenz von 1 Hz bis 999.999 Hz
- Zwei Frequenzänderungs-Modi: logarithmisch und stellenweise (Einzelerhöhung)
- Drei Wellenformen: Sinus, Dreieck, Rechteck
- AC- oder DC-Ausgangskopplung
- Kontinuierlicher Sweep zwischen zwei vordefinierten Frequenzwerten
- Bedienung ausschließlich über einen einzelnen Drehgeber
- Integrierter Bildschirmschoner zum Schutz der OLED-Lebensdauer
Hinweis
ACHTUNG: Seien Sie extrem vorsichtig beim Umgang mit Netzspannung!
Lebensgefahr durch Stromschlag und/oder Verletzungen an Haut und Augen.
Passen Sie auf Ihr Leben auf – Sie haben nur eines!
Kurzanleitung
Prototyp
Ich verwendete ein vormontiertes Relais-Modul mit 10A-Kontakten, da mir kein Mikro-Reed-Relais zur Verfügung stand. Dies wäre die beste Wahl, um Transistoren, Dioden und Widerstände zu vermeiden, wenn keine Leistungsrelais benötigt werden. Ein digitaler Arduino-Pin liefert maximal 40 mA – ein elektromechanisches Relais mit 120/150 Ohm Spule kann daher nicht direkt angeschlossen werden.
Quellcode
Das Projekt besteht aus drei Dateien:
- JX_Wave_Generator_8.7.7.ino – Hauptprogramm (Version 8.7.7, Revision vom 16.01.2021)
- JXWG_Defs.h – Definitionen, Pin-Belegungen, Variablen und Konfigurationsstruktur
- JXWG_Graphics.h – Icon-Daten (Bitmaps) im PROGMEM
Hauptprogramm (Auszug)
/* Copyright (c) 2020 Janux – MIT Lizenz */
#include "JXWG_Defs.h"
#include "JXWG_Graphics.h"
void setup() {
// Encoder-Pin-Konfiguration
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 Frequenz 615 kHz
attachInterrupt(digitalPinToInterrupt(PinS), encoderSwitch, FALLING);
DDS_Init();
setConfig(); // Konfiguration laden und Startwerte setzen
}
void loop() {
JX_WaveGenerator_MAIN();
}
// Hauptfunktion mit Zustandsmaschine für verschiedene Betriebsmodi:
// LOGARITHMIC, SINGLEDIGIT, SWEEP, OPTIONS, OPTMODE, OPTWAVE, OPTCOUP, OPTSWEEP, SWEEPEDIT, DIGITCHANGE
void JX_WaveGenerator_MAIN() {
// ... Zustandsmaschine für Encoder-Drehung, Tastendrücke, Langdruck
// Frequenzberechnung, Display-Aktualisierung, DDS-Ansteuerung
// Sweep-Funktionen, Konfigurationsspeicherung im EEPROM
// Bildschirmschoner nach 10 Min Inaktivität
}
Wichtige Definitionen (JXWG_Defs.h)
- Pin-Belegung: Encoder (A=5, B=4, Switch=3), Kopplungs-Relais (Pin 7), DDS (FSY=9, CLK=10, DAT=11)
- Betriebsmodi: LOGARITHMIC (0), SINGLEDIGIT (1), SWEEP (2), OPTIONS (3), OPTMODE (4), OPTWAVE (5), OPTCOUP (6), OPTSWEEP (7), SWEEPEDIT (8), DIGITCHANGE (9)
- Wellenformen: SQUARE (0), SINE (1), TRIANGLE (2)
- Kopplungsmodi: AC (0), DC (1), OFF (2)
- Konfigurationsspeicherung im EEPROM ab Adresse 32 mit Versionsprüfung
Grafik-Daten (JXWG_Graphics.h)
Enthält alle Icons als Bitmaps im PROGMEM (ca. 1.148 Bytes): Betriebsmodi (Logarithmisch, Einzeller, Sweep), Wellenformen (Rechteck, Sinus, Dreieck), Kopplung (AC, DC, OFF), Sweep-Parameter (Min, Max, Step, Start, Pause), kleine Status-Icons und Symbole (Pfeile, Dreh-Icon).
Schaltplan
Herstellungsprozess
- Wassertropfen-Hochgeschwindigkeitsfotografie mit Arduino Nano – DIY Setup
- Bluetooth-gesteuerter Arduino-Spybot bauen – Überwachungsroboter mit IP-Kamera
- FlickMote: Gestensteuerung per Ultraschall & IR für Smart Home (Arduino 101)
- DIY Arduino TV-B-Gone: Universelle TV-Aus-Fernbedienung
- Einen eigenen LED-Master-Clock mit Alarm bauen – aus 12 Metern Entfernung ablesbar
- Find Me: Smarter Gegenstands-Finder mit Arduino und Bluetooth
- Optimierte Stromversorgungslösungen für Arduino-Projekte
- DIY VR-Skateboard mit Arduino, Google Cardboard und Bluetooth bauen
- Arduino Mega mit NEO‑6M GPS-Modul verbinden: Schritt-für-Schritt-Anleitung
- Arduino Tic Tac Toe mit MAX7219 LED-Matrix und Karton-Gehäuse