Forum: Mikrocontroller und Digitale Elektronik Arduino Übertragungunsprobleme zw. HC-05 & HC-06 [GELÖST]


von Martin S. (wiesel0815)


Angehängte Dateien:

Lesenswert?

Servusla an alle,

erster Post, also seid gnädig :D
Ich habe seit einigen Tagen ein Problem mit der Verbindung zwischen den 
oben genannten BT-Modulen und ich wette ihr könnt mir dabei helfen.. 
Dieser Post richtet sich besonders an diejenigen, die selbst auch mit 
diesen Modulen experimentieren.
Ich hoffe nur, es ist kein 0815-Fehler, den ich mal wieder übersehen 
habe :(


Der Aufbau :
An einem Arduino Mega 2560 hängt ein Joystick und das HC-05 im Master 
Mode, von dem die Signale des Joysticks an ein HC-06 im Slave Mode, der 
an einem Arduino Uno hängt, sendet. Am Uno ist ein kleiner DC-Motor und 
eine LED, die gesteuert werden sollen. Die Verbindung von den beiden 
klappt auch perfekt, aber es gibt ein Problem.

Das Problem :
Wie im angehängten Bild "Kommunikationsprotokoll" zu sehen ist, sende 
ich vom Mega (COM4) einen Datenstring der Form *0,0# zum HC-05 Master. 
Ob der auch genauso beim Master ankommt, ist auch fraglich. Der 
empfangene Datenstring am HC-06 bzw. am Uno (COM3) ist leider nur 
Zahlenerbrochenes in der Form 0325687539047349383686235067407680 :)
Damit kann der Uno natürlich nichts anfangen..


Die Lösungsversuche :
Sieht meiner Meinung stark nach nem Baudrateproblem aus, also
-Baudrates erstmal beide auf 9600 gestellt. Allerdings klappte dann das 
Pairing nicht mehr. Hab dem HC-05 nochmal den Befehl mit der Baudrate 
9600 und diesmal einem Stopbit gegeben ( AT+UART=9600,0,0 )
danach funktionierte zumindest das Pairing wieder, mehr nicht..

-Danach Baudrates von beiden Modulen auf 38400 gestellt, dh HC-05 
einfach auf Originaleinstellungen und Mastermode gesetzt. Problem ist 
immernoch da.

-Alle anderen Versuche haben es nicht verdient, hier aufgezählt zu 
werden :D


Der Status :
Zur Zeit spreche ich die Module mit einer SoftwareSerial-Verbindung 
(Baud:38400) und die "normalen" Serials mit dem PC (Baud:9600).
Kann das Problem daran liegen? Verschiebung wegen den Geschwindigkeiten?

Oder kann es an den Einstellungen der BTModulen liegen, speziell an den 
stop bits und parity bits? Da kenn ich nicht so aus..

Die Codes füge ich unten ein, evtl. ist das Problem auch dort zu finden.

Wenn ich jetzt noch etwas vergessen hab, was ihr braucht, schreibt kurz 
:)
Bin aufgeschlossen für jeden Tipp, Lösungsversuch und Link, wo sowas 
beschrieben ist.
Offensichtlich weiß Google nämlich doch nicht alles ;)

Danke für eure Zeit und Adeela,
Martin

