Inhalt
- Bild
- Lieferumfang
- Zusammenbau
- Beispielsoftware
- TonUINO Community
Bild
Lieferumfang
Enthalten ist das Button Board 3×3, eine 10er Pinleiste (gerade), eine 10er Pinleiste (gewinkelt) und zehn bunt gemischte Buttoncaps.
Zusammenbau
Es müssen eigentlich nur die Buttoncaps nach Wunsch auf die Buttons gedrückt werden. Wenn das Button Board 3×3 an eine TonUINO All-In-One Platine angeschlossen werden soll, ist einfach das dort enthaltene 10-polige Kabel zu verwenden. Für den Anschluss an andere Hardware (z.B. TonUINO Classic) kann eine der beiliegenden 10-poligen Pinleisten eingelötet werden.
TonUINO All-In-One Platine
Für den Betrieb an der TonUINO All-In-One Platine ist der DIP Switch oben links wie folgt einzustellen:
OFF | OFF | ON | ON
(Oben = ON
)
Der Pin für den ADC ist in dem Fall FWRD
. Die anderen Pins entsprechen der Beschriftung.
TonUINO Classic Platine
Für den Betrieb an der TonUINO Classic Platine ist der DIP Switch oben links wie folgt einzustellen:
ON | OFF | ON | OFF
(Oben = ON
)
Der Pin für den ADC ist in dem Fall FWRD
. Die anderen Pins entsprechen der Beschriftung und können an die entsprechenden Pins der TonUINO Classic Platine verbunden werden. Hier bitte GND
nicht vergessen.
Achtung: Damit der Play/Pause Button (Play_P
Pin) funktioniert, ist zusätzlich Play_N
zwingend mit GND
auf der TonUINO Classic Platine zu verbinden! Alternativ kann dazu auch der Lötjumper SJ1 nahe des Play/Pause Buttons auf der Vorderseite der Platine geschlossen werden.
Beispielsoftware
Das Button Board 3×3 richtet sich an Bastler. Die folgende Demo kann als Startpunkt für eigene Entwicklungen genutzt werden. Die Demo wurde für die TonUINO All-In-One Platine entwickelt, funktioniert allerdings auch auf einem Ardunino Nano (z.B. TonUINO Classic).
/* TU_BB_3x3 v1.0 Demo mp3 files go on the sd card in the mp3 folder. one mp3 file per one of the nine buttons. naming is 0001.mp3, 0002.mp3, 0003.mp3 ... 0009.mp3: mp3 ├── 0001.mp3 ├── 0002.mp3 ├── 0003.mp3 ├── ... └── 0009.mp4 holding vol- for 2s at any time powers off the AiO. */ #include <SoftwareSerial.h> #include <DFMiniMp3.h> #include <AceButton.h> using namespace ace_button; const uint8_t mp3SerialRxPin = 2; const uint8_t mp3SerialTxPin = 3; const uint8_t busyPin = 4; #if defined(__LGT8F__) const uint8_t powerControlPin = 7; const uint8_t onboardSdAccessControlPin = A5; const uint8_t onboardAmpControlPin = 8; #endif const uint8_t playPausePin = A0; // play/pause/power on const uint8_t ladderPin = A2; // ladder buttons pin const uint8_t volDownPin = A3; // vol- (hold to power off) const uint8_t volUpPin = A4; // vol+ const uint8_t ladderButtonCount = 9; const uint16_t ladderButtonLevels[ladderButtonCount + 1] = { #if defined(__LGT8F__) // values for AiO (2,048V reference, 12bit ADC), TU_BB_3x3 v1.0 0, 490, 945, 1494, 1949, 2480, 2937, 3373, 3691, 4064 #else // values for Arduino Nano (5V reference, 10bit ADC), TU_BB_3x3 v1.0 0, 92, 194, 307, 405, 512, 608, 698, 773, 1023 #endif }; void handleButtonEvent(AceButton *button, uint8_t eventType, uint8_t /* buttonState */); class Mp3Notify { public: static void OnError(uint16_t returnValue) {} static void OnPlayFinished(DfMp3_PlaySources source, uint16_t returnValue) {} static void PrintlnSourceAction(DfMp3_PlaySources source, const char* action) {} static void OnPlaySourceOnline(DfMp3_PlaySources source) {} static void OnPlaySourceInserted(DfMp3_PlaySources source) {} static void OnPlaySourceRemoved(DfMp3_PlaySources source) {} }; SoftwareSerial mp3Serial(mp3SerialRxPin, mp3SerialTxPin); DFMiniMp3<SoftwareSerial, Mp3Notify> mp3(mp3Serial); AceButton playPauseButton(playPausePin); AceButton volDownButton(volDownPin); AceButton volUpButton(volUpPin); AceButton ladderButton1((uint8_t) 0); AceButton ladderButton2(1); AceButton ladderButton3(2); AceButton ladderButton4(3); AceButton ladderButton5(4); AceButton ladderButton6(5); AceButton ladderButton7(6); AceButton ladderButton8(7); AceButton ladderButton9(8); AceButton* const ladderButton[ladderButtonCount] = { &ladderButton1, &ladderButton2, &ladderButton3, &ladderButton4, &ladderButton5, &ladderButton6, &ladderButton7, &ladderButton8, &ladderButton9 }; LadderButtonConfig ladderButtons(ladderPin, ladderButtonCount + 1, ladderButtonLevels, ladderButtonCount, ladderButton); void setup() { #if defined(__LGT8F__) // keep AiO powered pinMode(powerControlPin, OUTPUT); digitalWrite(powerControlPin, HIGH); // sd access off for safety pinMode(onboardSdAccessControlPin, OUTPUT); digitalWrite(onboardSdAccessControlPin, LOW); // enable amp pinMode(onboardAmpControlPin, OUTPUT); digitalWrite(onboardAmpControlPin, LOW); // internal reference voltage 2,048V analogReference(INTERNAL2V048); // adc resolution 12 bit analogReadResolution(12); #endif pinMode(playPausePin, INPUT_PULLUP); pinMode(volDownPin, INPUT_PULLUP); pinMode(volUpPin, INPUT_PULLUP); pinMode(ladderPin, INPUT); ButtonConfig* buttonConfig = ButtonConfig::getSystemButtonConfig(); buttonConfig->setEventHandler(handleButtonEvent); buttonConfig->setFeature(ButtonConfig::kFeatureClick); buttonConfig->setClickDelay(1000); buttonConfig->setFeature(ButtonConfig::kFeatureLongPress); buttonConfig->setLongPressDelay(2000); ladderButtons.setEventHandler(handleButtonEvent); ladderButtons.setFeature(LadderButtonConfig::kFeatureClick); ladderButtons.setClickDelay(1000); mp3.begin(); delay(2000); mp3.setVolume(10); } void loop() { playPauseButton.check(); volDownButton.check(); volUpButton.check(); ladderButtons.checkButtons(); mp3.loop(); } void handleButtonEvent(AceButton* button, uint8_t eventType, uint8_t /* buttonState */) { switch (eventType) { case AceButton::kEventClicked: { if (button->getPin() == playPausePin) !digitalRead(busyPin) ? mp3.pause() : mp3.start(); else if (button->getPin() == volDownPin) mp3.decreaseVolume(); else if (button->getPin() == volUpPin) mp3.increaseVolume(); else if (button->getPin() == 0) mp3.playMp3FolderTrack(1); else if (button->getPin() == 1) mp3.playMp3FolderTrack(2); else if (button->getPin() == 2) mp3.playMp3FolderTrack(3); else if (button->getPin() == 3) mp3.playMp3FolderTrack(4); else if (button->getPin() == 4) mp3.playMp3FolderTrack(5); else if (button->getPin() == 5) mp3.playMp3FolderTrack(6); else if (button->getPin() == 6) mp3.playMp3FolderTrack(7); else if (button->getPin() == 7) mp3.playMp3FolderTrack(8); else if (button->getPin() == 8) mp3.playMp3FolderTrack(9); break; } case AceButton::kEventLongPressed: { if (button->getPin() == volDownPin) digitalWrite(powerControlPin, LOW); break; } } }
TonUINO Community
Für Diskussionen über das Button Board 3×3 gibt es vom TonUINO Projekt ein tolles Community Forum. Schau dort gerne mal vorbei!