Sugarcube MIDI Controller

38 Schritt:Schritt 1: Schematische und Übersicht Schritt 2: Solder LEDs zu Sparkfun PCB Schritt 3: Solder Diodes zu Sparkfun PCB Schritt 4: Flachbandkabel Schritt 5: Clamp-Buchse Schritt 6: Multiplexing mit Arduino und 74HC595 Schritt 7: Header Pins Schritt 8: Strombegrenzungswiderstände Schritt 9: 74HC595 Buchse Schritt 10: Anschlüsse an LEDs Schritt 11: In Second 74HC595: Part 1 Schritt 12: In Second 74HC595: Part 2 Schritt 13: In Second 74HC595: Teil 3 Schritt 14: In Second 74HC595: Teil 4 Schritt 15: In Second 74HC595: Teil 4 Schritt 16: Header Pins Schritt 17: Schließen Sie 74HC595, um Arduino Schritt 18: Test LEDs Schritt 19: Multiplexing mit Arduino und 74HC165 Schritt 20: 74HC165: Teil 1 Schritt 21: 74HC165: Part 2 Pull-Down-Widerstände Schritt 22: 74HC165: Part 3 Schritt 23: 74HC165: Teil 4 Schritt 24: Testknöpfe Schritt 25: Serielle Kommunikation Schritt 26: Batterie Schritt 27: Midi Out Schritt 28: Accerometer / Gyro Schritt 29: Töpfe Schritt 30: Gehäuse Schritt 31: Schluss Firmware Schritt 32: Zukunft der Arbeit Schritt 33: Anhang: Schneiden PCB für Steuertasten Schritt 34: Anhang: Steuertasten Verdrahtung Teil 1: PCB Schritt 35: Anhang: Steuertasten Verdrahtung Teil 2: Socket Schritt 36: Anhang: Steuertasten Verdrahtung Teil 3: Header Pins Schritt 37: Anhang: Steuertasten Wiring Teil 4: Anschlüsse an LEDs Schritt 38: Anhang: Steuertasten Wiring Teil 5: Anschlüsse an Buttons

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller


Dieses Projekt ist ein tragbares, Arduino-betrieben, Grid-basierten MIDI-Controller, der in eine Vielzahl von Anwendungen startet, um viele Dinge, mit Ton zu tun. Es verfügt über 16 beleuchtete Tasten, da beide Ein- und Ausgänge verwendet werden, um das Steuergerät eine visuelle Rückmeldung zu geben. 2 Potentiometer geben analoge Steuer, abhängig von der App die Töpfe an Tempo, MIDI-Velocity, Tonhöhe zugewiesen und das Scrollen (Herstellung der avaible Rasterabstand größer als 4x4). Ein x / y-Beschleunigungsmesser und ein x / y-Gyroskop fügen Sie etwas verspielt, gestische Steuerung an das Gerät; die meisten der Anwendungen implementieren eine "Shake zu löschen" Steuerung und mehrere reagieren auf verschiedene Weise zu kippen. Er startet in 7 apps (wie unten beschrieben), auch wenn sie das Potenzial, in insgesamt 16 hochfahren hat. Dieses Gerät ist in erster Linie ein MIDI-Controller, aber ich habe auch eine App, die Sie auf die Schaltfläche und Analogdaten in ziehen können geschrieben MaxMSP und Audio-Steuerung .
Sugarcube MIDI Controller
Sugarcube MIDI Controller
Sugarcube MIDI Controller
Sugarcube MIDI Controller

Dieser Controller wurde sowohl von der inspiriert monome und TENORI-ON . Als ich im College war, baute ich einen großen Touchscreen-Display, auf der Grundlage der Arduinome monome-Arduino Klon Schaltpläne und Code, die mit allen Open-Source-Anwendungen in monome MaxMSP geschrieben gearbeitet. Es gibt eine Tonne von Menschen, den Aufbau ihrer eigenen monome-type-Geräte mit diesen Tasten von Sparkfun und Arduinome Code sowie einige Variationen über das Thema . Mit diesem Projekt, war ich daran interessiert, ein Gerät, das ein wenig mehr in sich geschlossene und relativ billig zu machen (viele Tasten = viel $) war. In dem Konzept des TENORI-ON halten mehr, dieser Controller nicht alle seine App Verarbeitung selbst, es nicht auf einen Computer angewiesen, um Tastendrücke / Analog-Kontrollen in MIDI zu bearbeiten. Das bedeutet, Sie können es direkt in einen Synthesizer oder ein anderes Gerät, das MIDI versteht stecken und Sie sind gut zu gehen, kein Computer erforderlich. Es läuft eine bullige LiPo Akku, der es hält läuft seit Tagen auf eine Ladung, also ist es ziemlich portable als auch. Im Einklang mit der monome Seite der Dinge, es ist völlig Open Source und kann auf Ihre speziellen Audio-Setup / Bedürfnisse angepasst werden. All das Arduino-Code ist auf Github (klicken Sie auf die Cloud-förmige Taste zum Download), zusammen mit einem MaxMSP Patch, der Daten aus der Steuerung in etwas Brauchbares in Max decodiert.
Eine Übersicht über die apps, die ich bisher geschrieben:

Pixel Tilt - Ein Pixel bewegt sich über eine 2D-Tastatur mit Neigungs auslöst MIDI wie es sich bewegt. Steuergeschwindigkeit und Basisnote mit Töpfen.

Flin - Music Box app basierend auf monome . Drehzahl und Geschwindigkeit der Notizen, die von y Neigungs gesteuert. Paging über 16 "Bahnen" mit Topf. Schütteln, um zu löschen.

Serielle Kommunikation mit MaxMSP - Ziehen von Daten aus Tasten und analoge Steuerungen in MaxMSP und verwenden Sie, um LED-Zustände Max senden. Unterstützt 5-Bit-Analog-Bedienelemente für x / y-Beschleunigungsmesser und 2 Töpfen. Das ist großartig, wenn Sie die Audioverarbeitung mit dem Controller ausgeführt werden soll. Laden Sie SerialDemo app ( SerialDemo.maxpat , mit den Arduino-Dateien enthalten, klicken Sie auf die Cloud-förmige Taste hier ), um Daten in Max analysieren. Beat Slicer (siehe oben) App ist im Preis inbegriffen mit der Arduino-Dateien sowie.

Arpeggiator - Spielt eine zwei, drei, oder vier note Arpeggio, ähnlich wie diese App ich für monome schrieb. Ein Topf steuert die Geschwindigkeit des Arpeggios, anderen Steuerungen Geschwindigkeit. Hinweise im Arpeggio kann nach oben oder unten um einen Halbton über Tastensteuerung verschoben werden. Das gesamte Arpeggio wird über x Neige umgesetzt. Drücken Sie die Note ganz links in der Arpeggio die Noten in aufsteigender Reihenfolge zu spielen, drücken Sie die ganz rechts Note im Arpeggio die Noten in absteigender Reihenfolge zu spielen, und drücken Sie eine Herznote in der Arpeggio die Noten in zufälliger Reihenfolge abzuspielen. Schütteln, um zu löschen.

Boiing - Bouncing Pixel, die Polyrhythmen zu erzeugen, basierend auf diesem TENORI-ON-App . Bounce Richtung basierend auf y Neigung. Geschwindigkeit und MIDI-Velocity (Lautstärke) von Töpfen gesteuert. Schütteln, um zu löschen.

Step Sequencer - Vier note 16 Step-Sequenzer. Pots steuern Tempo und Paging in Folge. Schütteln, um zu löschen.

