Daten von android device über Bluetooth empfangen

moin moin..

hat jemand schon das Beispiel von BluetoothCursors.pde von ketai libraray im Processing mode android mit arduino laufen lassen?

bzw. ich schaffe es nicht die über Bluetooth gesendenen daten vom android device richtig zu empfangen.

Kummunikation wird aufgebaut, die x-Y Werte von dem cursor werden auch gesendet, nun wenn ich die im IDE printen lasse, sind die dann einfach falsch..
Das Senden den Daten im Android Device erfolgt über die bt.broadcast() funktion.

ich hab das code vom processing sowie von arduino mit dem HC-06 im attachments,
Vielleicht hat hier jemand Erfahrung damit und könnte mal ein Tip geben.

gruß

processingCode-1.txt (3.63 KB)

processing related UI funktionen.txt (2.33 KB)

arduino-Bluet..txt (492 Bytes)

Hallo,

dein einlesen im 3. Code funktioniert so nicht. Deine available Funktion ist leer und deine read Funktionen stehen alleine da. Das macht keinen Sinn. Außerdem hast du das niemals getestet, sieht man daran das die Variablen nicht definiert sind.

Probieren kannste das hier, dann kommt jedes Zeichen einzeln.

  if (BT.available()) ;  // Wait here until input buffer has a character
  {     
   char c = BT.read();  
   Serial.print(c);   // oder wie der Software Serial Befehl auch immer heißt
  }

Ansonsten schauste dir mal das Bsp. an, dabei wird alles in einen Buffer geschrieben.

const int _SERIAL_BUFFER_SIZE = 20;
char _serialBuffer0[_SERIAL_BUFFER_SIZE];
char _serialBuffer1[_SERIAL_BUFFER_SIZE];  

void setup() {
  
  Serial.begin(9600);
  Serial1.begin(9600); 
}

void loop() {
  
read_serial_0();

read_serial_1();

}  // loop Ende

// ------------------------------------------------------------------------------------

void read_serial_1()  {   // liest vom Bluetooth Modul ein (Serial Port 1)
  
   static unsigned int index1;
   if (Serial.available() > 0)  {   
      char c = Serial.read();
      if (c >= 32 && index1 < _SERIAL_BUFFER_SIZE - 1 )  {
         _serialBuffer1[index1++] = c;
      }
      else if(c == '\n')  {     // Endeerkennung 'LineFeed'
         _serialBuffer1[index1] = '\0';
         index1 = 0;
         Serial.println (_serialBuffer1);
         Serial1.println(_serialBuffer1);
      }
   }
}


void read_serial_0()  {   // liest vom PC Terminal ein (Serial Port 0)
  
   static unsigned int index0;
   if (Serial.available() > 0)  {		
      char c = Serial.read();
      if (c >= 32 && index0 < _SERIAL_BUFFER_SIZE - 1 )  {
         _serialBuffer0[index0++] = c;
      }
      else if(c == '\n')  {     // Endeerkennung 'LineFeed'
         _serialBuffer0[index0] = '\0';
         index0 = 0;
         Serial.println (_serialBuffer0);
         Serial1.println(_serialBuffer0);
      }
   }
}

@ Doc_Arduino

hallo, erstmal danke für deine Bemühungen.

Getestet und das Code angepasst habe ich schon mehrmals nun ohne saubere Auswertung.
Beim Koppieren des Codes hier habe ich die Deklaration den variablen vergessen.

Also beim deinem ersten Codesvorschlag kriege ich, egal bei welche Bt baudrate, pausenlos komische buchstaben.

das zweite Code dagegen ist näher dran der spuckt mir so was aufm Serial Port
12,/remoteMouse/,ii
K/remoteMouse/,iiY/
/remoteMouse/,ii/re
/remoteMouse/,ii/re
/remoteMouse/,ii%/r
/remoteMouse/,ii/re
/remoteMouse/,iiV/r
/remoteMouse/,ii/re
/remoteMouse/,ii+/r
/remoteMouse/,ii/re
/remoteMouse/,ii/re
/remoteMouse/,iis/r
/remoteMouse/,iif/r

das processing code sollte eig. X-Y Werte des cursors schicken..

Im arduino Code oder Vllt auch im processing code muss noch was gemacht werden zB. wegen dem "/n" für die Enderkennung

Hallo,

die Baudraten sind überall richtig eingestellt?
Mit Processing habe ich noch nichts weiter gemacht. Nur mal getestet vor langer Zeit. Der Syntax war glaube ich auch nicht zu 100% exakt gleich.

Ich weis auch nicht was du meinst mit "es muß nochwas gemacht werden wegen \n"
Kannst das noch auf CR erweitern, wenn das hilft.

else if(c == '\n' || '\r')   // Endeerkennung, newline oder carriage return

Du solltest nochmal zusammenfassen.
Was soll wie ankommen und woher und an wem? Vom Rechner an den Arduino lese ich z.Z. heraus.
Was kommt aktuell wie an?
Was für Werte sind das genau? Wertebereich?
Code in Code Tags , Button links oben </>.
Oder . ino ranhängen. .txt ist blöd, die Formatierung geht verloren.

Hallo,