Codes:
A. Mega ( HC-05 Master )
1
#include <SoftwareSerial.h>
2
#define START_CMD_CHAR '*'
3
#define END_CMD_CHAR '#'
4
5
SoftwareSerial BTSerial(10, 11); // RX, TX
6
7
String outText;
8
int MotorPin = A15;
9
int LedPin = 52;
10
11
int motorspeed, old_motorspeed;
12
int reference;
13
int ledstatus, old_ledstatus;
14
15
void setup() {
16
  Serial.begin(9600);
17
  BTSerial.begin(38400);
18
  pinMode(MotorPin, INPUT);
19
  pinMode(LedPin, OUTPUT);
20
  digitalWrite(LedPin, HIGH);
21
  reference = analogRead(MotorPin);
22
}
23
24
void loop()
25
{
26
  motorspeed = analogRead(MotorPin);
27
  motorspeed = map(motorspeed, reference,0,  0, 255);
28
  motorspeed = constrain(motorspeed, 0, 255);
29
  
30
  if( digitalRead(LedPin) == LOW ){
31
    ledstatus = HIGH;
32
  }
33
  else{
34
    ledstatus = LOW;
35
  };
36
  //Test ob sich daten geändert haben und gesendet werden muss
37
  if(motorspeed!=old_motorspeed || ledstatus!=old_ledstatus){
38
    //String vorbereiten
39
    outText = " ";
40
    outText += START_CMD_CHAR;
41
    outText += motorspeed;
42
    outText += ",";
43
    outText += ledstatus;
44
    outText += END_CMD_CHAR;
45
    //String senden
46
    Serial.println("Datenstring: ");
47
    Serial.println(outText);
48
    BTSerial.println(outText);
49
    Serial.println("gesendet!");
50
    //alte daten speichern
51
    old_motorspeed = motorspeed;
52
    old_ledstatus = ledstatus;
53
  };
54
}



A. Uno ( HC-06 Slave )
1
#include <SoftwareSerial.h>
2
3
#define START_CMD_CHAR '*'
4
#define END_CMD_CHAR '#'
5
6
SoftwareSerial BTSerial(10, 11); // RX | TX
7
8
int motorspeed;
9
int ledstatus;
10
11
int MotorPin = 9;
12
int LedPin = 8;
13
14
void setup() {
15
  BTSerial.begin(38400);
16
  Serial.begin(9600);
17
  pinMode(MotorPin, OUTPUT);
18
  pinMode(LedPin, OUTPUT);
19
}
20
21
void loop()
22
{
23
  while(BTSerial.available()){
24
    delay(1);
25
   Serial.print(BTSerial.read());
26
  };
27
  return;
28
  //wegen Debugging wird hier aufgehört
29
  if (BTSerial.available()){ 
30
    char get_char = ' '; 
31
    get_char = BTSerial.read();
32
    if (get_char != START_CMD_CHAR) return;
33
    delay(2);
34
    motorspeed = BTSerial.parseInt();
35
    Serial.println(motorspeed);
36
    delay(2); 
37
    ledstatus = BTSerial.parseInt();
38
    Serial.println(ledstatus);
39
  
40
    if( ledstatus == 1 ){
41
      digitalWrite(LedPin, HIGH);
42
    }
43
    else{
44
      digitalWrite(LedPin, LOW);
45
    };
46
    
47
    if( motorspeed >= 0 && motorspeed <= 255 ){
48
      analogWrite(MotorPin, motorspeed);
49
    };
50
  };
51
}

: Bearbeitet durch User
von Chris M. (yoblid) Benutzerseite


Lesenswert?

Hi Martin,

finde zuerst raus, ob es am Master liegen kann, also was er wirklich 
sendet.
Das geht recht gut mit einem Smartphone und einer Terminal App.

Ich habe dazu auch mal meine Tests gemacht: 
http://hartgeloetet.blogspot.de/2013/06/jy-mcu-bluetooth-modul-am-arduino.html

VG
Chris

von Martin S. (wiesel0815)


Angehängte Dateien:

Lesenswert?

Hey Chris,

danke für die schnelle Antwort. Deinen Blog werde ich morgen genauer 
studieren.

Also der Master sendet genau dass, was er soll.
Ich musste allerdings für die Verbindung am Handy auf Baud:9600 direkt 
am Master direkt gehen. Im Arduino Code auch auf Baud:9600 und der 
Master sendet, was er soll.

Morgen werde ich den Slave auch auf Baud:9600 stellen und kucke, was 
herauskommt. Eigentlich hatte ich die Einstellungen schon einmal alle 
auf 9600 und da ging es nicht..


Grüße
Martin