MIDI Keyboard - Einfache MIDI-Tastatur. Steuergeschwindigkeit und Basisnote mit Töpfen, Pitchbend mit x kippen.
Liste der Einzelteile:
Sparkfun:
(1x) Button-Pad 4x4 - LED Kompatibel Sparkfun COM-07835
(1x) Button-Pad 4x4 - Breakout PCB Sparkfun COM-08033
(1x) Arduino Uno Sparkfun DEV-11021
(1x) Accelerometer / Gyro 5 Freiheitsgraden Sparkfun SEN-11072
Ich habe einen 3-Achsen-Beschleunigungssensor und 2 Achsen-Gyroskop in diesem Controller es einige gestische Kontrolle zu geben, aber bisher habe ich noch nicht wirklich in allen apps verwendet werden, den Kreisel, und ich habe nur die x- und y-Achse des Beschleunigungsmessers bekam verdrahtet. Das bedeutet, dass Sie in einer einfacheren / billiger Teil wie sub könnte dies .
DIGIKEY:
(16x) Weiß 5mm LED (3mm ist auch in Ordnung) Digikey C513A-WSN-CV0Y0151-ND
(2x) 74HC595 Schieberegister Digikey 296-1600-5-ND
(1x) 74HC165 Schieberegister Digikey 296-8251-5-ND
(3x) 16 pin IC-Sockel Digikey A100206-ND
(16x) 1N4148 Diode Digikey 1N4148FS-ND
(4x) Strombegrenzungswiderstände (Wert wird auf LEDs ab, die in Schritt 5 enthalten Beispielrechnung)
(4x) 10 kOhm 1 / 4watt Widerstände Digikey CF14JT10K0CT-ND
(1x) 220Ohm 1 / 4watt Widerstand Digikey CF14JT220RCT-ND
(1x) 5-Pin MIDI Jack Digikey CP-2350-ND (optional - in Schritt 27 beschrieben)
(1x) USB Typ B Buchse; Digikey 732-2734-ND (optional - in Schritt 27 beschrieben)
(2x) 10kOhm lineare Verjüngung Potentiometer Digikey 987-1308-ND
Jameco:
(1x) 16 Leiterbandkabel Jameco 28RC16-10VP
(1x) 16 pin Winkelkupplung Jameco 746285-3
(6x) Stiftleiste Stifte Jameco 103.393
Radioshack:
(1x) Midikabel Radioshack 42-2149 (optional - in Schritt 27 beschrieben)
(1x) Größe N LED-Einbau Coaxial Netzteilbuchse mit Schalter Radioshack 274-1576
(1x) Größe N Coaxial DC Power Plug Radioshack 274-1573
(1x) SPST Kippschalter Radioshack 275-634
AMAZON:
(1x) Li-Ion 7.4V Tenergy 2200mAh Akku-Modul mit PCB Amazon
(1x) Tenergy Universal Smart-Ladegerät für Li-Ion / Polymer-Akku (3,7 V-14.8V 1-4 Zellen) Amazon
(1x) MIDI zum USB-Kabel Amazon (optional - in Schritt 27 beschrieben)
NEWARK:
(2x) Aluminum Knöpfe Newark 74M6717
Weitere Materialien:
22-Gauge-Kabel, verschiedene Farben Jameco # 9313-0-R
Isolierband Radioshack 64-2373
Kabelschneider
Abisolierzange
Lot
Holz / Acryl / Projekt Gehäuse (Ich habe diese 6 "x6" x2 "Bambus-Box The Container Store )
Kleber / Epoxy
Doppelklebeband Amazon
Schritt 1: Schematische und Übersicht



Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Alle 7 Artikel anzeigen

Alle Schaltpläne für dieses Projekt sind oben gezeigt. Detaillierte Übersichten über den 74HC595, 74HC165, und Stromanschlüsse werden später in diesem Instructable gegeben. Alle Arduino Pin-Anschlüsse sind nachfolgend aufgeführt:
Analog
0 - Gyroskop Y (Y4.5)
1 - Potentiometer 1
2 - Gyroskop X (X4.5)
3 - Beschleunigungsmesser Y (yacc)
4 - Beschleunigungsmesser X (XAcc)
5 - Potentiometer 2
Digital
0 - Serien in - das muss frei bleiben
1 - Serien out - das ist bis zu den MIDI-Ausgang angeschlossen
2 - 74HC165 Datenstift (Q7)
3 - 74HC165 Taktpin (CP)
4 - 74HC165 Raststift (PL)
5 - 74HC595 Taktpin (SH_CP)
6 - 74HC595 Raststift (ST_CP)
7 - 74HC595 Datenstift (DS)
keine Verbindungen zu digitalen Stifte 8-13Step 2: Solder LEDs zu Sparkfun PCB

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Alle 7 Artikel anzeigen

Führen Sie die Leitungen der 16 LEDs (5 mm oder 3 mm sind in Ordnung, habe ich 5 mm) durch LED-Löcher in der Sparkfun PCB. Diese Platten sind mit 4-Kanal-RGB-LEDs kompatibel, so gibt es vier verfügbaren Löcher auf jeder Taste Pad. Sie können die beiden mittleren Löcher für einfarbige LEDs (siehe Abbildung 3) zu verwenden. Achten Sie darauf, dass die flache Kante des LED (die Kathode) einer Linie mit dem Flach Markierung auf der Leiterplatte.
Löten Sie die LED-Leads und schneiden Sie das überschüssige wire.Step 3: Solder Diodes zu Sparkfun PCB

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Alle 7 Artikel anzeigen

Löten Sie 16 Dioden Sparkfun PCB. Achten Sie darauf, die Linie bis schwarze Markierung auf Diode (Kathode) mit dem Streifen auf der PCB.Step 4: Flachbandkabel

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Schneiden Sie etwa 1 ft von 16 Leiterbandkabel. Separate und isolieren Sie die Enden alle 16 Drähte auf der einen Seite und Lot Sparkfun PCB. Die folgende Liste gibt alle farbigen Leitern, um mit dem Namen der Leiterplattenbohrung sollten verlötet, wenn Sie tun dies richtig keiner der Drähte sollten überqueren werden. Beachten Sie, dass da ich nur mit einer einzigen Farbe LED, werde ich verdrahten nur die "blue" Anode.
Anschlüsse:
einer Seite des Bandkabel
Brown SWT-GND1
Rote LED-GND1
Orange SWT-GND2
Gelbe LED-GND2
Grün SWT-GND3
Blaue LED-GND3
Lila SWT-GND4
Grau LED-GND4
Weiß blue4
Schwarz Switch4
Brown Blue3
Red Switch3
Orange BLUE2
Yellow SWITCH2
Grün BLUE1
Blau SWITCH1
anderen Seite der Band cableStep 5: Clamp-Buchse

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Verwenden Sie einen Schraubstock, um den 16 poligen Buchse an der Flachbandkabel klemmen. Wenn Sie nicht über einen Schraubstock keine Zange dies tun, werden Sie die Buchse an der Seite und mess up die Verbindungen zu klemmen. Du bist besser dran mit einem Hammer, um die Klemme geschlossen tippen, so stellen Sie sicher, dass Sie immer die Anwendung den Druck gleichmäßig über die Steckdose.
Achten Sie darauf, die Klemme die Buchse an der Flachbandkabel in der gleichen Orientierung in den Bildern angezeigt above.Step 6: Multiplexing mit Arduino und 74HC595

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Zwei 74HC595s (parallel geschaltet) fahren wird alle LEDs im Projekt sowie die Bereitstellung von Energie, um alle Tasten. Die 74HC595 ist ein 8-Bit-Serien parallel Schieberegister. Ich habe ein ausführliches Tutorial über Multiplexing mit dem 74HC595 geschrieben, und Sie mehr Informationen über dieses auf dem Chip können Datenblatt . Bitte beachten Sie, dass die 74HC595 in der schematischen gezogen ist kein Pin-Diagramm, habe ich die Reihenfolge der Stifte der Schaltplan klarer zu machen neu geordnet. Die Pin-Diagramm für den Chip ist in Figur 4 dargestellt ist.
Die 74HC595 hat folgende Stifte (der technische Name kann eine von mehreren Dinge je nachdem, welche Datenblatt Sie lesen sein):
Position Common Name Technischer Name
1 Parallel-Ausgang 2 QB oder Q1
2 parallele Ausgabe 3 QC oder Q2
3 Parallelausgang 4 QD oder Q3
4 parallele Ausgabe 5 QE oder Q4
5 parallelen Ausgang QF 6 oder Q5
6 parallele Ausgabe 7 QG oder Q6
7 parallel Ausgang 8 QH oder Q7
8 Masse GND
9 seriellen Datenausgang QH 'oder Q7' oder Q7s
10 Master-Reset (active low) MR (mit einer Linie an der Spitze) oder SRCLR (mit einer Linie auf der Oberseite)
11 Uhr Stift SH_CP oder SRCLK
12 Raststift ST_CP oder RCLK
13 Ausgangsfreigabe (active low) OE (mit einer Linie auf der Oberseite)
14 Datenstift DS oder SER
15 Parallelausgang 1 QA oder Q0
16 5 Volt Versorgung VCC
Die Verbindungen zwischen dem 74HC595 und Sparkfun Platte sind in der schematischen gezeigt und unten wiederholt:
74HC595 Sparkfun Breakout Board
Q0 BLUE 4 und Schalter 4
Q1 BLUE 3 und SWITCH 3
Q2 BLUE 2 und SWITCH 2
Q3 BLUE 1 und SWITCH 1
Q4 (über Strombegrenzungswiderstand) LED GND 4
Q5 (über Strombegrenzungswiderstand) LED GND 3
Q6 (über Strombegrenzungswiderstand) LED GND 2
Q7 (über Strombegrenzungswiderstand) LED GND 1
Die restlichen Stifte haben die folgenden Verbindungen zu dem Arduino (auch in schematischer dargestellt):
74HC595 Arduino
Vcc 5 V
GND GND
DS Digitale Pin 7
OE (Linie oben) GND
ST_CP Digitale Pin 6
SH_CP Digitale Pin 5
MR (Linie oben) 5V
Q7 'kein connectionStep 7: Header Pins

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Löten Sie zwei Reihen von acht Kopfstifte an die protoboard. Dies ist, wo das Flachbandkabel-Buchse wird auf die board.Step 8 befestigen: Strombegrenzungswiderstände

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Werden die 74HC595 werden Ansteuerung der LEDs in der Sparkfun Bord. Doch dieser Chip nur Ausgänge 0 oder 5 V und es ausgeben kann so viel wie 70 mA. Das bedeutet, wir müssen Strombegrenzungswiderstände verwenden Beschädigung der LEDs zu verhindern.
Aus den Angaben der LEDs I verwendet:
max Vorwärtsstrom: 30mA
Vorwärtsspannung: 3.2V
Berechnen Sie die benötigt wird, um diese max Bewertungen V = IR erreichen Widerstand:
Widerstand = (5V-3,2V) / (0,03 A)
= 60 Ohm
Ich habe 68 Ohm-Widerstände, so dass ich war nicht auf das absolute Maximum Laufen, sondern auch um sicherzustellen, dass ich zu viel Helligkeit nicht zu verlieren. (Ich habe einen Fehler ein packte die 100KOhm Widerstände, wenn ich dieses Projekt gemacht, ich regelte es später, aber die Streifen von 100Ohm Widerstände sollte blau, grau, schwarz, gold, ignorieren Sie die Farben in den Bildern).
Dies sind die Beispielrechnungen für die einzelnen LEDs I verwendet, Sie tun Sie Berechnungen auf der Grundlage der Spezifikationen Ihres LEDs besitzen müssen. Wenn Sie unsicher sind, was zu tun haben, nutzen 220ohm oder höher Widerstände; zu viel Widerstand machen die LEDs weniger hell, aber sie werden nicht beschädigt.
Löten Sie vier Widerstände auf die protoboard, wie in den Bildern gezeigt. Schließen Sie die Leitungen der Widerstände mit ihren benachbarten Kopfstifte mit Lot (Abbildung 2) .Schritt 9: 74HC595 Buchse

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Löten Sie einen 8-poligen Buchse auf der Lochrasterplatinen, wie gezeigt in die Bilder above.Step 10: Anschlüsse an LEDs

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Wie in 6 gezeigt, sind die Ausgangspins (Q0-Q7) auf den Pins 1-7 und 15. Dieses Bild wurde von der genommen befindet Datenblatt des 74HC595. Schließen Sie die Widerstände auf die Stifte 4-7 mit Drahtbrücken wie in den Abbildungen 1 und 2 Connect Stifte 1-3 und 15, um den Kopfstiften gezeigt nach dem Schema (beachten Sie die Verkabelung in das Bild nicht korrekt ist, aber die schematische korrekt ist) . Die Stifte Verbindungen zum 74HC595 sollte wie folgt sein:
Pin 15 - Blue 4
Pin 1 - Blue 3
Pin 2 - Blue 2
Pin 3 - Blue 1
Pin 4 - LED GND 4
Pin 5 - LED GND 3
Pin 6 - LED GND 2
Pin 7 - LED GND 1
Führen Sie die Stiftverbindungen erhalten Richtigkeit dieser Teil langsam tun und verweisen auf die schematische oft.
Stellen Sie sicher, alle diese Verbindungen mit Lot elektrisch verbinden auf der Unterseite der Platine (2 und 4) Schritt 11: In Second 74HC595: Part 1

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Jedes 74HC595 nur kann Quelle 70mA zu einer Zeit, für alle seine Stifte. Mit der 100-Ohm Strombegrenzungswiderstände, wenn alle 4 LEDs in einer Reihe stehen auf zur gleichen Zeit (mit Multiplex das ist die maximale Anzahl der LEDs, die möglicherweise auf zur gleichen Zeit sein kann), werden sie jeder Ziehung über 18mA, welche das setzt Stromanforderungen leicht über dem 70mA maximale Bewertung. Ich werde Zeichnung zusätzlicher Strom von den Stiften Q0-Q7, um die Tasten zu multiplexen (in späteren Schritten). Eine einfache Lösung für dieses Problem ist, eine andere 74HC595, um die Schaltung hinzuzufügen, wird es parallel zur Strom 74HC595 verdrahtet werden (siehe Schema). Dies wird uns zusätzliche 70mA aus auf alle 8 Pins zu ziehen.
Fügen Sie ein weiteres 16-poligen Buchse auf der Lochrasterplatinen, wie in der 12 gezeigt images.Step: In Second 74HC595: Part 2

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Drahtstifte 1-7 und 15 der Buchsen untereinander (siehe Hinweis auf schematisch). Diese Stifte entsprechen allen acht Ausgängen des 74HC595s.Step 13: In Second 74HC595: Teil 3

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Verbinden Sie Pin 8 (Masse) und Pin 16 (5 V) der Buchsen zusammen (siehe Bild Anmerkung über schematisch) .Schritt 14: In Second 74HC595: Teil 4

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Verbindung der Stifte 11, 12 und 14 der Buchsen zueinander. Diese entsprechen den Taktgeber, verriegeln und Daten-Pins des 74HC595s.Step 15: In Second 74HC595: Part 4

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Drahtstift 10 auf 5 V (Pin 16) und Pin 13 auf Masse (Pin 8). Header-Pins: Pin 10 (MR) sollte hoch und Pin 13 (OE) sollte, um Daten an die Ausgangsstifte (Q0-Q7) .Schritt 16 senden niedrig sein

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Solder Kopfstifte an den perfboard so dass ein Arduino Uno kann passen auf sie einrasten. Achten Sie auf die ungeraden Pin Abstand zwischen digitalen Stiften 7 und 8, habe ich dieses Projekt so konzipiert, dass eine Verbindung zu Pin 8-13 ist nicht notwendig, ist es wahrscheinlich am besten, für Arduino Pins Kopfstiften 0-13 weglassen, so dass die Dinge zusammenschnappen einfacher (siehe Bild Hinweis) .Schritt 17: Schließen Sie 74HC595, um Arduino

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Schließen Sie drei 74HC595 Datenpins, digitale Stifte 5, 6 und 7. Verbinden Sie Masse und 5V Arduino Arduino zu entsprechenden Leistungs Pins.
Steckerbelegung:
74HC595 Arduino
Datenstift (Pin 14) Digitalstift 7
Raststift (Pin 12) Digitalstift 6
Uhr (Pin 11) Digitalstift 5Step 18: Test LEDs

Sugarcube MIDI Controller

Laden Sie den Code unten auf die Arduino und testen, ob LEDs korrekt verdrahtet. Legen Sie zwei 74HC595s in die leeren Sockel, schließen Sie das Button PCB in die Fassung, und schließen Sie das Arduino auf die protoboard (Bild 1). Sie sollten jedes LED-Licht bis ein zu einer Zeit zu sehen, diese Schleife weiterhin zu wiederholen immer (siehe Video unten). Wenn dies nicht funktioniert, überprüfen Sie die Anschlüsse in den vorherigen Schritten und lassen Sie Ihre Verbindungen nach Kontinuität. Nicht auf den nächsten Schritten fortfahren, bis Sie die LEDs zum Laufen zu bringen.
Weitere Informationen zu den 74HC595 und shiftOut, siehe Abb 2, das Datenblatt und die Arduino Referenzseite .
  // LED TEST w / 74HC595
 // Von Amanda Ghassaei 2012

 / *
  * Dieses Programm ist freie Software;  es darf weitergegeben und / oder zu modifizieren
  * Es unter den Bedingungen der GNU General Public License, wie von veröffentlicht
  * Die Free Software Foundation;  entweder Version 2 der Lizenz oder
  * (Nach Ihrer Option) jeder späteren Version.
  *
 * /

 // Diese Firmware leuchtet die jeweils von einem LED ein

 // Stiftverbindungen
 int Verriegelungsstift = 6;
 int clockPin = 5;
 int dataPin = 7;

 // Schleife Variablen
 Byte-i;
 Byte-j;

 // Speichervariable
 Byte dataToSend;

 Leere setup () {
   pinMode (Verriegelungsstift, OUTPUT);
   pinMode (clockPin, OUTPUT);
   pinMode (dataPin, OUTPUT);
 }

 Leere Schleife () {
   for (i = 0; i <4; i ++) {
     for (j = 0; j <4; j ++) {
      
       dataToSend = (1 << (i + 4)) | (15 & ~ (1 << j)); // preprare Byte bis zu 74HC595 senden
      
       // Setlatch Pin niedrig, so dass die LEDs nicht beim Versenden in Bits ändern
       digital (Verriegelungsstift, LOW);
       // Am dataToSend verschieben sich die Bits
       shiftOut (dataPin, clockPin, LSBFIRST, dataToSend);
       // Setze Raststift hoch, so dass die LEDs leuchten
       digital (Verriegelungsstift, HIGH);
      
       Verzögerung (500); // warten
     }
   }
 }

Schritt 19: Multiplexing mit Arduino und 74HC165

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Die 74HC595 kann nur tun, parallel ausgegeben, so habe ich ein 74HC165, um den Zustand der Tasten über 4 Strombegrenzungswiderstände messen und senden diese Information an den Arduino. Mehr Infos über den Chip kann für sich finden Datenblatt . Beachten Sie in Figur 2, dass die 595 Chips aus den vorherigen Schritten wird Energie an den Tasten (wie sie es tun für die LEDs).
Die 74HC165 hat folgende Stifte (der technische Name können etwas unterschiedlich je nachdem, welche Datenblatt Sie gerade lesen):
Position / Common Name / Technischer Name
1 Raststift (active low) PL (mit einer Linie auf der Oberseite)
2 Taktpin CP
3 parallelen Eingang 4 D4
4 parallele Eingangs 5 ​​D5
5 parallelen Eingangs 6 D6
6 parallele Eingangs 7 D7
7 inverse seriellen Ausgang Q7 (mit einer Linie auf der Oberseite)
8 Masse GND
9 seriellen Ausgang (Datenanschluss) Q7
10 seriellen Eingang DS
11 parallele Eingangs 0 D0
12 parallele Eingangs 1 D1
13 parallele Eingangs 2 D2
14 parallele Eingangs 3 D3
15 Taktfreigabeeingang (active low) CE (mit einer Linie auf der Oberseite)
16 5 Volt Versorgung VCC
Die Verbindungen zwischen dem 74HC165 und Sparkfun Platte sind in der schematischen gezeigt und unten wiederholt:
74HC165 -> Sparkfun Breakout Board
D0 SWITCH GND 4
D1 SWITCH GND 3
D2 SWITCH GND 2
D3 SWITCH GND 1
(Beachten Sie, dass die 165 Pins sollten auch eine Verbindung über einen Widerstand an Masse haben - siehe Schema)
Die restlichen Stifte haben die folgenden Verbindungen zu dem Arduino (auch in schematischer dargestellt):
74HC165 -> Arduino
Vcc 5 V
GND GND
CE (Linie oben) GND
DS GND
Q7 Digitale Pin 2
Q7 (Linie oben) keine Verbindung
PL (Linie oben) Digitale Pin 4
CP Digitale Pin 3Schritt 20: 74HC165: Part 1

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Löten Sie ein drittes 16-poligen Buchse auf der Lochrasterplatinen, wird diese für den 74HC165 sein. Schließen Sie 5V an Pin 16 und Masse zu 8.Step 21-polig: 74HC165: Part 2 Pull Down Widerstände

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Früher habe ich die Widerstände in Reihe mit den Tasten D0-D3 des 165-Chip nach unten ziehen, um Boden, während die Tasten nicht gedrückt werden - dies ist ein "Pull-Down-Widerstand" bezeichnet. Löten Sie vier 10kOhm Widerstände zu den Pins neben den Kopfstiften (siehe Bild 1). Verbinden vier Drähte von den 74HC165 Eingänge D0-3 (Pins 11-14) in den Raum zwischen der männlichen Kopfstiften und den 10k Widerstände wie in Figur 3 und in der schematischen angedeutet (siehe auch gelbe Drähte in Figur 2). Drag Lot zwischen den Kopfstiften, die Drähte an die 165-Chip, und die Widerstände um sie zu verbinden (siehe Bild 3). Schließen Sie die andere Seite der vier Widerstände zueinander und zur Erde Arduino (siehe wieder FIG 3 und die schematisch).
Wir werden die Versorgung der Tasten mit dem gleichen Versorgung, die Stromversorgung ist der LEDs - die 595 Chips. Drag Lot zwischen den Kopfstiften, die an die LED-BLUE (1-4) auf der Sparkfun Bord der Kopfstiften, die auf dem Board Sparkfun Schalter (1-4) anschließen anschließen (siehe Hinweis auf Figur 3 und 5) .Schritt 22: 74HC165: Teil 3

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Schließen Sie die Datenstifte des 74HC165 in die Arduino (braunes Kabel)
Pin-Anschlüsse (ebenfalls in schematischer dargestellt):
74HC165 Arduino
PL (Linie oben) (Pin 1) Digitalstift D4
CP (Pin 2) Digitalstift D3
Q7 (Pin 9) Digitalstift D2Step 23: 74HC165: Teil 4

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Verbinden Sie die Masse an Pin 15 (CE mit der Linie auf der Oberseite) und 10 (DS) des 74HC165.Step 24: Test Buttons

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Laden Sie den folgenden Code auf das Arduino. Wenn alles richtig verkabelt wird jede Taste leuchtet, während gedrückt. Wenn Sie bemerken, dass einige Tasten sind nicht so reagieren, reinigen Sie die leitenden Ringe und die Spuren auf der Leiterplatte mit Wasser und Trocknen gründlich, diese zu lösen einige Probleme Antwort für mich.
  // TASTE TEST w / 74HC595 und 74HC165
 // Von Amanda Ghassaei 2012

 / *
  * Dieses Programm ist freie Software;  es darf weitergegeben und / oder zu modifizieren
  * Es unter den Bedingungen der GNU General Public License, wie von veröffentlicht
  * Die Free Software Foundation;  entweder Version 2 der Lizenz oder
  * (Nach Ihrer Option) jeder späteren Version.
  *
 * /

 // Diese Firmware verursacht die Tasten zu leuchten kurzzeitig während sie gedrückt werden.

 // Stiftverbindungen
 int ledLatchPin = 6;
 int ledClockPin = 5;
 int ledDataPin = 7;
 int buttonLatchPin = 4;
 int buttonClockPin = 3;
 int buttonDataPin = 2;

 // Schleife Variablen
 Byte-i;
 Byte-j;
 Byte k;

 // Speicher für LED-Zustände, 4 Byte
 Byte ledData [] = {0, 0, 0, 0};
 // Speicher für Tasten, 4 Byte
 Byte buttonCurrent [] = {0,0,0,0};
 Byte buttonLast [] = {0,0,0,0};
 Byte Button [] = {0,0,0,0};
 Byte Button [] = {0,0,0,0};
 // Button debounce Gegen 16 Bytes
 Byte buttonDebounceCounter [4] [4];


 Leere setup () {
   DDRD = 0xFA; // Satz Stifte D7-D4 als Ausgabe, D2 als Eingangs
 }

 // ButtonCheck - überprüft den Zustand einer bestimmten Taste.
 // Dies buttoncheck Funktion weitgehend aus dem monome 40h Firmware von Brian Crabtree und joe See kopiert
 Leere buttonCheck (byte Reihe, Byte-Index)
 {
   if (((buttonCurrent [row] ^ buttonLast [Reihe]) & (1 << index)) && // wenn die aktuelle physische Taste Zustand, die von der ist
   ((ButtonCurrent [row] ^ Button [Reihe]) & (1 << index))) {// letzten physischen Schaltzustand und der aktuelle Zustand entprellt

     if (buttonCurrent [Zeile] & (1 << index)) {// wenn die aktuelle körperliche Zustand Taste gedrückt wird
       Button [row] = 1 << index;  // Sofort Warteschlange eine neue Schaltfläche Ereignis
       Button [Zeile] | = (1 << index);  // Und den entprellt Zustand nach unten.
   }
     else {
       buttonDebounceCounter [Zeile] [index] = 12;
     } // Andernfalls die Taste zuvor gedrückt und jetzt
     // Freigegeben wurde, so wir unsere Entprellzähler.
   }
   else if (((buttonCurrent [row] ^ buttonLast [Reihe]) & (1 << index)) == 0 && // wenn die aktuelle physische Taste Zustand ist die gleiche wie
   (ButtonCurrent [row] ^ Button [Reihe]) & (1 << index)) {// die letzte physische Taste Staat, sondern der aktuelle physikalische
     // Button Zustand, die von der aktuellen debounce ist 
     // Stand ...
     if (buttonDebounceCounter [row] [Index]> 0 && --buttonDebounceCounter [row] [Index] == 0) {// wenn das die Entprellzähler hat
       // Auf 0 heruntergezählt worden ist (was bedeutet, die
       // Die Taste hat für gewesen 
       // KButtonUpDefaultDebounceCount 
       // Iterationen ///

       Button [row] = 1 << index;  // Schlange eine Schaltfläche Zustandsänderungsereignis

       if (buttonCurrent [Zeile] & (1 << index)) {// und drücken Sie die Tasten debounce Zustand.
         Button [Zeile] | = (1 << index);
       }
       else {
         Button [row] und = ~ (1 << index);
       }
     }
   }
 }


 Leere shift () {
  
   for (i = 0; i <4; i ++) {
    
     buttonLast [i] = buttonCurrent [i];
    
     Byte dataToSend = (1 << (i + 4)) | (15 & ~ ledData [i]);
      
     // Setze Raststift niedrig, so dass die LEDs nicht beim Versenden in Bits ändern
     digital (ledLatchPin, LOW);
     // Verschieben sich die Bits dataToSend
     shiftOut (ledDataPin, ledClockPin, LSBFIRST, dataToSend);  
     // Setze Raststift hoch, so dass die LEDs werden neue Daten zu empfangen
     digital (ledLatchPin, HIGH);
      
     // Einmal eine Zeile wurde hoch eingestellt ist, empfangen Daten von Tasten
     // Setze Raststift hoch
     digital (buttonLatchPin, HIGH);
     // Verschiebung der Daten
     buttonCurrent [i] = Shiftin (buttonDataPin, buttonClockPin, LSBFIRST) >> 3;
     // Verriegelungsstift niedrig
     digital (buttonLatchPin, LOW);
    
     for (k = 0; k <4; k ++) {
       buttonCheck (i, k);
     }
   }
 }

 Leere updateLEDs () {// Die LEDs zu aktualisieren, um hte Zustand der Tasten zu reflektieren
   for (j = 0; j <4; j ++) {
     ledData [j] = Button [j];
   }
 }

 Leere Schleife () {
   verschieben ();
   updateLEDs ();
 }
Schritt 25: Serielle Kommunikation

Sugarcube MIDI Controller

An dieser Stelle in das Projekt habe ich ein wenig ungeduldig und wollte beginnen, einige Klänge, so dass ich noch ein paar Dinge, auf die Firmware, um die Arduino Senden und Empfangen von Daten seriell. Ich habe den Code unten geschrieben. Ich habe eine Timer-Interrupt, um den Arduino, die auf eingehenden seriellen Nachrichten halten, können Sie ein wenig mehr darüber, wie das hier funktioniert lesen. (Wenn Sie vorhaben, diesen Code zu testen, verwenden Sie die App angebracht ist, ist die neuere Version des Beat-Slicer-App auf Github ein wenig anders).

  // TASTE TEST w / 74HC595 und 74HC165 und serielle Kommunikation
 // Von Amanda Ghassaei
 // Juni 2012

 / *
  * Dieses Programm ist freie Software;  es darf weitergegeben und / oder zu modifizieren
  * Es unter den Bedingungen der GNU General Public License, wie von veröffentlicht
  * Die Free Software Foundation;  entweder Version 2 der Lizenz oder
  * (Nach Ihrer Option) jeder späteren Version.
  *
 * /

 // Diese Firmware wird Daten hin und her mit dem MaxMSP Patch senden "Beat Slicer"

 // Stiftverbindungen
 int ledLatchPin = 6;
 int ledClockPin = 5;
 int ledDataPin = 7;
 int buttonLatchPin = 4;
 int buttonClockPin = 3;
 int buttonDataPin = 2;

 // Schleife Variablen
 Byte-i;
 Byte-j;
 Byte k;
 Byte ledByte;

 // Speicher für LED-Zustände, 4 Byte
 Byte ledData [] = {0, 0, 0, 0};
 // Speicher für Tasten, 4 Byte
 Byte buttonCurrent [] = {0,0,0,0};
 Byte buttonLast [] = {0,0,0,0};
 Byte Button [] = {0,0,0,0};
 Byte Button [] = {0,0,0,0};
 // Button debounce Gegen 16 Bytes
 Byte buttonDebounceCounter [4] [4];


 Leere setup () {
   DDRD = 0xFA; // Satz Stifte D7-D4 als Ausgabe, D2 als Eingangs
  
   Serial.begin (57600);
  
   cli (); // Stop-Interrupts

   // Setze timer2 alle 128us zu unterbrechen
   TCCR2A = 0; // gesetzt gesamten TCCR2A Register auf 0
   TCCR2B = 0; // gleiche für TCCR2B
   TCNT2 = 0; // initialisieren Zählerwert auf 0
   // Set vergleichen Einstimmungsregister für 7.8khz Schritten
   OCR2A = 255; // = (16 * 10 ^ 6) / (7812,5 * 8) - 1 (muss <256)
   // Auf CTC-Modus schalten
   TCCR2A | = (1 << WGM21);
   // Set CS11-Bit für 8 Vorteiler
   TCCR2B | = (1 << CS11);   
   // Timer aktivieren vergleichen zu unterbrechen
   TIMSK2 | = (1 << OCIE2A);
  
   sei (); // ermöglichen Interrupts
  
 }

 // ButtonCheck - überprüft den Zustand einer bestimmten Taste.
 // Dies buttoncheck Funktion weitgehend aus dem monome 40h Firmware von Brian Crabtree und joe See kopiert
 Leere buttonCheck (byte Reihe, Byte-Index)
 {
   if (((buttonCurrent [row] ^ buttonLast [Reihe]) & (1 << index)) && // wenn die aktuelle physische Taste Zustand, die von der ist
   ((ButtonCurrent [row] ^ Button [Reihe]) & (1 << index))) {// letzten physischen Schaltzustand und der aktuelle Zustand entprellt

     if (buttonCurrent [Zeile] & (1 << index)) {// wenn die aktuelle körperliche Zustand Taste gedrückt wird
       Button [row] = 1 << index;  // Sofort Warteschlange eine neue Schaltfläche Ereignis
       Button [Zeile] | = (1 << index);  // Und den entprellt Zustand nach unten.
   }
     else {
       buttonDebounceCounter [Zeile] [index] = 12;
     } // Andernfalls die Taste zuvor gedrückt und jetzt
     // Freigegeben wurde, so wir unsere Entprellzähler.
   }
   else if (((buttonCurrent [row] ^ buttonLast [Reihe]) & (1 << index)) == 0 && // wenn die aktuelle physische Taste Zustand ist die gleiche wie
   (ButtonCurrent [row] ^ Button [Reihe]) & (1 << index)) {// die letzte physische Taste Staat, sondern der aktuelle physikalische
     // Button Zustand, die von der aktuellen debounce ist 
     // Stand ...
     if (buttonDebounceCounter [row] [Index]> 0 && --buttonDebounceCounter [row] [Index] == 0) {// wenn das die Entprellzähler hat
       // Auf 0 heruntergezählt worden ist (was bedeutet, die
       // Die Taste hat für gewesen 
       // KButtonUpDefaultDebounceCount 
       // Iterationen ///

       Button [row] = 1 << index;  // Schlange eine Schaltfläche Zustandsänderungsereignis

       if (buttonCurrent [Zeile] & (1 << index)) {// und drücken Sie die Tasten debounce Zustand.
         Button [Zeile] | = (1 << index);
       }
       else {
         Button [row] und = ~ (1 << index);
       }
     }
   }
 }


 Leere shift () {
  
   for (i = 0; i <4; i ++) {
    
     buttonLast [i] = buttonCurrent [i];
    
     Byte dataToSend = (1 << (i + 4)) | (15 & ~ ledData [i]);
      
     // Setze Raststift niedrig, so dass die LEDs nicht beim Versenden in Bits ändern
     digital (ledLatchPin, LOW);
     // Verschieben sich die Bits dataToSend
     shiftOut (ledDataPin, ledClockPin, LSBFIRST, dataToSend);  
     // Setze Raststift hoch, so dass die LEDs werden neue Daten zu empfangen
     digital (ledLatchPin, HIGH);
      
     // Einmal eine Zeile wurde hoch eingestellt ist, empfangen Daten von Tasten
     // Setze Raststift hoch
     digital (buttonLatchPin, HIGH);
     // Verschiebung der Daten
     buttonCurrent [i] = Shiftin (buttonDataPin, buttonClockPin, LSBFIRST) >> 3;
     // Verriegelungsstift niedrig
     digital (buttonLatchPin, LOW);
    
     for (k = 0; k <4; k ++) {
       buttonCheck (i, k);
       if (Button [i] <> 1) und 3;
       Byte LEDx = (ledByte >> 3) & 3;
       if (LED-Status) {
         ledData [ledy] | = 8 >> LEDx;
       }
       else {
         ledData [ledy] & = ~ (8 >> LEDx);
       }
     } // End if Serien verfügbar
   } // End tun
  while (Serial.available ()> 8);
 }    


 Leere Schleife () {
  shift();//updates leds and receives data from buttons
 }

I sent this serial data to an audio processing application I wrote in MaxMSP. You can download this application below (called beat slicer) and open it with MaxMSP or MaxRuntime (free version) here . I'm running Max 5, I assume it will work on Max 6 as well. It will prompt you to select an audio file (wav, mp3, aiff). Then you can manipulate this audio file using the button grid as shown in the video below:
Step 26: Battery

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Alle 10 Artikel anzeigen

One of my main objectives for this project was to make something portable, so the next step is to add portable power. I used a rechargeable Li-Po battery to minimize waste and provide enough power for hours of use. Additionally, I wanted a Li-Po battery that only had two leads coming out of it so that I could charge it using a regular barrel plug.
Here are the parts for the power setup, taken from the parts list on the first page:
Li-Ion 7.4V Tenergy 2200mAh Rechargeable Battery module with PCB Amazon
Tenergy Universal Smart Charger for Li-Ion/Polymer battery Pack (3.7V-14.8V 1-4 cells) Amazon
Size N Panel-Mount Coaxial DC Power Jack Radioshack 274-1576
Size N Coaxial DC Power Plug Radioshack 274-1573
SPST Toggle Switch Radioshack 275-634
Cut and strip the two leads from the battery (do not let them short out). Make connections between the battery, plug, switch and Arduino according to the schematic above. I like to always attach ground to the outside part of the coaxial jack, but you can wire it however you like (just make sure your wiring of the charger is consistent!).
Cut and strip the two leads from the charger. Solder the n type barrel plug to these leads as shown in the image above. Make sure that the polarity of your charger's barrel plug matches the polarity of the jack. Again, I've chosen to connect ground to the outside part of the coaxial jack/plug in the images above.
Now the switch acts as an on/off switch to the Arduino and the battery can be charged via the barrel plug. Charging Li-Po batteries is a somewhat complicated procedure that involves balancing the cells of the battery, I'm not sure if hooking up the Arduino in parallel with the battery during charging will interfere with this process. Just to be safe, I'm always sure to switch the power switch off during charging, thereby removing the Arduino from the circuit.
Note- be careful when using Li-Po batteries, improper use can result in fire. Be careful not to short circuit the battery and always use the proper charger.Step 27: Midi Out

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Show All 13 Items

This instrument is primarily a MIDI device, so we need to build a MIDI out. There are two ways to do this (and over the course of this project I did one and then switched to the other):
output MIDI via a 5 pin DIN connector (see fig 1)
output MIDI via USB (this is what I eventually settled on)
Either of these options is fine, I chose USB because I didn't want to have to carry a special MIDI to USB cable all the time. If you have a lot of synthesizers that receive a 5 pin MIDI input, it might be more convenient for you to use the 5 pin jack (it's also a little easier). I'll go through both processes below:
5 pin connection:
Solder a 220ohm resistor to pin 4 of the MIDI jack and connect to Arduino 5V. Solder a wire between MIDI pin 2 and ground. Solder a wire between MIDI pin 5 and digital pin 1 (TX).
MIDI over USB:
MIDI over USB is a little tricky. Ideally we'd be able to send MIDI out the USB port already connected to the Arduino, but this turns out to be more trouble than it's worth in my opinion. You can read a little bit about various solutions here . Instead, I found a really great tutorial that explains how you can take apart a cheap MIDI to USB cable , solder new connections to it, and tuck it inside your project enclosure with your Arduino, to create a secondary MIDI-USB output. The process is explained really well on the Shiftmore blog, but the MIDI to USB cable I received from amazon was a little different, so I'll describe the process again here.
Remove the plastic casing from the MIDI to USB cable and unsolder the connections to the cables on either end (fig 8). The USB connections are shown here , make the following connections:
5V +
DP D+
DM D-
VSS -
As you can see in figs 9 and 10, I used a pieced of perf board to make the connections to the USB jack. On the other side of the MIDI to USB board, make the following connections to the Ardunio:
IN- Digital Pin 1 (TX)
GND Arduino Ground
Testing it out:
Load the firmware below onto the Arduino (also in attached file), it will turn the keypad into a simple MIDI device: pressing each of the buttons will cause the button to light up and trigger a MIDI note. Disconnect the Arduino's serial connection and connect the MIDI output to a MIDI instrument or your computer to hear the MIDI notes. You should also see the yellow MIDI IN light on the MIDI to USB board turn on with each note. More info about programming the Arduino to send MIDI can be found here.
 //basic midi test
