Bluetooth HC-05 Breakout + Leonardo = At Command Error

Hallo,

ich versuche das HC-05 von LCtech in den AT Modus zu bekommen,

der Code ist aus dem SoftwareSerial Beispiel:

/*
  Software serial multple serial test
 
 Receives from the hardware serial, sends to software serial.
 Receives from software serial, sends to hardware serial.
 
 The circuit: 
 * RX is digital pin 10 (connect to TX of other device)
 * TX is digital pin 11 (connect to RX of other device)
 
 Note:
 Not all pins on the Mega and Mega 2560 support change interrupts, 
 so only the following can be used for RX: 
 10, 11, 12, 13, 50, 51, 52, 53, 62, 63, 64, 65, 66, 67, 68, 69
 
 Not all pins on the Leonardo support change interrupts, 
 so only the following can be used for RX: 
 8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI).
 
 created back in the mists of time
 modified 25 May 2012
 by Tom Igoe
 based on Mikal Hart's example
 
 This example code is in the public domain.
 
 */
#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11); // RX, TX

void setup()  
{
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }


  Serial.println("Goodnight moon!");

  // set the data rate for the SoftwareSerial port
  mySerial.begin(38400);
  mySerial.println("Hello, world?");
}

void loop() // run over and over
{
  if (mySerial.available())
    Serial.write(mySerial.read());
  if (Serial.available())
    mySerial.write(Serial.read());
}

Das Modul hat folgende Pin’s
Key, RXD, TXD, 5V, 3,3V, GND

Die Verkabelung funktioniert im Kommunikationsmodus sehr gut, die Nachrichten von und zum Handy kommen an
( mySerial.begin(38400); ← auf 9600 ändern, damit das klappt)

Um in den AT Modus zu gelangen, habe ich Key mit 5V verbunden und dann das USB Kabel wieder eingesteckt.
Die Rote LED blinkt langsam so alle 2 sekunden.

Im Seriellem Monitor steht allerdings nur:

Goodnight moon!
ERROR:(0)

Weiter eingaben bringen/bewirken nichts.
AT
\r\nAT\r\n
AT\r\n

etc.

Hat jemand eine Idee was ich falsch mache?

Gruß Mattes

Vielleicht solltest Du erst einmal erklären, wieso Du auf einem Leonardo nicht die Hardware-Serial-Schnittstelle verwendest. Beim UNO wird sie häufig für Debug-Zwecke gebraucht, aber auf dem Leonardo ist sie frei zur Verwendung. SoftwareSerial solltest Du nur im Notfall einsetzen und auch dann normalerweise nur bis ca. 9600 Baud. Alles darüber ist mehr oder weniger Glücksache, ob Du das zum Laufen kriegst (hat mit dem inneren Aufbau der Klasse zu tun).

Gleich mal vorweg: SoftwareSerial ist keine gute Wahl. Da du aber einen Leonardo nutzt, kannst du Serial1 in Hardware nutzen. Das sind die Pins 0 und 1.

SoftwareSerial wird zum einen in diversen Beispielen genutzt und zum anderen soll das später auf einem attiny laufen. soweit ich weiss, hat der kein serial in hardware.

Nur muss ich dazu eines der beiden Module auf Master umstellen (und an den slave binden).

ok habe auf Serial1 umgestellt - gleiches ergebnis

habe das ganze nun mit einem mega ausprobiert, gleiches resultat. =(

Problem gelöst:

Ich habe folgendes Video gefunden: http://www.youtube.com/watch?v=7gM-xv4yRZA

den dortigen code abgetippt und NICHT die IDE 1.5.4 sondern 1.0.0 benutzt. dort kann man im serial monitor die baudrate auf 38400 ändern, das geht in der aktuellen nicht mehr.

Serial.begin(9600); ist falsch Serial.begin(38400); ist richtig und im serial monitor auch 38400 auswählen.

hier der komplette sketch

void setup() {
  // put your setup code here, to run once:
Serial1.begin(38400);
Serial.begin(38400);
}

void loop() {
  // put your main code here, to run repeatedly: 
  if(Serial1.available())
  {
    byte a=Serial1.read();
    Serial.write(a);
  }
  if(Serial.available())
  {
    byte a=Serial.read();
    Serial1.write(a);
  }
}

Kann bestätigen, dass der letztgenannte Sketch von Mattes eins zu eins auch mit dem Arduino Yun läuft (Leonardo und Yun haben beide den 32u4).

Wenn mir jemand nur sagen könnte, wie ich jetzt von einem Arduino zum anderen einen einfachen Float (oder besser: eine txt-datei) schicken kann, wäre mein Tag gerettet ;) Nutze auf beiden den HC-05. Die Verbindung zwischen beiden steht auch schon... aber wie man nun Daten vom einen zum anderen schickt ist die Frage.....!

Ich nehme mal an die Übertragung geschieht wie üblich Byte-weise. Float lässt sich so einfach in ein Byte-Array und zurück wandeln:

float f = 1.256;
byte* b = (byte*)&f;
f = *(float*)b;

Das nimmt einfach die Adresse des Floats (d.h. ein Zeiger auf Float) und castet diesen auf einem Zeiger auf Byte. Zum zurückwandeln castet man auf float* und dereferenziert den Zeiger.

In C sind Arrays nicht mehr als syntaktischer Zucker für Zeiger. Daher ist ein byte* eigentlich ein Byte Array, auch wenn man keines deklariert hat.

Eine alternative ist eine Union aus Byte und Float:

union Data { float f; byte b[4]; };

union Data data;
data.f = 1.2456;

data.b ist dann das Byte Array. Umgedreht genauso. Die Variablen belegen den gleichen Speicher.

Super, das werde ich noch brauchen!

Weißt du auch wie ich dieses Byte-Array mit dem HC-05 sende/empfange?