von Martin S. (wiesel0815)


Lesenswert?

Hi an alle nochmal,

den Slave (HC-06) habe ich nun auch auf die Baudrate 9600 gestellt. Der 
Master (HC-05) kann sich nun auch mit ihm verbinden, allerdings kommt am 
Arduino Uno, der am Slave hängt, immer noch nur Zahlensalat heraus.

Es muss doch auf jeden Fall möglich sein, eine ordentliche Verbindung 
zwischen den beiden Modulen aufzubauen!

Kann es z.B. auch an den SoftwareSerials liegen, vll. kommt es da zu 
Unregelmäßigkeiten?



Bzw. dann die Frage, wie baut ihr drahtlose Verbindungen auf?
Über die 433 Mhz RF Sender/Empfänger?
oder ist zu raten, gleich die 2.4GHz NRF24L01 Module zu benutzen?


Grüße
Martin

von Martin S. (wiesel0815)


Lesenswert?

Hallo die Interessierten,

also das Problem ist zwar weg, aber eigentlich nur umgangen und nicht 
gelöst.
Wenn ich die Module mit den Arduinos nicht mit der generierten 
SoftwareSerial Verbindung verbinde, sondern mit den Rx, Tx Pins (0,1), 
dann klappt alles perfekt. Das Problem liegt also an der SoftwareSerial 
Verbindung, habe allerdings keine Ahnung, was es genau ist :(
Evtl. weiß es ja Jemand, ich würde mich freuen, doch noch die Ursache zu 
erfahren.


Grüße
Martin

von Philipp K. (philipp_k59)


Lesenswert?

glaube hab mal gelesen das ein SoftwareSerial nur zuverlässig über einen 
Interrupt arbeitet.. sonst gibt das mit Geräten die es genau nehmen ein 
problem.

Habe das hiermit gelöst.

https://www.pjrc.com/teensy/td_libs_NewSoftSerial.html

von Martin S. (wiesel0815)


Lesenswert?

Hi Philipp,

leider hat die Library von dir keine ParseInt Funktion, allerdings hat 
mir dein Stichwort Interrupt geholfen.

Habe die SoftwareSerial Pins einfach auf 2,3 gesetzt und schon klappt 
alles =)
Pin 2 ist ja Interruptfähig .

Vielen Dank an die Mitwirkenden!

Martin

von Patrick C. (Gast)


Lesenswert?

Hi Martin S.,

ich arbeite gerade auch an diesen Versuch und bin nun auch soweit, das 
ich auf der Slaveseite nur "Zahlenerbrochenes" bekomme.

Könntest du bitte deinen fertigen code neu reinstellen und mir verraten 
wie du es mit dem Interrupt gemacht hast.

Vielen Dank im vorraus.

Freundliche Grüße.

Patrick C.

von Martin (Gast)


Lesenswert?

Hi Patrick,

wenn du 2 Arduino Megas einsetzt, kann ich dir auf die Schnelle raten, 
es über die anderen vordefinierten seriellen Verbindungen zu versuchen.
Stichwort RX1 TX1, bzw Serial1 im Sketch.

Hab bei anderen Sachen immer irgendwelche Probleme mit dem 
SoftwareSerial..

Codes kann ich Mitte nächster Woche reinstellen, falls dann noch 
benötigt.

Martin

von Justus (Gast)


Lesenswert?

Habe dasselbe Problem und habe es bislang mit aller Hilfe die hier 
geposted wurde noch nicht lösen können. Versuche inzwischen mit exakt 
demselben programm Daten von einem Arduino Mega auf einen Arduino Uno zu 
senden und es kommt nur eine Zahlen reihe an, die der im Beitrag oben 
beschriebenen sehr ähnlich ist. Hat noch jemand eine Idee oder eine 
Lösungsbeschreibung?
Bin inzwischen schon fast verzweifelt weil ich seit wochen an diesem 
Problem festhänge.
Vielen Dank im Vorraus!
Justus

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.