//by Amanda Ghassaei 2012

 / *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
  *
 * /

//this firmware will cause the buttons to light up momentarily while they are pressed.

//pin connections
int ledLatchPin = 6;
int ledClockPin = 5;
int ledDataPin = 7;
int buttonLatchPin = 4;
int buttonClockPin = 3;
int buttonDataPin = 2;

//looping variables
byte i;
byte j;
byte k;

//storage for led states, 4 bytes
byte ledData[] = {0, 0, 0, 0};
//storage for buttons, 4 bytes
byte buttonCurrent[] = {0,0,0,0};
byte buttonLast[] = {0,0,0,0};
byte buttonEvent[] = {0,0,0,0};
byte buttonState[] = {0,0,0,0};
//button debounce counter- 16 bytes
byte buttonDebounceCounter[4][4];

//MIDI variables
int velocity = 100;
int noteON = 144;
int MIDIoffset = 60;

void setup() {
  DDRD = 0xFA;//set pins D7-D4 as output, D2 as input
  
  Serial.begin(31250);//set midi baud rate
 }

// buttonCheck - checks the state of a given button.
//this buttoncheck function is largely copied from the monome 40h firmware by brian crabtree and joe lake
void buttonCheck(byte row, byte index)
 {
  if (((buttonCurrent[row] ^ buttonLast[row]) & (1 << index)) && // if the current physical button state is different from the
  ((buttonCurrent[row] ^ buttonState[row]) & (1 << index))) { // last physical button state AND the current debounced state

    if (buttonCurrent[row] & (1 << index)) { // if the current physical button state is depressed
      buttonEvent[row] = 1 << index; // queue up a new button event immediately
      buttonState[row] |= (1 << index); // and set the debounced state to down.
   }
    else{
      buttonDebounceCounter[row][index] = 12;
    } // otherwise the button was previously depressed and now
    // has been released so we set our debounce counter.
   }
  else if (((buttonCurrent[row] ^ buttonLast[row]) & (1 << index)) == 0 && // if the current physical button state is the same as
  (buttonCurrent[row] ^ buttonState[row]) & (1 << index)) { // the last physical button state but the current physical
    // button state is different from the current debounce 
    // state...
    if (buttonDebounceCounter[row][index] > 0 && --buttonDebounceCounter[row][index] == 0) { // if the the debounce counter has
      // been decremented to 0 (meaning the
      // the button has been up for 
      // kButtonUpDefaultDebounceCount 
      // iterations///

      buttonEvent[row] = 1 << index; // queue up a button state change event

      if (buttonCurrent[row] & (1 << index)){ // and toggle the buttons debounce state.
        buttonState[row] |= (1 << index);
       }
      else{
        buttonState[row] &= ~(1 << index);
       }
     }
   }
 }