die Baudraten stimmen schon.
Also es gibt die so genannte Ketai Library für processing android.
In diese bib. gibt es das "Bluetoothcursors" Beispiel.
Es geht darum die X-Y bei der Bedienung oder Berühren der Bildschirm des Handys über Bluetooth(vom handy) zu schicken.
Der Arduino soll die Werte empfangen mit einer bluetooth Module.
Soweit ist alles im grünen Bereich, bzw. das beispiel vom processing kann compilen, flaschen und die app startet ohne Fehler, bei der berührung der bildschirm werden die Daten geschickt mit der fkt." bt.broadcast(m.(getBytes))"die Verbindung mit der BT-module und arduino steht auch..

Darum gehe ich davon aus dass das problem das arduino Code ist. Ich muss eine saubere Auswertung für das empfangen haben. ich habe Gelesen dass mit der Fkt. bt.broadcast() im processing nur Bytes Array greschickt werden können.. soweit auch gut .. nun wie kann man das am besten empfangen .. sind ja int. Werte im Bereicht 0 bis 3000.. Im Attachments sind die Codes .ino und .pde

BT.receive_2.ino (801 Bytes)

BluetoothCursors.pde (3.5 KB)

UI.pde (2.21 KB)

Hallo,

mit Processing komme ich nicht zu Rande. Dein Code kompiliert auch nicht. Aber selbst wenn ich die Serialen Bsp. teste habe ich Probleme mit der COM Schnittstelle.

Ich habe deshalb einen 2. Arduino an meinen Mega rangehangen, dieser sendet aller 2 Sekunden mit Serial.println(value);
eine Integerwert ab 3000 raus und erhöht immer um eins.

Diesen Integer lese ich mit folgenden Code im anderen Arduino auf Serial 1 ein und gebe ihn über Serial 0 aus, dass ich was sehe. Das Problem ist, serial überträgt immer Byteweise. Man kann also im einfachsten Fall nur Werte zwischen 0 ... 255 übertragen. Will man größerer Werte übertragen, muß man sie entweder vorher zerlegen und wieder zusammensetzen oder gleich als char String empfangen. Damit man wieder damit rechnen kann muß man dann den string wieder in einen Integer wandeln.

Ob nun die Werte von meinem 2. Arduino kommen oder über deine BT sollte egal sein.

const int _SERIAL_BUFFER_SIZE = 20;
char _serialBuffer0[_SERIAL_BUFFER_SIZE];
char _serialBuffer1[_SERIAL_BUFFER_SIZE];  

void setup() {
  
  Serial.begin(9600);
  Serial1.begin(9600);
}

void loop() {
  
read_serial_1();

}  // loop Ende

// ------------------------------------------------------------------------------------

void read_serial_1()  {   // liest vom Serial Port 1
  
   static unsigned int index1;
   if (Serial1.available() > 0)  {  
      char c = Serial1.read();
      if (c >= 32 && index1 < _SERIAL_BUFFER_SIZE - 1 )  {
         _serialBuffer1[index1++] = c;
      }
      else if(c == '\n' || c == '\r')  {     // Endeerkennung 'LineFeed'
         _serialBuffer1[index1] = '\0';
         index1 = 0;
         Serial.println (_serialBuffer1);    // char string Ausgabe
         int IntZahl = atoi(_serialBuffer1); // string in int wandeln
         Serial.print(F("String zu int: ")); Serial.println(IntZahl);
      }
   }
}

sieht dann so aus:

3743
String zu int: 3743

String zu int: 0
3744
String zu int: 3744

String zu int: 0
3745
String zu int: 3745

String zu int: 0

Hallo,

auf deine Software Seriale abgeändert, sollte das so aussehen, ungetestet aber es kompiliert.
Damit kannst du einen Integer übertragen, einlesen, weiterverarbeiten. Sollte klappen.

Du möchtest aber mehrere Integer Werte übertragen. Dann brauchst du ein festes Protokoll. Sonst weist du nicht was welcher Farbwert sein soll. Ich würde am Arduino dann alle Werte durch Komma getrennt als String übertragen und dann wieder trennen. Oder Du modifizierst den String vorm senden noch und stellst am Anfang einen Buchstaben voran. R, G oder B. Daran erkennt dann der Empfangscode zu welcher Farbe der Wert gehört. Es wird auf jeden Fall aufwändiger.

#include <SoftwareSerial.h>
SoftwareSerial BT(10, 11); 
// creates a "virtual" serial port/UART
//connect BT module TX to D10
// connect BT module RX to D11
// connect BT Vcc to 5V, GND to GND

const int _SERIAL_BUFFER_SIZE = 20;
char _serialBuffer1[_SERIAL_BUFFER_SIZE];  

int Farbe = 0;

void setup() {
  
  Serial.begin(9600);
}

void loop() {
  
read_serial_BT();

}  // loop Ende

// ------------------------------------------------------------------------------------

void read_serial_BT()  {   // liest vom Bluetooth Modul ein (Serial Port 1)
  
   static unsigned int index1;
   if (BT.available() > 0)  {  
      char c = BT.read();
      if (c >= 32 && index1 < _SERIAL_BUFFER_SIZE - 1 )  {
         _serialBuffer1[index1++] = c;
      }
      else if(c == '\n' || c == '\r')  {     // Endeerkennung 'LineFeed'
         _serialBuffer1[index1] = '\0';
         index1 = 0;
         Serial.println (_serialBuffer1);
         Farbe = atoi(_serialBuffer1);
         Serial.print(F("String zu int: ")); Serial.println(Farbe);
      }
   }
}