Bluetooth Shield auf Uno Board betreiben

Hallo!

Ich versuche ein Bluetooth-Shield in betrieb zu nehmen, um damit (später) Daten von einer SD-Karte zum Computer zu schicken.
Um mich mit dem Thema Bluetooth vertraut zu machen habe ich mir von seedstudio.com den Code für den betrieb eines Bluetooth-Shield im Slave-Modus heruntergeladen und auf das Board überspielt.

#include <SoftwareSerial.h> //Software Serial Port
#define RxD 0
#define TxD 1

#define DEBUG_ENABLED 1

SoftwareSerial blueToothSerial(RxD,TxD);

void setup()
{
Serial.begin(9600);
pinMode(RxD, INPUT);
pinMode(TxD, OUTPUT);
setupBlueToothConnection();

}

void loop()
{
char recvChar;
while(1){
if(blueToothSerial.available()){ //check if there's any data sent from the remote bluetooth shield
recvChar = blueToothSerial.read();
Serial.print(recvChar);
}
if(Serial.available()){ //check if there's any data sent from the local serial terminal, you can add the other applications here
recvChar = Serial.read();
blueToothSerial.print(recvChar);
}
}
}

void setupBlueToothConnection()
{
blueToothSerial.begin(38400); //Set BluetoothBee BaudRate to default baud rate 38400
blueToothSerial.print("\r\n+STWMOD=0\r\n"); //set the bluetooth work in slave mode
blueToothSerial.print("\r\n+STNA=SeeedBTSlave\r\n"); //set the bluetooth name as "SeeedBTSlave"
blueToothSerial.print("\r\n+STOAUT=1\r\n"); // Permit Paired device to connect me
blueToothSerial.print("\r\n+STAUTO=0\r\n"); // Auto-connection should be forbidden here
delay(2000); // This delay is required.
blueToothSerial.print("\r\n+INQ=1\r\n"); //make the slave bluetooth inquirable
Serial.println("The slave bluetooth is inquirable!");
delay(2000); // This delay is required.
blueToothSerial.flush();
}

Wie in der Anleitung beschrieben erhalte ich nach der delay-zeit auf dem Serial-Monitor die Anzeige: "The slave bluetooth is inquirable!"
An dieser Stelle enden die Erfolge. Wenn ich die Kommunikation zwischen Shield und Serial-Monitor, mit dem Befehl "AT" testen will, erhalte ich nicht die Antwort "OK", sondern nur Zeichen (z.B.: <0><0>)
Zuerst habe ich geglaubt, ich hätte im Serial-Monitor die Falsche Baud-Rate gewählt, doch eine veränderung führte nur zu weiteren Zeichen.

Ich habe auch versucht das Shield im normalen Windows-Bluetooth-Menü zu finden, leider bleibt es unsichtbar.

Ich will zuerst einmal irgendeine Form von Kommunikation zwischen Shield und Monitor erreichen, weiß aber nicht wie ich an dieser Stelle weitermachen soll.

Ich verwende ein Arduino Uno SMD Edition und ein ITead Studio Bluetooth Shield v2.1

Gaogrimm:
...auf Uno Board betreiben...
#include <SoftwareSerial.h> //Software Serial Port
#define RxD 0
#define TxD 1
...
SoftwareSerial blueToothSerial(RxD,TxD);

Das sieht ja völlig verquer aus für einen UNO!

Pin 0 und 1 sind die Hardware-Serial Schnittstelle des UNO!

Auf dieselben Pins kannst Du im Programm BEIM UNO NICHT noch eine Software-Serial Schnittstelle draufpacken, das beißt sich!

Wenn Du die Hardware-Serial an Pins 0 und 1 betreibst, dann muß Deine Software-Serial "blueToothSerial" auf ANDERE PINS konfiguriert und angeschlossen werden!

BTW Baudrate und Software-Serial: Ich kenne mich mit Software-Serial und Deinem Modul nicht so gut aus: Läuft SoftwareSerial mit 38400 Baud überhaupt fehlerfrei? Wenn Du zwei serielle Schnittstellen mit unterschiedlichen Baudraten an einem Arduino betreibst, dann würde ich für die schnellere Schnittstelle immer die Hardware-Serial benutzen und als langsamere mit 9600 die SoftwareSerial.

Nachtrag: Ich lese gerade mal unter http://arduino.cc/en/Reference/SoftwareSerial nach, offenbar muss der RX Pin für die SoftwareSerial-Library interruptfähig sein, d.h. auf einem UNO sind als RX-Pin für SoftwareSerial in dem Fall nur die Pins 2 und 3 möglich.