void shift(){
  
  for (i=0;i<4;i++){
    
    buttonLast[i] = buttonCurrent[i];
    
    byte dataToSend = (1 << (i+4)) | (15 & ~ledData[i]);
      
    // set latch pin low so the LEDs don't change while sending in bits
    digitalWrite(ledLatchPin, LOW);
    // shift out the bits of dataToSend
    shiftOut(ledDataPin, ledClockPin, LSBFIRST, dataToSend);  
    //set latch pin high so the LEDs will receive new data
    digitalWrite(ledLatchPin, HIGH);
      
    //once one row has been set high, receive data from buttons
    //set latch pin high
    digitalWrite(buttonLatchPin, HIGH);
    //shift in data
    buttonCurrent[i] = shiftIn(buttonDataPin, buttonClockPin, LSBFIRST) >> 3;
    //latchpin low
    digitalWrite(buttonLatchPin, LOW);
    
    for (k=0;k<4;k++){
      buttonCheck(i,k);
     }
   }
 }

void updateLEDs(){ //update the leds to reflect hte state of the buttons
  for (j=0;j<4;j++){
    ledData[j] = buttonState[j];
   }
 }

void MIDImessage(int command, int MIDInote, int MIDIvelocity) {//send sa MIDI message
  Serial.write(command);//send note on or note off command 
  Serial.write(MIDInote);//send pitch data
  Serial.write(MIDIvelocity);//send velocity data
 }

