Button Board 3×3 – Quick Start Guide

Veröffentlicht am

Inhalt

  1. Bild
  2. Lieferumfang
  3. Zusammenbau
  4. Beispielsoftware
  5. 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!