Adafruit NeoTrellis

Hallo zusammen!

Da ich neu hier bin kurz zu mir: Ich komme eigentlich eher aus der DIY-Stompbox Ecke und habe bisher noch nicht so wahnsinnig viel Erfahrungen mit Arduino gesammelt. Für ein paar Midi- und USB Controller hat es bisher gereicht. Überwiegend recht einfache Dinger mit ein paar Schaltern, LEDs und Potis, hier und da jetzt auch schon mal was mit digitalen Potis und zuletzt einen 24-Step CV-Sequencer für meinen Moog.

Ich versuche gerade für mein zukünftiges Modularsystem einen Trigger Sequencer zu bauen und möchte dafür eine Button-Matrix alá Monome usw. verwenden. Dafür habe ich mich für die NeoTrellis Boards von Adafruit entschieden. Mein aktueller Arduino ist ein Nano, USB soll das Teil bisher nicht bekommen.

Mein Problem ist nun, dass ich mit den Beispielen aus der NeoTrellis Library relativ wenig anfangen kann. Ich habe es bisher geschafft die vier Boards für einen 4x16 Sequencer einzurichten, einzelne LEDs an und aus zu schalten und die leere Sequenz zum Laufen zu bringen. Die Farben der einzelnen Buttons bekomme ich auch geändert, aber da hört mein Verständnis der Library leider auch schon auf. Ich würde als nächsten Schritt gerne die "Noten" in den Sequencer eingeben können, scheitere aber daran, die Tasteneingaben der NeoTrellis auszulesen.

Wenn ich es richtig verstehe, werden die keyEvents des NeoTrellis über einen Callback zu Beginn des Sketches ausgelesen. Hierzu die betreffende Codezeile aus dem NeoTrellis Beispiel "basic".

//define a callback for key presses
TrellisCallback blink(keyEvent evt){
  if(evt.bit.EDGE == SEESAW_KEYPAD_EDGE_RISING)
      trellis.setPixelColor(evt.bit.NUM, 0xFF8700); //on rising
  else if(evt.bit.EDGE == SEESAW_KEYPAD_EDGE_FALLING)
      trellis.setPixelColor(evt.bit.NUM, 0x080808); //off falling
    
  trellis.show();
  return 0;
}

Callbacks sind gerade noch vollkommenes Neuland für mich. Warum steht dieses Callback in den Beispielen noch vor dem void setup()? Warum funktioniert die if-Funktion ohne geschweifte Klammern?
Ich würde gerne verstehen was in diesem Callback genau passiert. Wenn ich z.B. mit Serial.print(keyEvent) versuche mir anzeigen lassen was da passiert, bekomme ich nur Fehlermeldungen.

Vielleicht hat ja jemand bereits Erfahrungen mit diesen Boards und kann mich zumindest in die richtige Richtung schubsen :wink:

//edit
Das habe ich gerade vergessen: Ich habe natürlich schon ein paar Tage zu dem Thema recherchiert, die meiste Dokumentation zu den NeoTrellis ist für CircuitPython, womit ich aktuell nichts anfangen kann. Ansonsten ergeben viele Suchen nur Ergebnisse für die alten monochromen Trellis Boards, die mit einer weitestgehend anderen Library arbeiten. Daher nun meine Frage hier im Forum...

Hallo und willkommen im Forum!

Die ersten beiden Absätze Deines Beitrags verstehe ich leider nicht, da sie zu viele mir unbekannte Begriffe enthalten. Da ich Midi mit Musik verbinde, machst Du vermutlich was mit Musik.

Die hübschen Fingermägel der Damen von Adafruit kenne ich, von NeoTrellis laß ich gerade das erste Mal. Beste Voraussetzungen für eine sinnvolle Hilfestellung ;D

seele27:
Warum steht dieses Callback in den Beispielen noch vor dem void setup()?

Das Callback könnte auch am Ende stehen, ist also nur Optik.

seele27:
Warum funktioniert die if-Funktion ohne geschweifte Klammern?

Der if-Bedingung folgt ein Block, normalerweise in geschweiften Klammern eingeschlossen. Besteht der Block aber aus einer Anweisung, können die Klammern entfallen. Ich mag es dennoch lieber immer mit.

seele27:
Ich würde gerne verstehen was in diesem Callback genau passiert.

Bei steigender oder fallender Flanke wird der Taste eine Farbe zugeordnet, also z. B. 0xFF8700 als RGB.

Anschließend werden die NeoPixel aktualisiert.

seele27:
Wenn ich z.B. mit Serial.print(keyEvent) versuche mir anzeigen lassen was da passiert, bekomme ich nur Fehlermeldungen.

Du kannst keinen Typ ausgeben, Serial.print(byte) geht auch nicht. Syntaktisch möglich wäre Serial.println(evt.bit.NUM);

Vielen Dank für die Antwort agmue! Du hast damit gerade schon mal den Großteil meines Problems gelöst :smiley:

agmue:
Der if-Bedingung folgt ein Block, normalerweise in geschweiften Klammern eingeschlossen. Besteht der Block aber aus einer Anweisung, können die Klammern entfallen. Ich mag es dennoch lieber immer mit.

Die fehlenden Klammern haben mich hier echt verwirrt. Der Arduino IDE waren die nicht egal. Ohne Klammern funktioniert nämlich das Serial.print() bei mir nicht. Mit Klammern funktioniert es. Liegt die Betonung dabei auf einer Anweisung? Also bei mehreren funktioniert das nicht mehr?

Du kannst keinen Typ ausgeben, Serial.print(byte) geht auch nicht. Syntaktisch möglich wäre Serial.println(evt.bit.NUM);

Weil die IDE das nicht kompilieren wollte, war ich hier dann vollkommen verwirrt und habe das u.a. mit keyEvent versucht. Verstehe ich dich da gerade richtig, das keyEvent in dem Fall der data type einer Variable sein soll? Diesen type finde ich in der Referenz nicht.

Ist dieses Callback denn jetzt doch nichts anderes als eine Funktion? Ich bin die ganze Zeit davon ausgegangen, dass da irgend etwas anderes dahinter steckt und meine Syntax deswegen einfach nicht funktionieren konnte.

Ich würde gerne das Konzept dahinter verstehen. Seit ich mit Arduino zu tun habe schaue immer mal wieder neben der Arduino Referenz auch in Tutorials zu C und C++ (u.a. w3schools.com). Zum Thema Callback habe ich da allerdings noch nichts Konkretes gefunden. Eine Literaturempfehlung dazu wäre mir sehr willkommen!

seele27:
Liegt die Betonung dabei auf einer Anweisung?

Ja, der Mathematiker würde vermutlich "genau eine Anweisung" formulieren.

seele27:
Verstehe ich dich da gerade richtig, das keyEvent in dem Fall der data type einer Variable sein soll? Diesen type finde ich in der Referenz nicht.

Ja fast, es ist aber kein Standardtyp, den Du wie byte in der Referenz findest, sondern ein union, das von der Bibliothek in Adafruit_seesaw.h festgelegt wird.

Will man die Bibliothek verstehen, findet man Informationen entweder in einer ausführlichen Dokumentation oder in den Bibliotheksdateien. Ich schreibe nicht, das sei einfach.

seele27:
Ist dieses Callback denn jetzt doch nichts anderes als eine Funktion?

Richtig, quasi eine Funktion innerhalb Deines Programms, die von der Bibliothek verwendet wird.