void sendMIDI(){
  for (byte a=0;a<4;a++){
    for (byte b=0;b<4;b++){
      if (buttonEvent[a]&(1<<b)){
        buttonEvent[a]&=~(1<<b);//zero button event
        if (buttonState[a]&(1<<b)){
          MIDImessage(noteON,(MIDIoffset+a*5+b),100);
         }
        else{
          MIDImessage(noteON,(MIDIoffset+a*5+b),0);
         }
       }
     }
   }
 }


 Leere Schleife () {
  shift();
  updateLEDs();
  sendMIDI();
 }

Step 28: Accerometer/Gyro

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Alle 9 Artikel anzeigen

I attached a 2 axis gyroscope and 3 axis accelerometer onto this project so that I could add some interesting control to the device. The 5 degrees of freedom board from Sparkfun outputs data from its gyroscope and accelerometer as analog voltages. I sent these to analog pin 0-4. You may notice that the Gyro has four outputs- I chose to use the X/Y4.5 out instead of the X/YRate out because the 4.5 has higher resolution. I wrote more about this board and explained some of the code I used to get it up and running here.
Solder header pins on the gyro/accelerometer board. Solder on the perfboard, making sure to leave room for the Arduino to fit on top. Make the following pin connections:
RAW - Arduino 5V
GND- Arduino ground
X4.5- A2
Y4.5- A0
XAcc- A4
YAcc- A3
ZAcc- A1 (I ended up disconnecting this later to free up an analog input for a second potentiometer)

