181 lines
4.9 KiB
Markdown
181 lines
4.9 KiB
Markdown
# USB-MIDI-Controller für Arduino Pro Micro
|
|
|
|
Dieses Projekt implementiert einen vollständigen USB-MIDI-Controller basierend auf einem Arduino Pro Micro (ATmega32u4) mit umfangreicher Hardware-Ausstattung.
|
|
|
|
## Hardware-Komponenten
|
|
|
|
### Hauptkomponenten
|
|
- **Arduino Pro Micro** (ATmega32u4) - Hauptcontroller mit USB-MIDI-Unterstützung
|
|
- **2x MCP23017** I/O Expander (I2C) - Erweitert GPIO-Pins für Buttons und LEDs
|
|
- **1x CD74HC4067** Multiplexer (16-Kanal, analog) - Für 12 analoge Regler
|
|
- **8x Drehpotentiometer** (B10K) - Analoge Eingabe
|
|
- **4x Schieberegler** (linear, 10K) - Analoge Eingabe
|
|
- **20x Tact Switches** - Digitale Buttons
|
|
- **20x LEDs** - Optisches Feedback
|
|
|
|
### Verdrahtung
|
|
|
|
#### CD74HC4067 Multiplexer
|
|
- S0 → Digital Pin 2
|
|
- S1 → Digital Pin 3
|
|
- S2 → Digital Pin 4
|
|
- S3 → Digital Pin 5
|
|
- SIG → Analog Pin A0
|
|
- VCC → 5V
|
|
- GND → GND
|
|
|
|
#### MCP23017 #1 (Adresse 0x20)
|
|
- VCC → 5V
|
|
- GND → GND
|
|
- SCL → Pin 3 (Arduino Pro Micro)
|
|
- SDA → Pin 2 (Arduino Pro Micro)
|
|
- A0, A1, A2 → GND (Adresse 0x20)
|
|
- Pins 0-15 → Buttons 0-15 (mit Pull-Up-Widerständen)
|
|
- Pins 0-15 → LEDs 0-15 (mit Vorwiderständen)
|
|
|
|
#### MCP23017 #2 (Adresse 0x21)
|
|
- VCC → 5V
|
|
- GND → GND
|
|
- SCL → Pin 3 (Arduino Pro Micro)
|
|
- SDA → Pin 2 (Arduino Pro Micro)
|
|
- A0 → 5V, A1, A2 → GND (Adresse 0x21)
|
|
- Pins 0-3 → Buttons 16-19 (mit Pull-Up-Widerständen)
|
|
- Pins 4-7 → LEDs 16-19 (mit Vorwiderständen)
|
|
|
|
## Software-Architektur
|
|
|
|
### Modularer Aufbau
|
|
|
|
#### 1. `config.h`
|
|
- Zentrale Konfigurationsdatei
|
|
- Hardware-Pin-Definitionen
|
|
- MIDI-Mapping-Tabellen
|
|
- Timing-Parameter
|
|
|
|
#### 2. `multiplexer.h/.cpp`
|
|
- Klasse für CD74HC4067-Multiplexer
|
|
- Analog-Wert-Erfassung mit Änderungs-Erkennung
|
|
- Schwellenwert-basierte Filterung
|
|
|
|
#### 3. `button_handler.h/.cpp`
|
|
- Button-Erfassung mit Debouncing
|
|
- Verwendung beider MCP23017-Chips
|
|
- Event-basierte Erkennung (Pressed/Released)
|
|
|
|
#### 4. `led_controller.h/.cpp`
|
|
- LED-Steuerung über beide MCP23017-Chips
|
|
- Zustandsverwaltung und Hardware-Synchronisation
|
|
|
|
#### 5. `midi_handler.h/.cpp`
|
|
- USB-MIDI-Kommunikation (bidirektional)
|
|
- Note-On/Off und Control-Change-Nachrichten
|
|
- Callback-System für eingehende MIDI-Daten
|
|
|
|
#### 6. `main.cpp`
|
|
- Hauptprogramm mit Setup und Loop
|
|
- Integration aller Module
|
|
- Timing-Management für optimale Performance
|
|
|
|
## MIDI-Implementierung
|
|
|
|
### Ausgehende MIDI-Nachrichten
|
|
|
|
#### Control Change (CC)
|
|
- **Potis 1-8**: CC1 - CC8
|
|
- **Schieberegler 1-4**: CC9 - CC12
|
|
- **Wertebereich**: 0-127
|
|
- **Kanal**: 1 (konfigurierbar)
|
|
|
|
#### Note-On/Off
|
|
- **Buttons 1-20**: Noten C2 (36) bis G3 (55)
|
|
- **Velocity**: 127 (Note-On), 0 (Note-Off)
|
|
- **Kanal**: 1 (konfigurierbar)
|
|
|
|
### Eingehende MIDI-Nachrichten
|
|
|
|
#### Note-On/Off für LED-Steuerung
|
|
- Entsprechende LEDs werden basierend auf Note-Nummer ein-/ausgeschaltet
|
|
- Synchronisation mit DAW-Software (z.B. Ableton Live)
|
|
|
|
## Verwendung
|
|
|
|
### Kompilierung und Upload
|
|
```bash
|
|
# PlatformIO verwenden
|
|
pio run --target upload
|
|
|
|
# Oder über PlatformIO IDE in VS Code
|
|
```
|
|
|
|
### Erste Schritte
|
|
1. Hardware gemäß Verdrahtungsplan anschließen
|
|
2. Code kompilieren und auf Arduino Pro Micro hochladen
|
|
3. USB-Verbindung zum Computer herstellen
|
|
4. In DAW/MIDI-Software als USB-MIDI-Gerät auswählen
|
|
5. LED-Test beim Start beobachten
|
|
6. Regler und Buttons testen
|
|
|
|
### Debugging
|
|
- Serielle Konsole (115200 Baud) für Debug-Ausgaben
|
|
- LED-Test beim Start zeigt Hardware-Funktionalität
|
|
- MIDI-Events werden in der Console geloggt
|
|
|
|
## Konfiguration
|
|
|
|
### MIDI-Mapping anpassen
|
|
In `config.h` können folgende Arrays angepasst werden:
|
|
```cpp
|
|
// CC-Nummern für analoge Regler
|
|
const uint8_t ANALOG_CC_MAP[NUM_ANALOG_CONTROLS] = {...};
|
|
|
|
// Note-Nummern für Buttons
|
|
const uint8_t BUTTON_NOTE_MAP[NUM_BUTTONS] = {...};
|
|
```
|
|
|
|
### Timing anpassen
|
|
In `main.cpp`:
|
|
```cpp
|
|
const unsigned long ANALOG_READ_INTERVAL = 10; // 100Hz
|
|
const unsigned long BUTTON_READ_INTERVAL = 5; // 200Hz
|
|
const unsigned long MIDI_READ_INTERVAL = 1; // 1000Hz
|
|
```
|
|
|
|
## Troubleshooting
|
|
|
|
### MCP23017 nicht erkannt
|
|
- I2C-Verkabelung prüfen (SDA, SCL)
|
|
- Adressen-Jumper kontrollieren
|
|
- Pull-Up-Widerstände an I2C-Bus (4.7kΩ)
|
|
|
|
### LEDs funktionieren nicht
|
|
- Vorwiderstände prüfen (220-470Ω empfohlen)
|
|
- Verdrahtung der MCP23017-Ausgänge kontrollieren
|
|
- Pin-Zuordnung in Code überprüfen
|
|
|
|
### MIDI wird nicht erkannt
|
|
- USB-Kabel prüfen (Datenübertragung muss unterstützt werden)
|
|
- Arduino Pro Micro als USB-MIDI-Gerät in DAW auswählen
|
|
- MIDI-Kanal-Konfiguration überprüfen
|
|
|
|
### Analoge Werte schwanken
|
|
- `ANALOG_THRESHOLD` in `config.h` erhöhen
|
|
- Netzteil-Qualität prüfen (saubere 5V)
|
|
- Verkabelung der analogen Regler kontrollieren
|
|
|
|
## Erweiterungen
|
|
|
|
### Zusätzliche Features
|
|
- Encoder-Unterstützung
|
|
- Display-Integration (OLED/LCD)
|
|
- Preset-Speicherung (EEPROM)
|
|
- Weitere MIDI-Modi (Program Change, etc.)
|
|
|
|
### Hardware-Erweiterungen
|
|
- Zusätzliche MCP23017 für mehr I/Os
|
|
- Mehrere Multiplexer für mehr analoge Eingänge
|
|
- RGB-LEDs für erweiterte Rückmeldung
|
|
|
|
## Lizenz
|
|
|
|
Dieses Projekt steht unter MIT-Lizenz und kann frei verwendet und modifiziert werden.
|