Sonntag, 28. April 2013

MIDI Shield für den Arduino

Nach dem LCD Shield folgt nun ein MIDI Shield, um das Programmieren und Testen für das Step Sequencer Projekt zu vereinfachen.

Die Anforderungen:
- MIDI In
- MIDI Out
- Programmierschalter (trennt MIDI vom seriellen Port)
- LED zur Anzeige der Funktion
- zwischen Arduino Uno (oder Mega) und LCD Shield platzierbar

Das MIDI In Signal wird galvanisch per Optokoppler vom Controller getrennt. Der Schmitt Trigger im Ausgangspfad dient der Stabilisierung des Ausgangssignals. Die LED habe ich eingebaut, da die LED am Arduinoboard, die an Pin 13 angeschaltet ist, durch die Shields überdeckt wird und nur schwer eingesehen werden kann.
 
Hier der Schaltplan und das Platinen Layout, entworfen mit Eagle von CadSoft:





 Die Bauteile:



R1, R2, R3, R4 Widerstand 220 Ω
R5 Widerstand 1,6 kΩ
R6 Widerstand 10 kΩ
C1 Keramikkondensator 100 nF
D1 Diode 1N4148
LD1 LED L-934LID, low current, 2 mA, rot
IC1 74HCT14N hex inverting Schmitt trigger
OK1 6N138 Optokoppler
S1 2-poliger Umschalter
X1, X2 MAB5SH Diodenbuchse, 5-polig, halbrund
sonstiges: 2x 6-polige Stecker-/Buchsenleiste (Arduino Stackable Header)
2x 8-polige Stecker-/Buchsenleiste (Arduino Stackable Header)
Platine

Die Platine:

Die entsprechenden Eagle-Dateien können hier heruntergeladen werden:

http://hardsoldered.de/downloads.html

Die Ätzmaske der Platine habe ich wieder im Tonertransferverfahren aufgebracht. Diesmal jedoch nicht mit einem Bügeleisen, sondern mit einem Laminator. Ich habe mir einen PAVO HD-220-PRO zugelegt, der für diese Anwendung mit 160 °C ausreichend heiß wird und nicht umgebaut werden muss.


Das Ätzen erfolgte wieder im selbstgebauten Ätzgerät:


... und führte zu einem brauchbaren Ergebnis:


Es folgte das Bohren und anschließend das Bestücken.


Hier im Verbund mit dem LCD Shield


Der Code für den ersten Funktionstest liefert eine aufsteigende Tonfolge an einem MIDI fähigen Gerät (bei mir Roland Juno GI):


/*
  midi test by chris 130415

*/

// include libraries:
#include <LiquidCrystal.h>
#include <Encoder.h>

// initialize libraries:
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
Encoder myEnc(9, 10);

// initialize button pins:
int buttonPin[] = {8, A5, A4, A3, A2, A1, A0};
int led = 13;

// initialize values:
int val[] = {1,1,1,1,1,1,1};
int banz = 7;
int resetButton = 0;
char blockChar = 255;
const int numRows = 2;
const int numCols = 16;


void setup() {
  for( int i=0; i<banz; i++) {
    pinMode( buttonPin[i], INPUT );
    digitalWrite( buttonPin[i], HIGH);
  }
  lcd.begin(numCols, numRows);
  Serial.begin(31250);
  pinMode(led, OUTPUT);    
  lcd.clear();
  lcd.home();
  lcd.print("MIDI Note:    ");
}

void loop() {
  for (int note = 0x1E; note < 0x5A; note ++) {
    noteOn(0x90, note, 0x45);
    lcd.setCursor(0, 1);
    lcd.print("                ");
    lcd.setCursor(0, 1);
    lcd.print(note);
    digitalWrite(led, HIGH);  
    delay(250);
    noteOn(0x90, note, 0x00);  
    digitalWrite(led, LOW);   
    delay(250);
  }
}

void noteOn(int cmd, int pitch, int velocity) {
  Serial.write(cmd);
  Serial.write(pitch);
  Serial.write(velocity);
}