Upload the following code and check the serial monitor to make sure accelerometer/gyro is functioning properly. When the board is lying still and parallel to the ground the values of xGyro, yGyro, xAcc, and yAcc should all hover around 0. zAcc should output a value around -66 (see fig 8). Move the board around and see how the values change. In figure 9 you can see how rotation about the x axis changes xGyro and y and zAcc, but not yGyro or xAcc.
 //Analog Accerometer w Serial
//by Amanda Ghassaei
//instructables.com/amandaghassaei
//August 2012

 / *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 3 of the License, or
 * (at your option) any later version.
  *
 * / 
 
 //setup acceleration variables
 int xAcc;
 int yAcc;
 int zAcc;

 //setup gyre variables
 int xGyro;
 int yGyro;
 
 int zero = 282;//this was the zero point value for my accelerometer, your board may be slightly different.

void setup(){
  Serial.begin(9600);//set up serial
 }

void loop(){
  
  //read values
  xGyro = analogRead(A2);
  yGyro = analogRead(A0);
  xAcc = analogRead(A4);
  yAcc = analogRead(A3);
  zAcc = analogRead(A1);

  
  //print values
  Serial.print("xGyro ");
  Serial.println(317-xGyro);
  Serial.print("yGyro ");
  Serial.println(183-yGyro);
  Serial.print("xAcc ");
  Serial.println(zero-xAcc);
  Serial.print("yAcc ");
  Serial.println(zero-yAcc);
  Serial.print("zAcc ");
  Serial.println(zero-zAcc);
  Serial.println(" ");
  delay(500);//wait

 }

The following pieces of firmware combine the hardware that I've set up in the preview steps with the accelerometer and gyroscope. Each of the programs functions are summarized in the video below:
The code below lets you light up one pixel of the button pad and move the pixel around the 4x4 grid by tilting it in different directions. As the pixel moves across the grid it also triggers MIDI notes.
 //accelerometer test
//by Amanda Ghassaei 2012

 / *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
  *
 * /

//this firmware will cause the buttons to light up momentarily while they are pressed.

//pin connections
int ledLatchPin = 6;
int ledClockPin = 5;
int ledDataPin = 7;
int buttonLatchPin = 4;
int buttonClockPin = 3;
int buttonDataPin = 2;

//setup varibles for Gyroscope/Accelerometer
int xGyroRAW;
int yGyroRAW;
int xAccRAW;
int yAccRAW;
int zAccRAW;

byte xGyro;
byte yGyro;
byte xAcc;
byte yAcc;
byte zAcc;

//looping variables
byte i;
byte j;
byte k;

//storage for led states, 4 bytes
byte ledData[] = {0, 0, 0, 0};
//storage for buttons, 4 bytes
byte buttonCurrent[] = {0,0,0,0};
byte buttonLast[] = {0,0,0,0};
byte buttonEvent[] = {0,0,0,0};
byte buttonState[] = {0,0,0,0};
//button debounce counter- 16 bytes
byte buttonDebounceCounter[4][4];

//variables for accelerometer pixel movement
boolean firstPress = 1;
byte movingPixel[] = {0, 0, 0, 0};
byte yPosition;
byte xPosition;
int timeX = 0;
int timeY = 0;
boolean dirX = 0;
boolean dirY = 0;
byte lastX = 4;
byte lastY = 4;

//MIDI variables
int velocity = 100;
int noteON = 144;
int MIDIoffset = 60;
byte currentX;


void setup() {
  
  DDRD = 0xFA;//set pins D7-D4 as output, D2 as input
  
  Serial.begin(31250);//MIDI baud rate 
// Serial.begin(9600);
  
  cli();//stop interrupts

  //set timer1 interrupt at 1kHz
  TCCR1A = 0;// set entire TCCR1A register to 0
  TCCR1B = 0;// same for TCCR1B
  TCNT1 = 0;//initialize counter value to 0;
  // set timer count for 1khz increments
  OCR1A = 1999;// = (16*10^6) / (1000*8) - 1
  // turn on CTC mode
  TCCR1B |= (1 << WGM12);
  // Set CS11 bit for 8 prescaler
  TCCR1B |= (1 << CS11);   
  // enable timer compare interrupt
  TIMSK1 |= (1 << OCIE1A);
  
  sei();//allow interrupts
  
 }

ISR(TIMER1_COMPA_vect) {//Interrupt at freq of 1kHz
  timeX++;//increment timeX
  timeY++;//increment timeY
 }