Nachtrag: Ich lese gerade mal unter http://arduino.cc/en/Reference/SoftwareSerial nach, offenbar muss der RX Pin für die SoftwareSerial-Library interruptfähig sein, d.h. auf einem UNO sind als RX-Pin für SoftwareSerial in dem Fall nur die Pins 2 und 3 möglich.

Der Pin muss "nur" pinchange-interrupt-fähig sein. Auf einem UNO sind das alle GPIOs (Dx und Ax).

pylon:
Der Pin muss "nur" pinchange-interrupt-fähig sein. Auf einem UNO sind das alle GPIOs (Dx und Ax).

Danke für die Korrektur!

pylon:
Der Pin muss "nur" pinchange-interrupt-fähig sein. Auf einem UNO sind das alle GPIOs (Dx und Ax).

Darf ich kurz fragen was GPIOs ausgeschrieben bedeutet?

Ich habe die Pins jetzt wieder auf 6 und 7 geschrieben, so wie ich es im Original-Code vorgefunden habe.
Desweiteren habe ich die BAUD-Rate auf 9600 reduziert. Also sollten der Serial-Monitor und die Bluetooth-Übertragungsrate jetzt ebenfalls gleichschnell sein.

Nach dem reset erhalte ich auf dem Serial-Monitor:

The slave bluetooth is inquirable!
<0>

Danach passiert nichts mehr, auch bei anfrage bleibt der shield stumm.

Danach passiert nichts mehr, auch bei anfrage bleibt der shield stumm.

Kannst Du das etwas ausführlicher beschreiben? Was meinst Du mit Anfrage? Nach der von Dir erwähnten Ausgabe sollte das Shield soweit sein, dass es mit einem Gegenüber gepaired werden kann. Siehst Du das Shield als Bluetooth-Gerät in Deinem Notebook?

Entschuldigung, mit Anfrage meinte ich den Befehl der laut Datenblatt die Kommunikation testet, sprich: AT. Die erwartete antwort ist: OK

Und, nein. Auf anderen Bluetooth-Geräten bleibt der Shield unsichtbar

Desweiteren habe ich die BAUD-Rate auf 9600 reduziert. Also sollten der Serial-Monitor und die Bluetooth-Übertragungsrate jetzt ebenfalls gleichschnell sein.

Wovon? Poste Deinen aktuellen Code und verwende bitte Code-Tags, damit er lesbar bleibt!

Ich hatte die Bluetooth-Baudrate von 38400 auf 9600 reduziert, da jurs angemerkt hatte, das eventuell Probleme zwischen dem Software-Serial und dem Hardware-Serial auftreten könnten, wenn die Baudraten so unterschiedlich sind.

Serial.begin(9600);

und

blueToothSerial.begin(38400);

ich bin auf erik-bartmann.de auf eine beschreibung gestoßen, die in etwa das beinhaltet was ich suche. zwar beschränkt der autor sich mehr auf die hardware des bluetooth shieldes, hat aber trotzdem ein paar fragen geklärt. leider beschreibt der autor, man müsse den µController vom Board nehmen, wenn man das Programm aufspielt. Das fällt mir mit meiner SMD-Variante natürlich etwas schwer.
Jetzt frage ich mich, ob ich evtl. die Daten verstümmelt habe und wie ich dieses umgehen kann.

Gaogrimm:
Ich hatte die Bluetooth-Baudrate von 38400 auf 9600 reduziert, da jurs angemerkt hatte, das eventuell Probleme zwischen dem Software-Serial und dem Hardware-Serial auftreten könnten, wenn die Baudraten so unterschiedlich sind.

Wenn Du für das Bluetooth-Shield eine andere als die Default-Datenrate von 38400 verwendest, muss allerdings auch sichergestellt sein, dass das Shield mit dieser abweichenden Datenrate arbeiten kann. Du kannst nicht einfach eine Baudrate in der Software anders einstellen als sie die Hardware versteht und erwartet.

Heißt es bei dem Board nicht "Default Baudrate 38400"?
Hat es dann wirklich eine "automatische Baudratenerkennung"?
Was sagt das Datenblatt?

Wenn das Board keine automatische Baudratenerkennung hat, mußt Du natürlich die Baudrate verwenden, die das Board erkennt (z.B. Default Baudrate 38400), oder Du mußt das Board zuerst an einer funktionierenden seriellen Schnittstelle bei 38400 anschließen, dann den Befehl zur Umstellung auf eine geänderte Default-Baudrate geben, und dann wenn das Board mit OK bestätigt hat, kannst Du danach die geänderte Default-Baudrate verwenden.

