Ich hab mir das "Protokoll" der App Tah-Play mal angeschaut.
Es ist nicht sehr kompliziert und lässt sich mit den "üblichen Mitteln" leicht auswerten (also Einlesen bis zum Endzeichen, Auswertung danach - siehe z.B. Serial Input Basics - updated )
Die App-Oberfläche

Hintergrund
Die App sendet eine Nachricht sowohl wenn eine der Tasten gedrückt wird, als auch wenn eine Taste losgelassen wird (also so ähnlich wie eine PC-Tastatur).
Das Endzeichen jeder Nachricht ist P (großes P). Es wird nur das P als Endzeichen gesendet, also kein LF oder CR.
Es gibt 2 "Tastengruppen".
Zur linken Tastengruppe gehören folgende Tasten: UP, DOWN, LEFT, RIGHT
Zur rechten Tastengruppe gehören folgende Tasten: A, B, X, Y, Select, Start
Die gesendeten Zeichen für die linke Tastengruppe sind fix und lassen sich nicht ändern.
Bei der rechten Tastengruppe lassen sich die gesendeten Zeichen für A, B, X, Y einstellen, die für "Select" und "Start" sind fix.
Bei jeder der beiden Tastengruppen kann jeweils (nur) eine Taste gleichzeitig gedrückt sein.
Aber natürlich können 2 Tasten gleichzeitig gedrückt sein, solange es sich um eine Taste der linken und eine Taste der rechten Tastengruppe handelt.
Bei jedem Drücken oder Loslassen einer Taste wird eine Nachricht mit Status-Infos sowohl der linken als auch der rechten Tastengruppe geschickt.
Das Protokoll
Die Nachricht, die die App über BLE verschickt sieht so aus.
Beispiel: Drücken der Taste UP
1,0,0,2,0P
Jede Nachricht wird mit "P" abgeschlossen (Endzeichen: P).
Die ersten 6 Zeichen jeder Nachricht sind immer gleich: 1,0,0,
Das 7. Zeichen repräsentiert den Status der linken Tastengruppe:
5 .... keine Taste gedrückt
2 .... Taste UP gedrückt
4 .... Taste LEFT gedrückt
6 .... Taste RIGHT gedrückt
8 .... Taste DOWN gedrückt
Die Zeichen 9 (und eventuell nachfolgende 1 oder 2 Zeichen) repräsentieren den Status der rechten Tastengruppe:
0 .... keine Taste gedrückt
5 .... Taste SELECT gedrückt
6 .... Taste START gedrückt
Die übertragenen Werte der Tasten A, B, X, Y sind in der App einstellbar und repräsentieren den ASCII-Code des eingestellten Zeichens. Die Werte können also Werte von 32 (Leerzeichen) bis 126 (Zeichen ~) haben, je nach Einstellungen.
Bei "günstiger Einstellung" in der App, kann auf die Auswertung von Zeichen 10 und ev. 11 verzichtet werden.
Da 5 und 6 bereits "vergeben" sind bleiben noch 3x, 4x, 7x, 8x, 9x.
Beispiel, App-Einstellungen:
A = ! (ASCII 33)
B = 1 (ASCII 49)
X = F (ASCII 70)
Y = R (ASCII 82)
Dann gilt für das 9. Zeichen (rechte Tastengruppe):
0 .... keine Taste gedrückt
5 .... Taste SELECT gedrückt
6 .... Taste START gedrückt
3 .... Taste A gedrückt
4 .... Taste B gedrückt
7 .... Taste X gedrückt
8 .... Taste Y gedrückt
Beispiel-Sketch zur Auswertung
Als Basis dient Serial Input Basics - updated.
Das Endzeichen wurde geändert auf "P".
Die Auswertung ist (nur) eine serielle Ausgabe, das muss man auf die eigenen Gegebenheiten anpassen.
/* Test mit BLE und iOS App Tah-Play
Einstellungen in der App:
Taste A: ! (ASCII 33)
Taste B: 1 (ASCII 49)
Taste X: F (ASCII 70)
Taste Y: R (ASCII 82)
Hardware:
Arduino (UNO)
Bluetooth-Modul HM-10 (für iOS)
*/
// Bluetooth
#include <SoftwareSerial.h>
const byte rxPin = 2;
const byte txPin = 3;
SoftwareSerial btSerial(rxPin, txPin);
// Auswertung BT-Serial
const int SERIAL_BUFFER_SIZE = 16; // die maximale Zeilenlänge +1
char serialBuffer[SERIAL_BUFFER_SIZE];
byte sbIndex;
void setup() {
Serial.begin(9600);
Serial.println("los geht's");
btSerial.begin(9600); // Standard speed
}
void loop() {
if (readSerial(btSerial)) //liefert true wenn das Nachrichten-Ende erreicht
{
auswertungDerNachricht();
}
}
// Einfach so lange alles einlesen bis das Endzeichen (P) kommt.
bool readSerial(Stream& stream)
{
while (stream.available())
{
char c = stream.read();
if (c == 'P' && sbIndex > 0) // wenn "P" eingelesen und String länger als 0 ist
{
serialBuffer[sbIndex] = '\0'; // String terminieren
sbIndex = 0;
return true; // melden dass String fertig eingelesen wurde
}
else if (sbIndex < SERIAL_BUFFER_SIZE - 1) // solange noch Platz im Puffer ist
{
serialBuffer[sbIndex++] = c; // Zeichen abspeichern und Index inkrementieren
}
}
return false; // noch nicht fertig
}
void auswertungDerNachricht() {
// relevant sind nur Zeichen 7 und 9:
// serialBuffer[6] ... also Zeichen 7: Status der linken Tastengruppe
// serialBuffer[8] ... also Zeichen 9: Status der rechten Tastengruppe
switch(serialBuffer[6]) { // Linke Tastengruppe
case '2':
Serial.print("Links: UP");
break;
case '4':
Serial.print("Links: LEFT");
break;
case '5':
Serial.print("Links: ----");
break;
case '6':
Serial.print("Links: RIGHT");
break;
case '8':
Serial.print("Links: DOWN");
break;
default:
break;
}
Serial.print('\t');
switch(serialBuffer[8]) { // Rechte Tastengruppe
case '0':
Serial.print("Rechts: ----");
break;
case '3':
Serial.print("Rechts: A");
break;
case '4':
Serial.print("Rechts: B");
break;
case '5':
Serial.print("Rechts: Select");
break;
case '6':
Serial.print("Rechts: Start");
break;
case '7':
Serial.print("Rechts: X");
break;
case '8':
Serial.print("Rechts: Y");
break;
default:
break;
}
Serial.println();
}
Nachtrag:
Das oben Beschriebene bezieht sich auf die Variante "Joystick" der App Tah-Play (siehe Bild oben).
Es gibt noch eine andere Variante, nämlich "Play Station". Diese ist bei mir gekennzeichnet mit "Experimental" und ich habe sich nicht zum Laufen gebracht, weil das Programm (die App Tah-Play) beim Start von "Play Station" immer abstürzt.