// buttonCheck - checks the state of a given button.
//this buttoncheck function is largely copied from the monome 40h firmware by brian crabtree and joe lake
void buttonCheck(byte row, byte index)
 {
  if (((buttonCurrent[row] ^ buttonLast[row]) & (1 << index)) && // if the current physical button state is different from the
  ((buttonCurrent[row] ^ buttonState[row]) & (1 << index))) { // last physical button state AND the current debounced state

    if (buttonCurrent[row] & (1 << index)) { // if the current physical button state is depressed
      buttonEvent[row] = 1 << index; // queue up a new button event immediately
      buttonState[row] |= (1 << index); // and set the debounced state to down.
   }
    else{
      buttonDebounceCounter[row][index] = 12;
    } // otherwise the button was previously depressed and now
    // has been released so we set our debounce counter.
   }
  else if (((buttonCurrent[row] ^ buttonLast[row]) & (1 << index)) == 0 && // if the current physical button state is the same as
  (buttonCurrent[row] ^ buttonState[row]) & (1 << index)) { // the last physical button state but the current physical
    // button state is different from the current debounce 
    // state...
    if (buttonDebounceCounter[row][index] > 0 && --buttonDebounceCounter[row][index] == 0) { // if the the debounce counter has
      // been decremented to 0 (meaning the
      // the button has been up for 
      // kButtonUpDefaultDebounceCount 
      // iterations///

      buttonEvent[row] = 1 << index; // queue up a button state change event

      if (buttonCurrent[row] & (1 << index)){ // and toggle the buttons debounce state.
        buttonState[row] |= (1 << index);
       }
      else{
        buttonState[row] &= ~(1 << index);
       }
     }
   }
 }


void shift(){
  for (i=0;i<4;i++){
    buttonLast[i] = buttonCurrent[i];
    
    byte dataToSend = (1 << (i+4)) | (15 & ~ledData[i]);
      
    // set latch pin low so the LEDs don't change while sending in bits
    digitalWrite(ledLatchPin, LOW);
    // shift out the bits of dataToSend
    shiftOut(ledDataPin, ledClockPin, LSBFIRST, dataToSend);  
    //set latch pin high so the LEDs will receive new data
    digitalWrite(ledLatchPin, HIGH);
      
    //once one row has been set high, receive data from buttons
    //set latch pin high
    digitalWrite(buttonLatchPin, HIGH);
    //shift in data
    buttonCurrent[i] = shiftIn(buttonDataPin, buttonClockPin, LSBFIRST) >> 3;
    //latchpin low
    digitalWrite(buttonLatchPin, LOW);
    
    for (k=0;k<4;k++){
      buttonCheck(i,k);
     }
   }
 }