Im übrigen hatte "pylon" oben richtiggestellt, dass beim UNO Board alle Pins für Software Serial Schnittstellen nutzbar sind, meine Vermutung, dass manche Pins ggf. nicht korrekt für Software Serial Schnittstellen funktionieren, betrifft also nur manche Arduino-Boards wie MEGA und LEONARDO, welche Pins bei diesen Boards für Software-Serial nutzbar sind siehe: http://arduino.cc/en/Reference/SoftwareSerial , aber es betrifft nicht das UNO Board.

Und nochmal eine ganz blöde Frage von mir: Dass die "Sendedaten" (TX) am Bluetooth-Serial die "Empfangsdaten" (RX) am Arduino sind, und die "Sendedaten" (TX) vom Arduino die "Empfangsdaten" (RX) am Bluetooth-Shield, da kannst Du nichts verwechselt haben?

Also Verdrahtungsfehler, weil Du eben nicht verdrahtet hast:
Bluetooth RX mit Arduino TX
und
Bluetooth TX mit Arduino RX
???

Ich habe noch ein wenig nachgeforscht und bin schließlich auf der Herstellerseite des BT-Shields auf das hier

and can not work as master to source a Bluetooth device and initiative to connect it.

gestoßen.
Die version 2.1 kann also anscheinend nicht dazu verwendet werden um ein Bluetoothgerät darzustellen.

Ich habe mir daraufhin das Datasheet zum Shield version 2.2 durchgelesen. Die Pins für Rx/Tx lassen sich auf diesem Shield besser einstellen (mit Jumpern) und die Beschreibung ist genauer. Interessanterweise ist scheint dieses Datasheet ebenfalls unvollständig zu sein. Auf einer anderen Seite (http://home.comcast.net/~tomhorsley/hardware/arduino/ITead.html habe ich schließlich die (im original fehlenden) Informationen gefunden die wirklich geholfen haben.

Die AT-Befehle die ich über den Serial-Monitor schicke, werden jetzt größtenteils so beantwortet wie das Datasheet es vorhersagt. Nur hin und wieder meldet das Shield "Error:0". Was das bedeutet fehlt natürlich auch im Datasheet.
Und bislang ist es mir noch nicht gelungen das Shield über Bluetooth sichtbar zu machen.

Gaogrimm:
Ich habe noch ein wenig nachgeforscht und bin schließlich auf der Herstellerseite des BT-Shields auf das hier

and can not work as master to source a Bluetooth device and initiative to connect it.

gestoßen.
Die version 2.1 kann also anscheinend nicht dazu verwendet werden um ein Bluetoothgerät darzustellen.

Wie kommst du auf diese Schlussfolgerung? So wie ich deinen Thread bisher erfasst habe, willst du die Kommunikation zwischen dem Arduino und einem PC herstellen. Hier kann der PC als Master, der Arduino mit dem Shield als Slave herhalten.

Kann ich auf ein SD-Shield mit einer SD Karte zugreifen wenn der Arduino als Slave und der PC als Master festgelegt wurde? Also den Arduino sozusagen als Massenspeicher benutzen und vom PC aus auf den Arduino so zugreifen als wäre es ein USB Stick. Ist das mit diesen drei Board überhaupt möglich oder gibt es eine andere einfacher Möglichkeit?

Nein, das geht nicht so einfach. Bei den ganzen (mir bekannten) Bluetooth-Shields bzw. BT-Modulen wird ausschließlich das SPP-Profil verwendet, SPP steht hier für das Serial Port Profile, also für die serielle Datenübertragung. Daher wird dein Rechner (als Master) nur einen per BT bereitgestellten Com-Port sehen. Allerdings hindert dich nichts daran, darüber byteweise die Daten von einer SD-Karte zu senden. Am Rechner muss das dann "nur noch" zusammengebastelt werden.

Hmm ich habe hier noch das Master/Slave Modul von ITead. Auf den Board findet sich ein Schalter für Master und Slave. Wenn ich das Board als Master und den PC als Slave festlege ist das dann möglich?

BlackDice:
Wenn ich das Board als Master und den PC als Slave festlege ist das dann möglich?

Nein, weil dann immer noch kein anderes BT-Profil außer SPP genutzt wird.

Ok danke. Gibt es günstiges Wifi Modul für den Arduino um über Wlan auf die SD Karte zuzugreifen?
BlackDice