void checkFirstButton(){
  for (byte a=0;a<4;a++){
    if (buttonEvent[a]){
      for (byte b=0;b<4;b++){
        if (buttonState[a]&(1<=-10){
    return 5;
   }
  else if (RAW<-10){
    if (RAW<-50){
      return 0;
     }
    else if (RAW<-40){
      return 1;
     }
    else if (RAW<-30){
      return 2;
     }
    else if (RAW<-20){
      return 3;
     }
    else{
      return 4;
     }
   }
  else if (RAW>10){
    if (RAW>50){
      return 10;
     }
    else if (RAW>40){
      return 9;
     }
    else if (RAW>30){
      return 8;
     }
    else if (RAW>20){
      return 7;
     }
    else{
      return 6;
     }
   }
 }

void checkAccelerometer(){
  //read values
  xGyroRAW = analogRead(A1);
  yGyroRAW = analogRead(A0);
  xAccRAW = analogRead(A4);
  yAccRAW = analogRead(A3);
  zAccRAW = analogRead(A2);
  
  //offset data
  xGyroRAW = 317-xGyroRAW;
  yGyroRAW = 183-yGyroRAW;
  xAccRAW = 282-xAccRAW;
  yAccRAW = 282-yAccRAW;
  zAccRAW = 282-zAccRAW;
  
  if (xAccRAW>0){
    dirX = 1;
   }
  else{
    dirX = 0;
   }
  if (yAccRAW>0){
    dirY = 1;
   }
  else{
    dirY = 0;
   }
  
  //convert to 0-10
  xAcc = scaleAcc(xAccRAW);
  yAcc = scaleAcc(yAccRAW);
 }

int getTime(byte acceleration){
  switch (acceleration){
    case 0://max - acceleration
    return 25;
     Unterbrechung;
    case 1:
    return 25;
     Unterbrechung;
    case 2:
    return 50;
     Unterbrechung;
    case 3:
    return 100;
     Unterbrechung;
    case 4:
    return 150;
     Unterbrechung;
    case 5://lying flat
    return 0;
     Unterbrechung;
    case 6:
    return 150;
     Unterbrechung;
    case 7:
    return 100;
     Unterbrechung;
    case 8:
    return 50;
     Unterbrechung;
    case 9:
    return 25;
     Unterbrechung;
    case 10://max + acceleration
    return 25;
     Unterbrechung;
   }
 }

void moveXPixel(int timeComp){
  if (timeComp==0){
   }
  else{
    if (timeX>timeComp){
      timeX = 0;
      if (dirX){
        if (xPosition==8){
         }
        else{
          xPosition = xPosition<<1;
         }
       }
      else{
        if (xPosition==1){
         }
        else{
          xPosition = xPosition>>1;
         }
       }
     }
   }
 }

void moveYPixel(int timeComp){
  if (timeComp==0){
   }
  else{
    if (timeY>timeComp){
      timeY = 0;
      if (dirY){
        if (yPosition==3){
         }
        else{
          yPosition = yPosition+=1;
         }
       }
      else{
        if (yPosition==0){
         }
        else{
          yPosition = yPosition-=1;
         }
       }
     }
   }
 }

void checkMIDI(){
  //convert xPosition to decimal
  switch (xPosition){
    case 1:
    currentX = 0;
     Unterbrechung;
    case 2:
    currentX = 1;
     Unterbrechung;
    case 4:
    currentX = 2;
     Unterbrechung;
    case 8:
    currentX = 3;
     Unterbrechung;
   }
  //if pixel has moved send midi
  if (lastX != currentX || lastY != yPosition){
    MIDImessage(noteON,(lastX+5*lastY+MIDIoffset),0);//turn off last note
    MIDImessage(noteON,(currentX+5*yPosition+MIDIoffset),velocity);//turn on next note
   }
  lastX = currentX;
  lastY = yPosition;
 }
  

void MIDImessage(int command, int MIDInote, int MIDIvelocity) {//send sa MIDI message
  Serial.write(command);//send note on or note off command 
  Serial.write(MIDInote);//send pitch data
  Serial.write(MIDIvelocity);//send velocity data
 }

 Leere Schleife () {
  shift();
  if (firstPress){
    checkFirstButton();
   }
  else{
    for (byte pixel=0;pixel<4;pixel++){
      if (pixel==yPosition){
        ledData[pixel]=xPosition;
       }
      else{
        ledData[pixel] = 0;
       }
     }
    checkAccelerometer();
    moveXPixel(getTime(xAcc));
    moveYPixel(getTime(yAcc));
    checkMIDI();
   }
 }
The code below lets you light up one pixel in each column. As you tilt the gyroscope, the pixels bounce against the edge of the grid and trigger a MIDI note.
 //accelerometer test
//by Amanda Ghassaei 2012

 / *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
  *
 * /

//this firmware will cause the buttons to light up momentarily while they are pressed.

//pin connections
//#define ledLatchPin 6
//#define ledClockPin 5
//#define ledDataPin 7
//#define buttonLatchPin 4
//#define buttonClockPin 3
//#define buttonDataPin 2

//setup varibles for Gyroscope/Accelerometer
int xGyroRAW;
int yGyroRAW;
int xAccRAW;
int yAccRAW;
int zAccRAW;

byte xGyro;
byte yGyro;
byte xAcc;
byte yAcc;
byte zAcc;

//looping variables
byte i;
byte j;
byte k;

//storage for led states, 4 bytes
byte ledData[] = {0, 0, 0, 0};
//storage for buttons, 4 bytes
byte buttonCurrent[] = {0,0,0,0};
byte buttonLast[] = {0,0,0,0};
byte buttonEvent[] = {0,0,0,0};
byte buttonState[] = {0,0,0,0};
//button debounce counter- 16 bytes
byte buttonDebounceCounter[4][4];

//variables for accelerometer pixel movement
boolean firstPress[] = {0, 0, 0, 0};
byte movingPixel[] = {0, 0, 0, 0};
byte xPosition[4];
int timeX[] = {0, 0, 0, 0};
boolean dirX;
boolean dirY;
boolean prevDirX = 0;
boolean bounceDirection[]= {0, 0, 0, 0};
boolean toggle[] = {1, 1, 1, 1};
byte peakHeight[4];
byte lastX = 4;
byte lastY = 4;

//MIDI variables
int velocity = 100;
int noteON = 144;
int MIDIoffset = 60;
byte currentX;
byte note[] = {60, 64, 67, 72};


void setup() {
  
  DDRD = 0xFA;//set pins D7-D4 as output, D2 as input
  
  Serial.begin(31250);//MIDI baud rate 
  
  cli();//stop interrupts

  //set timer1 interrupt at 1kHz
  TCCR1A = 0;// set entire TCCR1A register to 0
  TCCR1B = 0;// same for TCCR1B
  TCNT1 = 0;//initialize counter value to 0;
  // set timer count for 1khz increments
  OCR1A = 1999;// = (16*10^6) / (1000*8) - 1
  // turn on CTC mode
  TCCR1B |= (1 << WGM12);
  // Set CS11 bit for 8 prescaler
  TCCR1B |= (1 << CS11);   
  // enable timer compare interrupt
  TIMSK1 |= (1 << OCIE1A);
  
  sei();//allow interrupts
  
 }

ISR(TIMER1_COMPA_vect) {//Interrupt at freq of 1kHz
  for (byte a=0;a<4;a++){
    timeX[a]++;//increment each element of timeX
   }
  shift();
 }

// buttonCheck - checks the state of a given button.
//this buttoncheck function is largely copied from the monome 40h firmware by brian crabtree and joe lake
void buttonCheck(byte row, byte index)
 {
  if (((buttonCurrent[row] ^ buttonLast[row]) & (1 << index)) && // if the current physical button state is different from the
  ((buttonCurrent[row] ^ buttonState[row]) & (1 << index))) { // last physical button state AND the current debounced state

    if (buttonCurrent[row] & (1 << index)) { // if the current physical button state is depressed
      buttonEvent[row] = 1 << index; // queue up a new button event immediately
      buttonState[row] |= (1 << index); // and set the debounced state to down.
   }
    else{
      buttonDebounceCounter[row][index] = 12;
    } // otherwise the button was previously depressed and now
    // has been released so we set our debounce counter.
   }
  else if (((buttonCurrent[row] ^ buttonLast[row]) & (1 << index)) == 0 && // if the current physical button state is the same as
  (buttonCurrent[row] ^ buttonState[row]) & (1 << index)) { // the last physical button state but the current physical
    // button state is different from the current debounce 
    // state...
    if (buttonDebounceCounter[row][index] > 0 && --buttonDebounceCounter[row][index] == 0) { // if the the debounce counter has
      // been decremented to 0 (meaning the
      // the button has been up for 
      // kButtonUpDefaultDebounceCount 
      // iterations///

      buttonEvent[row] = 1 << index; // queue up a button state change event

      if (buttonCurrent[row] & (1 << index)){ // and toggle the buttons debounce state.
        buttonState[row] |= (1 << index);
       }
      else{
        buttonState[row] &= ~(1 << index);
       }
     }
   }
 }


void shift(){
  
  for (i=0;i<4;i++){
    
    buttonLast[i] = buttonCurrent[i];
    
    byte dataToSend = (1 << (i+4)) | (15 & ~ledData[i]);
      
    // set latch pin low so the LEDs don't change while sending in bits
    PORTD&=B10111111;//digitalWrite(ledLatchPin, LOW);
    // shift out the bits of dataToSend 
    //shiftOut(ledDataPin, ledClockPin, LSBFIRST, dataToSend);  
    for (j=0;j<8;j++){
      PORTD&=B11011111;//digitalWrite(ledClockPin,LOW);
      //digitalWrite(ledDataPin,((dataToSend>>j)&1));
      if ((dataToSend>>j)&1){
        PORTD|=B10000000;
       }
      else{
        PORTD&=B01111111;
       }
      PORTD|=B00100000;//digitalWrite(ledClockPin,HIGH);
     }
    //set latch pin high so the LEDs will receive new data
    PORTD|=B01000000;//digitalWrite(ledLatchPin, HIGH);
    
    // SlowDown is put in here to waste a little time while we wait for the state of the output
    // pins to settle. Without this time wasting loop, a single button press would show up as
    // two presses (the button and its neighbour)
    volatile int SlowDown = 0; 

    while (SlowDown < 15) 
     { 
      SlowDown++; 
     } 
      
    //once one row has been set high, receive data from buttons
    //set latch pin high
    PORTD|=B00010000;//digitalWrite(buttonLatchPin, HIGH);
    //shift in data
    //buttonCurrent[i] = shiftIn(buttonDataPin, buttonClockPin, LSBFIRST) >> 3;
    for (j=0;j<4;j++){
      PORTD&=B11110111;//digitalWrite(buttonClockPin,LOW);
      PORTD|=B00001000;//digitalWrite(buttonClockPin,HIGH);
     }
    for (j=0;j<4;j++){
      PORTD&=B11110111;//digitalWrite(buttonClockPin,LOW);
      if ((PIND>>2)&1){//digitalRead(buttonDataPin)
        buttonCurrent[i]|=1< 
Step 29: Pots

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Connect a black wire to the left lead of a 10K linear taper potentiometer. Connect a green wire to the middle lead. Connect a red wire to the remaining lead. Repeat this for the other potentiometer. Connect the other end of the red wires to 5V, the black wires to ground, and the green wires to Analog in
Use pliers to remove the pin on the side of the pots, so that you can mount it more easily in your project enclosure.Step 30: Enclosure

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

I borrowed an idea from former Artist in Residence Mads Hobye for my enclosure. Mads founds these sleek boxes at the container store and used them to make project enclosures for the various musical instruments he built during his stay. These boxes are particularly convenient because they have a bevel around the top that allows you to easily mount a 5mm acrylic front panel.
I used a laser cutter to cut out two USB ports (one for the Arduino and one for MIDI out) in the bottom of the enclosure. Then I used a drill to make holes for two pots, a power switch, and a charging jack. The vector files are attached.
I laser cut a front panel from translucent white 5mm acrylic so that it would snap fit into the wood box. the eps file for the front panel is attached below.Step 31: Final Firmware


For the final firmware, I've extracted all the code that controls the buttons and leds into a library to make it more tidy, all of this is in a class called SugarCube . I was inspired by the work I've been doing on the Instructables iOS app, and wrote the event handling pieces of the code so that they work in a similar way that an iPhone deals with touch and other gestural events. Basically I created a set of methods that each app can subscribe to, things like "deviceWasShaken" or "buttonPressed". When the SugarCube class detects one of these events, it tells the current app to execute the corresponding method. If you're interested in seeing an example of this structure in action, check out SimpleMIDIKeyboard.cpp , it shows how few lines of code are needed to wire up all the button and analog controls to MIDI outputs. I hope to eventually write out a little more complete documentation for how to write your own apps based on this framework, please let me know if there is interest. This is by far my biggest piece of C++ code, and I am by no means an expert in C++, I'd love to hear an expert's thoughts on how I did!
Step for running the code:
Download the zip file from github
unzip
rename the folder to "SugarCubeLibraryFiles"
open the file SugarCubeLibraryFiles.ino in Arduino
connect your Arduino and uploadStep 32: Future Work


This project has the potential to be expanded upon quite a bit. Unfortunately, I just don't have the time to invest in exploring all the possibilities, but here's some ideas I had for things to look into:
More apps: The current implementation of this device allows you to boot into 16 different applications, but I've only written seven so far. There's a ton of great ideas over on the monome website for grid based controllers, it'd be great to see some of that translated into Arduino.
Gyro Control: As I mentioned earlier, I threw an x/y gyroscope in the controller, but I've yet to write an app that actually uses it. I'd love to hear if someone has an idea for how this could work with MIDI.

Wireless : When I started this project, my major design objectives were portability and plug and play ease of use. I wanted to try to break away from the model of the electronic controller that necessitates a computer to run, in an effort to bring electronic music out of the traditional studio environment. In keeping with that idea, I'd like to eventually get this controller to wirelessly send MIDI to my phone to make it totally portable. I have one of these bluetooth boards from Red Bear Labs , and I think there might be some way to send the data to my phone, translate it into CoreMIDI and run it though a MIDI synth, but I just haven't explored the idea enough yet. If anyone has any insight, I'd love to hear your thoughts.Step 33: Appendix: Cut PCB for Control Buttons

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Originally, I planned to have four extra "control" buttons on the side of the controller that I was going to use in various applications. I started wiring it up, but eventually scrapped it. I haven't written any code for these buttons, and they are in no way integrated into the apps I've written, but I figured I'd still include the images that I took during that process in this Instructable in case it's useful to anyone.
Cut the 2x2 sparkfun pcb as shown in the pictures above. Solder white LEDs and diodes on the pcb as in steps 2 and 3.Step 34: Appendix: Control Buttons Wiring Part 1: PCB

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Alle 8 Artikel anzeigen

Cut a piece of ribbon cable and solder 8 wires to the sparkfun PCB holes labelled "switch gnd" and "led gnd". Solder four more wires to the holes labelled "switch" and "blue." See the images for more info.
On one half of the PCB (the one labelled "green" and "blue") you will have to rewire some of the traces that were broken when the PCB was cut. Both connections to the positive switch rail will need to be connected to each other and then connected to the "green" led trace as shown in fig 4. I did this by removing one strand of a piece of stranded wire and poking it through the vias on the PCB. Use a dab of solder to secure the electrical connection between the copper strand and the PCB (fig 7). You will also have to solder a wire between the two "blue" positive rails (also shown in fig 4). Once this is done, test for continuity and cover the exposed copper with electrical tape to prevent short circuits (fig 6).
On the other half of the PCB, use a jumper wire to connect the "red" and "blue" sockets of one of the LEDs together (see fig 7). This will connect the anode of your white LEDs to the ribbon cable.Step 35: Appendix: Control Buttons Wiring Part 2: Socket

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Clamp a 16 pin socket onto the ribbon cable as shown in fig 1. Solder two rows of male header pins to the protoboard so that the control buttons fit onto the board as shown in fig 3. Trim any excess ribbon cable.Step 36: Appendix: Control Buttons Wiring Part 3: Header Pins

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Solder 3 more male header pins to snap to digital pins 11-13. Since the spacing between Arduino digital pins 0-7 and pin 8-13, I had to drill holes in my perfboard and scrape off some of the copper traces. See the images above for more information.Step 37: Appendix: Control Buttons Wiring Part 4: Connections to LEDs

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Solder four 68ohm resistors to the pins which connect to the LED cathodes. Connect the other end of these resistors to pins 4-7 of the 74HC595 with jumper wires (yellow).
We'll be using pin 11 of the Arduino to supply positive voltage to the LEDs, but one Arduino pin cannot source enough current to drive the LEDs by itself. I used a 222 NPN transistor in an emitter-follower configuration to boost the power of pin 11's signal. Connect pin 11 to the base (middle pin) of the transistor. Connect the collector to the Arduino's 5V supply and the emitter to the header pins which connect to the LED anodes (fig 5).Step 38: Appendix: Control Buttons Wiring Part 5: Connections to Buttons

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Sugarcube MIDI Controller

Solder a jumper wire between pin 13 of the Arduino and the header pins which attach to the button anodes.
On the reverse side of the perfboard I soldered four jumper wires from the button cathode pins to 10k resistors connected to ground (fig 4). I did this to save space on my PCB so that it would fit in an enclosure better. I also soldered four jumper wires from the non grounded side of the 10k resistors to 165 pins 3-6.